Compare commits

..

7 Commits

Author SHA1 Message Date
d4802861ed status/keyboard: Adapt to changes in the settings schema 2012-05-15 02:24:23 +02:00
a8fa0b8146 candidatePanel: Use the Lang.Class framework 2012-05-03 13:20:01 +02:00
cf0bb62f40 candidatePanel: Remove the PopupSeparatorMenuItem copy
No reason to not use the real deal.
2012-05-03 13:20:01 +02:00
de8106967d candidatePanel: Remove hardcoded styling
The styling should be done in the CSS file.
2012-05-03 13:19:58 +02:00
1a24f061cf candidatePanel: A candidate popup for IBus input methods
This is an implementation of the org.freedesktop.IBus.Panel API which
shows a shell style popup (BoxPointer) when using an IBus input
method.

The original code is from the ibus-gjs project[1] with minor
modifications.

[1] https://github.com/fujiwarat/ibus-gjs
2012-05-03 13:19:53 +02:00
e038845458 status/keyboard: Add the input source switcher keybindings 2012-05-03 13:19:53 +02:00
b03273c765 status/keyboard: Initial port to the new input sources settings 2012-05-03 13:19:53 +02:00
42 changed files with 2310 additions and 2639 deletions

View File

@ -328,11 +328,6 @@ StScrollBar StButton#vhandle:hover
background-gradient-end: rgba(255, 255, 255, 0.2);
}
.notification-icon-button:insensitive,
.notification-button:insensitive {
color: #9f9f9f;
}
/* Panel */
#panel {
@ -362,7 +357,7 @@ StScrollBar StButton#vhandle:hover
}
.panel-corner {
-panel-corner-radius: 6px;
-panel-corner-radius: 10px;
-panel-corner-background-color: black;
-panel-corner-border-width: 2px;
-panel-corner-border-color: transparent;
@ -414,7 +409,7 @@ StScrollBar StButton#vhandle:hover
.panel-button:active,
.panel-button:overview,
.panel-button:focus {
border-image: url("panel-button-border.svg") 6 10 0 2;
border-image: url("panel-button-border.svg") 10 10 0 2;
background-image: url("panel-button-highlight-wide.svg");
color: white;
text-shadow: black 0px 2px 2px;
@ -1715,7 +1710,7 @@ StScrollBar StButton#vhandle:hover
}
.lightbox {
background-color: black;
background-color: rgba(0, 0, 0, 0.4);
}
.flashspot {
@ -2045,3 +2040,30 @@ StScrollBar StButton#vhandle:hover
-arrow-rise: 10px;
-boxpointer-gap: 5px;
}
/* Candidate Window */
.candidate-panel {
min-width: 100px;
padding: .5em;
spacing: 0;
}
.candidate-area {
padding-top: 5px;
}
.candidate-label {
cursor: pointer;
}
.candidate-hlabel-content {
padding: 0em .5em 0em 0em;
}
.candidate-htext-content {
padding: 0em;
}
.candidate-vcontent {
padding: 0em .5em 0em 0em;
}

View File

@ -9,7 +9,7 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="17"
width="21"
height="10"
id="svg2"
version="1.1"
@ -66,9 +66,9 @@
<rect
style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none"
id="rect3796"
width="7"
width="3"
height="2"
x="5"
x="9"
y="8" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -78,13 +78,13 @@ nobase_dist_js_DATA = \
ui/popupMenu.js \
ui/remoteSearch.js \
ui/runDialog.js \
ui/screenShield.js \
ui/scripting.js \
ui/search.js \
ui/searchDisplay.js \
ui/shellDBus.js \
ui/statusIconDispatcher.js \
ui/status/accessibility.js \
ui/status/candidatePanel.js \
ui/status/keyboard.js \
ui/status/network.js \
ui/status/power.js \
@ -92,7 +92,6 @@ nobase_dist_js_DATA = \
ui/status/bluetooth.js \
ui/telepathyClient.js \
ui/tweener.js \
ui/unlockDialog.js \
ui/userMenu.js \
ui/viewSelector.js \
ui/wanda.js \

View File

@ -39,8 +39,8 @@ const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const PASSWORD_SERVICE_NAME = 'gdm-password';
const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
const _PASSWORD_SERVICE_NAME = 'gdm-password';
const _FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
const _FADE_ANIMATION_TIME = 0.16;
const _RESIZE_ANIMATION_TIME = 0.25;
const _SCROLL_ANIMATION_TIME = 2.0;
@ -747,13 +747,15 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._onOpened));
this._userManager = AccountsService.UserManager.get_default()
this._greeterClient = GdmGreeter.Server.new_for_greeter_sync(null);
this._greeterClient = new GdmGreeter.Client();
this._greeterClient.call_start_conversation_sync(PASSWORD_SERVICE_NAME, null);
this._greeterClient.open_connection();
this._greeterClient.call_start_conversation(_PASSWORD_SERVICE_NAME);
this._greeterClient.connect('reset',
Lang.bind(this, this._onReset));
this._greeterClient.connect('default-session-name-changed',
this._greeterClient.connect('default-session-changed',
Lang.bind(this, this._onDefaultSessionChanged));
this._greeterClient.connect('info',
Lang.bind(this, this._onInfo));
@ -767,6 +769,8 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._onSessionOpened));
this._greeterClient.connect('timed-login-requested',
Lang.bind(this, this._onTimedLoginRequested));
this._greeterClient.connect('authentication-failed',
Lang.bind(this, this._onAuthenticationFailed));
this._greeterClient.connect('conversation-stopped',
Lang.bind(this, this._onConversationStopped));
@ -895,7 +899,7 @@ const LoginDialog = new Lang.Class({
this._haveFingerprintReader = true;
if (this._haveFingerprintReader)
this._greeterClient.call_start_conversation_sync(FINGERPRINT_SERVICE_NAME, null);
this._greeterClient.call_start_conversation(_FINGERPRINT_SERVICE_NAME);
}));
},
@ -914,7 +918,7 @@ const LoginDialog = new Lang.Class({
},
_onReset: function(client, serviceName) {
this._greeterClient.call_start_conversation_sync(PASSWORD_SERVICE_NAME, null);
this._greeterClient.call_start_conversation(_PASSWORD_SERVICE_NAME);
this._startFingerprintConversationIfNeeded();
let tasks = [this._hidePrompt,
@ -950,7 +954,7 @@ const LoginDialog = new Lang.Class({
// We don't display fingerprint messages, because they
// have words like UPEK in them. Instead we use the messages
// as a cue to display our own message.
if (serviceName == FINGERPRINT_SERVICE_NAME &&
if (serviceName == _FINGERPRINT_SERVICE_NAME &&
this._haveFingerprintReader &&
(!this._promptFingerprintMessage.visible ||
this._promptFingerprintMessage.opacity != 255)) {
@ -959,7 +963,7 @@ const LoginDialog = new Lang.Class({
return;
}
if (serviceName != PASSWORD_SERVICE_NAME)
if (serviceName != _PASSWORD_SERVICE_NAME)
return;
Main.notifyError(info);
},
@ -967,13 +971,13 @@ const LoginDialog = new Lang.Class({
_onProblem: function(client, serviceName, problem) {
// we don't want to show auth failed messages to
// users who haven't enrolled their fingerprint.
if (serviceName != PASSWORD_SERVICE_NAME)
if (serviceName != _PASSWORD_SERVICE_NAME)
return;
Main.notifyError(problem);
},
_onCancel: function(client) {
this._greeterClient.call_cancel_sync(null);
this._greeterClient.call_cancel();
},
_fadeInPrompt: function() {
@ -1080,7 +1084,7 @@ const LoginDialog = new Lang.Class({
let _text = this._promptEntry.get_text();
this._promptEntry.reactive = false;
this._promptEntry.add_style_pseudo_class('insensitive');
this._greeterClient.call_answer_query_sync(serviceName, _text, null);
this._greeterClient.call_answer_query(serviceName, _text);
}];
let batch = new Batch.ConsecutiveBatch(this, tasks);
@ -1088,7 +1092,7 @@ const LoginDialog = new Lang.Class({
},
_onInfoQuery: function(client, serviceName, question) {
// We only expect questions to come from the main auth service
if (serviceName != PASSWORD_SERVICE_NAME)
if (serviceName != _PASSWORD_SERVICE_NAME)
return;
this._promptEntry.set_text('');
@ -1098,7 +1102,7 @@ const LoginDialog = new Lang.Class({
_onSecretInfoQuery: function(client, serviceName, secretQuestion) {
// We only expect secret requests to come from the main auth service
if (serviceName != PASSWORD_SERVICE_NAME)
if (serviceName != _PASSWORD_SERVICE_NAME)
return;
this._promptEntry.set_text('');
@ -1107,7 +1111,7 @@ const LoginDialog = new Lang.Class({
},
_onSessionOpened: function(client, serviceName) {
this._greeterClient.call_start_session_when_ready_sync(serviceName, true, null);
this._greeterClient.call_start_session_when_ready(serviceName, true);
},
_waitForItemForUser: function(userName) {
@ -1189,7 +1193,7 @@ const LoginDialog = new Lang.Class({
function() {
this._timedLoginBatch = null;
this._greeterClient.call_begin_auto_login_sync(userName, null);
this._greeterClient.call_begin_auto_login(userName);
}];
this._timedLoginBatch = new Batch.ConsecutiveBatch(this, tasks);
@ -1232,13 +1236,17 @@ const LoginDialog = new Lang.Class({
}));
},
_onAuthenticationFailed: function(client) {
this._greeterClient.call_cancel();
},
_onConversationStopped: function(client, serviceName) {
// if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed
if (serviceName == PASSWORD_SERVICE_NAME) {
this._greeterClient.call_cancel_sync(null);
} else if (serviceName == FINGERPRINT_SERVICE_NAME) {
if (serviceName == _PASSWORD_SERVICE_NAME) {
this._greeterClient.call_cancel();
} else if (serviceName == _FINGERPRINT_SERVICE_NAME) {
_fadeOutActor(this._promptFingerprintMessage);
}
},
@ -1261,7 +1269,7 @@ const LoginDialog = new Lang.Class({
this._fadeOutLogo]),
function() {
this._greeterClient.call_begin_verification_sync(PASSWORD_SERVICE_NAME, null);
this._greeterClient.call_begin_verification(_PASSWORD_SERVICE_NAME);
}];
let batch = new Batch.ConsecutiveBatch(this, tasks);
@ -1320,11 +1328,11 @@ const LoginDialog = new Lang.Class({
function() {
let userName = activatedItem.user.get_user_name();
this._greeterClient.call_begin_verification_for_user_sync(PASSWORD_SERVICE_NAME,
userName, null);
this._greeterClient.call_begin_verification_for_user(_PASSWORD_SERVICE_NAME,
userName);
if (this._haveFingerprintReader)
this._greeterClient.call_begin_verification_for_user_sync(_FINGERPRINT_SERVICE_NAME, userName, null);
this._greeterClient.call_begin_verification_for_user(_FINGERPRINT_SERVICE_NAME, userName);
}];
this._user = activatedItem.user;

View File

@ -83,11 +83,10 @@ function spawnCommandLine(command_line) {
// this will throw an error.
function trySpawn(argv)
{
var success, pid;
try {
[success, pid] = GLib.spawn_async(null, argv, null,
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
null, null);
GLib.spawn_async(null, argv, null,
GLib.SpawnFlags.SEARCH_PATH,
null, null);
} catch (err) {
if (err.code == GLib.SpawnError.G_SPAWN_ERROR_NOENT) {
err.message = _("Command not found");
@ -102,10 +101,6 @@ function trySpawn(argv)
throw err;
}
// Dummy child watch; we don't want to double-fork internally
// because then we lose the parent-child relationship, which
// can break polkit. See https://bugzilla.redhat.com//show_bug.cgi?id=819275
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function () {}, null);
}
// trySpawnCommandLine:

View File

@ -312,10 +312,11 @@ const AppSearchProvider = new Lang.Class({
_init: function() {
this.parent(_("APPLICATIONS"));
this._appSys = Shell.AppSystem.get_default();
},
getResultMetas: function(apps, callback) {
getResultMetas: function(apps) {
let metas = [];
for (let i = 0; i < apps.length; i++) {
let app = apps[i];
@ -326,15 +327,15 @@ const AppSearchProvider = new Lang.Class({
}
});
}
callback(metas);
return metas;
},
getInitialResultSet: function(terms) {
this.searchSystem.pushResults(this, this._appSys.initial_search(terms));
return this._appSys.initial_search(terms);
},
getSubsearchResultSet: function(previousResults, terms) {
this.searchSystem.pushResults(this, this._appSys.subsearch(previousResults, terms));
return this._appSys.subsearch(previousResults, terms);
},
activateResult: function(app, params) {
@ -377,7 +378,7 @@ const SettingsSearchProvider = new Lang.Class({
this._gnomecc = this._appSys.lookup_app('gnome-control-center.desktop');
},
getResultMetas: function(prefs, callback) {
getResultMetas: function(prefs) {
let metas = [];
for (let i = 0; i < prefs.length; i++) {
let pref = prefs[i];
@ -388,15 +389,15 @@ const SettingsSearchProvider = new Lang.Class({
}
});
}
callback(metas);
return metas;
},
getInitialResultSet: function(terms) {
this.searchSystem.pushResults(this, this._appSys.search_settings(terms));
return this._appSys.search_settings(terms);
},
getSubsearchResultSet: function(previousResults, terms) {
this.searchSystem.pushResults(this, this._appSys.search_settings(terms));
return this._appSys.search_settings(terms);
},
activateResult: function(pref, params) {

View File

@ -262,11 +262,12 @@ const AutorunResidentSource = new Lang.Class({
Extends: MessageTray.Source,
_init: function() {
this.parent(_("Removable Devices"), 'media-removable', St.IconType.FULLCOLOR);
this.parent(_("Removable Devices"));
this._mounts = [];
this._notification = new AutorunResidentNotification(this);
this._setSummaryIcon(this.createNotificationIcon());
},
addMount: function(mount, apps) {
@ -309,6 +310,12 @@ const AutorunResidentSource = new Lang.Class({
Main.messageTray.add(this);
this.pushNotification(this._notification);
}
},
createNotificationIcon: function() {
return new St.Icon ({ icon_name: 'media-removable',
icon_type: St.IconType.FULLCOLOR,
icon_size: this.ICON_SIZE });
}
});
@ -493,11 +500,11 @@ const AutorunTransientSource = new Lang.Class({
Extends: MessageTray.Source,
_init: function(mount, apps) {
this.parent(mount.get_name());
this.mount = mount;
this.apps = apps;
this.parent(mount.get_name());
this._notification = new AutorunTransientNotification(this);
this._setSummaryIcon(this.createNotificationIcon());

View File

@ -154,7 +154,7 @@ const ContactSearchProvider = new Lang.Class({
this._contactSys = Shell.ContactSystem.get_default();
},
getResultMetas: function(ids, callback) {
getResultMetas: function(ids) {
let metas = [];
for (let i = 0; i < ids.length; i++) {
let contact = new Contact(ids[i]);
@ -165,15 +165,15 @@ const ContactSearchProvider = new Lang.Class({
}
});
}
callback(metas);
return metas;
},
getInitialResultSet: function(terms) {
this.searchSystem.pushResults(this, this._contactSys.initial_search(terms));
return this._contactSys.initial_search(terms);
},
getSubsearchResultSet: function(previousResults, terms) {
this.searchSystem.pushResults(this, this._contactSys.subsearch(previousResults, terms));
return this._contactSys.subsearch(previousResults, terms);
},
createResultActor: function(resultMeta, terms) {

View File

@ -75,7 +75,7 @@ const DateMenuButton = new Lang.Class({
// Date
this._date = new St.Label();
this.actor.label_actor = this._clock;
this.actor.label_actor = this._date;
this._date.style_class = 'datemenu-date-label';
vbox.add(this._date);

View File

@ -541,8 +541,16 @@ const KeyboardSource = new Lang.Class({
Extends: MessageTray.Source,
_init: function(keyboard) {
this.parent(_("Keyboard"));
this._keyboard = keyboard;
this.parent(_("Keyboard"), 'input-keyboard', St.IconType.SYMBOLIC);
this._setSummaryIcon(this.createNotificationIcon());
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'input-keyboard',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
},
handleSummaryClick: function() {

View File

@ -8,8 +8,6 @@ const St = imports.gi.St;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const DEFAULT_FADE_FACTOR = 0.4;
/**
* Lightbox:
* @container: parent Clutter.Container
@ -17,8 +15,7 @@ const DEFAULT_FADE_FACTOR = 0.4;
* - inhibitEvents: whether to inhibit events for @container
* - width: shade actor width
* - height: shade actor height
* - fadeInTime: seconds used to fade in
* - fadeOutTime: seconds used to fade out
* - fadeTime: seconds used to fade in/out
*
* Lightbox creates a dark translucent "shade" actor to hide the
* contents of @container, and allows you to specify particular actors
@ -41,16 +38,12 @@ const Lightbox = new Lang.Class({
params = Params.parse(params, { inhibitEvents: false,
width: null,
height: null,
fadeInTime: null,
fadeOutTime: null,
fadeFactor: DEFAULT_FADE_FACTOR
fadeTime: null
});
this._container = container;
this._children = container.get_children();
this._fadeInTime = params.fadeInTime;
this._fadeOutTime = params.fadeOutTime;
this._fadeFactor = params.fadeFactor;
this._fadeTime = params.fadeTime;
this.actor = new St.Bin({ x: 0,
y: 0,
style_class: 'lightbox',
@ -59,7 +52,6 @@ const Lightbox = new Lang.Class({
container.add_actor(this.actor);
this.actor.raise_top();
this.actor.hide();
this.shown = false;
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
@ -101,30 +93,24 @@ const Lightbox = new Lang.Class({
},
show: function() {
if (this._fadeInTime) {
this.shown = false;
if (this._fadeTime) {
this.actor.opacity = 0;
Tweener.addTween(this.actor,
{ opacity: 255 * this._fadeFactor,
time: this._fadeInTime,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.shown = true;
})
{ opacity: 255,
time: this._fadeTime,
transition: 'easeOutQuad'
});
} else {
this.actor.opacity = 255 * this._fadeFactor;
this.shown = true;
this.actor.opacity = 255;
}
this.actor.show();
},
hide: function() {
this.shown = false;
if (this._fadeOutTime) {
if (this._fadeTime) {
Tweener.addTween(this.actor,
{ opacity: 0,
time: this._fadeOutTime,
time: this._fadeTime,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.actor.hide();

View File

@ -16,7 +16,6 @@ const Params = imports.misc.params;
const MOUSE_POLL_FREQUENCY = 50;
const CROSSHAIRS_CLIP_SIZE = [100, 100];
const NO_CHANGE = 0.0;
// Settings
const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
@ -25,13 +24,6 @@ const SHOW_KEY = 'screen-magnifier-enabled';
const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier';
const SCREEN_POSITION_KEY = 'screen-position';
const MAG_FACTOR_KEY = 'mag-factor';
const INVERT_LIGHTNESS_KEY = 'invert-lightness';
const BRIGHT_RED_KEY = 'brightness-red';
const BRIGHT_GREEN_KEY = 'brightness-green';
const BRIGHT_BLUE_KEY = 'brightness-blue';
const CONTRAST_RED_KEY = 'contrast-red';
const CONTRAST_GREEN_KEY = 'contrast-green';
const CONTRAST_BLUE_KEY = 'contrast-blue';
const LENS_MODE_KEY = 'lens-mode';
const CLAMP_MODE_KEY = 'scroll-at-edges';
const MOUSE_TRACKING_KEY = 'mouse-tracking';
@ -451,21 +443,6 @@ const Magnifier = new Lang.Class({
aPref = this._settings.get_enum(MOUSE_TRACKING_KEY);
if (aPref)
zoomRegion.setMouseTrackingMode(aPref);
aPref = this._settings.get_boolean(INVERT_LIGHTNESS_KEY);
if (aPref)
zoomRegion.setInvertLightness(aPref);
let bc = {};
bc.r = this._settings.get_double(BRIGHT_RED_KEY);
bc.g = this._settings.get_double(BRIGHT_GREEN_KEY);
bc.b = this._settings.get_double(BRIGHT_BLUE_KEY);
zoomRegion.setBrightness(bc);
bc.r = this._settings.get_double(CONTRAST_RED_KEY);
bc.g = this._settings.get_double(CONTRAST_GREEN_KEY);
bc.b = this._settings.get_double(CONTRAST_BLUE_KEY);
zoomRegion.setContrast(bc);
}
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
@ -488,23 +465,6 @@ const Magnifier = new Lang.Class({
this._settings.connect('changed::' + MOUSE_TRACKING_KEY,
Lang.bind(this, this._updateMouseTrackingMode));
this._settings.connect('changed::' + INVERT_LIGHTNESS_KEY,
Lang.bind(this, this._updateInvertLightness));
this._settings.connect('changed::' + BRIGHT_RED_KEY,
Lang.bind(this, this._updateBrightness));
this._settings.connect('changed::' + BRIGHT_GREEN_KEY,
Lang.bind(this, this._updateBrightness));
this._settings.connect('changed::' + BRIGHT_BLUE_KEY,
Lang.bind(this, this._updateBrightness));
this._settings.connect('changed::' + CONTRAST_RED_KEY,
Lang.bind(this, this._updateContrast));
this._settings.connect('changed::' + CONTRAST_GREEN_KEY,
Lang.bind(this, this._updateContrast));
this._settings.connect('changed::' + CONTRAST_BLUE_KEY,
Lang.bind(this, this._updateContrast));
this._settings.connect('changed::' + SHOW_CROSS_HAIRS_KEY,
Lang.bind(this, function() {
this.setCrosshairsVisible(this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY));
@ -580,38 +540,7 @@ const Magnifier = new Lang.Class({
this._settings.get_enum(MOUSE_TRACKING_KEY)
);
}
},
_updateInvertLightness: function() {
// Applies only to the first zoom region.
if (this._zoomRegions.length) {
this._zoomRegions[0].setInvertLightness(
this._settings.get_boolean(INVERT_LIGHTNESS_KEY)
);
}
},
_updateBrightness: function() {
// Applies only to the first zoom region.
if (this._zoomRegions.length) {
let brightness = {};
brightness.r = this._settings.get_double(BRIGHT_RED_KEY);
brightness.g = this._settings.get_double(BRIGHT_GREEN_KEY);
brightness.b = this._settings.get_double(BRIGHT_BLUE_KEY);
this._zoomRegions[0].setBrightness(brightness);
}
},
_updateContrast: function() {
// Applies only to the first zoom region.
if (this._zoomRegions.length) {
let contrast = {};
contrast.r = this._settings.get_double(CONTRAST_RED_KEY);
contrast.g = this._settings.get_double(CONTRAST_GREEN_KEY);
contrast.b = this._settings.get_double(CONTRAST_BLUE_KEY);
this._zoomRegions[0].setContrast(contrast);
}
},
}
});
Signals.addSignalMethods(Magnifier.prototype);
@ -625,9 +554,6 @@ const ZoomRegion = new Lang.Class({
this._clampScrollingAtEdges = false;
this._lensMode = false;
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN;
this._invertLightness = false;
this._brightness = { r: NO_CHANGE, g: NO_CHANGE, b: NO_CHANGE };
this._contrast = { r: NO_CHANGE, g: NO_CHANGE, b: NO_CHANGE };
this._magView = null;
this._background = null;
@ -953,86 +879,6 @@ const ZoomRegion = new Lang.Class({
}
},
/**
* setInvertLightness:
* Set whether to invert the lightness of the magnified view.
* @flag Boolean to either invert brightness (true), or not (false).
*/
setInvertLightness: function(flag) {
this._invertLightness = flag;
if (this._magShaderEffects)
this._magShaderEffects.setInvertLightness(this._invertLightness);
},
/**
* getInvertLightness:
* Retrieve whether the lightness is inverted.
* @return Boolean indicating inversion (true), or not (false).
*/
getInvertLightness: function() {
return this._invertLightness;
},
/**
* setBrightness:
* Alter the brightness of the magnified view.
* @brightness Object containing the contrast for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* brightness (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed brightness, respectively.
*/
setBrightness: function(brightness) {
this._brightness.r = brightness.r;
this._brightness.g = brightness.g;
this._brightness.b = brightness.b;
if (this._magShaderEffects)
this._magShaderEffects.setBrightness(this._brightness);
},
/**
* getBrightness:
* Retrive the current brightness of the Zoom Region.
* @return Object containing the brightness change for the red, green,
* and blue channels.
*/
getBrightness: function() {
let brightness = {};
brightness.r = this._brightness.r;
brightness.g = this._brightness.g;
brightness.b = this._brightness.b;
return brightness;
},
/**
* setContrast:
* Alter the contrast of the magnified view.
* @contrast Object containing the contrast for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* contrast (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed contrast, respectively.
*/
setContrast: function(contrast) {
this._contrast.r = contrast.r;
this._contrast.g = contrast.g;
this._contrast.b = contrast.b;
if (this._magShaderEffects)
this._magShaderEffects.setContrast(this._contrast);
},
/**
* getContrast:
* Retreive the contrast of the magnified view.
* @return Object containing the contrast for the red, green,
* and blue channels.
*/
getContrast: function() {
let contrast = {};
contrast.r = this._contrast.r;
contrast.g = this._contrast.g;
contrast.b = this._contrast.b;
return contrast;
},
//// Private methods ////
_createActors: function() {
@ -1071,12 +917,6 @@ const ZoomRegion = new Lang.Class({
this._crossHairsActor = this._crossHairs.addToZoomRegion(this, this._mouseActor);
else
this._crossHairsActor = null;
// Contrast and brightness effects.
this._magShaderEffects = new MagShaderEffects(this._uiGroupClone);
this._magShaderEffects.setInvertLightness(this._invertLightness);
this._magShaderEffects.setBrightness(this._brightness);
this._magShaderEffects.setContrast(this._contrast);
},
_destroyActors: function() {
@ -1085,8 +925,6 @@ const ZoomRegion = new Lang.Class({
if (this._crossHairs)
this._crossHairs.removeFromParent(this._crossHairsActor);
this._magShaderEffects.destroyEffects();
this._magShaderEffects = null;
this._magView.destroy();
this._magView = null;
this._background = null;
@ -1595,133 +1433,3 @@ const Crosshairs = new Lang.Class({
this._vertBottomHair.set_position((groupWidth - thickness) / 2, bottom);
}
});
const MagShaderEffects = new Lang.Class({
Name: 'MagShaderEffects',
_init: function(uiGroupClone) {
this._inverse = new Shell.InvertLightnessEffect();
this._brightnessContrast = new Clutter.BrightnessContrastEffect();
this._inverse.set_enabled(false);
this._brightnessContrast.set_enabled(false);
this._magView = uiGroupClone;
this._magView.add_effect(this._inverse);
this._magView.add_effect(this._brightnessContrast);
},
/**
* destroyEffects:
* Remove contrast and brightness effects from the magnified view, and
* lose the reference to the actor they were applied to. Don't use this
* object after calling this.
*/
destroyEffects: function() {
this._magView.clear_effects();
this._brightnessContrast = null;
this._inverse = null;
this._magView = null;
},
/**
* setInvertLightness:
* Enable/disable invert lightness effect.
* @invertFlag: Enabled flag.
*/
setInvertLightness: function(invertFlag) {
this._inverse.set_enabled(invertFlag);
},
/**
* getInvertLightness:
* Report whether the inversion effect is enabled.
* @return: Boolean.
*/
getInvertLightness: function() {
return this._inverse.get_enabled();
},
/**
* setBrightness:
* Set the brightness of the magnified view.
* @brightness: Object containing the brightness for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* brightness (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed brightness,
* respectively.
*/
setBrightness: function(brightness) {
let bRed = brightness.r;
let bGreen = brightness.g;
let bBlue = brightness.b;
this._brightnessContrast.set_brightness_full(bRed, bGreen, bBlue);
// Enable the effect if the brightness OR contrast change are such that
// it modifies the brightness and/or contrast.
let [cRed, cGreen, cBlue] = this._brightnessContrast.get_contrast();
this._brightnessContrast.set_enabled(
(bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE ||
cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE)
);
},
/**
* getBrightness:
* Retrieve current brightness of the magnified view.
* @return: Object containing the brightness for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* brightness (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed brightness, respectively.
*/
getBrightness: function() {
let result = {};
let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness();
result.r = bRed;
result.g = bGreen;
result.b = bBlue;
return result;
},
/**
* Set the contrast of the magnified view.
* @contrast: Object containing the contrast for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* contrast (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed contrast, respectively.
*/
setContrast: function(contrast) {
let cRed = contrast.r;
let cGreen = contrast.g;
let cBlue = contrast.b;
this._brightnessContrast.set_contrast_full(cRed, cGreen, cBlue);
// Enable the effect if the contrast OR brightness change are such that
// it modifies the brightness and/or contrast.
// should be able to use Clutter.color_equal(), but that complains of
// a null first argument.
let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness();
this._brightnessContrast.set_enabled(
cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
);
},
/**
* Retrieve current contrast of the magnified view.
* @return: Object containing the contrast for the red, green,
* and blue channels. Values of 0.0 represent "standard"
* contrast (no change), whereas values less or greater than
* 0.0 indicate decreased or incresaed contrast, respectively.
*/
getContrast: function() {
let resutl = {};
let [cRed, cGreen, cBlue] = this._brightnessContrast.get_contrast();
result.r = cRed;
result.g = cGreen;
result.b = cBlue;
return result;
}
});

View File

@ -29,7 +29,6 @@ const LookingGlass = imports.ui.lookingGlass;
const NetworkAgent = imports.ui.networkAgent;
const NotificationDaemon = imports.ui.notificationDaemon;
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
const ScreenShield = imports.ui.screenShield;
const Scripting = imports.ui.scripting;
const ShellDBus = imports.ui.shellDBus;
const TelepathyClient = imports.ui.telepathyClient;
@ -47,12 +46,12 @@ let automountManager = null;
let autorunManager = null;
let panel = null;
let hotCorners = [];
let placesManager = null;
let overview = null;
let runDialog = null;
let lookingGlass = null;
let wm = null;
let messageTray = null;
let screenShield = null;
let notificationDaemon = null;
let windowAttentionHandler = null;
let telepathyClient = null;
@ -81,6 +80,7 @@ function _createUserSession() {
// not loading any events until the user presses the clock
global.launch_calendar_server();
placesManager = new PlaceDisplay.PlacesManager();
telepathyClient = new TelepathyClient.Client();
automountManager = new AutomountManager.AutomountManager();
autorunManager = new AutorunManager.AutorunManager();
@ -218,7 +218,6 @@ function start() {
panel = new Panel.Panel();
wm = new WindowManager.WindowManager();
messageTray = new MessageTray.MessageTray();
screenShield = new ScreenShield.ScreenShield();
keyboard = new Keyboard.Keyboard();
notificationDaemon = new NotificationDaemon.NotificationDaemon();
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
@ -494,8 +493,8 @@ function loadTheme() {
let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
// FIXME: merge back into main stylesheet
theme.load_stylesheet(_gdmCssStylesheet);
if (global.session_type == Shell.SessionType.GDM)
theme.load_stylesheet(_gdmCssStylesheet);
if (previousTheme) {
let customStylesheets = previousTheme.get_custom_stylesheets();
@ -624,10 +623,6 @@ function _findModal(actor) {
return -1;
}
function isInModalStack(actor) {
return _findModal(actor) != -1;
}
/**
* pushModal:
* @actor: #ClutterActor which will be given keyboard focus
@ -668,7 +663,7 @@ function pushModal(actor, timestamp, options) {
let actorDestroyId = actor.connect('destroy', function() {
let index = _findModal(actor);
if (index >= 0)
popModal(actor);
modalActorFocusStack.splice(index, 1);
});
let curFocus = global.stage.get_key_focus();
let curFocusDestroyId;

View File

@ -746,7 +746,6 @@ const Notification = new Lang.Class({
}
let button = new St.Button({ can_focus: true });
button._actionId = id;
if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(id)) {
button.add_style_class_name('notification-icon-button');
@ -766,31 +765,6 @@ const Notification = new Lang.Class({
this.updated();
},
// setButtonSensitive:
// @id: the action ID
// @sensitive: whether the button should be sensitive
//
// If the notification contains a button with action ID @id,
// its sensitivity will be set to @sensitive. Insensitive
// buttons cannot be clicked.
setButtonSensitive: function(id, sensitive) {
if (!this._buttonBox)
return;
let button = this._buttonBox.get_children().filter(function(b) {
return b._actionId == id;
})[0];
if (!button || button.reactive == sensitive)
return;
button.reactive = sensitive;
if (sensitive)
button.remove_style_pseudo_class('insensitive');
else
button.add_style_pseudo_class('insensitive');
},
setUrgency: function(urgency) {
this.urgency = urgency;
},
@ -986,10 +960,8 @@ const Source = new Lang.Class({
ICON_SIZE: 24,
_init: function(title, iconName, iconType) {
_init: function(title) {
this.title = title;
this.iconName = iconName;
this.iconType = iconType;
this.actor = new Shell.GenericContainer();
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
@ -1019,8 +991,6 @@ const Source = new Lang.Class({
this.isMuted = false;
this.notifications = [];
this._setSummaryIcon(this.createNotificationIcon());
},
_getPreferredWidth: function (actor, forHeight, alloc) {
@ -1091,12 +1061,10 @@ const Source = new Lang.Class({
},
// Called to create a new icon actor (of size this.ICON_SIZE).
// Provides a sane default implementation, override if you need
// something more fancy.
// Must be overridden by the subclass if you do not pass icons
// explicitly to the Notification() constructor.
createNotificationIcon: function() {
return new St.Icon({ icon_name: this.iconName,
icon_type: this.iconType,
icon_size: this.ICON_SIZE });
throw new Error('no implementation of createNotificationIcon in ' + this);
},
// Unlike createNotificationIcon, this always returns the same actor;
@ -1147,14 +1115,16 @@ const Source = new Lang.Class({
},
//// Protected methods ////
// The subclass must call this at least once to set the summary icon.
_setSummaryIcon: function(icon) {
if (this._iconBin.child)
this._iconBin.child.destroy();
this._iconBin.child = icon;
},
// Default implementation is to do nothing, but subclasses can override
open: function(notification) {
this.emit('opened', notification);
},
destroyNonResidentNotifications: function() {
@ -2519,7 +2489,15 @@ const SystemNotificationSource = new Lang.Class({
Extends: Source,
_init: function() {
this.parent(_("System Information"), 'dialog-information', St.IconType.SYMBOLIC);
this.parent(_("System Information"));
this._setSummaryIcon(this.createNotificationIcon());
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'dialog-information',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
},
open: function() {

View File

@ -638,10 +638,5 @@ const Source = new Lang.Class({
}
this.parent();
},
createNotificationIcon: function() {
// We set the summary icon ourselves.
return null;
}
});

View File

@ -37,7 +37,7 @@ const STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION = {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.XKBIndicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'userMenu': imports.ui.userMenu.UserMenuButton
};
@ -55,7 +55,7 @@ const GDM_STATUS_AREA_SHELL_IMPLEMENTATION = {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.XKBIndicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton
};
@ -1115,8 +1115,8 @@ const Panel = new Lang.Class({
openAppMenu: function() {
let menu = this._appMenu.menu;
if (!this._appMenu.actor.reactive || menu.isOpen)
return;
if (Main.overview.visible || menu.isOpen)
return;
menu.open();
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);

View File

@ -189,7 +189,7 @@ const PlacesManager = new Lang.Class({
this._volumeMonitor.connect('drive-changed', Lang.bind(this, this._updateDevices));
this._updateDevices();
this._bookmarksPath = GLib.build_filenamev([GLib.get_user_config_dir(), 'gtk-3.0', 'bookmarks']);
this._bookmarksPath = GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']);
this._bookmarksFile = Gio.file_new_for_path(this._bookmarksPath);
this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null);
this._bookmarkTimeoutId = 0;
@ -365,13 +365,12 @@ const PlaceSearchProvider = new Lang.Class({
_init: function() {
this.parent(_("PLACES & DEVICES"));
this.placesManager = new PlacesManager();
},
getResultMetas: function(resultIds, callback) {
getResultMetas: function(resultIds) {
let metas = [];
for (let i = 0; i < resultIds.length; i++) {
let placeInfo = this.placesManager.lookupPlaceById(resultIds[i]);
let placeInfo = Main.placesManager.lookupPlaceById(resultIds[i]);
if (!placeInfo)
metas.push(null);
else
@ -382,22 +381,24 @@ const PlaceSearchProvider = new Lang.Class({
}
});
}
callback(metas);
return metas;
},
activateResult: function(id, params) {
let placeInfo = this.placesManager.lookupPlaceById(id);
let placeInfo = Main.placesManager.lookupPlaceById(id);
placeInfo.launch(params);
},
_compareResultMeta: function (idA, idB) {
let infoA = this.placesManager.lookupPlaceById(idA);
let infoB = this.placesManager.lookupPlaceById(idB);
let infoA = Main.placesManager.lookupPlaceById(idA);
let infoB = Main.placesManager.lookupPlaceById(idB);
return infoA.name.localeCompare(infoB.name);
},
_searchPlaces: function(places, terms) {
let multiplePrefixResults = [];
let prefixResults = [];
let multipleSubstringResults = [];
let substringResults = [];
terms = terms.map(String.toLowerCase);
@ -405,26 +406,29 @@ const PlaceSearchProvider = new Lang.Class({
for (let i = 0; i < places.length; i++) {
let place = places[i];
let mtype = place.matchTerms(terms);
if (mtype == Search.MatchType.PREFIX)
if (mtype == Search.MatchType.MULTIPLE_PREFIX)
multiplePrefixResults.push(place.id);
else if (mtype == Search.MatchType.PREFIX)
prefixResults.push(place.id);
else if (mtype == Search.MatchType.MULTIPLE_SUBSTRING)
multipleSubstringResults.push(place.id);
else if (mtype == Search.MatchType.SUBSTRING)
substringResults.push(place.id);
}
prefixResults.sort(Lang.bind(this, this._compareResultMeta));
substringResults.sort(Lang.bind(this, this._compareResultMeta));
this.searchSystem.pushResults(this, prefixResults.concat(substringResults));
multiplePrefixResults.sort(this._compareResultMeta);
prefixResults.sort(this._compareResultMeta);
multipleSubstringResults.sort(this._compareResultMeta);
substringResults.sort(this._compareResultMeta);
return multiplePrefixResults.concat(prefixResults.concat(multipleSubstringResults.concat(substringResults)));
},
getInitialResultSet: function(terms) {
let places = this.placesManager.getAllPlaces();
this._searchPlaces(places, terms);
let places = Main.placesManager.getAllPlaces();
return this._searchPlaces(places, terms);
},
getSubsearchResultSet: function(previousResults, terms) {
let places = previousResults.map(Lang.bind(this, function(id) {
return this.placesManager.lookupPlaceById(id);
}));
this._searchPlaces(places, terms);
let places = previousResults.map(function (id) { return Main.placesManager.lookupPlaceById(id); });
return this._searchPlaces(places, terms);
}
});

View File

@ -91,6 +91,7 @@ const RemoteSearchProvider = new Lang.Class({
dbusName, dbusPath);
this.parent(title.toUpperCase());
this.async = true;
this._cancellable = new Gio.Cancellable();
},
@ -119,7 +120,7 @@ const RemoteSearchProvider = new Lang.Class({
this.searchSystem.pushResults(this, results[0]);
},
getInitialResultSet: function(terms) {
getInitialResultSetAsync: function(terms) {
this._cancellable.cancel();
this._cancellable.reset();
try {
@ -132,7 +133,7 @@ const RemoteSearchProvider = new Lang.Class({
}
},
getSubsearchResultSet: function(previousResults, newTerms) {
getSubsearchResultSetAsync: function(previousResults, newTerms) {
this._cancellable.cancel();
this._cancellable.reset();
try {
@ -163,7 +164,7 @@ const RemoteSearchProvider = new Lang.Class({
callback(resultMetas);
},
getResultMetas: function(ids, callback) {
getResultMetasAsync: function(ids, callback) {
this._cancellable.cancel();
this._cancellable.reset();
try {

View File

@ -1,142 +0,0 @@
// -*- 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 Meta = imports.gi.Meta;
const St = imports.gi.St;
const GnomeSession = imports.misc.gnomeSession;
const Lightbox = imports.ui.lightbox;
const UnlockDialog = imports.ui.unlockDialog;
const Main = imports.ui.main;
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOCK_ENABLED_KEY = 'lock-enabled';
/**
* To test screen shield, make sure to kill gnome-screensaver.
*
* If you are setting org.gnome.desktop.session.idle-delay directly in dconf,
* rather than through System Settings, you also need to set
* org.gnome.settings-daemon.plugins.power.sleep-display-ac and
* org.gnome.settings-daemon.plugins.power.sleep-display-battery to the same value.
* This will ensure that the screen blanks at the right time when it fades out.
* https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependance.
*/
const ScreenShield = new Lang.Class({
Name: 'ScreenShield',
_init: function() {
this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) {
this._onStatusChanged(proxy.status);
}));
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._onStatusChanged(status);
}));
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
this._isModal = false;
this._isLocked = false;
this._group = new St.Widget({ x: 0,
y: 0 });
Main.uiGroup.add_actor(this._group);
let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.POSITION | Clutter.BindCoordinate.SIZE });
this._group.add_constraint(constraint);
this._lightbox = new Lightbox.Lightbox(this._group,
{ inhibitEvents: true, fadeInTime: 10, fadeFactor: 1 });
this._background = Meta.BackgroundActor.new_for_screen(global.screen);
this._background.hide();
Main.uiGroup.add_actor(this._background);
},
_onStatusChanged: function(status) {
log ("in _onStatusChanged");
if (status == GnomeSession.PresenceStatus.IDLE) {
log("session gone idle");
if (this._dialog) {
log('canceling existing dialog');
this._dialog.cancel();
this._dialog = null;
}
this._group.reactive = true;
if (!this._isModal) {
Main.pushModal(this._group);
this._isModal = true;
}
this._group.raise_top();
this._lightbox.show();
} else {
log('status is now ' + status);
let lightboxWasShown = this._lightbox.shown;
log("this._lightbox.shown " + this._lightbox.shown);
this._lightbox.hide();
let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
if (shouldLock || this._isLocked) {
this._isLocked = true;
this._background.show();
this._background.raise_top();
this._showUnlockDialog();
} else if (this._isModal) {
this._popModal();
}
}
},
_popModal: function() {
this._group.reactive = false;
Main.popModal(this._group);
this._background.hide();
},
_showUnlockDialog: function() {
if (this._dialog) {
log ('_showUnlockDialog called again when the dialog was already there');
return;
}
try {
this._dialog = new UnlockDialog.UnlockDialog();
this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
if (!this._dialog.open(global.get_current_time()))
throw new Error('open failed!')
this._dialog._group.raise_top();
} catch(e) {
// FIXME: this is for debugging purposes
logError(e, 'error while creating unlock dialog');
this._popModal();
}
},
_onUnlockFailed: function() {
// FIXME: for now, on failure we just destroy the dialog and create a new
// one (this is what gnome-screensaver does)
// in the future, we may want to go back to the lock screen instead
this._dialog.destroy();
this._dialog = null;
this._showUnlockDialog();
},
_onUnlockSucceded: function() {
this._dialog.destroy();
this._dialog = null;
this._popModal();
},
});

View File

@ -18,7 +18,9 @@ const DISABLED_OPEN_SEARCH_PROVIDERS_KEY = 'disabled-open-search-providers';
const MatchType = {
NONE: 0,
SUBSTRING: 1,
PREFIX: 2
MULTIPLE_SUBSTRING: 2,
PREFIX: 3,
MULTIPLE_PREFIX: 4
};
const SearchResultDisplay = new Lang.Class({
@ -70,8 +72,11 @@ const SearchResultDisplay = new Lang.Class({
* Subclass this object to add a new result type
* to the search system, then call registerProvider()
* in SearchSystem with an instance.
* Search is asynchronous and uses the
* By default, search is synchronous and uses the
* getInitialResultSet()/getSubsearchResultSet() methods.
* For asynchronous search, set the async property to true
* and implement getInitialResultSetAsync()/getSubsearchResultSetAsync()
* instead.
*/
const SearchProvider = new Lang.Class({
Name: 'SearchProvider',
@ -79,6 +84,7 @@ const SearchProvider = new Lang.Class({
_init: function(title) {
this.title = title;
this.searchSystem = null;
this.async = false;
},
/**
@ -89,7 +95,7 @@ const SearchProvider = new Lang.Class({
* therefore a single term of length one or two), or when
* a new term is added.
*
* Should "return" an array of result identifier strings representing
* Should return an array of result identifier strings representing
* items which match the given search terms. This
* is expected to be a substring match on the metadata for a given
* item. Ordering of returned results is up to the discretion of the provider,
@ -99,9 +105,6 @@ const SearchProvider = new Lang.Class({
* description) before single matches
* * Put items which match on a prefix before non-prefix substring matches
*
* We say "return" above, but in order to make the query asynchronous, use
* this.searchSystem.pushResults();. The return value should be ignored.
*
* This function should be fast; do not perform unindexed full-text searches
* or network queries.
*/
@ -109,6 +112,18 @@ const SearchProvider = new Lang.Class({
throw new Error('Not implemented');
},
/**
* getInitialResultSetAsync:
* @terms: Array of search terms, treated as logical AND
*
* Like getInitialResultSet(), but the method should return immediately
* without a return value - use SearchSystem.pushResults() when the
* corresponding results are ready.
*/
getInitialResultSetAsync: function(terms) {
throw new Error('Not implemented');
},
/**
* getSubsearchResultSet:
* @previousResults: Array of item identifiers
@ -121,23 +136,46 @@ const SearchProvider = new Lang.Class({
*
* This allows search providers to only search through the previous
* result set, rather than possibly performing a full re-query.
*
* Similar to getInitialResultSet, the return value for this will
* be ignored; use this.searchSystem.pushResults();.
*/
getSubsearchResultSet: function(previousResults, newTerms) {
throw new Error('Not implemented');
},
/**
* getSubsearchResultSetAsync:
* @previousResults: Array of item identifiers
* @newTerms: Updated search terms
*
* Like getSubsearchResultSet(), but the method should return immediately
* without a return value - use SearchSystem.pushResults() when the
* corresponding results are ready.
*/
getSubsearchResultSetAsync: function(previousResults, newTerms) {
throw new Error('Not implemented');
},
/**
* getResultMetas:
* @ids: Result identifier strings
*
* Call callback with array of objects with 'id', 'name', (both strings) and
* Return an array of objects with 'id', 'name', (both strings) and
* 'createIcon' (function(size) returning a Clutter.Texture) properties
* with the same number of members as @ids
*/
getResultMetas: function(ids, callback) {
getResultMetas: function(ids) {
throw new Error('Not implemented');
},
/**
* getResultMetasAsync:
* @ids: Result identifier strings
* @callback: callback to pass the results to when ready
*
* Like getResultMetas(), but the method should return immediately
* without a return value - pass the results to the provided @callback
* when ready.
*/
getResultMetasAsync: function(ids, callback) {
throw new Error('Not implemented');
},
@ -341,18 +379,18 @@ const SearchSystem = new Lang.Class({
}
}
let previousResultsArr = this._previousResults;
let results = [];
this._previousTerms = terms;
this._previousResults = results;
if (isSubSearch) {
for (let i = 0; i < this._providers.length; i++) {
let [provider, previousResults] = previousResultsArr[i];
let [provider, previousResults] = this._previousResults[i];
try {
results.push([provider, []]);
provider.getSubsearchResultSet(previousResults, terms);
if (provider.async) {
provider.getSubsearchResultSetAsync(previousResults, terms);
results.push([provider, []]);
} else {
let providerResults = provider.getSubsearchResultSet(previousResults, terms);
results.push([provider, providerResults]);
}
} catch (error) {
global.log ('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message);
}
@ -361,13 +399,22 @@ const SearchSystem = new Lang.Class({
for (let i = 0; i < this._providers.length; i++) {
let provider = this._providers[i];
try {
results.push([provider, []]);
provider.getInitialResultSet(terms);
if (provider.async) {
provider.getInitialResultSetAsync(terms);
results.push([provider, []]);
} else {
let providerResults = provider.getInitialResultSet(terms);
results.push([provider, providerResults]);
}
} catch (error) {
global.log ('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message);
}
}
}
this._previousTerms = terms;
this._previousResults = results;
this.emit('search-completed', results);
},
});
Signals.addSignalMethods(SearchSystem.prototype);

View File

@ -119,7 +119,13 @@ const GridSearchResults = new Lang.Class({
if (results.length == 0)
return;
provider.getResultMetas(results, Lang.bind(this, this.renderResults));
if (provider.async) {
provider.getResultMetasAsync(results,
Lang.bind(this, this.renderResults));
} else {
let metas = provider.getResultMetas(results);
this.renderResults(metas);
}
}));
}));
this._notDisplayedResult = [];
@ -173,7 +179,8 @@ const SearchResults = new Lang.Class({
_init: function(searchSystem, openSearchSystem) {
this._searchSystem = searchSystem;
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateResults));
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateCurrentResults));
this._searchSystem.connect('search-completed', Lang.bind(this, this._updateResults));
this._openSearchSystem = openSearchSystem;
this.actor = new St.BoxLayout({ name: 'searchResults',
@ -207,8 +214,10 @@ const SearchResults = new Lang.Class({
this._content.add(this._statusText);
this._providers = this._searchSystem.getProviders();
this._providerMeta = [];
this._providerMetaResults = {};
for (let i = 0; i < this._providers.length; i++) {
this.createProviderMeta(this._providers[i]);
this._providerMetaResults[this.providers[i].title] = [];
}
this._searchProvidersBox = new St.BoxLayout({ style_class: 'search-providers-box' });
this.actor.add(this._searchProvidersBox);
@ -281,7 +290,8 @@ const SearchResults = new Lang.Class({
this._providerMeta.push({ provider: provider,
actor: providerBox,
resultDisplay: resultDisplay });
resultDisplay: resultDisplay,
hasPendingResults: false });
this._content.add(providerBox);
},
@ -297,6 +307,7 @@ const SearchResults = new Lang.Class({
},
_clearDisplay: function() {
this._visibleResultsCount = 0;
for (let i = 0; i < this._providerMeta.length; i++) {
let meta = this._providerMeta[i];
meta.resultDisplay.clear();
@ -324,8 +335,6 @@ const SearchResults = new Lang.Class({
doSearch: function (searchString) {
this._searchSystem.updateSearch(searchString);
let terms = this._searchSystem.getTerms();
this._openSearchSystem.setSearchTerms(terms);
},
_metaForProvider: function(provider) {
@ -337,6 +346,8 @@ const SearchResults = new Lang.Class({
for (let i = 0; i < this._providerMeta.length; i++) {
let meta = this._providerMeta[i];
if (meta.hasPendingResults)
return;
if (!meta.actor.visible)
continue;
@ -361,57 +372,78 @@ const SearchResults = new Lang.Class({
}
},
_updateStatusText: function () {
let haveResults = false;
_updateCurrentResults: function(searchSystem, results) {
let terms = searchSystem.getTerms();
let [provider, providerResults] = results;
let meta = this._metaForProvider(provider);
meta.hasPendingResults = false;
this._updateProviderResults(provider, providerResults, terms);
},
for (let i = 0; i < this._providerMeta.length; ++i)
if (this._providerMeta[i].resultDisplay.getFirstResult()) {
haveResults = true;
break;
_updateProviderResults: function(provider, providerResults, terms) {
let meta = this._metaForProvider(provider);
if (providerResults.length == 0) {
this._clearDisplayForProvider(provider);
meta.resultDisplay.setResults([], []);
} else {
this._providerMetaResults[provider.title] = providerResults;
meta.resultDisplay.setResults(providerResults, terms);
let results = meta.resultDisplay.getResultsForDisplay();
if (provider.async) {
provider.getResultMetasAsync(results, Lang.bind(this,
function(metas) {
this._clearDisplayForProvider(provider);
meta.actor.show();
// Hinding drops the key focus if we have it
let focus = global.stage.get_key_focus();
this._content.hide();
meta.resultDisplay.renderResults(metas);
this._maybeSetInitialSelection();
this._content.show();
if (this._content.contains(focus))
global.stage.set_key_focus(focus);
}));
} else {
let metas = provider.getResultMetas(results);
this._clearDisplayForProvider(provider);
meta.actor.show();
meta.resultDisplay.renderResults(metas);
}
}
this._maybeSetInitialSelection();
},
if (!haveResults) {
_updateResults: function(searchSystem, results) {
if (results.length == 0) {
this._statusText.set_text(_("No matching results."));
this._statusText.show();
} else {
this._statusText.hide();
}
},
_updateResults: function(searchSystem, results) {
let terms = searchSystem.getTerms();
let [provider, providerResults] = results;
let meta = this._metaForProvider(provider);
this._openSearchSystem.setSearchTerms(terms);
if (providerResults.length == 0) {
this._clearDisplayForProvider(provider);
meta.resultDisplay.setResults([], []);
this._maybeSetInitialSelection();
this._updateStatusText();
} else {
meta.resultDisplay.setResults(providerResults, terms);
let results = meta.resultDisplay.getResultsForDisplay();
// To avoid CSS transitions causing flickering when the first search
// result stays the same, we hide the content while filling in the
// results.
this._content.hide();
provider.getResultMetas(results, Lang.bind(this, function(metas) {
this._clearDisplayForProvider(provider);
meta.actor.show();
// Hiding drops the key focus if we have it
let focus = global.stage.get_key_focus();
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
// content while filling in the results.
this._content.hide();
meta.resultDisplay.renderResults(metas);
this._maybeSetInitialSelection();
this._updateStatusText();
this._content.show();
if (this._content.contains(focus))
global.stage.set_key_focus(focus);
}));
for (let i = 0; i < results.length; i++) {
let [provider, providerResults] = results[i];
let meta = this._metaForProvider(provider);
meta.hasPendingResults = provider.async;
if (!meta.hasPendingResults)
this._updateProviderResults(provider, providerResults, terms);
}
this._content.show();
return true;
},
activateDefault: function() {

View File

@ -243,7 +243,6 @@ const ShellMountPasswordSource = new Lang.Class({
this.parent(strings[0]);
this._notification = new ShellMountPasswordNotification(this, strings, icon, reaskPassword);
this._setSummaryIcon(icon);
// add ourselves as a source, and popup the notification
Main.messageTray.add(this);

View File

@ -305,7 +305,7 @@ const Indicator = new Lang.Class({
_ensureSource: function() {
if (!this._source) {
this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active', St.IconType.SYMBOLIC);
this._source = new Source();
Main.messageTray.add(this._source);
}
},
@ -330,6 +330,35 @@ const Indicator = new Lang.Class({
}
});
const Source = new Lang.Class({
Name: 'BluetoothSource',
Extends: MessageTray.Source,
_init: function() {
this.parent(_("Bluetooth"));
this._setSummaryIcon(this.createNotificationIcon());
},
notify: function(notification) {
this._private_destroyId = notification.connect('destroy', Lang.bind(this, function(notification) {
if (this.notification == notification) {
// the destroyed notification is the last for this source
this.notification.disconnect(this._private_destroyId);
this.destroy();
}
}));
this.parent(notification);
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'bluetooth-active',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
}
});
const AuthNotification = new Lang.Class({
Name: 'AuthNotification',
Extends: MessageTray.Notification,
@ -380,7 +409,7 @@ const ConfirmNotification = new Lang.Class({
this._applet = applet;
this._devicePath = device_path;
this.addBody(_("Device %s wants to pair with this computer").format(long_name));
this.addBody(_("Please confirm whether the PIN '%06d' matches the one on the device.").format(pin));
this.addBody(_("Please confirm whether the PIN '%s' matches the one on the device.").format(pin));
this.addButton('matches', _("Matches"));
this.addButton('does-not-match', _("Does not match"));
@ -416,8 +445,7 @@ const PinNotification = new Lang.Class({
this._entry.connect('key-release-event', Lang.bind(this, function(entry, event) {
let key = event.get_key_symbol();
if (key == Clutter.KEY_Return) {
if (this._canActivateOkButton())
this.emit('action-invoked', 'ok');
this.emit('action-invoked', 'ok');
return true;
} else if (key == Clutter.KEY_Escape) {
this.emit('action-invoked', 'cancel');
@ -430,12 +458,6 @@ const PinNotification = new Lang.Class({
this.addButton('ok', _("OK"));
this.addButton('cancel', _("Cancel"));
this.setButtonSensitive('ok', this._canActivateOkButton());
this._entry.clutter_text.connect('text-changed', Lang.bind(this,
function() {
this.setButtonSensitive('ok', this._canActivateOkButton());
}));
this.connect('action-invoked', Lang.bind(this, function(self, action) {
if (action == 'ok') {
if (this._numeric) {
@ -458,11 +480,6 @@ const PinNotification = new Lang.Class({
}));
},
_canActivateOkButton: function() {
// PINs have a fixed length of 6
return this._entry.clutter_text.text.length == 6;
},
grabFocus: function(lockTray) {
this.parent(lockTray);
global.stage.set_key_focus(this._entry);

View File

@ -0,0 +1,584 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/*
* Copyright 2012 Red Hat, Inc.
* Copyright 2012 Peng Huang <shawn.p.huang@gmail.com>
* Copyright 2012 Takao Fujiwara <tfujiwar@redhat.com>
* Copyright 2012 Tiger Soldier <tigersoldi@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* 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, see <http://www.gnu.org/licenses/>.
*/
const St = imports.gi.St;
const GLib = imports.gi.GLib;
const IBus = imports.gi.IBus;
const Lang = imports.lang;
const Signals = imports.signals;
const Shell = imports.gi.Shell;
const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const ORIENTATION_HORIZONTAL = 0;
const ORIENTATION_VERTICAL = 1;
const ORIENTATION_SYSTEM = 2;
const StCandidateArea = new Lang.Class({
Name: 'StCandidateArea',
_init: function(orientation) {
this.actor = new St.BoxLayout({ style_class: 'candidate-area' });
this._orientation = orientation;
this._labels = [];
this._labelBoxes = [];
this._createUI();
},
_removeOldWidgets: function() {
this.actor.destroy_all_children();
this._labels = [];
this._labelBoxes = [];
},
_createUI: function() {
let vbox = null;
let hbox = null;
if (this._orientation == ORIENTATION_VERTICAL) {
vbox = new St.BoxLayout({ vertical: true,
style_class: 'candidate-vertical' });
this.actor.add_child(vbox,
{ expand: true,
x_fill: true,
y_fill: true
});
} else {
hbox = new St.BoxLayout({ vertical: false,
style_class: 'candidate-horizontal' });
this.actor.add_child(hbox,
{ expand: true,
x_fill: true,
y_fill: true
});
}
for (let i = 0; i < 16; i++) {
let label1 = new St.Label({ text: '1234567890abcdef'.charAt(i) + '.',
style_class: 'popup-menu-item',
reactive: true });
let label2 = new St.Label({ text: '' ,
style_class: 'popup-menu-item',
reactive: true });
if (this._orientation == ORIENTATION_VERTICAL) {
let candidateHBox = new St.BoxLayout({vertical: false});
let labelBox = new St.Bin({ style_class: 'candidate-hlabel-content' });
labelBox.set_child(label1);
labelBox.set_fill(true, true);
let textBox = new St.Bin({ style_class: 'candidate-htext-content' });
textBox.set_child(label2);
textBox.set_fill(true, true);
candidateHBox.add_child(labelBox,
{ expand: false,
x_fill: false,
y_fill: true
});
candidateHBox.add_child(textBox,
{ expand: true,
x_fill: true,
y_fill: true
});
vbox.add_child(candidateHBox);
this._labelBoxes.push(candidateHBox);
} else {
let candidateHBox = new St.BoxLayout({ style_class: 'candidate-vcontent',
vertical: false });
candidateHBox.add_child(label1);
candidateHBox.add_child(label2);
hbox.add_child(candidateHBox);
this._labelBoxes.push(candidateHBox);
}
this._labels.push([label1, label2]);
}
for (let i = 0; i < this._labels.length; i++) {
for(let j = 0; j < this._labels[i].length; j++) {
let widget = this._labels[i][j];
widget.candidateIndex = i;
widget.connect('button-press-event',
Lang.bind(this, function (widget, event) {
this._candidateClickedCB(widget, event);
}));
widget.connect('enter-event',
function(widget, event) {
widget.add_style_pseudo_class('hover');
});
widget.connect('leave-event',
function(widget, event) {
widget.remove_style_pseudo_class('hover');
});
}
}
},
_recreateUI: function() {
this._removeOldWidgets();
this._createUI();
},
_candidateClickedCB: function(widget, event) {
this.emit('candidate-clicked',
widget.candidateIndex,
event.get_button(),
event.get_state());
},
setLabels: function(labels) {
if (!labels || labels.length == 0) {
for (let i = 0; i < 16; i++) {
this._labels[i][0].set_text('1234567890abcdef'.charAt(i) + '.');
}
return;
}
for (let i = 0; i < labels.length && i < this._labels.length; i++) {
/* Use a ClutterActor attribute of Shell's theme instead of
* Pango.AttrList for the lookup window GUI and
* can ignore 'attrs' simply from IBus engines?
*/
let [text, attrs] = labels[i];
this._labels[i][0].set_text(text);
}
},
setCandidates: function(candidates, focusCandidate, showCursor) {
if (focusCandidate == undefined) {
focusCandidate = 0;
}
if (showCursor == undefined) {
showCursor = true;
}
if (candidates.length > this._labels.length) {
assert();
}
for (let i = 0; i < candidates.length; i++) {
/* Use a ClutterActor attribute of Shell's theme instead of
* Pango.AttrList for the lookup window GUI and
* can ignore 'attrs' simply from IBus engines?
*/
let [text, attrs] = candidates[i];
if (i == focusCandidate && showCursor) {
this._labels[i][1].add_style_pseudo_class('active');
} else {
this._labels[i][1].remove_style_pseudo_class('active');
}
this._labels[i][1].set_text(text);
this._labelBoxes[i].show();
}
for (let i = this._labelBoxes.length - 1; i >= candidates.length; i--) {
this._labelBoxes[i].hide();
}
},
setOrientation: function(orientation) {
if (orientation == this._orientation)
return;
this._orientation = orientation;
this._recreateUI();
},
showAll: function() {
this.actor.show();
},
hideAll: function() {
this.actor.hide();
},
});
Signals.addSignalMethods(StCandidateArea.prototype);
const CandidatePanel = new Lang.Class({
Name: 'CandidatePanel',
_init: function() {
this._orientation = ORIENTATION_VERTICAL;
this._currentOrientation = this._orientation;
this._preeditVisible = false;
this._auxStringVisible = false;
this._lookupTableVisible = false;
this._lookupTable = null;
this._cursorLocation = [0, 0, 0, 0];
this._movedCursorLocation = null;
this._initSt();
},
_initSt: function() {
this._arrowSide = St.Side.TOP;
this._arrowAlignment = 0.0;
this._boxPointer = new BoxPointer.BoxPointer(this._arrowSide,
{ x_fill: true,
y_fill: true,
x_align: St.Align.START });
this.actor = this._boxPointer.actor;
this.actor._delegate = this;
this.actor.style_class = 'popup-menu-boxpointer';
this.actor.add_style_class_name('popup-menu');
this.actor.add_style_class_name('candidate-panel');
this._cursorActor = new Shell.GenericContainer();
Main.uiGroup.add_actor(this.actor);
Main.uiGroup.add_actor(this._cursorActor);
this._stCandidatePanel = new St.BoxLayout({ style_class: 'candidate-panel',
vertical: true });
this._boxPointer.bin.set_child(this._stCandidatePanel);
this._stPreeditLabel = new St.Label({ style_class: 'popup-menu-item',
text: '' });
if (!this._preeditVisible) {
this._stPreeditLabel.hide();
}
this._stAuxLabel = new St.Label({ style_class: 'popup-menu-item',
text: '' });
if (!this._auxVisible) {
this._stAuxLabel.hide();
}
this._separator = new PopupMenu.PopupSeparatorMenuItem();
if (!this._preeditVisible && !this._auxVisible) {
this._separator.actor.hide();
}
// create candidates area
this._stCandidateArea = new StCandidateArea(this._currentOrientation);
this._stCandidateArea.connect('candidate-clicked',
Lang.bind(this, function(x, i, b, s) {
this.emit('candidate-clicked', i, b, s);}));
this.updateLookupTable(this._lookupTable, this._lookupTableVisible);
// TODO: page up/down GUI
this._packAllStWidgets();
this._isVisible = true;
this.hideAll();
this._checkShowStates();
},
_packAllStWidgets: function() {
this._stCandidatePanel.add_child(this._stPreeditLabel,
{ x_fill: true,
y_fill: false,
x_align: St.Align.MIDDLE,
y_align: St.Align.START });
this._stCandidatePanel.add_child(this._stAuxLabel,
{ x_fill: true,
y_fill: false,
x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this._stCandidatePanel.add_child(this._separator.actor,
{ x_fill: true,
y_fill: false,
x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this._stCandidatePanel.add_child(this._stCandidateArea.actor,
{ x_fill: true,
y_fill: false,
x_align: St.Align.MIDDLE,
y_align: St.Align.END });
},
showPreeditText: function() {
this._preeditVisible = true;
this._stPreeditLabel.show();
this._checkShowStates();
},
hidePreeditText: function() {
this._preeditVisible = false;
this._checkShowStates();
this._stPreeditLabel.hide();
},
updatePreeditText: function(text, cursorPos, visible) {
if (visible) {
this.showPreeditText();
} else {
this.hidePreeditText();
}
let str = text.get_text();
this._stPreeditLabel.set_text(str);
let attrs = text.get_attributes();
for (let i = 0; attrs != null && attrs.get(i) != null; i++) {
let attr = attrs.get(i);
if (attr.get_attr_type() == IBus.AttrType.BACKGROUND) {
let startIndex = attr.get_start_index();
let endIndex = attr.get_end_index();
let len = GLib.utf8_strlen(str, -1);
let markup = '';
if (startIndex == 0 &&
endIndex == GLib.utf8_strlen(str, -1)) {
markup = markup.concat(str);
} else {
if (startIndex > 0) {
markup = markup.concat(GLib.utf8_substring(str,
0,
startIndex));
}
if (startIndex != endIndex) {
markup = markup.concat('<span background=\"#555555\">');
markup = markup.concat(GLib.utf8_substring(str,
startIndex,
endIndex));
markup = markup.concat('</span>');
}
if (endIndex < len) {
markup = markup.concat(GLib.utf8_substring(str,
endIndex,
len));
}
}
let clutter_text = this._stPreeditLabel.get_clutter_text();
clutter_text.set_markup(markup);
clutter_text.queue_redraw();
}
}
},
showAuxiliaryText: function() {
this._auxStringVisible = true;
this._stAuxLabel.show();
this._checkShowStates();
},
hideAuxiliaryText: function() {
this._auxStringVisible = false;
this._checkShowStates();
this._stAuxLabel.hide();
},
updateAuxiliaryText: function(text, show) {
if (show) {
this.showAuxiliaryText();
} else {
this.hideAuxiliaryText();
}
this._stAuxLabel.set_text(text.get_text());
},
_refreshLabels: function() {
let newLabels = [];
for (let i = 0; this._lookupTable.get_label(i) != null; i++) {
let label = this._lookupTable.get_label(i);
newLabels.push([label.get_text(), label.get_attributes()]);
}
this._stCandidateArea.setLabels(newLabels);
},
_getCandidatesInCurrentPage: function() {
let cursorPos = this._lookupTable.get_cursor_pos();
let pageSize = this._lookupTable.get_page_size();
let page = ((cursorPos == 0) ? 0 : Math.floor(cursorPos / pageSize));
let startIndex = page * pageSize;
let endIndex = Math.min((page + 1) * pageSize,
this._lookupTable.get_number_of_candidates());
let candidates = [];
for (let i = startIndex; i < endIndex; i++) {
candidates.push(this._lookupTable.get_candidate(i));
}
return candidates;
},
_getCursorPosInCurrentPage: function() {
let cursorPos = this._lookupTable.get_cursor_pos();
let pageSize = this._lookupTable.get_page_size();
let posInPage = cursorPos % pageSize;
return posInPage;
},
_refreshCandidates: function() {
let candidates = this._getCandidatesInCurrentPage();
let newCandidates = [];
for (let i = 0; i < candidates.length; i++) {
let candidate = candidates[i];
newCandidates.push([candidate.get_text(),
candidate.get_attributes()]);
}
this._stCandidateArea.setCandidates(newCandidates,
this._getCursorPosInCurrentPage(),
this._lookupTable.is_cursor_visible());
},
updateLookupTable: function(lookupTable, visible) {
// hide lookup table
if (!visible) {
this.hideLookupTable();
}
this._lookupTable = lookupTable || new IBus.LookupTable();
let orientation = this._lookupTable.get_orientation();
if (orientation != ORIENTATION_HORIZONTAL &&
orientation != ORIENTATION_VERTICAL) {
orientation = this._orientation;
}
this.setCurrentOrientation(orientation);
this._refreshCandidates();
this._refreshLabels();
// show lookup table
if (visible) {
this.showLookupTable();
}
},
showLookupTable: function() {
this._lookupTableVisible = true;
this._stCandidateArea.showAll();
this._checkShowStates();
},
hideLookupTable: function() {
this._lookupTableVisible = false;
this._checkShowStates();
this._stCandidateArea.hideAll();
},
pageUpLookupTable: function() {
this._lookupTable.page_up();
this._refreshCandidates();
},
pageDownLookup_table: function() {
this._lookupTable.page_down();
this._refreshCandidates();
},
cursorUpLookupTable: function() {
this._lookupTable.cursor_up();
this._refreshCandidates();
},
cursorDownLookupTable: function() {
this._lookupTable.cursor_down();
this._refreshCandidates();
},
setCursorLocation: function(x, y, w, h) {
// if cursor location is changed, we reset the moved cursor location
if (this._cursorLocation.join() != [x, y, w, h].join()) {
this._cursorLocation = [x, y, w, h];
this._movedCursorLocation = null;
this._checkPosition();
}
},
_checkShowStates: function() {
this._checkSeparatorShowStates();
if (this._preeditVisible ||
this._auxStringVisible ||
this._lookupTableVisible) {
this._checkPosition();
this.showAll();
this.emit('show');
} else {
this.hideAll();
this.emit('hide');
}
},
_checkSeparatorShowStates: function() {
if (this._preeditVisible || this._auxStringVisible) {
this._separator.actor.show();
}
else
this._separator.actor.hide();
},
reset: function() {
let text = IBus.Text.new_from_string('');
this.updatePreeditText(text, 0, false);
text = IBus.Text.new_from_string('');
this.updateAuxiliaryText(text, false);
this.updateLookupTable(null, false);
this.hideAll();
},
setCurrentOrientation: function(orientation) {
if (this._currentOrientation == orientation) {
return;
}
this._currentOrientation = orientation;
this._stCandidateArea.setOrientation(orientation);
},
setOrientation: function(orientation) {
this._orientation = orientation;
this.updateLookupTable(this._lookupTable, this._lookupTableVisible);
},
getCurrentOrientation: function() {
return this._currentOrientation;
},
_checkPosition: function() {
let cursorLocation = this._movedCursorLocation || this._cursorLocation;
let [cursorX, cursorY, cursorWidth, cursorHeight] = cursorLocation;
let windowRight = cursorX + cursorWidth + this.actor.get_width();
let windowBottom = cursorY + cursorHeight + this.actor.get_height();
this._cursorActor.set_position(cursorX, cursorY);
this._cursorActor.set_size(cursorWidth, cursorHeight);
let monitor = Main.layoutManager.findMonitorForActor(this._cursorActor);
let [sx, sy] = [monitor.x + monitor.width, monitor.y + monitor.height];
if (windowBottom > sy) {
this._arrowSide = St.Side.BOTTOM;
} else {
this._arrowSide = St.Side.TOP;
}
this._boxPointer._arrowSide = this._arrowSide;
this._boxPointer.setArrowOrigin(this._arrowSide);
this._boxPointer.setPosition(this._cursorActor, this._arrowAlignment);
},
showAll: function() {
if (!this._isVisible) {
this.actor.opacity = 255;
this.actor.show();
this._isVisible = true;
}
},
hideAll: function() {
if (this._isVisible) {
this.actor.opacity = 0;
this.actor.hide();
this._isVisible = false;
}
},
move: function(x, y) {
this.actor.set_position(x, y);
}
});
Signals.addSignalMethods(CandidatePanel.prototype);

View File

@ -2,42 +2,52 @@
const Clutter = imports.gi.Clutter;
const GdkPixbuf = imports.gi.GdkPixbuf;
const Gkbd = imports.gi.Gkbd;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
try {
var IBus = imports.gi.IBus;
const CandidatePanel = imports.ui.status.candidatePanel;
} catch (e) {
var IBus = null;
}
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu;
const Util = imports.misc.util;
const DESKTOP_INPUT_SOURCES_KEYBINDINGS_SCHEMA = 'org.gnome.desktop.input-sources.keybindings';
const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
const KEY_CURRENT_IS = 'current';
const KEY_INPUT_SOURCES = 'sources';
const LayoutMenuItem = new Lang.Class({
Name: 'LayoutMenuItem',
Extends: PopupMenu.PopupBaseMenuItem,
_init: function(config, id, indicator, long_name) {
_init: function(name, shortName, xkbLayout, xkbVariant, ibusEngine) {
this.parent();
this._config = config;
this._id = id;
this.label = new St.Label({ text: long_name });
this.indicator = indicator;
this.label = new St.Label({ text: name });
this.indicator = new St.Label({ text: shortName });
this.addActor(this.label);
this.addActor(this.indicator);
},
activate: function(event) {
this.parent(event);
this._config.lock_group(this._id);
this.sourceName = name;
this.shortName = shortName;
this.xkbLayout = xkbLayout;
this.xkbVariant = xkbVariant;
this.ibusEngine = ibusEngine;
}
});
const XKBIndicator = new Lang.Class({
Name: 'XKBIndicator',
const InputSourceIndicator = new Lang.Class({
Name: 'InputSourceIndicator',
Extends: PanelMenu.Button,
_init: function() {
@ -50,61 +60,237 @@ const XKBIndicator = new Lang.Class({
this.actor.add_actor(this._container);
this.actor.add_style_class_name('panel-status-button');
this._iconActor = new St.Icon({ icon_name: 'keyboard', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' });
this._container.add_actor(this._iconActor);
this._labelActors = [ ];
this._layoutItems = [ ];
this._showFlags = false;
this._config = Gkbd.Configuration.get();
this._config.connect('changed', Lang.bind(this, this._syncConfig));
this._config.connect('group-changed', Lang.bind(this, this._syncGroup));
this._config.start_listen();
this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + KEY_CURRENT_IS, Lang.bind(this, this._currentISChanged));
this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));
this._syncConfig();
if (IBus)
this._ibusInit();
this._inputSourcesChanged();
if (global.session_type == Shell.SessionType.USER) {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, function() {
Main.overview.hide();
Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]);
let description = this._selectedLayout.xkbLayout;
if (this._selectedLayout.xkbVariant.length > 0)
description = description + '\t' + this._selectedLayout.xkbVariant;
Util.spawn(['gkbd-keyboard-display', '-l', description]);
}));
}
this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop');
global.display.add_keybinding('switch-next',
new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Lang.bind(this, this._switchNext));
global.display.add_keybinding('switch-previous',
new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Lang.bind(this, this._switchPrevious));
},
_adjustGroupNames: function(names) {
// Disambiguate duplicate names with a subscript
// This is O(N^2) to avoid sorting names
// but N <= 4 so who cares?
_ibusInit: function() {
IBus.init();
this._ibus = new IBus.Bus();
if (!this._ibus.is_connected()) {
log('ibus-daemon is not running');
return;
}
for (let i = 0; i < names.length; i++) {
let name = names[i];
let cnt = 0;
for (let j = i + 1; j < names.length; j++) {
if (names[j] == name) {
cnt++;
// U+2081 SUBSCRIPT ONE
names[j] = name + String.fromCharCode(0x2081 + cnt);
}
this._ibus.request_name(IBus.SERVICE_PANEL,
IBus.BusNameFlag.ALLOW_REPLACEMENT |
IBus.BusNameFlag.REPLACE_EXISTING);
this._panel = new IBus.PanelService({ connection: this._ibus.get_connection(),
object_path: IBus.PATH_PANEL });
this._ibusInitPanelService();
this._candidatePanel = new CandidatePanel.CandidatePanel();
this._ibusInitCandidatePanel();
},
_ibusInitCandidatePanel: function() {
this._candidatePanel.connect('cursor-up',
Lang.bind(this, function(widget) {
this.cursorUp();
}));
this._candidatePanel.connect('cursor-down',
Lang.bind(this, function(widget) {
this.cursorDown();
}));
this._candidatePanel.connect('page-up',
Lang.bind(this, function(widget) {
this.pageUp();
}));
this._candidatePanel.connect('page-down',
Lang.bind(this, function(widget) {
this.pageDown();
}));
this._candidatePanel.connect('candidate-clicked',
Lang.bind(this, function(widget, index, button, state) {
this.candidateClicked(index, button, state);
}));
},
_ibusInitPanelService: function() {
this._panel.connect('set-cursor-location',
Lang.bind(this, this.setCursorLocation));
this._panel.connect('update-preedit-text',
Lang.bind(this, this.updatePreeditText));
this._panel.connect('show-preedit-text',
Lang.bind(this, this.showPreeditText));
this._panel.connect('hide-preedit-text',
Lang.bind(this, this.hidePreeditText));
this._panel.connect('update-auxiliary-text',
Lang.bind(this, this.updateAuxiliaryText));
this._panel.connect('show-auxiliary-text',
Lang.bind(this, this.showAuxiliaryText));
this._panel.connect('hide-auxiliary-text',
Lang.bind(this, this.hideAuxiliaryText));
this._panel.connect('update-lookup-table',
Lang.bind(this, this.updateLookupTable));
this._panel.connect('show-lookup-table',
Lang.bind(this, this.showLookupTable));
this._panel.connect('hide-lookup-table',
Lang.bind(this, this.hideLookupTable));
this._panel.connect('page-up-lookup-table',
Lang.bind(this, this.pageUpLookupTable));
this._panel.connect('page-down-lookup-table',
Lang.bind(this, this.pageDownLookupTable));
this._panel.connect('cursor-up-lookup-table',
Lang.bind(this, this.cursorUpLookupTable));
this._panel.connect('cursor-down-lookup-table',
Lang.bind(this, this.cursorDownLookupTable));
this._panel.connect('focus-in', Lang.bind(this, this.focusIn));
this._panel.connect('focus-out', Lang.bind(this, this.focusOut));
},
setCursorLocation: function(panel, x, y, w, h) {
this._candidatePanel.setCursorLocation(x, y, w, h);
},
updatePreeditText: function(panel, text, cursorPos, visible) {
this._candidatePanel.updatePreeditText(text, cursorPos, visible);
},
showPreeditText: function(panel) {
this._candidatePanel.showPreeditText();
},
hidePreeditText: function(panel) {
this._candidatePanel.hidePreeditText();
},
updateAuxiliaryText: function(panel, text, visible) {
this._candidatePanel.updateAuxiliaryText(text, visible);
},
showAuxiliaryText: function(panel) {
this._candidatePanel.showAuxiliaryText();
},
hideAuxiliaryText: function(panel) {
this._candidatePanel.hideAuxiliaryText();
},
updateLookupTable: function(panel, lookupTable, visible) {
this._candidatePanel.updateLookupTable(lookupTable, visible);
},
showLookupTable: function(panel) {
this._candidatePanel.showLookupTable();
},
hideLookupTable: function(panel) {
this._candidatePanel.hideLookupTable();
},
pageUpLookupTable: function(panel) {
this._candidatePanel.pageUpLookupTable();
},
pageDownLookupTable: function(panel) {
this._candidatePanel.pageDownLookupTable();
},
cursorUpLookupTable: function(panel) {
this._candidatePanel.cursorUpLookupTable();
},
cursorDownLookupTable: function(panel) {
this._candidatePanel.cursorDownLookupTable();
},
focusIn: function(panel, path) {
},
focusOut: function(panel, path) {
this._candidatePanel.reset();
},
cursorUp: function() {
this._panel.cursor_up();
},
cursorDown: function() {
this._panel.cursor_down();
},
pageUp: function() {
this._panel.page_up();
},
pageDown: function() {
this._panel.page_down();
},
candidateClicked: function(index, button, state) {
this._panel.candidate_clicked(index, button, state);
},
_currentISChanged: function() {
let source = this._settings.get_value(KEY_CURRENT_IS);
let name = source.get_child_value(0).get_string()[0];
if (this._selectedLayout) {
this._selectedLayout.setShowDot(false);
this._selectedLayout = null;
}
if (this._selectedLabel) {
this._container.set_skip_paint(this._selectedLabel, true);
this._selectedLabel = null;
}
for (let i = 0; i < this._layoutItems.length; ++i) {
let item = this._layoutItems[i];
if (item.sourceName == name) {
item.setShowDot(true);
this._selectedLayout = item;
break;
}
if (cnt != 0)
names[i] = name + '\u2081';
}
return names;
for (let i = 0; i < this._labelActors.length; ++i) {
let actor = this._labelActors[i];
if (actor.sourceName == name) {
this._selectedLabel = actor;
this._container.set_skip_paint(actor, false);
break;
}
}
if (!this._selectedLayout || !this._selectedLabel)
this._layoutItems[0].activate();
},
_syncConfig: function() {
this._showFlags = this._config.if_flags_shown();
if (this._showFlags) {
this._container.set_skip_paint(this._iconActor, false);
} else {
this._container.set_skip_paint(this._iconActor, true);
}
let groups = this._config.get_group_names();
if (groups.length > 1) {
_inputSourcesChanged: function() {
let sources = this._settings.get_value(KEY_INPUT_SOURCES);
if (sources.n_children() > 1) {
this.actor.show();
} else {
this.menu.close();
@ -117,55 +303,69 @@ const XKBIndicator = new Lang.Class({
for (let i = 0; i < this._labelActors.length; i++)
this._labelActors[i].destroy();
let short_names = this._adjustGroupNames(this._config.get_short_group_names());
this._selectedLayout = null;
this._layoutItems = [ ];
this._selectedLabel = null;
this._labelActors = [ ];
for (let i = 0; i < groups.length; i++) {
let icon_name = this._config.get_group_name(i);
let actor;
if (this._showFlags)
actor = new St.Icon({ icon_name: icon_name, icon_type: St.IconType.SYMBOLIC, style_class: 'popup-menu-icon' });
else
actor = new St.Label({ text: short_names[i] });
let item = new LayoutMenuItem(this._config, i, actor, groups[i]);
item._short_group_name = short_names[i];
item._icon_name = icon_name;
for (let i = 0; i < sources.n_children(); ++i) {
let name = sources.get_child_value(i).get_child_value(0).get_string()[0];
let shortName = sources.get_child_value(i).get_child_value(1).get_string()[0];
let xkbLayout = sources.get_child_value(i).get_child_value(2).get_string()[0];
let xkbVariant = sources.get_child_value(i).get_child_value(3).get_string()[0];
let ibusEngine = sources.get_child_value(i).get_child_value(4).get_string()[0];
let item = new LayoutMenuItem(name, shortName, xkbLayout, xkbVariant, ibusEngine);
this._layoutItems.push(item);
this.menu.addMenuItem(item, i);
item.connect('activate', Lang.bind(this, function() {
if (this._selectedLayout == null || item.sourceName != this._selectedLayout.sourceName) {
let name = GLib.Variant.new_string(item.sourceName);
let shortName = GLib.Variant.new_string(item.shortName);
let xkbLayout = GLib.Variant.new_string(item.xkbLayout);
let xkbVariant = GLib.Variant.new_string(item.xkbVariant);
let ibusEngine = GLib.Variant.new_string(item.ibusEngine);
let tuple = GLib.Variant.new_tuple([name, shortName, xkbLayout, xkbVariant, ibusEngine], 5);
this._settings.set_value(KEY_CURRENT_IS, tuple);
}
}));
let shortLabel = new St.Label({ text: short_names[i] });
let shortLabel = new St.Label({ text: shortName });
shortLabel.sourceName = name;
this._labelActors.push(shortLabel);
this._container.add_actor(shortLabel);
this._container.set_skip_paint(shortLabel, true);
}
this._syncGroup();
this._currentISChanged();
},
_syncGroup: function() {
let selected = this._config.get_current_group();
if (this._selectedLayout) {
this._selectedLayout.setShowDot(false);
this._selectedLayout = null;
_switchNext: function() {
if (!this._selectedLayout || !this._selectedLabel) {
this._layoutItems[0].activate();
return;
}
for (let i = 0; i < this._layoutItems.length; ++i) {
let item = this._layoutItems[i];
if (item.sourceName == this._selectedLayout.sourceName) {
this._layoutItems[(++i == this._layoutItems.length) ? 0 : i].activate();
break;
}
}
},
if (this._selectedLabel) {
this._container.set_skip_paint(this._selectedLabel, true);
this._selectedLabel = null;
_switchPrevious: function() {
if (!this._selectedLayout || !this._selectedLabel) {
this._layoutItems[0].activate();
return;
}
for (let i = 0; i < this._layoutItems.length; ++i) {
let item = this._layoutItems[i];
if (item.sourceName == this._selectedLayout.sourceName) {
this._layoutItems[(--i == -1) ? (this._layoutItems.length - 1) : i].activate();
break;
}
}
let item = this._layoutItems[selected];
item.setShowDot(true);
this._iconActor.icon_name = item._icon_name;
this._selectedLabel = this._labelActors[selected];
this._container.set_skip_paint(this._selectedLabel, this._showFlags);
this._selectedLayout = item;
},
_containerGetPreferredWidth: function(container, for_height, alloc) {
@ -173,15 +373,11 @@ const XKBIndicator = new Lang.Class({
// for the height of all children, but we ignore the results
// for those we don't actually display.
let max_min_width = 0, max_natural_width = 0;
if (this._showFlags)
[max_min_width, max_natural_width] = this._iconActor.get_preferred_width(for_height);
for (let i = 0; i < this._labelActors.length; i++) {
let [min_width, natural_width] = this._labelActors[i].get_preferred_width(for_height);
if (!this._showFlags) {
max_min_width = Math.max(max_min_width, min_width);
max_natural_width = Math.max(max_natural_width, natural_width);
}
max_min_width = Math.max(max_min_width, min_width);
max_natural_width = Math.max(max_natural_width, natural_width);
}
alloc.min_size = max_min_width;
@ -190,15 +386,11 @@ const XKBIndicator = new Lang.Class({
_containerGetPreferredHeight: function(container, for_width, alloc) {
let max_min_height = 0, max_natural_height = 0;
if (this._showFlags)
[max_min_height, max_natural_height] = this._iconActor.get_preferred_height(for_width);
for (let i = 0; i < this._labelActors.length; i++) {
let [min_height, natural_height] = this._labelActors[i].get_preferred_height(for_width);
if (!this._showFlags) {
max_min_height = Math.max(max_min_height, min_height);
max_natural_height = Math.max(max_natural_height, natural_height);
}
max_min_height = Math.max(max_min_height, min_height);
max_natural_height = Math.max(max_natural_height, natural_height);
}
alloc.min_size = max_min_height;
@ -212,7 +404,6 @@ const XKBIndicator = new Lang.Class({
box.y2 -= box.y1;
box.y1 = 0;
this._iconActor.allocate_align_fill(box, 0.5, 0, false, false, flags);
for (let i = 0; i < this._labelActors.length; i++)
this._labelActors[i].allocate_align_fill(box, 0.5, 0, false, false, flags);
}

View File

@ -1644,10 +1644,7 @@ const NMApplet = new Lang.Class({
_ensureSource: function() {
if (!this._source) {
this._source = new MessageTray.Source(_("Network Manager"),
'network-transmit-receive',
St.IconType.SYMBOLIC);
this._source = new NMMessageTraySource();
this._source.connect('destroy', Lang.bind(this, function() {
this._source = null;
}));
@ -2103,3 +2100,18 @@ const NMApplet = new Lang.Class({
}
}
});
const NMMessageTraySource = new Lang.Class({
Name: 'NMMessageTraySource',
Extends: MessageTray.Source,
_init: function() {
this.parent(_("Network Manager"));
let icon = new St.Icon({ icon_name: 'network-transmit-receive',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE
});
this._setSummaryIcon(icon);
}
});

View File

@ -365,9 +365,8 @@ const Client = new Lang.Class({
_ensureSubscriptionSource: function() {
if (this._subscriptionSource == null) {
this._subscriptionSource = new MessageTray.Source(_("Subscription request"),
'gtk-dialog-question',
St.IconType.FULLCOLOR);
this._subscriptionSource = new MultiNotificationSource(
_("Subscription request"), 'gtk-dialog-question');
Main.messageTray.add(this._subscriptionSource);
this._subscriptionSource.connect('destroy', Lang.bind(this, function () {
this._subscriptionSource = null;
@ -402,9 +401,8 @@ const Client = new Lang.Class({
_ensureAccountSource: function() {
if (this._accountSource == null) {
this._accountSource = new MessageTray.Source(_("Connection error"),
'gtk-dialog-error',
St.IconType.FULLCOLOR);
this._accountSource = new MultiNotificationSource(
_("Connection error"), 'gtk-dialog-error');
Main.messageTray.add(this._accountSource);
this._accountSource.connect('destroy', Lang.bind(this, function () {
this._accountSource = null;
@ -420,14 +418,14 @@ const ChatSource = new Lang.Class({
Extends: MessageTray.Source,
_init: function(account, conn, channel, contact, client) {
this.parent(contact.get_alias());
this.isChat = true;
this._account = account;
this._contact = contact;
this._client = client;
this.parent(contact.get_alias());
this._pendingMessages = [];
this._conn = conn;
@ -448,6 +446,8 @@ const ChatSource = new Lang.Class({
this._receivedId = this._channel.connect('message-received', Lang.bind(this, this._messageReceived));
this._pendingId = this._channel.connect('pending-message-removed', Lang.bind(this, this._pendingRemoved));
this._setSummaryIcon(this.createNotificationIcon());
this._notifyAliasId = this._contact.connect('notify::alias', Lang.bind(this, this._updateAlias));
this._notifyAvatarId = this._contact.connect('notify::avatar-file', Lang.bind(this, this._updateAvatarIcon));
this._presenceChangedId = this._contact.connect('presence-changed', Lang.bind(this, this._presenceChanged));
@ -1002,10 +1002,11 @@ const ApproverSource = new Lang.Class({
Extends: MessageTray.Source,
_init: function(dispatchOp, text, gicon) {
this._gicon = gicon;
this.parent(text);
this._gicon = gicon;
this._setSummaryIcon(this.createNotificationIcon());
this._dispatchOp = dispatchOp;
// Destroy the source if the channel dispatch operation is invalidated
@ -1027,6 +1028,7 @@ const ApproverSource = new Lang.Class({
createNotificationIcon: function() {
return new St.Icon({ gicon: this._gicon,
icon_type: St.IconType.FULLCOLOR,
icon_size: this.ICON_SIZE });
}
});
@ -1149,6 +1151,40 @@ const FileTransferNotification = new Lang.Class({
}
});
// A notification source that can embed multiple notifications
const MultiNotificationSource = new Lang.Class({
Name: 'MultiNotificationSource',
Extends: MessageTray.Source,
_init: function(title, icon) {
this.parent(title);
this._icon = icon;
this._setSummaryIcon(this.createNotificationIcon());
this._nbNotifications = 0;
},
notify: function(notification) {
this.parent(notification);
this._nbNotifications += 1;
// Display the source while there is at least one notification
notification.connect('destroy', Lang.bind(this, function () {
this._nbNotifications -= 1;
if (this._nbNotifications == 0)
this.destroy();
}));
},
createNotificationIcon: function() {
return new St.Icon({ gicon: Gio.icon_new_for_string(this._icon),
icon_type: St.IconType.FULLCOLOR,
icon_size: this.ICON_SIZE });
}
});
// Subscription request
const SubscriptionRequestNotification = new Lang.Class({
Name: 'SubscriptionRequestNotification',

View File

@ -1,363 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const AccountsService = imports.gi.AccountsService;
const Clutter = imports.gi.Clutter;
const GdmGreeter = imports.gi.GdmGreeter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const ModalDialog = imports.ui.modalDialog;
const Fprint = imports.gdm.fingerprint;
const GdmLoginDialog = imports.gdm.loginDialog;
function _fadeInActor(actor) {
if (actor.opacity == 255 && actor.visible)
return;
actor.show();
let [minHeight, naturalHeight] = actor.get_preferred_height(-1);
actor.opacity = 0;
actor.set_height(0);
Tweener.addTween(actor,
{ opacity: 255,
height: naturalHeight,
time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: function() {
this.set_height(-1);
},
});
}
function _fadeOutActor(actor) {
if (!actor.visible || actor.opacity == 0) {
actor.opacity = 0;
actor.hide();
}
Tweener.addTween(actor,
{ opacity: 0,
height: 0,
time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: function() {
this.hide();
this.set_height(-1);
},
});
}
// A widget showing the user avatar and name
const UserWidget = new Lang.Class({
Name: 'UserWidget',
_init: function(user) {
this._user = user;
this.actor = new St.BoxLayout({ style_class: 'status-chooser',
vertical: false,
reactive: false
});
this._iconBin = new St.Bin({ style_class: 'status-chooser-user-icon' });
this.actor.add(this._iconBin,
{ x_fill: true,
y_fill: true });
this._label = new St.Label({ style_class: 'login-dialog-prompt-label',
// FIXME:
style: 'text-align: right' });
this.actor.add(this._label,
{ expand: true,
x_fill: true,
y_fill: true
});
this._userLoadedId = this._user.connect('notify::is-loaded',
Lang.bind(this,
this._updateUser));
this._userChangedId = this._user.connect('changed',
Lang.bind(this,
this._updateUser));
this.actor.connect('notify::mapped', Lang.bind(this, function() {
if (this.actor.mapped)
this._updateUser();
}));
},
destroy: function() {
// clean up signal handlers
if (this._userLoadedId != 0) {
this._user.disconnect(this._userLoadedId);
this._userLoadedId = 0;
}
if (this._userChangedId != 0) {
this._user.disconnect(this._userChangedId);
this._userChangedId = 0;
}
this.actor.destroy();
},
_updateUser: function() {
let iconFile = null;
if (this._user.is_loaded) {
this._label.text = this._user.get_real_name();
iconFile = this._user.get_icon_file();
if (!GLib.file_test(iconFile, GLib.FileTest.EXISTS))
iconFile = null;
} else {
this._label.text = "";
}
if (iconFile)
this._setIconFromFile(iconFile);
else
this._setIconFromName('avatar-default');
},
// XXX: a GFileIcon instead?
_setIconFromFile: function(iconFile) {
this._iconBin.set_style('background-image: url("' + iconFile + '");' +
'background-size: contain;');
this._iconBin.child = null;
},
_setIconFromName: function(iconName) {
this._iconBin.set_style(null);
if (iconName != null) {
let icon = new St.Icon({ icon_name: iconName,
icon_type: St.IconType.SYMBOLIC,
icon_size: DIALOG_ICON_SIZE });
this._iconBin.child = icon;
this._iconBin.show();
} else {
this._iconBin.child = null;
this._iconBin.hide();
}
}
});
const UnlockDialog = new Lang.Class({
Name: 'UnlockDialog',
Extends: ModalDialog.ModalDialog,
_init: function() {
this.parent({ shellReactive: true,
styleClass: 'login-dialog' });
this._userManager = AccountsService.UserManager.get_default();
this._userName = GLib.get_user_name();
this._user = this._userManager.get_user(this._userName);
this._greeterClient = GdmGreeter.Server.new_for_display_sync(null, null);
this._greeterClient.call_start_conversation_sync(GdmLoginDialog.PASSWORD_SERVICE_NAME, null);
this._greeterClient.connect('reset',
Lang.bind(this, this._onReset));
this._greeterClient.connect('ready',
Lang.bind(this, this._onReady));
this._greeterClient.connect('info',
Lang.bind(this, this._onInfo));
this._greeterClient.connect('problem',
Lang.bind(this, this._onProblem));
this._greeterClient.connect('info-query',
Lang.bind(this, this._onInfoQuery));
this._greeterClient.connect('secret-info-query',
Lang.bind(this, this._onSecretInfoQuery));
this._greeterClient.connect('session-opened',
Lang.bind(this, this._onSessionOpened));
this._greeterClient.connect('conversation-stopped',
Lang.bind(this, this._onConversationStopped));
this._fprintManager = new Fprint.FprintManager();
this._startFingerprintConversationIfNeeded();
this._userWidget = new UserWidget(this._user);
this.contentLayout.add_actor(this._userWidget.actor);
this._promptLayout = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
vertical: false
});
this._promptLabel = new St.Label({ style_class: 'login-dialog-prompt-label' });
this._promptLayout.add(this._promptLabel,
{ expand: false,
x_fill: true,
y_fill: true,
x_align: St.Align.START });
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
can_focus: true });
this._promptLayout.add(this._promptEntry,
{ expand: true,
x_fill: true,
y_fill: false,
x_align: St.Align.START });
this.contentLayout.add_actor(this._promptLayout);
// Translators: this message is shown below the password entry field
// to indicate the user can swipe their finger instead
this._promptFingerprintMessage = new St.Label({ text: _("(or swipe finger)"),
style_class: 'login-dialog-prompt-fingerprint-message' });
this._promptFingerprintMessage.hide();
this.contentLayout.add_actor(this._promptFingerprintMessage);
this._okButton = { label: _("Unlock"),
action: Lang.bind(this, this._doUnlock),
key: Clutter.KEY_Return,
};
this.setButtons([this._okButton]);
this._updateOkButton(true);
},
_updateOkButton: function(sensitive) {
this._okButton.button.reactive = sensitive;
this._okButton.button.can_focus = sensitive;
if (sensitive)
this._okButton.button.remove_style_pseudo_class('disabled');
else
this._okButton.button.add_style_pseudo_class('disabled');
},
_onReset: function() {
// I'm not sure this is emitted for external greeters...
this._greeterClient.call_start_conversation_sync(GdmLoginDialog.PASSWORD_SERVICE_NAME, null);
this._startFingerprintConversationIfNeeded();
},
_startFingerprintConversationIfNeeded: function() {
this._haveFingerprintReader = false;
// FIXME: the greeter has a GSettings key for disabling fingerprint auth
this._fprintManager.GetDefaultDeviceRemote(Lang.bind(this,
function(device, error) {
if (!error && device)
this._haveFingerprintReader = true;
if (this._haveFingerprintReader)
this._greeterClient.call_start_conversation_sync(GdmLoginDialog.FINGERPRINT_SERVICE_NAME, null);
}));
},
_onReady: function(greeter, serviceName) {
greeter.call_begin_verification_for_user_sync(serviceName, this._userName, null);
},
_onInfo: function(greeter, serviceName, info) {
// We don't display fingerprint messages, because they
// have words like UPEK in them. Instead we use the messages
// as a cue to display our own message.
if (serviceName == GdmLoginDialog.FINGERPRINT_SERVICE_NAME &&
this._haveFingerprintReader &&
(!this._promptFingerprintMessage.visible ||
this._promptFingerprintMessage.opacity != 255)) {
_fadeInActor(this._promptFingerprintMessage);
return;
}
if (serviceName != GdmLoginDialog.PASSWORD_SERVICE_NAME)
return;
Main.notify(info);
},
_onProblem: function(client, serviceName, problem) {
// we don't want to show auth failed messages to
// users who haven't enrolled their fingerprint.
if (serviceName != GdmLoginDialog.PASSWORD_SERVICE_NAME)
return;
Main.notifyError(problem);
},
_onInfoQuery: function(client, serviceName, question) {
// We only expect questions to come from the main auth service
if (serviceName != GdmLoginDialog.PASSWORD_SERVICE_NAME)
return;
this._promptLabel.text = question;
this._promptEntry.text = '';
this._promptEntry.clutter_text.set_password_char('');
this._currentQuery = serviceName;
this._updateOkButton(true);
},
_onSecretInfoQuery: function(client, serviceName, secretQuestion) {
// We only expect secret requests to come from the main auth service
if (serviceName != GdmLoginDialog.PASSWORD_SERVICE_NAME)
return;
this._promptLabel.text = secretQuestion;
this._promptEntry.text = '';
this._promptEntry.clutter_text.set_password_char('\u25cf');
this._currentQuery = serviceName;
this._updateOkButton(true);
},
_doUnlock: function() {
if (!this._currentQuery)
return;
let query = this._currentQuery;
this._currentQuery = null;
this._updateOkButton(false);
this._greeterClient.call_answer_query_sync(query, this._promptEntry.text, null);
},
_onConversationStopped: function(client, serviceName) {
// if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed
if (serviceName == GdmLoginDialog.PASSWORD_SERVICE_NAME) {
this._greeterClient.call_cancel_sync(null);
this.emit('failed');
} else if (serviceName == GdmLoginDialog.FINGERPRINT_SERVICE_NAME) {
_fadeOutActor(this._promptFingerprintMessage);
}
},
_onSessionOpened: function(client, serviceName) {
// For external greeters, SessionOpened means we succeded
// in the authentication process
// Close the greeter proxy
this._greeterClient.run_dispose();
this._greeterClient = null;
this.emit('unlocked');
},
destroy: function() {
if (this._greeterClient) {
this._greeterClient.run_dispose();
this._greeterClient = null;
}
this.parent();
},
cancel: function() {
this._greeterClient.call_cancel_sync(null);
this.destroy();
},
});

View File

@ -497,13 +497,13 @@ const UserMenuButton = new Lang.Class({
}));
this._userManager.connect('notify::is-loaded',
Lang.bind(this, this._updateMultiUser));
Lang.bind(this, this._updateSwitchUser));
this._userManager.connect('notify::has-multiple-users',
Lang.bind(this, this._updateMultiUser));
Lang.bind(this, this._updateSwitchUser));
this._userManager.connect('user-added',
Lang.bind(this, this._updateMultiUser));
Lang.bind(this, this._updateSwitchUser));
this._userManager.connect('user-removed',
Lang.bind(this, this._updateMultiUser));
Lang.bind(this, this._updateSwitchUser));
this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
Lang.bind(this, this._updateSwitchUser));
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
@ -542,26 +542,24 @@ const UserMenuButton = new Lang.Class({
this._name.set_text("");
},
_updateMultiUser: function() {
this._updateSwitchUser();
this._updateLogout();
},
_updateSwitchUser: function() {
let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY);
this._loginScreenItem.actor.visible = allowSwitch &&
this._userManager.can_switch() &&
this._userManager.has_multiple_users;
if (allowSwitch &&
this._userManager.can_switch() &&
this._userManager.has_multiple_users)
this._loginScreenItem.actor.show();
else
this._loginScreenItem.actor.hide();
},
_updateLogout: function() {
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
this._logoutItem.actor.visible = allowLogout && this._userManager.has_multiple_users;
this._logoutItem.actor.visible = allowLogout;
},
_updateLockScreen: function() {
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
this._lockScreenItem.actor.visible = allowLockScreen;
this._logoutItem.actor.visible = allowLockScreen;
},
_updateHaveShutdown: function() {
@ -582,14 +580,14 @@ const UserMenuButton = new Lang.Class({
this._suspendOrPowerOffItem.actor.visible = this._haveShutdown || this._haveSuspend;
// If we can't power off show Suspend instead
// If we can't suspend show Power Off... instead
// and disable the alt key
if (!this._haveShutdown) {
if (!this._haveSuspend) {
this._suspendOrPowerOffItem.updateText(_("Power Off..."), null);
} else if (!this._haveShutdown) {
this._suspendOrPowerOffItem.updateText(_("Suspend"), null);
} else if (!this._haveSuspend) {
this._suspendOrPowerOffItem.updateText(_("Power Off"), null);
} else {
this._suspendOrPowerOffItem.updateText(_("Power Off"), _("Suspend"));
this._suspendOrPowerOffItem.updateText(_("Suspend"), _("Power Off..."));
}
},
@ -629,26 +627,28 @@ const UserMenuButton = new Lang.Class({
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Online Accounts"));
item.connect('activate', Lang.bind(this, this._onOnlineAccountsActivate));
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("System Settings"));
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
this.menu.addMenuItem(item);
item = new PopupMenu.PopupAlternatingMenuItem(_("Power Off"),
_("Suspend"));
this.menu.addMenuItem(item);
item.connect('activate', Lang.bind(this, this._onSuspendOrPowerOffActivate));
this._suspendOrPowerOffItem = item;
this._updateSuspendOrPowerOff();
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Lock Screen"));
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
this.menu.addMenuItem(item);
this._lockScreenItem = item;
item = new PopupMenu.PopupMenuItem(_("Switch User"));
item.connect('activate', Lang.bind(this, this._onLoginScreenActivate));
this.menu.addMenuItem(item);
this._loginScreenItem = item;
item = new PopupMenu.PopupMenuItem(_("Log Out"));
item = new PopupMenu.PopupMenuItem(_("Log Out..."));
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
this.menu.addMenuItem(item);
this._logoutItem = item;
@ -656,10 +656,12 @@ const UserMenuButton = new Lang.Class({
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Lock"));
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
item = new PopupMenu.PopupAlternatingMenuItem(_("Suspend"),
_("Power Off..."));
this.menu.addMenuItem(item);
this._lockScreenItem = item;
this._suspendOrPowerOffItem = item;
item.connect('activate', Lang.bind(this, this._onSuspendOrPowerOffActivate));
this._updateSuspendOrPowerOff();
},
_updatePresenceStatus: function(item, event) {
@ -687,6 +689,12 @@ const UserMenuButton = new Lang.Class({
app.activate();
},
_onOnlineAccountsActivate: function() {
Main.overview.hide();
let app = Shell.AppSystem.get_default().lookup_setting('gnome-online-accounts-panel.desktop');
app.activate(-1);
},
_onPreferencesActivate: function() {
Main.overview.hide();
let app = Shell.AppSystem.get_default().lookup_app('gnome-control-center.desktop');
@ -715,14 +723,14 @@ const UserMenuButton = new Lang.Class({
_onSuspendOrPowerOffActivate: function() {
Main.overview.hide();
if (this._haveShutdown &&
if (this._haveSuspend &&
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
this._session.ShutdownRemote();
} else {
// Ensure we only suspend after locking the screen
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
this._upClient.suspend_sync(null);
}));
} else {
this._session.ShutdownRemote();
}
}
});

View File

@ -168,35 +168,34 @@ const WandaSearchProvider = new Lang.Class({
this.parent(_("Your favorite Easter Egg"));
},
getResultMetas: function(fish, callback) {
callback([{ 'id': fish[0], // there may be many fish in the sea, but
// only one which speaks the truth!
'name': capitalize(fish[0]),
'createIcon': function(iconSize) {
// for DND only (maybe could be improved)
// DON'T use St.Icon here, it crashes the shell
// (dnd.js code assumes it can query the actor size
// without parenting it, while StWidget accesses
// StThemeNode in get_preferred_width/height, which
// triggers an assertion failure)
return St.TextureCache.get_default().load_icon_name(null,
'face-smile',
St.IconType.FULLCOLOR,
iconSize);
}
}]);
getResultMetas: function(fish) {
return [{ 'id': fish[0], // there may be many fish in the sea, but
// only one which speaks the truth!
'name': capitalize(fish[0]),
'createIcon': function(iconSize) {
// for DND only (maybe could be improved)
// DON'T use St.Icon here, it crashes the shell
// (dnd.js code assumes it can query the actor size
// without parenting it, while StWidget accesses
// StThemeNode in get_preferred_width/height, which
// triggers an assertion failure)
return St.TextureCache.get_default().load_icon_name(null,
'face-smile',
St.IconType.FULLCOLOR,
iconSize);
}
}];
},
getInitialResultSet: function(terms) {
if (terms.join(' ') == MAGIC_FISH_KEY) {
this.searchSystem.pushResults(this, [ FISH_NAME ]);
} else {
this.searchSystem.pushResults(this, []);
return [ FISH_NAME ];
}
return [];
},
getSubsearchResultSet: function(previousResults, terms) {
this.getInitialResultSet(terms);
return this.getInitialResultSet(terms);
},
activateResult: function(fish, params) {

View File

@ -53,10 +53,10 @@ const Source = new Lang.Class({
Extends: MessageTray.Source,
_init: function(app, window) {
this.parent(app.get_name());
this._window = window;
this._app = app;
this.parent(app.get_name());
this._setSummaryIcon(this.createNotificationIcon());
this.signalIDs = [];
this.signalIDs.push(this._window.connect('notify::demands-attention', Lang.bind(this, function() { this.destroy(); })));

View File

@ -301,8 +301,7 @@ const WindowClone = new Lang.Class({
if (!this._zoomLightbox)
this._zoomLightbox = new Lightbox.Lightbox(Main.uiGroup,
{ fadeInTime: LIGHTBOX_FADE_TIME,
fadeOutTime: LIGHTBOX_FADE_TIME });
{ fadeTime: LIGHTBOX_FADE_TIME });
this._zoomLightbox.show();
this._zoomLocalOrig = new ScaledPoint(this.actor.x, this.actor.y, this.actor.scale_x, this.actor.scale_y);

203
po/es.po
View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-05-10 14:28+0000\n"
"PO-Revision-Date: 2012-05-10 18:04+0200\n"
"POT-Creation-Date: 2012-04-24 15:39+0000\n"
"PO-Revision-Date: 2012-04-25 12:09+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n"
@ -141,10 +141,12 @@ msgid "Keybinding to open the application menu."
msgstr "Asociación de teclas para abrir el menú de la aplicación."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to toggle the screen recorder"
msgstr "Asociación de teclas cambiar el grabador de pantalla"
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#| msgid "Keybinding to open the application menu."
msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Asociación de teclas para iniciar/detener el grabador de pantalla."
@ -266,7 +268,7 @@ msgstr "¿No está en la lista?"
#: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:459
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel"
msgstr "Cancelar"
@ -279,17 +281,16 @@ msgstr "Iniciar sesión"
msgid "Login Window"
msgstr "Ventana de inicio de sesión"
#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:588
#: ../js/ui/userMenu.js:592 ../js/ui/userMenu.js:637
#: ../js/gdm/powerMenu.js:155 ../js/ui/userMenu.js:597
#: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:668
msgid "Suspend"
msgstr "Suspender"
#: ../js/gdm/powerMenu.js:135
#: ../js/gdm/powerMenu.js:160
msgid "Restart"
msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:590
#: ../js/ui/userMenu.js:592 ../js/ui/userMenu.js:636
#: ../js/gdm/powerMenu.js:165
msgid "Power Off"
msgstr "Apagar"
@ -317,19 +318,19 @@ msgstr "Todas"
msgid "APPLICATIONS"
msgstr "APLICACIONES"
#: ../js/ui/appDisplay.js:374
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "CONFIGURACIÓN"
#: ../js/ui/appDisplay.js:679
#: ../js/ui/appDisplay.js:680
msgid "New Window"
msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:682
#: ../js/ui/appDisplay.js:683
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:683
#: ../js/ui/appDisplay.js:684
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
@ -527,7 +528,7 @@ msgstr "Desconectado"
msgid "CONTACTS"
msgstr "CONTACTOS"
#: ../js/ui/dash.js:239 ../js/ui/messageTray.js:1209
#: ../js/ui/dash.js:229 ../js/ui/messageTray.js:1207
msgid "Remove"
msgstr "Quitar"
@ -703,73 +704,73 @@ msgstr "Contraseña:"
msgid "Type again:"
msgstr "Escriba de nuevo:"
#: ../js/ui/lookingGlass.js:693
#: ../js/ui/lookingGlass.js:732
msgid "No extensions installed"
msgstr "No hay extensiones instaladas"
#. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:747
#: ../js/ui/lookingGlass.js:786
#, c-format
msgid "%s has not emitted any errors."
msgstr "%s no ha generado ningún error."
#: ../js/ui/lookingGlass.js:753
#: ../js/ui/lookingGlass.js:792
msgid "Hide Errors"
msgstr "Ocultar errores"
#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:808
#: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors"
msgstr "Mostrar errores"
#: ../js/ui/lookingGlass.js:766
#: ../js/ui/lookingGlass.js:805
msgid "Enabled"
msgstr "Activado"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1082
#: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled"
msgstr "Desactivado"
#: ../js/ui/lookingGlass.js:771
#: ../js/ui/lookingGlass.js:810
msgid "Error"
msgstr "Error"
#: ../js/ui/lookingGlass.js:773
#: ../js/ui/lookingGlass.js:812
msgid "Out of date"
msgstr "Caducado"
#: ../js/ui/lookingGlass.js:775
#: ../js/ui/lookingGlass.js:814
msgid "Downloading"
msgstr "Descargando"
#: ../js/ui/lookingGlass.js:796
#: ../js/ui/lookingGlass.js:835
msgid "View Source"
msgstr "Ver fuente"
#: ../js/ui/lookingGlass.js:802
#: ../js/ui/lookingGlass.js:841
msgid "Web Page"
msgstr "Página web"
#. Translators: this is a filename used for screencast recording
#: ../js/ui/main.js:118
#: ../js/ui/main.js:121
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Screencast desde %d %t"
#: ../js/ui/messageTray.js:1202
#: ../js/ui/messageTray.js:1200
msgid "Open"
msgstr "Abrir"
#: ../js/ui/messageTray.js:1219
#: ../js/ui/messageTray.js:1217
msgid "Unmute"
msgstr "Dar voz"
#: ../js/ui/messageTray.js:1219
#: ../js/ui/messageTray.js:1217
msgid "Mute"
msgstr "Silenciar"
#: ../js/ui/messageTray.js:2492
#: ../js/ui/messageTray.js:2490
msgid "System Information"
msgstr "Información del sistema"
@ -932,7 +933,7 @@ msgstr "Inténtelo de nuevo,"
#. "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:728
#: ../js/ui/popupMenu.js:724
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -940,11 +941,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "Introduzca un comando:"
#: ../js/ui/searchDisplay.js:321
#: ../js/ui/searchDisplay.js:332
msgid "Searching..."
msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:374
#: ../js/ui/searchDisplay.js:415
msgid "No matching results."
msgstr "No se encontró ningún resultado coincidente."
@ -1016,9 +1017,9 @@ msgid "Large Text"
msgstr "Texto grande"
#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/bluetooth.js:338
#: ../js/ui/status/bluetooth.js:368 ../js/ui/status/bluetooth.js:404
#: ../js/ui/status/bluetooth.js:433 ../js/ui/status/network.js:890
#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893
msgid "Bluetooth"
msgstr "Bluetooth"
@ -1043,102 +1044,102 @@ msgstr "Configuración de Bluetooth"
msgid "hardware disabled"
msgstr "hardware desactivado"
#: ../js/ui/status/bluetooth.js:200
#: ../js/ui/status/bluetooth.js:203
msgid "Connection"
msgstr "Conexión"
#: ../js/ui/status/bluetooth.js:211 ../js/ui/status/network.js:491
#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491
msgid "disconnecting..."
msgstr "deconectando…"
#: ../js/ui/status/bluetooth.js:224 ../js/ui/status/network.js:497
#: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:497
msgid "connecting..."
msgstr "conectando…"
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:245
msgid "Send Files..."
msgstr "Enviar archivos…"
#: ../js/ui/status/bluetooth.js:247
#: ../js/ui/status/bluetooth.js:250
msgid "Browse Files..."
msgstr "Examinar archivos…"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:259
msgid "Error browsing device"
msgstr "Error al examinar el dispositivo"
#: ../js/ui/status/bluetooth.js:257
#: ../js/ui/status/bluetooth.js:260
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "No se puede examinar el dispositivo solicitado, el error es «%s»"
#: ../js/ui/status/bluetooth.js:265
#: ../js/ui/status/bluetooth.js:268
msgid "Keyboard Settings"
msgstr "Configuración del teclado"
#: ../js/ui/status/bluetooth.js:268
#: ../js/ui/status/bluetooth.js:271
msgid "Mouse Settings"
msgstr "Ajustes del ratón…"
#: ../js/ui/status/bluetooth.js:273 ../js/ui/status/volume.js:59
#: ../js/ui/status/bluetooth.js:276 ../js/ui/status/volume.js:59
msgid "Sound Settings"
msgstr "Configuración del sonido"
#: ../js/ui/status/bluetooth.js:369
#: ../js/ui/status/bluetooth.js:372
#, c-format
msgid "Authorization request from %s"
msgstr "Solicitud de autorización de %s"
#: ../js/ui/status/bluetooth.js:375
#: ../js/ui/status/bluetooth.js:378
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "El dispositivo %s quiere acceder al servicio «%s»"
#: ../js/ui/status/bluetooth.js:377
#: ../js/ui/status/bluetooth.js:380
msgid "Always grant access"
msgstr "Conceder acceso siempre"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:381
msgid "Grant this time only"
msgstr "Conceder sólo esta vez"
#: ../js/ui/status/bluetooth.js:379 ../js/ui/telepathyClient.js:1093
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
msgid "Reject"
msgstr "Rechazar"
#: ../js/ui/status/bluetooth.js:405
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Confirmación de emparejamiento para «%s»"
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:441
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:444
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "El dispositivo «%s» quiere emparejarse con este equipo"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confirme que el PIN mostrado en «%s» coincide con el del dispositivo."
#: ../js/ui/status/bluetooth.js:414
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Coincide"
#: ../js/ui/status/bluetooth.js:415
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "No coincide"
#: ../js/ui/status/bluetooth.js:434
#: ../js/ui/status/bluetooth.js:437
#, c-format
msgid "Pairing request for %s"
msgstr "Solicitud de emparejamiento para «%s»"
#: ../js/ui/status/bluetooth.js:442
#: ../js/ui/status/bluetooth.js:445
msgid "Please enter the PIN mentioned on the device."
msgstr "Introduzca el PIN mencionado en el dispositivo."
#: ../js/ui/status/bluetooth.js:458
#: ../js/ui/status/bluetooth.js:461
msgid "OK"
msgstr "Aceptar"
@ -1191,13 +1192,13 @@ msgstr "no disponible"
msgid "connection failed"
msgstr "falló la conexión"
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1497
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
msgid "More..."
msgstr "Más…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1432
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440
msgid "Connected (private)"
msgstr "Conectada (privada)"
@ -1205,69 +1206,69 @@ msgstr "Conectada (privada)"
msgid "Auto Ethernet"
msgstr "Ethernet automática"
#: ../js/ui/status/network.js:754
#: ../js/ui/status/network.js:757
msgid "Auto broadband"
msgstr "Banda ancha automática"
#: ../js/ui/status/network.js:757
#: ../js/ui/status/network.js:760
msgid "Auto dial-up"
msgstr "Marcado automático"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:876 ../js/ui/status/network.js:1444
#: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452
#, c-format
msgid "Auto %s"
msgstr "%s automática"
#: ../js/ui/status/network.js:878
#: ../js/ui/status/network.js:881
msgid "Auto bluetooth"
msgstr "Bluetooth automático"
#: ../js/ui/status/network.js:1446
#: ../js/ui/status/network.js:1454
msgid "Auto wireless"
msgstr "Inalámbrica automática"
#: ../js/ui/status/network.js:1533
#: ../js/ui/status/network.js:1541
msgid "Network"
msgstr "Red"
#: ../js/ui/status/network.js:1540
#: ../js/ui/status/network.js:1548
msgid "Enable networking"
msgstr "Activar red"
#: ../js/ui/status/network.js:1552
#: ../js/ui/status/network.js:1560
msgid "Wired"
msgstr "Cableada"
#: ../js/ui/status/network.js:1563
#: ../js/ui/status/network.js:1571
msgid "Wireless"
msgstr "Inalámbrica"
#: ../js/ui/status/network.js:1573
#: ../js/ui/status/network.js:1581
msgid "Mobile broadband"
msgstr "Banda ancha móvil"
#: ../js/ui/status/network.js:1583
#: ../js/ui/status/network.js:1591
msgid "VPN Connections"
msgstr "Conexiones VPN"
#: ../js/ui/status/network.js:1594
#: ../js/ui/status/network.js:1602
msgid "Network Settings"
msgstr "Configuración de la red"
#: ../js/ui/status/network.js:1731
#: ../js/ui/status/network.js:1739
msgid "Connection failed"
msgstr "Falló la conexión"
#: ../js/ui/status/network.js:1732
#: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red"
#: ../js/ui/status/network.js:1985
#: ../js/ui/status/network.js:1993
msgid "Networking is disabled"
msgstr "La red está desactivada"
#: ../js/ui/status/network.js:2109
#: ../js/ui/status/network.js:2117
msgid "Network Manager"
msgstr "Gestor de la red"
@ -1641,34 +1642,39 @@ msgstr "Inactivo"
msgid "Unavailable"
msgstr "No disponible"
#: ../js/ui/userMenu.js:624
#: ../js/ui/userMenu.js:595 ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:669
msgid "Power Off..."
msgstr "Apagar…"
#: ../js/ui/userMenu.js:631
msgid "Notifications"
msgstr "Notificaciones"
#: ../js/ui/userMenu.js:632
#: ../js/ui/userMenu.js:639
msgid "Online Accounts"
msgstr "Cuentas en línea"
#: ../js/ui/userMenu.js:643
msgid "System Settings"
msgstr "Configuración del sistema"
#: ../js/ui/userMenu.js:646
#: ../js/ui/userMenu.js:650
msgid "Lock Screen"
msgstr "Bloquear la pantalla"
#: ../js/ui/userMenu.js:655
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:651
#| msgctxt "title"
#| msgid "Log Out"
msgid "Log Out"
msgstr "Cerrar la sesión"
#: ../js/ui/userMenu.js:660
msgid "Log Out..."
msgstr "Cerrar la sesión…"
#: ../js/ui/userMenu.js:659
#| msgid "Clock"
msgid "Lock"
msgstr "Bloquear"
#: ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:688
msgid "Your chat status will be set to busy"
msgstr "Su estado del chat se establecerá a «ocupado»"
#: ../js/ui/userMenu.js:678
#: ../js/ui/userMenu.js:689
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1789,18 +1795,6 @@ msgstr "Sistema de archivos"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Power Off..."
#~ msgstr "Apagar…"
#~ msgid "Online Accounts"
#~ msgstr "Cuentas en línea"
#~ msgid "Lock Screen"
#~ msgstr "Bloquear la pantalla"
#~ msgid "Log Out..."
#~ msgstr "Cerrar la sesión…"
#~ msgid "RECENT ITEMS"
#~ msgstr "ELEMENTOS RECIENTES"
@ -2060,6 +2054,9 @@ msgstr "%1$s: %2$s"
#~ msgid "Can't remove the first workspace."
#~ msgstr "No se puede quitar el primer área de trabajo."
#~ msgid "Clock"
#~ msgstr "Reloj"
#~ msgid "Customize the panel clock"
#~ msgstr "Personalizar el reloj del panel"

199
po/gl.po
View File

@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-05-11 11:31+0200\n"
"PO-Revision-Date: 2012-05-11 11:31+0200\n"
"POT-Creation-Date: 2012-04-27 17:06+0200\n"
"PO-Revision-Date: 2012-04-27 17:07+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: Galician <gnome-l10n-gl@gnome.org>\n"
"Language: gl\n"
@ -270,7 +270,7 @@ msgstr "Non está na lista?"
#: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:459
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel"
msgstr "Cancelar"
@ -283,31 +283,30 @@ msgstr "Iniciar sesión"
msgid "Login Window"
msgstr "Xanela de inicio de sesión"
#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:588
#: ../js/ui/userMenu.js:592 ../js/ui/userMenu.js:637
#: ../js/gdm/powerMenu.js:155 ../js/ui/userMenu.js:597
#: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:668
msgid "Suspend"
msgstr "Suspender"
#: ../js/gdm/powerMenu.js:135
#: ../js/gdm/powerMenu.js:160
msgid "Restart"
msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:590
#: ../js/ui/userMenu.js:592 ../js/ui/userMenu.js:636
#: ../js/gdm/powerMenu.js:165
msgid "Power Off"
msgstr "Apagar"
#: ../js/misc/util.js:93
#: ../js/misc/util.js:92
msgid "Command not found"
msgstr "Orde non atopada"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:124
#: ../js/misc/util.js:119
msgid "Could not parse command:"
msgstr "Non foi posíbel analizar a orde:"
#: ../js/misc/util.js:132
#: ../js/misc/util.js:127
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Produciuse un fallo na execución de «%s»:"
@ -321,19 +320,19 @@ msgstr "Todos"
msgid "APPLICATIONS"
msgstr "APLICATIVOS"
#: ../js/ui/appDisplay.js:374
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "CONFIGURACIÓN"
#: ../js/ui/appDisplay.js:679
#: ../js/ui/appDisplay.js:680
msgid "New Window"
msgstr "Xanela nova"
#: ../js/ui/appDisplay.js:682
#: ../js/ui/appDisplay.js:683
msgid "Remove from Favorites"
msgstr "Eliminar dos favoritos"
#: ../js/ui/appDisplay.js:683
#: ../js/ui/appDisplay.js:684
msgid "Add to Favorites"
msgstr "Engadir aos favoritos"
@ -531,7 +530,7 @@ msgstr "Desconectado"
msgid "CONTACTS"
msgstr "CONTACTOS"
#: ../js/ui/dash.js:239 ../js/ui/messageTray.js:1209
#: ../js/ui/dash.js:229 ../js/ui/messageTray.js:1207
msgid "Remove"
msgstr "Quitar"
@ -706,73 +705,73 @@ msgstr "Contrasinal:"
msgid "Type again:"
msgstr "Escriba de novo:"
#: ../js/ui/lookingGlass.js:693
#: ../js/ui/lookingGlass.js:732
msgid "No extensions installed"
msgstr "Non hai ningunha extensión instalada"
#. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:747
#: ../js/ui/lookingGlass.js:786
#, c-format
msgid "%s has not emitted any errors."
msgstr "%s non xerou ningún erro."
#: ../js/ui/lookingGlass.js:753
#: ../js/ui/lookingGlass.js:792
msgid "Hide Errors"
msgstr "Ocultar erros"
#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:808
#: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors"
msgstr "Mostrar erros"
#: ../js/ui/lookingGlass.js:766
#: ../js/ui/lookingGlass.js:805
msgid "Enabled"
msgstr "Activado"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1082
#: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled"
msgstr "Desactivado"
#: ../js/ui/lookingGlass.js:771
#: ../js/ui/lookingGlass.js:810
msgid "Error"
msgstr "Erro"
#: ../js/ui/lookingGlass.js:773
#: ../js/ui/lookingGlass.js:812
msgid "Out of date"
msgstr "Caducado"
#: ../js/ui/lookingGlass.js:775
#: ../js/ui/lookingGlass.js:814
msgid "Downloading"
msgstr "Descargando"
#: ../js/ui/lookingGlass.js:796
#: ../js/ui/lookingGlass.js:835
msgid "View Source"
msgstr "Ver fonte"
#: ../js/ui/lookingGlass.js:802
#: ../js/ui/lookingGlass.js:841
msgid "Web Page"
msgstr "Páxina web"
#. Translators: this is a filename used for screencast recording
#: ../js/ui/main.js:118
#: ../js/ui/main.js:121
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Screencast desde %d %t"
#: ../js/ui/messageTray.js:1202
#: ../js/ui/messageTray.js:1200
msgid "Open"
msgstr "Abrir"
#: ../js/ui/messageTray.js:1219
#: ../js/ui/messageTray.js:1217
msgid "Unmute"
msgstr "Desactivar silencio"
#: ../js/ui/messageTray.js:1219
#: ../js/ui/messageTray.js:1217
msgid "Mute"
msgstr "Silenciar"
#: ../js/ui/messageTray.js:2492
#: ../js/ui/messageTray.js:2490
msgid "System Information"
msgstr "Información do sistema"
@ -943,11 +942,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "Escriba unha orde:"
#: ../js/ui/searchDisplay.js:321
#: ../js/ui/searchDisplay.js:332
msgid "Searching..."
msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:374
#: ../js/ui/searchDisplay.js:415
msgid "No matching results."
msgstr "Non hai resultados que coincidan."
@ -1019,9 +1018,9 @@ msgid "Large Text"
msgstr "Texto grande"
#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/bluetooth.js:338
#: ../js/ui/status/bluetooth.js:368 ../js/ui/status/bluetooth.js:404
#: ../js/ui/status/bluetooth.js:433 ../js/ui/status/network.js:890
#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893
msgid "Bluetooth"
msgstr "Bluetooth"
@ -1046,102 +1045,102 @@ msgstr "Preferencias do Bluetooth"
msgid "hardware disabled"
msgstr "hardware desactivado"
#: ../js/ui/status/bluetooth.js:200
#: ../js/ui/status/bluetooth.js:203
msgid "Connection"
msgstr "Conexión"
#: ../js/ui/status/bluetooth.js:211 ../js/ui/status/network.js:491
#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491
msgid "disconnecting..."
msgstr "desconectando…"
#: ../js/ui/status/bluetooth.js:224 ../js/ui/status/network.js:497
#: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:497
msgid "connecting..."
msgstr "conectando…"
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:245
msgid "Send Files..."
msgstr "Enviar ficheiros…"
#: ../js/ui/status/bluetooth.js:247
#: ../js/ui/status/bluetooth.js:250
msgid "Browse Files..."
msgstr "Explorar ficheiros…"
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:259
msgid "Error browsing device"
msgstr "Produciuse un erro ao explorar o dispositivo"
#: ../js/ui/status/bluetooth.js:257
#: ../js/ui/status/bluetooth.js:260
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "O dispositivo solicitado non pode explorarse, o erro é «%s»"
#: ../js/ui/status/bluetooth.js:265
#: ../js/ui/status/bluetooth.js:268
msgid "Keyboard Settings"
msgstr "Preferencias do teclado"
#: ../js/ui/status/bluetooth.js:268
#: ../js/ui/status/bluetooth.js:271
msgid "Mouse Settings"
msgstr "Preferencias do rato"
#: ../js/ui/status/bluetooth.js:273 ../js/ui/status/volume.js:59
#: ../js/ui/status/bluetooth.js:276 ../js/ui/status/volume.js:59
msgid "Sound Settings"
msgstr "Preferencias do son"
#: ../js/ui/status/bluetooth.js:369
#: ../js/ui/status/bluetooth.js:372
#, c-format
msgid "Authorization request from %s"
msgstr "Solicitude de autorización de %s"
#: ../js/ui/status/bluetooth.js:375
#: ../js/ui/status/bluetooth.js:378
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "O dispositivo %s quere acceder ao servizo «%s»"
#: ../js/ui/status/bluetooth.js:377
#: ../js/ui/status/bluetooth.js:380
msgid "Always grant access"
msgstr "Conceder acceso sempre"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:381
msgid "Grant this time only"
msgstr "Conceder só esta vez"
#: ../js/ui/status/bluetooth.js:379 ../js/ui/telepathyClient.js:1093
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
msgid "Reject"
msgstr "Rexeitar"
#: ../js/ui/status/bluetooth.js:405
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Confirmación de emparellado para «%s»"
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:441
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:444
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "O dispositivo «%s» quere emparellarse con este equipo"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confirme que o PIN mostrado en «%s» coincide co do dispositivo."
#: ../js/ui/status/bluetooth.js:414
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Coincide"
#: ../js/ui/status/bluetooth.js:415
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "Non coincide"
#: ../js/ui/status/bluetooth.js:434
#: ../js/ui/status/bluetooth.js:437
#, c-format
msgid "Pairing request for %s"
msgstr "Solicitude de emparellamento para «%s»"
#: ../js/ui/status/bluetooth.js:442
#: ../js/ui/status/bluetooth.js:445
msgid "Please enter the PIN mentioned on the device."
msgstr "Escriba o PIN mencionado no dispositivo."
#: ../js/ui/status/bluetooth.js:458
#: ../js/ui/status/bluetooth.js:461
msgid "OK"
msgstr "Aceptar"
@ -1194,13 +1193,13 @@ msgstr "non dispoñíbel"
msgid "connection failed"
msgstr "conexión fallida"
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1497
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
msgid "More..."
msgstr "Máis…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1432
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440
msgid "Connected (private)"
msgstr "Conectada (privada)"
@ -1208,69 +1207,69 @@ msgstr "Conectada (privada)"
msgid "Auto Ethernet"
msgstr "Ethernet automática"
#: ../js/ui/status/network.js:754
#: ../js/ui/status/network.js:757
msgid "Auto broadband"
msgstr "Banda larga automática"
#: ../js/ui/status/network.js:757
#: ../js/ui/status/network.js:760
msgid "Auto dial-up"
msgstr "Marcado automático"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:876 ../js/ui/status/network.js:1444
#: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452
#, c-format
msgid "Auto %s"
msgstr "%s automática"
#: ../js/ui/status/network.js:878
#: ../js/ui/status/network.js:881
msgid "Auto bluetooth"
msgstr "Bluetooth automática"
#: ../js/ui/status/network.js:1446
#: ../js/ui/status/network.js:1454
msgid "Auto wireless"
msgstr "Sen fíos automática"
#: ../js/ui/status/network.js:1533
#: ../js/ui/status/network.js:1541
msgid "Network"
msgstr "Rede"
#: ../js/ui/status/network.js:1540
#: ../js/ui/status/network.js:1548
msgid "Enable networking"
msgstr "Activar rede"
#: ../js/ui/status/network.js:1552
#: ../js/ui/status/network.js:1560
msgid "Wired"
msgstr "Con fíos"
#: ../js/ui/status/network.js:1563
#: ../js/ui/status/network.js:1571
msgid "Wireless"
msgstr "Sen fíos"
#: ../js/ui/status/network.js:1573
#: ../js/ui/status/network.js:1581
msgid "Mobile broadband"
msgstr "Banda larga móbil"
#: ../js/ui/status/network.js:1583
#: ../js/ui/status/network.js:1591
msgid "VPN Connections"
msgstr "Conexións VPN"
#: ../js/ui/status/network.js:1594
#: ../js/ui/status/network.js:1602
msgid "Network Settings"
msgstr "Preferencias da rede"
#: ../js/ui/status/network.js:1731
#: ../js/ui/status/network.js:1739
msgid "Connection failed"
msgstr "Produciuse un fallo na conexión"
#: ../js/ui/status/network.js:1732
#: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed"
msgstr "Produciuse un fallo na activación da conexión de rede"
#: ../js/ui/status/network.js:1985
#: ../js/ui/status/network.js:1993
msgid "Networking is disabled"
msgstr "A rede está desactivada"
#: ../js/ui/status/network.js:2109
#: ../js/ui/status/network.js:2117
msgid "Network Manager"
msgstr "Xestor da rede"
@ -1644,31 +1643,39 @@ msgstr "Inactivo"
msgid "Unavailable"
msgstr "Non dispoñíbel"
#: ../js/ui/userMenu.js:624
#: ../js/ui/userMenu.js:595 ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:669
msgid "Power Off..."
msgstr "Apagar…"
#: ../js/ui/userMenu.js:631
msgid "Notifications"
msgstr "Notificacións"
#: ../js/ui/userMenu.js:632
#: ../js/ui/userMenu.js:639
msgid "Online Accounts"
msgstr "Contas en liña"
#: ../js/ui/userMenu.js:643
msgid "System Settings"
msgstr "Preferencias do sistema"
#: ../js/ui/userMenu.js:646
#: ../js/ui/userMenu.js:650
msgid "Lock Screen"
msgstr "Bloquear a pantalla"
#: ../js/ui/userMenu.js:655
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:651
msgid "Log Out"
msgstr "Saír da sesión"
#: ../js/ui/userMenu.js:660
msgid "Log Out..."
msgstr "Saír da sesión"
#: ../js/ui/userMenu.js:659
msgid "Lock"
msgstr "Bloquear"
#: ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:688
msgid "Your chat status will be set to busy"
msgstr "O seu estado do chat estabelecerase a «ocupado»"
#: ../js/ui/userMenu.js:678
#: ../js/ui/userMenu.js:689
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1789,18 +1796,6 @@ msgstr "Sistema de ficheiros"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Power Off..."
#~ msgstr "Apagar…"
#~ msgid "Online Accounts"
#~ msgstr "Contas en liña"
#~ msgid "Lock Screen"
#~ msgstr "Bloquear a pantalla"
#~ msgid "Log Out..."
#~ msgstr "Saír da sesión…"
#~ msgid "RECENT ITEMS"
#~ msgstr "ELEMENTOS RECENTES"

1167
po/id.po

File diff suppressed because it is too large Load Diff

238
po/it.po
View File

@ -8,15 +8,16 @@
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-05-12 20:08+0200\n"
"PO-Revision-Date: 2012-05-12 20:09+0200\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-04-28 13:41+0000\n"
"PO-Revision-Date: 2012-04-30 15:32+0200\n"
"Last-Translator: Luca Ferretti <lferrett@gnome.org>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
#: ../data/gnome-shell.desktop.in.in.h:1
@ -143,42 +144,34 @@ msgid "Keybinding to open the application menu."
msgstr "Associazione di tasti per aprire il menù delle applicazioni."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Keybinding to toggle the screen recorder"
msgstr "Associazione tasti per commutare registrazione schermo"
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Associazione di tasti per avviare/fermare il registratore di schermo incorporato."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Which keyboard to use"
msgstr "Quale tastiera usare"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use."
msgstr "Il tipo di tastiera da usare."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds"
msgstr "Mostra l'ora con i secondi"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time."
msgstr "Se VERO, mostra i secondi nell'orario."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock"
msgstr "Mostra la data nell'orologio"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time."
msgstr "Se VERO, mostra nell'orologio la data, oltre all'orario."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts."
msgstr "Framerate per la registrazione di screencast."
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -186,11 +179,11 @@ msgstr ""
"Il framerate in fotogrammi al secondo dello screencast registrato attraverso "
"il registratore della GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "La pipeline di gstreamer utilizzata per codificare lo screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:30
#: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -216,11 +209,11 @@ msgstr ""
"WEBM usando il codec VP8. %T è usato come un segnaposto per una stima del "
"valore di thread ottimale per il sistema in uso."
#: ../data/org.gnome.shell.gschema.xml.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast"
msgstr "Estensione del file utilizzato per salvare lo screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -270,7 +263,7 @@ msgstr "Non elencato?"
#: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:459
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel"
msgstr "Annulla"
@ -283,31 +276,30 @@ msgstr "Accedi"
msgid "Login Window"
msgstr "Finestra di accesso"
#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:588
#: ../js/ui/userMenu.js:592 ../js/ui/userMenu.js:637
#: ../js/gdm/powerMenu.js:155 ../js/ui/userMenu.js:597
#: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:668
msgid "Suspend"
msgstr "Sospendi"
#: ../js/gdm/powerMenu.js:135
#: ../js/gdm/powerMenu.js:160
msgid "Restart"
msgstr "Riavvia"
#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:590
#: ../js/ui/userMenu.js:592 ../js/ui/userMenu.js:636
#: ../js/gdm/powerMenu.js:165
msgid "Power Off"
msgstr "Spegni"
#: ../js/misc/util.js:93
#: ../js/misc/util.js:92
msgid "Command not found"
msgstr "Comando non trovato"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:124
#: ../js/misc/util.js:119
msgid "Could not parse command:"
msgstr "Impossibile analizzare il comando:"
#: ../js/misc/util.js:132
#: ../js/misc/util.js:127
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Esecuzione di «%s» non riuscita:"
@ -321,19 +313,19 @@ msgstr "Tutte"
msgid "APPLICATIONS"
msgstr "APPLICAZIONI"
#: ../js/ui/appDisplay.js:374
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "IMPOSTAZIONI"
#: ../js/ui/appDisplay.js:679
#: ../js/ui/appDisplay.js:680
msgid "New Window"
msgstr "Nuova finestra"
#: ../js/ui/appDisplay.js:682
#: ../js/ui/appDisplay.js:683
msgid "Remove from Favorites"
msgstr "Rimuovi dai preferiti"
#: ../js/ui/appDisplay.js:683
#: ../js/ui/appDisplay.js:684
msgid "Add to Favorites"
msgstr "Aggiungi ai preferiti"
@ -533,7 +525,7 @@ msgstr "Fuori rete"
msgid "CONTACTS"
msgstr "CONTATTI"
#: ../js/ui/dash.js:239 ../js/ui/messageTray.js:1209
#: ../js/ui/dash.js:229 ../js/ui/messageTray.js:1207
msgid "Remove"
msgstr "Rimuovi"
@ -715,53 +707,53 @@ msgstr "Password:"
msgid "Type again:"
msgstr "Inserire di nuovo:"
#: ../js/ui/lookingGlass.js:693
#: ../js/ui/lookingGlass.js:732
msgid "No extensions installed"
msgstr "Nessuna estensione installata"
#. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:747
#: ../js/ui/lookingGlass.js:786
#, c-format
msgid "%s has not emitted any errors."
msgstr "%s non ha emesso alcun errore."
#: ../js/ui/lookingGlass.js:753
#: ../js/ui/lookingGlass.js:792
msgid "Hide Errors"
msgstr "Nascondi errori"
#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:808
#: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
msgid "Show Errors"
msgstr "Mostra errori"
# (ndt) o abilitata?
#: ../js/ui/lookingGlass.js:766
#: ../js/ui/lookingGlass.js:805
msgid "Enabled"
msgstr "Abilitato"
# (ndt) o disabilitata?
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1082
#: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
msgid "Disabled"
msgstr "Disabilitato"
#: ../js/ui/lookingGlass.js:771
#: ../js/ui/lookingGlass.js:810
msgid "Error"
msgstr "Errore"
#: ../js/ui/lookingGlass.js:773
#: ../js/ui/lookingGlass.js:812
msgid "Out of date"
msgstr "Non aggiornato"
#: ../js/ui/lookingGlass.js:775
#: ../js/ui/lookingGlass.js:814
msgid "Downloading"
msgstr "Scaricamento"
#: ../js/ui/lookingGlass.js:796
#: ../js/ui/lookingGlass.js:835
msgid "View Source"
msgstr "Visualizza sorgente"
#: ../js/ui/lookingGlass.js:802
#: ../js/ui/lookingGlass.js:841
msgid "Web Page"
msgstr "Pagina web"
@ -771,19 +763,19 @@ msgstr "Pagina web"
msgid "Screencast from %d %t"
msgstr "Screencast da %d %t"
#: ../js/ui/messageTray.js:1202
#: ../js/ui/messageTray.js:1200
msgid "Open"
msgstr "Apri"
#: ../js/ui/messageTray.js:1219
#: ../js/ui/messageTray.js:1217
msgid "Unmute"
msgstr "Attiva audio"
#: ../js/ui/messageTray.js:1219
#: ../js/ui/messageTray.js:1217
msgid "Mute"
msgstr "Escludi audio"
#: ../js/ui/messageTray.js:2492
#: ../js/ui/messageTray.js:2490
msgid "System Information"
msgstr "Informazione di sistema"
@ -829,8 +821,8 @@ msgstr "Richiesta autenticazione dalla rete wireless"
#: ../js/ui/networkAgent.js:330
#, c-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"'%s'."
"Passwords or encryption keys are required to access the wireless network '%"
"s'."
msgstr ""
"È richiesta una password o una chiave di cifratura per accedere alla rete "
"wireless «%s»."
@ -948,7 +940,7 @@ msgstr "Errore nell'autenticazione. Provare di nuovo."
#. "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:728
#: ../js/ui/popupMenu.js:724
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@ -956,11 +948,11 @@ msgstr "toggle-switch-us"
msgid "Please enter a command:"
msgstr "Inserire un comando:"
#: ../js/ui/searchDisplay.js:321
#: ../js/ui/searchDisplay.js:332
msgid "Searching..."
msgstr "Ricerca..."
#: ../js/ui/searchDisplay.js:374
#: ../js/ui/searchDisplay.js:415
msgid "No matching results."
msgstr "Nessun risultato corrispondente."
@ -1033,9 +1025,9 @@ msgid "Large Text"
msgstr "Caratteri grandi"
#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/bluetooth.js:338
#: ../js/ui/status/bluetooth.js:368 ../js/ui/status/bluetooth.js:404
#: ../js/ui/status/bluetooth.js:433 ../js/ui/status/network.js:890
#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893
msgid "Bluetooth"
msgstr "Bluetooth"
@ -1063,102 +1055,102 @@ msgstr "hardware disabilitato"
# indica lo stato del device BT, per esempio gli auricolari
# credo sia meglio l'aggettivo che il sostantivo
#: ../js/ui/status/bluetooth.js:200
#: ../js/ui/status/bluetooth.js:203
msgid "Connection"
msgstr "Collegato"
#: ../js/ui/status/bluetooth.js:211 ../js/ui/status/network.js:491
#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491
msgid "disconnecting..."
msgstr "disconnessione..."
#: ../js/ui/status/bluetooth.js:224 ../js/ui/status/network.js:497
#: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:497
msgid "connecting..."
msgstr "connessione..."
#: ../js/ui/status/bluetooth.js:242
#: ../js/ui/status/bluetooth.js:245
msgid "Send Files..."
msgstr "Invia file..."
#: ../js/ui/status/bluetooth.js:247
#: ../js/ui/status/bluetooth.js:250
msgid "Browse Files..."
msgstr "Esplora file..."
#: ../js/ui/status/bluetooth.js:256
#: ../js/ui/status/bluetooth.js:259
msgid "Error browsing device"
msgstr "Errore nell'esplorare il dispositivo"
#: ../js/ui/status/bluetooth.js:257
#: ../js/ui/status/bluetooth.js:260
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Non è possibile esplorare il dispositivo richiesto, l'errore è «%s»"
#: ../js/ui/status/bluetooth.js:265
#: ../js/ui/status/bluetooth.js:268
msgid "Keyboard Settings"
msgstr "Impostazioni tastiera"
#: ../js/ui/status/bluetooth.js:268
#: ../js/ui/status/bluetooth.js:271
msgid "Mouse Settings"
msgstr "Impostazioni mouse"
#: ../js/ui/status/bluetooth.js:273 ../js/ui/status/volume.js:59
#: ../js/ui/status/bluetooth.js:276 ../js/ui/status/volume.js:59
msgid "Sound Settings"
msgstr "Impostazioni audio"
#: ../js/ui/status/bluetooth.js:369
#: ../js/ui/status/bluetooth.js:372
#, c-format
msgid "Authorization request from %s"
msgstr "Richesta autorizzazione da %s"
#: ../js/ui/status/bluetooth.js:375
#: ../js/ui/status/bluetooth.js:378
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Il dispositivo %s vuole accedere al servizio «%s»"
#: ../js/ui/status/bluetooth.js:377
#: ../js/ui/status/bluetooth.js:380
msgid "Always grant access"
msgstr "Accorda sempre l'accesso"
#: ../js/ui/status/bluetooth.js:378
#: ../js/ui/status/bluetooth.js:381
msgid "Grant this time only"
msgstr "Accorda solo stavolta"
#: ../js/ui/status/bluetooth.js:379 ../js/ui/telepathyClient.js:1093
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
msgid "Reject"
msgstr "Rifiuta"
#: ../js/ui/status/bluetooth.js:405
#: ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Conferma associazione per %s"
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:441
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:444
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Il dispositivo %s vuole associarsi con questo computer"
#: ../js/ui/status/bluetooth.js:412
#: ../js/ui/status/bluetooth.js:415
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confermare la corrispondenza del PIN «%s» con quello sul dispositivo."
#: ../js/ui/status/bluetooth.js:414
#: ../js/ui/status/bluetooth.js:417
msgid "Matches"
msgstr "Corrisponde"
#: ../js/ui/status/bluetooth.js:415
#: ../js/ui/status/bluetooth.js:418
msgid "Does not match"
msgstr "Non corrisponde"
#: ../js/ui/status/bluetooth.js:434
#: ../js/ui/status/bluetooth.js:437
#, c-format
msgid "Pairing request for %s"
msgstr "Richiesta di associazione per %s"
#: ../js/ui/status/bluetooth.js:442
#: ../js/ui/status/bluetooth.js:445
msgid "Please enter the PIN mentioned on the device."
msgstr "Inserire il PIN indicato sul dispositivo."
#: ../js/ui/status/bluetooth.js:458
#: ../js/ui/status/bluetooth.js:461
msgid "OK"
msgstr "OK"
@ -1212,13 +1204,13 @@ msgstr "non disponibile"
msgid "connection failed"
msgstr "connessione non riuscita"
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1497
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
msgid "More..."
msgstr "Altro..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1432
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440
msgid "Connected (private)"
msgstr "Connessa (privata)"
@ -1226,69 +1218,69 @@ msgstr "Connessa (privata)"
msgid "Auto Ethernet"
msgstr "Ethernet automatica"
#: ../js/ui/status/network.js:754
#: ../js/ui/status/network.js:757
msgid "Auto broadband"
msgstr "Banda larga automatica"
#: ../js/ui/status/network.js:757
#: ../js/ui/status/network.js:760
msgid "Auto dial-up"
msgstr "Dial-up automatica"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:876 ../js/ui/status/network.js:1444
#: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452
#, c-format
msgid "Auto %s"
msgstr "%s automatica"
#: ../js/ui/status/network.js:878
#: ../js/ui/status/network.js:881
msgid "Auto bluetooth"
msgstr "Bluetooth automatica"
#: ../js/ui/status/network.js:1446
#: ../js/ui/status/network.js:1454
msgid "Auto wireless"
msgstr "Wireless automatica"
#: ../js/ui/status/network.js:1533
#: ../js/ui/status/network.js:1541
msgid "Network"
msgstr "Rete"
#: ../js/ui/status/network.js:1540
#: ../js/ui/status/network.js:1548
msgid "Enable networking"
msgstr "Abilita rete"
#: ../js/ui/status/network.js:1552
#: ../js/ui/status/network.js:1560
msgid "Wired"
msgstr "Via cavo"
#: ../js/ui/status/network.js:1563
#: ../js/ui/status/network.js:1571
msgid "Wireless"
msgstr "Wireless"
#: ../js/ui/status/network.js:1573
#: ../js/ui/status/network.js:1581
msgid "Mobile broadband"
msgstr "Banda larga mobile"
#: ../js/ui/status/network.js:1583
#: ../js/ui/status/network.js:1591
msgid "VPN Connections"
msgstr "Connessioni VPN"
#: ../js/ui/status/network.js:1594
#: ../js/ui/status/network.js:1602
msgid "Network Settings"
msgstr "Impostazioni rete"
#: ../js/ui/status/network.js:1731
#: ../js/ui/status/network.js:1739
msgid "Connection failed"
msgstr "Connessione non riuscita"
#: ../js/ui/status/network.js:1732
#: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed"
msgstr "Attivazione della connessione di rete non riuscita"
#: ../js/ui/status/network.js:1985
#: ../js/ui/status/network.js:1993
msgid "Networking is disabled"
msgstr "Rete disabilitata"
#: ../js/ui/status/network.js:2109
#: ../js/ui/status/network.js:2117
msgid "Network Manager"
msgstr "Gestore reti"
@ -1668,32 +1660,40 @@ msgstr "Inattivo"
msgid "Unavailable"
msgstr "Non disponibile"
#: ../js/ui/userMenu.js:624
#: ../js/ui/userMenu.js:595 ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:669
msgid "Power Off..."
msgstr "Spegni..."
#: ../js/ui/userMenu.js:631
msgid "Notifications"
msgstr "Notifiche"
#: ../js/ui/userMenu.js:632
#: ../js/ui/userMenu.js:639
msgid "Online Accounts"
msgstr "Account online"
#: ../js/ui/userMenu.js:643
msgid "System Settings"
msgstr "Impostazioni di sistema"
#: ../js/ui/userMenu.js:646
#: ../js/ui/userMenu.js:650
msgid "Lock Screen"
msgstr "Blocca schermo"
#: ../js/ui/userMenu.js:655
msgid "Switch User"
msgstr "Cambia utente"
#: ../js/ui/userMenu.js:651
msgid "Log Out"
msgstr "Termina sessione"
#: ../js/ui/userMenu.js:659
msgid "Lock"
msgstr "Blocca"
#: ../js/ui/userMenu.js:660
msgid "Log Out..."
msgstr "Termina sessione..."
# accorciato, altrimenti non si legge...
#: ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:688
msgid "Your chat status will be set to busy"
msgstr "Stato per chat impostato a non disponibile"
#: ../js/ui/userMenu.js:678
#: ../js/ui/userMenu.js:689
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1817,18 +1817,6 @@ msgstr "File system"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Power Off..."
#~ msgstr "Spegni..."
#~ msgid "Online Accounts"
#~ msgstr "Account online"
#~ msgid "Lock Screen"
#~ msgstr "Blocca schermo"
#~ msgid "Log Out..."
#~ msgstr "Termina sessione..."
#~ msgid "RECENT ITEMS"
#~ msgstr "ELEMENTI RECENTI"

View File

@ -6,16 +6,15 @@
# Jiro Matsuzawa <jmatsuzawa@src.gnome.org>, 2011, 2012.
# Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>, 2011, 2012.
# Hideki Yamane <henrich@debian.org>, 2011.
# Takanori MATSUURA <t.matsuu@gmail.com>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-05-10 04:40+0000\n"
"PO-Revision-Date: 2012-05-15 00:48+0900\n"
"Last-Translator: Takanori MATSUURA <t.matsuu@gmail.com>\n"
"POT-Creation-Date: 2012-04-19 21:14+0000\n"
"PO-Revision-Date: 2012-04-21 21:35+0900\n"
"Last-Translator: OKANO Takayoshi <kano@na.rim.or.jp>\n"
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -525,11 +524,11 @@ msgstr "カレンダーを開く"
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:187
msgid "%a %b %e, %R:%S"
msgstr "%B%e日 (%a) %R:%S"
msgstr "%m/%d (%a) %R:%S"
#: ../js/ui/dateMenu.js:188
msgid "%a %b %e, %R"
msgstr "%B%e日 (%a) %R"
msgstr "%m/%d (%a) %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.

278
po/mr.po
View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: mr\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-04-24 15:39+0000\n"
"PO-Revision-Date: 2012-05-10 09:57+0530\n"
"POT-Creation-Date: 2012-03-30 17:59+0000\n"
"PO-Revision-Date: 2012-04-02 11:33+0530\n"
"Last-Translator: Sandeep Shedmake <sshedmak@redhat.com>\n"
"Language-Team: Marathi <fedora-trans-mr@redhat.com>\n"
"MIME-Version: 1.0\n"
@ -47,6 +47,7 @@ msgid ""
msgstr "आंतरिक डिबगिंग व Alt-F2 संवादचा वापर करून निंयत्रणकरीता प्रवेश देतो."
#: ../data/org.gnome.shell.gschema.xml.in.h:3
#| msgid "Uuids of extensions to disable"
msgid "Uuids of extensions to enable"
msgstr "सुरू करण्याजोगी एक्सटेंशन्स्चे Uuids"
@ -58,10 +59,10 @@ msgid ""
"DisableExtension DBus methods on org.gnome.Shell."
msgstr ""
"GNOME शेल एक्सटेंशन्सकडे uuid गुणधर्म असते; हि कि एक्सटेंशन्स् दाखवते ज्यास "
"लोड करणे आवश्यक "
"आहे. लोड करण्याजोगी कोणत्याहि एक्सटेंशला सूचीत असणे आवश्यक आहे. org.gnome."
"Shell वरील "
"EnableExtension व DisableExtension DBus मेथडससह या सूचीत बदल करणे शक्य आहे."
"लोड करणे आवश्यक आहे. "
"लोड करण्याजोगी कोणत्याहि एक्सटेंशला सूचीत असणे आवश्यक आहे. "
"org.gnome.Shell वरील EnableExtension व DisableExtension DBus मेथडससह या सूचीत "
"बदल करणे शक्य आहे."
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Whether to collect stats about applications usage"
@ -109,8 +110,7 @@ msgid ""
"The value here is from the TpConnectionPresenceType enumeration."
msgstr ""
"वापरकर्तातर्फे ठरवलेले शेवटचे IM हाजेरी साठवण्याकरीता आंतरिकपणे वापरले जाते. "
"येथील मूल्य "
"TpConnectionPresenceType एन्युमरेशनपासूनचे आहे."
"येथील मूल्य TpConnectionPresenceType एन्युमरेशनपासूनचे आहे."
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid ""
@ -118,8 +118,8 @@ msgid ""
"value here is from the GsmPresenceStatus enumeration."
msgstr ""
"वापरकर्तातर्फे ठरवलेले शेवटचे सत्र हाजेरी साठवण्याकरीता आंतरिकपणे वापरले जाते."
" येथील मूल्य "
"GsmPresenceStatus एन्युमरेशनपासूनचे आहे."
" "
"येथील मूल्य GsmPresenceStatus एन्युमरेशनपासूनचे आहे."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show the week date in the calendar"
@ -138,44 +138,34 @@ msgid "Keybinding to open the application menu."
msgstr "ॲप्लिकेशन मेन्यु उघडण्यासाठी किबाइंडिंग."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to toggle the screen recorder"
msgstr "स्क्रीन रेकॉर्डरमधील बदलसाठी किबाइंडिंग"
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#| msgid "Keybinding to open the application menu."
msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "बिल्टइन स्क्रीन रेकॉर्डर सुरू किंवा थांबवण्यासाठी किबाइंडिंग."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Which keyboard to use"
msgstr "कुठले किबोर्ड वापरायचे"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The type of keyboard to use."
msgstr "वापरण्याजोगी किबोर्डचे प्रकार."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Show time with seconds"
msgstr "सेकंदात वेळ दाखवा"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "If true, display seconds in time."
msgstr "खरे असल्यास, वेळेत सेकंद दाखवा."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Show date in clock"
msgstr "घड्याळात दिनांक दाखवा"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "If true, display date in the clock, in addition to time."
msgstr "खरे असल्यास,वेळेबरोबर तारीख पण घड्याळात दाखवा."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Framerate used for recording screencasts."
msgstr "स्क्रिनकास्ट्स् रेकॉर्ड करण्यासाठी वापरलेले फ्रेमरेट."
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -184,12 +174,24 @@ msgstr ""
"केलेल्या परिणामक "
"सक्रीनकास्टचा फ्रेमरेट."
#: ../data/org.gnome.shell.gschema.xml.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "स्क्रीनकास्ट एंकोड करण्यासाठी वापरलेले gstreamer पाइपलाइन"
#: ../data/org.gnome.shell.gschema.xml.in.h:30
#: ../data/org.gnome.shell.gschema.xml.in.h:28
#, no-c-format
#| msgid ""
#| "Sets the GStreamer pipeline used to encode recordings. It follows the "
#| "syntax used for gst-launch. The pipeline should have an unconnected sink "
#| "pad where the recorded video is recorded. It will normally have a "
#| "unconnected source pad; output from that pad will be written into the "
#| "output file. However the pipeline can also take care of its own output - "
#| "this might be used to send the output to an icecast server via shout2send "
#| "or similar. When unset or set to an empty value, the default pipeline "
#| "will be used. This is currently 'videorate ! vp8enc quality=10 speed=2 "
#| "threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T "
#| "is used as a placeholder for a guess at the optimal thread count on the "
#| "system."
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
"used for gst-launch. The pipeline should have an unconnected sink pad where "
@ -203,26 +205,21 @@ msgid ""
"thread count on the system."
msgstr ""
"रेकॉर्डिंग्स् एंकोड करण्यासाठी GStreamer पाइपलाइन ठरवतो. gst-launch सुरू "
"करण्यासाठी "
"मांडणीचा वापर करतो. पाइपलाइनमध्ये जोडणी अशक्य सिंक पॅड असायला हवे जेथे "
"रेकॉर्डेड व्हिडीओ "
"रेकॉर्ड केले जाते. सहसा जोडणी अशक्य स्रोत पॅड असते; पॅडपासूनचे आऊटपुट, आऊटपुट "
"फाइलमध्ये लिहले "
"जाते. तरी पाइपलाइन स्वतःच्या आऊटपुटची काळजी घेतो - याचा वापर shout2send किंवा "
"समानतर्फे icecast सर्व्हरकरीता आऊटपुट पाठवण्याकरीता केला जातो. रिकामे "
"मूल्यकरीता सेट "
"अशक्य किंवा शक्य केल्यावर, मूळ पाइपलाइनचा वापर केला जातो. हे सध्या 'vp8enc "
"quality=8 "
"speed=6 threads=%T ! queue ! webmmux' आहे व VP8 कोडेकचा वापर करून WEBM करीता "
"रेकॉर्डिंग करतो. %T चा वापर प्रणालीवरील कमाल थ्रेड गणणा ओळखण्यासाठी "
"प्लेसहोल्डर म्हणून "
"केला जातो."
"करण्यासाठी मांडणीचा वापर करतो. पाइपलाइनमध्ये जोडणी अशक्य सिंक पॅड असायला हवे "
"जेथे रेकॉर्डेड व्हिडीओ रेकॉर्ड केले जाते. सहसा जोडणी अशक्य स्रोत पॅड असते; "
"पॅडपासूनचे आऊटपुट, आऊटपुट फाइलमध्ये लिहले जाते. तरी पाइपलाइन स्वतःच्या "
"आऊटपुटची काळजी घेतो - याचा वापर shout2send किंवा समानतर्फे icecast "
"सर्व्हरकरीता आऊटपुट पाठवण्याकरीता केला जातो. रिकामे मूल्यकरीता सेट अशक्य "
"किंवा शक्य केल्यावर, मूळ पाइपलाइनचा वापर केला जातो. हे सध्या 'vp8enc "
"quality=8 speed=6 threads=%T ! queue ! webmmux' आहे व VP8 कोडेकचा वापर करून "
"WEBM करीता रेकॉर्डिंग करतो. %T चा वापर प्रणालीवरील कमाल थ्रेड गणणा "
"ओळखण्यासाठी प्लेसहोल्डर म्हणून केला जातो."
#: ../data/org.gnome.shell.gschema.xml.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.h:29
msgid "File extension used for storing the screencast"
msgstr "स्क्रिनकास्ट साठवण्याकरीता वापरलेले फाइल एक्सटेंशन"
#: ../data/org.gnome.shell.gschema.xml.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.h:30
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -246,40 +243,42 @@ msgstr "<b>एक्सटेंशन</b>"
msgid "Select an extension to configure using the combobox above."
msgstr "वरील कॉम्बोबॉक्सचा वापर करून संरचनाकरीता एक्सटेंशनचा वापर करा."
#: ../js/gdm/loginDialog.js:627
#: ../js/gdm/loginDialog.js:624
#| msgid "Searching..."
msgid "Session..."
msgstr "सत्र..."
#: ../js/gdm/loginDialog.js:789
#: ../js/gdm/loginDialog.js:786
msgctxt "title"
msgid "Sign In"
msgstr "प्रवेश करा"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:834
#: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)"
msgstr "(किंवा बोट फिरवा)"
#. 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:855
#: ../js/gdm/loginDialog.js:852
msgid "Not listed?"
msgstr "सूचीत नाही?"
#: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:401
#: ../js/ui/extensionSystem.js:399 ../js/ui/networkAgent.js:153
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel"
msgstr "रद्द करा"
#: ../js/gdm/loginDialog.js:1028
#: ../js/gdm/loginDialog.js:1025
msgctxt "button"
msgid "Sign In"
msgstr "प्रवेश करा"
#: ../js/gdm/loginDialog.js:1380
#: ../js/gdm/loginDialog.js:1377
#| msgid "New Window"
msgid "Login Window"
msgstr "प्रवेश पटल"
@ -356,6 +355,7 @@ msgid "Open with %s"
msgstr "%s सह उघडा"
#: ../js/ui/autorunManager.js:586
#| msgid "Reject"
msgid "Eject"
msgstr "बाहेर काढा"
@ -591,11 +591,13 @@ msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:61
#, c-format
#| msgid "Log Out %s"
msgctxt "title"
msgid "Log Out %s"
msgstr "%s पासून बाहेर पडा"
#: ../js/ui/endSessionDialog.js:62
#| msgid "Log Out"
msgctxt "title"
msgid "Log Out"
msgstr "बाहेर पडा"
@ -607,6 +609,7 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:65
#, c-format
#| msgid "%s will be logged out automatically in %d seconds."
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 सेकंदात बाहेर पडेल."
@ -614,6 +617,7 @@ msgstr[1] "%s स्वयं, %d सेकंदात बाहेर पड
#: ../js/ui/endSessionDialog.js:70
#, c-format
#| msgid "You will be logged out automatically in %d seconds."
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "%d सेकंदात तुम्ही स्वयं बाहेर पडाल."
@ -624,11 +628,13 @@ msgid "Logging out of the system."
msgstr "प्रणालीतून बाहेर पडत आहे."
#: ../js/ui/endSessionDialog.js:76
#| msgid "Log Out"
msgctxt "button"
msgid "Log Out"
msgstr "बाहेर पडा"
#: ../js/ui/endSessionDialog.js:81
#| msgid "Power Off"
msgctxt "title"
msgid "Power Off"
msgstr "बंद करा"
@ -639,6 +645,7 @@ msgstr "ॲप्लिकेशन्स् बंद करण्यासा
#: ../js/ui/endSessionDialog.js:84
#, c-format
#| msgid "The system will power off automatically in %d seconds."
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "प्रणाली स्वयं %d सेकंदात बंद होईल."
@ -649,16 +656,19 @@ msgid "Powering off the system."
msgstr "प्रणाली बंद करत आहे."
#: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107
#| msgid "Restart"
msgctxt "button"
msgid "Restart"
msgstr "पुनः सुरू करा"
#: ../js/ui/endSessionDialog.js:92
#| msgid "Power Off"
msgctxt "button"
msgid "Power Off"
msgstr "बंद करा"
#: ../js/ui/endSessionDialog.js:98
#| msgid "Restart"
msgctxt "title"
msgid "Restart"
msgstr "पुनः सुरू करा"
@ -670,6 +680,7 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:101
#, c-format
#| msgid "The system will restart automatically in %d seconds."
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "प्रणाली स्वयं %d सेकंदात पुनः सुरू होईल."
@ -679,21 +690,21 @@ msgstr[1] "प्रणाली स्वयं %d सेकंदामध्
msgid "Restarting the system."
msgstr "प्रणाली पुनःसुरू करत आहे."
#: ../js/ui/extensionSystem.js:404
#: ../js/ui/extensionSystem.js:403
msgid "Install"
msgstr "प्रतिष्ठापीत करा"
#: ../js/ui/extensionSystem.js:408
#: ../js/ui/extensionSystem.js:407
#, c-format
msgid "Download and install '%s' from extensions.gnome.org?"
msgstr " extensions.gnome.org पासून '%s' डाऊनलोड व प्रतिष्ठापीत करा?"
#: ../js/ui/keyboard.js:327
#| msgid "Retry"
msgid "tray"
msgstr "ट्रे"
#: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
#: ../js/ui/status/power.js:203
#: ../js/ui/keyboard.js:544 ../js/ui/status/power.js:203
msgid "Keyboard"
msgstr "कळफलक"
@ -716,10 +727,12 @@ msgid "%s has not emitted any errors."
msgstr "%s ने कोणत्याहि त्रुटी दाखवले नाही."
#: ../js/ui/lookingGlass.js:792
#| msgid "Error"
msgid "Hide Errors"
msgstr "त्रुटी लपवा"
#: ../js/ui/lookingGlass.js:796 ../js/ui/lookingGlass.js:847
#| msgid "Error"
msgid "Show Errors"
msgstr "त्रुटी दाखवा"
@ -729,7 +742,7 @@ msgstr "सुरू केले"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
#: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
msgid "Disabled"
msgstr "बंद केले"
@ -754,7 +767,7 @@ msgid "Web Page"
msgstr "वेब पृष्ठ"
#. Translators: this is a filename used for screencast recording
#: ../js/ui/main.js:121
#: ../js/ui/main.js:118
#, no-c-format
msgid "Screencast from %d %t"
msgstr "%d %t पासून स्क्रीनकास्ट"
@ -764,18 +777,22 @@ msgid "Open"
msgstr "उघडा"
#: ../js/ui/messageTray.js:1217
#| msgid "minute"
#| msgid_plural "minutes"
msgid "Unmute"
msgstr "ंद करणे अशक्य करा"
msgstr "ंद करणे अशक्य करा"
#: ../js/ui/messageTray.js:1217
#| msgid "Mouse"
msgid "Mute"
msgstr "ंद करा"
msgstr "ंद करा"
#: ../js/ui/messageTray.js:2490
msgid "System Information"
msgstr "प्रणाली माहिती"
#: ../js/ui/networkAgent.js:148
#| msgid "Connection"
msgid "Connect"
msgstr "जोडणी करा"
@ -783,6 +800,7 @@ msgstr "जोडणी करा"
#: ../js/ui/networkAgent.js:243 ../js/ui/networkAgent.js:255
#: ../js/ui/networkAgent.js:282 ../js/ui/networkAgent.js:302
#: ../js/ui/networkAgent.js:312
#| msgid "Password:"
msgid "Password: "
msgstr "पासवर्ड: "
@ -811,6 +829,7 @@ msgid "Service: "
msgstr "सर्व्हिस: "
#: ../js/ui/networkAgent.js:329
#| msgid "Authentication Required"
msgid "Authentication required by wireless network"
msgstr "वायरलेस नेटवर्कतर्फे आवश्यक ओळखपटवणे"
@ -826,10 +845,12 @@ msgid "Wired 802.1X authentication"
msgstr "वायर्ड 802.1X ओळखपटवणे"
#: ../js/ui/networkAgent.js:336
#| msgid "Network Manager"
msgid "Network name: "
msgstr "नेटवर्क नाव: "
#: ../js/ui/networkAgent.js:341
#| msgid "authentication required"
msgid "DSL authentication"
msgstr "DSL ओळख पटवणे"
@ -846,11 +867,13 @@ msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/networkAgent.js:356
#| msgid "Mobile broadband"
msgid "Mobile broadband network password"
msgstr "मोबाईल ब्रॉडबँड नेटवर्क पासवर्ड"
#: ../js/ui/networkAgent.js:357
#, c-format
#| msgid "You're now connected to '%s'"
msgid "A password is required to connect to '%s'."
msgstr "'%s' सह जोडणीकरीता पासवर्ड आवश्यक आहे."
@ -877,6 +900,7 @@ msgid "Dash"
msgstr "डॅश"
#: ../js/ui/panel.js:592
#| msgid "Quit %s"
msgid "Quit"
msgstr "बाहेर पडा"
@ -944,7 +968,7 @@ msgstr "कृपया आदेश द्या:"
msgid "Searching..."
msgstr "शोधत आहे..."
#: ../js/ui/searchDisplay.js:415
#: ../js/ui/searchDisplay.js:414
msgid "No matching results."
msgstr "जुळवण्याजोगी परिणाम आढळले नाही."
@ -961,6 +985,7 @@ msgid "Show Text"
msgstr "मजकूर दाखवा"
#: ../js/ui/shellEntry.js:79
#| msgid "Large Text"
msgid "Hide Text"
msgstr "मजकूर लपवा"
@ -969,6 +994,7 @@ msgid "Wrong password, please try again"
msgstr "चुकिचा पासवर्ड, कृपया पुनः प्रयत्न करा"
#: ../js/ui/status/accessibility.js:47
#| msgid "Visibility"
msgid "Accessibility"
msgstr "ॲक्सेसिबिलिटि"
@ -980,6 +1006,7 @@ msgstr "झूम"
#. 'screen-reader-enabled');
#. this.menu.addMenuItem(screenReader);
#: ../js/ui/status/accessibility.js:63
#| msgid "Keyboard"
msgid "Screen Keyboard"
msgstr "स्क्रीन किबोर्ड"
@ -1031,6 +1058,7 @@ msgid "Send Files to Device..."
msgstr "फाइल्स्ना साधनावर पाठवा..."
#: ../js/ui/status/bluetooth.js:63
#| msgid "Setup a New Device..."
msgid "Set up a New Device..."
msgstr "नविन साधनची मांडणी करा..."
@ -1040,6 +1068,7 @@ msgstr "ब्ल्यूटूथ सेटिंग्स्"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/network.js:256
#| msgid "disabled"
msgid "hardware disabled"
msgstr "हार्डवेअर बंद केले"
@ -1048,6 +1077,7 @@ msgid "Connection"
msgstr "जोडणी"
#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491
#| msgid "connecting..."
msgid "disconnecting..."
msgstr "जोडणी खंडीत करत आहे..."
@ -1102,7 +1132,7 @@ msgstr "नेहमी प्रवेश द्या"
msgid "Grant this time only"
msgstr "फक्त याचवेळी मान्य करा"
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1091
msgid "Reject"
msgstr "नकारा"
@ -1143,10 +1173,12 @@ msgid "OK"
msgstr "ठीक आहे"
#: ../js/ui/status/keyboard.js:68
#| msgid "Show Keyboard Layout..."
msgid "Show Keyboard Layout"
msgstr "किबोर्ड लेआऊट दाखवा"
#: ../js/ui/status/keyboard.js:73
#| msgid "Date and Time Settings"
msgid "Region and Language Settings"
msgstr "क्षेत्र व भाषा सेटिंग्स्"
@ -1228,6 +1260,7 @@ msgid "Auto wireless"
msgstr "स्वयं वायरलेस्"
#: ../js/ui/status/network.js:1541
#| msgid "Network Manager"
msgid "Network"
msgstr "नेटवर्क"
@ -1256,10 +1289,12 @@ msgid "Network Settings"
msgstr "जाळं संयोजना"
#: ../js/ui/status/network.js:1739
#| msgid "connection failed"
msgid "Connection failed"
msgstr "जोडणी अपयशी"
#: ../js/ui/status/network.js:1740
#| msgid "connection failed"
msgid "Activation of network connection failed"
msgstr "नेटवर्क जोडणी सुरू करणे अपयशी"
@ -1380,6 +1415,7 @@ msgstr "आमंत्रण"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:271
#| msgid "Cancel"
msgid "Call"
msgstr "कॉल"
@ -1389,10 +1425,12 @@ msgid "File Transfer"
msgstr "फाइल स्थानांतरन"
#: ../js/ui/telepathyClient.js:369
#| msgid "Authorization request from %s"
msgid "Subscription request"
msgstr "सबस्क्रिप्शन विनंती"
#: ../js/ui/telepathyClient.js:405
#| msgid "Connection"
msgid "Connection error"
msgstr "जोडणी त्रुटी"
@ -1419,35 +1457,36 @@ msgstr "%s व्यग्र आहे."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:889
#: ../js/ui/telepathyClient.js:887
#, no-c-format
#| msgid "Sent at %X on %A"
msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "<b>%X</b> वेळी, <b>%A</b> ला पाठवले"
#. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:895
#: ../js/ui/telepathyClient.js:893
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "<b>%A</b> वेळी, <b>%B %d</b> ला पाठवले"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:900
#: ../js/ui/telepathyClient.js:898
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "<b>%A</b>, <b>%B %d</b>, %Y वेळी पाठवले"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/telepathyClient.js:942
#: ../js/ui/telepathyClient.js:940
#, c-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/telepathyClient.js:1044
#: ../js/ui/telepathyClient.js:1042
#, c-format
msgid "Invitation to %s"
msgstr "%s करीता आमंत्रण"
@ -1455,35 +1494,35 @@ 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/telepathyClient.js:1052
#: ../js/ui/telepathyClient.js:1050
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s तुम्हाला %s सह जोडणीकरीता आमंत्रण देत आहे"
#: ../js/ui/telepathyClient.js:1054 ../js/ui/telepathyClient.js:1133
#: ../js/ui/telepathyClient.js:1231
#: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131
#: ../js/ui/telepathyClient.js:1229
msgid "Decline"
msgstr "नकारा"
#: ../js/ui/telepathyClient.js:1055 ../js/ui/telepathyClient.js:1134
#: ../js/ui/telepathyClient.js:1232
#: ../js/ui/telepathyClient.js:1053 ../js/ui/telepathyClient.js:1132
#: ../js/ui/telepathyClient.js:1230
msgid "Accept"
msgstr "स्वीकारा"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1085
#: ../js/ui/telepathyClient.js:1083
#, c-format
msgid "Video call from %s"
msgstr "%s पासून व्हिडीओ कॉल्स्"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1088
#: ../js/ui/telepathyClient.js:1086
#, c-format
msgid "Call from %s"
msgstr "%s पासून कॉल"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1095
#: ../js/ui/telepathyClient.js:1093
msgid "Answer"
msgstr "उत्तर"
@ -1492,138 +1531,147 @@ msgstr "उत्तर"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/telepathyClient.js:1127
#: ../js/ui/telepathyClient.js:1125
#, c-format
msgid "%s is sending you %s"
msgstr "%s तुम्हाला %s पाठवत आहे"
#. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1196
#: ../js/ui/telepathyClient.js:1194
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "ऑनलाइन असल्यावर %s परवानगी दृष्यास्पद करायची"
#: ../js/ui/telepathyClient.js:1289
#: ../js/ui/telepathyClient.js:1287
#| msgid "Network Manager"
msgid "Network error"
msgstr "नेटवर्क त्रुटी"
#: ../js/ui/telepathyClient.js:1291
#: ../js/ui/telepathyClient.js:1289
#| msgid "Authentication Required"
msgid "Authentication failed"
msgstr "ओळख पटवणे अपयशी"
#: ../js/ui/telepathyClient.js:1293
#: ../js/ui/telepathyClient.js:1291
msgid "Encryption error"
msgstr "एंक्रिप्शन त्रुटी"
#: ../js/ui/telepathyClient.js:1295
#: ../js/ui/telepathyClient.js:1293
msgid "Certificate not provided"
msgstr "प्रमाणपत्र पुरवले नाही"
#: ../js/ui/telepathyClient.js:1297
#: ../js/ui/telepathyClient.js:1295
msgid "Certificate untrusted"
msgstr "प्रमाणपत्र अविश्वासर्ह आहे"
#: ../js/ui/telepathyClient.js:1299
#: ../js/ui/telepathyClient.js:1297
msgid "Certificate expired"
msgstr "प्रमाणपत्राची वेळसमाप्ति"
#: ../js/ui/telepathyClient.js:1301
#: ../js/ui/telepathyClient.js:1299
msgid "Certificate not activated"
msgstr "प्रमाणपत्र सुरू केले नाही"
#: ../js/ui/telepathyClient.js:1303
#: ../js/ui/telepathyClient.js:1301
msgid "Certificate hostname mismatch"
msgstr "प्रमाणपत्र यजमाननाव जुळत नाही"
#: ../js/ui/telepathyClient.js:1305
#: ../js/ui/telepathyClient.js:1303
msgid "Certificate fingerprint mismatch"
msgstr "प्रमाणपत्र फिंग्ररप्रिंट जुळत नाही"
#: ../js/ui/telepathyClient.js:1307
#: ../js/ui/telepathyClient.js:1305
msgid "Certificate self-signed"
msgstr "प्रमाणपत्र स्वयं स्वाक्षरि"
#: ../js/ui/telepathyClient.js:1309
#: ../js/ui/telepathyClient.js:1307
#| msgid "%s is offline."
msgid "Status is set to offline"
msgstr "स्थिती ऑफलाइनकरीता ठरवली आहे"
#: ../js/ui/telepathyClient.js:1311
#: ../js/ui/telepathyClient.js:1309
msgid "Encryption is not available"
msgstr "एंक्रिप्शन अनुपलब्ध"
#: ../js/ui/telepathyClient.js:1313
#: ../js/ui/telepathyClient.js:1311
msgid "Certificate is invalid"
msgstr "प्रमाणपत्र अवैध आहे"
#: ../js/ui/telepathyClient.js:1315
#: ../js/ui/telepathyClient.js:1313
#| msgid "Connection established"
msgid "Connection has been refused"
msgstr "जोडणी नकारली गेली"
#: ../js/ui/telepathyClient.js:1317
#: ../js/ui/telepathyClient.js:1315
#| msgid "Connection established"
msgid "Connection can't be established"
msgstr "जोडणी स्थापीत करणे अशक्य"
#: ../js/ui/telepathyClient.js:1319
#: ../js/ui/telepathyClient.js:1317
#| msgid "Connection established"
msgid "Connection has been lost"
msgstr "जोडणी खंडीत झाली"
#: ../js/ui/telepathyClient.js:1321
#: ../js/ui/telepathyClient.js:1319
msgid "This account is already connected to the server"
msgstr "हे खाते आधिपासूनच सर्व्हरसह जुळले आहे"
#: ../js/ui/telepathyClient.js:1323
#: ../js/ui/telepathyClient.js:1321
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr "समान स्रोतचा वापर करून जोडणीला नविन जोडणीसह बदलाबदल केले आहे"
#: ../js/ui/telepathyClient.js:1325
#: ../js/ui/telepathyClient.js:1323
msgid "The account already exists on the server"
msgstr "खाते आधिपासूनच सर्व्हरवर अस्तित्वात आहे"
#: ../js/ui/telepathyClient.js:1327
#: ../js/ui/telepathyClient.js:1325
msgid "Server is currently too busy to handle the connection"
msgstr "जोडणी हाताळण्यासाठी सर्व्हर सध्या खूप व्यस्थ आहे"
#: ../js/ui/telepathyClient.js:1329
#: ../js/ui/telepathyClient.js:1327
msgid "Certificate has been revoked"
msgstr "प्रमाणपत्र रद्द केले"
#: ../js/ui/telepathyClient.js:1331
#: ../js/ui/telepathyClient.js:1329
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"प्रमाणपत्र असुरक्षित सिफर अल्गोरिदमचा वापर करते किंवा क्रिप्टोग्राफिकरित्या "
"खूप कमजोर आहे"
#: ../js/ui/telepathyClient.js:1333
#: ../js/ui/telepathyClient.js:1331
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
msgstr ""
"सर्व्हर प्रमाणपत्राची लांबी, किंवा सर्व्हर प्रमाणपत्र चैनचे गांभीर्य, "
"क्रिप्टोग्राफि "
"लाइब्ररितर्फे लादलेल्या मर्यादापेक्षा जास्त आहे"
"क्रिप्टोग्राफि लाइब्ररितर्फे लादलेल्या मर्यादापेक्षा जास्त आहे"
#: ../js/ui/telepathyClient.js:1335
#: ../js/ui/telepathyClient.js:1333
msgid "Internal error"
msgstr "आंतरिक त्रुटी"
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1345
#: ../js/ui/telepathyClient.js:1343
#, c-format
#| msgid "connection failed"
msgid "Connection to %s failed"
msgstr "%s सह जोडणी अपयशी"
#: ../js/ui/telepathyClient.js:1354
#: ../js/ui/telepathyClient.js:1352
#| msgid "Reject"
msgid "Reconnect"
msgstr "पुनःजोडणी करा"
#: ../js/ui/telepathyClient.js:1355
#: ../js/ui/telepathyClient.js:1353
#| msgid "My Account"
msgid "Edit account"
msgstr "खाते संपादित करा"
#: ../js/ui/telepathyClient.js:1401
#: ../js/ui/telepathyClient.js:1399
#| msgid "Unknown"
msgid "Unknown reason"
msgstr "अपरिचीत कारण"
@ -1636,6 +1684,7 @@ msgid "Idle"
msgstr "रिकामे"
#: ../js/ui/userMenu.js:144
#| msgid "unavailable"
msgid "Unavailable"
msgstr "अनुपलब्ध"
@ -1644,10 +1693,12 @@ msgid "Power Off..."
msgstr "बंद करा..."
#: ../js/ui/userMenu.js:631
#| msgid "Applications"
msgid "Notifications"
msgstr "सूचना"
#: ../js/ui/userMenu.js:639
#| msgid "My Account"
msgid "Online Accounts"
msgstr "ऑनलाइन खाते"
@ -1677,8 +1728,7 @@ msgid ""
"has been adjusted to let others know that you might not see their messages."
msgstr ""
"सूचना आता बंद केले आहे, चॅट संदेश समाविष्टीत. इतरांना तुमचे संदेश दिसणार नाही "
"हे कळवण्यासाठी "
"ऑनलाइन स्थिती सुस्थीत केली आहे."
"हे कळवण्यासाठी ऑनलाइन स्थिती सुस्थीत केली आहे."
#. Translators: this is the text displayed
#. in the search entry when no search is
@ -1717,7 +1767,7 @@ msgstr "'%s' सज्ज आहे"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1089
#: ../src/gvc/gvc-mixer-control.c:1100
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -1726,14 +1776,14 @@ msgstr[1] "%u आऊटपुट"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1099
#: ../src/gvc/gvc-mixer-control.c:1110
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u इंपुट"
msgstr[1] "%u इंपुट"
#: ../src/gvc/gvc-mixer-control.c:1397
#: ../src/gvc/gvc-mixer-control.c:1408
msgid "System Sounds"
msgstr "प्रणाली आवाज"
@ -1751,6 +1801,7 @@ msgid "Failed to launch '%s'"
msgstr "'%s' सुरू करण्यास अपयशी"
#: ../src/shell-keyring-prompt.c:708
#| msgid "Does not match"
msgid "Passwords do not match."
msgstr "पासवर्डस् जुळत नाही."
@ -1773,6 +1824,7 @@ msgstr "ओळख पटवा संवाद वापरकर्त्या
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-util.c:97
#| msgid "Volume"
msgid "Home"
msgstr "होम"

View File

@ -114,7 +114,6 @@ shell_public_headers_h = \
shell-gtk-embed.h \
shell-global.h \
shell-idle-monitor.h \
shell-invert-lightness-effect.h \
shell-mobile-providers.h \
shell-mount-operation.h \
shell-network-agent.h \
@ -162,7 +161,6 @@ libgnome_shell_la_SOURCES = \
shell-gtk-embed.c \
shell-global.c \
shell-idle-monitor.c \
shell-invert-lightness-effect.c \
shell-keyring-prompt.h \
shell-keyring-prompt.c \
shell-mobile-providers.c \

View File

@ -1,214 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2010-2012 Inclusive Design Research Centre, OCAD University.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that 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 library. If not, see <http://www.gnu.org/licenses/>.
*
* Author:
* Joseph Scheuhammer <clown@alum.mit.edu>
*/
/**
* SECTION:shell-invert-lightness-effect
* @short_description: A colorization effect where lightness is inverted but
* color is not.
* @see_also: #ClutterEffect, #ClutterOffscreenEffect
*
* #ShellInvertLightnessEffect is a sub-class of #ClutterEffect that enhances
* the appearance of a clutter actor. Specifically it inverts the lightness
* of a #ClutterActor (e.g., darker colors become lighter, white becomes black,
* and white, black).
*/
#define SHELL_INVERT_LIGHTNESS_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT, ShellInvertLightnessEffectClass))
#define SHELL_IS_INVERT_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT))
#define SHELL_INVERT_LIGHTNESS_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_INVERT_LIGHTNESS_EFFEC, ShellInvertLightnessEffectClass))
#define CLUTTER_ENABLE_EXPERIMENTAL_API
#include "shell-invert-lightness-effect.h"
#include <cogl/cogl.h>
struct _ShellInvertLightnessEffect
{
ClutterOffscreenEffect parent_instance;
gint tex_width;
gint tex_height;
CoglPipeline *pipeline;
};
struct _ShellInvertLightnessEffectClass
{
ClutterOffscreenEffectClass parent_class;
CoglPipeline *base_pipeline;
};
/* Lightness inversion in GLSL.
*/
static const gchar *invert_lightness_source =
"cogl_texel = texture2D (cogl_sampler, cogl_tex_coord.st);\n"
"vec3 effect = vec3 (cogl_texel);\n"
"\n"
"float maxColor = max (cogl_texel.r, max (cogl_texel.g, cogl_texel.b));\n"
"float minColor = min (cogl_texel.r, min (cogl_texel.g, cogl_texel.b));\n"
"float lightness = (maxColor + minColor) / 2.0;\n"
"\n"
"float delta = (1.0 - lightness) - lightness;\n"
"effect.rgb = (effect.rgb + delta);\n"
"\n"
"cogl_texel = vec4 (effect, cogl_texel.a);\n";
G_DEFINE_TYPE (ShellInvertLightnessEffect,
shell_invert_lightness_effect,
CLUTTER_TYPE_OFFSCREEN_EFFECT);
static gboolean
shell_invert_lightness_effect_pre_paint (ClutterEffect *effect)
{
ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect);
ClutterEffectClass *parent_class;
if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (effect)))
return FALSE;
if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
{
/* if we don't have support for GLSL shaders then we
* forcibly disable the ActorMeta
*/
g_warning ("Unable to use the ShellInvertLightnessEffect: the "
"graphics hardware or the current GL driver does not "
"implement support for the GLSL shading language.");
clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (self), FALSE);
return FALSE;
}
parent_class =
CLUTTER_EFFECT_CLASS (shell_invert_lightness_effect_parent_class);
if (parent_class->pre_paint (effect))
{
ClutterOffscreenEffect *offscreen_effect =
CLUTTER_OFFSCREEN_EFFECT (effect);
CoglHandle texture;
texture = clutter_offscreen_effect_get_texture (offscreen_effect);
self->tex_width = cogl_texture_get_width (texture);
self->tex_height = cogl_texture_get_height (texture);
cogl_pipeline_set_layer_texture (self->pipeline, 0, texture);
return TRUE;
}
else
return FALSE;
}
static void
shell_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect)
{
ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect);
ClutterActor *actor;
guint8 paint_opacity;
actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect));
paint_opacity = clutter_actor_get_paint_opacity (actor);
cogl_pipeline_set_color4ub (self->pipeline,
paint_opacity,
paint_opacity,
paint_opacity,
paint_opacity);
cogl_push_source (self->pipeline);
cogl_rectangle (0, 0, self->tex_width, self->tex_height);
cogl_pop_source ();
}
static void
shell_invert_lightness_effect_dispose (GObject *gobject)
{
ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (gobject);
if (self->pipeline != NULL)
{
cogl_object_unref (self->pipeline);
self->pipeline = NULL;
}
G_OBJECT_CLASS (shell_invert_lightness_effect_parent_class)->dispose (gobject);
}
static void
shell_invert_lightness_effect_class_init (ShellInvertLightnessEffectClass *klass)
{
ClutterEffectClass *effect_class = CLUTTER_EFFECT_CLASS (klass);
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
ClutterOffscreenEffectClass *offscreen_class;
offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass);
offscreen_class->paint_target = shell_invert_lightness_effect_paint_target;
effect_class->pre_paint = shell_invert_lightness_effect_pre_paint;
gobject_class->dispose = shell_invert_lightness_effect_dispose;
}
static void
shell_invert_lightness_effect_init (ShellInvertLightnessEffect *self)
{
ShellInvertLightnessEffectClass *klass;
klass = SHELL_INVERT_LIGHTNESS_EFFECT_GET_CLASS (self);
if (G_UNLIKELY (klass->base_pipeline == NULL))
{
CoglSnippet *snippet;
CoglContext *ctx =
clutter_backend_get_cogl_context (clutter_get_default_backend ());
klass->base_pipeline = cogl_pipeline_new (ctx);
snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_TEXTURE_LOOKUP,
NULL,
NULL);
cogl_snippet_set_replace (snippet, invert_lightness_source);
cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet);
cogl_object_unref (snippet);
cogl_pipeline_set_layer_null_texture (klass->base_pipeline,
0, /* layer number */
COGL_TEXTURE_TYPE_2D);
}
self->pipeline = cogl_pipeline_copy (klass->base_pipeline);
}
/**
* shell_invert_lightness_effect_new:
*
* Creates a new #ShellInvertLightnessEffect to be used with
* clutter_actor_add_effect()
*
* Return value: (transfer full): the newly created
* #ShellInvertLightnessEffect or %NULL. Use g_object_unref() when done.
*/
ClutterEffect *
shell_invert_lightness_effect_new (void)
{
return g_object_new (SHELL_TYPE_INVERT_LIGHTNESS_EFFECT, NULL);
}

View File

@ -1,42 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright © 2010-2012 Inclusive Design Research Centre, OCAD University.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that 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 library. If not, see <http://www.gnu.org/licenses/>.
*
* Author:
* Joseph Scheuhammer <clown@alum.mit.edu>
*/
#ifndef __SHELL_INVERT_LIGHTNESS_EFFECT_H__
#define __SHELL_INVERT_LIGHTNESS_EFFECT_H__
#define COGL_ENABLE_EXPERIMENTAL_API
#include <clutter/clutter.h>
G_BEGIN_DECLS
#define SHELL_TYPE_INVERT_LIGHTNESS_EFFECT (shell_invert_lightness_effect_get_type ())
#define SHELL_INVERT_LIGHTNESS_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT, ShellInvertLightnessEffect))
#define SHELL_IS_INVERT_LIGHTNESS_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT))
typedef struct _ShellInvertLightnessEffect ShellInvertLightnessEffect;
typedef struct _ShellInvertLightnessEffectClass ShellInvertLightnessEffectClass;
GType shell_invert_lightness_effect_get_type (void) G_GNUC_CONST;
ClutterEffect *shell_invert_lightness_effect_new (void);
G_END_DECLS
#endif /* __SHELL_INVERT_LIGHTNESS_EFFECT_H__ */

View File

@ -76,26 +76,6 @@ shell_agent_request_free (gpointer data)
g_slice_free (ShellAgentRequest, request);
}
static void
shell_agent_request_cancel (ShellAgentRequest *request)
{
GError *error;
ShellNetworkAgent *self;
self = request->self;
error = g_error_new (NM_SECRET_AGENT_ERROR,
NM_SECRET_AGENT_ERROR_AGENT_CANCELED,
"Canceled by NetworkManager");
request->callback (NM_SECRET_AGENT (self), request->connection,
NULL, error, request->callback_data);
g_signal_emit (self, signals[SIGNAL_CANCEL_REQUEST], 0, request->request_id);
g_hash_table_remove (self->priv->requests, request->request_id);
g_error_free (error);
}
static void
shell_network_agent_init (ShellNetworkAgent *agent)
{
@ -361,17 +341,6 @@ shell_network_agent_get_secrets (NMSecretAgent *agent,
ShellAgentRequest *request;
NMSettingConnection *setting_connection;
const char *connection_type;
char *request_id;
request_id = g_strdup_printf ("%s/%s", connection_path, setting_name);
if ((request = g_hash_table_lookup (self->priv->requests, request_id)) != NULL)
{
/* We already have a request pending for this (connection, setting)
* Cancel it before starting the new one.
* This will also free the request structure and associated resources.
*/
shell_agent_request_cancel (request);
}
setting_connection = nm_connection_get_setting_connection (connection);
connection_type = nm_setting_connection_get_connection_type (setting_connection);
@ -402,7 +371,7 @@ shell_network_agent_get_secrets (NMSecretAgent *agent,
else
request->vpn_entries = NULL;
request->request_id = request_id;
request->request_id = g_strdup_printf ("%s/%s", connection_path, setting_name);
g_hash_table_replace (self->priv->requests, request->request_id, request);
if ((flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW) ||
@ -521,22 +490,30 @@ shell_network_agent_cancel_get_secrets (NMSecretAgent *agent,
{
ShellNetworkAgent *self = SHELL_NETWORK_AGENT (agent);
ShellNetworkAgentPrivate *priv = self->priv;
gchar *request_id;
ShellAgentRequest *request;
request_id = g_strdup_printf ("%s/%s", connection_path, setting_name);
request = g_hash_table_lookup (priv->requests, request_id);
g_free (request_id);
gchar *request_id = g_strdup_printf ("%s/%s", connection_path, setting_name);
ShellAgentRequest *request = g_hash_table_lookup (priv->requests, request_id);
GError *error;
if (!request)
{
/* We've already sent the result, but the caller cancelled the
* operation before receiving that result.
*/
g_free (request_id);
return;
}
shell_agent_request_cancel (request);
error = g_error_new (NM_SECRET_AGENT_ERROR,
NM_SECRET_AGENT_ERROR_AGENT_CANCELED,
"Canceled by NetworkManager");
request->callback (agent, request->connection, NULL, error, request->callback_data);
g_signal_emit (self, signals[SIGNAL_CANCEL_REQUEST], 0, request_id);
g_hash_table_remove (priv->requests, request_id);
g_free (request_id);
g_error_free (error);
}
/************************* saving of secrets ****************************************/