Compare commits

..

1 Commits

Author SHA1 Message Date
Jasper St. Pierre
e7f82c66de wobbly 2014-09-03 10:58:01 -07:00
164 changed files with 24195 additions and 33478 deletions

2
.gitignore vendored
View File

@@ -23,7 +23,6 @@ data/gnome-shell-wayland.desktop
data/gnome-shell-wayland.desktop.in
data/gnome-shell-extension-prefs.desktop
data/gnome-shell-extension-prefs.desktop.in
data/gnome-shell-theme.gresource
data/gschemas.compiled
data/perf-background.xml
data/org.gnome.shell.gschema.xml
@@ -86,7 +85,6 @@ src/gnome-shell-perf-helper
src/gnome-shell-perf-tool
src/gnome-shell-portal-helper
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
src/org-gtk-application.[ch]
src/run-js-test
src/test-recorder
src/test-recorder.ogg

164
NEWS
View File

@@ -1,167 +1,3 @@
3.15.4
======
* Add mode parameter to AcceleratorActivated signal [Florian; #711682]
* Fix PID based window/app association [Sebastian; #736527]
* Fix current day highlight on day change [Sebastian; #742492]
* Switch to vp9 for screencast recordings [Adel; #742744]
* Disable IBus input sources on password entries [Takao; #730628]
* Make slider scrolling smoother [Adel; #742648]
* Allow move-up shortcut to move window above top workspace [Florian; #665764]
* Misc. bug fixes [Adel, Rui; #742748, #742824, #741114]
Contributors:
Cosimo Cecchi, Takao Fujiwara, Adel Gadllah, Sebastian Keller, Rui Matos,
Florian Müllner, Jasper St. Pierre
Translations:
Andika Triwidada [id], Matej Urbančič [sl], Saibal Ray [bn_IN],
Inaki Larranaga Murgoitio [eu], Stas Solovey [ru], Kjartan Maraas [nb],
Balázs Úr [hu], Marek Černocký [cs], Rafael Ferreira [pt_BR],
Bernd Homuth [de], Daniel Mustieles [es], Fabio Tomat [fur]
3.15.3
======
* Add support for high-contrast themes [Florian; #740447]
* Fix banner message on login screen without user list [Ray; #703972]
* Fix flicker when activating windows on another workspace [Florian; #741680]
* Misc. bug fixes [Giovanni, Florian; #735308, #740237]
Contributors:
Giovanni Campagna, Florian Müllner, Jasper St. Pierre, Ray Strode
Translations:
Balázs Úr [hu], Josef Andersson [sv], Muhammet Kara [tr],
Baurzhan Muftakhidinov [kk], Inaki Larranaga Murgoitio [eu]
3.15.2
======
* Fix visual glitch of window preview outline in overview [Chris; #699044]
* Change user facing name of "Captive Portal" to "Network Login" [Elad; #737198]
* Port to Python 3 [Slavek; #732478]
* Hide Airplane mode indicator when g-s-d says so [Cosimo; #736292]
* Allow translators to change non-work days [Lavi; #664645]
* Delay invocation of caribou daemon until really needed [Daiki; #739712]
* Don't lock screen after crash if locking is disabled [Adel; #704884]
* Improve layout of extension installation dialog [William; #739888]
* Fix workspace changes from app picker [Yuki; #737534]
* Preload all ibus input sources in user configuration [Takao; #695428]
* Properly remove network connections from list [Ryan; #740227]
* Support CSS margin property [Carlos; #728437]
* Improve handling of BUSY application state [Phillip; #736492]
* Fix erroneous week numbers in calendar [Florian; #736722]
* Misc. bugfixes and cleanups [Darcy, Yuki, Alexander, Eskild, Bastien, Cosimo, Colin,
Ray; #738725, #739497, #739241, #672500, #739822, #740074, #704163, #740141]
Contributors:
Yuki, Lavi .A, Elad Alfassa, Cosimo Cecchi, Takao Fujiwara, Adel Gadllah,
Eskild Hustvedt, Chris Johns, William Jon McCann, Slavek Kabrda, Ryan Lortie,
Florian Müllner, Bastien Nocera, Christian Persch, Carlos Soriano,
Jasper St. Pierre, Ray Strode, Alexander Tsoy, Daiki Ueno, Colin Walters,
Phillip Wood
Translations:
Jorge Perez Perez [an], Daniel Martinez [an], Daniel Mustieles [es],
Trần Ngọc Quân [vi], Changwoo Ryu [ko], Kjartan Maraas [nb],
Yosef Or Boczko [he], Marek Černocký [cs]
3.15.1
======
* Use GResources for theme loading [Cosimo; #736936]
* Reset the OSK to primary on monitor changes [Rui; #738536]
* Use LC_TIME locale for format string translations [Florian; #738640]
* Summarize queued up notifications [Devyani; #702460]
* Improve handling of multi-day events [Andreas; #727302]
* Support EXTERNAL scroll policy type [Florian; #739379]
* Misc. bugfixes [Owen, Rui; #738652, #739252]
Contributors:
Andreas Brauchli, Cosimo Cecchi, Devyani Kota, Rui Matos, Florian Müllner,
Jasper St. Pierre, Owen W. Taylor
Translations:
Bahodir Mansurov [uz@cyrillic]
3.14.1
======
* Fix pulse animation for scrolled app folders [Florian; #736885]
* Fix updating background on file changes [Owen; #710756]
* Obtain keyboard variant from IBus [Jinkyu; #735066]
* Implement Ctrl-u / Ctrl-k keybindings in entries [Florian; #737346]
* Pass VPN hints to auth dialog [Dan; #737592]
* Only allow one screenshot request at a time [Adel; #737456]
* Respect disable-save-to-disc lockdown setting [Florian; #737846]
* Respect scaling-factor for profile pictures [Darcy; #735419]
* Focus login screen after lifting the lock screen shield [Ray; #708105]
* Speed up pulse animation for few items [Carlos S.; #737017]
* Fix gap between workspace switcher and screen edge [Florian; #728899]
* Disable unredirection during recordings [Adel; #738226]
* Ensure there's always at least one input source [Rui; #738303]
* Restrict width of dash icons' context menus [Adel; #738054]
* Misc. bug fixes [Jasper, Florian, Carlos G., Owen; #736999, #737382, #737001,
#738314, #738256, #738147]
Contributors:
Darcy Beurle, Cosimo Cecchi, Adel Gadllah, Carlos Garnacho, Rui Matos,
Florian Müllner, Carlos Soriano, Jasper St. Pierre, Ray Strode, Patrick Ward,
Dan Williams, Owen W. Taylor, Jinkyu Yi
Translations:
Мирослав Николић po/sr, sr@latin.po, Fran Diéguez [gl], Marek Černocký [cs],
Saibal Ray [bn_IN], Rajesh Ranjan [hi], Friedel Wolff [af],
Zhou Fang [zh_CN], Krishnababu Krothapalli [te], Kjartan Maraas [nb],
Rūdolfs Mazurs [lv], Sweta Kothari [gu], Christian Kirbach [de],
Cheng-Chia Tseng [zh_TW], Pedro Albuquerque [pt], Daniel Mustieles [es],
Luca Ferretti [it], Baurzhan Muftakhidinov [kk], Arash Mousavi [fa],
Milo Casagrande [it]
3.14.0
======
* Fix exposure of the accessible tree [Alejandro; #736821]
* Hide empty app folders in app picker [Florian; #736910]
Contributors:
Florian Müllner, Alejandro Piñeiro
Translations:
Yuri Myasoedov [ru], Pawan Chitrakar [ne], Manoj Kumar Giri [or],
Daniel Mustieles [es], GNOME Translation Robot [de], Rajesh Ranjan [hi],
Shankar Prasad [kn], Kenneth Nielsen [da], Daniel Korostil [uk],
Changwoo Ryu [ko], A S Alam [pa], Tom Tryfonidis [el], Petr Kovar [cs]
3.13.92
=======
* Fix submenu arrow animations [Hashem; #728927]
* Always initialize clutter accessibility [Alejandro; #735908]
* Adapt to mutter background changes [Owen; #735638]
* Improve handling of outOfDate extensions in prefs [Florian; #736185]
* Port offline updates to PackageKit's DBus interface [Kalev; #736337]
* location: Translate accuracy levels for geoclue [Zeeshan; #736479]
* Implement input source switching [Rui; #736435]
* Fix crash when dragging window from workspace switcher [Carlos G.; #735972]
* Clean out list of default favorites [Elad; #735682]
* Add settings link to location submenu [Florian; #736542]
* Fix keynav of message tray menu button [Florian; #707799]
* Misc. bug fixes [Carlos G., Florian, Rui; #736110, #736329, #736343,
#735927, #735976]
Contributors:
Elad Alfassa, Zeeshan Ali (Khattak), Michael Catanzaro, Adel Gadllah,
Carlos Garnacho, Kalev Lember, Rui Matos, Florian Müllner, Hashem Nasarat,
Alejandro Piñeiro, Carlos Soriano, Jasper St. Pierre, Owen W. Taylor
Translations:
Piotr Drąg [pl], Changwoo Ryu [ko], Yuri Myasoedov [ru], Zhou Fang [ja],
Peter Mráz [sk], Ville-Pekka Vainio [fi], Sweta Kothari [gu],
Marek Černocký [cs], A S Alam [pa], Christian Kirbach [de],
Alexandre Franke [fr], Aurimas Černius [lt], Khaled Hosny [ar],
Enrico Nicoletto [pt_BR], Andika Triwidada [id], Shantha kumar [ta],
Matej Urbančič [sl], Pawan Chitrakar [ne], Yosef Or Boczko [he],
Balázs Úr [hu], Dušan Kazik [sk], Gil Forcada [ca],
Carles Ferrando [ca@valencia], Nilamdyuti Goswami [as], Ivaylo Valkov [bg],
Sandeep Sheshrao Shedmake [mr], Umarzuki Bin Mochlis Moktar [ms],
Muhammet Kara [tr], Jiro Matsuzawa [ja], Kris Thomsen [da],
Mattias Eriksson [sv]
3.13.91
=======
* Fix keynav into session menu on login screen [Florian; #735614]

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.15.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.13.91],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -37,7 +37,7 @@ AC_PATH_PROG([XSLTPROC], [xsltproc])
GLIB_GSETTINGS
# Get a value to substitute into gnome-shell.in
AM_PATH_PYTHON([3])
AM_PATH_PYTHON([2.5])
AC_SUBST(PYTHON)
# We need at least this, since gst_plugin_register_static() was added
@@ -76,8 +76,8 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.15.90
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.15.4
GTK_MIN_VERSION=3.15.0
MUTTER_MIN_VERSION=3.13.91
GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.37.0
LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.5.3
@@ -97,6 +97,7 @@ SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
gjs-internals-1.0 >= $GJS_MIN_VERSION
$recorder_modules
gdk-x11-3.0 libsoup-2.4
xtst
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
@@ -118,7 +119,7 @@ PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
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.13.1)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.4)
PKG_CHECK_MODULES(CARIBOU, caribou-1.0 >= 0.4.8)
AC_ARG_ENABLE(browser-plugin,
@@ -231,17 +232,9 @@ esac
AM_CFLAGS="$AM_CFLAGS $WARN_CFLAGS"
AC_SUBST(AM_CFLAGS)
if test -z "${BROWSER_PLUGIN_DIR}"; then
BROWSER_PLUGIN_DIR="\${libdir}/mozilla/plugins"
fi
BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}"
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])
AC_ARG_VAR([GDBUS_CODEGEN],[the gdbus-codegen programme])
AC_PATH_PROG([GDBUS_CODEGEN],[gdbus-codegen],[])
if test -z "$GDBUS_CODEGEN"; then
AC_MSG_ERROR([gdbus-codegen not found])
fi
AC_CONFIG_FILES([
Makefile
data/Makefile

View File

@@ -35,11 +35,44 @@ introspection_DATA = \
org.gnome.ShellSearchProvider.xml \
org.gnome.ShellSearchProvider2.xml
resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/theme --generate-dependencies $(srcdir)/gnome-shell-theme.gresource.xml)
gnome-shell-theme.gresource: gnome-shell-theme.gresource.xml $(resource_files)
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir)/theme $<
resourcedir = $(pkgdatadir)
resource_DATA = gnome-shell-theme.gresource
themedir = $(pkgdatadir)/theme
dist_theme_DATA = \
theme/calendar-arrow-left.svg \
theme/calendar-arrow-right.svg \
theme/calendar-today.svg \
theme/checkbox-focused.svg \
theme/checkbox-off-focused.svg \
theme/checkbox-off.svg \
theme/checkbox.svg \
theme/close-window.svg \
theme/close.svg \
theme/corner-ripple-ltr.png \
theme/corner-ripple-rtl.png \
theme/dash-placeholder.svg \
theme/filter-selected-ltr.svg \
theme/filter-selected-rtl.svg \
theme/gnome-shell.css \
theme/logged-in-indicator.svg \
theme/message-tray-background.png \
theme/more-results.svg \
theme/noise-texture.png \
theme/page-indicator-active.svg \
theme/page-indicator-inactive.svg \
theme/page-indicator-checked.svg \
theme/page-indicator-hover.svg \
theme/panel-button-border.svg \
theme/panel-button-highlight-narrow.svg \
theme/panel-button-highlight-wide.svg \
theme/process-working.svg \
theme/running-indicator.svg \
theme/source-button-border.svg \
theme/summary-counter.svg \
theme/toggle-off-us.svg \
theme/toggle-off-intl.svg \
theme/toggle-on-us.svg \
theme/toggle-on-intl.svg \
theme/ws-switch-arrow-up.png \
theme/ws-switch-arrow-down.png
backgrounddir = $(pkgdatadir)
background_DATA = perf-background.xml
@@ -83,9 +116,7 @@ EXTRA_DIST = \
perf-background.xml.in \
org.gnome.Shell.PortalHelper.desktop.in \
org.gnome.Shell.PortalHelper.service.in \
org.gnome.shell.gschema.xml.in.in \
gnome-shell-theme.gresource.xml \
$(resource_files)
org.gnome.shell.gschema.xml.in.in
CLEANFILES += \
gnome-shell.desktop.in \
@@ -97,5 +128,4 @@ CLEANFILES += \
perf-background.xml \
gschemas.compiled \
org.gnome.shell.gschema.valid \
org.gnome.shell.gschema.xml.in \
gnome-shell-theme.gresource
org.gnome.shell.gschema.xml.in

View File

@@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gnome/shell/theme">
<file>calendar-arrow-left.svg</file>
<file>calendar-arrow-right.svg</file>
<file>calendar-today.svg</file>
<file>checkbox-focused.svg</file>
<file>checkbox-off-focused.svg</file>
<file>checkbox-off.svg</file>
<file>checkbox.svg</file>
<file>close-window.svg</file>
<file>close.svg</file>
<file>corner-ripple-ltr.png</file>
<file>corner-ripple-rtl.png</file>
<file>dash-placeholder.svg</file>
<file>filter-selected-ltr.svg</file>
<file>filter-selected-rtl.svg</file>
<file>gnome-shell.css</file>
<file>gnome-shell-high-contrast.css</file>
<file>logged-in-indicator.svg</file>
<file>message-tray-background.png</file>
<file>more-results.svg</file>
<file>noise-texture.png</file>
<file>page-indicator-active.svg</file>
<file>page-indicator-inactive.svg</file>
<file>page-indicator-checked.svg</file>
<file>page-indicator-hover.svg</file>
<file>panel-button-border.svg</file>
<file>panel-button-highlight-narrow.svg</file>
<file>panel-button-highlight-wide.svg</file>
<file>process-working.svg</file>
<file>running-indicator.svg</file>
<file>source-button-border.svg</file>
<file>summary-counter.svg</file>
<file>toggle-off-us.svg</file>
<file>toggle-off-intl.svg</file>
<file>toggle-on-us.svg</file>
<file>toggle-on-intl.svg</file>
<file>ws-switch-arrow-up.png</file>
<file>ws-switch-arrow-down.png</file>
</gresource>
</gresources>

View File

@@ -1,9 +1,9 @@
[Desktop Entry]
_Name=Network Login
_Name=Captive Portal
Type=Application
Exec=gapplication launch org.gnome.Shell.PortalHelper
DBusActivatable=true
NoDisplay=true
Icon=network-workgroup
StartupNotify=true
OnlyShowIn=GNOME;
OnlyShowIn=GNOME;

View File

@@ -31,7 +31,7 @@
</_description>
</key>
<key name="favorite-apps" type="as">
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Documents.desktop', 'org.gnome.Software.desktop' ]</default>
<_summary>List of desktop file IDs for favorite applications</_summary>
<_description>
The applications corresponding to these identifiers

View File

@@ -1,20 +0,0 @@
/* Copyright 2014, Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU Lesser General Public License,
* version 2.1, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*/
@import url("resource:///org/gnome/shell/theme/gnome-shell.css");
stage {
-st-icon-style: symbolic;
}

View File

@@ -232,10 +232,6 @@ StScrollBar StButton#vhandle:active {
border-width: 0px;
}
.app-well-menu {
max-width: 400px;
}
/* The remaining popup-menu sizing is all done in ems, so that if you
* override .popup-menu.font-size, everything else will scale with it.
*/
@@ -829,7 +825,6 @@ StScrollBar StButton#vhandle:active {
.window-clone-border {
border: 4px solid rgba(255, 255, 255, 0.5);
border-radius: 4px;
box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.5);
}
.notification-close {
@@ -1495,10 +1490,6 @@ StScrollBar StButton#vhandle:active {
text-align: right;
}
.events-day-time-ellipses {
color: rgba(153, 153, 153, 1.0);
}
.events-day-time:rtl {
text-align: left;
}
@@ -2107,15 +2098,6 @@ StScrollBar StButton#vhandle:active {
font-size: 14pt;
}
/* Resize popup */
.resize-popup {
border-radius: 10px;
background-color: rgba(0.0, 0.0, 0.0, 0.9);
border: 2px solid #868686;
padding: 16px;
font-size: 14pt;
}
/* ShellMountOperation Dialogs */
.shell-mount-operation-icon {
icon-size: 48px;
@@ -2397,10 +2379,6 @@ StScrollBar StButton#vhandle:active {
}
/* Login Dialog */
.login-dialog-banner-view {
padding-top: 24px;
max-width: 23em;
}
.framed-user-icon {
border: 2px solid #8b8b8b;
@@ -2413,7 +2391,11 @@ StScrollBar StButton#vhandle:active {
}
.login-dialog-banner {
font-size: 10pt;
font-weight: bold;
text-align: center;
color: #666666;
padding-bottom: 1em;
}
.login-dialog {

View File

@@ -59,10 +59,14 @@ const Application = new Lang.Class({
_extensionAvailable: function(uuid) {
let extension = ExtensionUtils.extensions[uuid];
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
if (!extension)
return false;
if (checkVersion && ExtensionUtils.isOutOfDate(extension))
return false;
if (!extension.dir.get_child('prefs.js').query_exists(null))
return false;
@@ -281,10 +285,6 @@ const ExtensionRow = new Lang.Class({
function() {
this._switch.state = this._isEnabled();
}));
this._settings.connect('changed::disable-extension-version-validation',
Lang.bind(this, function() {
this._switch.sensitive = this._canEnable();
}));
this._buildUI();
},
@@ -323,7 +323,6 @@ const ExtensionRow = new Lang.Class({
this.prefsButton = button;
this._switch = new Gtk.Switch({ valign: Gtk.Align.CENTER,
sensitive: this._canEnable(),
state: this._isEnabled() });
this._switch.connect('notify::active', Lang.bind(this,
function() {
@@ -336,13 +335,6 @@ const ExtensionRow = new Lang.Class({
hbox.add(this._switch);
},
_canEnable: function() {
let extension = ExtensionUtils.extensions[this.uuid];
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
return !(checkVersion && ExtensionUtils.isOutOfDate(extension));
},
_isEnabled: function() {
let extensions = this._settings.get_strv('enabled-extensions');
return extensions.indexOf(this.uuid) != -1;

View File

@@ -1,7 +1,6 @@
// -*- 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 Signals = imports.signals;
const St = imports.gi.St;
@@ -127,7 +126,7 @@ const AuthPrompt = new Lang.Class({
this._initButtons();
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
let spinnerIcon = global.datadir + '/theme/process-working.svg';
this._spinner = new Animation.AnimatedIcon(spinnerIcon, DEFAULT_BUTTON_WELL_ICON_SIZE);
this._spinner.actor.opacity = 0;
this._spinner.actor.show();
@@ -135,7 +134,8 @@ const AuthPrompt = new Lang.Class({
},
_onDestroy: function() {
this._userVerifier.destroy();
this._userVerifier.clear();
this._userVerifier.disconnectAll();
this._userVerifier = null;
},
@@ -261,7 +261,6 @@ const AuthPrompt = new Lang.Class({
_onVerificationComplete: function() {
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
this.cancelButton.reactive = false;
},
_onReset: function() {
@@ -420,20 +419,17 @@ const AuthPrompt = new Lang.Class({
},
setUser: function(user) {
let oldChild = this._userWell.get_child();
if (oldChild)
oldChild.destroy();
if (user) {
let userWidget = new UserWidget.UserWidget(user);
this._userWell.set_child(userWidget.actor);
} else {
this._userWell.set_child(null);
}
},
reset: function() {
let oldStatus = this.verificationStatus;
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.cancelButton.reactive = true;
if (oldStatus == AuthPromptStatus.VERIFYING)
this._userVerifier.cancel();
@@ -502,9 +498,6 @@ const AuthPrompt = new Lang.Class({
},
cancel: function() {
if (this.verificationStatus == AuthPromptStatus.NOT_VERIFYING || this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
return;
}
this.reset();
this.emit('cancelled');
}

View File

@@ -26,7 +26,6 @@ const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
@@ -65,8 +64,6 @@ const UserListItem = new Lang.Class({
reactive: true,
x_align: St.Align.START,
x_fill: true });
this.actor.connect('destroy',
Lang.bind(this, this._onDestroy));
this._userWidget = new UserWidget.UserWidget(this.user);
layout.add(this._userWidget.actor);
@@ -90,10 +87,6 @@ const UserListItem = new Lang.Class({
this.actor.remove_style_pseudo_class('logged-in');
},
_onDestroy: function() {
this._user.disconnect(this._userChangedId);
},
_onClicked: function() {
this.emit('activate');
},
@@ -365,12 +358,12 @@ const LoginDialog = new Lang.Class({
Name: 'LoginDialog',
_init: function(parentActor) {
this.actor = new Shell.GenericContainer({ style_class: 'login-dialog',
visible: false });
this.actor.get_accessible().set_role(Atk.Role.WINDOW);
this.actor = new St.Widget({ accessible_role: Atk.Role.WINDOW,
layout_manager: new Clutter.BinLayout(),
style_class: 'login-dialog',
visible: false });
this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true }));
this.actor.connect('allocate', Lang.bind(this, this._onAllocate));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
parentActor.add_child(this.actor);
@@ -380,12 +373,13 @@ const LoginDialog = new Lang.Class({
if (GLib.getenv('GDM_GREETER_TEST') != '1') {
this._greeter = gdmClient.get_greeter_sync(null);
this._defaultSessionChangedId = this._greeter.connect('default-session-name-changed',
Lang.bind(this, this._onDefaultSessionChanged));
this._sessionOpenedId = this._greeter.connect('session-opened',
Lang.bind(this, this._onSessionOpened));
this._timedLoginRequestedId = this._greeter.connect('timed-login-requested',
Lang.bind(this, this._onTimedLoginRequested));
this._greeter.connect('default-session-name-changed',
Lang.bind(this, this._onDefaultSessionChanged));
this._greeter.connect('session-opened',
Lang.bind(this, this._onSessionOpened));
this._greeter.connect('timed-login-requested',
Lang.bind(this, this._onTimedLoginRequested));
}
this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
@@ -400,16 +394,23 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._updateLogo));
this._textureCache = St.TextureCache.get_default();
this._updateLogoTextureId = this._textureCache.connect('texture-file-changed',
Lang.bind(this, this._updateLogoTexture));
this._textureCache.connect('texture-file-changed',
Lang.bind(this, this._updateLogoTexture));
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_expand: true,
vertical: true,
visible: false });
this.actor.add_child(this._userSelectionBox);
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
text: '' });
this._userSelectionBox.add(this._bannerLabel);
this._updateBanner();
this._userList = new UserList();
this._userSelectionBox.add(this._userList.actor,
{ expand: true,
@@ -444,25 +445,11 @@ const LoginDialog = new Lang.Class({
x_align: St.Align.START,
x_fill: true });
this._bannerView = new St.ScrollView({ style_class: 'login-dialog-banner-view',
opacity: 0,
vscrollbar_policy: Gtk.PolicyType.AUTOMATIC,
hscrollbar_policy: Gtk.PolicyType.NEVER });
this.actor.add_child(this._bannerView);
let bannerBox = new St.BoxLayout({ vertical: true });
this._bannerView.add_actor(bannerBox);
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
text: '' });
this._bannerLabel.clutter_text.line_wrap = true;
this._bannerLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
bannerBox.add_child(this._bannerLabel);
this._updateBanner();
this._logoBin = new St.Widget({ style_class: 'login-dialog-logo-bin',
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.END });
y_align: Clutter.ActorAlign.END,
x_expand: true,
y_expand: true });
this.actor.add_child(this._logoBin);
this._updateLogo();
@@ -489,182 +476,8 @@ const LoginDialog = new Lang.Class({
// If the user list is enabled, it should take key focus; make sure the
// screen shield is initialized first to prevent it from stealing the
// focus later
this._startupCompleteId = Main.layoutManager.connect('startup-complete',
Lang.bind(this, this._updateDisableUserList));
},
_getBannerAllocation: function (dialogBox) {
let actorBox = new Clutter.ActorBox();
let [minWidth, minHeight, natWidth, natHeight] = this._bannerView.get_preferred_size();
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
actorBox.x1 = centerX - natWidth / 2;
actorBox.y1 = dialogBox.y1 + Main.layoutManager.panelBox.height;
actorBox.x2 = actorBox.x1 + natWidth;
actorBox.y2 = actorBox.y1 + natHeight;
return actorBox;
},
_getLogoBinAllocation: function (dialogBox) {
let actorBox = new Clutter.ActorBox();
let [minWidth, minHeight, natWidth, natHeight] = this._logoBin.get_preferred_size();
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
actorBox.x1 = centerX - natWidth / 2;
actorBox.y1 = dialogBox.y2 - natHeight;
actorBox.x2 = actorBox.x1 + natWidth;
actorBox.y2 = actorBox.y1 + natHeight;
return actorBox;
},
_getCenterActorAllocation: function (dialogBox, actor) {
let actorBox = new Clutter.ActorBox();
let [minWidth, minHeight, natWidth, natHeight] = actor.get_preferred_size();
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
let centerY = dialogBox.y1 + (dialogBox.y2 - dialogBox.y1) / 2;
actorBox.x1 = centerX - natWidth / 2;
actorBox.y1 = centerY - natHeight / 2;
actorBox.x2 = actorBox.x1 + natWidth;
actorBox.y2 = actorBox.y1 + natHeight;
return actorBox;
},
_onAllocate: function (actor, dialogBox, flags) {
let dialogWidth = dialogBox.x2 - dialogBox.x1;
let dialogHeight = dialogBox.y2 - dialogBox.y1;
// First find out what space the children require
let bannerAllocation = null;
let bannerHeight = 0;
let bannerWidth = 0;
if (this._bannerView.visible) {
bannerAllocation = this._getBannerAllocation(dialogBox, this._bannerView);
bannerHeight = bannerAllocation.y2 - bannerAllocation.y1;
bannerWidth = bannerAllocation.x2 - bannerAllocation.x1;
}
let authPromptAllocation = null;
let authPromptHeight = 0;
let authPromptWidth = 0;
if (this._authPrompt.actor.visible) {
authPromptAllocation = this._getCenterActorAllocation(dialogBox, this._authPrompt.actor);
authPromptHeight = authPromptAllocation.y2 - authPromptAllocation.y1;
authPromptWidth = authPromptAllocation.x2 - authPromptAllocation.x1;
}
let userSelectionAllocation = null;
let userSelectionHeight = 0;
if (this._userSelectionBox.visible) {
userSelectionAllocation = this._getCenterActorAllocation(dialogBox, this._userSelectionBox);
userSelectionHeight = userSelectionAllocation.y2 - userSelectionAllocation.y1;
}
let logoAllocation = null;
let logoHeight = 0;
if (this._logoBin.visible) {
logoAllocation = this._getLogoBinAllocation(dialogBox);
logoHeight = logoAllocation.y2 - logoAllocation.y1;
}
// Then figure out if we're overly constrained and need to
// try a different layout, or if we have what extra space we
// can hand out
if (bannerAllocation) {
let leftOverYSpace = dialogHeight - bannerHeight - authPromptHeight - logoHeight;
if (leftOverYSpace > 0) {
// First figure out how much left over space is up top
let leftOverTopSpace = leftOverYSpace / 2;
// Then, shift the banner into the middle of that extra space
let yShift = leftOverTopSpace / 2;
bannerAllocation.y1 += yShift;
bannerAllocation.y2 += yShift;
} else {
// Then figure out how much space there would be if we switched to a
// wide layout with banner on one side and authprompt on the other.
let leftOverXSpace = dialogWidth - authPromptWidth;
// In a wide view, half of the available space goes to the banner,
// and the other half goes to the margins.
let wideBannerWidth = leftOverXSpace / 2;
let wideSpacing = leftOverXSpace - wideBannerWidth;
// If we do go with a wide layout, we need there to be at least enough
// space for the banner and the auth prompt to be the same width,
// so it doesn't look unbalanced.
if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) {
let centerX = dialogBox.x1 + dialogWidth / 2;
let centerY = dialogBox.y1 + dialogHeight / 2;
// A small portion of the spacing goes down the center of the
// screen to help delimit the two columns of the wide view
let centerGap = wideSpacing / 8;
// place the banner along the left edge of the center margin
bannerAllocation.x2 = centerX - centerGap / 2;
bannerAllocation.x1 = bannerAllocation.x2 - wideBannerWidth;
// figure out how tall it would like to be and try to accomodate
// but don't let it get too close to the logo
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
let maxWideHeight = dialogHeight - 3 * logoHeight;
wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
bannerAllocation.y1 = centerY - wideBannerHeight / 2;
bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
// place the auth prompt along the right edge of the center margin
authPromptAllocation.x1 = centerX + centerGap / 2;
authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
} else {
// If we aren't going to do a wide view, then we need to limit
// the height of the banner so it will present scrollbars
// First figure out how much space there is without the banner
leftOverYSpace += bannerHeight;
// Then figure out how much of that space is up top
let availableTopSpace = leftOverYSpace / 2;
// Then give all of that space to the banner
bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
}
}
} else if (userSelectionAllocation) {
// Grow the user list to fill the space
let leftOverYSpace = dialogHeight - userSelectionHeight - logoHeight;
if (leftOverYSpace > 0) {
let topExpansion = leftOverYSpace / 2;
let bottomExpansion = topExpansion;
userSelectionAllocation.y1 -= topExpansion;
userSelectionAllocation.y2 += bottomExpansion;
}
}
// Finally hand out the allocations
if (bannerAllocation) {
this._bannerView.allocate(bannerAllocation, flags);
}
if (authPromptAllocation)
this._authPrompt.actor.allocate(authPromptAllocation, flags);
if (userSelectionAllocation)
this._userSelectionBox.allocate(userSelectionAllocation, flags);
if (logoAllocation)
this._logoBin.allocate(logoAllocation, flags);
Main.layoutManager.connect('startup-complete',
Lang.bind(this, this._updateDisableUserList));
},
_ensureUserListLoaded: function() {
@@ -719,36 +532,24 @@ const LoginDialog = new Lang.Class({
}
},
_fadeInBannerView: function() {
Tweener.addTween(this._bannerView,
{ opacity: 255,
time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad' });
},
_hideBannerView: function() {
Tweener.removeTweens(this._bannerView);
this._bannerView.opacity = 0;
},
_updateLogoTexture: function(cache, file) {
if (this._logoFile && !this._logoFile.equal(file))
_updateLogoTexture: function(cache, uri) {
if (this._logoFileUri != uri)
return;
this._logoBin.destroy_all_children();
if (this._logoFile) {
if (this._logoFileUri) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
-1, _LOGO_ICON_HEIGHT,
scaleFactor));
this._logoBin.add_child(this._textureCache.load_uri_async(this._logoFileUri,
-1, _LOGO_ICON_HEIGHT,
scaleFactor));
}
},
_updateLogo: function() {
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
this._logoFile = path ? Gio.file_new_for_path(path) : null;
this._updateLogoTexture(this._textureCache, this._logoFile);
this._logoFileUri = path ? Gio.file_new_for_path(path).get_uri() : null;
this._updateLogoTexture(this._textureCache, this._logoFileUri);
},
_onPrompted: function() {
@@ -798,7 +599,6 @@ const LoginDialog = new Lang.Class({
{ opacity: 255,
time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad' });
this._fadeInBannerView();
},
_showRealmLoginHint: function(realmManager, hint) {
@@ -838,8 +638,6 @@ const LoginDialog = new Lang.Class({
realmManager.release();
}));
this._updateCancelButton();
this._authPrompt.updateSensitivity(true);
this._showPrompt();
},
@@ -867,12 +665,10 @@ const LoginDialog = new Lang.Class({
},
_gotGreeterSessionProxy: function(proxy) {
this._greeterSessionProxy = proxy;
this._greeterSessionProxyChangedId =
proxy.connect('g-properties-changed', Lang.bind(this, function() {
if (proxy.Active)
this._loginScreenSessionActivated();
}));
proxy.connect('g-properties-changed', Lang.bind(this, function() {
if (proxy.Active)
this._loginScreenSessionActivated();
}));
},
_startSession: function(serviceName) {
@@ -1055,7 +851,6 @@ const LoginDialog = new Lang.Class({
_showUserList: function() {
this._ensureUserListLoaded();
this._authPrompt.hide();
this._hideBannerView();
this._sessionMenuButton.close();
this._setUserListExpanded(true);
this._notListedButton.show();
@@ -1095,30 +890,6 @@ const LoginDialog = new Lang.Class({
this._userManager.disconnect(this._userManagerLoadedId);
this._userManagerLoadedId = 0;
}
if (this._userAddedId) {
this._userManager.disconnect(this._userAddedId);
this._userAddedId = 0;
}
if (this._userRemovedId) {
this._userManager.disconnect(this._userRemovedId);
this._userRemovedId = 0;
}
this._textureCache.disconnect(this._updateLogoTextureId);
Main.layoutManager.disconnect(this._startupCompleteId);
if (this._settings) {
this._settings.run_dispose();
this._settings = null;
}
if (this._greeter) {
this._greeter.disconnect(this._defaultSessionChangedId);
this._greeter.disconnect(this._sessionOpenedId);
this._greeter.disconnect(this._timedLoginRequestedId);
this._greeter = null;
}
if (this._greeterSessionProxy) {
this._greeterSessionProxy.disconnect(this._greeterSessionProxyChangedId);
this._greeterSessionProxy = null;
}
},
_loadUserList: function() {
@@ -1133,15 +904,15 @@ const LoginDialog = new Lang.Class({
this._userList.addUser(users[i]);
}
this._userAddedId = this._userManager.connect('user-added',
Lang.bind(this, function(userManager, user) {
this._userList.addUser(user);
}));
this._userManager.connect('user-added',
Lang.bind(this, function(userManager, user) {
this._userList.addUser(user);
}));
this._userRemovedId = this._userManager.connect('user-removed',
Lang.bind(this, function(userManager, user) {
this._userList.removeUser(user);
}));
this._userManager.connect('user-removed',
Lang.bind(this, function(userManager, user) {
this._userList.removeUser(user);
}));
return GLib.SOURCE_REMOVE;
},
@@ -1155,7 +926,7 @@ const LoginDialog = new Lang.Class({
this.actor.show();
this.actor.opacity = 0;
Main.pushModal(this.actor, { actionMode: Shell.ActionMode.LOGIN_SCREEN });
Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOGIN_SCREEN });
Tweener.addTween(this.actor,
{ opacity: 255,

View File

@@ -142,10 +142,10 @@ const ShellUserVerifier = new Lang.Class({
// after a user has been picked.
this._checkForSmartcard();
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
Lang.bind(this, this._checkForSmartcard));
this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed',
Lang.bind(this, this._checkForSmartcard));
this._smartcardManager.connect('smartcard-inserted',
Lang.bind(this, this._checkForSmartcard));
this._smartcardManager.connect('smartcard-removed',
Lang.bind(this, this._checkForSmartcard));
this._messageQueue = [];
this._messageQueueTimeoutId = 0;
@@ -159,8 +159,8 @@ const ShellUserVerifier = new Lang.Class({
if (this._oVirtCredentialsManager.hasToken())
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
Lang.bind(this, this._oVirtUserAuthenticated));
this._oVirtCredentialsManager.connect('user-authenticated',
Lang.bind(this, this._oVirtUserAuthenticated));
},
begin: function(userName, hold) {
@@ -191,37 +191,20 @@ const ShellUserVerifier = new Lang.Class({
}
},
_clearUserVerifier: function() {
if (this._userVerifier) {
this._userVerifier.run_dispose();
this._userVerifier = null;
}
},
clear: function() {
if (this._cancellable) {
this._cancellable.cancel();
this._cancellable = null;
}
this._clearUserVerifier();
if (this._userVerifier) {
this._userVerifier.run_dispose();
this._userVerifier = null;
}
this._clearMessageQueue();
},
destroy: function() {
this.clear();
this._settings.run_dispose();
this._settings = null;
this._smartcardManager.disconnect(this._smartcardInsertedId);
this._smartcardManager.disconnect(this._smartcardRemovedId);
this._smartcardManager = null;
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
this._oVirtCredentialsManager = null;
},
answerQuery: function(serviceName, answer) {
if (!this.hasPendingMessages) {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
@@ -300,10 +283,9 @@ const ShellUserVerifier = new Lang.Class({
this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, Lang.bind(this,
function(device, error) {
if (!error && device) {
if (!error && device)
this._haveFingerprintReader = true;
this._updateDefaultService();
}
}));
},
@@ -344,7 +326,6 @@ const ShellUserVerifier = new Lang.Class({
_reauthenticationChannelOpened: function(client, result) {
try {
this._clearUserVerifier();
this._userVerifier = client.open_reauthentication_channel_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
return;
@@ -368,7 +349,6 @@ const ShellUserVerifier = new Lang.Class({
_userVerifierGot: function(client, result) {
try {
this._clearUserVerifier();
this._userVerifier = client.get_user_verifier_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
return;

View File

@@ -16,9 +16,7 @@
<file>misc/fileUtils.js</file>
<file>misc/gnomeSession.js</file>
<file>misc/history.js</file>
<file>misc/ibusManager.js</file>
<file>misc/jsParse.js</file>
<file>misc/keyboardManager.js</file>
<file>misc/loginManager.js</file>
<file>misc/modemManager.js</file>
<file>misc/objectManager.js</file>
@@ -92,6 +90,7 @@
<file>ui/windowAttentionHandler.js</file>
<file>ui/windowMenu.js</file>
<file>ui/windowManager.js</file>
<file>ui/wobbly.js</file>
<file>ui/workspace.js</file>
<file>ui/workspaceSwitcherPopup.js</file>
<file>ui/workspaceThumbnail.js</file>

View File

@@ -43,7 +43,7 @@ function getCurrentExtension() {
let path = match[1];
let file = Gio.File.new_for_path(path);
// Walk up the directory tree, looking for an extension with
// Walk up the directory tree, looking for an extesion with
// the same UUID as a directory name.
while (file != null) {
let extension = extensions[file.get_basename()];

View File

@@ -1,234 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
try {
var IBus = imports.gi.IBus;
_checkIBusVersion(1, 5, 2);
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
} catch (e) {
var IBus = null;
log(e);
}
let _ibusManager = null;
function _checkIBusVersion(requiredMajor, requiredMinor, requiredMicro) {
if ((IBus.MAJOR_VERSION > requiredMajor) ||
(IBus.MAJOR_VERSION == requiredMajor && IBus.MINOR_VERSION > requiredMinor) ||
(IBus.MAJOR_VERSION == requiredMajor && IBus.MINOR_VERSION == requiredMinor &&
IBus.MICRO_VERSION >= requiredMicro))
return;
throw "Found IBus version %d.%d.%d but required is %d.%d.%d".
format(IBus.MAJOR_VERSION, IBus.MINOR_VERSION, IBus.MINOR_VERSION,
requiredMajor, requiredMinor, requiredMicro);
}
function getIBusManager() {
if (_ibusManager == null)
_ibusManager = new IBusManager();
return _ibusManager;
}
const IBusManager = new Lang.Class({
Name: 'IBusManager',
// This is the longest we'll keep the keyboard frozen until an input
// source is active.
_MAX_INPUT_SOURCE_ACTIVATION_TIME: 4000, // ms
_PRELOAD_ENGINES_DELAY_TIME: 30, // sec
_init: function() {
if (!IBus)
return;
IBus.init();
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
this._panelService = null;
this._engines = {};
this._ready = false;
this._registerPropertiesId = 0;
this._currentEngineName = null;
this._preloadEnginesId = 0;
this._ibus = IBus.Bus.new_async();
this._ibus.connect('connected', Lang.bind(this, this._onConnected));
this._ibus.connect('disconnected', Lang.bind(this, this._clear));
// Need to set this to get 'global-engine-changed' emitions
this._ibus.set_watch_ibus_signal(true);
this._ibus.connect('global-engine-changed', Lang.bind(this, this._engineChanged));
this._spawn();
},
_spawn: function() {
try {
Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'],
Gio.SubprocessFlags.NONE);
} catch(e) {
log('Failed to launch ibus-daemon: ' + e.message);
}
},
_clear: function() {
if (this._panelService)
this._panelService.destroy();
this._panelService = null;
this._candidatePopup.setPanelService(null);
this._engines = {};
this._ready = false;
this._registerPropertiesId = 0;
this._currentEngineName = null;
this.emit('ready', false);
this._spawn();
},
_onConnected: function() {
this._ibus.list_engines_async(-1, null, Lang.bind(this, this._initEngines));
this._ibus.request_name_async(IBus.SERVICE_PANEL,
IBus.BusNameFlag.REPLACE_EXISTING,
-1, null,
Lang.bind(this, this._initPanelService));
},
_initEngines: function(ibus, result) {
let enginesList = this._ibus.list_engines_async_finish(result);
if (enginesList) {
for (let i = 0; i < enginesList.length; ++i) {
let name = enginesList[i].get_name();
this._engines[name] = enginesList[i];
}
this._updateReadiness();
} else {
this._clear();
}
},
_initPanelService: function(ibus, result) {
let success = this._ibus.request_name_async_finish(result);
if (success) {
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
object_path: IBus.PATH_PANEL });
this._candidatePopup.setPanelService(this._panelService);
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
try {
// IBus versions older than 1.5.10 have a bug which
// causes spurious set-content-type emissions when
// switching input focus that temporarily lose purpose
// and hints defeating its intended semantics and
// confusing users. We thus don't use it in that case.
_checkIBusVersion(1, 5, 10);
this._panelService.connect('set-content-type', Lang.bind(this, this._setContentType));
} catch (e) {
}
// If an engine is already active we need to get its properties
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
let engine;
try {
engine = this._ibus.get_global_engine_async_finish(result);
if (!engine)
return;
} catch(e) {
return;
}
this._engineChanged(this._ibus, engine.get_name());
}));
this._updateReadiness();
} else {
this._clear();
}
},
_updateReadiness: function() {
this._ready = (Object.keys(this._engines).length > 0 &&
this._panelService != null);
this.emit('ready', this._ready);
},
_engineChanged: function(bus, engineName) {
if (!this._ready)
return;
this._currentEngineName = engineName;
if (this._registerPropertiesId != 0)
return;
this._registerPropertiesId =
this._panelService.connect('register-properties', Lang.bind(this, function(p, props) {
if (!props.get(0))
return;
this._panelService.disconnect(this._registerPropertiesId);
this._registerPropertiesId = 0;
this.emit('properties-registered', this._currentEngineName, props);
}));
},
_updateProperty: function(panel, prop) {
this.emit('property-updated', this._currentEngineName, prop);
},
_setContentType: function(panel, purpose, hints) {
this.emit('set-content-type', purpose, hints);
},
activateProperty: function(key, state) {
this._panelService.property_activate(key, state);
},
getEngineDesc: function(id) {
if (!IBus || !this._ready)
return null;
return this._engines[id];
},
setEngine: function(id, callback) {
// Send id even if id == this._currentEngineName
// because 'properties-registered' signal can be emitted
// while this._ibusSources == null on a lock screen.
if (!IBus || !this._ready) {
if (callback)
callback();
return;
}
this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
null, callback);
},
preloadEngines: function(ids) {
if (!IBus || !this._ibus || ids.length == 0)
return;
if (this._preloadEnginesId != 0) {
Mainloop.source_remove(this._preloadEnginesId);
this._preloadEnginesId = 0;
}
this._preloadEnginesId =
Mainloop.timeout_add_seconds(this._PRELOAD_ENGINES_DELAY_TIME,
Lang.bind(this, function() {
this._ibus.preload_engines_async(
ids,
-1,
null,
null);
this._preloadEnginesId = 0;
return GLib.SOURCE_REMOVE;
}));
},
});
Signals.addSignalMethods(IBusManager.prototype);

View File

@@ -1,153 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Main = imports.ui.main;
const DEFAULT_LOCALE = 'en_US';
const DEFAULT_LAYOUT = 'us';
const DEFAULT_VARIANT = '';
let _xkbInfo = null;
function getXkbInfo() {
if (_xkbInfo == null)
_xkbInfo = new GnomeDesktop.XkbInfo();
return _xkbInfo;
}
let _keyboardManager = null;
function getKeyboardManager() {
if (_keyboardManager == null)
_keyboardManager = new KeyboardManager();
return _keyboardManager;
}
function releaseKeyboard() {
if (Main.modalCount > 0)
global.display.unfreeze_keyboard(global.get_current_time());
else
global.display.ungrab_keyboard(global.get_current_time());
}
function holdKeyboard() {
global.display.freeze_keyboard(global.get_current_time());
}
const KeyboardManager = new Lang.Class({
Name: 'KeyboardManager',
// The XKB protocol doesn't allow for more that 4 layouts in a
// keymap. Wayland doesn't impose this limit and libxkbcommon can
// handle up to 32 layouts but since we need to support X clients
// even as a Wayland compositor, we can't bump this.
MAX_LAYOUTS_PER_GROUP: 4,
_init: function() {
this._xkbInfo = getXkbInfo();
this._current = null;
this._localeLayoutInfo = this._getLocaleLayout();
this._layoutInfos = {};
},
_applyLayoutGroup: function(group) {
let options = this._buildOptionsString();
let [layouts, variants] = this._buildGroupStrings(group);
Meta.get_backend().set_keymap(layouts, variants, options);
},
_applyLayoutGroupIndex: function(idx) {
Meta.get_backend().lock_layout_group(idx);
},
apply: function(id) {
let info = this._layoutInfos[id];
if (!info)
return;
if (this._current && this._current.group == info.group) {
if (this._current.groupIndex != info.groupIndex)
this._applyLayoutGroupIndex(info.groupIndex);
} else {
this._applyLayoutGroup(info.group);
this._applyLayoutGroupIndex(info.groupIndex);
}
this._current = info;
},
reapply: function() {
if (!this._current)
return;
this._applyLayoutGroup(this._current.group);
this._applyLayoutGroupIndex(this._current.groupIndex);
},
setUserLayouts: function(ids) {
this._current = null;
this._layoutInfos = {};
for (let i = 0; i < ids.length; ++i) {
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(ids[i]);
if (found)
this._layoutInfos[ids[i]] = { id: ids[i], layout: _layout, variant: _variant };
}
let i = 0;
let group = [];
for (let id in this._layoutInfos) {
// We need to leave one slot on each group free so that we
// can add a layout containing the symbols for the
// language used in UI strings to ensure that toolkits can
// handle mnemonics like Alt+Ф even if the user is
// actually typing in a different layout.
let groupIndex = i % (this.MAX_LAYOUTS_PER_GROUP - 1);
if (groupIndex == 0)
group = [];
let info = this._layoutInfos[id];
group[groupIndex] = info;
info.group = group;
info.groupIndex = groupIndex;
i += 1;
}
},
_getLocaleLayout: function() {
let locale = GLib.get_language_names()[0];
if (locale.indexOf('_') == -1)
locale = DEFAULT_LOCALE;
let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
if (!found)
[, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE);
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
if (found)
return { layout: _layout, variant: _variant };
else
return { layout: DEFAULT_LAYOUT, variant: DEFAULT_VARIANT };
},
_buildGroupStrings: function(_group) {
let group = _group.concat(this._localeLayoutInfo);
let layouts = group.map(function(g) { return g.layout; }).join(',');
let variants = group.map(function(g) { return g.variant; }).join(',');
return [layouts, variants];
},
setKeyboardOptions: function(options) {
this._xkbOptions = options;
},
_buildOptionsString: function() {
let options = this._xkbOptions.join(',');
return options;
}
});

View File

@@ -58,14 +58,6 @@ const AppSwitcherPopup = new Lang.Class({
this._currentWindow = -1;
this.thumbnailsVisible = false;
let apps = Shell.AppSystem.get_default().get_running ();
if (apps.length == 0)
return;
this._switcherList = new AppSwitcher(apps, this);
this._items = this._switcherList.icons;
},
_allocate: function (actor, box, flags) {
@@ -81,6 +73,7 @@ const AppSwitcherPopup = new Lang.Class({
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
let bottomPadding = this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
let vPadding = this.actor.get_theme_node().get_vertical_padding();
let hPadding = leftPadding + rightPadding;
let icon = this._items[this._selectedIndex].actor;
@@ -106,6 +99,20 @@ const AppSwitcherPopup = new Lang.Class({
}
},
_createSwitcher: function() {
let apps = Shell.AppSystem.get_default().get_running ();
if (apps.length == 0)
return false;
this._switcherList = new AppSwitcher(apps, this);
this._items = this._switcherList.icons;
if (this._items.length == 0)
return false;
return true;
},
_initialSelection: function(backward, binding) {
if (binding == 'switch-group') {
if (backward) {
@@ -358,18 +365,9 @@ const WindowSwitcherPopup = new Lang.Class({
Name: 'WindowSwitcherPopup',
Extends: SwitcherPopup.SwitcherPopup,
_init: function() {
this.parent();
_init: function(items) {
this.parent(items);
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
let windows = this._getWindowList();
if (windows.length == 0)
return;
let mode = this._settings.get_enum('app-icon-mode');
this._switcherList = new WindowList(windows, mode);
this._items = this._switcherList.icons;
},
_getWindowList: function() {
@@ -377,6 +375,31 @@ const WindowSwitcherPopup = new Lang.Class({
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
},
_createSwitcher: function() {
let windows = this._getWindowList();
if (windows.length == 0)
return false;
let mode = this._settings.get_enum('app-icon-mode');
this._switcherList = new WindowList(windows, mode);
this._items = this._switcherList.icons;
if (this._items.length == 0)
return false;
return true;
},
_initialSelection: function(backward, binding) {
if (binding == 'switch-windows-backward' || backward)
this._select(this._items.length - 1);
else if (this._items.length == 1)
this._select(0);
else
this._select(1);
},
_keyPressHandler: function(keysym, action) {
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
this._select(this._next());

View File

@@ -12,7 +12,7 @@ const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
const Animation = new Lang.Class({
Name: 'Animation',
_init: function(file, width, height, speed) {
_init: function(filename, width, height, speed) {
this.actor = new St.Bin();
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._speed = speed;
@@ -23,7 +23,7 @@ const Animation = new Lang.Class({
this._frame = 0;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._animations = St.TextureCache.get_default().load_sliced_image (file, width, height, scaleFactor,
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height, scaleFactor,
Lang.bind(this, this._animationsLoaded));
this.actor.set_child(this._animations);
},
@@ -82,7 +82,7 @@ const AnimatedIcon = new Lang.Class({
Name: 'AnimatedIcon',
Extends: Animation,
_init: function(file, size) {
this.parent(file, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
_init: function(filename, size) {
this.parent(filename, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
}
});

View File

@@ -379,7 +379,9 @@ const AllView = new Lang.Class({
this.actor.add_actor(this._scrollView);
this._scrollView.set_policy(Gtk.PolicyType.NEVER,
Gtk.PolicyType.EXTERNAL);
Gtk.PolicyType.AUTOMATIC);
// we are only using ScrollView for the fade effect, hide scrollbars
this._scrollView.vscroll.hide();
this._adjustment = this._scrollView.vscroll.adjustment;
this._pageIndicators = new PageIndicators();
@@ -1265,7 +1267,6 @@ const FolderIcon = new Lang.Class({
addAppId(appInfo.get_id());
});
this.actor.visible = this.view.getAllItems().length > 0;
this.view.loadGrid();
this.emit('apps-changed');
},
@@ -1562,11 +1563,10 @@ const AppIcon = new Lang.Class({
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._menuTimeoutId = 0;
this._stateChangedId = this.app.connect('notify::state', Lang.bind(this,
function () {
this._updateRunningStyle();
}));
this._updateRunningStyle();
this._stateChangedId = this.app.connect('notify::state',
Lang.bind(this,
this._onStateChanged));
this._onStateChanged();
},
_onDestroy: function() {
@@ -1587,7 +1587,7 @@ const AppIcon = new Lang.Class({
}
},
_updateRunningStyle: function() {
_onStateChanged: function() {
if (this.app.state != Shell.AppState.STOPPED)
this.actor.add_style_class_name('running');
else
@@ -1687,8 +1687,7 @@ const AppIcon = new Lang.Class({
activate: function (button) {
let event = Clutter.get_current_event();
let modifiers = event ? event.get_state() : 0;
let openNewWindow = this.app.can_open_new_window () &&
modifiers & Clutter.ModifierType.CONTROL_MASK &&
let openNewWindow = modifiers & Clutter.ModifierType.CONTROL_MASK &&
this.app.state == Shell.AppState.RUNNING ||
button && button == 2;

View File

@@ -14,11 +14,6 @@ const RENAMED_DESKTOP_IDS = {
'gcalctool.desktop': 'gnome-calculator.desktop',
'gedit.desktop': 'org.gnome.gedit.desktop',
'glchess.desktop': 'gnome-chess.desktop',
'glines.desktop': 'five-or-more.desktop',
'gnect.desktop': 'four-in-a-row.desktop',
'gnibbles.desktop': 'gnome-nibbles.desktop',
'gnobots2.desktop': 'gnome-robots.desktop',
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
@@ -28,9 +23,6 @@ const RENAMED_DESKTOP_IDS = {
'gnome-software.desktop': 'org.gnome.Software.desktop',
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
'gnomine.desktop': 'gnome-mines.desktop',
'gnotravex.desktop': 'gnome-tetravex.desktop',
'gnotski.desktop': 'gnome-klotski.desktop',
'gtali.desktop': 'tali.desktop',
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
'polari.desktop': 'org.gnome.Polari.desktop',
'totem.desktop': 'org.gnome.Totem.desktop',

View File

@@ -106,8 +106,6 @@ const Main = imports.ui.main;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
const PRIMARY_COLOR_KEY = 'primary-color';
const SECONDARY_COLOR_KEY = 'secondary-color';
@@ -127,16 +125,6 @@ const ANIMATION_MIN_WAKEUP_INTERVAL = 1.0;
let _backgroundCache = null;
function _fileEqual0(file1, file2) {
if (file1 == file2)
return true;
if (!file1 || !file2)
return false;
return file1.equal(file2);
}
const BackgroundCache = new Lang.Class({
Name: 'BackgroundCache',
@@ -146,25 +134,25 @@ const BackgroundCache = new Lang.Class({
this._backgroundSources = {};
},
monitorFile: function(file) {
let key = file.hash();
if (this._fileMonitors[key])
monitorFile: function(filename) {
if (this._fileMonitors[filename])
return;
let file = Gio.File.new_for_path(filename);
let monitor = file.monitor(Gio.FileMonitorFlags.NONE, null);
monitor.connect('changed',
Lang.bind(this, function() {
this.emit('file-changed', file);
this.emit('file-changed', filename);
}));
this._fileMonitors[key] = monitor;
this._fileMonitors[filename] = monitor;
},
getAnimation: function(params) {
params = Params.parse(params, { file: null,
params = Params.parse(params, { filename: null,
onLoaded: null });
if (_fileEqual0(this._animationFile, params.file)) {
if (this._animationFilename == params.filename) {
if (params.onLoaded) {
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
params.onLoaded(this._animation);
@@ -172,13 +160,12 @@ const BackgroundCache = new Lang.Class({
}));
GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
}
return;
}
let animation = new Animation({ file: params.file });
let animation = new Animation({ filename: params.filename });
animation.load(Lang.bind(this, function() {
this._animationFile = params.file;
this._animationFilename = params.filename;
this._animation = animation;
if (params.onLoaded) {
@@ -231,14 +218,14 @@ const Background = new Lang.Class({
params = Params.parse(params, { monitorIndex: 0,
layoutManager: Main.layoutManager,
settings: null,
file: null,
filename: null,
style: null });
this.background = new Meta.Background({ meta_screen: global.screen });
this.background._delegate = this;
this._settings = params.settings;
this._file = params.file;
this._filename = params.filename;
this._style = params.style;
this._monitorIndex = params.monitorIndex;
this._layoutManager = params.layoutManager;
@@ -255,7 +242,11 @@ const Background = new Lang.Class({
destroy: function() {
this._cancellable.cancel();
this._removeAnimationTimeout();
if (this._updateAnimationTimeoutId) {
GLib.source_remove (this._updateAnimationTimeoutId);
this._updateAnimationTimeoutId = 0;
}
let i;
let keys = Object.keys(this._fileWatches);
@@ -269,13 +260,6 @@ const Background = new Lang.Class({
this._settingsChangedSignalId = 0;
},
updateResolution: function() {
if (this._animation) {
this._removeAnimationTimeout();
this._updateAnimation();
}
},
_setLoaded: function() {
if (this.isLoaded)
return;
@@ -305,28 +289,18 @@ const Background = new Lang.Class({
this.background.set_gradient(shadingType, color, secondColor);
},
_watchFile: function(file) {
let key = file.hash();
if (this._fileWatches[key])
_watchFile: function(filename) {
if (this._fileWatches[filename])
return;
this._cache.monitorFile(file);
this._cache.monitorFile(filename);
let signalId = this._cache.connect('file-changed',
Lang.bind(this, function(cache, changedFile) {
if (changedFile.equal(file)) {
let imageCache = Meta.BackgroundImageCache.get_default();
imageCache.purge(changedFile);
if (changedFile == filename) {
this.emit('changed');
}
}));
this._fileWatches[key] = signalId;
},
_removeAnimationTimeout: function() {
if (this._updateAnimationTimeoutId) {
GLib.source_remove(this._updateAnimationTimeoutId);
this._updateAnimationTimeoutId = 0;
}
this._fileWatches[filename] = signalId;
},
_updateAnimation: function() {
@@ -342,9 +316,9 @@ const Background = new Lang.Class({
this._animation.transitionProgress,
this._style);
} else if (files.length > 0) {
this.background.set_file(files[0], this._style);
this.background.set_filename(files[0], this._style);
} else {
this.background.set_file(null, this._style);
this.background.set_filename(null, this._style);
}
this._queueUpdateAnimation();
});
@@ -401,28 +375,28 @@ const Background = new Lang.Class({
GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
},
_loadAnimation: function(file) {
this._cache.getAnimation({ file: file,
onLoaded: Lang.bind(this, function(animation) {
this._animation = animation;
_loadAnimation: function(filename) {
this._cache.getAnimation({ filename: filename,
onLoaded: Lang.bind(this, function(animation) {
this._animation = animation;
if (!this._animation || this._cancellable.is_cancelled()) {
this._setLoaded();
return;
}
if (!this._animation || this._cancellable.is_cancelled()) {
this._setLoaded();
return;
}
this._updateAnimation();
this._watchFile(file);
})
});
this._updateAnimation();
this._watchFile(filename);
})
});
},
_loadImage: function(file) {
this.background.set_file(file, this._style);
this._watchFile(file);
_loadImage: function(filename) {
this.background.set_filename(filename, this._style);
this._watchFile(filename);
let cache = Meta.BackgroundImageCache.get_default();
let image = cache.load(file);
let image = cache.load(filename);
if (image.is_loaded())
this._setLoaded();
else {
@@ -434,11 +408,11 @@ const Background = new Lang.Class({
}
},
_loadFile: function(file) {
if (file.get_basename().endsWith('.xml'))
this._loadAnimation(file);
_loadFile: function(filename) {
if (filename.endsWith('.xml'))
this._loadAnimation(filename);
else
this._loadImage(file);
this._loadImage(filename);
},
_load: function () {
@@ -446,12 +420,12 @@ const Background = new Lang.Class({
this._loadPattern();
if (!this._file) {
if (!this._filename) {
this._setLoaded();
return;
}
this._loadFile(this._file);
this._loadFile(this._filename);
},
});
Signals.addSignalMethods(Background.prototype);
@@ -462,12 +436,11 @@ const SystemBackground = new Lang.Class({
Name: 'SystemBackground',
_init: function() {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png');
let filename = global.datadir + '/theme/noise-texture.png';
if (_systemBackground == null) {
_systemBackground = new Meta.Background({ meta_screen: global.screen });
_systemBackground.set_color(DEFAULT_BACKGROUND_COLOR);
_systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER);
_systemBackground.set_filename(filename, GDesktopEnums.BackgroundStyle.WALLPAPER);
}
this.actor = new Meta.BackgroundActor({ meta_screen: global.screen,
@@ -475,7 +448,7 @@ const SystemBackground = new Lang.Class({
background: _systemBackground });
let cache = Meta.BackgroundImageCache.get_default();
let image = cache.load(file);
let image = cache.load(filename);
if (image.is_loaded()) {
image = null;
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
@@ -504,37 +477,23 @@ const BackgroundSource = new Lang.Class({
this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE');
this._settings = new Gio.Settings({ schema_id: settingsSchema });
this._backgrounds = [];
this._monitorsChangedId = global.screen.connect('monitors-changed',
Lang.bind(this, this._onMonitorsChanged));
},
_onMonitorsChanged: function() {
for (let monitorIndex in this._backgrounds) {
let background = this._backgrounds[monitorIndex];
if (monitorIndex < this._layoutManager.monitors.length) {
background.updateResolution();
} else {
background.disconnect(background._changedId);
background.destroy();
delete this._backgrounds[monitorIndex];
}
}
},
getBackground: function(monitorIndex) {
let file = null;
let filename = null;
let style;
if (this._overrideImage != null) {
file = Gio.File.new_for_path(this._overrideImage);
filename = this._overrideImage;
style = GDesktopEnums.BackgroundStyle.ZOOM; // Hardcode
} else {
style = this._settings.get_enum(BACKGROUND_STYLE_KEY);
if (style != GDesktopEnums.BackgroundStyle.NONE) {
let uri = this._settings.get_string(PICTURE_URI_KEY);
file = Gio.File.new_for_commandline_arg(uri);
if (GLib.uri_parse_scheme(uri) != null)
filename = Gio.File.new_for_uri(uri).get_path();
else
filename = uri;
}
}
@@ -542,7 +501,7 @@ const BackgroundSource = new Lang.Class({
// they can have variants that depend on the aspect ratio and
// size of the monitor; for other backgrounds we can use the
// same background object for all monitors.
if (file == null || !file.get_basename().endsWith('.xml'))
if (filename == null || !filename.endsWith('.xml'))
monitorIndex = 0;
if (!(monitorIndex in this._backgrounds)) {
@@ -550,12 +509,12 @@ const BackgroundSource = new Lang.Class({
monitorIndex: monitorIndex,
layoutManager: this._layoutManager,
settings: this._settings,
file: file,
filename: filename,
style: style
});
background._changedId = background.connect('changed', Lang.bind(this, function() {
background.disconnect(background._changedId);
let changedId = background.connect('changed', Lang.bind(this, function() {
background.disconnect(changedId);
background.destroy();
delete this._backgrounds[monitorIndex];
}));
@@ -567,13 +526,8 @@ const BackgroundSource = new Lang.Class({
},
destroy: function() {
global.screen.disconnect(this._monitorsChangedId);
for (let monitorIndex in this._backgrounds) {
let background = this._backgrounds[monitorIndex];
background.disconnect(background._changedId);
background.destroy();
}
for (let monitorIndex in this._backgrounds)
this._backgrounds[monitorIndex].destroy();
this._backgrounds = null;
}
@@ -583,9 +537,9 @@ const Animation = new Lang.Class({
Name: 'Animation',
_init: function(params) {
params = Params.parse(params, { file: null });
params = Params.parse(params, { filename: null });
this.file = params.file;
this.filename = params.filename;
this.keyFrameFiles = [];
this.transitionProgress = 0.0;
this.transitionDuration = 0.0;
@@ -593,7 +547,9 @@ const Animation = new Lang.Class({
},
load: function(callback) {
this._show = new GnomeDesktop.BGSlideShow({ filename: this.file.get_path() });
let file = Gio.File.new_for_path(this.filename);
this._show = new GnomeDesktop.BGSlideShow({ filename: this.filename });
this._show.load_async(null,
Lang.bind(this,
@@ -613,16 +569,16 @@ const Animation = new Lang.Class({
if (this._show.get_num_slides() < 1)
return;
let [progress, duration, isFixed, filename1, filename2] = this._show.get_current_slide(monitor.width, monitor.height);
let [progress, duration, isFixed, file1, file2] = this._show.get_current_slide(monitor.width, monitor.height);
this.transitionDuration = duration;
this.transitionProgress = progress;
if (filename1)
this.keyFrameFiles.push(Gio.File.new_for_path(filename1));
if (file1)
this.keyFrameFiles.push(file1);
if (filename2)
this.keyFrameFiles.push(Gio.File.new_for_path(filename2));
if (file2)
this.keyFrameFiles.push(file2);
},
});
Signals.addSignalMethods(Animation.prototype);
@@ -745,7 +701,7 @@ const BackgroundManager = new Lang.Class({
background.disconnect(changeSignalId);
if (backgroundActor.loadedSignalId)
background.disconnect(backgroundActor.loadedSignalId);
backgroundActor.background._delegate.disconnect(backgroundActor.loadedSignalId);
}));
return backgroundActor;

View File

@@ -13,11 +13,9 @@ const Shell = imports.gi.Shell;
const MSECS_IN_DAY = 24 * 60 * 60 * 1000;
const SHOW_WEEKDATE_KEY = 'show-weekdate';
const ELLIPSIS_CHAR = '\u2026';
// alias to prevent xgettext from picking up strings translated in GTK+
const gtk30_ = Gettext_gtk30.gettext;
const NC_ = function(context, str) { return str; };
// in org.gnome.desktop.interface
const CLOCK_FORMAT_KEY = 'clock-format';
@@ -34,10 +32,12 @@ function _sameDay(dateA, dateB) {
return _sameMonth(dateA, dateB) && (dateA.getDate() == dateB.getDate());
}
/* TODO: maybe needs config - right now we assume that Saturday and
* Sunday are non-work days (not true in e.g. Israel, it's Sunday and
* Monday there)
*/
function _isWorkDay(date) {
/* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
let days = C_('calendar-no-work', "06");
return days.indexOf(date.getDay().toString()) == -1;
return date.getDay() != 0 && date.getDay() != 6;
}
function _getBeginningOfDay(date) {
@@ -58,21 +58,19 @@ function _getEndOfDay(date) {
return ret;
}
function _formatEventTime(event, clockFormat, periodBegin, periodEnd) {
function _formatEventTime(event, clockFormat) {
let ret;
let allDay = (event.allDay || (event.date <= periodBegin && event.end >= periodEnd));
if (allDay) {
if (event.allDay) {
/* Translators: Shown in calendar event list for all day events
* Keep it short, best if you can use less then 10 characters
*/
ret = C_("event list time", "All Day");
} else {
let date = event.date >= periodBegin ? event.date : event.end;
switch (clockFormat) {
case '24h':
/* Translators: Shown in calendar event list, if 24h format,
\u2236 is a ratio character, similar to : */
ret = date.toLocaleFormat(C_("event list time", "%H\u2236%M"));
ret = event.date.toLocaleFormat(C_("event list time", "%H\u2236%M"));
break;
default:
@@ -81,13 +79,30 @@ function _formatEventTime(event, clockFormat, periodBegin, periodEnd) {
/* Translators: Shown in calendar event list, if 12h format,
\u2236 is a ratio character, similar to : and \u2009 is
a thin space */
ret = date.toLocaleFormat(C_("event list time", "%l\u2236%M\u2009%p"));
ret = event.date.toLocaleFormat(C_("event list time", "%l\u2236%M\u2009%p"));
break;
}
}
return ret;
}
function _getCalendarWeekForDate(date) {
// Based on the algorithms found here:
// http://en.wikipedia.org/wiki/Talk:ISO_week_date
let midnightDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
// Need to get Monday to be 1 ... Sunday to be 7
let dayOfWeek = 1 + ((midnightDate.getDay() + 6) % 7);
let nearestThursday = new Date(midnightDate.getFullYear(), midnightDate.getMonth(),
midnightDate.getDate() + (4 - dayOfWeek));
let jan1st = new Date(nearestThursday.getFullYear(), 0, 1);
let diffDate = nearestThursday - jan1st;
let dayNumber = Math.floor(Math.abs(diffDate) / MSECS_IN_DAY);
let weekNumber = Math.floor(dayNumber / 7) + 1;
return weekNumber;
}
function _getCalendarDayAbbreviation(dayNumber) {
let abbreviations = [
/* Translators: Calendar grid abbreviation for Sunday.
@@ -233,24 +248,11 @@ const DBusEventSource = new Lang.Class({
this._initialized = false;
this._dbusProxy = new CalendarServer();
this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(object, result) {
let loaded = false;
try {
this._dbusProxy.init_finish(result);
loaded = true;
} catch(e) {
if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
// Ignore timeouts and install signals as normal, because with high
// probability the service will appear later on, and we will get a
// NameOwnerChanged which will finish loading
//
// (But still _initialized to false, because the proxy does not know
// about the HasCalendars property and would cause an exception trying
// to read it)
} else {
log('Error loading calendars: ' + e.message);
return;
}
log('Error loading calendars: ' + e.message);
return;
}
this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
@@ -266,11 +268,9 @@ const DBusEventSource = new Lang.Class({
this.emit('notify::has-calendars');
}));
this._initialized = loaded;
if (loaded) {
this.emit('notify::has-calendars');
this._onNameAppeared();
}
this._initialized = true;
this.emit('notify::has-calendars');
this._onNameAppeared();
}));
},
@@ -292,7 +292,6 @@ const DBusEventSource = new Lang.Class({
},
_onNameAppeared: function(owner) {
this._initialized = true;
this._resetCache();
this._loadEvents(true);
},
@@ -362,12 +361,6 @@ const DBusEventSource = new Lang.Class({
result.push(event);
}
}
result.sort(function(event1, event2) {
// sort events by end time on ending day
let d1 = event1.date < begin && event1.end <= end ? event1.end : event1.date;
let d2 = event2.date < begin && event2.end <= end ? event2.end : event2.date;
return d1.getTime() - d2.getTime();
});
return result;
},
@@ -601,7 +594,6 @@ const Calendar = new Lang.Class({
beginDate.setHours(12);
this._calendarBegin = new Date(beginDate);
this._markedAsToday = now;
let year = beginDate.getYear();
@@ -669,7 +661,7 @@ const Calendar = new Lang.Class({
this._buttons.push(button);
if (this._useWeekdate && iter.getDay() == 4) {
let label = new St.Label({ text: iter.toLocaleFormat('%V'),
let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(),
style_class: 'calendar-day-base calendar-week-number'});
layout.attach(label, rtl ? 7 : 0, row, 1, 1);
}
@@ -693,7 +685,7 @@ const Calendar = new Lang.Class({
else
this._monthLabel.text = this._selectedDate.toLocaleFormat(this._headerFormat);
if (!this._calendarBegin || !_sameMonth(this._selectedDate, this._calendarBegin) || !_sameDay(now, this._markedAsToday))
if (!this._calendarBegin || !_sameMonth(this._selectedDate, this._calendarBegin))
this._rebuildCalendar();
this._buttons.forEach(Lang.bind(this, function(button) {
@@ -729,16 +721,12 @@ const EventsList = new Lang.Class({
this._eventSource.connect('changed', Lang.bind(this, this._update));
},
_addEvent: function(event, index, includeDayName, periodBegin, periodEnd) {
_addEvent: function(event, index, includeDayName) {
let dayString;
if (includeDayName) {
if (event.date >= periodBegin)
dayString = _getEventDayAbbreviation(event.date.getDay());
else /* show event end day if it began earlier */
dayString = _getEventDayAbbreviation(event.end.getDay());
} else {
if (includeDayName)
dayString = _getEventDayAbbreviation(event.date.getDay());
else
dayString = '';
}
let dayLabel = new St.Label({ style_class: 'events-day-dayname',
text: dayString,
@@ -751,30 +739,16 @@ const EventsList = new Lang.Class({
let layout = this.actor.layout_manager;
layout.attach(dayLabel, rtl ? 2 : 0, index, 1, 1);
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
let timeString = _formatEventTime(event, clockFormat, periodBegin, periodEnd);
let timeString = _formatEventTime(event, clockFormat);
let timeLabel = new St.Label({ style_class: 'events-day-time',
text: timeString,
y_align: Clutter.ActorAlign.START });
timeLabel.clutter_text.line_wrap = false;
timeLabel.clutter_text.ellipsize = false;
let preEllipsisLabel = new St.Label({ style_class: 'events-day-time-ellipses',
text: ELLIPSIS_CHAR,
y_align: Clutter.ActorAlign.START });
let postEllipsisLabel = new St.Label({ style_class: 'events-day-time-ellipses',
text: ELLIPSIS_CHAR,
y_align: Clutter.ActorAlign.START });
if (event.allDay || event.date >= periodBegin)
preEllipsisLabel.opacity = 0;
if (event.allDay || event.end <= periodEnd)
postEllipsisLabel.opacity = 0;
let timeLabelBoxLayout = new St.BoxLayout();
timeLabelBoxLayout.add(preEllipsisLabel);
timeLabelBoxLayout.add(timeLabel);
timeLabelBoxLayout.add(postEllipsisLabel);
layout.attach(timeLabelBoxLayout, 1, index, 1, 1);
layout.attach(timeLabel, 1, index, 1, 1);
let titleLabel = new St.Label({ style_class: 'events-day-task',
text: event.summary,
@@ -785,8 +759,8 @@ const EventsList = new Lang.Class({
layout.attach(titleLabel, rtl ? 0 : 2, index, 1, 1);
},
_addPeriod: function(header, index, periodBegin, periodEnd, includeDayName, showNothingScheduled) {
let events = this._eventSource.getEvents(periodBegin, periodEnd);
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
let events = this._eventSource.getEvents(begin, end);
if (events.length == 0 && !showNothingScheduled)
return index;
@@ -797,14 +771,15 @@ const EventsList = new Lang.Class({
index++;
for (let n = 0; n < events.length; n++) {
this._addEvent(events[n], index, includeDayName, periodBegin, periodEnd);
this._addEvent(events[n], index, includeDayName);
index++;
}
if (events.length == 0 && showNothingScheduled) {
let now = new Date();
/* Translators: Text to show if there are no events */
let nothingEvent = new CalendarEvent(periodBegin, periodBegin, _("Nothing Scheduled"), true);
this._addEvent(nothingEvent, index, false, periodBegin, periodEnd);
let nothingEvent = new CalendarEvent(now, now, _("Nothing Scheduled"), true);
this._addEvent(nothingEvent, index, false);
index++;
}
@@ -817,17 +792,14 @@ const EventsList = new Lang.Class({
let dayBegin = _getBeginningOfDay(day);
let dayEnd = _getEndOfDay(day);
let dayFormat;
let dayString;
let now = new Date();
if (_sameYear(day, now))
/* Translators: Shown on calendar heading when selected day occurs on current year */
dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
"%A, %B %d"));
dayString = day.toLocaleFormat(C_("calendar heading", "%A, %B %d"));
else
/* Translators: Shown on calendar heading when selected day occurs on different year */
dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
"%A, %B %d, %Y"));
let dayString = day.toLocaleFormat(dayFormat);
dayString = day.toLocaleFormat(C_("calendar heading", "%A, %B %d, %Y"));
this._addPeriod(dayString, 0, dayBegin, dayEnd, false, true);
},

View File

@@ -84,7 +84,6 @@ const KeyringDialog = new Lang.Class({
let table = new St.Widget({ style_class: 'keyring-dialog-control-table',
layout_manager: layout });
layout.hookup_style(table);
let rtl = table.get_text_direction() == Clutter.TextDirection.RTL;
let row = 0;
if (this.prompt.password_visible) {
@@ -93,6 +92,7 @@ const KeyringDialog = new Lang.Class({
y_align: Clutter.ActorAlign.CENTER });
label.set_text(_("Password:"));
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
layout.attach(label, 0, row, 1, 1);
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: '',
can_focus: true,
@@ -100,14 +100,7 @@ const KeyringDialog = new Lang.Class({
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate));
if (rtl) {
layout.attach(this._passwordEntry, 0, row, 1, 1);
layout.attach(label, 1, row, 1, 1);
} else {
layout.attach(label, 0, row, 1, 1);
layout.attach(this._passwordEntry, 1, row, 1, 1);
}
layout.attach(this._passwordEntry, 1, row, 1, 1);
row++;
} else {
this._passwordEntry = null;
@@ -118,6 +111,7 @@ const KeyringDialog = new Lang.Class({
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER }));
label.set_text(_("Type again:"));
layout.attach(label, 0, row, 1, 1);
this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: '',
can_focus: true,
@@ -125,13 +119,7 @@ const KeyringDialog = new Lang.Class({
this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true });
this._confirmEntry.clutter_text.connect('activate', Lang.bind(this, this._onConfirmActivate));
if (rtl) {
layout.attach(this._confirmEntry, 0, row, 1, 1);
layout.attach(label, 1, row, 1, 1);
} else {
layout.attach(label, 0, row, 1, 1);
layout.attach(this._confirmEntry, 1, row, 1, 1);
}
layout.attach(this._confirmEntry, 1, row, 1, 1);
row++;
} else {
this._confirmEntry = null;
@@ -144,7 +132,7 @@ const KeyringDialog = new Lang.Class({
let choice = new CheckBox.CheckBox();
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('choice-chosen', choice.actor, 'checked', GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL);
layout.attach(choice.actor, rtl ? 0 : 1, row, 1, 1);
layout.attach(choice.actor, 1, row, 1, 1);
row++;
}
@@ -152,7 +140,7 @@ const KeyringDialog = new Lang.Class({
x_align: Clutter.ActorAlign.START });
warning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
warning.clutter_text.line_wrap = true;
layout.attach(warning, rtl ? 0 : 1, row, 1, 1);
layout.attach(warning, 1, row, 1, 1);
this.prompt.bind_property('warning-visible', warning, 'visible', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('warning', warning, 'text', GObject.BindingFlags.SYNC_CREATE);

View File

@@ -380,12 +380,6 @@ const VPNRequestHandler = new Lang.Class({
argv.push('-i');
if (flags & NMClient.SecretAgentGetSecretsFlags.REQUEST_NEW)
argv.push('-r');
if (authHelper.supportsHints) {
for (let i = 0; i < hints.length; i++) {
argv.push('-t');
argv.push(hints[i]);
}
}
this._newStylePlugin = authHelper.externalUIMode;
@@ -604,9 +598,7 @@ const NetworkAgent = new Lang.Class({
Name: 'NetworkAgent',
_init: function() {
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent',
capabilities: NMClient.SecretAgentCapabilities.VPN_HINTS
});
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent' });
this._dialogs = { };
this._vpnRequests = { };
@@ -706,23 +698,16 @@ const NetworkAgent = new Lang.Class({
let service = keyfile.get_string('VPN Connection', 'service');
let binary = keyfile.get_string('GNOME', 'auth-dialog');
let externalUIMode = false;
let hints = false;
try {
externalUIMode = keyfile.get_boolean('GNOME', 'supports-external-ui-mode');
} catch(e) { } // ignore errors if key does not exist
try {
hints = keyfile.get_boolean('GNOME', 'supports-hints');
} catch(e) { } // ignore errors if key does not exist
let path = binary;
if (!GLib.path_is_absolute(path)) {
path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
}
if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE))
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode };
else
throw new Error('VPN plugin at %s is not executable'.format(path));
} catch(e) {

View File

@@ -36,8 +36,6 @@ const NotificationDirection = {
RECEIVED: 'chat-received'
};
const N_ = function(s) { return s; };
function makeMessageFromTpMessage(tpMessage, direction) {
let [text, flags] = tpMessage.to_text();
@@ -952,70 +950,70 @@ const ChatNotification = new Lang.Class({
// Show only the time if date is on today
if(daysAgo < 1){
/* Translators: Time in 24h format */
format = N_("%H\u2236%M");
format = _("%H\u2236%M");
}
// Show the word "Yesterday" and time if date is on yesterday
else if(daysAgo <2){
/* Translators: this is the word "Yesterday" followed by a
time string in 24h format. i.e. "Yesterday, 14:30" */
// xgettext:no-c-format
format = N_("Yesterday, %H\u2236%M");
format = _("Yesterday, %H\u2236%M");
}
// Show a week day and time if date is in the last week
else if (daysAgo < 7) {
/* Translators: this is the week day name followed by a time
string in 24h format. i.e. "Monday, 14:30" */
// xgettext:no-c-format
format = N_("%A, %H\u2236%M");
format = _("%A, %H\u2236%M");
} else if (date.getYear() == now.getYear()) {
/* Translators: this is the month name and day number
followed by a time string in 24h format.
i.e. "May 25, 14:30" */
// xgettext:no-c-format
format = N_("%B %d, %H\u2236%M");
format = _("%B %d, %H\u2236%M");
} else {
/* Translators: this is the month name, day number, year
number followed by a time string in 24h format.
i.e. "May 25 2012, 14:30" */
// xgettext:no-c-format
format = N_("%B %d %Y, %H\u2236%M");
format = _("%B %d %Y, %H\u2236%M");
}
} else {
// Show only the time if date is on today
if(daysAgo < 1){
/* Translators: Time in 24h format */
format = N_("%l\u2236%M %p");
format = _("%l\u2236%M %p");
}
// Show the word "Yesterday" and time if date is on yesterday
else if(daysAgo <2){
/* Translators: this is the word "Yesterday" followed by a
time string in 12h format. i.e. "Yesterday, 2:30 pm" */
// xgettext:no-c-format
format = N_("Yesterday, %l\u2236%M %p");
format = _("Yesterday, %l\u2236%M %p");
}
// Show a week day and time if date is in the last week
else if (daysAgo < 7) {
/* Translators: this is the week day name followed by a time
string in 12h format. i.e. "Monday, 2:30 pm" */
// xgettext:no-c-format
format = N_("%A, %l\u2236%M %p");
format = _("%A, %l\u2236%M %p");
} else if (date.getYear() == now.getYear()) {
/* Translators: this is the month name and day number
followed by a time string in 12h format.
i.e. "May 25, 2:30 pm" */
// xgettext:no-c-format
format = N_("%B %d, %l\u2236%M %p");
format = _("%B %d, %l\u2236%M %p");
} else {
/* Translators: this is the month name, day number, year
number followed by a time string in 12h format.
i.e. "May 25 2012, 2:30 pm"*/
// xgettext:no-c-format
format = N_("%B %d %Y, %l\u2236%M %p");
format = _("%B %d %Y, %l\u2236%M %p");
}
}
return date.toLocaleFormat(Shell.util_translate_time_string(format));
return date.toLocaleFormat(format);
},
appendTimestamp: function() {
@@ -1266,8 +1264,9 @@ const SubscriptionRequestNotification = new Lang.Class({
let file = contact.get_avatar_file();
if (file) {
let uri = file.get_uri();
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
iconBox.child = textureCache.load_file_async(file, iconBox._size, iconBox._size, scaleFactor);
iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size, scaleFactor);
}
else {
iconBox.child = new St.Icon({ icon_name: 'avatar-default',

View File

@@ -100,7 +100,7 @@ const CtrlAltTabManager = new Lang.Class({
if (app)
icon = app.create_icon_texture(POPUP_APPICON_SIZE);
else
icon = textureCache.bind_cairo_surface_property(windows[i], 'icon');
icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
}
items.push({ name: windows[i].title,
@@ -140,10 +140,20 @@ const CtrlAltTabPopup = new Lang.Class({
Name: 'CtrlAltTabPopup',
Extends: SwitcherPopup.SwitcherPopup,
_init: function(items) {
this.parent(items);
_createSwitcher: function() {
this._switcherList = new CtrlAltTabSwitcher(this._items);
return true;
},
_initialSelection: function(backward, binding) {
if (binding == 'switch-panels') {
if (backward)
this._selectedIndex = this._items.length - 1;
} else if (binding == 'switch-panels-backward') {
if (!backward)
this._selectedIndex = this._items.length - 1;
}
this._select(this._selectedIndex);
},
_keyPressHandler: function(keysym, action) {

View File

@@ -3,7 +3,6 @@
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const GnomeDesktop = imports.gi.GnomeDesktop;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Cairo = imports.cairo;
@@ -125,19 +124,14 @@ const DateMenuButton = new Lang.Class({
if (isOpen) {
let now = new Date();
this._calendar.setDate(now);
/* 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").
*/
let dateFormat = Shell.util_translate_time_string (N_("%A %B %e, %Y"));
this._date.set_label(now.toLocaleFormat(dateFormat));
}
}));
// Done with hbox for calendar and event list
this._clock = new GnomeDesktop.WallClock();
this._clock.bind_property('clock', this._clockDisplay, 'text', GObject.BindingFlags.SYNC_CREATE);
this._clock.connect('notify::clock', Lang.bind(this, this._updateClockAndDate));
this._updateClockAndDate();
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated();
@@ -147,7 +141,7 @@ const DateMenuButton = new Lang.Class({
let now = new Date();
return now.getYear() == date.getYear() &&
now.getMonth() == date.getMonth() &&
now.getDate() == date.getDate();
now.getDay() == date.getDay();
},
_appInstalledChanged: function() {
@@ -173,10 +167,6 @@ const DateMenuButton = new Lang.Class({
}
},
_getEventSource: function() {
return new Calendar.DBusEventSource();
},
_setEventSource: function(eventSource) {
if (this._eventSource)
this._eventSource.destroy();
@@ -194,7 +184,7 @@ const DateMenuButton = new Lang.Class({
let eventSource;
let showEvents = Main.sessionMode.showCalendarEvents;
if (showEvents) {
eventSource = this._getEventSource();
eventSource = new Calendar.DBusEventSource();
} else {
eventSource = new Calendar.EmptyEventSource();
}
@@ -206,6 +196,16 @@ const DateMenuButton = new Lang.Class({
this._dateAndTimeSeparator.actor.visible = Main.sessionMode.allowSettings;
},
_updateClockAndDate: function() {
this._clockDisplay.set_text(this._clock.clock);
/* 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").
*/
let dateFormat = _("%A %B %e, %Y");
let displayDate = new Date();
this._date.set_label(displayDate.toLocaleFormat(dateFormat));
},
_getCalendarApp: function() {
if (this._calendarApp !== undefined)
return this._calendarApp;

View File

@@ -6,8 +6,6 @@ const Meta = imports.gi.Meta;
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
const Main = imports.ui.main;
const EDGE_THRESHOLD = 20;
const DRAG_DISTANCE = 80;
@@ -15,10 +13,9 @@ const EdgeDragAction = new Lang.Class({
Name: 'EdgeDragAction',
Extends: Clutter.GestureAction,
_init : function(side, allowedModes) {
_init : function(side) {
this.parent();
this._side = side;
this._allowedModes = allowedModes;
this.set_n_touch_points(1);
global.display.connect('grab-op-begin', Lang.bind(this, function() {
@@ -37,9 +34,6 @@ const EdgeDragAction = new Lang.Class({
if (this.get_n_current_points() == 0)
return false;
if (!(this._allowedModes & Main.actionMode))
return false;
let [x, y] = this.get_press_coords(0);
let monitorRect = this._getMonitorRect(x, y);

View File

@@ -38,6 +38,8 @@ const UserWidget = imports.ui.userWidget;
let _endSessionDialog = null;
const TRIGGER_OFFLINE_UPDATE = '/usr/libexec/pk-trigger-offline-update';
const _ITEM_ICON_SIZE = 48;
const _DIALOG_ICON_SIZE = 48;
@@ -132,18 +134,11 @@ const restartInstallDialogContent = {
showOtherSessions: true,
};
const DialogType = {
LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
UPDATE_RESTART: 3
};
const DialogContent = {
0 /* DialogType.LOGOUT */: logoutDialogContent,
1 /* DialogType.SHUTDOWN */: shutdownDialogContent,
2 /* DialogType.RESTART */: restartDialogContent,
3 /* DialogType.UPDATE_RESTART */: restartInstallDialogContent
0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */: logoutDialogContent,
1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */: shutdownDialogContent,
2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */: restartDialogContent,
3: restartInstallDialogContent
};
const MAX_USERS_IN_SESSION_DIALOG = 5;
@@ -160,19 +155,6 @@ const LogindSessionIface = '<node> \
const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface);
const PkOfflineIface = '<node> \
<interface name="org.freedesktop.PackageKit.Offline"> \
<property name="UpdatePrepared" type="b" access="read"/> \
<property name="TriggerAction" type="s" access="read"/> \
<method name="Trigger"> \
<arg type="s" name="action" direction="in"/> \
</method> \
<method name="Cancel"/> \
</interface> \
</node>';
const PkOfflineProxy = Gio.DBusProxy.makeProxyWrapper(PkOfflineIface);
const UPowerIface = '<node> \
<interface name="org.freedesktop.UPower"> \
<property name="OnBattery" type="b" access="read"/> \
@@ -263,14 +245,9 @@ const EndSessionDialog = new Lang.Class({
this._loginManager = LoginManager.getLoginManager();
this._userManager = AccountsService.UserManager.get_default();
this._user = this._userManager.get_user(GLib.get_user_name());
this._updatesFile = Gio.File.new_for_path('/system-update');
this._preparedUpdateFile = Gio.File.new_for_path('/var/lib/PackageKit/prepared-update');
this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
'org.freedesktop.PackageKit',
'/org/freedesktop/PackageKit',
Lang.bind(this, function(proxy, error) {
if (error)
log(error.message);
}));
this._powerProxy = new UPowerProxy(Gio.DBus.system,
'org.freedesktop.UPower',
'/org/freedesktop/UPower',
@@ -522,29 +499,31 @@ const EndSessionDialog = new Lang.Class({
},
_triggerOfflineUpdateReboot: function(callback) {
this._pkOfflineProxy.TriggerRemote('reboot',
function (result, error) {
if (error)
log(error.message);
callback();
});
this._pkexecSpawn([TRIGGER_OFFLINE_UPDATE, 'reboot'], callback);
},
_triggerOfflineUpdateShutdown: function(callback) {
this._pkOfflineProxy.TriggerRemote('power-off',
function (result, error) {
if (error)
log(error.message);
callback();
});
this._pkexecSpawn([TRIGGER_OFFLINE_UPDATE, 'power-off'], callback);
},
_triggerOfflineUpdateCancel: function(callback) {
this._pkOfflineProxy.CancelRemote(function (result, error) {
if (error)
log(error.message);
this._pkexecSpawn([TRIGGER_OFFLINE_UPDATE, '--cancel'], callback);
},
_pkexecSpawn: function(argv, callback) {
let ret, pid;
try {
[ret, pid] = GLib.spawn_async(null, ['pkexec'].concat(argv), null,
GLib.SpawnFlags.DO_NOT_REAP_CHILD | GLib.SpawnFlags.SEARCH_PATH,
null);
} catch (e) {
log('Error spawning "pkexec %s": %s'.format(argv.join(' '), e.toString()));
callback();
return;
}
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function(pid, status) {
GLib.spawn_close_pid(pid);
callback();
});
@@ -698,9 +677,8 @@ const EndSessionDialog = new Lang.Class({
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._type = type;
if (this._type == DialogType.RESTART &&
this._pkOfflineProxy.TriggerAction == 'reboot')
this._type = DialogType.UPDATE_RESTART;
if (this._type == 2 && this._updatesFile.query_exists(null))
this._type = 3;
this._applications = [];
this._applicationList.destroy_all_children();
@@ -727,19 +705,19 @@ const EndSessionDialog = new Lang.Class({
if (dialogContent.showOtherSessions)
this._loadSessions();
let updateAlreadyTriggered = this._pkOfflineProxy.TriggerAction == 'power-off' || this._pkOfflineProxy.TriggerAction == 'reboot';
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
let preparedUpdate = this._preparedUpdateFile.query_exists(null);
let updateAlreadyTriggered = this._updatesFile.query_exists(null);
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText);
this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed);
this._checkBox.actor.checked = (updatePrepared && updateAlreadyTriggered);
this._checkBox.actor.visible = (dialogContent.checkBoxText && preparedUpdate && updatesAllowed);
this._checkBox.actor.checked = (preparedUpdate && updateAlreadyTriggered);
// We show the warning either together with the checkbox, or when
// updates have already been triggered, but the user doesn't have
// enough permissions to cancel them.
this._batteryWarning.visible = (dialogContent.showBatteryWarning &&
(this._checkBox.actor.visible || updatePrepared && updateAlreadyTriggered && !updatesAllowed));
(this._checkBox.actor.visible || preparedUpdate && updateAlreadyTriggered && !updatesAllowed));
this._updateButtons();

View File

@@ -77,7 +77,6 @@ function init() {
window._ = Gettext.gettext;
window.C_ = Gettext.pgettext;
window.ngettext = Gettext.ngettext;
window.N_ = function(s) { return s; };
// Miscellaneous monkeypatching
_patchContainerClass(St.BoxLayout);

View File

@@ -203,16 +203,14 @@ const InstallExtensionDialog = new Lang.Class({
let message = _("Download and install “%s” from extensions.gnome.org?").format(info.name);
let box = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
vertical: false });
let box = new St.BoxLayout();
this.contentLayout.add(box);
let gicon = new Gio.FileIcon({ file: Gio.File.new_for_uri(REPOSITORY_URL_BASE + info.icon) })
let icon = new St.Icon({ gicon: gicon });
box.add(icon);
let label = new St.Label({ style_class: 'prompt-dialog-headline',
text: message });
let label = new St.Label({ text: message });
box.add(label);
},

View File

@@ -74,7 +74,7 @@ function disableExtension(uuid) {
if (extension.stylesheet) {
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
theme.unload_stylesheet(extension.stylesheet);
theme.unload_stylesheet(extension.stylesheet.get_path());
}
try {
@@ -118,7 +118,7 @@ function enableExtension(uuid) {
let stylesheetFile = extension.dir.get_child(stylesheetNames[i]);
if (stylesheetFile.query_exists(null)) {
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
theme.load_stylesheet(stylesheetFile);
theme.load_stylesheet(stylesheetFile.get_path());
extension.stylesheet = stylesheetFile;
break;
}
@@ -271,17 +271,10 @@ function onEnabledExtensionsChanged() {
}
function _onVersionValidationChanged() {
// we want to reload all extensions, but only enable
// extensions when allowed by the sessionMode, so
// temporarily disable them all
enabledExtensions = [];
for (let uuid in ExtensionUtils.extensions)
reloadExtension(ExtensionUtils.extensions[uuid]);
enabledExtensions = getEnabledExtensions();
if (Main.sessionMode.allowExtensions) {
enabledExtensions.forEach(function(uuid) {
enableExtension(uuid);
if (ExtensionUtils.extensions[uuid])
reloadExtension(ExtensionUtils.extensions[uuid]);
});
}
}

View File

@@ -20,7 +20,6 @@ const EXTRA_SPACE_ANIMATION_TIME = 0.25;
const ANIMATION_TIME_IN = 0.350;
const ANIMATION_TIME_OUT = 1/2 * ANIMATION_TIME_IN;
const ANIMATION_MAX_DELAY_FOR_ITEM = 2/3 * ANIMATION_TIME_IN;
const ANIMATION_BASE_DELAY_FOR_ITEM = 1/4 * ANIMATION_MAX_DELAY_FOR_ITEM;
const ANIMATION_MAX_DELAY_OUT_FOR_ITEM = 2/3 * ANIMATION_TIME_OUT;
const ANIMATION_FADE_IN_TIME_FOR_ITEM = 1/4 * ANIMATION_TIME_IN;
@@ -430,30 +429,34 @@ const IconGrid = new Lang.Class({
return;
}
// For few items the animation can be slow, so use a smaller
// delay when there are less than 4 items
// (ANIMATION_BASE_DELAY_FOR_ITEM = 1/4 *
// ANIMATION_MAX_DELAY_FOR_ITEM)
let maxDelay = Math.min(ANIMATION_BASE_DELAY_FOR_ITEM * actors.length,
ANIMATION_MAX_DELAY_FOR_ITEM);
for (let index = 0; index < actors.length; index++) {
let actor = actors[index];
actor.opacity = 0;
actor.reactive = false;
actor.set_scale(0, 0);
actor.set_pivot_point(0.5, 0.5);
let delay = index / actors.length * maxDelay;
let delay = index / actors.length * ANIMATION_MAX_DELAY_FOR_ITEM;
let [originalX, originalY] = actor.get_transformed_position();
let [originalWidth, originalHeight,,] = this._getAllocatedChildSizeAndSpacing(actor);
let actorClone = new Clutter.Clone({ source: actor });
Main.uiGroup.add_actor(actorClone);
actorClone.set_position(originalX, originalY);
actorClone.set_scale(0, 0);
actorClone.set_pivot_point(0.5, 0.5);
actorClone.set_size(originalWidth, originalHeight);
let bounceUpTime = ANIMATION_TIME_IN / 4;
// Defeat onComplete anonymous function closure
let isLastItem = index == actors.length - 1;
Tweener.addTween(actor,
Tweener.addTween(actorClone,
{ time: bounceUpTime,
transition: 'easeInOutQuad',
delay: delay,
scale_x: ANIMATION_BOUNCE_ICON_SCALE,
scale_y: ANIMATION_BOUNCE_ICON_SCALE,
onComplete: Lang.bind(this, function() {
Tweener.addTween(actor,
Tweener.addTween(actorClone,
{ time: ANIMATION_TIME_IN - bounceUpTime,
transition: 'easeInOutQuad',
scale_x: 1,
@@ -461,7 +464,10 @@ const IconGrid = new Lang.Class({
onComplete: Lang.bind(this, function() {
if (isLastItem)
this._animationDone();
actor.opacity = 255;
actor.reactive = true;
actorClone.destroy();
})
});
})
@@ -515,10 +521,11 @@ const IconGrid = new Lang.Class({
let scaleY = sourceScaledHeight / height;
let [adjustedSourcePositionX, adjustedSourcePositionY] = [sourceCenterX - sourceScaledWidth / 2, sourceCenterY - sourceScaledHeight / 2];
// Defeat onComplete anonymous function closure
let isLastItem = index == actors.length - 1;
let movementParams, fadeParams;
if (animationDirection == AnimationDirection.IN) {
let isLastItem = actor._distance == minDist;
actorClone.opacity = 0;
actorClone.set_scale(scaleX, scaleY);
@@ -546,8 +553,6 @@ const IconGrid = new Lang.Class({
delay: delay,
opacity: 255 };
} else {
let isLastItem = actor._distance == maxDist;
let [startX, startY] = actor._transformedPosition;
actorClone.set_position(startX, startY);
@@ -564,7 +569,6 @@ const IconGrid = new Lang.Class({
this._animationDone();
this._restoreItemsOpacity();
}
actor.reactive = true;
actorClone.destroy();
})};
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,

View File

@@ -75,7 +75,6 @@ const Key = new Lang.Class({
_init : function(key) {
this._key = key;
this.actor = this._makeKey(key, GLib.markup_escape_text(key.label, -1));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._extended_keys = this._key.get_extended_keys();
this._extended_keyboard = null;
@@ -98,13 +97,6 @@ const Key = new Lang.Class({
}
},
_onDestroy: function() {
if (this._boxPointer) {
this._boxPointer.actor.destroy();
this._boxPointer = null;
}
},
_makeKey: function (key, label) {
let button = new St.Button ({ label: label,
style_class: 'keyboard-key' });
@@ -187,7 +179,14 @@ const Keyboard = new Lang.Class({
this._watchNameId = Gio.bus_watch_name(Gio.BusType.SESSION, CURSOR_BUS_NAME, 0,
Lang.bind(this, this._sync),
Lang.bind(this, this._sync));
this._daemonProxy = null;
this._daemonProxy = new CaribouDaemonProxy(Gio.DBus.session, CARIBOU_BUS_NAME,
CARIBOU_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
}));
this._cursorProxy = new CursorManagerProxy(Gio.DBus.session, CURSOR_BUS_NAME,
CURSOR_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
@@ -249,28 +248,15 @@ const Keyboard = new Lang.Class({
this.actor = null;
this._destroySource();
if (this._daemonProxy) {
this._daemonProxy.QuitRemote(function (result, error) {
if (error) {
log(error.message);
return;
}
});
this._daemonProxy = null;
}
this._daemonProxy.QuitRemote(function (result, error) {
if (error) {
log(error.message);
return;
}
});
},
_setupKeyboard: function() {
if (!this._daemonProxy) {
this._daemonProxy = new CaribouDaemonProxy(Gio.DBus.session, CARIBOU_BUS_NAME,
CARIBOU_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
}));
}
this._daemonProxy.RunRemote(function (result, error) {
if (error) {
log(error.message);
@@ -616,7 +602,7 @@ const Keyboard = new Lang.Class({
_moveTemporarily: function () {
let currentWindow = global.screen.get_display().focus_window;
let rect = currentWindow.get_frame_rect();
let rect = currentWindow.get_outer_rect();
let newX = rect.x;
let newY = 3 * this.actor.height / 2;

View File

@@ -20,6 +20,7 @@ const Tweener = imports.ui.tweener;
const STARTUP_ANIMATION_TIME = 0.5;
const KEYBOARD_ANIMATION_TIME = 0.15;
const BACKGROUND_FADE_ANIMATION_TIME = 1.0;
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
// The message tray takes this much pressure
// in the pressure barrier at once to release it.
@@ -159,10 +160,10 @@ const LayoutManager = new Lang.Class({
this._isPopupWindowVisible = false;
this._startingUp = true;
// We don't want to paint the stage background color because either
// the SystemBackground we create or the MetaBackgroundActor inside
// global.window_group covers the entirety of the screen.
global.stage.no_clear_hint = true;
// Normally, the stage is always covered so Clutter doesn't need to clear
// it; however it becomes visible during the startup animation
// See the comment below for a longer explanation
global.stage.background_color = DEFAULT_BACKGROUND_COLOR;
// Set up stage hierarchy to group all UI actors under one container.
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
@@ -229,10 +230,6 @@ const LayoutManager = new Lang.Class({
global.stage.remove_actor(global.top_window_group);
this.uiGroup.add_actor(global.top_window_group);
let feedbackGroup = Meta.get_feedback_group_for_screen(global.screen);
global.stage.remove_actor(feedbackGroup);
this.uiGroup.add_actor(feedbackGroup);
this._backgroundGroup = new Meta.BackgroundGroup();
global.window_group.add_child(this._backgroundGroup);
this._backgroundGroup.lower_bottom();
@@ -262,6 +259,7 @@ const LayoutManager = new Lang.Class({
this._inOverview = true;
this._updateVisibility();
this._updateRegions();
},
hideOverview: function() {
@@ -269,6 +267,7 @@ const LayoutManager = new Lang.Class({
this._inOverview = false;
this._updateVisibility();
this._queueUpdateRegions();
},
_sessionUpdated: function() {
@@ -422,7 +421,10 @@ const LayoutManager = new Lang.Class({
this.panelBox.set_position(this.primaryMonitor.x, this.primaryMonitor.y);
this.panelBox.set_size(this.primaryMonitor.width, -1);
this.keyboardIndex = this.primaryIndex;
if (this.keyboardIndex < 0)
this.keyboardIndex = this.primaryIndex;
else
this._updateKeyboardBox();
this.trayBox.set_position(this.bottomMonitor.x,
this.bottomMonitor.y + this.bottomMonitor.height);
@@ -458,8 +460,8 @@ const LayoutManager = new Lang.Class({
_setupTrayPressure: function() {
this._trayPressure = new PressureBarrier(MESSAGE_TRAY_PRESSURE_THRESHOLD,
MESSAGE_TRAY_PRESSURE_TIMEOUT,
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW);
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this._trayPressure.setEventFilter(this._trayBarrierEventFilter);
this._trayPressure.connect('trigger', function(barrier) {
if (Main.layoutManager.bottomMonitor.inFullscreen)
@@ -587,6 +589,10 @@ const LayoutManager = new Lang.Class({
//
// When starting a normal user session, we want to grow it out of the middle
// of the screen.
//
// Usually, we don't want to paint the stage background color because the
// MetaBackgroundActor inside global.window_group covers the entirety of the
// screen. So, we set no_clear_hint at the end of the animation.
_prepareStartupAnimation: function() {
// During the initial transition, add a simple actor to block all events,
@@ -667,6 +673,10 @@ const LayoutManager = new Lang.Class({
},
_startupAnimationComplete: function() {
// At this point, the UI group is covering everything, so
// we no longer need to clear the stage
global.stage.no_clear_hint = true;
this._coverPane.destroy();
this._coverPane = null;
@@ -905,6 +915,9 @@ const LayoutManager = new Lang.Class({
},
_queueUpdateRegions: function() {
if (Main.sessionMode.isGreeter)
return;
if (this._startingUp)
return;
@@ -938,16 +951,13 @@ const LayoutManager = new Lang.Class({
},
_updateRegions: function() {
let rects = [], struts = [], i;
if (this._updateRegionIdle) {
Meta.later_remove(this._updateRegionIdle);
delete this._updateRegionIdle;
}
// No need to update when we have a modal.
if (Main.modalCount > 0)
return GLib.SOURCE_REMOVE;
let rects = [], struts = [], i;
let isPopupMenuVisible = global.top_window_group.get_children().some(isPopupMetaWindow);
let wantsInputRegion = !isPopupMenuVisible;
@@ -1033,13 +1043,7 @@ const LayoutManager = new Lang.Class({
}
return GLib.SOURCE_REMOVE;
},
modalEnded: function() {
// We don't update the stage input region while in a modal,
// so queue an update now.
this._queueUpdateRegions();
},
}
});
Signals.addSignalMethods(LayoutManager.prototype);
@@ -1067,8 +1071,8 @@ const HotCorner = new Lang.Class({
this._pressureBarrier = new PressureBarrier(HOT_CORNER_PRESSURE_THRESHOLD,
HOT_CORNER_PRESSURE_TIMEOUT,
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW);
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this._pressureBarrier.connect('trigger', Lang.bind(this, this._toggleOverview));
// Cache the three ripples instead of dynamically creating and destroying them.
@@ -1245,10 +1249,10 @@ const HotCorner = new Lang.Class({
const PressureBarrier = new Lang.Class({
Name: 'PressureBarrier',
_init: function(threshold, timeout, actionMode) {
_init: function(threshold, timeout, keybindingMode) {
this._threshold = threshold;
this._timeout = timeout;
this._actionMode = actionMode;
this._keybindingMode = keybindingMode;
this._barriers = [];
this._eventFilter = null;
@@ -1351,7 +1355,7 @@ const PressureBarrier = new Lang.Class({
return;
// Throw out all events not in the proper keybinding mode
if (!(this._actionMode & Main.actionMode))
if (!(this._keybindingMode & Main.keybindingMode))
return;
let slide = this._getDistanceAlongBarrier(barrier, event);

View File

@@ -1086,7 +1086,7 @@ const LookingGlass = new Lang.Class({
if (this._open)
return;
if (!Main.pushModal(this._entry, { actionMode: Shell.ActionMode.LOOKING_GLASS }))
if (!Main.pushModal(this._entry, { keybindingMode: Shell.KeyBindingMode.LOOKING_GLASS }))
return;
this._notebook.selectIndex(0);

View File

@@ -1198,7 +1198,12 @@ const ZoomRegion = new Lang.Class({
// Add a background for when the magnified uiGroup is scrolled
// out of view (don't want to see desktop showing through).
this._background = (new Background.SystemBackground()).actor;
this._background = new Clutter.Actor({ background_color: Main.DEFAULT_BACKGROUND_COLOR,
layout_manager: new Clutter.BinLayout(),
width: global.screen_width,
height: global.screen_height });
let noiseTexture = (new Background.SystemBackground()).actor;
this._background.add_actor(noiseTexture);
mainGroup.add_actor(this._background);
// Clone the group that contains all of UI on the screen. This is the

View File

@@ -4,7 +4,6 @@ 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 Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
@@ -41,6 +40,8 @@ const Magnifier = imports.ui.magnifier;
const XdndHandler = imports.ui.xdndHandler;
const Util = imports.misc.util;
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const STICKY_KEYS_ENABLE = 'stickykeys-enable';
const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
@@ -63,7 +64,7 @@ let shellMountOpDBusService = null;
let screenSaverDBus = null;
let screencastService = null;
let modalCount = 0;
let actionMode = Shell.ActionMode.NONE;
let keybindingMode = Shell.KeyBindingMode.NONE;
let modalActorFocusStack = [];
let uiGroup = null;
let magnifier = null;
@@ -76,19 +77,18 @@ let _cssStylesheet = null;
let _a11ySettings = null;
function _sessionUpdated() {
if (sessionMode.isPrimary)
_loadDefaultStylesheet();
_loadDefaultStylesheet();
wm.setCustomKeybindingHandler('panel-main-menu',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
sessionMode.hasOverview ? Lang.bind(overview, overview.toggle) : null);
wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW);
wm.allowKeybinding('overlay-key', Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
wm.setCustomKeybindingHandler('panel-run-dialog',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
sessionMode.hasRunDialog ? openRunDialog : null);
if (!sessionMode.hasRunDialog) {
@@ -111,8 +111,6 @@ function start() {
sessionMode = new SessionMode.SessionMode();
sessionMode.connect('updated', _sessionUpdated);
Gtk.Settings.get_default().connect('notify::gtk-theme-name',
_loadDefaultStylesheet);
_initializeUI();
shellDBusService = new ShellDBus.GnomeShell();
@@ -133,9 +131,6 @@ function _initializeUI() {
Shell.WindowTracker.get_default();
Shell.AppUsage.get_default();
let resource = Gio.Resource.load(global.datadir + '/gnome-shell-theme.gresource');
resource._register();
_loadDefaultStylesheet();
// Setup the stage hierarchy early
@@ -209,58 +204,32 @@ function _initializeUI() {
}
layoutManager.connect('startup-complete', function() {
if (actionMode == Shell.ActionMode.NONE) {
actionMode = Shell.ActionMode.NORMAL;
}
if (screenShield) {
screenShield.lockIfWasLocked();
}
if (LoginManager.haveSystemd() &&
sessionMode.currentMode != 'gdm' &&
sessionMode.currentMode != 'initial-setup') {
// Do not import globally to not depend
// on systemd on non-systemd systems.
let GSystem = imports.gi.GSystem;
GSystem.log_structured_print('GNOME Shell started at ' + _startDate,
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
} else {
log('GNOME Shell started at ' + _startDate);
}
});
}
function _getStylesheet(name) {
let stylesheet;
stylesheet = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/' + name);
if (stylesheet.query_exists(null))
return stylesheet;
stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name);
if (stylesheet.query_exists(null))
return stylesheet;
return null;
}
function _getDefaultStylesheet() {
let stylesheet = null;
let name = sessionMode.stylesheetName;
// Look for a high-contrast variant first when using GTK+'s HighContrast
// theme
if (Gtk.Settings.get_default().gtk_theme_name == 'HighContrast')
stylesheet = _getStylesheet(name.replace('.css', '-high-contrast.css'));
if (stylesheet == null)
stylesheet = _getStylesheet(sessionMode.stylesheetName);
return stylesheet;
if (keybindingMode == Shell.KeyBindingMode.NONE) {
keybindingMode = Shell.KeyBindingMode.NORMAL;
}
if (screenShield) {
screenShield.lockIfWasLocked();
}
if (LoginManager.haveSystemd() &&
sessionMode.currentMode != 'gdm' &&
sessionMode.currentMode != 'initial-setup') {
// Do not import globally to not depend
// on systemd on non-systemd systems.
let GSystem = imports.gi.GSystem;
GSystem.log_structured_print('GNOME Shell started at ' + _startDate,
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
} else {
log('GNOME Shell started at ' + _startDate);
}
});
}
function _loadDefaultStylesheet() {
let stylesheet = _getDefaultStylesheet();
if (_defaultCssStylesheet && _defaultCssStylesheet.equal(stylesheet))
if (!sessionMode.isPrimary)
return;
let stylesheet = global.datadir + '/theme/' + sessionMode.stylesheetName;
if (_defaultCssStylesheet == stylesheet)
return;
_defaultCssStylesheet = stylesheet;
@@ -272,7 +241,7 @@ function _loadDefaultStylesheet() {
*
* Get the theme CSS file that the shell will load
*
* Returns: A #GFile that contains the theme CSS,
* Returns: A file path that contains the theme CSS,
* null if using the default
*/
function getThemeStylesheet() {
@@ -287,7 +256,7 @@ function getThemeStylesheet() {
* Set the theme CSS file that the shell will load
*/
function setThemeStylesheet(cssStylesheet) {
_cssStylesheet = cssStylesheet ? Gio.File.new_for_path(cssStylesheet) : null;
_cssStylesheet = cssStylesheet;
}
/**
@@ -372,7 +341,7 @@ function _findModal(actor) {
* - options: Meta.ModalOptions flags to indicate that the pointer is
* already grabbed
*
* - actionMode: used to set the current Shell.ActionMode to filter
* - keybindingMode: used to set the current Shell.KeyBindingMode to filter
* global keybindings; the default of NONE will filter
* out all keybindings
*
@@ -381,7 +350,7 @@ function _findModal(actor) {
function pushModal(actor, params) {
params = Params.parse(params, { timestamp: global.get_current_time(),
options: 0,
actionMode: Shell.ActionMode.NONE });
keybindingMode: Shell.KeyBindingMode.NONE });
if (modalCount == 0) {
if (!global.begin_modal(params.timestamp, params.options)) {
@@ -411,9 +380,9 @@ function pushModal(actor, params) {
destroyId: actorDestroyId,
prevFocus: prevFocus,
prevFocusDestroyId: prevFocusDestroyId,
actionMode: actionMode });
keybindingMode: keybindingMode });
actionMode = params.actionMode;
keybindingMode = params.keybindingMode;
global.stage.set_key_focus(actor);
return true;
}
@@ -439,7 +408,7 @@ function popModal(actor, timestamp) {
if (focusIndex < 0) {
global.stage.set_key_focus(null);
global.end_modal(timestamp);
actionMode = Shell.ActionMode.NORMAL;
keybindingMode = Shell.KeyBindingMode.NORMAL;
throw new Error('incorrect pop');
}
@@ -452,7 +421,7 @@ function popModal(actor, timestamp) {
if (focusIndex == modalActorFocusStack.length - 1) {
if (record.prevFocus)
record.prevFocus.disconnect(record.prevFocusDestroyId);
actionMode = record.actionMode;
keybindingMode = record.keybindingMode;
global.stage.set_key_focus(record.prevFocus);
} else {
// If we have:
@@ -477,7 +446,7 @@ function popModal(actor, timestamp) {
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].actionMode = modalActorFocusStack[i - 1].actionMode;
modalActorFocusStack[i].keybindingMode = modalActorFocusStack[i - 1].keybindingMode;
}
}
modalActorFocusStack.splice(focusIndex, 1);
@@ -485,10 +454,9 @@ function popModal(actor, timestamp) {
if (modalCount > 0)
return;
layoutManager.modalEnded();
global.end_modal(timestamp);
Meta.enable_unredirect_for_screen(global.screen);
actionMode = Shell.ActionMode.NORMAL;
keybindingMode = Shell.KeyBindingMode.NORMAL;
}
function createLookingGlass() {

View File

@@ -27,7 +27,6 @@ const PopupMenu = imports.ui.popupMenu;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const Util = imports.misc.util;
const ViewSelector = imports.ui.viewSelector;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
@@ -1159,7 +1158,6 @@ const SourceActor = new Lang.Class({
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('destroy', Lang.bind(this, function() {
this._source.disconnect(this._iconUpdatedId);
this._actorDestroyed = true;
}));
this._actorDestroyed = false;
@@ -1171,7 +1169,7 @@ const SourceActor = new Lang.Class({
this.actor.add_actor(this._iconBin);
this._iconUpdatedId = this._source.connect('icon-updated', Lang.bind(this, this._updateIcon));
this._source.connect('icon-updated', Lang.bind(this, this._updateIcon));
this._updateIcon();
},
@@ -1229,12 +1227,8 @@ const SourceActorWithLabel = new Lang.Class({
this.actor.add_actor(this._counterBin);
this._countUpdatedId = this._source.connect('count-updated', Lang.bind(this, this._updateCount));
this._source.connect('count-updated', Lang.bind(this, this._updateCount));
this._updateCount();
this.actor.connect('destroy', function() {
this._source.disconnect(this._countUpdatedId);
});
},
_allocate: function(actor, box, flags) {
@@ -1817,13 +1811,6 @@ const MessageTray = new Lang.Class({
y_expand: true });
this.actor.add_actor(this._summary);
this._focusTrap = new ViewSelector.FocusTrap({ can_focus: true });
this._focusTrap.connect('key-focus-in', Lang.bind(this,
function() {
this._messageTrayMenuButton.actor.grab_key_focus();
}));
this._summary.add_actor(this._focusTrap);
this._summaryMotionId = 0;
this._summaryBoxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
@@ -1852,7 +1839,7 @@ const MessageTray = new Lang.Class({
this.idleMonitor = Meta.IdleMonitor.get_core();
this._grabHelper = new GrabHelper.GrabHelper(this.actor,
{ actionMode: Shell.ActionMode.MESSAGE_TRAY });
{ keybindingMode: Shell.KeyBindingMode.MESSAGE_TRAY });
this._grabHelper.addActor(this._summaryBoxPointer.actor);
this._grabHelper.addActor(this.actor);
@@ -1916,16 +1903,16 @@ const MessageTray = new Lang.Class({
Main.wm.addKeybinding('toggle-message-tray',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.ActionMode.NORMAL |
Shell.ActionMode.MESSAGE_TRAY |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.MESSAGE_TRAY |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this.toggleAndNavigate));
Main.wm.addKeybinding('focus-active-notification',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.ActionMode.NORMAL |
Shell.ActionMode.MESSAGE_TRAY |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.MESSAGE_TRAY |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._expandActiveNotification));
this._sources = new Map();
@@ -1948,12 +1935,7 @@ const MessageTray = new Lang.Class({
this._messageTrayMenuButton = new MessageTrayMenuButton(this);
this.actor.add_actor(this._messageTrayMenuButton.actor);
this._messageTrayMenuButton.actor.connect('key-press-event',
Lang.bind(this, this._onTrayButtonKeyPress));
let gesture = new EdgeDragAction.EdgeDragAction(St.Side.BOTTOM,
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW);
let gesture = new EdgeDragAction.EdgeDragAction(St.Side.BOTTOM);
gesture.connect('activated', Lang.bind(this, this.toggle));
global.stage.add_action(gesture);
},
@@ -2048,16 +2030,6 @@ const MessageTray = new Lang.Class({
return GLib.SOURCE_REMOVE;
},
_onTrayButtonKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.ISO_Left_Tab) {
this._focusTrap.can_focus = false;
this._summary.navigate_focus(null, Gtk.DirectionType.TAB_BACKWARD, false);
this._focusTrap.can_focus = true;
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
},
_onNotificationKeyRelease: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
this._expireNotification();
@@ -2434,22 +2406,8 @@ const MessageTray = new Lang.Class({
if (shouldShowNotification && nextNotification) {
let limited = this._busy || Main.layoutManager.bottomMonitor.inFullscreen;
let showNextNotification = (!limited || nextNotification.forFeedback || nextNotification.urgency == Urgency.CRITICAL);
if (showNextNotification) {
let len = this._notificationQueue.length;
if (len > 1) {
this._notificationQueue.length = 0;
let source = new SystemNotificationSource();
this.add(source);
let notification = new Notification(source, ngettext("%d new message", "%d new messages", len).format(len));
notification.setTransient(true);
notification.connect('clicked', Lang.bind(this, function() {
this.openTray();
}));
source.notify(notification);
} else {
this._showNotification();
}
}
if (showNextNotification)
this._showNotification();
}
} else if (this._notificationState == State.SHOWN) {
let expired = (this._userActiveWhileNotificationShown &&

View File

@@ -41,14 +41,14 @@ const ModalDialog = new Lang.Class({
_init: function(params) {
params = Params.parse(params, { shellReactive: false,
styleClass: null,
actionMode: Shell.ActionMode.SYSTEM_MODAL,
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
shouldFadeIn: true,
shouldFadeOut: true,
destroyOnClose: true });
this.state = State.CLOSED;
this._hasModal = false;
this._actionMode = params.actionMode;
this._keybindingMode = params.keybindingMode;
this._shellReactive = params.shellReactive;
this._shouldFadeIn = params.shouldFadeIn;
this._shouldFadeOut = params.shouldFadeOut;
@@ -194,7 +194,7 @@ const ModalDialog = new Lang.Class({
},
placeSpinner: function(layoutInfo) {
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
let spinnerIcon = global.datadir + '/theme/process-working.svg';
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show();
@@ -362,7 +362,7 @@ const ModalDialog = new Lang.Class({
if (this._hasModal)
return true;
if (!Main.pushModal(this._group, { timestamp: timestamp,
actionMode: this._actionMode }))
keybindingMode: this._keybindingMode }))
return false;
this._hasModal = true;

View File

@@ -435,17 +435,17 @@ const Overview = new Lang.Class({
this._inDrag = false;
},
beginWindowDrag: function(window) {
this.emit('window-drag-begin', window);
beginWindowDrag: function(clone) {
this.emit('window-drag-begin', clone);
this._inDrag = true;
},
cancelledWindowDrag: function(window) {
this.emit('window-drag-cancelled', window);
cancelledWindowDrag: function(clone) {
this.emit('window-drag-cancelled', clone);
},
endWindowDrag: function(window) {
this.emit('window-drag-end', window);
endWindowDrag: function(clone) {
this.emit('window-drag-end', clone);
this._inDrag = false;
},
@@ -509,7 +509,7 @@ const Overview = new Lang.Class({
if (shouldBeModal) {
if (!this._modal) {
if (Main.pushModal(this._overview,
{ actionMode: Shell.ActionMode.OVERVIEW })) {
{ keybindingMode: Shell.KeyBindingMode.OVERVIEW })) {
this._modal = true;
} else {
this.hide();
@@ -605,9 +605,9 @@ const Overview = new Lang.Class({
return;
}
this._shown = false;
this._animateNotVisible();
this._shown = false;
this._syncGrab();
},

View File

@@ -64,8 +64,7 @@ const SlideLayout = new Lang.Class({
// flags only determine what to do if the allocated box is bigger
// than the actor's box.
let realDirection = getRtlSlideDirection(this._direction, child);
let alignX = (realDirection == SlideDirection.LEFT) ? (availWidth - natWidth)
: (availWidth - natWidth * this._slideX);
let alignX = (realDirection == SlideDirection.LEFT) ? (availWidth - natWidth) : 0;
let actorBox = new Clutter.ActorBox();
actorBox.x1 = box.x1 + alignX + this._translationX;

View File

@@ -181,7 +181,6 @@ const AppMenuButton = new Lang.Class({
this._targetApp = null;
this._appMenuNotifyId = 0;
this._actionGroupNotifyId = 0;
this._busyNotifyId = 0;
let bin = new St.Bin({ name: 'appMenu' });
bin.connect('style-changed', Lang.bind(this, this._onStyleChanged));
@@ -274,7 +273,7 @@ const AppMenuButton = new Lang.Class({
_onStyleChanged: function(actor) {
let node = actor.get_theme_node();
let [success, icon] = node.lookup_url('spinner-image', false);
if (!success || (this._spinnerIcon && this._spinnerIcon.equal(icon)))
if (!success || this._spinnerIcon == icon)
return;
this._spinnerIcon = icon;
this._spinner = new Animation.AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE);
@@ -458,17 +457,12 @@ const AppMenuButton = new Lang.Class({
this._targetApp.disconnect(this._actionGroupNotifyId);
this._actionGroupNotifyId = 0;
}
if (this._busyNotifyId) {
this._targetApp.disconnect(this._busyNotifyId);
this._busyNotifyId = 0;
}
this._targetApp = targetApp;
if (this._targetApp) {
this._appMenuNotifyId = this._targetApp.connect('notify::menu', Lang.bind(this, this._sync));
this._actionGroupNotifyId = this._targetApp.connect('notify::action-group', Lang.bind(this, this._sync));
this._busyNotifyId = this._targetApp.connect('notify::busy', Lang.bind(this, this._sync));
this._label.setText(this._targetApp.get_name());
this.actor.set_accessible_name(this._targetApp.get_name());
}
@@ -482,7 +476,7 @@ const AppMenuButton = new Lang.Class({
let isBusy = (this._targetApp != null &&
(this._targetApp.get_state() == Shell.AppState.STARTING ||
this._targetApp.get_busy()));
this._targetApp.get_state() == Shell.AppState.BUSY));
if (isBusy)
this.startAnimation();
else
@@ -893,7 +887,7 @@ const Panel = new Lang.Class({
this.statusArea = {};
this.menuManager = new PopupMenu.PopupMenuManager(this, { actionMode: Shell.ActionMode.TOPBAR_POPUP });
this.menuManager = new PopupMenu.PopupMenuManager(this, { keybindingMode: Shell.KeyBindingMode.TOPBAR_POPUP });
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
this.actor.add_actor(this._leftBox);
@@ -1025,7 +1019,7 @@ const Panel = new Lang.Class({
if (!dragWindow)
return Clutter.EVENT_PROPAGATE;
let rect = dragWindow.get_frame_rect();
let rect = dragWindow.get_outer_rect();
let [stageX, stageY] = event.get_coords();
let allowDrag = dragWindow.maximized_vertically &&

View File

@@ -918,14 +918,14 @@ const PopupSubMenu = new Lang.Class({
if (animate && needsScrollbar)
animate = false;
let targetAngle = this.actor.text_direction == Clutter.TextDirection.RTL ? -90 : 90;
if (animate) {
let [minHeight, naturalHeight] = this.actor.get_preferred_height(-1);
this.actor.height = 0;
this.actor._arrowRotation = this._arrow.rotation_angle_z;
let angle = this.actor._arrowRotation;
// animate to the first multiple of 90 greater than current angle
Tweener.addTween(this.actor,
{ _arrowRotation: targetAngle,
{ _arrowRotation: angle - angle % 90 + 90,
height: naturalHeight,
time: 0.25,
onUpdateScope: this,
@@ -938,7 +938,7 @@ const PopupSubMenu = new Lang.Class({
}
});
} else {
this._arrow.rotation_angle_z = targetAngle;
this._arrow.rotation_angle_z = this.actor._arrowRotation + 90;
}
},
@@ -957,8 +957,10 @@ const PopupSubMenu = new Lang.Class({
if (animate) {
this.actor._arrowRotation = this._arrow.rotation_angle_z;
let angle = this.actor._arrowRotation;
// animate to the first multiple of 90 less than current angle
Tweener.addTween(this.actor,
{ _arrowRotation: 0,
{ _arrowRotation: (angle - 1) - (angle - 1) % 90,
height: 0,
time: 0.25,
onUpdateScope: this,
@@ -972,7 +974,7 @@ const PopupSubMenu = new Lang.Class({
},
});
} else {
this._arrow.rotation_angle_z = 0;
this._arrow.rotation_angle_z = this.actor._arrowRotation - 90;
this.actor.hide();
}
},
@@ -1050,6 +1052,8 @@ const PopupSubMenuMenuItem = new Lang.Class({
this._triangleBin = new St.Widget({ y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
this._triangleBin.add_child(this._triangle);
if (this._triangleBin.get_text_direction() == Clutter.TextDirection.RTL)
this._triangleBin.set_scale(-1.0, 1.0);
this.actor.add_child(this._triangleBin);
this.actor.add_accessible_state (Atk.StateType.EXPANDABLE);

View File

@@ -85,8 +85,7 @@ const Clock = new Lang.Class({
let date = new Date();
/* Translators: This is a time format for a date in
long format */
let dateFormat = Shell.util_translate_time_string(N_("%A, %B %d"));
this._date.text = date.toLocaleFormat(dateFormat);
this._date.text = date.toLocaleFormat(_("%A, %B %d"));
},
destroy: function() {
@@ -647,14 +646,14 @@ const ScreenShield = new Lang.Class({
if (this._isModal)
return true;
this._isModal = Main.pushModal(this.actor, { actionMode: Shell.ActionMode.LOCK_SCREEN });
this._isModal = Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
if (this._isModal)
return true;
// We failed to get a pointer grab, it means that
// something else has it. Try with a keyboard grab only
this._isModal = Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED,
actionMode: Shell.ActionMode.LOCK_SCREEN });
keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
return this._isModal;
},
@@ -670,9 +669,7 @@ const ScreenShield = new Lang.Class({
if (this._lockScreenState != MessageTray.State.SHOWN)
return Clutter.EVENT_PROPAGATE;
let isEnter = (symbol == Clutter.KEY_Return ||
symbol == Clutter.KEY_KP_Enter ||
symbol == Clutter.KEY_ISO_Enter);
let isEnter = (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter);
if (!isEnter && !(GLib.unichar_isprint(unichar) || symbol == Clutter.KEY_Escape))
return Clutter.EVENT_PROPAGATE;
@@ -922,11 +919,6 @@ const ScreenShield = new Lang.Class({
this._lockScreenState = MessageTray.State.HIDDEN;
this._lockScreenGroup.hide();
if (this._dialog) {
this._dialog.actor.grab_key_focus();
this._dialog.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
},
_hideLockScreen: function(animate, velocity) {
@@ -1335,8 +1327,6 @@ const ScreenShield = new Lang.Class({
// If the previous shell crashed, and gnome-session restarted us, then re-lock
lockIfWasLocked: function() {
if (!this._settings.get_boolean(LOCK_ENABLED_KEY))
return;
let wasLocked = global.get_runtime_state('b', LOCKED_STATE_STR);
if (wasLocked === null)
return;

View File

@@ -43,8 +43,6 @@ const ScreencastService = new Lang.Class({
this._recorders = new Map();
this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
},
@@ -70,8 +68,8 @@ const ScreencastService = new Lang.Class({
if (Main.sessionMode.allowScreencast)
return;
for (let sender of this._recorders.keys())
this._stopRecordingForSender(sender);
this._recorders.clear();
this.emit('updated');
},
_onNameVanished: function(connection, name) {
@@ -105,8 +103,7 @@ const ScreencastService = new Lang.Class({
ScreencastAsync: function(params, invocation) {
let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
if (!Main.sessionMode.allowScreencast) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
@@ -120,8 +117,6 @@ const ScreencastService = new Lang.Class({
this._applyOptionalParameters(recorder, options);
let [success, fileName] = recorder.record();
returnValue = [success, fileName ? fileName : ''];
if (!success)
this._stopRecordingForSender(sender);
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
@@ -129,8 +124,7 @@ const ScreencastService = new Lang.Class({
ScreencastAreaAsync: function(params, invocation) {
let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
if (!Main.sessionMode.allowScreencast) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
@@ -156,8 +150,6 @@ const ScreencastService = new Lang.Class({
this._applyOptionalParameters(recorder, options);
let [success, fileName] = recorder.record();
returnValue = [success, fileName ? fileName : ''];
if (!success)
this._stopRecordingForSender(sender);
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));

View File

@@ -65,44 +65,9 @@ const ScreenshotService = new Lang.Class({
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenshotIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot');
this._screenShooter = new Map();
this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
},
_createScreenshot: function(invocation) {
let sender = invocation.get_sender();
if (this._screenShooter.has(sender) ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', [false, '']));
return null;
}
let shooter = new Shell.Screenshot();
shooter._watchNameId =
Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
Lang.bind(this, this._onNameVanished));
this._screenShooter.set(sender, shooter);
return shooter;
},
_onNameVanished: function(connection, name) {
this._removeShooterForSender(name);
},
_removeShooterForSender: function(sender) {
let shooter = this._screenShooter.get(sender);
if (!shooter)
return;
Gio.bus_unwatch_name(shooter._watchNameId);
this._screenShooter.delete(sender);
},
_checkArea: function(x, y, width, height) {
return x >= 0 && y >= 0 &&
width > 0 && height > 0 &&
@@ -111,15 +76,9 @@ const ScreenshotService = new Lang.Class({
},
_onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) {
if (result) {
if (flash) {
let flashspot = new Flashspot(area);
flashspot.fire(Lang.bind(this, function() {
this._removeShooterForSender(invocation.get_sender());
}));
}
else
this._removeShooterForSender(invocation.get_sender());
if (flash && result) {
let flashspot = new Flashspot(area);
flashspot.fire();
}
let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
@@ -153,9 +112,7 @@ const ScreenshotService = new Lang.Class({
"Invalid params");
return;
}
let screenshot = this._createScreenshot(invocation);
if (!screenshot)
return;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_area (x, y, width, height, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
@@ -163,9 +120,7 @@ const ScreenshotService = new Lang.Class({
ScreenshotWindowAsync : function (params, invocation) {
let [include_frame, include_cursor, flash, filename] = params;
let screenshot = this._createScreenshot(invocation);
if (!screenshot)
return;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_window (include_frame, include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
@@ -173,9 +128,7 @@ const ScreenshotService = new Lang.Class({
ScreenshotAsync : function (params, invocation) {
let [include_cursor, flash, filename] = params;
let screenshot = this._createScreenshot(invocation);
if (!screenshot)
return;
let screenshot = new Shell.Screenshot();
screenshot.screenshot(include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
@@ -349,7 +302,7 @@ const Flashspot = new Lang.Class({
this.actor.set_position(area.x, area.y);
},
fire: function(doneCallback) {
fire: function() {
this.actor.show();
this.actor.opacity = 255;
Tweener.addTween(this.actor,
@@ -357,8 +310,6 @@ const Flashspot = new Lang.Class({
time: FLASHSPOT_ANIMATION_OUT_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
if (doneCallback)
doneCallback();
this.destroy();
})
});

View File

@@ -2,7 +2,6 @@
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta;
@@ -25,6 +24,108 @@ const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
const SearchSystem = new Lang.Class({
Name: 'SearchSystem',
_init: function() {
this._providers = [];
this._registerProvider(new AppDisplay.AppSearchProvider());
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::enabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
this._reloadRemoteProviders();
this._cancellable = new Gio.Cancellable();
},
addProvider: function(provider) {
this._providers.push(provider);
this.emit('providers-changed');
},
_reloadRemoteProviders: function() {
let remoteProviders = this._providers.filter(function(provider) {
return provider.isRemoteProvider;
});
remoteProviders.forEach(Lang.bind(this, function(provider) {
this._unregisterProvider(provider);
}));
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, function(providers) {
providers.forEach(Lang.bind(this, this._registerProvider));
}));
this.emit('providers-changed');
},
_registerProvider: function (provider) {
this._providers.push(provider);
},
_unregisterProvider: function (provider) {
let index = this._providers.indexOf(provider);
this._providers.splice(index, 1);
if (provider.display)
provider.display.destroy();
},
getProviders: function() {
return this._providers;
},
getTerms: function() {
return this._terms;
},
reset: function() {
this._terms = [];
this._results = {};
},
_gotResults: function(results, provider) {
this._results[provider.id] = results;
this.emit('search-updated', provider, results);
},
setTerms: function(terms) {
this._cancellable.cancel();
this._cancellable.reset();
let previousResults = this._results;
let previousTerms = this._terms;
this.reset();
if (!terms)
return;
let searchString = terms.join(' ');
let previousSearchString = previousTerms.join(' ');
if (searchString == previousSearchString)
return;
let isSubSearch = false;
if (previousTerms.length > 0)
isSubSearch = searchString.indexOf(previousSearchString) == 0;
this._terms = terms;
this._providers.forEach(Lang.bind(this, function(provider) {
let previousProviderResults = previousResults[provider.id];
if (isSubSearch && previousProviderResults)
provider.getSubsearchResultSet(previousProviderResults, terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
else
provider.getInitialResultSet(terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
}));
}
});
Signals.addSignalMethods(SearchSystem.prototype);
const MaxWidthBin = new Lang.Class({
Name: 'MaxWidthBin',
Extends: St.Bin,
@@ -199,9 +300,12 @@ const SearchResultsBase = new Lang.Class({
this._cancellable.reset();
this.provider.getResultMetas(metasNeeded, Lang.bind(this, function(metas) {
if (metas.length == 0) {
callback(false);
return;
}
if (metas.length != metasNeeded.length) {
log('Wrong number of result metas returned by search provider ' + this.provider.id +
': expected ' + metasNeeded.length + ' but got ' + metas.length);
log('Wrong number of result metas returned by search provider');
callback(false);
return;
}
@@ -231,11 +335,9 @@ const SearchResultsBase = new Lang.Class({
let hasMoreResults = results.length < providerResults.length;
this._ensureResultActors(results, Lang.bind(this, function(successful) {
if (!successful) {
this._clearResultDisplay();
callback();
this._clearResultDisplay();
if (!successful)
return;
}
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
@@ -395,136 +497,16 @@ const SearchResults = new Lang.Class({
this._statusText = new St.Label({ style_class: 'search-statustext' });
this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this.actor.add(this._statusBin, { expand: true });
this._content.add(this._statusBin, { expand: true });
this._statusBin.add_actor(this._statusText);
this._highlightDefault = false;
this._defaultResult = null;
this._startingSearch = false;
this._terms = [];
this._results = {};
this._providers = [];
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
this._searchTimeoutId = 0;
this._cancellable = new Gio.Cancellable();
this._registerProvider(new AppDisplay.AppSearchProvider());
this._reloadRemoteProviders();
},
_reloadRemoteProviders: function() {
let remoteProviders = this._providers.filter(function(provider) {
return provider.isRemoteProvider;
});
remoteProviders.forEach(Lang.bind(this, function(provider) {
this._unregisterProvider(provider);
}));
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, function(providers) {
providers.forEach(Lang.bind(this, this._registerProvider));
}));
},
_registerProvider: function (provider) {
this._providers.push(provider);
this._ensureProviderDisplay(provider);
},
_unregisterProvider: function (provider) {
let index = this._providers.indexOf(provider);
this._providers.splice(index, 1);
if (provider.display)
provider.display.destroy();
},
_gotResults: function(results, provider) {
this._results[provider.id] = results;
this._updateResults(provider, results);
},
_clearSearchTimeout: function() {
if (this._searchTimeoutId > 0) {
GLib.source_remove(this._searchTimeoutId);
this._searchTimeoutId = 0;
}
},
_reset: function() {
this._terms = [];
this._results = {};
this._clearDisplay();
this._clearSearchTimeout();
this._defaultResult = null;
this._startingSearch = false;
this._updateSearchProgress();
},
_doSearch: function() {
this._startingSearch = false;
let previousResults = this._results;
this._results = {};
this._providers.forEach(Lang.bind(this, function(provider) {
provider.searchInProgress = true;
let previousProviderResults = previousResults[provider.id];
if (this._isSubSearch && previousProviderResults)
provider.getSubsearchResultSet(previousProviderResults, this._terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
else
provider.getInitialResultSet(this._terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
}));
this._updateSearchProgress();
this._clearSearchTimeout();
},
_onSearchTimeout: function() {
this._searchTimeoutId = 0;
this._doSearch();
return GLib.SOURCE_REMOVE;
},
setTerms: function(terms) {
// Check for the case of making a duplicate previous search before
// setting state of the current search or cancelling the search.
// This will prevent incorrect state being as a result of a duplicate
// search while the previous search is still active.
let searchString = terms.join(' ');
let previousSearchString = this._terms.join(' ');
if (searchString == previousSearchString)
return;
this._startingSearch = true;
this._cancellable.cancel();
this._cancellable.reset();
if (terms.length == 0) {
this._reset();
return;
}
let isSubSearch = false;
if (this._terms.length > 0)
isSubSearch = searchString.indexOf(previousSearchString) == 0;
this._terms = terms;
this._isSubSearch = isSubSearch;
this._updateSearchProgress();
if (this._searchTimeoutId == 0)
this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, Lang.bind(this, this._onSearchTimeout));
this._searchSystem = new SearchSystem();
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateResults));
this._searchSystem.connect('providers-changed', Lang.bind(this, this._updateProviderDisplays));
this._updateProviderDisplays();
},
_onPan: function(action) {
@@ -546,24 +528,44 @@ const SearchResults = new Lang.Class({
if (provider.appInfo)
providerDisplay = new ListSearchResults(provider);
else
providerDisplay = new GridSearchResults(provider, this.actor);
providerDisplay = new GridSearchResults(provider, this._content);
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
providerDisplay.actor.hide();
this._content.add(providerDisplay.actor);
provider.display = providerDisplay;
},
_updateProviderDisplays: function() {
this._searchSystem.getProviders().forEach(Lang.bind(this, this._ensureProviderDisplay));
},
_clearDisplay: function() {
this._providers.forEach(function(provider) {
this._searchSystem.getProviders().forEach(function(provider) {
provider.display.clear();
});
},
reset: function() {
this._searchSystem.reset();
this._statusBin.hide();
this._clearDisplay();
this._defaultResult = null;
},
startingSearch: function() {
this.reset();
this._statusText.set_text(_("Searching…"));
this._statusBin.show();
},
setTerms: function(terms) {
this._searchSystem.setTerms(terms);
},
_maybeSetInitialSelection: function() {
let newDefaultResult = null;
let providers = this._providers;
let providers = this._searchSystem.getProviders();
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
let display = provider.display;
@@ -586,50 +588,31 @@ const SearchResults = new Lang.Class({
}
},
get searchInProgress() {
if (this._startingSearch)
return true;
return this._providers.some(function(provider) {
return provider.searchInProgress;
});
},
_updateSearchProgress: function () {
let haveResults = this._providers.some(function(provider) {
_updateStatusText: function () {
let haveResults = this._searchSystem.getProviders().some(function(provider) {
let display = provider.display;
return (display.getFirstResult() != null);
});
this._scrollView.visible = haveResults;
this._statusBin.visible = !haveResults;
if (!haveResults) {
if (this.searchInProgress) {
this._statusText.set_text(_("Searching…"));
} else {
this._statusText.set_text(_("No results."));
}
this._statusText.set_text(_("No results."));
this._statusBin.show();
} else {
this._statusBin.hide();
}
},
_updateResults: function(provider, results) {
let terms = this._terms;
_updateResults: function(searchSystem, provider, results) {
let terms = searchSystem.getTerms();
let display = provider.display;
display.updateSearch(results, terms, Lang.bind(this, function() {
provider.searchInProgress = false;
this._maybeSetInitialSelection();
this._updateSearchProgress();
this._updateStatusText();
}));
},
activateDefault: function() {
// If we have a search queued up, force the search now.
if (this._searchTimeoutId > 0)
this._doSearch();
if (this._defaultResult)
this._defaultResult.activate();
},

View File

@@ -44,7 +44,8 @@ const GnomeShellIface = '<node> \
</method> \
<signal name="AcceleratorActivated"> \
<arg name="action" type="u" /> \
<arg name="parameters" type="a{sv}" /> \
<arg name="deviceid" type="u" /> \
<arg name="timestamp" type="u" /> \
</signal> \
<property name="Mode" type="s" access="read" /> \
<property name="OverviewActive" type="b" access="readwrite" /> \
@@ -89,12 +90,6 @@ const GnomeShell = new Lang.Class({
function(display, action, deviceid, timestamp) {
this._emitAcceleratorActivated(action, deviceid, timestamp);
}));
this._cachedOverviewVisible = false;
Main.overview.connect('showing',
Lang.bind(this, this._checkOverviewVisibleChanged));
Main.overview.connect('hidden',
Lang.bind(this, this._checkOverviewVisibleChanged));
},
/**
@@ -139,7 +134,7 @@ const GnomeShell = new Lang.Class({
params[param] = params[param].deep_unpack();
let monitorIndex = -1;
if (params['monitor'] >= 0)
if (params['monitor'])
monitorIndex = params['monitor'];
let icon = null;
@@ -195,14 +190,11 @@ const GnomeShell = new Lang.Class({
let connection = this._dbusImpl.get_connection();
let info = this._dbusImpl.get_info();
let params = { 'device-id': GLib.Variant.new('u', deviceid),
'timestamp': GLib.Variant.new('u', timestamp),
'action-mode': GLib.Variant.new('u', Main.actionMode) };
connection.emit_signal(destination,
this._dbusImpl.get_object_path(),
info ? info.name : null,
'AcceleratorActivated',
GLib.Variant.new('(ua{sv})', [action, params]));
GLib.Variant.new('(uuu)', [action, deviceid, timestamp]));
},
_grabAcceleratorForSender: function(accelerator, flags, sender) {
@@ -243,15 +235,8 @@ const GnomeShell = new Lang.Class({
Mode: global.session_mode,
_checkOverviewVisibleChanged: function() {
if (Main.overview.visible !== this._cachedOverviewVisible) {
this._cachedOverviewVisible = Main.overview.visible;
this._dbusImpl.emit_property_changed('OverviewActive', new GLib.Variant('b', this._cachedOverviewVisible));
}
},
get OverviewActive() {
return this._cachedOverviewVisible;
return Main.overview.visible;
},
set OverviewActive(visible) {

View File

@@ -17,6 +17,8 @@ const EntryMenu = new Lang.Class({
_init: function(entry) {
this.parent(entry, 0, St.Side.TOP);
this.actor.add_style_class_name('entry-context-menu');
this._entry = entry;
this._clipboard = St.Clipboard.get_default();

View File

@@ -7,7 +7,7 @@ const Lang = imports.lang;
const St = imports.gi.St;
const Signals = imports.signals;
const SLIDER_SCROLL_STEP = 0.02; /* Slider scrolling step in % */
const SLIDER_SCROLL_STEP = 0.05; /* Slider scrolling step in % */
const Slider = new Lang.Class({
Name: "Slider",
@@ -197,7 +197,7 @@ const Slider = new Lang.Class({
let [dx, dy] = event.get_scroll_delta();
// Even though the slider is horizontal, use dy to match
// the UP/DOWN above.
delta = -dy * SLIDER_SCROLL_STEP;
delta = -dy / 10;
}
this._value = Math.min(Math.max(0, this._value + delta), 1);

File diff suppressed because it is too large Load Diff

View File

@@ -13,15 +13,6 @@ const LOCATION_SCHEMA = 'org.gnome.system.location';
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
const ENABLED = 'enabled';
const GeoclueAccuracyLevel = {
NONE: 0,
COUNTRY: 1,
CITY: 4,
NEIGHBORHOOD: 5,
STREET: 6,
EXACT: 8
};
var GeoclueIface = '<node> \
<interface name="org.freedesktop.GeoClue2.Manager"> \
<property name="InUse" type="b" access="read"/> \
@@ -70,7 +61,6 @@ const Indicator = new Lang.Class({
this._item.status.text = _("Enabled");
this._onOffAction = this._item.menu.addAction(_("Disable"), Lang.bind(this, this._onOnOffAction));
this._item.menu.addSettingsAction(_("Privacy Settings"), 'gnome-privacy-panel.desktop');
this.menu.addMenuItem(this._item);
@@ -191,14 +181,10 @@ const Indicator = new Lang.Class({
},
_getMaxAccuracyLevel: function() {
if (this._settings.get_boolean(ENABLED)) {
let level = this._settings.get_string(MAX_ACCURACY_LEVEL);
return GeoclueAccuracyLevel[level.toUpperCase()] ||
GeoclueAccuracyLevel.NONE;
} else {
return GeoclueAccuracyLevel.NONE;
}
if (this._settings.get_boolean(ENABLED))
return this._settings.get_enum(MAX_ACCURACY_LEVEL);
else
return 0;
},
_notifyMaxAccuracyLevel: function() {

View File

@@ -876,8 +876,7 @@ const NMWirelessDialog = new Lang.Class({
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER });
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
this._noNetworksSpinner = new Animation.AnimatedIcon(file, 24, 24);
this._noNetworksSpinner = new Animation.AnimatedIcon(global.datadir + '/theme/process-working.svg', 24, 24);
this._noNetworksBox.add_actor(this._noNetworksSpinner.actor);
this._noNetworksBox.add_actor(new St.Label({ style_class: 'no-networks-label',
text: _("No Networks") }));
@@ -1867,7 +1866,7 @@ const NMApplet = new Lang.Class({
_connectionRemoved: function(connection) {
let pos = this._connections.indexOf(connection);
if (pos != -1)
this._connections.splice(pos, 1);
this._connections.splice(connection, 1);
let section = connection._section;

View File

@@ -15,7 +15,6 @@ const RfkillManagerInterface = '<node> \
<interface name="org.gnome.SettingsDaemon.Rfkill"> \
<property name="AirplaneMode" type="b" access="readwrite" /> \
<property name="HardwareAirplaneMode" type="b" access="read" /> \
<property name="ShouldShowAirplaneMode" type="b" access="read" /> \
</interface> \
</node>';
@@ -49,10 +48,6 @@ const RfkillManager = new Lang.Class({
return this._proxy.HardwareAirplaneMode;
},
get shouldShowAirplaneMode() {
return this._proxy.ShouldShowAirplaneMode;
},
_changed: function() {
this.emit('airplane-mode-changed');
}
@@ -106,10 +101,11 @@ const Indicator = new Lang.Class({
_sync: function() {
let airplaneMode = this._manager.airplaneMode;
let hwAirplaneMode = this._manager.hwAirplaneMode;
let showAirplaneMode = this._manager.shouldShowAirplaneMode;
let changed = (airplaneMode != this._indicator.visible) ||
(hwAirplaneMode != this._offItem.actor.visible);
this._indicator.visible = (airplaneMode && showAirplaneMode);
this._item.actor.visible = (airplaneMode && showAirplaneMode);
this._indicator.visible = airplaneMode;
this._item.actor.visible = airplaneMode;
this._offItem.setSensitive(!hwAirplaneMode);
if (hwAirplaneMode)

View File

@@ -87,6 +87,8 @@ const SwitcherPopup = new Lang.Class({
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
let bottomPadding = this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
let vPadding = this.actor.get_theme_node().get_vertical_padding();
let hPadding = leftPadding + rightPadding;
// Allocate the switcherList
@@ -100,17 +102,16 @@ const SwitcherPopup = new Lang.Class({
this._switcherList.actor.allocate(childBox, flags);
},
_createSwitcher: function() {
throw new Error('Not implemented');
},
_initialSelection: function(backward, binding) {
if (backward)
this._select(this._items.length - 1);
else if (this._items.length == 1)
this._select(0);
else
this._select(1);
throw new Error('Not implemented');
},
show: function(backward, binding, mask) {
if (this._items.length == 0)
if (!this._createSwitcher())
return false;
if (!Main.pushModal(this.actor)) {
@@ -138,6 +139,11 @@ const SwitcherPopup = new Lang.Class({
this.actor.show();
this.actor.get_allocation_box();
if (this._items.length > 1)
this._selectedIndex = 1;
else
this._selectedIndex = 0;
this._initialSelection(backward, binding);
// There's a race condition; if the user released Alt before

View File

@@ -154,7 +154,7 @@ const UnlockDialog = new Lang.Class({
return true;
if (!Main.pushModal(this.actor, { timestamp: timestamp,
actionMode: Shell.ActionMode.UNLOCK_SCREEN }))
keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN }))
return false;
this._isModal = true;

View File

@@ -28,12 +28,11 @@ const Avatar = new Lang.Class({
styleClass: 'framed-user-icon' });
this._iconSize = params.iconSize;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this.actor = new St.Bin({ style_class: params.styleClass,
track_hover: params.reactive,
reactive: params.reactive,
width: this._iconSize * scaleFactor,
height: this._iconSize * scaleFactor });
width: this._iconSize,
height: this._iconSize });
},
setSensitive: function(sensitive) {

View File

@@ -65,8 +65,7 @@ const ShowOverviewAction = new Lang.Class({
},
vfunc_gesture_prepare : function(action, actor) {
return Main.actionMode == Shell.ActionMode.NORMAL &&
this.get_n_current_points() == this.get_n_touch_points();
return this.get_n_current_points() == this.get_n_touch_points();
},
_getBoundingRect : function(motion) {
@@ -126,6 +125,7 @@ const ViewSelector = new Lang.Class({
this._activePage = null;
this._searchActive = false;
this._searchTimeoutId = 0;
this._entry = searchEntry;
ShellEntry.addContextMenu(this._entry);
@@ -144,8 +144,12 @@ const ViewSelector = new Lang.Class({
this._entry.set_primary_icon(new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-find-symbolic' }));
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-clear-symbolic' });
if (this._entry.get_text_direction() == Clutter.TextDirection.RTL)
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-clear-symbolic-rtl' });
else
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-clear-symbolic-ltr' });
this._iconClickedId = 0;
this._capturedEventId = 0;
@@ -194,30 +198,27 @@ const ViewSelector = new Lang.Class({
// the windows to animate, but now we no longer want to
// show it given that we are now on the apps page or
// search page.
if (this._activePage != this._workspacesPage) {
if (this._activePage != this._workspacesPage)
this._workspacesPage.opacity = 0;
this._workspacesPage.hide();
}
}));
Main.wm.addKeybinding('toggle-application-view',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._toggleAppsPage));
Main.wm.addKeybinding('toggle-overview',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(Main.overview, Main.overview.toggle));
let gesture;
gesture = new EdgeDragAction.EdgeDragAction(St.Side.LEFT,
Shell.ActionMode.NORMAL);
gesture = new EdgeDragAction.EdgeDragAction(St.Side.LEFT);
gesture.connect('activated', Lang.bind(this, function() {
if (Main.overview.visible)
Main.overview.hide();
@@ -488,23 +489,36 @@ const ViewSelector = new Lang.Class({
_onTextChanged: function (se, prop) {
let terms = getTermsForSearchString(this._entry.get_text());
let searchPreviouslyActive = this._searchActive;
this._searchActive = (terms.length > 0);
this._searchResults.setTerms(terms);
let startSearch = this._searchActive && !searchPreviouslyActive;
if (startSearch)
this._searchResults.startingSearch();
if (this._searchActive) {
this._showPage(this._searchPage);
this._entry.set_secondary_icon(this._clearIcon);
if (this._iconClickedId == 0)
this._iconClickedId = this._entry.connect('secondary-icon-clicked',
Lang.bind(this, this.reset));
if (this._searchTimeoutId == 0) {
this._searchTimeoutId = Mainloop.timeout_add(150,
Lang.bind(this, this._doSearch));
GLib.Source.set_name_by_id(this._searchTimeoutId, '[gnome-shell] this._doSearch');
}
} else {
if (this._iconClickedId > 0) {
this._entry.disconnect(this._iconClickedId);
this._iconClickedId = 0;
}
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._searchTimeoutId = 0;
}
this._entry.set_secondary_icon(null);
this._searchCancelled();
}
@@ -542,6 +556,12 @@ const ViewSelector = new Lang.Class({
this._searchResults.navigateFocus(nextDirection);
return Clutter.EVENT_STOP;
} else if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
// We can't connect to 'activate' here because search providers
// might want to do something with the modifiers in activateDefault.
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._doSearch();
}
this._searchResults.activateDefault();
return Clutter.EVENT_STOP;
}
@@ -564,6 +584,17 @@ const ViewSelector = new Lang.Class({
return Clutter.EVENT_PROPAGATE;
},
_doSearch: function () {
this._searchTimeoutId = 0;
let terms = getTermsForSearchString(this._entry.get_text());
this._searchResults.setTerms(terms);
this._showPage(this._searchPage);
return GLib.SOURCE_REMOVE;
},
getActivePage: function() {
if (this._activePage == this._workspacesPage)
return ViewPage.WINDOWS;

View File

@@ -17,6 +17,7 @@ const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const WindowMenu = imports.ui.windowMenu;
const Wobbly = imports.ui.wobbly;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const MAXIMIZE_WINDOW_ANIMATION_TIME = 0.15;
@@ -413,7 +414,7 @@ const TilePreview = new Lang.Class({
y: monitor.y,
width: monitor.width,
height: monitor.height });
let [, rect] = window.get_frame_rect().intersect(monitorRect);
let [, rect] = window.get_outer_rect().intersect(monitorRect);
this.actor.set_size(rect.width, rect.height);
this.actor.set_position(rect.x, rect.y);
this.actor.opacity = 0;
@@ -478,9 +479,7 @@ const WorkspaceSwitchAction = new Lang.Class({
},
vfunc_gesture_prepare : function(action, actor) {
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
return this.get_n_current_points() == this.get_n_touch_points() &&
(allowedModes & Main.actionMode);
return this.get_n_current_points() == this.get_n_touch_points();
},
vfunc_gesture_end : function(action, actor) {
@@ -528,11 +527,6 @@ const AppSwitchAction = new Lang.Class({
},
vfunc_gesture_prepare : function(action, actor) {
if (Main.actionMode != Shell.ActionMode.NORMAL) {
this.cancel();
return false;
}
return this.get_n_current_points() <= 4;
},
@@ -580,35 +574,6 @@ const AppSwitchAction = new Lang.Class({
});
Signals.addSignalMethods(AppSwitchAction.prototype);
const ResizePopup = new Lang.Class({
Name: 'ResizePopup',
_init: function() {
this._widget = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this._label = new St.Label({ style_class: 'resize-popup',
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
x_expand: true, y_expand: true });
this._widget.add_child(this._label);
Main.uiGroup.add_actor(this._widget);
},
set: function(rect, displayW, displayH) {
/* Translators: This represents the size of a window. The first number is
* the width of the window and the second is the height. */
let text = _("%d x %d").format(displayW, displayH);
this._label.set_text(text);
this._widget.set_position(rect.x, rect.y);
this._widget.set_size(rect.width, rect.height);
},
destroy: function() {
this._widget.destroy();
this._widget = null;
},
});
const WindowManager = new Lang.Class({
Name: 'WindowManager',
@@ -647,182 +612,179 @@ const WindowManager = new Lang.Class({
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
this._shellwm.connect('filter-keybinding', Lang.bind(this, this._filterKeybinding));
this._shellwm.connect('confirm-display-change', Lang.bind(this, this._confirmDisplayChange));
global.screen.connect('restacked', Lang.bind(this, this._syncStacking));
this._workspaceSwitcherPopup = null;
this._tilePreview = null;
this.setCustomKeybindingHandler('switch-to-workspace-left',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-right',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-up',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-down',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-last',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-left',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-right',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-up',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-down',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-1',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-2',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-3',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-4',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-5',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-6',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-7',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-8',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-9',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-10',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-11',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-12',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-1',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-2',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-3',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-4',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-5',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-6',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-7',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-8',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-9',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-10',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-11',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-12',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-last',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-applications',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-group',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-applications-backward',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-group-backward',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-windows',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startWindowSwitcher));
this.setCustomKeybindingHandler('switch-windows-backward',
Shell.ActionMode.NORMAL,
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startWindowSwitcher));
this.setCustomKeybindingHandler('switch-panels',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW |
Shell.ActionMode.LOCK_SCREEN |
Shell.ActionMode.UNLOCK_SCREEN |
Shell.ActionMode.LOGIN_SCREEN,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW |
Shell.KeyBindingMode.LOCK_SCREEN |
Shell.KeyBindingMode.UNLOCK_SCREEN |
Shell.KeyBindingMode.LOGIN_SCREEN,
Lang.bind(this, this._startA11ySwitcher));
this.setCustomKeybindingHandler('switch-panels-backward',
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW |
Shell.ActionMode.LOCK_SCREEN |
Shell.ActionMode.UNLOCK_SCREEN |
Shell.ActionMode.LOGIN_SCREEN,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW |
Shell.KeyBindingMode.LOCK_SCREEN |
Shell.KeyBindingMode.UNLOCK_SCREEN |
Shell.KeyBindingMode.LOGIN_SCREEN,
Lang.bind(this, this._startA11ySwitcher));
this.addKeybinding('pause-resume-tweens',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.ActionMode.ALL,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._toggleTweens));
this.addKeybinding('open-application-menu',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.ActionMode.NORMAL |
Shell.ActionMode.TOPBAR_POPUP,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.TOPBAR_POPUP,
Lang.bind(this, this._toggleAppMenu));
global.display.connect('show-resize-popup', Lang.bind(this, this._showResizePopup));
Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++)
this._undimWindow(this._dimmedWindows[i]);
@@ -850,6 +812,8 @@ const WindowManager = new Lang.Class({
gesture = new AppSwitchAction();
gesture.connect('activated', Lang.bind(this, this._switchApp));
global.stage.add_action(gesture);
this._wobblyWindows = new Wobbly.WobblyWindowManager();
},
_lookupIndex: function (windows, metaWindow) {
@@ -888,44 +852,6 @@ const WindowManager = new Lang.Class({
Main.activateWindow(nextWindow);
},
insertWorkspace: function(pos) {
if (!Meta.prefs_get_dynamic_workspaces())
return;
let windows = global.get_window_actors().map(function(winActor) {
return winActor.meta_window;
});
// To create a new workspace, we slide all the windows on workspaces
// below us to the next workspace, leaving a blank workspace for us
// to recycle.
windows.forEach(function(window) {
// If the window is attached to an ancestor, we don't need/want
// to move it
if (window.get_transient_for() != null)
return;
// Same for OR windows
if (window.is_override_redirect())
return;
// Windows on workspaces below pos don't need moving
let index = window.get_workspace().index();
if (index < pos)
return;
window.change_workspace_by_index(index + 1, true);
});
// If the new workspace was inserted before the active workspace,
// activate the workspace to which its windows went
let activeIndex = global.screen.get_active_workspace_index();
if (activeIndex >= pos) {
let newWs = global.screen.get_workspace_by_index(activeIndex + 1);
this._blockAnimations = true;
newWs.activate(global.get_current_time());
this._blockAnimations = false;
}
},
keepWorkspaceAlive: function(workspace, duration) {
if (!this._workspaceTracker)
return;
@@ -947,7 +873,7 @@ const WindowManager = new Lang.Class({
removeKeybinding: function(name) {
if (global.display.remove_keybinding(name))
this.allowKeybinding(name, Shell.ActionMode.NONE);
this.allowKeybinding(name, Shell.KeyBindingMode.NONE);
},
allowKeybinding: function(name, modes) {
@@ -955,7 +881,7 @@ const WindowManager = new Lang.Class({
},
_shouldAnimate: function() {
return !(Main.overview.visible || this._blockAnimations);
return !Main.overview.visible;
},
_shouldAnimateActor: function(actor, types) {
@@ -1146,8 +1072,10 @@ const WindowManager = new Lang.Class({
return;
}
if (actor.meta_window.is_attached_dialog())
if (actor.meta_window.is_attached_dialog()) {
/* Scale the window from the center of the parent */
this._checkDimming(actor.get_meta_window().get_transient_for());
}
switch (actor._windowType) {
case Meta.WindowType.NORMAL:
@@ -1302,36 +1230,18 @@ const WindowManager = new Lang.Class({
},
_filterKeybinding: function(shellwm, binding) {
if (Main.actionMode == Shell.ActionMode.NONE)
if (Main.keybindingMode == Shell.KeyBindingMode.NONE)
return true;
// There's little sense in implementing a keybinding in mutter and
// not having it work in NORMAL mode; handle this case generically
// so we don't have to explicitly allow all builtin keybindings in
// NORMAL mode.
if (Main.actionMode == Shell.ActionMode.NORMAL &&
if (Main.keybindingMode == Shell.KeyBindingMode.NORMAL &&
binding.is_builtin())
return false;
return !(this._allowedKeybindings[binding.get_name()] & Main.actionMode);
},
_syncStacking: function() {
if (this._switchData == null)
return;
// Update stacking of windows in inGroup (aka the workspace we are
// switching to). Windows in outGroup are about to be hidden anyway,
// so we just ignore them here.
let windows = global.get_window_actors();
let sibling = null;
for (let i = 0; i < windows.length; i++) {
if (windows[i].get_parent() != this._switchData.inGroup)
continue;
this._switchData.inGroup.set_child_above_sibling(windows[i], sibling);
sibling = windows[i];
}
return !(this._allowedKeybindings[binding.get_name()] & Main.keybindingMode);
},
_switchWorkspace : function(shellwm, from, to, direction) {
@@ -1525,11 +1435,6 @@ const WindowManager = new Lang.Class({
direction = Meta.MotionDirection.DOWN;
newWs = screen.get_workspace_by_index(screen.n_workspaces - 1);
} else if (isNaN(target)) {
// Prepend a new workspace dynamically
if (screen.get_active_workspace_index() == 0 &&
action == 'move' && target == 'up')
this.insertWorkspace(0);
direction = Meta.MotionDirection[target.toUpperCase()];
newWs = screen.get_active_workspace().get_neighbor(direction);
} else if (target > 0) {
@@ -1594,18 +1499,4 @@ const WindowManager = new Lang.Class({
let dialog = new DisplayChangeDialog(this._shellwm);
dialog.open();
},
_showResizePopup: function(display, show, rect, displayW, displayH) {
if (show) {
if (!this._resizePopup)
this._resizePopup = new ResizePopup();
this._resizePopup.set(rect, displayW, displayH);
} else {
if (this._resizePopup) {
this._resizePopup.destroy();
this._resizePopup = null;
}
}
},
});

View File

@@ -75,7 +75,7 @@ const WindowMenu = new Lang.Class({
}));
if (window.is_above())
item.setOrnament(PopupMenu.Ornament.DOT);
if (window.get_maximized() == Meta.MaximizeFlags.BOTH ||
if (window.get_maximized() ||
type == Meta.WindowType.DOCK ||
type == Meta.WindowType.DESKTOP ||
type == Meta.WindowType.SPLASHSCREEN)

130
js/ui/wobbly.js Normal file
View File

@@ -0,0 +1,130 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
function clampAbs(v, cap) {
if (v > cap)
v = cap;
if (v < -cap)
v = -cap;
return v;
}
const ActorWobbler = new Lang.Class({
Name: 'ActorWobbler',
_init: function(actor) {
this._actor = actor;
this._effect = new Shell.WobblyEffect();
this._actor.add_effect(this._effect);
this._actor._wobbler = this;
this._currentBend = 0;
this._currentHeightOffset = 0;
this._running = false;
this._allocationChangedId = this._actor.connect('allocation-changed', Lang.bind(this, this._allocationChanged));
this._timeline = new Clutter.Timeline({ duration: 100, repeat_count: -1 });
this._timeline.connect('new-frame', Lang.bind(this, this._newFrame));
this._timeline.start();
},
start: function() {
this._running = true;
},
stop: function() {
this._running = false;
},
_destroy: function() {
this._timeline.run_dispose();
this._timeline = null;
this._actor.disconnect(this._allocationChangedId);
this._actor.scale_y = 1.0;
this._actor.remove_effect(this._effect);
this._actor._wobbler = null;
},
_newFrame: function() {
this._step();
},
_step: function() {
const DAMPEN = 0.8;
this._currentBend *= DAMPEN;
if (Math.abs(this._currentBend) < 1)
this._currentBend = 0;
this._currentHeightOffset *= DAMPEN;
if (Math.abs(this._currentHeightOffset) < 1)
this._currentHeightOffset = 0;
// Cap the bend to a 100px shift.
const BEND_CAP = 50;
this._currentBend = clampAbs(this._currentBend, BEND_CAP);
this._effect.set_bend_x(this._currentBend);
// Cap the height change to 25px in either direction.
const HEIGHT_OFFSET_CAP = 25;
this._currentHeightOffset = clampAbs(this._currentHeightOffset, HEIGHT_OFFSET_CAP);
let [minHeight, natHeight] = this._actor.get_preferred_height(-1);
let scale = (natHeight + this._currentHeightOffset) / natHeight;
this._actor.scale_y = scale;
if (!this._running && this._currentBend == 0 && this._currentHeightOffset == 0)
this._destroy();
},
_allocationChanged: function(actor, box, flags) {
if (!this._running)
return;
if (this._oldX) {
let deltaX = box.x1 - this._oldX;
// Every 2px the user moves the window, we bend it by 1px.
this._currentBend -= deltaX / 2;
}
if (this._oldY) {
let deltaY = box.y1 - this._oldY;
// Every 2px the user moves the window, we scale it by 1px.
this._currentHeightOffset -= deltaY / 2;
}
this._oldX = box.x1;
this._oldY = box.y1;
},
});
const WobblyWindowManager = new Lang.Class({
Name: 'WobblyWindowManager',
_init: function() {
global.display.connect('grab-op-begin', Lang.bind(this, this._grabOpBegin));
global.display.connect('grab-op-end', Lang.bind(this, this._grabOpEnd));
},
_grabOpBegin: function(display, screen, window, op) {
if (op != Meta.GrabOp.MOVING)
return;
let actor = window.get_compositor_private();
if (!actor._wobbler)
new ActorWobbler(actor);
actor._wobbler.start();
},
_grabOpEnd: function(display, screen, window, op) {
if (!window)
return;
let actor = window.get_compositor_private();
if (actor._wobbler)
actor._wobbler.stop();
},
});

View File

@@ -254,7 +254,7 @@ const WindowClone = new Lang.Class({
},
_computeBoundingBox: function() {
let rect = this.metaWindow.get_frame_rect();
let rect = this.metaWindow.get_outer_rect();
this.actor.get_children().forEach(function (child) {
let realWindow;
@@ -264,7 +264,7 @@ const WindowClone = new Lang.Class({
realWindow = child.source;
let metaWindow = realWindow.meta_window;
rect = rect.union(metaWindow.get_frame_rect());
rect = rect.union(metaWindow.get_outer_rect());
}, this);
// Convert from a MetaRectangle to a native JS object
@@ -1209,18 +1209,14 @@ const Workspace = new Lang.Class({
return this._windows.length == 0;
},
setReservedSlot: function(metaWindow) {
if (this._reservedSlotWindow == metaWindow)
setReservedSlot: function(clone) {
if (this._reservedSlot == clone)
return;
if (!metaWindow || this.containsMetaWindow(metaWindow)) {
this._reservedSlotWindow = null;
this._reservedSlot = null;
} else {
this._reservedSlotWindow = metaWindow;
this._reservedSlot = this._windows[this._lookupIndex(metaWindow)];
}
if (clone && this.containsMetaWindow(clone.metaWindow))
clone = null;
this._reservedSlot = clone;
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
},
@@ -1818,16 +1814,16 @@ const Workspace = new Lang.Class({
Lang.bind(this, this._onCloneSelected));
clone.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginWindowDrag(clone.metaWindow);
Main.overview.beginWindowDrag(clone);
overlay.hide();
}));
clone.connect('drag-cancelled',
Lang.bind(this, function() {
Main.overview.cancelledWindowDrag(clone.metaWindow);
Main.overview.cancelledWindowDrag(clone);
}));
clone.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endWindowDrag(clone.metaWindow);
Main.overview.endWindowDrag(clone);
overlay.show();
}));
clone.connect('size-changed',

View File

@@ -161,14 +161,14 @@ const WindowClone = new Lang.Class({
_updateDialogPosition: function(realDialog, cloneDialog) {
let metaDialog = realDialog.meta_window;
let dialogRect = metaDialog.get_frame_rect();
let rect = this.metaWindow.get_frame_rect();
let dialogRect = metaDialog.get_outer_rect();
let rect = this.metaWindow.get_outer_rect();
cloneDialog.set_position(dialogRect.x - rect.x, dialogRect.y - rect.y);
},
_onPositionChanged: function() {
let rect = this.metaWindow.get_frame_rect();
let rect = this.metaWindow.get_outer_rect();
this.actor.set_position(this.realWindow.x, this.realWindow.y);
},
@@ -518,15 +518,15 @@ const WorkspaceThumbnail = new Lang.Class({
}));
clone.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginWindowDrag(clone.metaWindow);
Main.overview.beginWindowDrag(clone);
}));
clone.connect('drag-cancelled',
Lang.bind(this, function() {
Main.overview.cancelledWindowDrag(clone.metaWindow);
Main.overview.cancelledWindowDrag(clone);
}));
clone.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endWindowDrag(clone.metaWindow);
Main.overview.endWindowDrag(clone);
}));
this._contents.add_actor(clone.actor);
@@ -795,13 +795,35 @@ const ThumbnailsBox = new Lang.Class({
let isWindow = !!source.realWindow;
// To create a new workspace, we first slide all the windows on workspaces
// below us to the next workspace, leaving a blank workspace for us to recycle.
let newWorkspaceIndex;
[newWorkspaceIndex, this._dropPlaceholderPos] = [this._dropPlaceholderPos, -1];
// Nab all the windows below us.
let windows = global.get_window_actors().filter(function(winActor) {
// If the window is attached to an ancestor, we don't need/want to move it
let window = winActor.meta_window;
if (window.get_transient_for() != null)
return false;
if (isWindow)
return window.get_workspace().index() >= newWorkspaceIndex && winActor != source;
else
return window.get_workspace().index() >= newWorkspaceIndex;
});
this._spliceIndex = newWorkspaceIndex;
Main.wm.insertWorkspace(newWorkspaceIndex);
// ... move them down one.
windows.forEach(function(winActor) {
let window = winActor.meta_window;
window.change_workspace_by_index(window.get_workspace().index() + 1, true);
});
if (isWindow) {
// ... and bam, a workspace, good as new.
// Move the window to our monitor first if necessary.
let thumbMonitor = this._thumbnails[newWorkspaceIndex].monitorIndex;
if (source.metaWindow.get_monitor() != thumbMonitor)

View File

@@ -18,6 +18,8 @@ const Workspace = imports.ui.workspace;
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
const WORKSPACE_SWITCH_TIME = 0.25;
// Note that mutter has a compile-time limit of 36
const MAX_WORKSPACES = 16;
const AnimationType = {
ZOOM: 0,
@@ -61,9 +63,9 @@ const WorkspacesViewBase = new Lang.Class({
}
},
_dragBegin: function(overview, window) {
_dragBegin: function(overview, clone) {
this._inDrag = true;
this._setReservedSlot(window);
this._setReservedSlot(clone);
},
_dragEnd: function() {
@@ -125,9 +127,9 @@ const WorkspacesView = new Lang.Class({
Lang.bind(this, this._activeWorkspaceChanged));
},
_setReservedSlot: function(window) {
_setReservedSlot: function(clone) {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(window);
this._workspaces[i].setReservedSlot(clone);
},
_syncFullGeometry: function() {
@@ -364,8 +366,8 @@ const ExtraWorkspaceView = new Lang.Class({
this.actor.add_actor(this._workspace.actor);
},
_setReservedSlot: function(window) {
this._workspace.setReservedSlot(window);
_setReservedSlot: function(clone) {
this._workspace.setReservedSlot(clone);
},
_syncFullGeometry: function() {

View File

@@ -45,7 +45,6 @@ mk
mr
ms
nb
ne
nl
nn
or
@@ -68,7 +67,6 @@ th
tr
ug
uk
uz@cyrillic
vi
zh_CN
zh_HK

1794
po/af.po

File diff suppressed because it is too large Load Diff

984
po/an.po

File diff suppressed because it is too large Load Diff

1015
po/ar.po

File diff suppressed because it is too large Load Diff

332
po/as.po
View File

@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-09-15 07:36+0000\n"
"PO-Revision-Date: 2014-09-15 14:59+0530\n"
"POT-Creation-Date: 2014-08-13 07:33+0000\n"
"PO-Revision-Date: 2014-08-13 17:32+0530\n"
"Last-Translator: Nilamdyuti Goswami <ngoswami@redhat.com>\n"
"Language-Team: Assamese <kde-i18n-doc@kde.org>\n"
"Language: as_IN\n"
@@ -110,9 +110,8 @@ msgid ""
"load all extensions regardless of the versions they claim to support."
msgstr ""
"GNOME শ্বেলে কেৱল বৰ্তমান চলি থকা সংস্কৰণক সমৰ্থন কৰা সম্প্ৰসাৰনসমূহ ল'ড "
"কৰিব। এই "
"বিকল্প সামৰ্থবান কৰিলে এই নিৰক্ষণ অসামৰ্থবান কৰা হব আৰু সিহতে সমৰ্থন কৰা "
"সংস্কৰণসমূহৰ নিৰপেক্ষে সকলো সম্প্ৰসাৰন ল'ড কৰিব।"
"কৰিব। এই বিকল্প সামৰ্থবান কৰিলে এই নিৰীক্ষণ অসামৰ্থবান কৰা হব আৰু সিহতে "
"মৰ্থন কৰা সংস্কৰণসমূহৰ নিৰপেক্ষে সকলো সম্প্ৰসাৰন ল'ড কৰিব।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
@@ -158,8 +157,8 @@ msgstr ""
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"ইনক্ৰিপ্টেড অথবা দূৰৱৰ্তী ফাইলচিস্টেমসমূহ মাউ্ট কৰাৰ বাবে পাছৱৰ্ড মনত ৰখা হব "
"নে"
"ইনক্ৰিপ্টেড অথবা দূৰৱৰ্তী ফাইলচিস্টেমসমূহ মাউ্ট কৰাৰ বাবে পাছৱৰ্ড মনত ৰখা "
"হব নে"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid ""
@@ -170,11 +169,10 @@ msgid ""
msgstr ""
"শ্বেলে এটা পাছৱৰ্ড অনুৰোধ কৰিব যেতিয়া এটা ইনক্ৰিপ্টেড ডিভাইচ অথবা এটা "
"দূৰৱৰ্তী "
"ফাইলচিস্টেম মাউ্ট কৰা হয়। যদি পাছৱৰ্ডক ভৱিষ্যত ব্যৱহাৰৰ বাবে সংৰক্ষণ কৰিব "
"ফাইলচিস্টেম মাউ্ট কৰা হয়। যদি পাছৱৰ্ডক ভৱিষ্যত ব্যৱহাৰৰ বাবে সংৰক্ষণ কৰিব "
"পাৰি "
"তেন্তে এটা 'পাছৱৰ্ড মনত ৰাখক' চেকবাকচ উপস্থিত থাকিব। এই কি'য়ে চেকবাকচৰ "
"অবিকল্পিত "
"অৱস্থা সংহতি কৰে।"
"অবিকল্পিত অৱস্থা সংহতি কৰে।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar"
@@ -250,8 +248,7 @@ msgid ""
"shown in the switcher. Otherwise, all applications are included."
msgstr ""
"যদি সত্য, কেৱল বৰ্তমান কাৰ্য্যস্থানক উইন্ডো থকা এপ্লিকেচনসমূক চুইচাৰত দেখুৱা "
"হব। নহলে, "
"সকলো এপ্লিকেচন অন্তৰ্ভুক্ত কৰা হয়।"
"হব। নহলে, সকলো এপ্লিকেচন অন্তৰ্ভুক্ত কৰা হয়।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "The application icon mode."
@@ -274,8 +271,7 @@ msgid ""
"Otherwise, all windows are included."
msgstr ""
"যদি সত্য, কেৱল বৰ্তমান কাৰ্য্যস্থানৰ পৰা উইন্ডোসমূহক চুইচাৰত দেখুৱা হব। নহলে, "
"সকলো "
"উইন্ডো অন্তৰ্ভুক্ত কৰা হব।"
"সকলো উইন্ডো অন্তৰ্ভুক্ত কৰা হব।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Attach modal dialog to the parent window"
@@ -307,17 +303,18 @@ msgstr ""
msgid "Captive Portal"
msgstr "কেপটিভ পৰ্টেল"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:127
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "%s ৰ বাবে পছন্দসমূহ ডাইলগ ল'ড কৰোতে এটা ত্ৰুটি হৈছিল:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:159
#| msgid "Configure GNOME Shell Extensions"
msgid "GNOME Shell Extensions"
msgstr "GNOME শ্বেল সম্প্ৰসাৰনসমূহ"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@@ -380,44 +377,46 @@ msgstr "কমান্ড বিশ্লেষন কৰিব নোৱাৰ
msgid "Execution of “%s” failed:"
msgstr "“%s” ৰ প্ৰেৰণ ব্যৰ্থ হল:"
#: ../js/portalHelper/main.js:85
#: ../js/portalHelper/main.js:84
#| msgid "Authentication Required"
msgid "Web Authentication Redirect"
msgstr "ৱেব প্ৰমাণীকৰণৰ পুনৰনিৰ্দেশ"
#: ../js/ui/appDisplay.js:772
#: ../js/ui/appDisplay.js:659
msgid "Frequently used applications will appear here"
msgstr "সঘনে ব্যৱহাৰ কৰা এপ্লিকেচনসমূহ ইয়াত উপস্থিত হব"
#: ../js/ui/appDisplay.js:883
#: ../js/ui/appDisplay.js:770
msgid "Frequent"
msgstr "সঘন"
#: ../js/ui/appDisplay.js:890
#: ../js/ui/appDisplay.js:777
msgid "All"
msgstr "সকলো"
#: ../js/ui/appDisplay.js:1789
#: ../js/ui/appDisplay.js:1649
msgid "New Window"
msgstr "নতুন উইন্ডো"
#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1672 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "পছন্দৰ পৰা আতৰাওক"
#: ../js/ui/appDisplay.js:1821
#: ../js/ui/appDisplay.js:1678
msgid "Add to Favorites"
msgstr "পছন্দলে যোগ কৰক"
#: ../js/ui/appDisplay.js:1830
#: ../js/ui/appDisplay.js:1687
#| msgid "Show Text"
msgid "Show Details"
msgstr "বিৱৰণসমূহ দেখুৱাওক"
#: ../js/ui/appFavorites.js:124
#: ../js/ui/appFavorites.js:122
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s ক আপোনাৰ পছন্দলে যোগ কৰা হৈছে।"
#: ../js/ui/appFavorites.js:158
#: ../js/ui/appFavorites.js:156
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s ক আপোনাৰ পছন্দৰ পৰা আতৰোৱা হৈছে।"
@@ -609,11 +608,11 @@ msgstr "%s ৰ সৈতে খোলক"
msgid "Eject"
msgstr "উলিৱাওক"
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "পাছৱৰ্ড:"
#: ../js/ui/components/keyring.js:120
#: ../js/ui/components/keyring.js:113
msgid "Type again:"
msgstr "আকৌ টাইপ কৰক:"
@@ -656,7 +655,8 @@ msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr ""
"বেতাঁৰ নেটৱৰ্ক “%s” অভিগম কৰিবলে পাছৱৰ্ডসমূহ অথবা ইনক্ৰিপষণ কি'সমূহৰ প্ৰয়োজন।"
"বেতাঁৰ নেটৱৰ্ক “%s” অভিগম কৰিবলে পাছৱৰ্ডসমূহ অথবা ইনক্ৰিপষণ কি'সমূহৰ "
"প্ৰয়োজন।"
#: ../js/ui/components/networkAgent.js:323
msgid "Wired 802.1X authentication"
@@ -736,77 +736,89 @@ msgid "Mute"
msgstr "মোন কৰক"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:953
#: ../js/ui/components/telepathyClient.js:957
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:960
#: ../js/ui/components/telepathyClient.js:964
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgid "Yesterday, %H%M"
msgstr "যোৱাকালী, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:967
#: ../js/ui/components/telepathyClient.js:971
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%A, %H%M"
msgstr "%A, %H%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */
#: ../js/ui/components/telepathyClient.js:974
#: ../js/ui/components/telepathyClient.js:978
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%B %d, %H%M"
msgstr "%B %d, %H%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" */
#: ../js/ui/components/telepathyClient.js:980
#: ../js/ui/components/telepathyClient.js:984
msgid "%B %d %Y, %H%M"
msgstr "%B %d %Y, %H%M"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:986
#: ../js/ui/components/telepathyClient.js:990
#| msgctxt "event list time"
#| msgid "%l%M%p"
msgid "%l%M %p"
msgstr "%l%M %p"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:993
#: ../js/ui/components/telepathyClient.js:997
msgid "Yesterday, %l%M %p"
msgstr "যোৱাকালী, %l%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1000
#: ../js/ui/components/telepathyClient.js:1004
#| msgid "%a %l:%M %p"
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1007
#: ../js/ui/components/telepathyClient.js:1011
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d, %l%M %p"
msgstr "%B %d, %l%M %p"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1013
#: ../js/ui/components/telepathyClient.js:1017
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d %Y, %l%M %p"
msgstr "%B %d %Y, %l%M %p"
#. Translators: this is the other person changing their old IM name to their new
#. IM name. */
#: ../js/ui/components/telepathyClient.js:1045
#: ../js/ui/components/telepathyClient.js:1049
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s এতিয়া %s হিচাপে জনাজাত"
#. translators: argument is a room name like
#. * room@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1149
#: ../js/ui/components/telepathyClient.js:1153
#, javascript-format
msgid "Invitation to %s"
msgstr "%s লে নিমন্ত্ৰণ"
@@ -814,38 +826,38 @@ msgstr "%s লে নিমন্ত্ৰণ"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. */
#: ../js/ui/components/telepathyClient.js:1157
#: ../js/ui/components/telepathyClient.js:1161
#, javascript-format
msgid "%s is inviting you to join %s"
msgstr "%s এ আপোনাক %s ত অংশগ্ৰহণ কৰিবলে আমন্ত্ৰণ জনাইছে"
#: ../js/ui/components/telepathyClient.js:1159
#: ../js/ui/components/telepathyClient.js:1194
#: ../js/ui/components/telepathyClient.js:1228
#: ../js/ui/components/telepathyClient.js:1286
#: ../js/ui/components/telepathyClient.js:1163
#: ../js/ui/components/telepathyClient.js:1198
#: ../js/ui/components/telepathyClient.js:1232
#: ../js/ui/components/telepathyClient.js:1290
msgid "Decline"
msgstr "নাকচ কৰক"
#: ../js/ui/components/telepathyClient.js:1165
#: ../js/ui/components/telepathyClient.js:1234
#: ../js/ui/components/telepathyClient.js:1291
#: ../js/ui/components/telepathyClient.js:1169
#: ../js/ui/components/telepathyClient.js:1238
#: ../js/ui/components/telepathyClient.js:1295
msgid "Accept"
msgstr "গ্ৰহন কৰক"
#. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1184
#: ../js/ui/components/telepathyClient.js:1188
#, javascript-format
msgid "Video call from %s"
msgstr "%s ৰ পৰা ভিডিঅ' কল"
#. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1187
#: ../js/ui/components/telepathyClient.js:1191
#, javascript-format
msgid "Call from %s"
msgstr "%s ৰ পৰা কল"
#. translators: this is a button label (verb), not a noun */
#: ../js/ui/components/telepathyClient.js:1201
#: ../js/ui/components/telepathyClient.js:1205
msgid "Answer"
msgstr "উত্তৰ দিয়ক"
@@ -854,110 +866,110 @@ msgstr "উত্তৰ দিয়ক"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#. */
#: ../js/ui/components/telepathyClient.js:1222
#: ../js/ui/components/telepathyClient.js:1226
#, javascript-format
msgid "%s is sending you %s"
msgstr "%s এ আপোনাক %s পঠাই আছে"
#. To translators: The parameter is the contact's alias */
#: ../js/ui/components/telepathyClient.js:1251
#: ../js/ui/components/telepathyClient.js:1255
#, javascript-format
msgid "%s would like permission to see when you are online"
msgstr "আপুনি কেতিয়া অনলাইন আছে চাবলে %s এ অনুমতি বিচাৰিব"
#: ../js/ui/components/telepathyClient.js:1337
#: ../js/ui/components/telepathyClient.js:1341
msgid "Network error"
msgstr "নেটৱৰ্ক ত্ৰুটি"
#: ../js/ui/components/telepathyClient.js:1339
#: ../js/ui/components/telepathyClient.js:1343
msgid "Authentication failed"
msgstr "প্ৰমাণীকৰণ ব্যৰ্থ"
#: ../js/ui/components/telepathyClient.js:1341
#: ../js/ui/components/telepathyClient.js:1345
msgid "Encryption error"
msgstr "ইনক্ৰিপষণ ত্ৰুটি"
#: ../js/ui/components/telepathyClient.js:1343
#: ../js/ui/components/telepathyClient.js:1347
msgid "Certificate not provided"
msgstr "প্ৰমাণপত্ৰ প্ৰদান কৰা হোৱা নাই"
#: ../js/ui/components/telepathyClient.js:1345
#: ../js/ui/components/telepathyClient.js:1349
msgid "Certificate untrusted"
msgstr "প্ৰমাণপত্ৰক ভৰষা কৰিব নোৱাৰি"
#: ../js/ui/components/telepathyClient.js:1347
#: ../js/ui/components/telepathyClient.js:1351
msgid "Certificate expired"
msgstr "প্ৰমাণপত্ৰৰ অৱসান ঘটিছে"
#: ../js/ui/components/telepathyClient.js:1349
#: ../js/ui/components/telepathyClient.js:1353
msgid "Certificate not activated"
msgstr "প্ৰমাণপত্ৰ সক্ৰিয় কৰা হোৱা নাই"
#: ../js/ui/components/telepathyClient.js:1351
#: ../js/ui/components/telepathyClient.js:1355
msgid "Certificate hostname mismatch"
msgstr "প্ৰমাণপত্ৰ হস্টনাম অমিল"
#: ../js/ui/components/telepathyClient.js:1353
#: ../js/ui/components/telepathyClient.js:1357
msgid "Certificate fingerprint mismatch"
msgstr "প্ৰমাণপত্ৰ ফিংগাৰপ্ৰি্ট অমিল"
msgstr "প্ৰমাণপত্ৰ ফিংগাৰপ্ৰি্ট অমিল"
#: ../js/ui/components/telepathyClient.js:1355
#: ../js/ui/components/telepathyClient.js:1359
msgid "Certificate self-signed"
msgstr "প্ৰমাণপত্ৰ স্ব-স্বাক্ষৰীত"
#: ../js/ui/components/telepathyClient.js:1357
#: ../js/ui/components/telepathyClient.js:1361
msgid "Status is set to offline"
msgstr "অৱস্থা অফলাইনলে সংহতি কৰা হৈছে"
#: ../js/ui/components/telepathyClient.js:1359
#: ../js/ui/components/telepathyClient.js:1363
msgid "Encryption is not available"
msgstr "ইনক্ৰিপষণ উপলব্ধ নহয়"
#: ../js/ui/components/telepathyClient.js:1361
#: ../js/ui/components/telepathyClient.js:1365
msgid "Certificate is invalid"
msgstr "প্ৰমাণপত্ৰ অবৈধ"
#: ../js/ui/components/telepathyClient.js:1363
#: ../js/ui/components/telepathyClient.js:1367
msgid "Connection has been refused"
msgstr "সংযোগ নাকচ কৰা হৈছে"
#: ../js/ui/components/telepathyClient.js:1365
#: ../js/ui/components/telepathyClient.js:1369
msgid "Connection can't be established"
msgstr "সংযোগ স্থাপন কৰিব নোৱাৰি"
#: ../js/ui/components/telepathyClient.js:1367
#: ../js/ui/components/telepathyClient.js:1371
msgid "Connection has been lost"
msgstr "সংযোগ হেৰাইছে"
#: ../js/ui/components/telepathyClient.js:1369
#: ../js/ui/components/telepathyClient.js:1373
msgid "This account is already connected to the server"
msgstr "এই একাও্ট ইতিমধ্যে চাৰ্ভাৰৰ সৈতে সংযোগিত"
msgstr "এই একাও্ট ইতিমধ্যে চাৰ্ভাৰৰ সৈতে সংযোগিত"
#: ../js/ui/components/telepathyClient.js:1371
#: ../js/ui/components/telepathyClient.js:1375
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr "সংযোগক একে সম্পদ ব্যৱহাৰ কৰি এটা নতুন সংযোগৰে প্ৰতিস্থাপন কৰা হৈছে"
#: ../js/ui/components/telepathyClient.js:1373
#: ../js/ui/components/telepathyClient.js:1377
msgid "The account already exists on the server"
msgstr "একাও্ট ইতিমধ্যে চাৰ্ভাৰত উপস্থিত"
msgstr "একাও্ট ইতিমধ্যে চাৰ্ভাৰত উপস্থিত"
#: ../js/ui/components/telepathyClient.js:1375
#: ../js/ui/components/telepathyClient.js:1379
msgid "Server is currently too busy to handle the connection"
msgstr "চাৰ্ভাৰ সংযোগ ব্যৱস্থাপনা কৰিবলে বৰ্তমানে অতি ব্যস্ত"
#: ../js/ui/components/telepathyClient.js:1377
#: ../js/ui/components/telepathyClient.js:1381
msgid "Certificate has been revoked"
msgstr "প্ৰমাণপত্ৰ প্ৰত্যাহাৰ কৰা হৈছে"
#: ../js/ui/components/telepathyClient.js:1379
#: ../js/ui/components/telepathyClient.js:1383
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"প্ৰমাণপত্ৰয় এটা অসুৰক্ষিত চিফাৰ এলগৰিথম ব্যৱহাৰ কৰে অথবা ক্ৰিপ্টোগ্ৰাফিয়ভাৱে "
"দুৰ্বল"
#: ../js/ui/components/telepathyClient.js:1381
#: ../js/ui/components/telepathyClient.js:1385
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
@@ -966,26 +978,26 @@ msgstr ""
"ক্ৰিপ্টোগ্ৰাফী "
"লাইব্ৰেৰীয়ে প্ৰণয়ন কৰা সীমাসমূহত অতিক্ৰম কৰে"
#: ../js/ui/components/telepathyClient.js:1383
#: ../js/ui/components/telepathyClient.js:1387
msgid "Internal error"
msgstr "অভ্যন্তৰীক ত্ৰুটি"
#. translators: argument is the account name, like
#. * name@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1393
#: ../js/ui/components/telepathyClient.js:1397
#, javascript-format
msgid "Unable to connect to %s"
msgstr "%s ৰ সৈতে সংযোগ কৰিবলে অক্ষম"
#: ../js/ui/components/telepathyClient.js:1398
#: ../js/ui/components/telepathyClient.js:1402
msgid "View account"
msgstr "একাও্ট দৰ্শন কৰক"
msgstr "একাও্ট দৰ্শন কৰক"
#: ../js/ui/components/telepathyClient.js:1435
#: ../js/ui/components/telepathyClient.js:1439
msgid "Unknown reason"
msgstr "অজ্ঞাত কাৰণ"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
msgid "Windows"
msgstr "উইন্ডোসমূহ"
@@ -1016,86 +1028,86 @@ msgstr "তাৰিখ আৰু সময সংহতিসমূহ"
msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:64
#: ../js/ui/endSessionDialog.js:66
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "%s ক লগ আউট কৰক"
#: ../js/ui/endSessionDialog.js:65
#: ../js/ui/endSessionDialog.js:67
msgctxt "title"
msgid "Log Out"
msgstr "লগ আউট কৰক"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:69
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s স্বচালিতভাৱে %d ছেকেণ্ডৰ পিছত লগ আউট হৈ যাব।"
msgstr[1] "%s স্বচালিতভাৱে %d ছেকেণ্ডৰ পিছত লগ আউট হৈ যাব।"
#: ../js/ui/endSessionDialog.js:72
#: ../js/ui/endSessionDialog.js:74
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "আপুনি স্বচালিতভাৱে %d ছেকেণ্ড পিছত লগ আউট হৈ যাব।"
msgstr[1] "আপুনি স্বচালিতভাৱে %d ছেকেণ্ড পিছত লগ আউট হৈ যাব।"
#: ../js/ui/endSessionDialog.js:78
#: ../js/ui/endSessionDialog.js:80
msgctxt "button"
msgid "Log Out"
msgstr "লগ আউট কৰক"
#: ../js/ui/endSessionDialog.js:84
#: ../js/ui/endSessionDialog.js:86
msgctxt "title"
msgid "Power Off"
msgstr "বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:87
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "আপডেইটসমূহ ইনস্টল কৰি চিস্টেম বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:89
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "চিস্টেম %d ছেকেণ্ড পিছত স্বচালিতভাৱে বন্ধ কৰক হব। "
msgstr[1] "চিস্টেম %d ছেকেণ্ডৰ পিছত স্বচালিতভাৱে বন্ধ হব। "
#: ../js/ui/endSessionDialog.js:91
#: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "বাকি থকা চফ্টৱেৰ আপডেইটসমূহ ইনস্টল কৰক"
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
msgctxt "button"
msgid "Restart"
msgstr "পুনৰাম্ভ কৰক"
#: ../js/ui/endSessionDialog.js:96
#: ../js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Power Off"
msgstr "বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:103
#: ../js/ui/endSessionDialog.js:105
msgctxt "title"
msgid "Restart"
msgstr "পুনৰাম্ভ কৰক"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:107
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব।"
msgstr[1] "চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব।"
#: ../js/ui/endSessionDialog.js:119
#: ../js/ui/endSessionDialog.js:121
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "পুনাৰম্ভ কৰক আৰু আপডেইটসমূহ ইনস্টল কৰক"
#: ../js/ui/endSessionDialog.js:121
#: ../js/ui/endSessionDialog.js:123
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@@ -1105,44 +1117,46 @@ msgstr[0] ""
msgstr[1] ""
"চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব আৰু আপডেইটসমূহ ইনস্টল কৰিব।"
#: ../js/ui/endSessionDialog.js:127
#: ../js/ui/endSessionDialog.js:129
#| msgctxt "button"
#| msgid "Restart & Install"
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "পুনৰাম্ভ কৰক &amp; ইনস্টল কৰক"
#: ../js/ui/endSessionDialog.js:128
#: ../js/ui/endSessionDialog.js:130
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "ইনস্টল কৰক &amp; চিস্টেম বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:131
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "আপডেইটসমূহ ইনস্টল কৰাৰ পিছত চিস্টেম বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:338
#: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"বেটাৰি শক্তিত চলি আছে: অনুগ্ৰহ কৰি আপডেইটসমূহ ইনস্টল কৰাৰ আগত চাৰ্জাৰ লগাওক।"
#: ../js/ui/endSessionDialog.js:355
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
msgstr ""
"কিছুমান এপ্লিকেচন ব্যস্ত হব পাৰে অথবা সিহতৰ কিছুমান অসংৰক্ষিত কাৰ্য্য থাকিব "
"পাৰে।"
#: ../js/ui/endSessionDialog.js:362
#: ../js/ui/endSessionDialog.js:339
msgid "Other users are logged in."
msgstr "অন্য ব্যৱহাৰকাৰীসকল লগ্ড ইন আছে।"
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:640
#: ../js/ui/endSessionDialog.js:619
#, javascript-format
msgid "%s (remote)"
msgstr "%s (দূৰৱৰ্তী)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:643
#: ../js/ui/endSessionDialog.js:622
#, javascript-format
msgid "%s (console)"
msgstr "%s (কনচৌল)"
@@ -1156,7 +1170,7 @@ msgstr "ইনস্টল কৰক"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org ৰ পৰা “%s” ক ডাউনল'ড আৰু ইনস্টল কৰিব নে?"
#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
msgid "Keyboard"
msgstr "কিবৰ্ড"
@@ -1178,8 +1192,8 @@ msgstr "ত্ৰুটিসমূহ লুকুৱাওক"
msgid "Show Errors"
msgstr "ত্ৰুটিসমূহ দেখুৱাওক"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:164
msgid "Enabled"
msgstr "সামৰ্থবান কৰা আছে"
@@ -1187,7 +1201,7 @@ msgstr "সামৰ্থবান কৰা আছে"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:167
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "অসামৰ্থবান কৰা আছে"
@@ -1212,39 +1226,39 @@ msgstr "উৎস দৰ্শন কৰক"
msgid "Web Page"
msgstr "ৱেব পৃষ্ঠা"
#: ../js/ui/messageTray.js:1326
#: ../js/ui/messageTray.js:1325
msgid "Open"
msgstr "খোলক"
#: ../js/ui/messageTray.js:1333
#: ../js/ui/messageTray.js:1332
msgid "Remove"
msgstr "আতৰাওক"
#: ../js/ui/messageTray.js:1630
#: ../js/ui/messageTray.js:1629
msgid "Notifications"
msgstr "অধিসূচনাসমূহ"
#: ../js/ui/messageTray.js:1637
#: ../js/ui/messageTray.js:1636
msgid "Clear Messages"
msgstr "বাৰ্তাসমূহ পৰিষ্কাৰ কৰক"
#: ../js/ui/messageTray.js:1656
#: ../js/ui/messageTray.js:1655
msgid "Notification Settings"
msgstr "অধিসূচনা সংহতিসমূহ"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1708
msgid "Tray Menu"
msgstr "ট্ৰে মেনু"
#: ../js/ui/messageTray.js:1926
#: ../js/ui/messageTray.js:1925
msgid "No Messages"
msgstr "কোনো বাৰ্তা নাই"
#: ../js/ui/messageTray.js:1968
#: ../js/ui/messageTray.js:1963
msgid "Message Tray"
msgstr "বাৰ্তা ট্ৰে"
#: ../js/ui/messageTray.js:2971
#: ../js/ui/messageTray.js:2966
msgid "System Information"
msgstr "চিস্টেম তথ্য"
@@ -1272,7 +1286,7 @@ msgstr "অভাৰভিউ"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:246
#: ../js/ui/overview.js:250
msgid "Type to search…"
msgstr "সন্ধান কৰিবলে টাইপ কৰক…"
@@ -1290,7 +1304,7 @@ msgstr "কাৰ্য্যসমূহ"
msgid "Top Bar"
msgstr "উপৰৰ বাৰ"
#: ../js/ui/popupMenu.js:269
#: ../js/ui/popupMenu.js:280
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@@ -1302,7 +1316,8 @@ msgstr "এটা কমান্ড সুমুৱাওক"
msgid "Close"
msgstr "বন্ধ কৰক"
#: ../js/ui/runDialog.js:277
#: ../js/ui/runDialog.js:273
#| msgid "Estimating…"
msgid "Restarting…"
msgstr "পুনাৰম্ভ কৰা হৈছে…"
@@ -1319,43 +1334,43 @@ msgid_plural "%d new notifications"
msgstr[0] "%d নতুন অধিসূচনা"
msgstr[1] "%d নতুন অধিসূচনাসমূহ"
#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:345
msgid "Lock"
msgstr "লক কৰক"
#: ../js/ui/screenShield.js:706
#: ../js/ui/screenShield.js:708
msgid "GNOME needs to lock the screen"
msgstr "GNOME এ পৰ্দা লক কৰিব লাগিব"
#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1306
msgid "Unable to lock"
msgstr "লক কৰিবলে অক্ষম"
#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1307
msgid "Lock was blocked by an application"
msgstr "লক কাৰ্য্য এটা এপ্লিকেচন দ্বাৰা প্ৰতিৰোধ কৰা হৈছিল"
#: ../js/ui/search.js:594
#: ../js/ui/search.js:614
msgid "Searching…"
msgstr "সন্ধান কৰা হৈছে…"
#: ../js/ui/search.js:596
#: ../js/ui/search.js:660
msgid "No results."
msgstr "কোনো ফলাফল নাই।"
#: ../js/ui/shellEntry.js:25
#: ../js/ui/shellEntry.js:27
msgid "Copy"
msgstr "কপি কৰক"
#: ../js/ui/shellEntry.js:30
#: ../js/ui/shellEntry.js:32
msgid "Paste"
msgstr "পেইস্ট কৰক"
#: ../js/ui/shellEntry.js:97
#: ../js/ui/shellEntry.js:99
msgid "Show Text"
msgstr "লিখনি দেখুৱাওক"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:101
msgid "Hide Text"
msgstr "লিখনি লুকুৱাওক"
@@ -1441,28 +1456,26 @@ msgstr "সংযুক্ত নহয়"
msgid "Brightness"
msgstr "উজ্জ্বলতা"
#: ../js/ui/status/keyboard.js:547
#: ../js/ui/status/keyboard.js:407
msgid "Show Keyboard Layout"
msgstr "কিবৰ্ড বিন্যাস দেখুৱাওক"
#: ../js/ui/status/location.js:65
#: ../js/ui/status/location.js:56
#| msgid "Notifications"
msgid "Location"
msgstr "অবস্থান"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:165
#| msgid "Disabled"
msgid "Disable"
msgstr "অসামৰ্থবান কৰক"
#: ../js/ui/status/location.js:73
#| msgid "Power Settings"
msgid "Privacy Settings"
msgstr "গোপনীয়তা সংহতিসমূহ"
#: ../js/ui/status/location.js:176
#: ../js/ui/status/location.js:164
msgid "In Use"
msgstr "ব্যৱহৃত"
#: ../js/ui/status/location.js:180
#: ../js/ui/status/location.js:168
#| msgid "Enabled"
msgid "Enable"
msgstr "সামৰ্থবান কৰক"
@@ -1476,31 +1489,37 @@ msgid "Off"
msgstr "অফ"
#: ../js/ui/status/network.js:459
#| msgid "Connect"
msgid "Connected"
msgstr "সংযুক্ত"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:463
#| msgid "unmanaged"
msgid "Unmanaged"
msgstr "অব্যৱস্থাপিত"
#: ../js/ui/status/network.js:465
#| msgid "disconnecting..."
msgid "Disconnecting"
msgstr "বিচ্ছিনিত কৰা হৈছে"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#| msgid "Connection"
msgid "Connecting"
msgstr "সংযোগ কৰা হৈছে"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#| msgid "authentication required"
msgid "Authentication required"
msgstr "প্ৰমাণীকৰণৰ প্ৰয়োজন"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:482
#| msgid "firmware missing"
msgid "Firmware missing"
msgstr "ফাৰ্মৱেৰ সন্ধানহীন"
@@ -1604,6 +1623,7 @@ msgid "Network Settings"
msgstr "নেটৱৰ্ক সংহতিসমূহ"
#: ../js/ui/status/network.js:1482
#| msgid "Settings"
msgid "VPN Settings"
msgstr "VPN সংহতিসমূহ"
@@ -1697,11 +1717,11 @@ msgstr "অন্য ব্যৱহাৰকাৰী হিচাপে লগ
msgid "Unlock Window"
msgstr "উইন্ডো আনলক কৰক"
#: ../js/ui/viewSelector.js:158
#: ../js/ui/viewSelector.js:232
msgid "Applications"
msgstr "এপ্লিকেচনসমূহ"
#: ../js/ui/viewSelector.js:162
#: ../js/ui/viewSelector.js:236
msgid "Search"
msgstr "সন্ধান কৰক"
@@ -1798,19 +1818,19 @@ msgstr[1] "%u ইনপুটসমূহ"
msgid "System Sounds"
msgstr "চিস্টেম শব্দসমূহ"
#: ../src/main.c:373
#: ../src/main.c:371
msgid "Print version"
msgstr "প্ৰি্ট সংস্কৰণ"
msgstr "প্ৰি্ট সংস্কৰণ"
#: ../src/main.c:379
#: ../src/main.c:377
msgid "Mode used by GDM for login screen"
msgstr "লগিন স্ক্ৰিনৰ বাবে GDM দ্বাৰা ব্যৱহাৰ কৰা অৱস্থা"
#: ../src/main.c:385
#: ../src/main.c:383
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "লগিন পৰ্দাৰ বাবে এটা বিশেষ অৱস্থা, উদাহৰণস্বৰূপ \"gdm\" ব্যৱহাৰ কৰক"
#: ../src/main.c:391
#: ../src/main.c:389
msgid "List possible modes"
msgstr "সম্ভাব্য অৱস্থাসমূহ তালিকাভুক্ত কৰক"
@@ -2014,7 +2034,7 @@ msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰক
#~ "সংহিত, অবিকল্পিত পাইপলাইন ব্যৱহাৰ কৰা হব। এইটো বৰ্তমানত 'vp8enc "
#~ "min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads="
#~ "%T ! queue ! webmmux' আৰু VP8 কডেক ব্যৱহাৰ কৰি WEBM ত ৰেকৰ্ড কৰে। %T ক "
#~ "চিস্টেমত অনুকূলিত থ্ৰেড কাও্টত এটা অনুমানৰ প্লেইচহল্ডাৰ হিচাপে ব্যৱহাৰ কৰা হয়।"
#~ "চিস্টেমত অনুকূলিত থ্ৰেড কাও্টত এটা অনুমানৰ প্লেইচহল্ডাৰ হিচাপে ব্যৱহাৰ কৰা হয়।"
#~ msgid "File extension used for storing the screencast"
#~ msgstr "screencast সংৰক্ষণ কৰাৰ কাৰণে লথিপত্ৰ সম্প্ৰসাৰন"
@@ -2297,7 +2317,7 @@ msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰক
#~ msgstr "চিস্টেম সংহতিসমূহ"
#~ msgid "Failed to unmount '%s'"
#~ msgstr "'%s' আনমাউ্ট কৰিবলে ব্যৰ্থ"
#~ msgstr "'%s' আনমাউ্ট কৰিবলে ব্যৰ্থ"
#~ msgid "Retry"
#~ msgstr "পুনৰ চেষ্টা কৰক"
@@ -2375,7 +2395,7 @@ msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰক
#~ msgstr "বন্ধ কৰক"
#~ msgid "Online Accounts"
#~ msgstr "অনলাইন একাও্টসমূহ"
#~ msgstr "অনলাইন একাও্টসমূহ"
#~ msgid "Lock Screen"
#~ msgstr "পৰ্দা লক কৰক"

1765
po/bg.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

928
po/ca.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

707
po/cs.po

File diff suppressed because it is too large Load Diff

1198
po/da.po

File diff suppressed because it is too large Load Diff

708
po/de.po

File diff suppressed because it is too large Load Diff

410
po/el.po

File diff suppressed because it is too large Load Diff

583
po/es.po

File diff suppressed because it is too large Load Diff

587
po/eu.po

File diff suppressed because it is too large Load Diff

207
po/fa.po
View File

@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-10-06 19:42+0000\n"
"PO-Revision-Date: 2014-10-10 10:51+0330\n"
"POT-Creation-Date: 2014-08-28 07:38+0000\n"
"PO-Revision-Date: 2014-08-28 20:57+0430\n"
"Last-Translator: Arash Mousavi <mousavi.arash@gmail.com>\n"
"Language-Team: Persian <>\n"
"Language: fa\n"
@@ -19,7 +19,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Generator: Poedit 1.6.9\n"
"X-Generator: Gtranslator 2.91.6\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@@ -81,10 +81,16 @@ msgstr ""
"F2."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
#| msgid "Uuids of extensions to enable"
msgid "UUIDs of extensions to enable"
msgstr "شناسه‌های UUID افزونه‌ها جهت فعال‌سازی"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
#| msgid ""
#| "GNOME Shell extensions have a uuid property; this key lists extensions "
#| "which should be loaded. Any extension that wants to be loaded needs to be "
#| "in this list. You can also manipulate this list with the EnableExtension "
#| "and DisableExtension DBus methods on org.gnome.Shell."
msgid ""
"GNOME Shell extensions have a UUID property; this key lists extensions which "
"should be loaded. Any extension that wants to be loaded needs to be in this "
@@ -137,10 +143,14 @@ msgid "History for the looking glass dialog"
msgstr "تاریخچه برای نما محاوره شیشه‌ای"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
#| msgid "Always show the 'Log out' menuitem in the user menu."
msgid "Always show the 'Log out' menu item in the user menu."
msgstr "همیشه «خروج از سیستم» را در منو کاربر نمایش بده."
#: ../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."
msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
@@ -297,17 +307,18 @@ msgstr ""
msgid "Captive Portal"
msgstr "پرتال درگیر"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:127
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "خطایی هنگام باز کردن محاوره‌ی ترجیحات برای %s رُخ داد:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:159
#| msgid "Configure GNOME Shell Extensions"
msgid "GNOME Shell Extensions"
msgstr "افزونه‌های گنوم‌شل"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@@ -367,47 +378,50 @@ msgstr "عدم توانایی در تجزیه فرمان:"
#: ../js/misc/util.js:156
#, javascript-format
#| msgid "Execution of '%s' failed:"
msgid "Execution of “%s” failed:"
msgstr "اجرای «%s» شکست خورد:"
#: ../js/portalHelper/main.js:85
#| msgid "Authentication Required"
msgid "Web Authentication Redirect"
msgstr "تغییر مسیر برای تایید هویت وب"
#: ../js/ui/appDisplay.js:772
#: ../js/ui/appDisplay.js:660
msgid "Frequently used applications will appear here"
msgstr "برنامه‌های بیشتر استفاده شده در اینجا نمایش داده می‌شود"
#: ../js/ui/appDisplay.js:883
#: ../js/ui/appDisplay.js:771
msgid "Frequent"
msgstr "پُراستفاده"
#: ../js/ui/appDisplay.js:890
#: ../js/ui/appDisplay.js:778
msgid "All"
msgstr "همه"
#: ../js/ui/appDisplay.js:1790
#: ../js/ui/appDisplay.js:1650
msgid "New Window"
msgstr "پنجره‌ی جدید"
#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "حذف از مورد پسندها"
#: ../js/ui/appDisplay.js:1822
#: ../js/ui/appDisplay.js:1679
msgid "Add to Favorites"
msgstr "اضافه کردن به مورد پسندها"
#: ../js/ui/appDisplay.js:1831
#: ../js/ui/appDisplay.js:1688
#| msgid "Show Text"
msgid "Show Details"
msgstr "نمایش جزئیات"
#: ../js/ui/appFavorites.js:132
#: ../js/ui/appFavorites.js:122
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "مورد %s به مورد پسندهای شما اضافه شد."
#: ../js/ui/appFavorites.js:166
#: ../js/ui/appFavorites.js:156
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "مورد %s ازمورد پسندهای شما حذف شد."
@@ -599,11 +613,11 @@ msgstr "باز کردن با %s"
msgid "Eject"
msgstr "بیرون دادن"
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "گذرواژه"
#: ../js/ui/components/keyring.js:120
#: ../js/ui/components/keyring.js:113
msgid "Type again:"
msgstr "تلاش مجدد:"
@@ -642,6 +656,9 @@ msgstr "تایید هویت برای شبکه بی‌سیم لازم است"
#: ../js/ui/components/networkAgent.js:319
#, javascript-format
#| msgid ""
#| "Passwords or encryption keys are required to access the wireless network "
#| "'%s'."
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
@@ -677,6 +694,7 @@ msgstr "گذرواژه شبکه پهن‌باند تلفن همراه"
#: ../js/ui/components/networkAgent.js:346
#, javascript-format
#| msgid "A password is required to connect to '%s'."
msgid "A password is required to connect to “%s”."
msgstr "برای اتصال به «%s» گذرواژه لازم است."
@@ -726,18 +744,23 @@ msgstr "بی‌صدا"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:953
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%H%M"
msgstr "%OH%OM"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:960
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgid "Yesterday, %H%M"
msgstr "<b>دیروز</b>، <b>%OH:%OM"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:967
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%A, %H%M"
msgstr "%A، %OH%OM"
@@ -745,6 +768,8 @@ msgstr "%A، %OH%OM"
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */
#: ../js/ui/components/telepathyClient.js:974
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%B %d, %H%M"
msgstr "%d %B، %OH%OM"
@@ -757,6 +782,8 @@ msgstr "%Od %OB %OY، %OH:%OM"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:986
#| msgctxt "event list time"
#| msgid "%l%M%p"
msgid "%l%M %p"
msgstr "%Ol%OM%p"
@@ -769,6 +796,7 @@ msgstr "دیروز، %OI:%OM"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1000
#| msgid "%a %l:%M %p"
msgid "%A, %l%M %p"
msgstr "%A، %OH:%OM"
@@ -776,6 +804,7 @@ msgstr "%A، %OH:%OM"
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1007
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d, %l%M %p"
msgstr "%Od %B، %OH:%OM"
@@ -783,6 +812,7 @@ msgstr "%Od %B، %OH:%OM"
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1013
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d %Y, %l%M %p"
msgstr "%Od %B، %OH:%OM"
@@ -974,7 +1004,7 @@ msgstr "نمایش حساب"
msgid "Unknown reason"
msgstr "دلیل ناشناخته"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
msgid "Windows"
msgstr "پنجره‌‌ها"
@@ -986,105 +1016,105 @@ msgstr "نمایش برنامه‌ها"
msgid "Dash"
msgstr "دَش"
#: ../js/ui/dateMenu.js:97
#: ../js/ui/dateMenu.js:96
msgid "Open Calendar"
msgstr "بازکردن تقویم"
#: ../js/ui/dateMenu.js:101
#: ../js/ui/dateMenu.js:100
msgid "Open Clocks"
msgstr "باز کردن ساعت‌ها"
#: ../js/ui/dateMenu.js:108
#: ../js/ui/dateMenu.js:107
msgid "Date & Time Settings"
msgstr "تنظیمات تاریخ و ساعت"
#. 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:132
#: ../js/ui/dateMenu.js:204
msgid "%A %B %e, %Y"
msgstr "%A %Od %B"
#: ../js/ui/endSessionDialog.js:64
#: ../js/ui/endSessionDialog.js:66
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "خروج از %s"
#: ../js/ui/endSessionDialog.js:65
#: ../js/ui/endSessionDialog.js:67
msgctxt "title"
msgid "Log Out"
msgstr "خروج از سیستم"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:69
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
#: ../js/ui/endSessionDialog.js:72
#: ../js/ui/endSessionDialog.js:74
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "شما پس از %Id ثانیه به طور خودکار از سیستم خارج می‌شوید."
msgstr[1] "شما پس از %Id ثانیه به طور خودکار از سیستم خارج می‌شوید."
#: ../js/ui/endSessionDialog.js:78
#: ../js/ui/endSessionDialog.js:80
msgctxt "button"
msgid "Log Out"
msgstr "خروج از سیستم"
#: ../js/ui/endSessionDialog.js:84
#: ../js/ui/endSessionDialog.js:86
msgctxt "title"
msgid "Power Off"
msgstr "خاموش کردن"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:87
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "نصب بروزرسانی‌ها و خاموش کردن"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:89
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "سیستم پس از %Id ثانیه به طور خودکار خاموش می‌شود."
msgstr[1] "سیستم پس از %Id ثانیه به طور خودکار خاموش می‌شود."
#: ../js/ui/endSessionDialog.js:91
#: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "نصب بروزرسانی‌هایِ در انتظار"
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
msgctxt "button"
msgid "Restart"
msgstr "راه‌اندازی مجدد"
#: ../js/ui/endSessionDialog.js:96
#: ../js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Power Off"
msgstr "خاموش کردن"
#: ../js/ui/endSessionDialog.js:103
#: ../js/ui/endSessionDialog.js:105
msgctxt "title"
msgid "Restart"
msgstr "راه‌اندازی مجدد"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:107
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "سیستم پس از %Id ثانیه به طور خودکار مجددا راه‌اندازی می‌شود."
msgstr[1] "سیستم پس از %Id ثانیه به طور خودکار مجددا راه‌اندازی می‌شود."
#: ../js/ui/endSessionDialog.js:119
#: ../js/ui/endSessionDialog.js:121
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "راه‌اندازی مجدد و نصب بروزرسانی‌ها"
#: ../js/ui/endSessionDialog.js:121
#: ../js/ui/endSessionDialog.js:123
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@@ -1096,42 +1126,44 @@ msgstr[1] ""
"سیستم پس از %Id ثانیه به طور خودکار مجددا راه‌اندازی می‌شود و بروزرسانی‌های را "
"نصب می‌کند."
#: ../js/ui/endSessionDialog.js:127
#: ../js/ui/endSessionDialog.js:129
#| msgctxt "button"
#| msgid "Restart & Install"
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "راه‌اندازی مجدد و نصب"
#: ../js/ui/endSessionDialog.js:128
#: ../js/ui/endSessionDialog.js:130
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "نصب و خاموش کردن"
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:131
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "خاموش کردن بعد از نصب بروزرسانی‌ها"
#: ../js/ui/endSessionDialog.js:338
#: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"درحال اجرا بر روی انرژی باتری: لطفا قبل از نصب بروزرسانی‌ها، به برق وصل کنید."
#: ../js/ui/endSessionDialog.js:355
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
msgstr "تعدادی از برنامه‌ها مشغول هستند یا کارهای ذخیره نشده دارند."
#: ../js/ui/endSessionDialog.js:362
#: ../js/ui/endSessionDialog.js:339
msgid "Other users are logged in."
msgstr "کاربران دیگر وارد سیستم هستند."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:640
#: ../js/ui/endSessionDialog.js:619
#, javascript-format
msgid "%s (remote)"
msgstr "%s (دوردست)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:643
#: ../js/ui/endSessionDialog.js:622
#, javascript-format
msgid "%s (console)"
msgstr "%s (پایانه)"
@@ -1142,10 +1174,11 @@ msgstr "نصب"
#: ../js/ui/extensionDownloader.js:204
#, javascript-format
#| msgid "Download and install '%s' from extensions.gnome.org?"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "بارگیری و نصب «%s» از extensions.gnome.org؟"
#: ../js/ui/keyboard.js:700 ../js/ui/status/keyboard.js:523
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
msgid "Keyboard"
msgstr "صفحه‌کلید"
@@ -1167,8 +1200,8 @@ msgstr "مخفی کردن خطاها"
msgid "Show Errors"
msgstr "نمایش خطاها"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
msgid "Enabled"
msgstr "به کار انداختن"
@@ -1176,7 +1209,7 @@ msgstr "به کار انداختن"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "از کار انداختن"
@@ -1201,39 +1234,39 @@ msgstr "نمایش منبع"
msgid "Web Page"
msgstr "صفحه‌ی وب"
#: ../js/ui/messageTray.js:1327
#: ../js/ui/messageTray.js:1325
msgid "Open"
msgstr "بازکردن"
#: ../js/ui/messageTray.js:1334
#: ../js/ui/messageTray.js:1332
msgid "Remove"
msgstr "حذف"
#: ../js/ui/messageTray.js:1631
#: ../js/ui/messageTray.js:1629
msgid "Notifications"
msgstr "اعلان‌ها"
#: ../js/ui/messageTray.js:1638
#: ../js/ui/messageTray.js:1636
msgid "Clear Messages"
msgstr "پاک کردن پیام‌ها"
#: ../js/ui/messageTray.js:1657
#: ../js/ui/messageTray.js:1655
msgid "Notification Settings"
msgstr "تنظیمات اعلان‌ها"
#: ../js/ui/messageTray.js:1710
#: ../js/ui/messageTray.js:1708
msgid "Tray Menu"
msgstr "منو سینی"
#: ../js/ui/messageTray.js:1934
#: ../js/ui/messageTray.js:1925
msgid "No Messages"
msgstr "پیامی وجود ندارد"
#: ../js/ui/messageTray.js:1979
#: ../js/ui/messageTray.js:1963
msgid "Message Tray"
msgstr "سینی پیام"
#: ../js/ui/messageTray.js:2992
#: ../js/ui/messageTray.js:2966
msgid "System Information"
msgstr "اطلاعات سیستم"
@@ -1261,7 +1294,7 @@ msgstr "نمای‌کلی"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:246
#: ../js/ui/overview.js:250
msgid "Type to search…"
msgstr "برای جستجو تایپ کنید..."
@@ -1292,6 +1325,7 @@ msgid "Close"
msgstr "بستن"
#: ../js/ui/runDialog.js:277
#| msgid "Estimating…"
msgid "Restarting…"
msgstr "درحال راه‌اندازی مجدد..."
@@ -1324,27 +1358,27 @@ msgstr "نمی‌توان قفل کرد"
msgid "Lock was blocked by an application"
msgstr "قفل توسط یک برنامه مسدود شده بود"
#: ../js/ui/search.js:611
#: ../js/ui/search.js:606
msgid "Searching…"
msgstr "درحال حستجو..."
#: ../js/ui/search.js:613
#: ../js/ui/search.js:652
msgid "No results."
msgstr "بدون نتیجه."
#: ../js/ui/shellEntry.js:25
#: ../js/ui/shellEntry.js:27
msgid "Copy"
msgstr "رونوشت"
#: ../js/ui/shellEntry.js:30
#: ../js/ui/shellEntry.js:32
msgid "Paste"
msgstr "چسباندن"
#: ../js/ui/shellEntry.js:97
#: ../js/ui/shellEntry.js:99
msgid "Show Text"
msgstr "نمایش متن"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:101
msgid "Hide Text"
msgstr "مخفی‌کردن متن"
@@ -1430,27 +1464,26 @@ msgstr "متصل نیست"
msgid "Brightness"
msgstr "روشنایی"
#: ../js/ui/status/keyboard.js:547
#: ../js/ui/status/keyboard.js:406
msgid "Show Keyboard Layout"
msgstr "نمایش چیدمان صفحه‌کلید"
#: ../js/ui/status/location.js:65
#: ../js/ui/status/location.js:56
#| msgid "Notifications"
msgid "Location"
msgstr "مکان"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
#| msgid "Disabled"
msgid "Disable"
msgstr "از کار انداختن"
#: ../js/ui/status/location.js:73
msgid "Privacy Settings"
msgstr "تنظیمات حریم‌خصوصی"
#: ../js/ui/status/location.js:176
#: ../js/ui/status/location.js:166
msgid "In Use"
msgstr "درحال استفاده"
#: ../js/ui/status/location.js:180
#: ../js/ui/status/location.js:170
#| msgid "Enabled"
msgid "Enable"
msgstr "به کار انداختن"
@@ -1464,31 +1497,37 @@ msgid "Off"
msgstr "خاموش"
#: ../js/ui/status/network.js:459
#| msgid "Connect"
msgid "Connected"
msgstr "متصل شده"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:463
#| msgid "unmanaged"
msgid "Unmanaged"
msgstr "مدیریت نشده"
#: ../js/ui/status/network.js:465
#| msgid "disconnecting..."
msgid "Disconnecting"
msgstr "درحال قطع ارتباط"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#| msgid "Connection"
msgid "Connecting"
msgstr "درحال اتصال"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#| msgid "authentication required"
msgid "Authentication required"
msgstr "تایید هویت لازم است"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:482
#| msgid "firmware missing"
msgid "Firmware missing"
msgstr "میان‌افزار موجود نیست"
@@ -1503,6 +1542,7 @@ msgid "Connection failed"
msgstr "اتصال شکست خورد"
#: ../js/ui/status/network.js:504
#| msgid "Wi-Fi Settings"
msgid "Wired Settings"
msgstr "تنظیمات اتصال سیمی"
@@ -1519,6 +1559,7 @@ msgid "Use as Internet connection"
msgstr "استفاده به عنوان اتصال اینترنت"
#: ../js/ui/status/network.js:813
#| msgid "Airplane Mode"
msgid "Airplane Mode is On"
msgstr "حالت هواپیمایی روشن است"
@@ -1527,10 +1568,12 @@ msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "در زمان روشن بودن حالت هواپیمایی وای-فای غیرفعال می‌شود."
#: ../js/ui/status/network.js:815
#| msgid "Airplane Mode"
msgid "Turn Off Airplane Mode"
msgstr "خاموش کردن حالت هواپیمایی"
#: ../js/ui/status/network.js:824
#| msgid "Wi-Fi Settings"
msgid "Wi-Fi is Off"
msgstr "بی‌سیم خاموش است"
@@ -1539,6 +1582,7 @@ msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "برای اتصال به شبکه باید وای-فای روشن شود."
#: ../js/ui/status/network.js:826
#| msgid "Turn On"
msgid "Turn On Wi-Fi"
msgstr "روشن کردن بی‌سیم"
@@ -1592,6 +1636,7 @@ msgid "Network Settings"
msgstr "تنظیمات شبکه"
#: ../js/ui/status/network.js:1482
#| msgid "Settings"
msgid "VPN Settings"
msgstr "تنظیمات VPN"
@@ -1685,16 +1730,17 @@ msgstr "ورود به سیستم بعنوان کاربری دیگر"
msgid "Unlock Window"
msgstr "بازکردن قفل پنجره"
#: ../js/ui/viewSelector.js:158
#: ../js/ui/viewSelector.js:232
msgid "Applications"
msgstr "برنامه‌ها"
#: ../js/ui/viewSelector.js:162
#: ../js/ui/viewSelector.js:236
msgid "Search"
msgstr "جستجو"
#: ../js/ui/windowAttentionHandler.js:19
#, javascript-format
#| msgid "'%s' is ready"
msgid "“%s” is ready"
msgstr "«%s» آماده است"
@@ -1786,24 +1832,25 @@ msgstr[1] "%Iu ورودی"
msgid "System Sounds"
msgstr "صداهای سیستم"
#: ../src/main.c:373
#: ../src/main.c:371
msgid "Print version"
msgstr "چاپ نسخه"
#: ../src/main.c:379
#: ../src/main.c:377
msgid "Mode used by GDM for login screen"
msgstr "حالت استفاده شده توسط GDM برای صفحه ورود به سیستم"
#: ../src/main.c:385
#: ../src/main.c:383
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "استفاده از حالت مشخص، مثال «gdm» برای صفحه ورود به سیستم"
#: ../src/main.c:391
#: ../src/main.c:389
msgid "List possible modes"
msgstr "فهرست کردن حالت‌های ممکن"
#: ../src/shell-app.c:666
#, c-format
#| msgid "Failed to launch '%s'"
msgid "Failed to launch “%s”"
msgstr "راه‌اندازی «%s» شکست خورد"

907
po/fi.po

File diff suppressed because it is too large Load Diff

148
po/fr.po
View File

@@ -19,7 +19,7 @@ msgstr ""
"Project-Id-Version: gnome-shell master fr\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-09-12 17:00+0000\n"
"POT-Creation-Date: 2014-08-25 07:37+0000\n"
"PO-Revision-Date: 2014-08-25 17:00+0200\n"
"Last-Translator: Alain Lojewski <allomervan@gmail.com>\n"
"Language-Team: français <gnomefr@traduc.org>\n"
@@ -242,8 +242,8 @@ msgstr "Combinaison de touches pour donner le focus à la notification active."
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"Combinaison de touches pour stopper et fermer toutes les transitions à des "
"fins de débogage"
"Combinaison de touches pour stopper et fermer toutes les transitions à des fins "
"de débogage"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Which keyboard to use"
@@ -322,19 +322,19 @@ msgstr ""
msgid "Captive Portal"
msgstr "Portail captif"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:127
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr ""
"Une erreur s'est produite lors du chargement de la boîte de dialogue des "
"préférences de %s :"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:159
msgid "GNOME Shell Extensions"
msgstr "Extensions GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@@ -401,40 +401,40 @@ msgstr "Exécution de « %s » impossible :"
msgid "Web Authentication Redirect"
msgstr "Redirection de l'authentification Web"
#: ../js/ui/appDisplay.js:772
#: ../js/ui/appDisplay.js:660
msgid "Frequently used applications will appear here"
msgstr "Les applications fréquemment utilisées apparaîtront ici"
#: ../js/ui/appDisplay.js:883
#: ../js/ui/appDisplay.js:771
msgid "Frequent"
msgstr "Fréquemment utilisées"
#: ../js/ui/appDisplay.js:890
#: ../js/ui/appDisplay.js:778
msgid "All"
msgstr "Toutes"
#: ../js/ui/appDisplay.js:1789
#: ../js/ui/appDisplay.js:1650
msgid "New Window"
msgstr "Nouvelle fenêtre"
#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Enlever des favoris"
#: ../js/ui/appDisplay.js:1821
#: ../js/ui/appDisplay.js:1679
msgid "Add to Favorites"
msgstr "Ajouter aux favoris"
#: ../js/ui/appDisplay.js:1830
#: ../js/ui/appDisplay.js:1688
msgid "Show Details"
msgstr "Afficher les détails"
#: ../js/ui/appFavorites.js:124
#: ../js/ui/appFavorites.js:122
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s a été ajouté à vos favoris."
#: ../js/ui/appFavorites.js:158
#: ../js/ui/appFavorites.js:156
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s a été supprimé de vos favoris."
@@ -647,11 +647,11 @@ msgstr "Ouvrir avec %s"
msgid "Eject"
msgstr "Éjecter"
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "Mot de passe :"
#: ../js/ui/components/keyring.js:120
#: ../js/ui/components/keyring.js:113
msgid "Type again:"
msgstr "Saisissez à nouveau :"
@@ -1025,7 +1025,7 @@ msgstr "Afficher le compte"
msgid "Unknown reason"
msgstr "Raison inconnue"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
msgid "Windows"
msgstr "Fenêtres"
@@ -1062,86 +1062,86 @@ msgstr "Paramètres de date et heure"
msgid "%A %B %e, %Y"
msgstr "%A %e %B %Y"
#: ../js/ui/endSessionDialog.js:64
#: ../js/ui/endSessionDialog.js:66
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Fermer la session de %s"
#: ../js/ui/endSessionDialog.js:65
#: ../js/ui/endSessionDialog.js:67
msgctxt "title"
msgid "Log Out"
msgstr "Fermer la session"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:69
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s sera déconnecté automatiquement dans %d seconde."
msgstr[1] "%s sera déconnecté automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:72
#: ../js/ui/endSessionDialog.js:74
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Vous allez être déconnecté automatiquement dans %d seconde."
msgstr[1] "Vous allez être déconnecté automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:78
#: ../js/ui/endSessionDialog.js:80
msgctxt "button"
msgid "Log Out"
msgstr "Fermer la session"
#: ../js/ui/endSessionDialog.js:84
#: ../js/ui/endSessionDialog.js:86
msgctxt "title"
msgid "Power Off"
msgstr "Éteindre"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:87
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Installer les mises à jour et éteindre"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:89
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Cet ordinateur s'éteindra automatiquement dans %d seconde."
msgstr[1] "Cet ordinateur s'éteindra automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:91
#: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Installer les mises à jour logicielles en attente"
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
msgctxt "button"
msgid "Restart"
msgstr "Redémarrer"
#: ../js/ui/endSessionDialog.js:96
#: ../js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Power Off"
msgstr "Éteindre"
#: ../js/ui/endSessionDialog.js:103
#: ../js/ui/endSessionDialog.js:105
msgctxt "title"
msgid "Restart"
msgstr "Redémarrer"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:107
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Cet ordinateur redémarrera automatiquement dans %d seconde."
msgstr[1] "Cet ordinateur redémarrera automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:119
#: ../js/ui/endSessionDialog.js:121
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Redémarrer et installer les mises à jour"
#: ../js/ui/endSessionDialog.js:121
#: ../js/ui/endSessionDialog.js:123
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@@ -1149,44 +1149,44 @@ msgid_plural ""
msgstr[0] "Le système redémarrera automatiquement dans %d seconde."
msgstr[1] "Le système redémarrera automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:127
#: ../js/ui/endSessionDialog.js:129
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Redémarrer et installer"
#: ../js/ui/endSessionDialog.js:128
#: ../js/ui/endSessionDialog.js:130
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Installer et éteindre"
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:131
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Éteindre après l'installation des mises à jour"
#: ../js/ui/endSessionDialog.js:338
#: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"Fonctionnement sur batterie : veuillez vous brancher avant d'installer les "
"mises à jour."
#: ../js/ui/endSessionDialog.js:355
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
msgstr ""
"Certaines applications sont occupées ou ont des travaux non-sauvegardés."
#: ../js/ui/endSessionDialog.js:362
#: ../js/ui/endSessionDialog.js:339
msgid "Other users are logged in."
msgstr "D'autres utilisateurs sont connectés."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:640
#: ../js/ui/endSessionDialog.js:619
#, javascript-format
msgid "%s (remote)"
msgstr "%s (distant)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:643
#: ../js/ui/endSessionDialog.js:622
#, javascript-format
msgid "%s (console)"
msgstr "%s (console)"
@@ -1200,7 +1200,7 @@ msgstr "Installer"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?"
#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
msgid "Keyboard"
msgstr "Clavier"
@@ -1222,8 +1222,8 @@ msgstr "Masquer les erreurs"
msgid "Show Errors"
msgstr "Afficher les erreurs"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
msgid "Enabled"
msgstr "Activé"
@@ -1231,7 +1231,7 @@ msgstr "Activé"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Désactivé"
@@ -1256,39 +1256,39 @@ msgstr "Afficher la source"
msgid "Web Page"
msgstr "Page Web"
#: ../js/ui/messageTray.js:1326
#: ../js/ui/messageTray.js:1325
msgid "Open"
msgstr "Ouvrir"
#: ../js/ui/messageTray.js:1333
#: ../js/ui/messageTray.js:1332
msgid "Remove"
msgstr "Enlever"
#: ../js/ui/messageTray.js:1630
#: ../js/ui/messageTray.js:1629
msgid "Notifications"
msgstr "Notifications"
#: ../js/ui/messageTray.js:1637
#: ../js/ui/messageTray.js:1636
msgid "Clear Messages"
msgstr "Effacer les messages"
#: ../js/ui/messageTray.js:1656
#: ../js/ui/messageTray.js:1655
msgid "Notification Settings"
msgstr "Paramètres de notifications"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1708
msgid "Tray Menu"
msgstr "Menu du tiroir de messagerie"
#: ../js/ui/messageTray.js:1926
#: ../js/ui/messageTray.js:1925
msgid "No Messages"
msgstr "Aucun message"
#: ../js/ui/messageTray.js:1968
#: ../js/ui/messageTray.js:1963
msgid "Message Tray"
msgstr "Tiroir de messagerie"
#: ../js/ui/messageTray.js:2971
#: ../js/ui/messageTray.js:2966
msgid "System Information"
msgstr "Informations du système"
@@ -1316,7 +1316,7 @@ msgstr "Vue d'ensemble"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:246
#: ../js/ui/overview.js:250
msgid "Type to search…"
msgstr "Rechercher…"
@@ -1379,27 +1379,27 @@ msgstr "Impossible de verrouiller"
msgid "Lock was blocked by an application"
msgstr "Le verrouillage a été bloqué par une application"
#: ../js/ui/search.js:594
#: ../js/ui/search.js:606
msgid "Searching…"
msgstr "Recherche en cours…"
#: ../js/ui/search.js:596
#: ../js/ui/search.js:652
msgid "No results."
msgstr "Aucun résultat."
#: ../js/ui/shellEntry.js:25
#: ../js/ui/shellEntry.js:27
msgid "Copy"
msgstr "Copier"
#: ../js/ui/shellEntry.js:30
#: ../js/ui/shellEntry.js:32
msgid "Paste"
msgstr "Coller"
#: ../js/ui/shellEntry.js:97
#: ../js/ui/shellEntry.js:99
msgid "Show Text"
msgstr "Afficher le texte"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:101
msgid "Hide Text"
msgstr "Masquer le texte"
@@ -1485,27 +1485,23 @@ msgstr "Non connecté"
msgid "Brightness"
msgstr "Luminosité"
#: ../js/ui/status/keyboard.js:547
#: ../js/ui/status/keyboard.js:406
msgid "Show Keyboard Layout"
msgstr "Afficher la disposition du clavier"
#: ../js/ui/status/location.js:65
#: ../js/ui/status/location.js:56
msgid "Location"
msgstr "Localisation"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
msgid "Disable"
msgstr "Désactiver"
#: ../js/ui/status/location.js:73
msgid "Privacy Settings"
msgstr "Paramètres de confidentialité"
#: ../js/ui/status/location.js:176
#: ../js/ui/status/location.js:166
msgid "In Use"
msgstr "En cours d'utilisation"
#: ../js/ui/status/location.js:180
#: ../js/ui/status/location.js:170
msgid "Enable"
msgstr "Activer"
@@ -1740,11 +1736,11 @@ msgstr "Se connecter en tant qu'autre utilisateur"
msgid "Unlock Window"
msgstr "Fenêtre de déverrouillage"
#: ../js/ui/viewSelector.js:158
#: ../js/ui/viewSelector.js:232
msgid "Applications"
msgstr "Applications"
#: ../js/ui/viewSelector.js:162
#: ../js/ui/viewSelector.js:236
msgid "Search"
msgstr "Recherche"
@@ -1841,20 +1837,20 @@ msgstr[1] "%u entrées"
msgid "System Sounds"
msgstr "Sons système"
#: ../src/main.c:373
#: ../src/main.c:371
msgid "Print version"
msgstr "Affiche la version"
#: ../src/main.c:379
#: ../src/main.c:377
msgid "Mode used by GDM for login screen"
msgstr "Mode utilisé par GDM pour l'écran de connexion"
#: ../src/main.c:385
#: ../src/main.c:383
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr ""
"Utiliser un mode particulier, par ex. « gdm » pour l'écran de connexion"
#: ../src/main.c:391
#: ../src/main.c:389
msgid "List possible modes"
msgstr "Lister les modes possibles"

540
po/fur.po

File diff suppressed because it is too large Load Diff

308
po/gl.po
View File

@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-09-23 01:50+0200\n"
"PO-Revision-Date: 2014-09-23 01:51+0200\n"
"POT-Creation-Date: 2014-08-25 23:06+0200\n"
"PO-Revision-Date: 2014-08-25 23:08+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: gnome-l10n-gl@gnome.org\n"
"Language: gl\n"
@@ -300,17 +300,17 @@ msgstr "Atrasar os cambios de foco no modo rato até que o punteiro se pare"
msgid "Captive Portal"
msgstr "Portal cautivo"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:127
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Produciuse un erro ao cargar o diálogo de preferenzas para %s:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:159
msgid "GNOME Shell Extensions"
msgstr "Extensións de GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@@ -334,23 +334,15 @@ msgstr "Iniciar sesión"
msgid "Choose Session"
msgstr "Escolla unha sesión"
#. 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:429
msgid "Not listed?"
msgstr "Non está na lista?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:614
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(p.ex., usuario ou %s)"
#. 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:619 ../js/ui/components/networkAgent.js:269
#: ../js/ui/components/networkAgent.js:287
msgid "Username: "
@@ -364,11 +356,6 @@ msgstr "Xanela de inicio de sesión"
msgid "Authentication error"
msgstr "Erro de autenticación"
#. We don't show fingerprint messages directly since it's
#. not the main auth service. Instead we use the messages
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:453
msgid "(or swipe finger)"
msgstr "(ou pase o dedo)"
@@ -377,8 +364,6 @@ msgstr "(ou pase o dedo)"
msgid "Command not found"
msgstr "Orde non atopada"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:148
msgid "Could not parse command:"
msgstr "Non foi posíbel analizar a orde:"
@@ -388,46 +373,44 @@ msgstr "Non foi posíbel analizar a orde:"
msgid "Execution of “%s” failed:"
msgstr "Produciuse un fallo na execución de «%s»:"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. window, until we know the title of the actual login page
#: ../js/portalHelper/main.js:85
msgid "Web Authentication Redirect"
msgstr "Redirección web de autenticación"
#: ../js/ui/appDisplay.js:772
#: ../js/ui/appDisplay.js:660
msgid "Frequently used applications will appear here"
msgstr "Os aplicativos usados recentemente aparecerán aquí"
#: ../js/ui/appDisplay.js:883
#: ../js/ui/appDisplay.js:771
msgid "Frequent"
msgstr "Frecuentes"
#: ../js/ui/appDisplay.js:890
#: ../js/ui/appDisplay.js:778
msgid "All"
msgstr "Todos"
#: ../js/ui/appDisplay.js:1790
#: ../js/ui/appDisplay.js:1650
msgid "New Window"
msgstr "Xanela nova"
#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Retirar dos marcadores"
#: ../js/ui/appDisplay.js:1822
#: ../js/ui/appDisplay.js:1679
msgid "Add to Favorites"
msgstr "Engadir aos favoritos"
#: ../js/ui/appDisplay.js:1831
#: ../js/ui/appDisplay.js:1688
msgid "Show Details"
msgstr "Mostrar detalles"
#: ../js/ui/appFavorites.js:132
#: ../js/ui/appFavorites.js:122
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s foi engadido aos seus favoritos."
#: ../js/ui/appFavorites.js:166
#: ../js/ui/appFavorites.js:156
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s retirouse dos seus marcadores."
@@ -443,14 +426,14 @@ msgstr "Cambiar fondo de escritorio…"
#. 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:67
msgctxt "event list time"
msgid "All Day"
msgstr "Todo o día"
#. Translators: Shown in calendar event list, if 24h format,
#. \u2236 is a ratio character, similar to :
#. \u2236 is a ratio character, similar to : */
#: ../js/ui/calendar.js:73
msgctxt "event list time"
msgid "%H%M"
@@ -458,7 +441,7 @@ msgstr "%H%M"
#. Translators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space
#. a thin space */
#: ../js/ui/calendar.js:82
msgctxt "event list time"
msgid "%l%M%p"
@@ -468,43 +451,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:113
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday
#. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:115
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday
#. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:117
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday
#. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:119
msgctxt "grid wednesday"
msgid "W"
msgstr "W"
#. Translators: Calendar grid abbreviation for Thursday
#. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:121
msgctxt "grid thursday"
msgid "T"
msgstr "X"
#. Translators: Calendar grid abbreviation for Friday
#. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:123
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday
#. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:125
msgctxt "grid saturday"
msgid "S"
@@ -515,43 +498,43 @@ msgstr "S"
#. * NOTE: These list abbreviations are normally not shown together
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T').
#.
#. */
#: ../js/ui/calendar.js:138
msgctxt "list sunday"
msgid "Su"
msgstr "Do"
#. Translators: Event list abbreviation for Monday
#. Translators: Event list abbreviation for Monday */
#: ../js/ui/calendar.js:140
msgctxt "list monday"
msgid "M"
msgstr "L"
#. Translators: Event list abbreviation for Tuesday
#. Translators: Event list abbreviation for Tuesday */
#: ../js/ui/calendar.js:142
msgctxt "list tuesday"
msgid "T"
msgstr "M"
#. Translators: Event list abbreviation for Wednesday
#. Translators: Event list abbreviation for Wednesday */
#: ../js/ui/calendar.js:144
msgctxt "list wednesday"
msgid "W"
msgstr "W"
#. Translators: Event list abbreviation for Thursday
#. Translators: Event list abbreviation for Thursday */
#: ../js/ui/calendar.js:146
msgctxt "list thursday"
msgid "Th"
msgstr "X"
#. Translators: Event list abbreviation for Friday
#. Translators: Event list abbreviation for Friday */
#: ../js/ui/calendar.js:148
msgctxt "list friday"
msgid "F"
msgstr "V"
#. Translators: Event list abbreviation for Saturday
#. Translators: Event list abbreviation for Saturday */
#: ../js/ui/calendar.js:150
msgctxt "list saturday"
msgid "S"
@@ -565,18 +548,18 @@ msgstr "Anterior mes"
msgid "Next month"
msgstr "Seguinte mes"
#. Translators: Text to show if there are no events
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:781
msgid "Nothing Scheduled"
msgstr "Nada programado"
#. Translators: Shown on calendar heading when selected day occurs on current year
#. Translators: Shown on calendar heading when selected day occurs on current year */
#: ../js/ui/calendar.js:799
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#. Translators: Shown on calendar heading when selected day occurs on different year */
#: ../js/ui/calendar.js:802
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
@@ -619,11 +602,11 @@ msgstr "Abrir con %s"
msgid "Eject"
msgstr "Expulsar"
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "Contrasinal:"
#: ../js/ui/components/keyring.js:120
#: ../js/ui/components/keyring.js:113
msgid "Type again:"
msgstr "Escriba de novo:"
@@ -632,7 +615,6 @@ msgstr "Escriba de novo:"
msgid "Connect"
msgstr "Conectar"
#. Cisco LEAP
#: ../js/ui/components/networkAgent.js:231
#: ../js/ui/components/networkAgent.js:243
#: ../js/ui/components/networkAgent.js:271
@@ -641,7 +623,6 @@ msgstr "Conectar"
msgid "Password: "
msgstr "Contrasinal: "
#. static WEP
#: ../js/ui/components/networkAgent.js:236
msgid "Key: "
msgstr "Chave: "
@@ -719,23 +700,19 @@ msgstr "Autenticar"
#. Translators: "that didn't work" refers to the fact that the
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#. * for instance. */
#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again."
msgstr "Desculpe, iso non funcionou. Ténteo de novo."
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/components/telepathyClient.js:240
msgid "Invitation"
msgstr "Convite"
#. We got the TpContact
#: ../js/ui/components/telepathyClient.js:300
msgid "Call"
msgstr "Chamar"
#. We got the TpContact
#: ../js/ui/components/telepathyClient.js:316
msgid "File Transfer"
msgstr "Transferencia de ficheiro"
@@ -752,85 +729,77 @@ msgstr "Desactivar silencio"
msgid "Mute"
msgstr "Silenciar"
#. Translators: Time in 24h format
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:953
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30"
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:960
#, no-c-format
msgid "Yesterday, %H%M"
msgstr "Onte, %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30"
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:967
#, no-c-format
msgid "%A, %H%M"
msgstr "%A ás %H:%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30"
#. i.e. "May 25, 14:30" */
#: ../js/ui/components/telepathyClient.js:974
#, no-c-format
msgid "%B %d, %H%M"
msgstr "%d de %B ás %H:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30"
#. i.e. "May 25 2012, 14:30" */
#: ../js/ui/components/telepathyClient.js:980
#, no-c-format
msgid "%B %d %Y, %H%M"
msgstr "%d de %B de %Y ás %H:%M"
#. Translators: Time in 24h format
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:986
msgid "%l%M %p"
msgstr "%l:%M %p"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm"
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:993
#, no-c-format
msgid "Yesterday, %l%M %p"
msgstr "Onte, %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm"
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1000
#, no-c-format
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm"
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1007
#, no-c-format
msgid "%B %d, %l%M %p"
msgstr "%d de %B, %l%M %p"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1013
#, no-c-format
msgid "%B %d %Y, %l%M %p"
msgstr "%d de %B de %Y, %l%M %p"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#. IM name. */
#: ../js/ui/components/telepathyClient.js:1045
#, javascript-format
msgid "%s is now known as %s"
msgstr "Agora %s chámase %s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#. * room@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1149
#, javascript-format
msgid "Invitation to %s"
@@ -838,7 +807,7 @@ msgstr "Convite a %s"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#. * for example. */
#: ../js/ui/components/telepathyClient.js:1157
#, javascript-format
msgid "%s is inviting you to join %s"
@@ -857,19 +826,19 @@ msgstr "Rexeitar"
msgid "Accept"
msgstr "Aceptar"
#. translators: argument is a contact name like Alice for example.
#. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1184
#, javascript-format
msgid "Video call from %s"
msgstr "Videochamada de %s"
#. translators: argument is a contact name like Alice for example.
#. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1187
#, javascript-format
msgid "Call from %s"
msgstr "Chamada de %s"
#. translators: this is a button label (verb), not a noun
#. translators: this is a button label (verb), not a noun */
#: ../js/ui/components/telepathyClient.js:1201
msgid "Answer"
msgstr "Responder"
@@ -878,13 +847,13 @@ msgstr "Responder"
#. * the contact's alias and the second one is the
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#. */
#: ../js/ui/components/telepathyClient.js:1222
#, javascript-format
msgid "%s is sending you %s"
msgstr "%s esta enviándolle %s"
#. To translators: The parameter is the contact's alias
#. To translators: The parameter is the contact's alias */
#: ../js/ui/components/telepathyClient.js:1251
#, javascript-format
msgid "%s would like permission to see when you are online"
@@ -998,7 +967,7 @@ msgid "Internal error"
msgstr "Erro interno"
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#. * name@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1393
#, javascript-format
msgid "Unable to connect to %s"
@@ -1012,7 +981,7 @@ msgstr "Ver conta"
msgid "Unknown reason"
msgstr "Razón descoñecida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
msgid "Windows"
msgstr "Xanelas"
@@ -1020,8 +989,6 @@ msgstr "Xanelas"
msgid "Show Applications"
msgstr "Mostrar aplicativos"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/dash.js:445
msgid "Dash"
msgstr "Taboleiro"
@@ -1040,91 +1007,91 @@ msgstr "Preferencias de data e hora"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#. */
#: ../js/ui/dateMenu.js:204
msgid "%A %B %e, %Y"
msgstr "%a, %e de %B, %Y"
#: ../js/ui/endSessionDialog.js:64
#: ../js/ui/endSessionDialog.js:66
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Saír da sesión %s"
#: ../js/ui/endSessionDialog.js:65
#: ../js/ui/endSessionDialog.js:67
msgctxt "title"
msgid "Log Out"
msgstr "Saír da sesión"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:69
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "Vaise pechar a sesión de %s en %d segundo."
msgstr[1] "Vaise pechar a sesión de %s en %d segundos."
#: ../js/ui/endSessionDialog.js:72
#: ../js/ui/endSessionDialog.js:74
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "A súa sesión pecharase automaticamente en %d segundo."
msgstr[1] "A súa sesión pecharase automaticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:78
#: ../js/ui/endSessionDialog.js:80
msgctxt "button"
msgid "Log Out"
msgstr "Saír da sesión"
#: ../js/ui/endSessionDialog.js:84
#: ../js/ui/endSessionDialog.js:86
msgctxt "title"
msgid "Power Off"
msgstr "Apagar"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:87
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Instalar anovacións e apagar"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:89
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "O sistema apagarase automaticamente en %d segundo."
msgstr[1] "O sistema apagarase automaticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:91
#: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Instalar anovacións de software pendentes"
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
msgctxt "button"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:96
#: ../js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Power Off"
msgstr "Apagar"
#: ../js/ui/endSessionDialog.js:103
#: ../js/ui/endSessionDialog.js:105
msgctxt "title"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:107
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "O sistema reiniciarase automaticamente en %d segundo."
msgstr[1] "O sistema reiniciarase automaticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:119
#: ../js/ui/endSessionDialog.js:121
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Reiniciar e instalar actualizacións"
#: ../js/ui/endSessionDialog.js:121
#: ../js/ui/endSessionDialog.js:123
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@@ -1136,41 +1103,41 @@ msgstr[1] ""
"O sistema reiniciarase automaticamente e instalará as actualizacións en %d "
"segundos."
#: ../js/ui/endSessionDialog.js:127
#: ../js/ui/endSessionDialog.js:129
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Reiniciar e instalar"
#: ../js/ui/endSessionDialog.js:128
#: ../js/ui/endSessionDialog.js:130
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Instalar e apagar"
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:131
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Apagar despois de instalar as anovacións"
#: ../js/ui/endSessionDialog.js:338
#: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates."
msgstr "Con enerxía da batería: enchufar antes de instalar anovacións."
#: ../js/ui/endSessionDialog.js:355
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
msgstr "Algúns aplicativos están ocupados ou teñen traballo sen gardar."
#: ../js/ui/endSessionDialog.js:362
#: ../js/ui/endSessionDialog.js:339
msgid "Other users are logged in."
msgstr "Hai outros usuarios conectados."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/endSessionDialog.js:640
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:619
#, javascript-format
msgid "%s (remote)"
msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/endSessionDialog.js:643
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:622
#, javascript-format
msgid "%s (console)"
msgstr "%s (consola)"
@@ -1184,7 +1151,7 @@ msgstr "Instalar"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Desexa descargar e instalar «%s» desde extensions.gnome.org?"
#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
msgid "Keyboard"
msgstr "Teclado"
@@ -1192,7 +1159,7 @@ msgstr "Teclado"
msgid "No extensions installed"
msgstr "Non hai ningunha extensión instalada"
#. Translators: argument is an extension UUID.
#. Translators: argument is an extension UUID. */
#: ../js/ui/lookingGlass.js:697
#, javascript-format
msgid "%s has not emitted any errors."
@@ -1206,16 +1173,16 @@ msgstr "Ocultar erros"
msgid "Show Errors"
msgstr "Mostrar erros"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
msgid "Enabled"
msgstr "Activado"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode)
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Desactivado"
@@ -1240,39 +1207,39 @@ msgstr "Ver fonte"
msgid "Web Page"
msgstr "Páxina web"
#: ../js/ui/messageTray.js:1327
#: ../js/ui/messageTray.js:1325
msgid "Open"
msgstr "Abrir"
#: ../js/ui/messageTray.js:1334
#: ../js/ui/messageTray.js:1332
msgid "Remove"
msgstr "Retirar"
#: ../js/ui/messageTray.js:1631
#: ../js/ui/messageTray.js:1629
msgid "Notifications"
msgstr "Notificacións"
#: ../js/ui/messageTray.js:1638
#: ../js/ui/messageTray.js:1636
msgid "Clear Messages"
msgstr "Limpar mensaxes"
#: ../js/ui/messageTray.js:1657
#: ../js/ui/messageTray.js:1655
msgid "Notification Settings"
msgstr "Preferencias das notificacións"
#: ../js/ui/messageTray.js:1710
#: ../js/ui/messageTray.js:1708
msgid "Tray Menu"
msgstr "Menú da bandexa do sistema"
#: ../js/ui/messageTray.js:1934
#: ../js/ui/messageTray.js:1925
msgid "No Messages"
msgstr "Non hai mensaxes"
#: ../js/ui/messageTray.js:1979
#: ../js/ui/messageTray.js:1963
msgid "Message Tray"
msgstr "Bandexa de mensaxes"
#: ../js/ui/messageTray.js:2992
#: ../js/ui/messageTray.js:2966
msgid "System Information"
msgstr "Información do sistema"
@@ -1299,8 +1266,8 @@ msgstr "Vista xeral"
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:246
#. characters. */
#: ../js/ui/overview.js:250
msgid "Type to search…"
msgstr "Escriba para buscar…"
@@ -1309,7 +1276,7 @@ msgid "Quit"
msgstr "Saír"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:567
msgid "Activities"
msgstr "Actividades"
@@ -1318,11 +1285,6 @@ msgstr "Actividades"
msgid "Top Bar"
msgstr "Barra superior"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "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:269
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@@ -1340,7 +1302,7 @@ msgid "Restarting…"
msgstr "Restimando…"
#. Translators: This is a time format for a date in
#. long format
#. long format */
#: ../js/ui/screenShield.js:88
msgid "%A, %B %d"
msgstr "%A, %d de %B"
@@ -1360,13 +1322,6 @@ msgstr "Bloquear"
msgid "GNOME needs to lock the screen"
msgstr "GNOME precisa bloquear a pantalla"
#. We could not become modal, so we can't activate the
#. screenshield. The user is probably very upset at this
#. point, but any application using global grabs is broken
#. Just tell him to stop using this app
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304
msgid "Unable to lock"
msgstr "Non foi posíbel bloquear"
@@ -1375,27 +1330,27 @@ msgstr "Non foi posíbel bloquear"
msgid "Lock was blocked by an application"
msgstr "Un aplicativo impediu o bloqueo"
#: ../js/ui/search.js:594
#: ../js/ui/search.js:606
msgid "Searching…"
msgstr "Buscando…"
#: ../js/ui/search.js:596
#: ../js/ui/search.js:652
msgid "No results."
msgstr "Sen resultados."
#: ../js/ui/shellEntry.js:25
#: ../js/ui/shellEntry.js:27
msgid "Copy"
msgstr "Copiar"
#: ../js/ui/shellEntry.js:30
#: ../js/ui/shellEntry.js:32
msgid "Paste"
msgstr "Pegar"
#: ../js/ui/shellEntry.js:97
#: ../js/ui/shellEntry.js:99
msgid "Show Text"
msgstr "Mostrar texto"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:101
msgid "Hide Text"
msgstr "Ocultar texto"
@@ -1451,8 +1406,6 @@ msgstr "Contraste alto"
msgid "Large Text"
msgstr "Texto grande"
#. The Bluetooth menu only appears when Bluetooth is in use,
#. so just statically build it with a "Turn Off" menu item.
#: ../js/ui/status/bluetooth.js:49
msgid "Bluetooth"
msgstr "Bluetooth"
@@ -1483,27 +1436,23 @@ msgstr "Non conectado"
msgid "Brightness"
msgstr "Brillo"
#: ../js/ui/status/keyboard.js:547
#: ../js/ui/status/keyboard.js:406
msgid "Show Keyboard Layout"
msgstr "Mostrar a distribución do teclado"
#: ../js/ui/status/location.js:65
#: ../js/ui/status/location.js:56
msgid "Location"
msgstr "Localización"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
msgid "Disable"
msgstr "Desactivar"
#: ../js/ui/status/location.js:73
msgid "Privacy Settings"
msgstr "Preferencias da privacidade"
#: ../js/ui/status/location.js:176
#: ../js/ui/status/location.js:166
msgid "In Use"
msgstr "En uso"
#: ../js/ui/status/location.js:180
#: ../js/ui/status/location.js:170
msgid "Enable"
msgstr "Activar"
@@ -1521,7 +1470,7 @@ msgid "Connected"
msgstr "Conectado"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu)
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:463
msgid "Unmanaged"
msgstr "Sen xestionar"
@@ -1534,19 +1483,19 @@ msgstr "Desconectando…"
msgid "Connecting"
msgstr "Conectando"
#. Translators: this is for network connections that require some kind of key or password
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
msgid "Authentication required"
msgstr "Requírese autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing
#. module, which is missing */
#: ../js/ui/status/network.js:482
msgid "Firmware missing"
msgstr "Falta o «firmware»"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage
#. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:486
msgid "Unavailable"
msgstr "Non dispoñíbel"
@@ -1631,7 +1580,7 @@ msgstr "Punto wifi activo"
msgid "connecting..."
msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:1412
msgid "authentication required"
msgstr "requírese autenticación"
@@ -1668,19 +1617,15 @@ msgstr "Preferencias de enerxía"
msgid "Fully Charged"
msgstr "Carga completa"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
msgid "Estimating…"
msgstr "Estimando…"
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
#: ../js/ui/status/power.js:86
#, javascript-format
msgid "%d%02d Remaining (%d%%)"
msgstr "Faltan %d:%02d (%d%%)"
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
#: ../js/ui/status/power.js:91
#, javascript-format
msgid "%d%02d Until Full (%d%%)"
@@ -1694,9 +1639,6 @@ msgstr "SAI"
msgid "Battery"
msgstr "Batería"
#. The menu only appears when airplane mode is on, so just
#. statically build it as if it was on, rather than dynamically
#. changing the menu contents.
#: ../js/ui/status/rfkill.js:83
msgid "Airplane Mode"
msgstr "Modo avión"
@@ -1745,11 +1687,11 @@ msgstr "Iniciar sesión como outro usuario"
msgid "Unlock Window"
msgstr "Desbloquear xanela"
#: ../js/ui/viewSelector.js:158
#: ../js/ui/viewSelector.js:232
msgid "Applications"
msgstr "Aplicativos"
#: ../js/ui/viewSelector.js:162
#: ../js/ui/viewSelector.js:236
msgid "Search"
msgstr "Buscar"
@@ -1764,7 +1706,7 @@ msgstr "Desexa manter estas preferencias de pantalla?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#. */
#: ../js/ui/windowManager.js:84
msgid "Revert Settings"
msgstr "Reverter preferencias"
@@ -1846,21 +1788,21 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sons do sistema"
#: ../src/main.c:373
#: ../src/main.c:371
msgid "Print version"
msgstr "Imprimir versión"
#: ../src/main.c:379
#: ../src/main.c:377
msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para a pantalla de inicio"
#: ../src/main.c:385
#: ../src/main.c:383
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr ""
"Usar un modo específico, por exemplo, «gdm» para a pantalla de inicio de "
"sesión"
#: ../src/main.c:391
#: ../src/main.c:389
msgid "List possible modes"
msgstr "Listar os modos posíbeis"

337
po/gu.po
View File

@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gu\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-10-01 07:39+0000\n"
"PO-Revision-Date: 2014-10-01 15:51+0530\n"
"POT-Creation-Date: 2014-08-26 07:37+0000\n"
"PO-Revision-Date: 2014-08-26 16:19+0530\n"
"Last-Translator: \n"
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
"Language: \n"
@@ -63,7 +63,7 @@ msgstr "GNOME Shell ઍક્સટેન્શનને રૂપરેખા
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
msgid "GNOME Shell (wayland compositor)"
msgstr "GNOME Shell (વેલૅન્ડ કંપોઝીટર)"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
@@ -76,10 +76,12 @@ msgid ""
msgstr "Alt-F2 સંવાદની મદદથી આંતરિક ડિબગીંગ અને મોનિટરીંગ સાધનોને વાપરવા પરવાનગી આપે છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
#| msgid "Uuids of extensions to enable"
msgid "UUIDs of extensions to enable"
msgstr "સક્રિય કરવા માટે એક્સટેન્શનનું UUIDs"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
#, fuzzy
#| msgid ""
#| "GNOME Shell extensions have a uuid property; this key lists extensions "
#| "which should be loaded. Any extension that wants to be loaded needs to be "
@@ -91,14 +93,14 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell."
msgstr ""
"GNOME Shell ઍક્સટેન્શન પાસે UUID ગુણધર્મ છે; આ કી ઍક્સટેન્શનની યાદી કરે છે કે જેને લાવેલ હોવુ "
"GNOME Shell ઍક્સટેન્શન પાસે uuid ગુણધર્મ છે; આ કી ઍક્સટેન્શનની યાદી કરે છે કે જેને લાવેલ હોવુ "
"જોઇએ. કોઇપણ ઍક્સટેન્શન કે જેને આ યાદીમાં લાવવાની જરૂર છે. તમે પણ org.gnome.Shell પર "
"EnableExtension અને DisableExtension DBus પદ્દતિઓ સાથે આ યાદીને કુશળતાપૂર્વક વાપરી "
"શકો છો."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Disables the validation of extension version compatibility"
msgstr "ઍક્સટેન્શન આવૃત્તિ સુસંગતતાની માન્યતાને નિષ્ક્રિય કરે છે"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
@@ -106,9 +108,6 @@ msgid ""
"running version. Enabling this option will disable this check and try to "
"load all extensions regardless of the versions they claim to support."
msgstr ""
"GNOME Shell એ ફક્ત ઍક્સટેન્શનને લાવશે કે જે હાલની ચાલતી આવૃત્તિને આધાર આપવા માટે દાવો કરે છે. "
"આ વિકલ્પને સક્રિય કરવાનું આ ચકાસણીને નિષ્ક્રિય કરશે અને આવૃત્તિને બાદ કરતા બધા ઍક્સટેન્શનને "
"લાવવાનો પ્રયત્ન કરે છે જે તેઓ આધાર આપવા માટે દાવો કરે છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
@@ -122,11 +121,11 @@ msgstr "કાર્યક્રમો આ ઓળખકર્તાઓ સાથ
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "App Picker View"
msgstr "કાર્યક્રમ પસંદકર્તા દૃશ્ય"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
msgid "Index of the currently selected view in the application picker."
msgstr "કાર્યક્રમ પસંદકર્તામાં હાલમાં પસંદ થયેલ દૃશ્યની અનુક્રમણિકા."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "History for command (Alt-F2) dialog"
@@ -137,10 +136,13 @@ msgid "History for the looking glass dialog"
msgstr "ગ્લાસ સંવાદને જોવા માટે ઇતિહાસ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
#, fuzzy
#| msgid "Always show the 'Log out' menuitem in the user menu."
msgid "Always show the 'Log out' menu item in the user menu."
msgstr "વપરાશકર્તા મેનુમાં હંમેશા 'બહાર નીકળો' મેનુ વસ્તુને બતાવ."
msgstr "હંમેશા વપરાશકર્તા મેનુમાં 'બહાર નીકળો' મેનુવસ્તુને બતાવે છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
#, fuzzy
#| msgid ""
#| "This key overrides the automatic hiding of the 'Log out' menuitem in "
#| "single-user, single-session situations."
@@ -148,8 +150,7 @@ msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
msgstr ""
"આ કી એકજ વપરાશકર્તા, એકજ-સત્ર પરિસ્થિતિઓમાં 'બહાર નીકળો' મેનુવસ્તુને આપમેળે છુપાવવા આ કીને "
"ઓવરરાઇડ કરવામાં "
"આ કી એકજ વપરાશકર્તામાં 'બહાર નીકળો' મેનુવસ્તુને આપમેળે છુપાવવા આ કીને ઓવરરાઇડ કરવામાં "
"આવી છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
@@ -192,12 +193,16 @@ msgid "Keybinding to open the \"Show Applications\" view of the Activities Overv
msgstr "પ્રવૃત્તિ ઝાંખીનાં \"કાર્યક્રમો બતાવો\" દૃશ્યને ખોલવા માટે કિબાઇન્ડીંગ."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
#, fuzzy
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the overview"
msgstr "ઝાંખીને ખોલવા માટે કિબાઇન્ડીંગ"
msgstr "\"કાર્યક્રમો બતાવો\" દૃશ્યને ખોલવા માટે કિબાઇન્ડીંગ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
#, fuzzy
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the Activities Overview."
msgstr "પ્રવૃત્તિ ઝાંખીને ખોલવા માટે કિબાઇન્ડીંગ"
msgstr "\"કાર્યક્રમો બતાવો\" દૃશ્યને ખોલવા માટે કિબાઇન્ડીંગ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to toggle the visibility of the message tray"
@@ -217,7 +222,7 @@ msgstr "સક્રિય સૂચના પર પ્રકાશ નાં
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr "કીબાઇન્ડીંગ કે જે બધી ચાલતી ટ્વીનને અટકાવે છે અને પાછુ લાવે છે, ડિબગીંગ હેતુઓ માટે"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Which keyboard to use"
@@ -229,15 +234,13 @@ msgstr "વાપરવા માટે કિબોર્ડનો પ્રક
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "Limit switcher to current workspace."
msgstr "વર્તમાન કામ કરવાની જગ્યા માટે સ્વિચર મર્યાદિત કરી છે."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid ""
"If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included."
msgstr ""
"જો true હોય તો, ફક્ત કાર્યક્રમો કે જેની પાસે હાલની કાર્ય કરવાની જગ્યા પર વિન્ડો છે તે "
"સ્વીચરમાં બતાવેલ છે. નહિંતો, બધા કાર્યક્રમનો સમાવેલ છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "The application icon mode."
@@ -258,8 +261,6 @@ msgid ""
"If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included."
msgstr ""
"જો true હોય તો, હાલની કાર્ય કરવાની જગ્યામાંથી વિન્ડો સ્વીચરમાં બતાવેલ છે. નહિં તો, બધી "
"વિન્ડોને સમાવેલ છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Attach modal dialog to the parent window"
@@ -283,23 +284,24 @@ msgstr "ફક્ત પ્રાથમિક મોનિટર પર કા
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "માઉસ સ્થિતિમાં ફેરફારો કરવામાં વિલંબ જ્યાં સુધી પોઇંટર ખસેડવાનું બંધ થાય"
msgstr ""
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
msgid "Captive Portal"
msgstr "કૅપ્ટીવ પોર્ટલ"
msgstr ""
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:127
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "ત્યાં %s માટે પસંદગી સંવાદને લાવવામાં ભૂલ હતી:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:159
#| msgid "Configure GNOME Shell Extensions"
msgid "GNOME Shell Extensions"
msgstr "GNOME Shell ઍક્સટેન્શન"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@@ -320,6 +322,7 @@ msgid "Sign In"
msgstr "પ્રવેશો"
#: ../js/gdm/loginDialog.js:269
#| msgid "Switch Session"
msgid "Choose Session"
msgstr "સત્ર પસંદ કરો"
@@ -358,48 +361,52 @@ msgid "Could not parse command:"
msgstr "આદેશનું પદચ્છેદન કરી શક્યા નથી:"
#: ../js/misc/util.js:156
#, javascript-format
#, fuzzy, javascript-format
#| msgid "Execution of '%s' failed:"
msgid "Execution of “%s” failed:"
msgstr "%s ને અમલમાં મૂકવાનુ નિષ્ફળ:"
msgstr "'%s' ને અમલમાં મૂકવાનુ નિષ્ફળ:"
#: ../js/portalHelper/main.js:85
#, fuzzy
#| msgid "Authentication Required"
msgid "Web Authentication Redirect"
msgstr "વેબ સત્તાધિકરણ દિશામાન"
msgstr "સત્તાધિકરણ જરૂરી"
#: ../js/ui/appDisplay.js:772
#: ../js/ui/appDisplay.js:660
msgid "Frequently used applications will appear here"
msgstr "વારંવાર વપરાતા કાર્યક્રમો અહિંયા દેખાશે"
msgstr ""
#: ../js/ui/appDisplay.js:883
#: ../js/ui/appDisplay.js:771
msgid "Frequent"
msgstr "સામાન્ય"
#: ../js/ui/appDisplay.js:890
#: ../js/ui/appDisplay.js:778
msgid "All"
msgstr "બધા"
#: ../js/ui/appDisplay.js:1790
#: ../js/ui/appDisplay.js:1650
msgid "New Window"
msgstr "નવી વિન્ડો"
#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "પસંદીદાઓ માંથી દૂર કરો"
#: ../js/ui/appDisplay.js:1822
#: ../js/ui/appDisplay.js:1679
msgid "Add to Favorites"
msgstr "પસંદીદાને ઉમેરો"
#: ../js/ui/appDisplay.js:1831
#: ../js/ui/appDisplay.js:1688
#| msgid "Show Text"
msgid "Show Details"
msgstr "વિગતો બતાવો"
#: ../js/ui/appFavorites.js:132
#: ../js/ui/appFavorites.js:122
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s ને તમારી પસંદીદામાં ઉમેરી દેવામાં આવ્યુ છે."
#: ../js/ui/appFavorites.js:166
#: ../js/ui/appFavorites.js:156
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s ને તમારી પસંદીદામાંથી દૂર કરી દેવામાં આવ્યુ છે."
@@ -591,11 +598,11 @@ msgstr "%s સાથે ખોલો"
msgid "Eject"
msgstr "રદ કરો"
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "પાસવર્ડ:"
#: ../js/ui/components/keyring.js:120
#: ../js/ui/components/keyring.js:113
msgid "Type again:"
msgstr "ફરીથી પ્રયત્ન કરો:"
@@ -633,11 +640,14 @@ msgid "Authentication required by wireless network"
msgstr "વાયરલેસ નેટવર્ક દ્દારાસત્તાધિકરણ જરૂરી"
#: ../js/ui/components/networkAgent.js:319
#, javascript-format
#, fuzzy, javascript-format
#| msgid ""
#| "Passwords or encryption keys are required to access the wireless network "
#| "'%s'."
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "પાસવર્ડ અથવા એનક્રિપ્શન કીઓને વાયરલેસ નેટવર્ક %s માં પ્રવેશની જરૂર છે."
msgstr "પાસવર્ડ અથવા એનક્રિપ્શન કીઓને વાયરલેસ નેટવર્ક '%s' માં પ્રવેશની જરૂર છે."
#: ../js/ui/components/networkAgent.js:323
msgid "Wired 802.1X authentication"
@@ -669,6 +679,7 @@ msgstr "મોબાઇલ બ્રોડબેન્ડ નેટવર્ક
#: ../js/ui/components/networkAgent.js:346
#, javascript-format
#| msgid "A password is required to connect to '%s'."
msgid "A password is required to connect to “%s”."
msgstr "પાસવર્ડ “%s” સાથે જોડાવા માટે જરૂરી છે."
@@ -724,12 +735,14 @@ msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:960
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgid "Yesterday, %H%M"
msgstr "ગઇ કાલે, %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:967
#| msgid "%A, %B %d"
msgid "%A, %H%M"
msgstr "%A, %H%M"
@@ -749,6 +762,8 @@ msgstr "%B %d %Y, %H%M"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:986
#| msgctxt "event list time"
#| msgid "%l:%M %p"
msgid "%l%M %p"
msgstr "%l%M %p"
@@ -761,6 +776,7 @@ msgstr "ગઈકાલે %l:%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1000
#| msgid "%a %l:%M %p"
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@@ -768,6 +784,7 @@ msgstr "%A, %l%M %p"
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1007
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d, %l%M %p"
msgstr "%B %d, %l%M %p"
@@ -775,6 +792,7 @@ msgstr "%B %d, %l%M %p"
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1013
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d %Y, %l%M %p"
msgstr "%B %d %Y, %l%M %p"
@@ -961,7 +979,7 @@ msgstr "ખાતામાં જુઓ"
msgid "Unknown reason"
msgstr "અજ્ઞાત કારણ"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
msgid "Windows"
msgstr "વિન્ડો"
@@ -992,129 +1010,132 @@ msgstr "તારીખ અને સમય સુયોજનો"
msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:64
#: ../js/ui/endSessionDialog.js:66
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "%s માંથી બહાર નીકળો"
#: ../js/ui/endSessionDialog.js:65
#: ../js/ui/endSessionDialog.js:67
msgctxt "title"
msgid "Log Out"
msgstr "બહાર નીકળો"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:69
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s એ %d સેકંડમાં આપમેળે બહાર નીકળી જશે."
msgstr[1] "%s એ %d સેકંડોમાં આપમેળે બહાર નીકળી જશે."
#: ../js/ui/endSessionDialog.js:72
#: ../js/ui/endSessionDialog.js:74
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "તમે %d સેકંડમાં આપમેળે બહાર નીકળી જશે."
msgstr[1] "તમે %d સેકંડોમાં આપમેળે બહાર નીકળી જશે."
#: ../js/ui/endSessionDialog.js:78
#: ../js/ui/endSessionDialog.js:80
msgctxt "button"
msgid "Log Out"
msgstr "બહાર નીકળો"
#: ../js/ui/endSessionDialog.js:84
#: ../js/ui/endSessionDialog.js:86
msgctxt "title"
msgid "Power Off"
msgstr "પાવર બંધ"
#: ../js/ui/endSessionDialog.js:85
#: ../js/ui/endSessionDialog.js:87
#, fuzzy
#| msgid "Install Updates & Restart"
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "સુધારા સ્થાપિત કરો અને પાવર બંધ કરો"
msgstr "સુધારા સ્થાપિત કરો અને પુન:શરૂ કરો"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:89
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પાવર બંધ થઇ જશે."
msgstr[1] "સિસ્ટમ %d સેકંડમાં આપમેળે પાવર બંધ થઇ જશે."
#: ../js/ui/endSessionDialog.js:91
#: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "બાકી રહેલા સોફ્ટવેર સુધારાને સ્થાપિત કરો"
msgstr ""
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
msgctxt "button"
msgid "Restart"
msgstr "પુન:શરૂ કરો"
#: ../js/ui/endSessionDialog.js:96
#: ../js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Power Off"
msgstr "પાવર બંધ"
#: ../js/ui/endSessionDialog.js:103
#: ../js/ui/endSessionDialog.js:105
msgctxt "title"
msgid "Restart"
msgstr "પુન:શરૂ કરો"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:107
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પુન:શરૂ થઇ જશે."
msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે પુન:શરૂ થઇ જશે."
#: ../js/ui/endSessionDialog.js:119
#: ../js/ui/endSessionDialog.js:121
#| msgid "Install Updates & Restart"
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "સુધારા સ્થાપિત કરો અને પુન:શરૂ કરો"
#: ../js/ui/endSessionDialog.js:121
#, javascript-format
#: ../js/ui/endSessionDialog.js:123
#, fuzzy, javascript-format
#| msgid "The system will restart automatically in %d second."
#| msgid_plural "The system will restart automatically in %d seconds."
msgid "The system will automatically restart and install updates in %d second."
msgid_plural "The system will automatically restart and install updates in %d seconds."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે સુધારાઓને પુન:શરૂ અને સ્થાપિત કરશે."
msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે સુધારાઓને પુન:શરૂ અને સ્થાપિત કરશે."
#: ../js/ui/endSessionDialog.js:127
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "પુન:શરૂ કરો અને સ્થાપિત કરો"
#: ../js/ui/endSessionDialog.js:128
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "સ્થાપિત કરો અને પાવર બંધ "
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પુન:શરૂ થઇ જશે."
msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે પુન:શરૂ થઇ જશે."
#: ../js/ui/endSessionDialog.js:129
msgctxt "button"
msgid "Restart &amp; Install"
msgstr ""
#: ../js/ui/endSessionDialog.js:130
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr ""
#: ../js/ui/endSessionDialog.js:131
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "સુધારા સ્થાપિત થાય પછી પાવર બંધ કરો"
msgstr ""
#: ../js/ui/endSessionDialog.js:338
#: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates."
msgstr "બેટરી પાવર પર ચાલી રહ્યુ છે: મહેરબાની કરીને સુધારા સ્થાપિત કરતા પહેલાં પ્લગઇન કરો."
msgstr ""
#: ../js/ui/endSessionDialog.js:355
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
msgstr "અમુક કાર્યક્રમો વ્યસ્ત છે અથવા તેની પાસે અસંગ્રહેલ કામ છે."
msgstr ""
#: ../js/ui/endSessionDialog.js:362
#: ../js/ui/endSessionDialog.js:339
msgid "Other users are logged in."
msgstr "બીજા વપરાશકર્તાઓ પ્રવેશેલ છે."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:640
#: ../js/ui/endSessionDialog.js:619
#, javascript-format
msgid "%s (remote)"
msgstr "%s (દૂરસ્થ)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:643
#: ../js/ui/endSessionDialog.js:622
#, javascript-format
msgid "%s (console)"
msgstr "%s (કન્સોલ)"
@@ -1124,11 +1145,12 @@ msgid "Install"
msgstr "સ્થાપિત કરો"
#: ../js/ui/extensionDownloader.js:204
#, javascript-format
#, fuzzy, javascript-format
#| msgid "Download and install '%s' from extensions.gnome.org?"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org માંથી %s ને સ્થાપિત અને ડાઉનલોડ કરો?"
msgstr "extensions.gnome.org માંથી '%s' ને સ્થાપિત અને ડાઉનલોડ કરો?"
#: ../js/ui/keyboard.js:700 ../js/ui/status/keyboard.js:523
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
msgid "Keyboard"
msgstr "કિબોર્ડ"
@@ -1150,8 +1172,8 @@ msgstr "ભૂલો છુપાડો"
msgid "Show Errors"
msgstr "ભૂલો બતાવો"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
msgid "Enabled"
msgstr "સક્રિય"
@@ -1159,7 +1181,7 @@ msgstr "સક્રિય"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "નિષ્ક્રિય"
@@ -1184,39 +1206,39 @@ msgstr "સ્ત્રોત દર્શાવો"
msgid "Web Page"
msgstr "વેબ પાનું"
#: ../js/ui/messageTray.js:1327
#: ../js/ui/messageTray.js:1325
msgid "Open"
msgstr "ખોલો"
#: ../js/ui/messageTray.js:1334
#: ../js/ui/messageTray.js:1332
msgid "Remove"
msgstr "દૂર કરો"
#: ../js/ui/messageTray.js:1631
#: ../js/ui/messageTray.js:1629
msgid "Notifications"
msgstr "સૂચનાઓ"
#: ../js/ui/messageTray.js:1638
#: ../js/ui/messageTray.js:1636
msgid "Clear Messages"
msgstr "સંદેશા સાફ કરો"
#: ../js/ui/messageTray.js:1657
#: ../js/ui/messageTray.js:1655
msgid "Notification Settings"
msgstr "સૂચના સુયોજનો"
#: ../js/ui/messageTray.js:1710
#: ../js/ui/messageTray.js:1708
msgid "Tray Menu"
msgstr "ટ્રે મેનુ"
msgstr ""
#: ../js/ui/messageTray.js:1934
#: ../js/ui/messageTray.js:1925
msgid "No Messages"
msgstr "સંદેશા નથી"
#: ../js/ui/messageTray.js:1979
#: ../js/ui/messageTray.js:1963
msgid "Message Tray"
msgstr "સંદેશો ટ્રે"
#: ../js/ui/messageTray.js:2992
#: ../js/ui/messageTray.js:2966
msgid "System Information"
msgstr "સિસ્ટમ જાણકારી"
@@ -1244,7 +1266,7 @@ msgstr "ઝાંખી"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:246
#: ../js/ui/overview.js:250
msgid "Type to search…"
msgstr "શોધવા માટે ટાઇપ કરો..."
@@ -1275,6 +1297,7 @@ msgid "Close"
msgstr "બંધ કરો"
#: ../js/ui/runDialog.js:277
#| msgid "Estimating…"
msgid "Restarting…"
msgstr "પુન:શરૂ કરી રહ્યા છે…"
@@ -1307,27 +1330,27 @@ msgstr "તાળુ મારવામાં અસમર્થ"
msgid "Lock was blocked by an application"
msgstr "તાળુ કાર્યક્રમ દ્દારા બ્લોક થયેલ છે"
#: ../js/ui/search.js:607
#: ../js/ui/search.js:606
msgid "Searching…"
msgstr "શોધી રહ્યા છે..."
#: ../js/ui/search.js:609
#: ../js/ui/search.js:652
msgid "No results."
msgstr "પરિણામો નથી."
#: ../js/ui/shellEntry.js:25
#: ../js/ui/shellEntry.js:27
msgid "Copy"
msgstr "નકલ કરો"
#: ../js/ui/shellEntry.js:30
#: ../js/ui/shellEntry.js:32
msgid "Paste"
msgstr "ચોંટાડો"
#: ../js/ui/shellEntry.js:97
#: ../js/ui/shellEntry.js:99
msgid "Show Text"
msgstr "લખાણ બતાવો"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:101
msgid "Hide Text"
msgstr "લખાણ છુપાડો"
@@ -1399,13 +1422,15 @@ msgid "Bluetooth Settings"
msgstr "બ્લુટુથ સુયોજનો"
#: ../js/ui/status/bluetooth.js:104
#, javascript-format
#, fuzzy, javascript-format
#| msgid "Connected (private)"
msgid "%d Connected Device"
msgid_plural "%d Connected Devices"
msgstr[0] "%d જોડાયેલ ઉપકરણ"
msgstr[1] "%d જોડાયેલ ઉપકરણો"
msgstr[0] "જોડાયેલ (ખાનગી)"
msgstr[1] "જોડાયેલ (ખાનગી)"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309
#| msgid "Connect"
msgid "Not Connected"
msgstr "જોડાયેલ નથી"
@@ -1413,28 +1438,26 @@ msgstr "જોડાયેલ નથી"
msgid "Brightness"
msgstr "તેજસ્વિતા"
#: ../js/ui/status/keyboard.js:547
#: ../js/ui/status/keyboard.js:406
msgid "Show Keyboard Layout"
msgstr "કીબોર્ડ લેઆઉટને બતાવો"
#: ../js/ui/status/location.js:65
#: ../js/ui/status/location.js:56
#| msgid "Notifications"
msgid "Location"
msgstr "સ્થાન"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
#| msgid "Disabled"
msgid "Disable"
msgstr "નિષ્ક્રિય"
#: ../js/ui/status/location.js:73
#| msgid "Power Settings"
msgid "Privacy Settings"
msgstr "ખાનગી સુયોજનો"
#: ../js/ui/status/location.js:176
#: ../js/ui/status/location.js:166
msgid "In Use"
msgstr "વપરાશમાં"
#: ../js/ui/status/location.js:180
#: ../js/ui/status/location.js:170
#| msgid "Enabled"
msgid "Enable"
msgstr "સક્રિય"
@@ -1444,35 +1467,42 @@ msgstr "<અજ્ઞાત>"
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
#: ../js/ui/status/network.js:1511
#| msgid "Offline"
msgid "Off"
msgstr "બંધ"
#: ../js/ui/status/network.js:459
#| msgid "Connect"
msgid "Connected"
msgstr "જોડાયેલ"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:463
#| msgid "unmanaged"
msgid "Unmanaged"
msgstr "સંચાલિત થયેલ નથી"
#: ../js/ui/status/network.js:465
#| msgid "disconnecting..."
msgid "Disconnecting"
msgstr "જોડાઇ તૂટી રહ્યુ છે"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#| msgid "Connection"
msgid "Connecting"
msgstr "જોડાઇ રહ્યા છે"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#| msgid "authentication required"
msgid "Authentication required"
msgstr "સત્તાધિકરણ જરૂરી"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:482
#| msgid "firmware missing"
msgid "Firmware missing"
msgstr "ફર્મવેર ગેરહાજર"
@@ -1487,32 +1517,36 @@ msgid "Connection failed"
msgstr "જોડાણ નિષ્ફળ"
#: ../js/ui/status/network.js:504
#, fuzzy
#| msgid "Settings"
msgid "Wired Settings"
msgstr "વાયર થયેલ સુયોજનો"
msgstr "સુયોજનો"
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
#| msgid "Mobile broadband"
msgid "Mobile Broadband Settings"
msgstr "મોબાઇલ બ્રોડબેન્ડ સુયોજનો"
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
#| msgid "hardware disabled"
msgid "Hardware Disabled"
msgstr "હાર્ડવેર નિષ્ક્રિય"
#: ../js/ui/status/network.js:632
msgid "Use as Internet connection"
msgstr "ઇન્ટરનેટ જોડાણ તરીકે વાપરો"
msgstr ""
#: ../js/ui/status/network.js:813
msgid "Airplane Mode is On"
msgstr "ઍરપ્લેન સ્થિતિ ચાલુ છે"
msgstr ""
#: ../js/ui/status/network.js:814
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Wi-Fi નિષ્ક્રિય થયેલ છે જ્યારે ઍરપ્લેન સ્થિતિ ચાલુ હોય."
msgstr ""
#: ../js/ui/status/network.js:815
msgid "Turn Off Airplane Mode"
msgstr "ઍરપ્લેન સ્થિતિને બંધ કરો"
msgstr ""
#: ../js/ui/status/network.js:824
msgid "Wi-Fi is Off"
@@ -1520,33 +1554,38 @@ msgstr "Wi-Fi બંધ છે"
#: ../js/ui/status/network.js:825
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "નેટવર્કમાં જોડાવા માટે ક્રમમાં Wi-Fi ને ચાલુ કરવાની જરૂર છે."
msgstr ""
#: ../js/ui/status/network.js:826
msgid "Turn On Wi-Fi"
msgstr "Wi-Fi ચાલુ કરો"
msgstr ""
#: ../js/ui/status/network.js:851
#| msgid "Network"
msgid "Wi-Fi Networks"
msgstr "Wi-Fi નેટવર્ક"
#: ../js/ui/status/network.js:853
#| msgid "Enable networking"
msgid "Select a network"
msgstr "નેટવર્ક પસંદ કરો"
#: ../js/ui/status/network.js:882
#| msgid "Network"
msgid "No Networks"
msgstr "નેટવર્ક નથી"
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
msgid "Use hardware switch to turn off"
msgstr "બંધ કરવા માટે હાર્ડવેર સ્વીચને વાપરો"
msgstr ""
#: ../js/ui/status/network.js:1173
#| msgid "Network"
msgid "Select Network"
msgstr "નેટવર્ક પસંદ કરો"
#: ../js/ui/status/network.js:1179
#| msgid "Settings"
msgid "Wi-Fi Settings"
msgstr "Wi-Fi સુયોજનો"
@@ -1556,7 +1595,7 @@ msgstr "ચાલુ કરો"
#: ../js/ui/status/network.js:1298
msgid "Hotspot Active"
msgstr "હૉટસ્પોટ સક્રિય"
msgstr ""
#: ../js/ui/status/network.js:1409
msgid "connecting..."
@@ -1576,6 +1615,7 @@ msgid "Network Settings"
msgstr "નેટવર્ક સુયોજનો"
#: ../js/ui/status/network.js:1482
#| msgid "Settings"
msgid "VPN Settings"
msgstr "VPN સુયોજનો"
@@ -1606,12 +1646,12 @@ msgstr "અંદાજ કરી રહ્યા છે..."
#: ../js/ui/status/power.js:86
#, javascript-format
msgid "%d%02d Remaining (%d%%)"
msgstr "%d%02d બાકી રહેલ છે (%d%%)"
msgstr ""
#: ../js/ui/status/power.js:91
#, javascript-format
msgid "%d%02d Until Full (%d%%)"
msgstr "%d%02d જ્યાં સુધી સંપૂર્ણ થાય (%d%%)"
msgstr ""
#: ../js/ui/status/power.js:119
msgid "UPS"
@@ -1623,9 +1663,10 @@ msgstr "બેટરી"
#: ../js/ui/status/rfkill.js:83
msgid "Airplane Mode"
msgstr "ઍરપ્લેન સ્થિતિ"
msgstr ""
#: ../js/ui/status/rfkill.js:85
#| msgid "Open"
msgid "On"
msgstr "ચાલુ"
@@ -1639,7 +1680,7 @@ msgstr "બહાર નીકળો"
#: ../js/ui/status/system.js:341
msgid "Orientation Lock"
msgstr "દિશા તાળુ"
msgstr ""
#: ../js/ui/status/system.js:349
msgid "Suspend"
@@ -1669,40 +1710,43 @@ msgstr "બીજા વપરાશકર્તા તરીકે પ્રવ
msgid "Unlock Window"
msgstr "વિન્ડોનું તાળુ ખોલો"
#: ../js/ui/viewSelector.js:158
#: ../js/ui/viewSelector.js:232
msgid "Applications"
msgstr "કાર્યક્રમો"
#: ../js/ui/viewSelector.js:162
#: ../js/ui/viewSelector.js:236
msgid "Search"
msgstr "શોધો"
#: ../js/ui/windowAttentionHandler.js:19
#, javascript-format
#| msgid "'%s' is ready"
msgid "“%s” is ready"
msgstr "“%s” તૈયાર છે"
#: ../js/ui/windowManager.js:65
msgid "Do you want to keep these display settings?"
msgstr "શું તમને આ દર્શાવ સુયોજનોને રાખવા માંગો છો?ે"
msgstr ""
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#. */
#: ../js/ui/windowManager.js:84
#, fuzzy
#| msgid "Power Settings"
msgid "Revert Settings"
msgstr "સુયોજનોને પાછા લાવો"
msgstr "પાવર સુયોજનો"
#: ../js/ui/windowManager.js:88
msgid "Keep Changes"
msgstr "ફેરફારો કરો"
msgstr ""
#: ../js/ui/windowManager.js:107
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
msgstr[0] "સુયોજન ફેરફારો એ %d સેકંડમાં પાછા આવશે"
msgstr[1] "સુયોજન ફેરફારો એ %d સેકંડોમાં પાછા આવશે"
msgstr[0] ""
msgstr[1] ""
#: ../js/ui/windowMenu.js:34
msgid "Minimize"
@@ -1726,7 +1770,7 @@ msgstr "માપ બદલો"
#: ../js/ui/windowMenu.js:65
msgid "Move Titlebar Onscreen"
msgstr "શીર્ષકપટ્ટી ઓનસ્ક્રીનને ખસેડો"
msgstr ""
#: ../js/ui/windowMenu.js:70
msgid "Always on Top"
@@ -1734,15 +1778,15 @@ msgstr "હંમેશા ટોચ ઉપર"
#: ../js/ui/windowMenu.js:89
msgid "Always on Visible Workspace"
msgstr "હંમેશા દૃશ્ય કામ કરવાની જગ્યા પર"
msgstr ""
#: ../js/ui/windowMenu.js:106
msgid "Move to Workspace Up"
msgstr "ઉપર કામ કરવાની જગ્યા પર ખસેડો"
msgstr ""
#: ../js/ui/windowMenu.js:111
msgid "Move to Workspace Down"
msgstr "નીચે કામ કરવાની જગ્યાએ ખસેડો"
msgstr ""
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar"
@@ -1770,24 +1814,25 @@ msgstr[1] "%u ઇનપુટો"
msgid "System Sounds"
msgstr "સિસ્ટમ અવાજો"
#: ../src/main.c:373
#: ../src/main.c:371
msgid "Print version"
msgstr "ા"
#: ../src/main.c:379
#: ../src/main.c:377
msgid "Mode used by GDM for login screen"
msgstr "લૉગિન સ્ક્રીન માટે GDM દ્દારા વાપરેલ સ્થિતિ"
#: ../src/main.c:385
#: ../src/main.c:383
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "ખાસ સ્થિતિને વાપરો, દા.ત. પ્રવેશ સ્ક્રીન માટે \"gdm\""
#: ../src/main.c:391
#: ../src/main.c:389
msgid "List possible modes"
msgstr "શક્ય સ્થિતિઓની યાદી કરો"
#: ../src/shell-app.c:666
#, c-format
#| msgid "Failed to launch '%s'"
msgid "Failed to launch “%s”"
msgstr "“%s” ને શરૂ કરવામાં નિષ્ફળતા"

592
po/he.po

File diff suppressed because it is too large Load Diff

2257
po/hi.po

File diff suppressed because it is too large Load Diff

697
po/hu.po

File diff suppressed because it is too large Load Diff

443
po/id.po

File diff suppressed because it is too large Load Diff

890
po/it.po

File diff suppressed because it is too large Load Diff

822
po/ja.po

File diff suppressed because it is too large Load Diff

1060
po/kk.po

File diff suppressed because it is too large Load Diff

2269
po/kn.po

File diff suppressed because it is too large Load Diff

893
po/ko.po

File diff suppressed because it is too large Load Diff

392
po/lt.po

File diff suppressed because it is too large Load Diff

951
po/lv.po

File diff suppressed because it is too large Load Diff

2306
po/mr.po

File diff suppressed because it is too large Load Diff

2630
po/ms.po

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More