Compare commits

..

1 Commits

Author SHA1 Message Date
Matthias Clasen
b0362945f4 data: Stop providing an Access portal backend
A portal review by the design team has concluded that
it is better to have all portals as application-modal
GTK dialogs, instead of mixing them with some system-modal
shell dialogs.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1994
2020-01-20 17:48:31 +01:00
73 changed files with 6768 additions and 9603 deletions

View File

@@ -1,15 +0,0 @@
<node>
<interface name="org.freedesktop.impl.portal.Access">
<method name="AccessDialog">
<arg type="o" name="handle" direction="in"/>
<arg type="s" name="app_id" direction="in"/>
<arg type="s" name="parent_window" direction="in"/>
<arg type="s" name="title" direction="in"/>
<arg type="s" name="subtitle" direction="in"/>
<arg type="s" name="body" direction="in"/>
<arg type="a{sv}" name="options" direction="in"/>
<arg type="u" name="response" direction="out"/>
<arg type="a{sv}" name="results" direction="out"/>
</method>
</interface>
</node>

View File

@@ -9,7 +9,6 @@
<file preprocess="xml-stripblanks">org.freedesktop.DBus.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.DBus.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Agent.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Agent.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Manager.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Manager.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Access.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.PermissionStore.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.impl.portal.PermissionStore.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Request.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Request.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.login1.Manager.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.login1.Manager.xml</file>

View File

@@ -1,4 +0,0 @@
[portal]
DBusName=org.freedesktop.impl.portal.desktop.gnome
Interfaces=org.freedesktop.impl.portal.Access
UseIn=gnome

View File

@@ -72,7 +72,6 @@ configure_file(
) )
install_data('gnome-shell.portal', install_dir: portaldir)
install_data('50-gnome-shell-system.xml', install_dir: keysdir) install_data('50-gnome-shell-system.xml', install_dir: keysdir)

View File

@@ -13,6 +13,7 @@
@import 'widgets/corner-ripple'; @import 'widgets/corner-ripple';
@import 'widgets/dash'; @import 'widgets/dash';
@import 'widgets/dialogs'; @import 'widgets/dialogs';
@import 'widgets/end-session-dialog';
@import 'widgets/entries'; @import 'widgets/entries';
@import 'widgets/hotplug'; @import 'widgets/hotplug';
@import 'widgets/ibus-popup'; @import 'widgets/ibus-popup';

View File

@@ -86,44 +86,15 @@ $app_grid_fg_color: #fff;
} }
// expanded folder // expanded folder
.app-folder-dialog { .app-folder-popup {
border-radius: 8px; -arrow-border-radius: 8px;
spacing: 24px; -arrow-background-color: transparentize(darken($osd_bg_color,10%), 0.5);
background-color: transparentize(darken($osd_bg_color,10%), 0.05); -arrow-base: 24px;
-arrow-rise: 11px;
& .folder-name-container {
padding: 12px 18px;
spacing: 12px;
& .folder-name-label,
& .folder-name-entry {
font-size: 18pt;
font-weight: bold;
}
& .folder-name-entry { width: 300px }
/* FIXME: this is to keep the label in sync with the entry */
& .folder-name-label { padding: 5px 7px }
& .edit-folder-button {
@extend %button;
padding: 0;
width: 36px;
height: 36px;
border-radius: 18px;
& > StIcon { icon-size: 16px }
}
}
}
.app-folder-dialog-container {
padding: 12px;
width: 800px;
height: 600px;
} }
.app-folder-popup-bin { padding: $base_padding - 1px; }
.app-folder-icon { .app-folder-icon {
padding: $base_padding; padding: $base_padding;
spacing-rows: $base_spacing; spacing-rows: $base_spacing;

View File

@@ -1,7 +1,5 @@
/* Date/Time Menu */ /* Date/Time Menu */
.clock-display-box { spacing: $base_spacing; }
// overall menu // overall menu
#calendarArea { #calendarArea {
padding:0; padding:0;

View File

@@ -42,6 +42,7 @@ $dash_border_radius: $modal_radius * 1.5;
border:none; border:none;
box-shadow:0 0 0 1px $osd_outer_borders_color; box-shadow:0 0 0 1px $osd_outer_borders_color;
color: $osd_fg_color; color: $osd_fg_color;
margin-top: $base_margin + 4px;
padding: $base_padding $base_padding + 2px; padding: $base_padding $base_padding + 2px;
text-align: center; text-align: center;
-x-offset: $base_margin * 2; // distance from the dash edge -x-offset: $base_margin * 2; // distance from the dash edge

View File

@@ -19,17 +19,6 @@
@include fontsize($base_font_size + 3); @include fontsize($base_font_size + 3);
} }
/* End Session Dialog */
.end-session-dialog {
width: 30em;
.end-session-dialog-battery-warning,
.dialog-list-title {
color: $warning_color;
}
}
/* Message Dialog */ /* Message Dialog */
.message-dialog-content { .message-dialog-content {
spacing: 18px; spacing: 18px;
@@ -69,18 +58,80 @@
/* Run Dialog */ /* Run Dialog */
.run-dialog { .run-dialog {
.modal-dialog-content-box { .run-dialog-entry { width: 20em; margin-bottom: 6px; }
margin-top: 24px; .run-dialog-error-box {
margin-bottom: 14px; padding-top: 16px;
spacing: 6px;
} }
.run-dialog-entry { width: 20em; }
.run-dialog-description { .run-dialog-label {
@include fontsize($base_font_size - 1); @include fontsize($base_font_size + 1.1);
text-align: center; font-weight: normal;
color: darken($fg_color, 20%); color: $fg_color;
padding-bottom: .4em;
} }
} }
/* ShellMountOperation Dialogs */
.shell-mount-operation-icon {
icon-size: $base_icon_size * 3;
}
.mount-dialog {
spacing: 24px;
.message-dialog-title {
padding-top: 10px;
padding-left: 17px;
padding-bottom: 6px;
max-width: 34em;
}
.message-dialog-title:rtl {
padding-left: 0px;
padding-right: 17px;
}
.message-dialog-description {
padding-left: 17px;
width: 28em;
}
.message-dialog-description:rtl {
padding-left: 0px;
padding-right: 17px;
}
}
.mount-dialog-app-list {
max-height: 200px;
padding-top: 24px;
padding-left: 49px;
padding-right: 32px;
}
.mount-dialog-app-list:rtl {
padding-right: 49px;
padding-left: 32px;
}
.mount-dialog-app-list-item {
color: lighten($fg_color,10%);
&:hover { color: $fg_color; }
&:ltr { padding-right: 1em; }
&:rtl { padding-left: 1em; }
}
.mount-dialog-app-list-item-icon {
&:ltr { padding-right: 17px; }
&:rtl { padding-left: 17px; }
}
.mount-dialog-app-list-item-name {
@include fontsize($base_font_size - 1);
}
/* Password or Authentication Dialog */ /* Password or Authentication Dialog */
.prompt-dialog { .prompt-dialog {
@@ -133,6 +184,11 @@
padding: 8px; padding: 8px;
} }
.prompt-dialog-caps-lock-warning {
@extend .prompt-dialog-error-label;
padding-left: 6.2em;
}
/* Polkit Dialog */ /* Polkit Dialog */
@@ -158,8 +214,21 @@
/* Audio selection dialog */ /* Audio selection dialog */
.audio-device-selection-dialog { .audio-device-selection-dialog {
.modal-dialog-content-box { margin-bottom: 28px; } spacing: 30px;
.audio-selection-box { spacing: 20px; } }
.audio-selection-content {
spacing: 20px;
padding: 24px;
}
.audio-selection-title {
font-weight: bold;
text-align: center;
}
.audio-selection-box {
spacing: 20px;
} }
.audio-selection-device { .audio-selection-device {
@@ -186,6 +255,21 @@
spacing: 30px; spacing: 30px;
} }
/* Geolocation Dialog */
.geolocation-dialog {
spacing: 30px;
}
/* Extension Dialog */
.extension-dialog {
.message-dialog-title { font-weight: normal; color: $fg_color; }
}
/* Inhibit-Shortcuts Dialog */
.inhibit-shortcuts-dialog {
spacing: 30px;
}
/* Network Agent Dialog */ /* Network Agent Dialog */
.network-dialog-secret-table { .network-dialog-secret-table {

View File

@@ -0,0 +1,12 @@
/* End Session Dialog */
$end_session_dialog_width: 28em;
.end-session-dialog-battery-warning {
width: $end_session_dialog_width;
color: $warning_color;
}
.end-session-dialog .dialog-list-title {
color: $warning_color;
}

View File

@@ -2,7 +2,7 @@
StEntry { StEntry {
border-radius: $base_border_radius; border-radius: $base_border_radius;
padding: 8px; padding: 4px;
border-width: 1px; border-width: 1px;
color: $fg_color; color: $fg_color;
@include entry(normal); @include entry(normal);
@@ -20,8 +20,4 @@ StEntry {
icon-size: $base_icon_size; icon-size: $base_icon_size;
padding: 0 4px; padding: 0 4px;
} }
StLabel.hint-text {
margin-left: 2px;
color: transparentize($fg_color, 0.3);
}
} }

View File

@@ -24,10 +24,9 @@
&:rtl {padding:0;} &:rtl {padding:0;}
} }
// do-not-disturb + clear button // clear button
.message-list-controls { .message-list-clear-button.button {
margin: $base_margin $base_margin*2; margin:$base_margin $base_margin*2;
spacing: $base_spacing;
} }
// message bubbles // message bubbles
@@ -84,7 +83,7 @@
} }
// fallback // fallback
> .fallback-app-icon { > .fallback-window-icon {
width: $base_icon_size; width: $base_icon_size;
height: $base_icon_size; height: $base_icon_size;
} }

View File

@@ -57,11 +57,3 @@
// Hidden // Hidden
.hidden { color: rgba(0,0,0,0);} .hidden { color: rgba(0,0,0,0);}
// Caps-lock warning
.caps-lock-warning-label {
padding-bottom: 8px;
padding-left: 6.2em;
@include fontsize($base_font_size - 1);
color: $warning_color;
}

View File

@@ -14,6 +14,7 @@ theme_sources = files([
'gnome-shell-sass/widgets/_corner-ripple.scss', 'gnome-shell-sass/widgets/_corner-ripple.scss',
'gnome-shell-sass/widgets/_dash.scss', 'gnome-shell-sass/widgets/_dash.scss',
'gnome-shell-sass/widgets/_dialogs.scss', 'gnome-shell-sass/widgets/_dialogs.scss',
'gnome-shell-sass/widgets/_end-session-dialog.scss',
'gnome-shell-sass/widgets/_entries.scss', 'gnome-shell-sass/widgets/_entries.scss',
'gnome-shell-sass/widgets/_hotplug.scss', 'gnome-shell-sass/widgets/_hotplug.scss',
'gnome-shell-sass/widgets/_ibus-popup.scss', 'gnome-shell-sass/widgets/_ibus-popup.scss',

View File

@@ -32,7 +32,6 @@
<file>perf/core.js</file> <file>perf/core.js</file>
<file>perf/hwtest.js</file> <file>perf/hwtest.js</file>
<file>ui/accessDialog.js</file>
<file>ui/altTab.js</file> <file>ui/altTab.js</file>
<file>ui/animation.js</file> <file>ui/animation.js</file>
<file>ui/appDisplay.js</file> <file>ui/appDisplay.js</file>

View File

@@ -31,15 +31,7 @@ var ExtensionState = {
UNINSTALLED: 99, UNINSTALLED: 99,
}; };
const SERIALIZED_PROPERTIES = [ const SERIALIZED_PROPERTIES = ['type', 'state', 'path', 'error', 'hasPrefs', 'canChange'];
'type',
'state',
'path',
'error',
'hasPrefs',
'hasUpdate',
'canChange',
];
/** /**
* getCurrentExtension: * getCurrentExtension:

View File

@@ -125,10 +125,11 @@ const SystemActions = GObject.registerClass({
available: false, available: false,
}); });
this._actions.set(LOCK_ORIENTATION_ACTION_ID, { this._actions.set(LOCK_ORIENTATION_ACTION_ID, {
name: '', // Translators: The name of the lock orientation action in search
name: C_("search-result", "Lock Orientation"),
iconName: '', iconName: '',
// Translators: A list of keywords that match the lock orientation action, separated by semicolons // Translators: A list of keywords that match the lock orientation action, separated by semicolons
keywords: _("lock orientation;unlock orientation;screen;rotation").split(/[; ]/), keywords: _("lock orientation;screen;rotation").split(/[; ]/),
available: false, available: false,
}); });
@@ -166,10 +167,11 @@ const SystemActions = GObject.registerClass({
this.forceUpdate(); this.forceUpdate();
this._orientationSettings.connect('changed::orientation-lock', () => { this._orientationSettings.connect('changed::orientation-lock',
this._updateOrientationLock(); () => {
this._updateOrientationLockStatus(); this._updateOrientationLock();
}); this._updateOrientationLockIcon();
});
Main.layoutManager.connect('monitors-changed', Main.layoutManager.connect('monitors-changed',
() => this._updateOrientationLock()); () => this._updateOrientationLock());
this._sensorProxy = new SensorProxy(Gio.DBus.system, this._sensorProxy = new SensorProxy(Gio.DBus.system,
@@ -188,7 +190,7 @@ const SystemActions = GObject.registerClass({
this._updateOrientationLock(); this._updateOrientationLock();
}); });
this._updateOrientationLock(); this._updateOrientationLock();
this._updateOrientationLockStatus(); this._updateOrientationLockIcon();
Main.sessionMode.connect('updated', () => this._sessionUpdated()); Main.sessionMode.connect('updated', () => this._sessionUpdated());
this._sessionUpdated(); this._sessionUpdated();
@@ -241,21 +243,12 @@ const SystemActions = GObject.registerClass({
this.notify('can-lock-orientation'); this.notify('can-lock-orientation');
} }
_updateOrientationLockStatus() { _updateOrientationLockIcon() {
let locked = this._orientationSettings.get_boolean('orientation-lock'); let locked = this._orientationSettings.get_boolean('orientation-lock');
let action = this._actions.get(LOCK_ORIENTATION_ACTION_ID);
// Translators: The name of the lock orientation action in search
// and in the system status menu
let name = locked
? C_('search-result', 'Unlock Screen Rotation')
: C_('search-result', 'Lock Screen Rotation');
let iconName = locked let iconName = locked
? 'rotation-locked-symbolic' ? 'rotation-locked-symbolic'
: 'rotation-allowed-symbolic'; : 'rotation-allowed-symbolic';
this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName = iconName;
action.name = name;
action.iconName = iconName;
this.notify('orientation-lock-icon'); this.notify('orientation-lock-icon');
} }

View File

@@ -1,156 +0,0 @@
/* exported AccessDialogDBus */
const { Clutter, Gio, GLib, GObject, Shell, St } = imports.gi;
const CheckBox = imports.ui.checkBox;
const Dialog = imports.ui.dialog;
const ModalDialog = imports.ui.modalDialog;
const { loadInterfaceXML } = imports.misc.fileUtils;
const RequestIface = loadInterfaceXML('org.freedesktop.impl.portal.Request');
const AccessIface = loadInterfaceXML('org.freedesktop.impl.portal.Access');
var DialogResponse = {
OK: 0,
CANCEL: 1,
CLOSED: 2,
};
var AccessDialog = GObject.registerClass(
class AccessDialog extends ModalDialog.ModalDialog {
_init(invocation, handle, title, description, body, options) {
super._init({ styleClass: 'access-dialog' });
this._invocation = invocation;
this._handle = handle;
this._requestExported = false;
this._request = Gio.DBusExportedObject.wrapJSObject(RequestIface, this);
for (let option in options)
options[option] = options[option].deep_unpack();
this._buildLayout(title, description, body, options);
}
_buildLayout(title, description, body, options) {
// No support for non-modal system dialogs, so ignore the option
// let modal = options['modal'] || true;
let denyLabel = options['deny_label'] || _("Deny Access");
let grantLabel = options['grant_label'] || _("Grant Access");
let choices = options['choices'] || [];
let content = new Dialog.MessageDialogContent({ title, description });
this.contentLayout.add_actor(content);
this._choices = new Map();
for (let i = 0; i < choices.length; i++) {
let [id, name, opts, selected] = choices[i];
if (opts.length > 0)
continue; // radio buttons, not implemented
let check = new CheckBox.CheckBox();
check.getLabelActor().text = name;
check.checked = selected == "true";
content.add_child(check);
this._choices.set(id, check);
}
let bodyLabel = new St.Label({
text: body,
x_align: Clutter.ActorAlign.CENTER,
});
content.add_child(bodyLabel);
this.addButton({ label: denyLabel,
action: () => {
this._sendResponse(DialogResponse.CANCEL);
},
key: Clutter.KEY_Escape });
this.addButton({ label: grantLabel,
action: () => {
this._sendResponse(DialogResponse.OK);
} });
}
open() {
super.open();
let connection = this._invocation.get_connection();
this._requestExported = this._request.export(connection, this._handle);
}
CloseAsync(invocation, _params) {
if (this._invocation.get_sender() != invocation.get_sender()) {
invocation.return_error_literal(Gio.DBusError,
Gio.DBusError.ACCESS_DENIED,
'');
return;
}
this._sendResponse(DialogResponse.CLOSED);
}
_sendResponse(response) {
if (this._requestExported)
this._request.unexport();
this._requestExported = false;
let results = {};
if (response == DialogResponse.OK) {
for (let [id, check] of this._choices) {
let checked = check.checked ? 'true' : 'false';
results[id] = new GLib.Variant('s', checked);
}
}
// Delay actual response until the end of the close animation (if any)
this.connect('closed', () => {
this._invocation.return_value(new GLib.Variant('(ua{sv})',
[response, results]));
});
this.close();
}
});
var AccessDialogDBus = class {
constructor() {
this._accessDialog = null;
this._windowTracker = Shell.WindowTracker.get_default();
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AccessIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop');
Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', Gio.BusNameOwnerFlags.REPLACE, null, null);
}
AccessDialogAsync(params, invocation) {
if (this._accessDialog) {
invocation.return_error_literal(Gio.DBusError,
Gio.DBusError.LIMITS_EXCEEDED,
'Already showing a system access dialog');
return;
}
let [handle, appId, parentWindow_, title, description, body, options] = params;
// We probably want to use parentWindow and global.display.focus_window
// for this check in the future
if (appId && `${appId}.desktop` != this._windowTracker.focus_app.id) {
invocation.return_error_literal(Gio.DBusError,
Gio.DBusError.ACCESS_DENIED,
'Only the focused app is allowed to show a system access dialog');
return;
}
let dialog = new AccessDialog(
invocation, handle, title, description, body, options);
dialog.open();
dialog.connect('closed', () => (this._accessDialog = null));
this._accessDialog = dialog;
}
};

View File

@@ -12,22 +12,14 @@ var SPINNER_ANIMATION_DELAY = 1000;
var Animation = GObject.registerClass( var Animation = GObject.registerClass(
class Animation extends St.Bin { class Animation extends St.Bin {
_init(file, width, height, speed) { _init(file, width, height, speed) {
const themeContext = St.ThemeContext.get_for_stage(global.stage); super._init({ width, height });
super._init({
width: width * themeContext.scale_factor,
height: height * themeContext.scale_factor,
});
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this.connect('resource-scale-changed', this.connect('resource-scale-changed',
this._loadFile.bind(this, file, width, height)); this._loadFile.bind(this, file, width, height));
let themeContext = St.ThemeContext.get_for_stage(global.stage);
this._scaleChangedId = themeContext.connect('notify::scale-factor', this._scaleChangedId = themeContext.connect('notify::scale-factor',
() => { this._loadFile.bind(this, file, width, height));
this._loadFile(file, width, height);
this.set_size(width * themeContext.scale_factor, height * themeContext.scale_factor);
});
this._speed = speed; this._speed = speed;

View File

@@ -5,6 +5,7 @@ const { Clutter, Gio, GLib, GObject, Graphene, Meta, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const AppFavorites = imports.ui.appFavorites; const AppFavorites = imports.ui.appFavorites;
const BoxPointer = imports.ui.boxpointer;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const GrabHelper = imports.ui.grabHelper; const GrabHelper = imports.ui.grabHelper;
const IconGrid = imports.ui.iconGrid; const IconGrid = imports.ui.iconGrid;
@@ -40,8 +41,6 @@ var PAGE_SWITCH_TIME = 250;
var APP_ICON_SCALE_IN_TIME = 500; var APP_ICON_SCALE_IN_TIME = 500;
var APP_ICON_SCALE_IN_DELAY = 700; var APP_ICON_SCALE_IN_DELAY = 700;
const FOLDER_DIALOG_ANIMATION_TIME = 200;
const OVERSHOOT_THRESHOLD = 20; const OVERSHOOT_THRESHOLD = 20;
const OVERSHOOT_TIMEOUT = 1000; const OVERSHOOT_TIMEOUT = 1000;
@@ -298,6 +297,7 @@ var BaseAppView = GObject.registerClass({
}); });
var AllView = GObject.registerClass({ var AllView = GObject.registerClass({
Signals: { 'space-ready': {} },
}, class AllView extends BaseAppView { }, class AllView extends BaseAppView {
_init() { _init() {
super._init({ super._init({
@@ -364,19 +364,19 @@ var AllView = GObject.registerClass({
this._clickAction = new Clutter.ClickAction(); this._clickAction = new Clutter.ClickAction();
this._clickAction.connect('clicked', () => { this._clickAction.connect('clicked', () => {
if (!this._currentDialog) if (!this._currentPopup)
return; return;
let [x, y] = this._clickAction.get_coords(); let [x, y] = this._clickAction.get_coords();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); let actor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
if (!this._currentDialog.contains(actor)) if (!this._currentPopup.contains(actor))
this._currentDialog.popdown(); this._currentPopup.popdown();
}); });
this._eventBlocker.add_action(this._clickAction); this._eventBlocker.add_action(this._clickAction);
this._currentDialog = null; this._currentPopup = null;
this._displayingDialog = false; this._displayingPopup = false;
this._currentDialogDestroyId = 0; this._currentPopupDestroyId = 0;
this._canScroll = true; // limiting scrolling speed this._canScroll = true; // limiting scrolling speed
this._scrollTimeoutId = 0; this._scrollTimeoutId = 0;
@@ -388,6 +388,16 @@ var AllView = GObject.registerClass({
this._lastOvershootTimeoutId = 0; this._lastOvershootTimeoutId = 0;
Main.overview.connect('hidden', () => this.goToPage(0)); Main.overview.connect('hidden', () => this.goToPage(0));
this._grid.connect('space-opened', () => {
let fadeEffect = this._scrollView.get_effect('fade');
if (fadeEffect)
fadeEffect.enabled = false;
this.emit('space-ready');
});
this._grid.connect('space-closed', () => {
this._displayingPopup = false;
});
this._redisplayWorkId = Main.initializeDeferredWork(this, this._redisplay.bind(this)); this._redisplayWorkId = Main.initializeDeferredWork(this, this._redisplay.bind(this));
@@ -537,8 +547,8 @@ var AllView = GObject.registerClass({
}; };
if (animationDirection == IconGrid.AnimationDirection.OUT && if (animationDirection == IconGrid.AnimationDirection.OUT &&
this._displayingDialog && this._currentDialog) { this._displayingPopup && this._currentPopup) {
this._currentDialog.popdown(); this._currentPopup.popdown();
let spaceClosedId = this._grid.connect('space-closed', () => { let spaceClosedId = this._grid.connect('space-closed', () => {
this._grid.disconnect(spaceClosedId); this._grid.disconnect(spaceClosedId);
super.animate(animationDirection, completionFunc); super.animate(animationDirection, completionFunc);
@@ -553,9 +563,9 @@ var AllView = GObject.registerClass({
animateSwitch(animationDirection) { animateSwitch(animationDirection) {
super.animateSwitch(animationDirection); super.animateSwitch(animationDirection);
if (this._currentDialog && this._displayingDialog && if (this._currentPopup && this._displayingPopup &&
animationDirection == IconGrid.AnimationDirection.OUT) { animationDirection == IconGrid.AnimationDirection.OUT) {
this._currentDialog.ease({ this._currentPopup.ease({
opacity: 0, opacity: 0,
duration: VIEWS_SWITCH_TIME, duration: VIEWS_SWITCH_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD, mode: Clutter.AnimationMode.EASE_OUT_QUAD,
@@ -567,15 +577,17 @@ var AllView = GObject.registerClass({
this._pageIndicators.animateIndicators(animationDirection); this._pageIndicators.animateIndicators(animationDirection);
} }
getCurrentPageY() {
return this._grid.getPageY(this._grid.currentPage);
}
goToPage(pageNumber, animate = true) { goToPage(pageNumber, animate = true) {
pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1); pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
if (this._grid.currentPage === pageNumber && if (this._grid.currentPage == pageNumber && this._displayingPopup && this._currentPopup)
this._displayingDialog &&
this._currentDialog)
return; return;
if (this._displayingDialog && this._currentDialog) if (this._displayingPopup && this._currentPopup)
this._currentDialog.popdown(); this._currentPopup.popdown();
if (!this.mapped) { if (!this.mapped) {
this._adjustment.value = this._grid.getPageY(pageNumber); this._adjustment.value = this._grid.getPageY(pageNumber);
@@ -596,8 +608,24 @@ var AllView = GObject.registerClass({
}); });
} }
openSpaceForPopup(item, side, nRows) {
this._updateIconOpacities(true);
this._displayingPopup = true;
this._grid.openExtraSpace(item, side, nRows);
}
_closeSpaceForPopup() {
this._updateIconOpacities(false);
let fadeEffect = this._scrollView.get_effect('fade');
if (fadeEffect)
fadeEffect.enabled = true;
this._grid.closeExtraSpace();
}
_onScroll(actor, event) { _onScroll(actor, event) {
if (this._displayingDialog || !this._scrollView.reactive) if (this._displayingPopup || !this._scrollView.reactive)
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
if (this._swipeTracker.canHandleScrollEvent(event)) if (this._swipeTracker.canHandleScrollEvent(event))
@@ -659,7 +687,7 @@ var AllView = GObject.registerClass({
} }
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
if (this._displayingDialog) if (this._displayingPopup)
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
if (event.get_key_symbol() === Clutter.KEY_Page_Up) { if (event.get_key_symbol() === Clutter.KEY_Page_Up) {
@@ -673,34 +701,29 @@ var AllView = GObject.registerClass({
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
addFolderDialog(dialog) { addFolderPopup(popup) {
this.add_child(dialog); this._stack.add_actor(popup);
dialog.connect('open-state-changed', (o, isOpen) => { popup.connect('open-state-changed', (o, isOpen) => {
this._eventBlocker.visible = isOpen; this._eventBlocker.visible = isOpen;
if (this._currentDialog) { if (this._currentPopup) {
this._currentDialog.disconnect(this._currentDialogDestroyId); this._currentPopup.disconnect(this._currentPopupDestroyId);
this._currentDialogDestroyId = 0; this._currentPopupDestroyId = 0;
} }
this._currentDialog = null; this._currentPopup = null;
if (isOpen) { if (isOpen) {
this._currentDialog = dialog; this._currentPopup = popup;
this._currentDialogDestroyId = dialog.connect('destroy', () => { this._currentPopupDestroyId = popup.connect('destroy', () => {
this._currentDialog = null; this._currentPopup = null;
this._currentDialogDestroyId = 0; this._currentPopupDestroyId = 0;
this._eventBlocker.visible = false; this._eventBlocker.visible = false;
}); });
} }
this._updateIconOpacities(isOpen); this._updateIconOpacities(isOpen);
if (!isOpen)
// Toggle search entry this._closeSpaceForPopup();
Main.overview.searchEntry.reactive = !isOpen;
Main.overview.searchEntry.clutter_text.reactive = !isOpen;
Main.overview.searchEntry.clutter_text.editable = !isOpen;
this._displayingPopup = isOpen;
}); });
} }
@@ -759,6 +782,9 @@ var AllView = GObject.registerClass({
this._availWidth = availWidth; this._availWidth = availWidth;
this._availHeight = availHeight; this._availHeight = availHeight;
// Update folder views
for (let i = 0; i < this._folderIcons.length; i++)
this._folderIcons[i].adaptToSize(availWidth, availHeight);
} }
_resetOvershoot() { _resetOvershoot() {
@@ -845,7 +871,7 @@ var AllView = GObject.registerClass({
this._dragMonitor = null; this._dragMonitor = null;
} }
this._eventBlocker.visible = this._currentDialog !== null; this._eventBlocker.visible = this._currentPopup !== null;
this._resetOvershoot(); this._resetOvershoot();
} }
@@ -874,8 +900,8 @@ var AllView = GObject.registerClass({
let view = _getViewFromIcon(source); let view = _getViewFromIcon(source);
view.removeApp(source.app); view.removeApp(source.app);
if (this._currentDialog) if (this._currentPopup)
this._currentDialog.popdown(); this._currentPopup.popdown();
return true; return true;
} }
@@ -1289,8 +1315,6 @@ class FolderView extends BaseAppView {
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
x_expand: true, x_expand: true,
y_expand: true, y_expand: true,
}, {
minRows: 1,
}); });
// If it not expand, the parent doesn't take into account its preferred_width when allocating // If it not expand, the parent doesn't take into account its preferred_width when allocating
@@ -1380,10 +1404,44 @@ class FolderView extends BaseAppView {
this._scrollView.update_fade_effect(fadeOffset, 0); this._scrollView.update_fade_effect(fadeOffset, 0);
// Set extra padding to avoid popup or close button being cut off // Set extra padding to avoid popup or close button being cut off
this._grid.topPadding = Math.max(this._grid.topPadding, 0); this._grid.topPadding = Math.max(this._grid.topPadding - this._offsetForEachSide, 0);
this._grid.bottomPadding = Math.max(this._grid.bottomPadding, 0); this._grid.bottomPadding = Math.max(this._grid.bottomPadding - this._offsetForEachSide, 0);
this._grid.leftPadding = Math.max(this._grid.leftPadding, 0); this._grid.leftPadding = Math.max(this._grid.leftPadding - this._offsetForEachSide, 0);
this._grid.rightPadding = Math.max(this._grid.rightPadding, 0); this._grid.rightPadding = Math.max(this._grid.rightPadding - this._offsetForEachSide, 0);
this.set_width(this.usedWidth());
this.set_height(this.usedHeight());
}
_getPageAvailableSize() {
let pageBox = new Clutter.ActorBox();
pageBox.x1 = pageBox.y1 = 0;
pageBox.x2 = this._parentAvailableWidth;
pageBox.y2 = this._parentAvailableHeight;
let contentBox = this.get_theme_node().get_content_box(pageBox);
// We only can show icons inside the collection view boxPointer
// so we have to subtract the required padding etc of the boxpointer
return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide];
}
usedWidth() {
let [availWidthPerPage] = this._getPageAvailableSize();
return this._grid.usedWidth(availWidthPerPage);
}
usedHeight() {
return this._grid.usedHeightForNRows(this.nRowsDisplayedAtOnce());
}
nRowsDisplayedAtOnce() {
let [availWidthPerPage, availHeightPerPage] = this._getPageAvailableSize();
let maxRows = this._grid.rowsForHeight(availHeightPerPage) - 1;
return Math.min(this._grid.nRows(availWidthPerPage), maxRows);
}
setPaddingOffsets(offset) {
this._offsetForEachSide = offset;
} }
_loadApps() { _loadApps() {
@@ -1482,6 +1540,8 @@ var FolderIcon = GObject.registerClass({
this._folder = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders.folder', this._folder = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders.folder',
path }); path });
this._delegate = this; this._delegate = this;
// whether we need to update arrow side, position etc.
this._popupInvalidated = false;
this.icon = new IconGrid.BaseIcon('', { this.icon = new IconGrid.BaseIcon('', {
createIcon: this._createIcon.bind(this), createIcon: this._createIcon.bind(this),
@@ -1497,6 +1557,10 @@ var FolderIcon = GObject.registerClass({
this._itemDragEndId = Main.overview.connect( this._itemDragEndId = Main.overview.connect(
'item-drag-end', this._onDragEnd.bind(this)); 'item-drag-end', this._onDragEnd.bind(this));
this._popupTimeoutId = 0;
this.connect('popup-menu', this._popupRenamePopup.bind(this));
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this._folder.connect('changed', this._redisplay.bind(this)); this._folder.connect('changed', this._redisplay.bind(this));
@@ -1514,8 +1578,10 @@ var FolderIcon = GObject.registerClass({
this._spaceReadySignalId = 0; this._spaceReadySignalId = 0;
} }
if (this._dialog) if (this._popup)
this._dialog.destroy(); this._popup.destroy();
this._removeMenuTimeout();
} }
vfunc_clicked() { vfunc_clicked() {
@@ -1525,14 +1591,15 @@ var FolderIcon = GObject.registerClass({
vfunc_unmap() { vfunc_unmap() {
super.vfunc_unmap(); super.vfunc_unmap();
if (this._dialog) if (this._popup)
this._dialog.popdown(); this._popup.popdown();
} }
open() { open() {
this._ensureFolderDialog(); this._removeMenuTimeout();
this._ensurePopup();
this.view._scrollView.vscroll.adjustment.value = 0; this.view._scrollView.vscroll.adjustment.value = 0;
this._dialog.popup(); this._openSpaceForPopup();
} }
getAppIds() { getAppIds() {
@@ -1626,59 +1693,293 @@ var FolderIcon = GObject.registerClass({
return this.view.createFolderIcon(iconSize, this); return this.view.createFolderIcon(iconSize, this);
} }
_ensureFolderDialog() { _popupHeight() {
if (this._dialog) let usedHeight = this.view.usedHeight() + this._popup.getOffset(St.Side.TOP) + this._popup.getOffset(St.Side.BOTTOM);
return usedHeight;
}
_openSpaceForPopup() {
this._spaceReadySignalId = this._parentView.connect('space-ready', () => {
this._parentView.disconnect(this._spaceReadySignalId);
this._spaceReadySignalId = 0;
this._popup.popup();
this._updatePopupPosition();
});
this._parentView.openSpaceForPopup(this, this._boxPointerArrowside, this.view.nRowsDisplayedAtOnce());
}
_calculateBoxPointerArrowSide() {
let spaceTop = this.y - this._parentView.getCurrentPageY();
let spaceBottom = this._parentView.height - (spaceTop + this.height);
return spaceTop > spaceBottom ? St.Side.BOTTOM : St.Side.TOP;
}
_updatePopupSize() {
// StWidget delays style calculation until needed, make sure we use the correct values
this.view._grid.ensure_style();
let offsetForEachSide = Math.ceil((this._popup.getOffset(St.Side.TOP) +
this._popup.getOffset(St.Side.BOTTOM) -
this._popup.getCloseButtonOverlap()) / 2);
// Add extra padding to prevent boxpointer decorations and close button being cut off
this.view.setPaddingOffsets(offsetForEachSide);
this.view.adaptToSize(this._parentAvailableWidth, this._parentAvailableHeight);
}
_updatePopupPosition() {
if (!this._popup)
return; return;
if (!this._dialog) {
this._dialog = new AppFolderDialog(this, this._folder); if (this._boxPointerArrowside == St.Side.BOTTOM)
this._parentView.addFolderDialog(this._dialog); this._popup.y = this.allocation.y1 + this.translation_y - this._popupHeight();
this._dialog.connect('open-state-changed', (popup, isOpen) => { else
this._popup.y = this.allocation.y1 + this.translation_y + this.height;
}
_ensurePopup() {
if (this._popup && !this._popupInvalidated)
return;
this._boxPointerArrowside = this._calculateBoxPointerArrowSide();
if (!this._popup) {
this._popup = new AppFolderPopup(this, this._boxPointerArrowside);
this._parentView.addFolderPopup(this._popup);
this._popup.connect('open-state-changed', (popup, isOpen) => {
if (!isOpen) if (!isOpen)
this.checked = false; this.checked = false;
}); });
} else {
this._popup.updateArrowSide(this._boxPointerArrowside);
} }
this._updatePopupSize();
this._updatePopupPosition();
this._popupInvalidated = false;
}
_removeMenuTimeout() {
if (this._popupTimeoutId > 0) {
GLib.source_remove(this._popupTimeoutId);
this._popupTimeoutId = 0;
}
}
_setPopupTimeout() {
this._removeMenuTimeout();
this._popupTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, MENU_POPUP_TIMEOUT, () => {
this._popupTimeoutId = 0;
this._popupRenamePopup();
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(this._popupTimeoutId,
'[gnome-shell] this._popupRenamePopup');
}
vfunc_leave_event(crossingEvent) {
let ret = super.vfunc_leave_event(crossingEvent);
this.fake_release();
this._removeMenuTimeout();
return ret;
}
vfunc_button_press_event(buttonEvent) {
super.vfunc_button_press_event(buttonEvent);
if (buttonEvent.button == 1) {
this._setPopupTimeout();
} else if (buttonEvent.button == 3) {
this._popupRenamePopup();
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
}
vfunc_touch_event(touchEvent) {
super.vfunc_touch_event(touchEvent);
if (touchEvent.type == Clutter.EventType.TOUCH_BEGIN)
this._setPopupTimeout();
return Clutter.EVENT_PROPAGATE;
}
_popupRenamePopup() {
this._removeMenuTimeout();
this.fake_release();
if (!this._menu) {
this._menuManager = new PopupMenu.PopupMenuManager(this);
this._menu = new RenameFolderMenu(this, this._folder);
this._menuManager.addMenu(this._menu);
this._menu.connect('open-state-changed', (menu, isPoppedUp) => {
if (!isPoppedUp)
this.sync_hover();
});
let id = Main.overview.connect('hiding', () => {
this._menu.close();
});
this.connect('destroy', () => {
Main.overview.disconnect(id);
});
}
this.set_hover(true);
this._menu.open();
this._menuManager.ignoreRelease();
}
adaptToSize(width, height) {
this._parentAvailableWidth = width;
this._parentAvailableHeight = height;
if (this._popup)
this.view.adaptToSize(width, height);
this._popupInvalidated = true;
} }
}); });
var AppFolderDialog = GObject.registerClass({ var RenameFolderMenuItem = GObject.registerClass(
class RenameFolderMenuItem extends PopupMenu.PopupBaseMenuItem {
_init(folder) {
super._init({
style_class: 'rename-folder-popup-item',
reactive: false,
});
this.setOrnament(PopupMenu.Ornament.HIDDEN);
this._folder = folder;
// Entry
this._entry = new St.Entry({
x_expand: true,
width: 200,
});
this.add_child(this._entry);
this._entry.clutter_text.connect(
'notify::text', this._validate.bind(this));
this._entry.clutter_text.connect(
'activate', this._updateFolderName.bind(this));
// Rename button
this._button = new St.Button({
style_class: 'button',
reactive: true,
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO,
can_focus: true,
label: _('Rename'),
});
this.add_child(this._button);
this._button.connect('clicked', this._updateFolderName.bind(this));
}
vfunc_map() {
this._entry.text = _getFolderName(this._folder);
this._entry.clutter_text.set_selection(0, -1);
super.vfunc_map();
}
vfunc_key_focus_in() {
super.vfunc_key_focus_in();
this._entry.clutter_text.grab_key_focus();
}
_isValidFolderName() {
let folderName = _getFolderName(this._folder);
let newFolderName = this._entry.text.trim();
return newFolderName.length > 0 && newFolderName != folderName;
}
_validate() {
let isValid = this._isValidFolderName();
this._button.reactive = isValid;
}
_updateFolderName() {
if (!this._isValidFolderName())
return;
let newFolderName = this._entry.text.trim();
this._folder.set_string('name', newFolderName);
this._folder.set_boolean('translate', false);
this.activate(Clutter.get_current_event());
}
});
var RenameFolderMenu = class RenameFolderMenu extends PopupMenu.PopupMenu {
constructor(source, folder) {
super(source, 0.5, St.Side.BOTTOM);
this.actor.add_style_class_name('rename-folder-popup');
// We want to keep the item hovered while the menu is up
this.blockSourceEvents = true;
let menuItem = new RenameFolderMenuItem(folder);
this.addMenuItem(menuItem);
// Focus the text entry on menu pop-up
this.focusActor = menuItem;
// Chain our visibility and lifecycle to that of the source
this._sourceMappedId = source.connect('notify::mapped', () => {
if (!source.mapped)
this.close();
});
source.connect('destroy', () => {
source.disconnect(this._sourceMappedId);
this.destroy();
});
Main.uiGroup.add_actor(this.actor);
}
};
Signals.addSignalMethods(RenameFolderMenu.prototype);
var AppFolderPopup = GObject.registerClass({
Signals: { Signals: {
'open-state-changed': { param_types: [GObject.TYPE_BOOLEAN] }, 'open-state-changed': { param_types: [GObject.TYPE_BOOLEAN] },
}, },
}, class AppFolderDialog extends St.Widget { }, class AppFolderPopup extends St.Widget {
_init(source, folder) { _init(source, side) {
super._init({ super._init({
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
style_class: 'app-folder-dialog-container',
visible: false, visible: false,
// We don't want to expand really, but look
// at the layout manager of our parent...
//
// DOUBLE HACK: if you set one, you automatically
// get the effect for the other direction too, so
// we need to set the y_align
x_expand: true, x_expand: true,
y_expand: true, y_expand: true,
x_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.START,
}); });
this.add_constraint(new Clutter.BindConstraint({
source: Main.overview.viewSelector,
coordinate: Clutter.BindCoordinate.ALL,
}));
this._source = source; this._source = source;
this._folder = folder;
this._view = source.view; this._view = source.view;
this._arrowSide = side;
this._isOpen = false; this._isOpen = false;
this.parentOffset = 0; this.parentOffset = 0;
this._viewBox = new St.BoxLayout({ this._boxPointer = new BoxPointer.BoxPointer(this._arrowSide, {
style_class: 'app-folder-dialog', style_class: 'app-folder-popup-bin',
x_expand: true, x_expand: true,
y_expand: true,
x_align: Clutter.ActorAlign.FILL,
y_align: Clutter.ActorAlign.FILL,
vertical: true,
}); });
this.add_child(this._viewBox);
this._addFolderNameEntry(); this._boxPointer.style_class = 'app-folder-popup';
this._viewBox.add_child(this._view); this.add_actor(this._boxPointer);
this._boxPointer.bin.set_child(this._view);
this.closeButton = Util.makeCloseButton(this._boxPointer);
this.closeButton.connect('clicked', this.popdown.bind(this));
this.add_actor(this.closeButton);
this._boxPointer.bind_property('opacity', this.closeButton, 'opacity',
GObject.BindingFlags.SYNC_CREATE);
global.focus_manager.add_group(this); global.focus_manager.add_group(this);
@@ -1687,206 +1988,6 @@ var AppFolderDialog = GObject.registerClass({
}); });
this._grabHelper.addActor(Main.layoutManager.overviewGroup); this._grabHelper.addActor(Main.layoutManager.overviewGroup);
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this._sourceMappedId = 0;
this._needsZoomAndFade = false;
}
_addFolderNameEntry() {
this._entryBox = new St.BoxLayout({
style_class: 'folder-name-container',
});
this._viewBox.add_child(this._entryBox);
// Empty actor to center the title
let ghostButton = new Clutter.Actor();
this._entryBox.add_child(ghostButton);
let stack = new Shell.Stack({
x_expand: true,
x_align: Clutter.ActorAlign.CENTER,
});
this._entryBox.add_child(stack);
// Folder name label
this._folderNameLabel = new St.Label({
style_class: 'folder-name-label',
x_expand: true,
y_expand: true,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
});
stack.add_child(this._folderNameLabel);
// Folder name entry
this._entry = new St.Entry({
style_class: 'folder-name-entry',
opacity: 0,
reactive: false,
});
this._entry.clutter_text.set({
x_expand: true,
x_align: Clutter.ActorAlign.CENTER,
});
this._entry.clutter_text.connect('activate', () => {
this._showFolderLabel();
});
stack.add_child(this._entry);
// Edit button
this._editButton = new St.Button({
style_class: 'edit-folder-button',
button_mask: St.ButtonMask.ONE,
toggle_mode: true,
reactive: true,
can_focus: true,
x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.CENTER,
child: new St.Icon({
icon_name: 'document-edit-symbolic',
icon_size: 16,
}),
});
this._editButton.connect('notify::checked', () => {
if (this._editButton.checked)
this._showFolderEntry();
else
this._showFolderLabel();
});
this._entryBox.add_child(this._editButton);
ghostButton.add_constraint(new Clutter.BindConstraint({
source: this._editButton,
coordinate: Clutter.BindCoordinate.SIZE,
}));
this._folder.connect('changed::name', () => this._syncFolderName());
this._syncFolderName();
}
_syncFolderName() {
let newName = _getFolderName(this._folder);
this._folderNameLabel.text = newName;
this._entry.text = newName;
}
_switchActor(from, to) {
to.reactive = true;
to.ease({
opacity: 255,
duration: 300,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
from.ease({
opacity: 0,
duration: 300,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
from.reactive = false;
},
});
}
_showFolderLabel() {
if (this._editButton.checked)
this._editButton.checked = false;
this._maybeUpdateFolderName();
this._switchActor(this._entry, this._folderNameLabel);
}
_showFolderEntry() {
this._switchActor(this._folderNameLabel, this._entry);
this._entry.clutter_text.set_selection(0, -1);
this._entry.clutter_text.grab_key_focus();
}
_maybeUpdateFolderName() {
let folderName = _getFolderName(this._folder);
let newFolderName = this._entry.text.trim();
if (newFolderName.length === 0 || newFolderName === folderName)
return;
this._folder.set_string('name', newFolderName);
this._folder.set_boolean('translate', false);
}
_zoomAndFadeIn() {
let [sourceX, sourceY] =
this._source.get_transformed_position();
let [dialogX, dialogY] =
this.get_transformed_position();
this.set({
translation_x: sourceX - dialogX,
translation_y: sourceY - dialogY,
scale_x: this._source.width / this.width,
scale_y: this._source.height / this.height,
opacity: 0,
});
this.ease({
translation_x: 0,
translation_y: 0,
scale_x: 1,
scale_y: 1,
opacity: 255,
duration: FOLDER_DIALOG_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
this._needsZoomAndFade = false;
if (this._sourceMappedId === 0) {
this._sourceMappedId = this._source.connect(
'notify::mapped', this._zoomAndFadeOut.bind(this));
}
}
_zoomAndFadeOut() {
if (!this._isOpen)
return;
if (!this._source.mapped) {
this.hide();
return;
}
let [sourceX, sourceY] =
this._source.get_transformed_position();
let [dialogX, dialogY] =
this.get_transformed_position();
this.ease({
translation_x: sourceX - dialogX,
translation_y: sourceY - dialogY,
scale_x: this._source.width / this.width,
scale_y: this._source.height / this.height,
opacity: 0,
duration: FOLDER_DIALOG_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
this.set({
translation_x: 0,
translation_y: 0,
scale_x: 1,
scale_y: 1,
opacity: 255,
});
this.hide();
},
});
this._needsZoomAndFade = false;
} }
_onDestroy() { _onDestroy() {
@@ -1895,28 +1996,6 @@ var AppFolderDialog = GObject.registerClass({
this._grabHelper.ungrab({ actor: this }); this._grabHelper.ungrab({ actor: this });
this._grabHelper = null; this._grabHelper = null;
} }
if (this._sourceMappedId) {
this._source.disconnect(this._sourceMappedId);
this._sourceMappedId = 0;
}
}
vfunc_allocate(box, flags) {
let contentBox = this.get_theme_node().get_content_box(box);
let [, entryBoxHeight] = this._entryBox.get_size();
let spacing = this._viewBox.layout_manager.spacing;
this._view.adaptToSize(
contentBox.get_width(),
contentBox.get_height() - entryBoxHeight - spacing);
super.vfunc_allocate(box, flags);
// We can only start zooming after receiving an allocation
if (this._needsZoomAndFade)
this._zoomAndFadeIn();
} }
vfunc_key_press_event(keyEvent) { vfunc_key_press_event(keyEvent) {
@@ -1982,9 +2061,20 @@ var AppFolderDialog = GObject.registerClass({
if (!this._isOpen) if (!this._isOpen)
return; return;
this._needsZoomAndFade = true;
this.show(); this.show();
this._boxPointer.setArrowActor(this._source);
// We need to hide the icons of the view until the boxpointer animation
// is completed so we can animate the icons after as we like without
// showing them while boxpointer is animating.
this._view.opacity = 0;
this._boxPointer.open(BoxPointer.PopupAnimation.FADE |
BoxPointer.PopupAnimation.SLIDE,
() => {
this._view.opacity = 255;
this._view.animate(IconGrid.AnimationDirection.IN);
});
this.emit('open-state-changed', true); this.emit('open-state-changed', true);
} }
@@ -1992,13 +2082,29 @@ var AppFolderDialog = GObject.registerClass({
if (!this._isOpen) if (!this._isOpen)
return; return;
this._zoomAndFadeOut();
this._showFolderLabel();
this._grabHelper.ungrab({ actor: this }); this._grabHelper.ungrab({ actor: this });
this._boxPointer.close(BoxPointer.PopupAnimation.FADE |
BoxPointer.PopupAnimation.SLIDE);
this._isOpen = false; this._isOpen = false;
this.emit('open-state-changed', false); this.emit('open-state-changed', false);
} }
getCloseButtonOverlap() {
return this.closeButton.get_theme_node().get_length('-shell-close-overlap-y');
}
getOffset(side) {
let offset = this._boxPointer.getPadding(side);
if (this._arrowSide == side)
offset += this._boxPointer.getArrowHeight();
return offset;
}
updateArrowSide(side) {
this._arrowSide = side;
this._boxPointer.updateArrowSide(side);
}
}); });
var AppIcon = GObject.registerClass({ var AppIcon = GObject.registerClass({

View File

@@ -1,7 +1,6 @@
/* exported AudioDeviceSelectionDBus */ /* exported AudioDeviceSelectionDBus */
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Dialog = imports.ui.dialog;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
@@ -37,17 +36,18 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
} }
_buildLayout() { _buildLayout() {
let content = new Dialog.MessageDialogContent({ let title = new St.Label({ style_class: 'audio-selection-title',
title: _('Select Audio Device'), text: _("Select Audio Device"),
}); x_align: Clutter.ActorAlign.CENTER });
this.contentLayout.style_class = 'audio-selection-content';
this.contentLayout.add(title);
this._selectionBox = new St.BoxLayout({ this._selectionBox = new St.BoxLayout({
style_class: 'audio-selection-box', style_class: 'audio-selection-box',
x_expand: true, x_expand: true,
}); });
content.add_child(this._selectionBox); this.contentLayout.add_child(this._selectionBox);
this.contentLayout.add_child(content);
if (Main.sessionMode.allowSettings) { if (Main.sessionMode.allowSettings) {
this.addButton({ action: this._openSettings.bind(this), this.addButton({ action: this._openSettings.bind(this),

View File

@@ -7,7 +7,6 @@ const Main = imports.ui.main;
const MessageList = imports.ui.messageList; const MessageList = imports.ui.messageList;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const Mpris = imports.ui.mpris; const Mpris = imports.ui.mpris;
const PopupMenu = imports.ui.popupMenu;
const Util = imports.misc.util; const Util = imports.misc.util;
const { loadInterfaceXML } = imports.misc.fileUtils; const { loadInterfaceXML } = imports.misc.fileUtils;
@@ -1101,26 +1100,6 @@ class Placeholder extends St.BoxLayout {
} }
}); });
const DoNotDisturbSwitch = GObject.registerClass(
class DoNotDisturbSwitch extends PopupMenu.Switch {
_init() {
this._settings = new Gio.Settings({
schema_id: 'org.gnome.desktop.notifications',
});
super._init(this._settings.get_boolean('show-banners'));
this._settings.bind('show-banners',
this, 'state',
Gio.SettingsBindFlags.INVERT_BOOLEAN);
this.connect('destroy', () => {
this._settings.run_dispose();
this._settings = null;
});
}
});
var CalendarMessageList = GObject.registerClass( var CalendarMessageList = GObject.registerClass(
class CalendarMessageList extends St.Widget { class CalendarMessageList extends St.Widget {
_init() { _init() {
@@ -1146,33 +1125,16 @@ class CalendarMessageList extends St.Widget {
this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC);
box.add_actor(this._scrollView); box.add_actor(this._scrollView);
let hbox = new St.BoxLayout({ style_class: 'message-list-controls' });
box.add_child(hbox);
hbox.add_child(new St.Label({
text: _('Do Not Disturb'),
y_align: Clutter.ActorAlign.CENTER,
}));
this._dndSwitch = new DoNotDisturbSwitch();
this._dndButton = new St.Button({
can_focus: true,
child: this._dndSwitch,
});
this._dndButton.connect('clicked', () => this._dndSwitch.toggle());
hbox.add_child(this._dndButton);
this._clearButton = new St.Button({ this._clearButton = new St.Button({
style_class: 'message-list-clear-button button', style_class: 'message-list-clear-button button',
label: _('Clear'), label: _('Clear'),
can_focus: true, can_focus: true,
x_expand: true,
x_align: Clutter.ActorAlign.END, x_align: Clutter.ActorAlign.END,
}); });
this._clearButton.connect('clicked', () => { this._clearButton.connect('clicked', () => {
this._sectionList.get_children().forEach(s => s.clear()); this._sectionList.get_children().forEach(s => s.clear());
}); });
hbox.add_actor(this._clearButton); box.add_actor(this._clearButton);
this._placeholder.bind_property('visible', this._placeholder.bind_property('visible',
this._clearButton, 'visible', this._clearButton, 'visible',

View File

@@ -19,7 +19,7 @@ class CheckBox extends St.Button {
this._box = new St.Bin({ y_align: Clutter.ActorAlign.START }); this._box = new St.Bin({ y_align: Clutter.ActorAlign.START });
container.add_actor(this._box); container.add_actor(this._box);
this._label = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); this._label = new St.Label();
this._label.clutter_text.set_line_wrap(true); this._label.clutter_text.set_line_wrap(true);
this._label.clutter_text.set_ellipsize(Pango.EllipsizeMode.NONE); this._label.clutter_text.set_ellipsize(Pango.EllipsizeMode.NONE);
container.add_actor(this._label); container.add_actor(this._label);

View File

@@ -108,8 +108,8 @@ var AuthenticationDialog = GObject.registerClass({
this._passwordBox.add(this._workSpinner); this._passwordBox.add(this._workSpinner);
this._passwordBox.hide(); this._passwordBox.hide();
let capsLockWarning = new ShellEntry.CapsLockWarning(); this._capsLockWarningLabel = new ShellEntry.CapsLockWarning({ style_class: 'prompt-dialog-caps-lock-warning' });
content.add_child(capsLockWarning); content.add_child(this._capsLockWarningLabel);
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' }); this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;

View File

@@ -432,6 +432,7 @@ var MessagesIndicator = GObject.registerClass(
class MessagesIndicator extends St.Icon { class MessagesIndicator extends St.Icon {
_init() { _init() {
super._init({ super._init({
icon_name: 'message-indicator-symbolic',
icon_size: 16, icon_size: 16,
visible: false, visible: false,
y_expand: true, y_expand: true,
@@ -439,13 +440,6 @@ class MessagesIndicator extends St.Icon {
}); });
this._sources = []; this._sources = [];
this._count = 0;
this._doNotDisturb = false;
this._settings = new Gio.Settings({
schema_id: 'org.gnome.desktop.notifications',
});
this._settings.connect('changed::show-banners', this._sync.bind(this));
Main.messageTray.connect('source-added', this._onSourceAdded.bind(this)); Main.messageTray.connect('source-added', this._onSourceAdded.bind(this));
Main.messageTray.connect('source-removed', this._onSourceRemoved.bind(this)); Main.messageTray.connect('source-removed', this._onSourceRemoved.bind(this));
@@ -453,11 +447,6 @@ class MessagesIndicator extends St.Icon {
let sources = Main.messageTray.getSources(); let sources = Main.messageTray.getSources();
sources.forEach(source => this._onSourceAdded(null, source)); sources.forEach(source => this._onSourceAdded(null, source));
this.connect('destroy', () => {
this._settings.run_dispose();
this._settings = null;
});
} }
_onSourceAdded(tray, source) { _onSourceAdded(tray, source) {
@@ -474,17 +463,9 @@ class MessagesIndicator extends St.Icon {
_updateCount() { _updateCount() {
let count = 0; let count = 0;
this._sources.forEach(source => (count += source.unseenCount)); this._sources.forEach(source => (count += source.unseenCount));
this._count = count - Main.messageTray.queueCount; count -= Main.messageTray.queueCount;
this._sync(); this.visible = count > 0;
}
_sync() {
let doNotDisturb = !this._settings.get_boolean('show-banners');
this.icon_name = doNotDisturb
? 'notifications-disabled-symbolic'
: 'message-indicator-symbolic';
this.visible = doNotDisturb || this._count > 0;
} }
}); });
@@ -492,19 +473,21 @@ var IndicatorPad = GObject.registerClass(
class IndicatorPad extends St.Widget { class IndicatorPad extends St.Widget {
_init(actor) { _init(actor) {
this._source = actor; this._source = actor;
this._source.connect('notify::visible', () => this.queue_relayout());
this._source.connect('notify::size', () => this.queue_relayout()); this._source.connect('notify::size', () => this.queue_relayout());
super._init(); super._init();
this._source.bind_property('visible',
this, 'visible',
GObject.BindingFlags.SYNC_CREATE);
} }
vfunc_get_preferred_width(forHeight) { vfunc_get_preferred_width(forHeight) {
return this._source.get_preferred_width(forHeight); if (this._source.visible)
return this._source.get_preferred_width(forHeight);
return [0, 0];
} }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
return this._source.get_preferred_height(forWidth); if (this._source.visible)
return this._source.get_preferred_height(forWidth);
return [0, 0];
} }
}); });
@@ -576,7 +559,7 @@ class DateMenuButton extends PanelMenu.Button {
this._clockDisplay = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); this._clockDisplay = new St.Label({ y_align: Clutter.ActorAlign.CENTER });
this._indicator = new MessagesIndicator(); this._indicator = new MessagesIndicator();
let box = new St.BoxLayout({ style_class: 'clock-display-box' }); let box = new St.BoxLayout();
box.add_actor(new IndicatorPad(this._indicator)); box.add_actor(new IndicatorPad(this._indicator));
box.add_actor(this._clockDisplay); box.add_actor(this._clockDisplay);
box.add_actor(this._indicator); box.add_actor(this._indicator);

View File

@@ -313,8 +313,8 @@ var _Draggable = class _Draggable {
device = event.get_device(); device = event.get_device();
if (device == undefined) { if (device == undefined) {
let seat = Clutter.get_default_backend().get_default_seat(); let manager = Clutter.DeviceManager.get_default();
device = seat.get_pointer(); device = manager.get_core_device(Clutter.InputDeviceType.POINTER_DEVICE);
} }
} }

View File

@@ -1,5 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported init, installExtension, uninstallExtension, checkForUpdates */ /* exported init, installExtension, uninstallExtension,
checkForUpdates, updateExtension */
const { Clutter, Gio, GLib, GObject, Soup } = imports.gi; const { Clutter, Gio, GLib, GObject, Soup } = imports.gi;
@@ -99,9 +100,13 @@ function gotExtensionZipFile(session, message, uuid, dir, callback, errback) {
}); });
} }
function downloadExtensionUpdate(uuid) { function updateExtension(uuid) {
let dir = Gio.File.new_for_path( // This gets a bit tricky. We want the update to be seamless -
GLib.build_filenamev([global.userdatadir, 'extension-updates', uuid])); // if we have any error during downloading or extracting, we
// want to not unload the current version.
let oldExtensionTmpDir = GLib.Dir.make_tmp('XXXXXX-shell-extension');
let newExtensionTmpDir = GLib.Dir.make_tmp('XXXXXX-shell-extension');
let params = { shell_version: Config.PACKAGE_VERSION }; let params = { shell_version: Config.PACKAGE_VERSION };
@@ -109,10 +114,39 @@ function downloadExtensionUpdate(uuid) {
let message = Soup.form_request_new_from_hash('GET', url, params); let message = Soup.form_request_new_from_hash('GET', url, params);
_httpSession.queue_message(message, session => { _httpSession.queue_message(message, session => {
gotExtensionZipFile(session, message, uuid, dir, () => { gotExtensionZipFile(session, message, uuid, newExtensionTmpDir, () => {
Main.extensionManager.notifyExtensionUpdate(uuid); let oldExtension = Main.extensionManager.lookup(uuid);
let extensionDir = oldExtension.dir;
if (!Main.extensionManager.unloadExtension(oldExtension))
return;
FileUtils.recursivelyMoveDir(extensionDir, oldExtensionTmpDir);
FileUtils.recursivelyMoveDir(newExtensionTmpDir, extensionDir);
let extension = null;
try {
extension = Main.extensionManager.createExtensionObject(uuid, extensionDir, ExtensionUtils.ExtensionType.PER_USER);
Main.extensionManager.loadExtension(extension);
} catch (e) {
if (extension)
Main.extensionManager.unloadExtension(extension);
logError(e, 'Error loading extension %s'.format(uuid));
FileUtils.recursivelyDeleteDir(extensionDir, false);
FileUtils.recursivelyMoveDir(oldExtensionTmpDir, extensionDir);
// Restore what was there before. We can't do much if we
// fail here.
Main.extensionManager.loadExtension(oldExtension);
return;
}
FileUtils.recursivelyDeleteDir(oldExtensionTmpDir, true);
}, (code, msg) => { }, (code, msg) => {
log(`Error while downloading update for extension ${uuid}: ${code} (${msg})`); log(`Error while updating extension ${uuid}: ${code} (${msg})`);
}); });
}); });
} }
@@ -120,21 +154,11 @@ function downloadExtensionUpdate(uuid) {
function checkForUpdates() { function checkForUpdates() {
let metadatas = {}; let metadatas = {};
Main.extensionManager.getUuids().forEach(uuid => { Main.extensionManager.getUuids().forEach(uuid => {
let extension = Main.extensionManager.lookup(uuid); metadatas[uuid] = Main.extensionManager.extensions[uuid].metadata;
if (extension.type !== ExtensionUtils.ExtensionType.PER_USER)
return;
if (extension.hasUpdate)
return;
metadatas[uuid] = extension.metadata;
}); });
let versionCheck = global.settings.get_boolean( let params = { shell_version: Config.PACKAGE_VERSION,
'disable-extension-version-validation'); installed: JSON.stringify(metadatas) };
let params = {
shell_version: Config.PACKAGE_VERSION,
installed: JSON.stringify(metadatas),
disable_version_validation: `${versionCheck}`,
};
let url = REPOSITORY_URL_UPDATE; let url = REPOSITORY_URL_UPDATE;
let message = Soup.form_request_new_from_hash('GET', url, params); let message = Soup.form_request_new_from_hash('GET', url, params);
@@ -148,7 +172,7 @@ function checkForUpdates() {
if (operation == 'blacklist') if (operation == 'blacklist')
uninstallExtension(uuid); uninstallExtension(uuid);
else if (operation == 'upgrade' || operation == 'downgrade') else if (operation == 'upgrade' || operation == 'downgrade')
downloadExtensionUpdate(uuid); updateExtension(uuid);
} }
}); });
} }
@@ -173,8 +197,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
}]); }]);
let content = new Dialog.MessageDialogContent({ let content = new Dialog.MessageDialogContent({
title: _('Install Extension'), title: _("Download and install “%s” from extensions.gnome.org?").format(info.name),
description: _('Download and install “%s” from extensions.gnome.org?').format(info.name),
}); });
this.contentLayout.add(content); this.contentLayout.add(content);

View File

@@ -45,7 +45,6 @@ var ExtensionManager = class {
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
this._installExtensionUpdates();
this._sessionUpdated(); this._sessionUpdated();
} }
@@ -199,15 +198,6 @@ var ExtensionManager = class {
return true; return true;
} }
notifyExtensionUpdate(uuid) {
let extension = this.lookup(uuid);
if (!extension)
return;
extension.hasUpdate = true;
this.emit('extension-state-changed', extension);
}
logExtensionError(uuid, error) { logExtensionError(uuid, error) {
let extension = this.lookup(uuid); let extension = this.lookup(uuid);
if (!extension) if (!extension)
@@ -263,7 +253,6 @@ var ExtensionManager = class {
path: dir.get_path(), path: dir.get_path(),
error: '', error: '',
hasPrefs: dir.get_child('prefs.js').query_exists(null), hasPrefs: dir.get_child('prefs.js').query_exists(null),
hasUpdate: false,
canChange: false, canChange: false,
}; };
this._extensions.set(uuid, extension); this._extensions.set(uuid, extension);
@@ -457,21 +446,6 @@ var ExtensionManager = class {
}).forEach(extension => this.reloadExtension(extension)); }).forEach(extension => this.reloadExtension(extension));
} }
_installExtensionUpdates() {
FileUtils.collectFromDatadirs('extension-updates', true, (dir, info) => {
let fileType = info.get_file_type();
if (fileType !== Gio.FileType.DIRECTORY)
return;
let uuid = info.get_name();
let extensionDir = Gio.File.new_for_path(
GLib.build_filenamev([global.userdatadir, 'extensions', uuid]));
FileUtils.recursivelyDeleteDir(extensionDir, false);
FileUtils.recursivelyMoveDir(dir, extensionDir);
FileUtils.recursivelyDeleteDir(dir, true);
});
}
_loadExtensions() { _loadExtensions() {
global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`, global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`,
this._onEnabledExtensionsChanged.bind(this)); this._onEnabledExtensionsChanged.bind(this));

View File

@@ -9,6 +9,8 @@ const Main = imports.ui.main;
var ICON_SIZE = 96; var ICON_SIZE = 96;
var MIN_ICON_SIZE = 16; var MIN_ICON_SIZE = 16;
var EXTRA_SPACE_ANIMATION_TIME = 250;
var ANIMATION_TIME_IN = 350; var ANIMATION_TIME_IN = 350;
var ANIMATION_TIME_OUT = 1 / 2 * ANIMATION_TIME_IN; var ANIMATION_TIME_OUT = 1 / 2 * ANIMATION_TIME_IN;
var ANIMATION_MAX_DELAY_FOR_ITEM = 2 / 3 * ANIMATION_TIME_IN; var ANIMATION_MAX_DELAY_FOR_ITEM = 2 / 3 * ANIMATION_TIME_IN;
@@ -844,8 +846,10 @@ var IconGrid = GObject.registerClass({
} }
}); });
var PaginatedIconGrid = GObject.registerClass( var PaginatedIconGrid = GObject.registerClass({
class PaginatedIconGrid extends IconGrid { Signals: { 'space-opened': {},
'space-closed': {} },
}, class PaginatedIconGrid extends IconGrid {
_init(params) { _init(params) {
super._init(params); super._init(params);
this._nPages = 0; this._nPages = 0;
@@ -977,4 +981,94 @@ class PaginatedIconGrid extends IconGrid {
throw new Error('Item not found.'); throw new Error('Item not found.');
return Math.floor(index / this._childrenPerPage); return Math.floor(index / this._childrenPerPage);
} }
/**
* openExtraSpace:
* @param {Clutter.Actor} sourceItem: item for which to create extra space
* @param {St.Side} side: where @sourceItem should be located relative to
* the created space
* @param {number} nRows: the amount of space to create
*
* Pan view to create extra space for @nRows above or below @sourceItem.
*/
openExtraSpace(sourceItem, side, nRows) {
let children = this._getVisibleChildren();
let index = children.indexOf(sourceItem);
if (index == -1)
throw new Error('Item not found.');
let pageIndex = Math.floor(index / this._childrenPerPage);
let pageOffset = pageIndex * this._childrenPerPage;
let childrenPerRow = this._childrenPerPage / this._rowsPerPage;
let sourceRow = Math.floor((index - pageOffset) / childrenPerRow);
let nRowsAbove = side == St.Side.TOP ? sourceRow + 1 : sourceRow;
let nRowsBelow = this._rowsPerPage - nRowsAbove;
let nRowsUp, nRowsDown;
if (side == St.Side.TOP) {
nRowsDown = Math.min(nRowsBelow, nRows);
nRowsUp = nRows - nRowsDown;
} else {
nRowsUp = Math.min(nRowsAbove, nRows);
nRowsDown = nRows - nRowsUp;
}
let childrenDown = children.splice(pageOffset +
nRowsAbove * childrenPerRow,
nRowsBelow * childrenPerRow);
let childrenUp = children.splice(pageOffset,
nRowsAbove * childrenPerRow);
// Special case: On the last row with no rows below the icon,
// there's no need to move any rows either up or down
if (childrenDown.length == 0 && nRowsUp == 0) {
this._translatedChildren = [];
this.emit('space-opened');
} else {
this._translateChildren(childrenUp, St.DirectionType.UP, nRowsUp);
this._translateChildren(childrenDown, St.DirectionType.DOWN, nRowsDown);
this._translatedChildren = childrenUp.concat(childrenDown);
}
}
_translateChildren(children, direction, nRows) {
let translationY = nRows * (this._getVItemSize() + this._getSpacing());
if (translationY == 0)
return;
if (direction == St.DirectionType.UP)
translationY *= -1;
for (let i = 0; i < children.length; i++) {
children[i].translation_y = 0;
let params = {
translation_y: translationY,
duration: EXTRA_SPACE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_IN_OUT_QUAD,
};
if (i == (children.length - 1))
params.onComplete = () => this.emit('space-opened');
children[i].ease(params);
}
}
closeExtraSpace() {
if (!this._translatedChildren || !this._translatedChildren.length) {
this.emit('space-closed');
return;
}
for (let i = 0; i < this._translatedChildren.length; i++) {
if (!this._translatedChildren[i].translation_y)
continue;
this._translatedChildren[i].ease({
translation_y: 0,
duration: EXTRA_SPACE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_IN_OUT_QUAD,
onComplete: () => this.emit('space-closed'),
});
}
}
}); });

View File

@@ -1,5 +1,5 @@
/* exported InhibitShortcutsDialog */ /* exported InhibitShortcutsDialog */
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell } = imports.gi;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
@@ -75,25 +75,22 @@ var InhibitShortcutsDialog = GObject.registerClass({
_buildLayout() { _buildLayout() {
let name = this._app ? this._app.get_name() : this._window.title; let name = this._app ? this._app.get_name() : this._window.title;
let content = new Dialog.MessageDialogContent({ /* Translators: %s is an application name like "Settings" */
title: _('Allow inhibiting shortcuts'), let title = name
description: name ? _("%s wants to inhibit shortcuts").format(name)
/* Translators: %s is an application name like "Settings" */ : _("Application wants to inhibit shortcuts");
? _('The application %s wants to inhibit shortcuts').format(name)
: _('An application wants to inhibit shortcuts'), let contentParams = { title };
});
let restoreAccel = this._getRestoreAccel(); let restoreAccel = this._getRestoreAccel();
if (restoreAccel) { if (restoreAccel) {
let restoreLabel = new St.Label({ contentParams.description =
/* Translators: %s is a keyboard shortcut like "Super+x" */ /* Translators: %s is a keyboard shortcut like "Super+x" */
text: _('You can restore shortcuts by pressing %s.').format(restoreAccel), _("You can restore shortcuts by pressing %s.").format(restoreAccel);
style_class: 'message-dialog-description',
});
content.add_child(restoreLabel);
} }
this._dialog.contentLayout.add_child(content); let content = new Dialog.MessageDialogContent(contentParams);
this._dialog.contentLayout.add_actor(content);
this._dialog.addButton({ label: _("Deny"), this._dialog.addButton({ label: _("Deny"),
action: () => { action: () => {

View File

@@ -15,12 +15,12 @@ class KbdA11yDialog extends GObject.Object {
this._a11ySettings = new Gio.Settings({ schema_id: KEYBOARD_A11Y_SCHEMA }); this._a11ySettings = new Gio.Settings({ schema_id: KEYBOARD_A11Y_SCHEMA });
let seat = Clutter.get_default_backend().get_default_seat(); let deviceManager = Clutter.DeviceManager.get_default();
seat.connect('kbd-a11y-flags-changed', deviceManager.connect('kbd-a11y-flags-changed',
this._showKbdA11yDialog.bind(this)); this._showKbdA11yDialog.bind(this));
} }
_showKbdA11yDialog(seat, newFlags, whatChanged) { _showKbdA11yDialog(deviceManager, newFlags, whatChanged) {
let dialog = new ModalDialog.ModalDialog(); let dialog = new ModalDialog.ModalDialog();
let title, description; let title, description;
let key, enabled; let key, enabled;
@@ -49,8 +49,10 @@ class KbdA11yDialog extends GObject.Object {
return; return;
} }
let content = new Dialog.MessageDialogContent({ title, description }); let contentParams = { title, description, styleClass: 'access-dialog' };
dialog.contentLayout.add_child(content); let content = new Dialog.MessageDialogContent(contentParams);
dialog.contentLayout.add_actor(content);
dialog.addButton({ label: enabled ? _("Leave On") : _("Turn On"), dialog.addButton({ label: enabled ? _("Leave On") : _("Turn On"),
action: () => { action: () => {

View File

@@ -614,7 +614,6 @@ var EmojiPager = GObject.registerClass({
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
reactive: true, reactive: true,
clip_to_allocation: true, clip_to_allocation: true,
y_expand: true,
}); });
this._sections = sections; this._sections = sections;
this._nCols = nCols; this._nCols = nCols;
@@ -935,6 +934,7 @@ var EmojiSelection = GObject.registerClass({
this.add_child(bottomRow); this.add_child(bottomRow);
this._curPage = 0; this._curPage = 0;
this._emojiPager.setCurrentPage(0);
} }
vfunc_map() { vfunc_map() {
@@ -942,6 +942,11 @@ var EmojiSelection = GObject.registerClass({
super.vfunc_map(); super.vfunc_map();
} }
vfunc_unmap() {
super.vfunc_unmap();
this._emojiPager.setCurrentPage(0);
}
_onPageChanged(sectionLabel, page, nPages) { _onPageChanged(sectionLabel, page, nPages) {
this._curPage = page; this._curPage = page;
this._pageIndicator.setNPages(nPages); this._pageIndicator.setNPages(nPages);
@@ -1102,10 +1107,13 @@ var KeyboardManager = class KeyBoardManager {
this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA }); this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA });
this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this)); this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
this._lastDevice = null; this._lastDeviceId = null;
Meta.get_backend().connect('last-device-changed', (backend, device) => { Meta.get_backend().connect('last-device-changed', (backend, deviceId) => {
let manager = Clutter.DeviceManager.get_default();
let device = manager.get_device(deviceId);
if (device.get_device_name().indexOf('XTEST') < 0) { if (device.get_device_name().indexOf('XTEST') < 0) {
this._lastDevice = device; this._lastDeviceId = deviceId;
this._syncEnabled(); this._syncEnabled();
} }
}); });
@@ -1113,11 +1121,16 @@ var KeyboardManager = class KeyBoardManager {
} }
_lastDeviceIsTouchscreen() { _lastDeviceIsTouchscreen() {
if (!this._lastDevice) if (!this._lastDeviceId)
return false; return false;
let deviceType = this._lastDevice.get_device_type(); let manager = Clutter.DeviceManager.get_default();
return deviceType == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE; let device = manager.get_device(this._lastDeviceId);
if (!device)
return false;
return device.get_device_type() == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE;
} }
_syncEnabled() { _syncEnabled() {
@@ -1277,10 +1290,7 @@ class Keyboard extends St.BoxLayout {
this._suggestions = new Suggestions(); this._suggestions = new Suggestions();
this.add_child(this._suggestions); this.add_child(this._suggestions);
this._aspectContainer = new AspectContainer({ this._aspectContainer = new AspectContainer({ layout_manager: new Clutter.BinLayout() });
layout_manager: new Clutter.BinLayout(),
y_expand: true,
});
this.add_child(this._aspectContainer); this.add_child(this._aspectContainer);
this._emojiSelection = new EmojiSelection(); this._emojiSelection = new EmojiSelection();
@@ -1580,17 +1590,7 @@ class Keyboard extends St.BoxLayout {
let maxHeight = monitor.height / 3; let maxHeight = monitor.height / 3;
this.width = monitor.width; this.width = monitor.width;
this.height = maxHeight;
if (monitor.width > monitor.height) {
this.height = maxHeight;
} else {
/* In portrait mode, lack of horizontal space means we won't be
* able to make the OSK that big while keeping size ratio, so
* we allow the OSK being smaller than 1/3rd of the monitor height
* there.
*/
this.height = Math.min(maxHeight, this.get_preferred_height(monitor.width));
}
} }
_onGroupChanged() { _onGroupChanged() {
@@ -1829,8 +1829,8 @@ class Keyboard extends St.BoxLayout {
var KeyboardController = class { var KeyboardController = class {
constructor() { constructor() {
let seat = Clutter.get_default_backend().get_default_seat(); let deviceManager = Clutter.DeviceManager.get_default();
this._virtualDevice = seat.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
this._inputSourceManager = InputSourceManager.getInputSourceManager(); this._inputSourceManager = InputSourceManager.getInputSourceManager();
this._sourceChangedId = this._inputSourceManager.connect('current-source-changed', this._sourceChangedId = this._inputSourceManager.connect('current-source-changed',

View File

@@ -531,9 +531,9 @@ var Inspector = GObject.registerClass({
eventHandler.connect('scroll-event', this._onScrollEvent.bind(this)); eventHandler.connect('scroll-event', this._onScrollEvent.bind(this));
eventHandler.connect('motion-event', this._onMotionEvent.bind(this)); eventHandler.connect('motion-event', this._onMotionEvent.bind(this));
let seat = Clutter.get_default_backend().get_default_seat(); let dm = Clutter.DeviceManager.get_default();
this._pointerDevice = seat.get_pointer(); this._pointerDevice = dm.get_core_device(Clutter.InputDeviceType.POINTER_DEVICE);
this._keyboardDevice = seat.get_keyboard(); this._keyboardDevice = dm.get_core_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
this._pointerDevice.grab(eventHandler); this._pointerDevice.grab(eventHandler);
this._keyboardDevice.grab(eventHandler); this._keyboardDevice.grab(eventHandler);

View File

@@ -745,8 +745,7 @@ var ZoomRegion = class ZoomRegion {
this._xCaret = 0; this._xCaret = 0;
this._yCaret = 0; this._yCaret = 0;
let seat = Clutter.get_default_backend().get_default_seat(); this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID);
this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(seat.get_pointer());
this._scrollContentsTimerId = 0; this._scrollContentsTimerId = 0;
} }

View File

@@ -2,7 +2,7 @@
/* exported componentManager, notificationDaemon, windowAttentionHandler, /* exported componentManager, notificationDaemon, windowAttentionHandler,
ctrlAltTabManager, padOsdService, osdWindowManager, ctrlAltTabManager, padOsdService, osdWindowManager,
osdMonitorLabeler, shellMountOpDBusService, shellDBusService, osdMonitorLabeler, shellMountOpDBusService, shellDBusService,
shellAccessDialogDBusService, shellAudioSelectionDBusService, shellAudioSelectionDBusService,
screenSaverDBus, screencastService, uiGroup, magnifier, screenSaverDBus, screencastService, uiGroup, magnifier,
xdndHandler, keyboard, kbdA11yDialog, introspectService, xdndHandler, keyboard, kbdA11yDialog, introspectService,
start, pushModal, popModal, activateWindow, createLookingGlass, start, pushModal, popModal, activateWindow, createLookingGlass,
@@ -10,7 +10,6 @@
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const AccessDialog = imports.ui.accessDialog;
const AudioDeviceSelection = imports.ui.audioDeviceSelection; const AudioDeviceSelection = imports.ui.audioDeviceSelection;
const Components = imports.ui.components; const Components = imports.ui.components;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
@@ -68,7 +67,6 @@ var padOsdService = null;
var osdWindowManager = null; var osdWindowManager = null;
var osdMonitorLabeler = null; var osdMonitorLabeler = null;
var sessionMode = null; var sessionMode = null;
var shellAccessDialogDBusService = null;
var shellAudioSelectionDBusService = null; var shellAudioSelectionDBusService = null;
var shellDBusService = null; var shellDBusService = null;
var shellMountOpDBusService = null; var shellMountOpDBusService = null;
@@ -137,7 +135,6 @@ function start() {
St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet); St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet);
_initializeUI(); _initializeUI();
shellAccessDialogDBusService = new AccessDialog.AccessDialogDBus();
shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus(); shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus();
shellDBusService = new ShellDBus.GnomeShell(); shellDBusService = new ShellDBus.GnomeShell();
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler(); shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();

View File

@@ -689,9 +689,5 @@ var Overview = class {
return this.dash.showAppsButton; return this.dash.showAppsButton;
} }
get searchEntry() {
return this._overview.searchEntry;
}
}; };
Signals.addSignalMethods(Overview.prototype); Signals.addSignalMethods(Overview.prototype);

View File

@@ -31,10 +31,15 @@ var SlideLayout = GObject.registerClass({
'slide-x', 'slide-x', 'slide-x', 'slide-x', 'slide-x', 'slide-x',
GObject.ParamFlags.READWRITE, GObject.ParamFlags.READWRITE,
0, 1, 1), 0, 1, 1),
'translation-x': GObject.ParamSpec.double(
'translation-x', 'translation-x', 'translation-x',
GObject.ParamFlags.READWRITE,
-Infinity, Infinity, 0),
}, },
}, class SlideLayout extends Clutter.FixedLayout { }, class SlideLayout extends Clutter.FixedLayout {
_init(params) { _init(params) {
this._slideX = 1; this._slideX = 1;
this._translationX = 0;
this._direction = SlideDirection.LEFT; this._direction = SlideDirection.LEFT;
super._init(params); super._init(params);
@@ -67,7 +72,7 @@ var SlideLayout = GObject.registerClass({
: availWidth - natWidth * this._slideX; : availWidth - natWidth * this._slideX;
let actorBox = new Clutter.ActorBox(); let actorBox = new Clutter.ActorBox();
actorBox.x1 = box.x1 + alignX; actorBox.x1 = box.x1 + alignX + this._translationX;
actorBox.x2 = actorBox.x1 + (child.x_expand ? availWidth : natWidth); actorBox.x2 = actorBox.x1 + (child.x_expand ? availWidth : natWidth);
actorBox.y1 = box.y1; actorBox.y1 = box.y1;
actorBox.y2 = actorBox.y1 + availHeight; actorBox.y2 = actorBox.y1 + availHeight;
@@ -97,6 +102,20 @@ var SlideLayout = GObject.registerClass({
get slideDirection() { get slideDirection() {
return this._direction; return this._direction;
} }
// eslint-disable-next-line camelcase
set translation_x(value) {
if (this._translationX == value)
return;
this._translationX = value;
this.notify('translation-x');
this.layout_changed();
}
// eslint-disable-next-line camelcase
get translation_x() {
return this._translationX;
}
}); });
var SlidingControl = GObject.registerClass( var SlidingControl = GObject.registerClass(
@@ -165,12 +184,11 @@ class SlidingControl extends St.Widget {
else else
translationEnd = translation; translationEnd = translation;
if (this.translation_x === translationEnd) if (this.layout.translation_x == translationEnd)
return; return;
this.translation_x = translationStart; this.layout.translation_x = translationStart;
this.ease({ this.ease_property('@layout.translation-x', translationEnd, {
translation_x: translationEnd,
mode: Clutter.AnimationMode.EASE_OUT_QUAD, mode: Clutter.AnimationMode.EASE_OUT_QUAD,
duration: SIDE_CONTROLS_ANIMATION_TIME, duration: SIDE_CONTROLS_ANIMATION_TIME,
}); });

View File

@@ -648,15 +648,15 @@ var PadOsd = GObject.registerClass({
this._capturedEventId = global.stage.connect('captured-event', this._onCapturedEvent.bind(this)); this._capturedEventId = global.stage.connect('captured-event', this._onCapturedEvent.bind(this));
this._padChooser = null; this._padChooser = null;
let seat = Clutter.get_default_backend().get_default_seat(); let deviceManager = Clutter.DeviceManager.get_default();
this._deviceAddedId = seat.connect('device-added', (_seat, device) => { this._deviceAddedId = deviceManager.connect('device-added', (manager, device) => {
if (device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE && if (device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE &&
this.padDevice.is_grouped(device)) { this.padDevice.is_grouped(device)) {
this._groupPads.push(device); this._groupPads.push(device);
this._updatePadChooser(); this._updatePadChooser();
} }
}); });
this._deviceRemovedId = seat.connect('device-removed', (_seat, device) => { this._deviceRemovedId = deviceManager.connect('device-removed', (manager, device) => {
// If the device is being removed, destroy the padOsd. // If the device is being removed, destroy the padOsd.
if (device == this.padDevice) { if (device == this.padDevice) {
this.destroy(); this.destroy();
@@ -669,7 +669,7 @@ var PadOsd = GObject.registerClass({
} }
}); });
seat.list_devices().forEach(device => { deviceManager.list_devices().forEach(device => {
if (device != this.padDevice && if (device != this.padDevice &&
device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE && device.get_device_type() == Clutter.InputDeviceType.PAD_DEVICE &&
this.padDevice.is_grouped(device)) this.padDevice.is_grouped(device))
@@ -960,13 +960,13 @@ var PadOsd = GObject.registerClass({
Main.popModal(this); Main.popModal(this);
this._actionEditor.close(); this._actionEditor.close();
let seat = Clutter.get_default_backend().get_default_seat(); let deviceManager = Clutter.DeviceManager.get_default();
if (this._deviceRemovedId != 0) { if (this._deviceRemovedId != 0) {
seat.disconnect(this._deviceRemovedId); deviceManager.disconnect(this._deviceRemovedId);
this._deviceRemovedId = 0; this._deviceRemovedId = 0;
} }
if (this._deviceAddedId != 0) { if (this._deviceAddedId != 0) {
seat.disconnect(this._deviceAddedId); deviceManager.disconnect(this._deviceAddedId);
this._deviceAddedId = 0; this._deviceAddedId = 0;
} }
@@ -990,8 +990,8 @@ var PadOsdService = class {
ShowAsync(params, invocation) { ShowAsync(params, invocation) {
let [deviceNode, editionMode] = params; let [deviceNode, editionMode] = params;
let seat = Clutter.get_default_backend().get_default_seat(); let deviceManager = Clutter.DeviceManager.get_default();
let devices = seat.list_devices(); let devices = deviceManager.list_devices();
let padDevice = null; let padDevice = null;
devices.forEach(device => { devices.forEach(device => {

View File

@@ -108,9 +108,9 @@ var PieTimer = GObject.registerClass({
var PointerA11yTimeout = class PointerA11yTimeout { var PointerA11yTimeout = class PointerA11yTimeout {
constructor() { constructor() {
let seat = Clutter.get_default_backend().get_default_seat(); let manager = Clutter.DeviceManager.get_default();
seat.connect('ptr-a11y-timeout-started', (o, device, type, timeout) => { manager.connect('ptr-a11y-timeout-started', (o, device, type, timeout) => {
let [x, y] = global.get_pointer(); let [x, y] = global.get_pointer();
this._pieTimer = new PieTimer(); this._pieTimer = new PieTimer();
@@ -123,7 +123,7 @@ var PointerA11yTimeout = class PointerA11yTimeout {
global.display.set_cursor(Meta.Cursor.CROSSHAIR); global.display.set_cursor(Meta.Cursor.CROSSHAIR);
}); });
seat.connect('ptr-a11y-timeout-stopped', (o, device, type, clicked) => { manager.connect('ptr-a11y-timeout-stopped', (o, device, type, clicked) => {
if (!clicked) if (!clicked)
this._pieTimer.destroy(); this._pieTimer.destroy();

View File

@@ -305,44 +305,25 @@ class PopupSeparatorMenuItem extends PopupBaseMenuItem {
} }
}); });
var Switch = GObject.registerClass({ var Switch = GObject.registerClass(
Properties: { class Switch extends St.Bin {
'state': GObject.ParamSpec.boolean(
'state', 'state', 'state',
GObject.ParamFlags.READWRITE,
false),
},
}, class Switch extends St.Bin {
_init(state) { _init(state) {
this._state = false; super._init({ style_class: 'toggle-switch',
accessible_role: Atk.Role.CHECK_BOX,
super._init({ can_focus: true });
style_class: 'toggle-switch', this.setToggleState(state);
accessible_role: Atk.Role.CHECK_BOX,
can_focus: true,
state,
});
} }
get state() { setToggleState(state) {
return this._state;
}
set state(state) {
if (this._state === state)
return;
if (state) if (state)
this.add_style_pseudo_class('checked'); this.add_style_pseudo_class('checked');
else else
this.remove_style_pseudo_class('checked'); this.remove_style_pseudo_class('checked');
this.state = state;
this._state = state;
this.notify('state');
} }
toggle() { toggle() {
this.state = !this.state; this.setToggleState(!this.state);
} }
}); });
@@ -412,7 +393,7 @@ var PopupSwitchMenuItem = GObject.registerClass({
} }
setToggleState(state) { setToggleState(state) {
this._switch.state = state; this._switch.setToggleState(state);
this.checkAccessibleState(); this.checkAccessibleState();
} }

View File

@@ -3,7 +3,6 @@
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Dialog = imports.ui.dialog;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
@@ -19,13 +18,13 @@ const TERMINAL_SCHEMA = 'org.gnome.desktop.default-applications.terminal';
const EXEC_KEY = 'exec'; const EXEC_KEY = 'exec';
const EXEC_ARG_KEY = 'exec-arg'; const EXEC_ARG_KEY = 'exec-arg';
var DIALOG_GROW_TIME = 100;
var RunDialog = GObject.registerClass( var RunDialog = GObject.registerClass(
class RunDialog extends ModalDialog.ModalDialog { class RunDialog extends ModalDialog.ModalDialog {
_init() { _init() {
super._init({ super._init({ styleClass: 'run-dialog',
styleClass: 'run-dialog', destroyOnClose: false });
destroyOnClose: false,
});
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA }); this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA });
@@ -55,41 +54,58 @@ class RunDialog extends ModalDialog.ModalDialog {
}, },
}; };
let title = _('Run a Command'); let label = new St.Label({ style_class: 'run-dialog-label',
text: _("Enter a Command") });
let content = new Dialog.MessageDialogContent({ title }); this.contentLayout.add_child(label);
this.contentLayout.add_actor(content);
let entry = new St.Entry({ let entry = new St.Entry({ style_class: 'run-dialog-entry',
style_class: 'run-dialog-entry', can_focus: true });
can_focus: true,
});
ShellEntry.addContextMenu(entry); ShellEntry.addContextMenu(entry);
entry.label_actor = label;
this._entryText = entry.clutter_text; this._entryText = entry.clutter_text;
content.add_child(entry); this.contentLayout.add_child(entry);
this.setInitialKeyFocus(this._entryText); this.setInitialKeyFocus(this._entryText);
let defaultDescriptionText = _('Press ESC to close'); this._errorBox = new St.BoxLayout({ style_class: 'run-dialog-error-box' });
this._descriptionLabel = new St.Label({ this.contentLayout.add_child(this._errorBox);
style_class: 'run-dialog-description',
text: defaultDescriptionText, let errorIcon = new St.Icon({ icon_name: 'dialog-error-symbolic',
}); icon_size: 24,
content.add_child(this._descriptionLabel); style_class: 'run-dialog-error-icon',
y_align: Clutter.ActorAlign.CENTER });
this._errorBox.add_child(errorIcon);
this._commandError = false; this._commandError = false;
this._errorMessage = new St.Label({
style_class: 'run-dialog-error-label',
y_align: Clutter.ActorAlign.CENTER,
});
this._errorMessage.clutter_text.line_wrap = true;
this._errorBox.add_child(this._errorMessage);
this._errorBox.hide();
this.setButtons([{
action: this.close.bind(this),
label: _("Close"),
key: Clutter.KEY_Escape,
}]);
this._pathCompleter = new Gio.FilenameCompleter(); this._pathCompleter = new Gio.FilenameCompleter();
this._history = new History.HistoryManager({ this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
gsettingsKey: HISTORY_KEY, entry: this._entryText });
entry: this._entryText,
});
this._entryText.connect('activate', o => { this._entryText.connect('activate', o => {
this.popModal(); this.popModal();
this._run(o.get_text(), this._run(o.get_text(),
Clutter.get_current_event().get_state() & Clutter.ModifierType.CONTROL_MASK); Clutter.get_current_event().get_state() & Clutter.ModifierType.CONTROL_MASK);
if (!this._commandError || if (!this._commandError ||
!this.pushModal()) !this.pushModal())
this.close(); this.close();
@@ -112,18 +128,6 @@ class RunDialog extends ModalDialog.ModalDialog {
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });
this._entryText.connect('text-changed', () => {
this._descriptionLabel.set_text(defaultDescriptionText);
});
}
vfunc_key_release_event(event) {
if (event.keyval === Clutter.KEY_Escape) {
this.close();
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
} }
_getCommandCompletion(text) { _getCommandCompletion(text) {
@@ -212,7 +216,7 @@ class RunDialog extends ModalDialog.ModalDialog {
let file = Gio.file_new_for_path(path); let file = Gio.file_new_for_path(path);
try { try {
Gio.app_info_launch_default_for_uri(file.get_uri(), Gio.app_info_launch_default_for_uri(file.get_uri(),
global.create_app_launch_context(0, -1)); global.create_app_launch_context(0, -1));
} catch (err) { } catch (err) {
// The exception from gjs contains an error string like: // The exception from gjs contains an error string like:
// Error invoking Gio.app_info_launch_default_for_uri: No application // Error invoking Gio.app_info_launch_default_for_uri: No application
@@ -230,7 +234,24 @@ class RunDialog extends ModalDialog.ModalDialog {
_showError(message) { _showError(message) {
this._commandError = true; this._commandError = true;
this._descriptionLabel.set_text(message);
this._errorMessage.set_text(message);
if (!this._errorBox.visible) {
let [, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1);
let parentActor = this._errorBox.get_parent();
let height = parentActor.height + errorBoxNaturalHeight;
parentActor.ease({
height,
duration: DIALOG_GROW_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
parentActor.set_height(-1);
this._errorBox.show();
},
});
}
} }
_restart() { _restart() {
@@ -245,6 +266,7 @@ class RunDialog extends ModalDialog.ModalDialog {
open() { open() {
this._history.lastItem(); this._history.lastItem();
this._errorBox.hide();
this._entryText.set_text(''); this._entryText.set_text('');
this._commandError = false; this._commandError = false;

View File

@@ -5,10 +5,8 @@
const { Gio, GLib, Meta, Shell } = imports.gi; const { Gio, GLib, Meta, Shell } = imports.gi;
const Config = imports.misc.config;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const Util = imports.misc.util;
const { loadInterfaceXML } = imports.misc.fileUtils; const { loadInterfaceXML } = imports.misc.fileUtils;
@@ -79,12 +77,6 @@ function _getPerfHelper() {
return _perfHelper; return _perfHelper;
} }
function _spawnPerfHelper() {
let path = Config.LIBEXECDIR;
let command = `${path}/gnome-shell-perf-helper`;
Util.trySpawnCommandLine(command);
}
function _callRemote(obj, method, ...args) { function _callRemote(obj, method, ...args) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
args.push((result, excp) => { args.push((result, excp) => {
@@ -284,25 +276,6 @@ function _collect(scriptModule, outputFile) {
} }
} }
async function _runPerfScript(scriptModule, outputFile) {
for (let step of scriptModule.run()) {
try {
await step; // eslint-disable-line no-await-in-loop
} catch (err) {
log(`Script failed: ${err}\n${err.stack}`);
Meta.exit(Meta.ExitCode.ERROR);
}
}
try {
_collect(scriptModule, outputFile);
} catch (err) {
log(`Script failed: ${err}\n${err.stack}`);
Meta.exit(Meta.ExitCode.ERROR);
}
Meta.exit(Meta.ExitCode.SUCCESS);
}
/** /**
* runPerfScript * runPerfScript
* @param {Object} scriptModule: module object with run and finish * @param {Object} scriptModule: module object with run and finish
@@ -344,13 +317,23 @@ async function _runPerfScript(scriptModule, outputFile) {
* After running the script and collecting statistics from the * After running the script and collecting statistics from the
* event log, GNOME Shell will exit. * event log, GNOME Shell will exit.
**/ **/
function runPerfScript(scriptModule, outputFile) { async function runPerfScript(scriptModule, outputFile) {
Shell.PerfLog.get_default().set_enabled(true); Shell.PerfLog.get_default().set_enabled(true);
_spawnPerfHelper();
Gio.bus_watch_name(Gio.BusType.SESSION, for (let step of scriptModule.run()) {
'org.gnome.Shell.PerfHelper', try {
Gio.BusNameWatcherFlags.NONE, await step; // eslint-disable-line no-await-in-loop
() => _runPerfScript(scriptModule, outputFile), } catch (err) {
null); log(`Script failed: ${err}\n${err.stack}`);
Meta.exit(Meta.ExitCode.ERROR);
}
}
try {
_collect(scriptModule, outputFile);
} catch (err) {
log(`Script failed: ${err}\n${err.stack}`);
Meta.exit(Meta.ExitCode.ERROR);
}
Meta.exit(Meta.ExitCode.SUCCESS);
} }

View File

@@ -156,52 +156,36 @@ function addContextMenu(entry, params) {
var CapsLockWarning = GObject.registerClass( var CapsLockWarning = GObject.registerClass(
class CapsLockWarning extends St.Label { class CapsLockWarning extends St.Label {
_init(params) { _init(params) {
let defaultParams = { style_class: 'caps-lock-warning-label' }; let defaultParams = { style_class: 'prompt-dialog-error-label' };
super._init(Object.assign(defaultParams, params)); super._init(Object.assign(defaultParams, params));
this.text = _('Caps lock is on.'); this.text = _('Caps lock is on.');
this.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; this._keymap = Clutter.get_default_backend().get_keymap();
this.clutter_text.line_wrap = true;
let seat = Clutter.get_default_backend().get_default_seat();
this._keymap = seat.get_keymap();
this.connect('notify::mapped', () => { this.connect('notify::mapped', () => {
if (this.is_mapped()) { if (this.is_mapped()) {
this._stateChangedId = this._keymap.connect('state-changed', this.stateChangedId = this._keymap.connect('state-changed',
() => this._sync(true)); this._updateCapsLockWarningOpacity.bind(this));
} else { } else {
this._keymap.disconnect(this._stateChangedId); this._keymap.disconnect(this.stateChangedId);
this._stateChangedId = 0; this.stateChangedId = 0;
} }
this._sync(false); this._updateCapsLockWarningOpacity();
}); });
this.connect('destroy', () => { this.connect('destroy', () => {
if (this._stateChangedId) if (this.stateChangedId > 0)
this._keymap.disconnect(this._stateChangedId); this._keymap.disconnect(this.stateChangedId);
}); });
this.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this.clutter_text.line_wrap = true;
} }
_sync(animate) { _updateCapsLockWarningOpacity() {
let capsLockOn = this._keymap.get_caps_lock_state(); let capsLockOn = this._keymap.get_caps_lock_state();
this.opacity = capsLockOn ? 255 : 0;
this.remove_all_transitions();
this.natural_height_set = false;
let [, height] = this.get_preferred_height(-1);
this.natural_height_set = true;
this.ease({
height: capsLockOn ? height : 0,
opacity: capsLockOn ? 255 : 0,
duration: animate ? 200 : 0,
onComplete: () => {
if (capsLockOn)
this.height = -1;
},
});
} }
}); });

View File

@@ -20,23 +20,18 @@ var WORK_SPINNER_ICON_SIZE = 16;
const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password'; const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password';
/* ------ Common Utils ------- */ /* ------ Common Utils ------- */
function _setButtonsForChoices(dialog, oldChoices, choices) { function _setButtonsForChoices(dialog, choices) {
let buttons = []; let buttons = [];
let buttonsChanged = oldChoices.length !== choices.length;
for (let idx = 0; idx < choices.length; idx++) { for (let idx = 0; idx < choices.length; idx++) {
let button = idx; let button = idx;
buttonsChanged = buttonsChanged || oldChoices[idx] !== choices[idx];
buttons.unshift({ buttons.unshift({
label: choices[idx], label: choices[idx],
action: () => dialog.emit('response', button), action: () => dialog.emit('response', button),
}); });
} }
if (buttonsChanged) dialog.setButtons(buttons);
dialog.setButtons(buttons);
} }
function _setLabelsForMessage(content, message) { function _setLabelsForMessage(content, message) {
@@ -48,6 +43,41 @@ function _setLabelsForMessage(content, message) {
/* -------------------------------------------------------- */ /* -------------------------------------------------------- */
var ListItem = GObject.registerClass({
Signals: { 'activate': {} },
}, class ListItem extends St.Button {
_init(app) {
let layout = new St.BoxLayout({ vertical: false });
super._init({
style_class: 'mount-dialog-app-list-item',
can_focus: true,
child: layout,
reactive: true,
});
this._app = app;
this._icon = this._app.create_icon_texture(LIST_ITEM_ICON_SIZE);
let iconBin = new St.Bin({ style_class: 'mount-dialog-app-list-item-icon',
child: this._icon });
layout.add(iconBin);
this._nameLabel = new St.Label({
text: this._app.get_name(),
style_class: 'mount-dialog-app-list-item-name',
y_align: Clutter.ActorAlign.CENTER,
});
let labelBin = new St.Bin({ child: this._nameLabel });
layout.add(labelBin);
}
vfunc_clicked() {
this.emit('activate');
this._app.activate();
}
});
var ShellMountOperation = class { var ShellMountOperation = class {
constructor(source, params) { constructor(source, params) {
params = Params.parse(params, { existingDialog: null }); params = Params.parse(params, { existingDialog: null });
@@ -228,27 +258,15 @@ var ShellMountQuestionDialog = GObject.registerClass({
Signals: { 'response': { param_types: [GObject.TYPE_INT] } }, Signals: { 'response': { param_types: [GObject.TYPE_INT] } },
}, class ShellMountQuestionDialog extends ModalDialog.ModalDialog { }, class ShellMountQuestionDialog extends ModalDialog.ModalDialog {
_init() { _init() {
super._init({ styleClass: 'mount-question-dialog' }); super._init({ styleClass: 'mount-dialog' });
this._oldChoices = [];
this._content = new Dialog.MessageDialogContent(); this._content = new Dialog.MessageDialogContent();
this.contentLayout.add_child(this._content); this.contentLayout.add_child(this._content);
} }
vfunc_key_release_event(event) {
if (event.keyval === Clutter.KEY_Escape) {
this.emit('response', -1);
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
}
update(message, choices) { update(message, choices) {
_setLabelsForMessage(this._content, message); _setLabelsForMessage(this._content, message);
_setButtonsForChoices(this, this._oldChoices, choices); _setButtonsForChoices(this, choices);
this._oldChoices = choices;
} }
}); });
@@ -478,30 +496,38 @@ var ShellProcessesDialog = GObject.registerClass({
Signals: { 'response': { param_types: [GObject.TYPE_INT] } }, Signals: { 'response': { param_types: [GObject.TYPE_INT] } },
}, class ShellProcessesDialog extends ModalDialog.ModalDialog { }, class ShellProcessesDialog extends ModalDialog.ModalDialog {
_init() { _init() {
super._init({ styleClass: 'processes-dialog' }); super._init({ styleClass: 'mount-dialog' });
this._oldChoices = [];
this._content = new Dialog.MessageDialogContent(); this._content = new Dialog.MessageDialogContent();
this.contentLayout.add_child(this._content); this.contentLayout.add_child(this._content);
this._applicationSection = new Dialog.ListSection(); let scrollView = new St.ScrollView({
this._applicationSection.hide(); style_class: 'mount-dialog-app-list',
this.contentLayout.add_child(this._applicationSection); x_expand: true,
} y_expand: true,
});
scrollView.set_policy(St.PolicyType.NEVER,
St.PolicyType.AUTOMATIC);
this.contentLayout.add_child(scrollView);
scrollView.hide();
vfunc_key_release_event(event) { this._applicationList = new St.BoxLayout({ vertical: true });
if (event.keyval === Clutter.KEY_Escape) { scrollView.add_actor(this._applicationList);
this.emit('response', -1);
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE; this._applicationList.connect('actor-added', () => {
if (this._applicationList.get_n_children() == 1)
scrollView.show();
});
this._applicationList.connect('actor-removed', () => {
if (this._applicationList.get_n_children() == 0)
scrollView.hide();
});
} }
_setAppsForPids(pids) { _setAppsForPids(pids) {
// remove all the items // remove all the items
this._applicationSection.list.destroy_all_children(); this._applicationList.destroy_all_children();
pids.forEach(pid => { pids.forEach(pid => {
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
@@ -510,22 +536,20 @@ var ShellProcessesDialog = GObject.registerClass({
if (!app) if (!app)
return; return;
let listItem = new Dialog.ListSectionItem({ let item = new ListItem(app);
icon_actor: app.create_icon_texture(LIST_ITEM_ICON_SIZE), this._applicationList.add_child(item);
title: app.get_name(),
});
this._applicationSection.list.add_child(listItem);
});
this._applicationSection.visible = item.connect('activate', () => {
this._applicationSection.list.get_n_children() > 0; // use -1 to indicate Cancel
this.emit('response', -1);
});
});
} }
update(message, processes, choices) { update(message, processes, choices) {
this._setAppsForPids(processes); this._setAppsForPids(processes);
_setLabelsForMessage(this._content, message); _setLabelsForMessage(this._content, message);
_setButtonsForChoices(this, this._oldChoices, choices); _setButtonsForChoices(this, choices);
this._oldChoices = choices;
} }
}); });
@@ -677,17 +701,8 @@ var GnomeShellMountOpHandler = class {
this._dialog = new ShellMountQuestionDialog(message); this._dialog = new ShellMountQuestionDialog(message);
this._dialog.connect('response', (object, choice) => { this._dialog.connect('response', (object, choice) => {
let response; this._clearCurrentRequest(Gio.MountOperationResult.HANDLED,
let details = {}; { choice: GLib.Variant.new('i', choice) });
if (choice == -1) {
response = Gio.MountOperationResult.ABORTED;
} else {
response = Gio.MountOperationResult.HANDLED;
details['choice'] = GLib.Variant.new('i', choice);
}
this._clearCurrentRequest(response, details);
}); });
this._dialog.update(message, choices); this._dialog.update(message, choices);

View File

@@ -48,8 +48,8 @@ class DwellClickIndicator extends PanelMenu.Button {
this._a11ySettings.connect(`changed::${KEY_DWELL_CLICK_ENABLED}`, this._syncMenuVisibility.bind(this)); this._a11ySettings.connect(`changed::${KEY_DWELL_CLICK_ENABLED}`, this._syncMenuVisibility.bind(this));
this._a11ySettings.connect(`changed::${KEY_DWELL_MODE}`, this._syncMenuVisibility.bind(this)); this._a11ySettings.connect(`changed::${KEY_DWELL_MODE}`, this._syncMenuVisibility.bind(this));
this._seat = Clutter.get_default_backend().get_default_seat(); this._deviceManager = Clutter.DeviceManager.get_default();
this._seat.connect('ptr-a11y-dwell-click-type-changed', this._updateClickType.bind(this)); this._deviceManager.connect('ptr-a11y-dwell-click-type-changed', this._updateClickType.bind(this));
this._addDwellAction(DWELL_CLICK_MODES.primary); this._addDwellAction(DWELL_CLICK_MODES.primary);
this._addDwellAction(DWELL_CLICK_MODES.double); this._addDwellAction(DWELL_CLICK_MODES.double);
@@ -80,7 +80,7 @@ class DwellClickIndicator extends PanelMenu.Button {
} }
_setClickType(mode) { _setClickType(mode) {
this._seat.set_pointer_a11y_dwell_click_type(mode.type); this._deviceManager.set_pointer_a11y_dwell_click_type(mode.type);
this._icon.icon_name = mode.icon; this._icon.icon_name = mode.icon;
} }
}); });

View File

@@ -347,30 +347,22 @@ var AppAuthorizer = class {
var GeolocationDialog = GObject.registerClass({ var GeolocationDialog = GObject.registerClass({
Signals: { 'response': { param_types: [GObject.TYPE_UINT] } }, Signals: { 'response': { param_types: [GObject.TYPE_UINT] } },
}, class GeolocationDialog extends ModalDialog.ModalDialog { }, class GeolocationDialog extends ModalDialog.ModalDialog {
_init(name, reason, reqAccuracyLevel) { _init(name, description, reqAccuracyLevel) {
super._init({ styleClass: 'geolocation-dialog' }); super._init({ styleClass: 'geolocation-dialog' });
this.reqAccuracyLevel = reqAccuracyLevel; this.reqAccuracyLevel = reqAccuracyLevel;
let content = new Dialog.MessageDialogContent({ /* Translators: %s is an application name */
title: _('Allow location access'), let title = _("Give %s access to your location?").format(name);
/* Translators: %s is an application name */
description: _('The app %s wants to access your location').format(name),
});
let reasonLabel = new St.Label({ let content = new Dialog.MessageDialogContent({ title, description });
text: reason, this.contentLayout.add_actor(content);
style_class: 'message-dialog-description',
});
content.add_child(reasonLabel);
let infoLabel = new St.Label({ let infoLabel = new St.Label({
text: _('Location access can be changed at any time from the privacy settings.'), text: _('Location access can be changed at any time from the privacy settings.'),
style_class: 'message-dialog-description', x_align: Clutter.ActorAlign.CENTER,
}); });
content.add_child(infoLabel); content.add_child(infoLabel);
this.contentLayout.add_child(content);
let button = this.addButton({ label: _("Deny Access"), let button = this.addButton({ label: _("Deny Access"),
action: this._onDenyClicked.bind(this), action: this._onDenyClicked.bind(this),
key: Clutter.KEY_Escape }); key: Clutter.KEY_Escape });

View File

@@ -54,10 +54,8 @@ class Indicator extends PanelMenu.SystemIndicator {
let bindFlags = GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE; let bindFlags = GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE;
let item; let item;
item = new PopupMenu.PopupImageMenuItem( item = new PopupMenu.PopupImageMenuItem(_('Lock Screen Rotation'),
this._systemActions.getName('lock-orientation'),
this._systemActions.orientation_lock_icon); this._systemActions.orientation_lock_icon);
item.connect('activate', () => { item.connect('activate', () => {
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
this._systemActions.activateLockOrientation(); this._systemActions.activateLockOrientation();
@@ -70,10 +68,7 @@ class Indicator extends PanelMenu.SystemIndicator {
bindFlags); bindFlags);
this._systemActions.connect('notify::orientation-lock-icon', () => { this._systemActions.connect('notify::orientation-lock-icon', () => {
let iconName = this._systemActions.orientation_lock_icon; let iconName = this._systemActions.orientation_lock_icon;
let labelText = this._systemActions.getName("lock-orientation");
this._orientationLockItem.setIcon(iconName); this._orientationLockItem.setIcon(iconName);
this._orientationLockItem.label.text = labelText;
}); });
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(

View File

@@ -426,14 +426,7 @@ class WorkspacesDisplay extends St.Widget {
this._swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this)); this._swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this));
this._swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this)); this._swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this));
this._swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this)); this._swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this));
this.connect('notify::mapped', this._updateSwipeTracker.bind(this)); this.bind_property('mapped', this._swipeTracker, 'enabled', GObject.BindingFlags.SYNC_CREATE);
this._windowDragBeginId =
Main.overview.connect('window-drag-begin',
this._windowDragBegin.bind(this));
this._windowDragEndId =
Main.overview.connect('window-drag-begin',
this._windowDragEnd.bind(this));
this._primaryIndex = Main.layoutManager.primaryIndex; this._primaryIndex = Main.layoutManager.primaryIndex;
this._workspacesViews = []; this._workspacesViews = [];
@@ -450,7 +443,6 @@ class WorkspacesDisplay extends St.Widget {
this._scrollTimeoutId = 0; this._scrollTimeoutId = 0;
this._fullGeometry = null; this._fullGeometry = null;
this._inWindowDrag = false;
this._gestureActive = false; // touch(pad) gestures this._gestureActive = false; // touch(pad) gestures
this._canScroll = true; // limiting scrolling speed this._canScroll = true; // limiting scrolling speed
@@ -478,22 +470,6 @@ class WorkspacesDisplay extends St.Widget {
global.window_manager.disconnect(this._switchWorkspaceId); global.window_manager.disconnect(this._switchWorkspaceId);
global.workspace_manager.disconnect(this._reorderWorkspacesdId); global.workspace_manager.disconnect(this._reorderWorkspacesdId);
Main.overview.disconnect(this._windowDragBeginId);
Main.overview.disconnect(this._windowDragEndId);
}
_windowDragBegin() {
this._inWindowDrag = true;
this._updateSwipeTracker();
}
_windowDragEnd() {
this._inWindowDrag = false;
this._updateSwipeTracker();
}
_updateSwipeTracker() {
this._swipeTracker.enabled = this.mapped && !this._inWindowDrag;
} }
_workspacesReordered() { _workspacesReordered() {

View File

@@ -57,7 +57,6 @@ convertdir = join_paths(datadir, 'GConf', 'gsettings')
desktopdir = join_paths(datadir, 'applications') desktopdir = join_paths(datadir, 'applications')
ifacedir = join_paths(datadir, 'dbus-1', 'interfaces') ifacedir = join_paths(datadir, 'dbus-1', 'interfaces')
localedir = join_paths(datadir, 'locale') localedir = join_paths(datadir, 'locale')
portaldir = join_paths(datadir, 'xdg-desktop-portal', 'portals')
schemadir = join_paths(datadir, 'glib-2.0', 'schemas') schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
servicedir = join_paths(datadir, 'dbus-1', 'services') servicedir = join_paths(datadir, 'dbus-1', 'services')

View File

@@ -12,7 +12,6 @@ js/gdm/util.js
js/misc/systemActions.js js/misc/systemActions.js
js/misc/util.js js/misc/util.js
js/portalHelper/main.js js/portalHelper/main.js
js/ui/accessDialog.js
js/ui/appDisplay.js js/ui/appDisplay.js
js/ui/appFavorites.js js/ui/appFavorites.js
js/ui/audioDeviceSelection.js js/ui/audioDeviceSelection.js

306
po/ca.po
View File

@@ -10,8 +10,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: HEAD\n" "Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-01-25 01:15+0000\n" "POT-Creation-Date: 2019-12-27 13:16+0000\n"
"PO-Revision-Date: 2020-01-26 10:07+0100\n" "PO-Revision-Date: 2020-01-03 22:58+0100\n"
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n" "Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Language: ca\n" "Language: ca\n"
@@ -46,7 +46,7 @@ msgid "Open the application menu"
msgstr "Obre el menú d'aplicació" msgstr "Obre el menú d'aplicació"
#: data/gnome-shell-extension-prefs.desktop.in.in:4 #: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:209 #: js/extensionPrefs/main.js:210
msgid "Shell Extensions" msgid "Shell Extensions"
msgstr "Extensions del Shell" msgstr "Extensions del Shell"
@@ -415,11 +415,11 @@ msgstr ""
msgid "Network Login" msgid "Network Login"
msgstr "Inici de sessió de xarxa" msgstr "Inici de sessió de xarxa"
#: js/extensionPrefs/main.js:102 js/extensionPrefs/main.js:525 #: js/extensionPrefs/main.js:103 js/extensionPrefs/main.js:526
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Alguna cosa ha anat malament" msgstr "Alguna cosa ha anat malament"
#: js/extensionPrefs/main.js:109 #: js/extensionPrefs/main.js:110
msgid "" msgid ""
"Were very sorry, but theres been a problem: the settings for this " "Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the " "extension cant be displayed. We recommend that you report the issue to the "
@@ -428,27 +428,27 @@ msgstr ""
"Hi ha un problema: no es poden mostrar els paràmetres per a aquesta " "Hi ha un problema: no es poden mostrar els paràmetres per a aquesta "
"extensió. Us recomanem que informeu del problema als autors de l'extensió." "extensió. Us recomanem que informeu del problema als autors de l'extensió."
#: js/extensionPrefs/main.js:116 #: js/extensionPrefs/main.js:117
msgid "Technical Details" msgid "Technical Details"
msgstr "Detalls tècnics" msgstr "Detalls tècnics"
#: js/extensionPrefs/main.js:151 #: js/extensionPrefs/main.js:152
msgid "Copy Error" msgid "Copy Error"
msgstr "Copia l'error" msgstr "Copia l'error"
#: js/extensionPrefs/main.js:178 #: js/extensionPrefs/main.js:179
msgid "Homepage" msgid "Homepage"
msgstr "Pàgina d'inici" msgstr "Pàgina d'inici"
#: js/extensionPrefs/main.js:179 #: js/extensionPrefs/main.js:180
msgid "Visit extension homepage" msgid "Visit extension homepage"
msgstr "Visiteu la pàgina d'inici de l'extensió" msgstr "Visiteu la pàgina d'inici de l'extensió"
#: js/extensionPrefs/main.js:467 #: js/extensionPrefs/main.js:468
msgid "No Extensions Installed" msgid "No Extensions Installed"
msgstr "No hi ha cap extensió instal·lada" msgstr "No hi ha cap extensió instal·lada"
#: js/extensionPrefs/main.js:477 #: js/extensionPrefs/main.js:478
msgid "" msgid ""
"Extensions can be installed through Software or <a href=\"https://extensions." "Extensions can be installed through Software or <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>." "gnome.org\">extensions.gnome.org</a>."
@@ -456,11 +456,11 @@ msgstr ""
"Les extensions es poden instal·lar amb el Programari o a <a href=\"https://" "Les extensions es poden instal·lar amb el Programari o a <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>." "extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/main.js:492 #: js/extensionPrefs/main.js:493
msgid "Browse in Software" msgid "Browse in Software"
msgstr "Navega al Programari" msgstr "Navega al Programari"
#: js/extensionPrefs/main.js:532 #: js/extensionPrefs/main.js:533
msgid "" msgid ""
"Were very sorry, but it was not possible to get the list of installed " "Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again." "extensions. Make sure you are logged into GNOME and try again."
@@ -469,9 +469,9 @@ msgstr ""
"heu entrat al GNOME i torneu a provar-ho." "heu entrat al GNOME i torneu a provar-ho."
#: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:129 js/ui/components/polkitAgent.js:138 #: js/ui/components/networkAgent.js:130 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:190 #: js/ui/endSessionDialog.js:445 js/ui/extensionDownloader.js:190
#: js/ui/shellMountOperation.js:399 js/ui/shellMountOperation.js:409 #: js/ui/shellMountOperation.js:402 js/ui/shellMountOperation.js:412
#: js/ui/status/network.js:910 #: js/ui/status/network.js:910
msgid "Cancel" msgid "Cancel"
msgstr "Cancel·la" msgstr "Cancel·la"
@@ -480,7 +480,7 @@ msgstr "Cancel·la"
msgid "Next" msgid "Next"
msgstr "Següent" msgstr "Següent"
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:403 #: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:406
#: js/ui/unlockDialog.js:44 #: js/ui/unlockDialog.js:44
msgid "Unlock" msgid "Unlock"
msgstr "Desbloqueja" msgstr "Desbloqueja"
@@ -508,8 +508,8 @@ msgstr "(p. ex. l'usuari o %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256 #: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:257
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297 #: js/ui/components/networkAgent.js:280 js/ui/components/networkAgent.js:298
msgid "Username: " msgid "Username: "
msgstr "Nom d'usuari:" msgstr "Nom d'usuari:"
@@ -538,7 +538,7 @@ msgstr "Apaga"
#. Translators: A list of keywords that match the power-off action, separated by semicolons #. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92 #: js/misc/systemActions.js:92
msgid "power off;shutdown;reboot;restart;halt;stop" msgid "power off;shutdown;reboot;restart"
msgstr "apaga;atura;reinicia" msgstr "apaga;atura;reinicia"
#. Translators: The name of the lock screen action in search #. Translators: The name of the lock screen action in search
@@ -749,52 +749,56 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option #. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true; #. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:366 #: js/ui/accessDialog.js:39 js/ui/status/location.js:364
msgid "Deny Access" msgid "Deny Access"
msgstr "Denega l'accés" msgstr "Denega l'accés"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:369 #: js/ui/accessDialog.js:40 js/ui/status/location.js:367
msgid "Grant Access" msgid "Grant Access"
msgstr "Permet l'accés" msgstr "Permet l'accés"
#: js/ui/appDisplay.js:904 #: js/ui/appDisplay.js:921
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Carpeta sense nom" msgstr "Carpeta sense nom"
#: js/ui/appDisplay.js:927 #: js/ui/appDisplay.js:944
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Les aplicacions utilitzades freqüentment apareixeran aquí" msgstr "Les aplicacions utilitzades freqüentment apareixeran aquí"
#: js/ui/appDisplay.js:1062 #: js/ui/appDisplay.js:1079
msgid "Frequent" msgid "Frequent"
msgstr "Freqüent" msgstr "Freqüent"
#: js/ui/appDisplay.js:1069 #: js/ui/appDisplay.js:1086
msgid "All" msgid "All"
msgstr "Totes" msgstr "Totes"
#: js/ui/appDisplay.js:1861
msgid "Rename"
msgstr "Canvia el nom"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2452 js/ui/panel.js:75 #: js/ui/appDisplay.js:2549 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Obre finestres" msgstr "Obre finestres"
#: js/ui/appDisplay.js:2472 js/ui/panel.js:82 #: js/ui/appDisplay.js:2569 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Finestra nova" msgstr "Finestra nova"
#: js/ui/appDisplay.js:2483 #: js/ui/appDisplay.js:2580
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Inicia usant una targeta gràfica dedicada" msgstr "Inicia usant una targeta gràfica dedicada"
#: js/ui/appDisplay.js:2511 js/ui/dash.js:239 #: js/ui/appDisplay.js:2608 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Suprimeix dels preferits" msgstr "Suprimeix dels preferits"
#: js/ui/appDisplay.js:2517 #: js/ui/appDisplay.js:2614
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Afegeix als preferits" msgstr "Afegeix als preferits"
#: js/ui/appDisplay.js:2527 js/ui/panel.js:93 #: js/ui/appDisplay.js:2624 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Mostra els detalls" msgstr "Mostra els detalls"
@@ -841,7 +845,7 @@ msgid "Settings"
msgstr "Paràmetres" msgstr "Paràmetres"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41 #: js/ui/calendar.js:40
msgctxt "calendar-no-work" msgctxt "calendar-no-work"
msgid "06" msgid "06"
msgstr "06" msgstr "06"
@@ -851,43 +855,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: js/ui/calendar.js:70 #: js/ui/calendar.js:69
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "Dg" msgstr "Dg"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72 #: js/ui/calendar.js:71
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "Dl" msgstr "Dl"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74 #: js/ui/calendar.js:73
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "Dt" msgstr "Dt"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76 #: js/ui/calendar.js:75
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "Dc" msgstr "Dc"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78 #: js/ui/calendar.js:77
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "Dj" msgstr "Dj"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80 #: js/ui/calendar.js:79
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "Dv" msgstr "Dv"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82 #: js/ui/calendar.js:81
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "Ds" msgstr "Ds"
@@ -898,7 +902,7 @@ msgstr "Ds"
#. * "%OB" is the new format specifier introduced in glibc 2.27, #. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it. #. * in most cases you should not change it.
#. #.
#: js/ui/calendar.js:371 #: js/ui/calendar.js:370
msgid "%OB" msgid "%OB"
msgstr "%OB" msgstr "%OB"
@@ -911,61 +915,55 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you #. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing. #. * absolutely know what you are doing.
#. #.
#: js/ui/calendar.js:381 #: js/ui/calendar.js:380
msgid "%OB %Y" msgid "%OB %Y"
msgstr "%OB de %Y" msgstr "%OB de %Y"
#: js/ui/calendar.js:440 #: js/ui/calendar.js:439
msgid "Previous month" msgid "Previous month"
msgstr "Mes anterior" msgstr "Mes anterior"
#: js/ui/calendar.js:455 #: js/ui/calendar.js:454
msgid "Next month" msgid "Next month"
msgstr "Mes següent" msgstr "Mes següent"
#: js/ui/calendar.js:605 #: js/ui/calendar.js:604
#, no-javascript-format #, no-javascript-format
msgctxt "date day number format" msgctxt "date day number format"
msgid "%d" msgid "%d"
msgstr "%-d" msgstr "%-d"
#: js/ui/calendar.js:661 #: js/ui/calendar.js:660
msgid "Week %V" msgid "Week %V"
msgstr "Setmana %-V" msgstr "Setmana %-V"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: js/ui/calendar.js:730 #: js/ui/calendar.js:729
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Tot el dia" msgstr "Tot el dia"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:867 #: js/ui/calendar.js:867
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d" msgid "%A, %B %-d"
msgstr "%A %-d %B" msgstr "%A %-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #: js/ui/calendar.js:871
#: js/ui/calendar.js:870
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d, %Y" msgid "%A, %B %-d, %Y"
msgstr "%A %d %B de %Y" msgstr "%A %d %B de %Y"
#: js/ui/calendar.js:1096 #: js/ui/calendar.js:1097
msgid "No Notifications" msgid "No Notifications"
msgstr "Cap notificació" msgstr "Cap notificació"
#: js/ui/calendar.js:1099 #: js/ui/calendar.js:1100
msgid "No Events" msgid "No Events"
msgstr "Cap cita" msgstr "Cap cita"
#: js/ui/calendar.js:1153 #: js/ui/calendar.js:1132
msgid "Do Not Disturb"
msgstr "No molesteu"
#: js/ui/calendar.js:1167
msgid "Clear" msgid "Clear"
msgstr "Neteja-ho" msgstr "Neteja-ho"
@@ -983,11 +981,11 @@ msgstr ""
"Podeu esperar un moment perquè continuï o podeu forçar-ne la sortida " "Podeu esperar un moment perquè continuï o podeu forçar-ne la sortida "
"completa." "completa."
#: js/ui/closeDialog.js:70 #: js/ui/closeDialog.js:71
msgid "Force Quit" msgid "Force Quit"
msgstr "Força la sortida" msgstr "Força la sortida"
#: js/ui/closeDialog.js:73 #: js/ui/closeDialog.js:74
msgid "Wait" msgid "Wait"
msgstr "Espera" msgstr "Espera"
@@ -1013,53 +1011,53 @@ msgstr ""
msgid "Open with %s" msgid "Open with %s"
msgstr "Obre amb %s" msgstr "Obre amb %s"
#: js/ui/components/keyring.js:70 js/ui/components/polkitAgent.js:278 #: js/ui/components/keyring.js:71 js/ui/components/polkitAgent.js:279
msgid "Password:" msgid "Password:"
msgstr "Contrasenya:" msgstr "Contrasenya:"
#: js/ui/components/keyring.js:104 #: js/ui/components/keyring.js:105
msgid "Type again:" msgid "Type again:"
msgstr "Torneu a escriure-la:" msgstr "Torneu a escriure-la:"
#: js/ui/components/networkAgent.js:115 #: js/ui/components/networkAgent.js:116
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "També us podeu connectar prement el botó «WPS» del vostre encaminador." msgstr "També us podeu connectar prement el botó «WPS» del vostre encaminador."
#: js/ui/components/networkAgent.js:123 js/ui/status/network.js:223 #: js/ui/components/networkAgent.js:124 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:913 #: js/ui/status/network.js:314 js/ui/status/network.js:913
msgid "Connect" msgid "Connect"
msgstr "Connecta" msgstr "Connecta"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:224 js/ui/components/networkAgent.js:236 #: js/ui/components/networkAgent.js:225 js/ui/components/networkAgent.js:237
#: js/ui/components/networkAgent.js:260 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:282
#: js/ui/components/networkAgent.js:301 js/ui/components/networkAgent.js:311 #: js/ui/components/networkAgent.js:302 js/ui/components/networkAgent.js:312
msgid "Password: " msgid "Password: "
msgstr "Contrasenya:" msgstr "Contrasenya:"
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:229 #: js/ui/components/networkAgent.js:230
msgid "Key: " msgid "Key: "
msgstr "Clau:" msgstr "Clau:"
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287 #: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:288
msgid "Private key password: " msgid "Private key password: "
msgstr "Contrasenya de la clau privada:" msgstr "Contrasenya de la clau privada:"
#: js/ui/components/networkAgent.js:285 #: js/ui/components/networkAgent.js:286
msgid "Identity: " msgid "Identity: "
msgstr "Identitat:" msgstr "Identitat:"
#: js/ui/components/networkAgent.js:299 #: js/ui/components/networkAgent.js:300
msgid "Service: " msgid "Service: "
msgstr "Servei:" msgstr "Servei:"
#: js/ui/components/networkAgent.js:328 js/ui/components/networkAgent.js:703 #: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "La xarxa sense fil requereix autenticació" msgstr "La xarxa sense fil requereix autenticació"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704 #: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:705
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@@ -1068,58 +1066,53 @@ msgstr ""
"Per accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus " "Per accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus "
"d'encriptació." "d'encriptació."
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708 #: js/ui/components/networkAgent.js:334 js/ui/components/networkAgent.js:709
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Autenticació 802.1X amb fil" msgstr "Autenticació 802.1X amb fil"
#: js/ui/components/networkAgent.js:335 #: js/ui/components/networkAgent.js:336
msgid "Network name: " msgid "Network name: "
msgstr "Nom de la xarxa: " msgstr "Nom de la xarxa: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:713
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autenticació DSL" msgstr "Autenticació DSL"
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717 #: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
msgid "PIN code required" msgid "PIN code required"
msgstr "Cal que introduïu el codi PIN" msgstr "Cal que introduïu el codi PIN"
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718 #: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:719
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Cal que introduïu el codi PIN del dispositiu de banda ampla mòbil" msgstr "Cal que introduïu el codi PIN del dispositiu de banda ampla mòbil"
#: js/ui/components/networkAgent.js:349 #: js/ui/components/networkAgent.js:350
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:356 js/ui/components/networkAgent.js:724 #: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:725
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Contrasenya de la xarxa de banda ampla mòbil" msgstr "Contrasenya de la xarxa de banda ampla mòbil"
#: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:709 #: js/ui/components/networkAgent.js:358 js/ui/components/networkAgent.js:710
#: js/ui/components/networkAgent.js:713 js/ui/components/networkAgent.js:725 #: js/ui/components/networkAgent.js:714 js/ui/components/networkAgent.js:726
#: js/ui/components/networkAgent.js:729
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Cal introduir una contrasenya per connectar-vos a «%s»." msgstr "Cal introduir una contrasenya per connectar-vos a «%s»."
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688 #: js/ui/components/networkAgent.js:693 js/ui/status/network.js:1688
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de connexions de xarxa" msgstr "Gestor de connexions de xarxa"
#: js/ui/components/networkAgent.js:728 #: js/ui/components/polkitAgent.js:42
msgid "VPN password"
msgstr "Contrasenya VPN"
#: js/ui/components/polkitAgent.js:41
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Cal autenticació" msgstr "Cal autenticació"
#: js/ui/components/polkitAgent.js:81 #: js/ui/components/polkitAgent.js:82
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: js/ui/components/polkitAgent.js:141 #: js/ui/components/polkitAgent.js:142
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentica" msgstr "Autentica"
@@ -1127,7 +1120,7 @@ msgstr "Autentica"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:383 #: js/ui/components/polkitAgent.js:260 js/ui/shellMountOperation.js:386
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "No ha funcionat. Torneu-ho a provar." msgstr "No ha funcionat. Torneu-ho a provar."
@@ -1138,7 +1131,7 @@ msgstr "No ha funcionat. Torneu-ho a provar."
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "En/na %s ara es diu %s" msgstr "En/na %s ara es diu %s"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177 #: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:176
msgid "Windows" msgid "Windows"
msgstr "Finestres" msgstr "Finestres"
@@ -1181,19 +1174,19 @@ msgstr "Rellotges del món"
msgid "Weather" msgid "Weather"
msgstr "El temps" msgstr "El temps"
#: js/ui/dateMenu.js:391 #: js/ui/dateMenu.js:389
msgid "Select a location…" msgid "Select a location…"
msgstr "Trieu una ubicació…" msgstr "Trieu una ubicació…"
#: js/ui/dateMenu.js:404 #: js/ui/dateMenu.js:402
msgid "Loading…" msgid "Loading…"
msgstr "S'està carregant…" msgstr "S'està carregant…"
#: js/ui/dateMenu.js:414 #: js/ui/dateMenu.js:412
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Vés en línia per a informació sobre el temps" msgstr "Vés en línia per a informació sobre el temps"
#: js/ui/dateMenu.js:416 #: js/ui/dateMenu.js:414
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "La informació sobre el temps no està disponible" msgstr "La informació sobre el temps no està disponible"
@@ -1227,56 +1220,56 @@ msgctxt "button"
msgid "Log Out" msgid "Log Out"
msgstr "Surt" msgstr "Surt"
#: js/ui/endSessionDialog.js:56 #: js/ui/endSessionDialog.js:57
msgctxt "title" msgctxt "title"
msgid "Power Off" msgid "Power Off"
msgstr "Apagada" msgstr "Apagada"
#: js/ui/endSessionDialog.js:57 #: js/ui/endSessionDialog.js:58
msgctxt "title" msgctxt "title"
msgid "Install Updates & Power Off" msgid "Install Updates & Power Off"
msgstr "Instal·la les actualitzacions i apaga" msgstr "Instal·la les actualitzacions i apaga"
#: js/ui/endSessionDialog.js:59 #: js/ui/endSessionDialog.js:60
#, javascript-format #, javascript-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "S'apagarà l'ordinador automàticament d'aquí %d segon." msgstr[0] "S'apagarà l'ordinador automàticament d'aquí %d segon."
msgstr[1] "S'apagarà l'ordinador automàticament d'aquí %d segons." msgstr[1] "S'apagarà l'ordinador automàticament d'aquí %d segons."
#: js/ui/endSessionDialog.js:63 #: js/ui/endSessionDialog.js:64
msgctxt "checkbox" msgctxt "checkbox"
msgid "Install pending software updates" msgid "Install pending software updates"
msgstr "Instal·la les actualitzacions pendents" msgstr "Instal·la les actualitzacions pendents"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82 #: js/ui/endSessionDialog.js:67 js/ui/endSessionDialog.js:84
msgctxt "button" msgctxt "button"
msgid "Restart" msgid "Restart"
msgstr "Reinicia" msgstr "Reinicia"
#: js/ui/endSessionDialog.js:68 #: js/ui/endSessionDialog.js:69
msgctxt "button" msgctxt "button"
msgid "Power Off" msgid "Power Off"
msgstr "Apaga" msgstr "Apaga"
#: js/ui/endSessionDialog.js:74 #: js/ui/endSessionDialog.js:76
msgctxt "title" msgctxt "title"
msgid "Restart" msgid "Restart"
msgstr "Reinici" msgstr "Reinici"
#: js/ui/endSessionDialog.js:76 #: js/ui/endSessionDialog.js:78
#, javascript-format #, javascript-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Es reiniciarà l'ordinador automàticament d'aquí %d segon." msgstr[0] "Es reiniciarà l'ordinador automàticament d'aquí %d segon."
msgstr[1] "Es reiniciarà l'ordinador automàticament d'aquí %d segons." msgstr[1] "Es reiniciarà l'ordinador automàticament d'aquí %d segons."
#: js/ui/endSessionDialog.js:89 #: js/ui/endSessionDialog.js:92
msgctxt "title" msgctxt "title"
msgid "Restart & Install Updates" msgid "Restart & Install Updates"
msgstr "Reinicia i instal·la les actualitzacions" msgstr "Reinicia i instal·la les actualitzacions"
#: js/ui/endSessionDialog.js:91 #: js/ui/endSessionDialog.js:94
#, javascript-format #, javascript-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
@@ -1288,22 +1281,22 @@ msgstr[1] ""
"Es reiniciarà l'ordinador automàticament i s'instal·laran les " "Es reiniciarà l'ordinador automàticament i s'instal·laran les "
"actualitzacions d'aquí %d segons." "actualitzacions d'aquí %d segons."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116 #: js/ui/endSessionDialog.js:100 js/ui/endSessionDialog.js:120
msgctxt "button" msgctxt "button"
msgid "Restart &amp; Install" msgid "Restart &amp; Install"
msgstr "Reinicia i instal·la" msgstr "Reinicia i instal·la"
#: js/ui/endSessionDialog.js:98 #: js/ui/endSessionDialog.js:101
msgctxt "button" msgctxt "button"
msgid "Install &amp; Power Off" msgid "Install &amp; Power Off"
msgstr "Instal·la i apaga" msgstr "Instal·la i apaga"
#: js/ui/endSessionDialog.js:99 #: js/ui/endSessionDialog.js:102
msgctxt "checkbox" msgctxt "checkbox"
msgid "Power off after updates are installed" msgid "Power off after updates are installed"
msgstr "Apaga després d'instal·lar les actualitzacions" msgstr "Apaga després d'instal·lar les actualitzacions"
#: js/ui/endSessionDialog.js:106 #: js/ui/endSessionDialog.js:110
msgctxt "title" msgctxt "title"
msgid "Restart & Install Upgrade" msgid "Restart & Install Upgrade"
msgstr "Reinicia i instal·la l'actualització" msgstr "Reinicia i instal·la l'actualització"
@@ -1311,7 +1304,7 @@ msgstr "Reinicia i instal·la l'actualització"
#. Translators: This is the text displayed for system upgrades in the #. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and #. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to #. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111 #: js/ui/endSessionDialog.js:115
#, javascript-format #, javascript-format
msgid "" msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long " "%s %s will be installed after restart. Upgrade installation can take a long "
@@ -1321,30 +1314,30 @@ msgstr ""
"instal·lació pot trigar força temps. Assegureu-vos que heu fet còpia de " "instal·lació pot trigar força temps. Assegureu-vos que heu fet còpia de "
"seguretat i que l'ordinador està connectat al corrent." "seguretat i que l'ordinador està connectat al corrent."
#: js/ui/endSessionDialog.js:259 #: js/ui/endSessionDialog.js:301
msgid "Running on battery power: Please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"S'està utilitzant la bateria. Connecteu l'ordinador a la xarxa elèctrica " "S'està utilitzant la bateria: connecteu l'ordinador a la xarxa elèctrica "
"abans d'instal·lar les actualitzacions." "abans d'instal·lar les actualitzacions."
#: js/ui/endSessionDialog.js:268 #: js/ui/endSessionDialog.js:320
msgid "Some applications are busy or have unsaved work" msgid "Some applications are busy or have unsaved work."
msgstr "" msgstr ""
"Hi ha algunes aplicacions que estan ocupades o que tenen documents sense " "Hi ha algunes aplicacions que estan ocupades o que tenen documents sense "
"desar." "desar."
#: js/ui/endSessionDialog.js:273 #: js/ui/endSessionDialog.js:327
msgid "Other users are logged in" msgid "Other users are logged in."
msgstr "Altres usuaris tenen la sessió oberta" msgstr "Altres usuaris tenen la sessió oberta."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588 #: js/ui/endSessionDialog.js:649
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (remot)" msgstr "%s (remot)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591 #: js/ui/endSessionDialog.js:652
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (consola)" msgstr "%s (consola)"
@@ -1368,16 +1361,16 @@ msgid "Application wants to inhibit shortcuts"
msgstr "L'aplicació vol inhabilitar les dreceres" msgstr "L'aplicació vol inhabilitar les dreceres"
#. Translators: %s is a keyboard shortcut like "Super+x" #. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:89 #: js/ui/inhibitShortcutsDialog.js:90
#, javascript-format #, javascript-format
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Podeu restaurar les dreceres si premeu %s." msgstr "Podeu restaurar les dreceres si premeu %s."
#: js/ui/inhibitShortcutsDialog.js:95 #: js/ui/inhibitShortcutsDialog.js:96
msgid "Deny" msgid "Deny"
msgstr "Denega" msgstr "Denega"
#: js/ui/inhibitShortcutsDialog.js:102 #: js/ui/inhibitShortcutsDialog.js:103
msgid "Allow" msgid "Allow"
msgstr "Permet" msgstr "Permet"
@@ -1425,16 +1418,16 @@ msgstr ""
"Això desactiva la funcionalitat de les tecles enganxoses, que afecta la " "Això desactiva la funcionalitat de les tecles enganxoses, que afecta la "
"manera en què funciona el teclat." "manera en què funciona el teclat."
#: js/ui/kbdA11yDialog.js:57 #: js/ui/kbdA11yDialog.js:58
msgid "Leave On" msgid "Leave On"
msgstr "Deixa-ho actiu" msgstr "Deixa-ho actiu"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:135 #: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:135
#: js/ui/status/network.js:1285 #: js/ui/status/network.js:1285
msgid "Turn On" msgid "Turn On"
msgstr "Activa" msgstr "Activa"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:135 #: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:135
#: js/ui/status/network.js:131 js/ui/status/network.js:315 #: js/ui/status/network.js:131 js/ui/status/network.js:315
#: js/ui/status/network.js:1285 js/ui/status/network.js:1397 #: js/ui/status/network.js:1285 js/ui/status/network.js:1397
#: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81 #: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
@@ -1442,7 +1435,7 @@ msgstr "Activa"
msgid "Turn Off" msgid "Turn Off"
msgstr "Desactiva" msgstr "Desactiva"
#: js/ui/kbdA11yDialog.js:65 #: js/ui/kbdA11yDialog.js:66
msgid "Leave Off" msgid "Leave Off"
msgstr "Deixa-ho desactivat" msgstr "Deixa-ho desactivat"
@@ -1662,11 +1655,11 @@ msgstr "El GNOME necessita bloquejar la pantalla"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:830 js/ui/screenShield.js:1301 #: js/ui/screenShield.js:831 js/ui/screenShield.js:1303
msgid "Unable to lock" msgid "Unable to lock"
msgstr "No es pot blocar" msgstr "No es pot blocar"
#: js/ui/screenShield.js:831 js/ui/screenShield.js:1302 #: js/ui/screenShield.js:832 js/ui/screenShield.js:1304
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Una aplicació està bloquejant el bloqueig" msgstr "Una aplicació està bloquejant el bloqueig"
@@ -1701,60 +1694,60 @@ msgstr "Mostra el text"
msgid "Hide Text" msgid "Hide Text"
msgstr "Oculta el text" msgstr "Oculta el text"
#: js/ui/shellEntry.js:162 #: js/ui/shellEntry.js:161
msgid "Caps lock is on." msgid "Caps lock is on."
msgstr "Bloq Maj està activat." msgstr "Bloq Maj està activat."
#: js/ui/shellMountOperation.js:305 #: js/ui/shellMountOperation.js:308
msgid "Hidden Volume" msgid "Hidden Volume"
msgstr "Volum ocult" msgstr "Volum ocult"
#: js/ui/shellMountOperation.js:308 #: js/ui/shellMountOperation.js:311
msgid "Windows System Volume" msgid "Windows System Volume"
msgstr "Volum del sistema del Windows" msgstr "Volum del sistema del Windows"
#: js/ui/shellMountOperation.js:311 #: js/ui/shellMountOperation.js:314
msgid "Uses Keyfiles" msgid "Uses Keyfiles"
msgstr "Usa fitxers de claus" msgstr "Usa fitxers de claus"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:317 #: js/ui/shellMountOperation.js:320
#, javascript-format #, javascript-format
msgid "" msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead." "To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
msgstr "" msgstr ""
"Per a desbloquejar un volum que usa fitxers de claus, useu l'eina <i>%s</i>." "Per a desbloquejar un volum que usa fitxers de claus, useu l'eina <i>%s</i>."
#: js/ui/shellMountOperation.js:324 #: js/ui/shellMountOperation.js:327
msgid "PIM Number" msgid "PIM Number"
msgstr "Número PIM" msgstr "Número PIM"
#: js/ui/shellMountOperation.js:343 #: js/ui/shellMountOperation.js:346
msgid "The PIM must be a number or empty." msgid "The PIM must be a number or empty."
msgstr "El PIM ha de ser un nombre o estar buit." msgstr "El PIM ha de ser un nombre o estar buit."
#: js/ui/shellMountOperation.js:354 #: js/ui/shellMountOperation.js:357
msgid "Password" msgid "Password"
msgstr "Contrasenya" msgstr "Contrasenya"
#: js/ui/shellMountOperation.js:390 #: js/ui/shellMountOperation.js:393
msgid "Remember Password" msgid "Remember Password"
msgstr "Recorda la contrasenya" msgstr "Recorda la contrasenya"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:414 #: js/ui/shellMountOperation.js:417
#, javascript-format #, javascript-format
msgid "Open %s" msgid "Open %s"
msgstr "Obre %s" msgstr "Obre %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:486 #: js/ui/shellMountOperation.js:489
#, javascript-format #, javascript-format
msgid "Unable to start %s" msgid "Unable to start %s"
msgstr "No es pot iniciar %s" msgstr "No es pot iniciar %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:488 #: js/ui/shellMountOperation.js:491
#, javascript-format #, javascript-format
msgid "Couldnt find the %s application" msgid "Couldnt find the %s application"
msgstr "No s'ha pogut trobar l'aplicació %s" msgstr "No s'ha pogut trobar l'aplicació %s"
@@ -1851,11 +1844,11 @@ msgstr "Clic secundari"
msgid "Dwell Click" msgid "Dwell Click"
msgstr "Clic en passar per sobre" msgstr "Clic en passar per sobre"
#: js/ui/status/keyboard.js:825 #: js/ui/status/keyboard.js:818
msgid "Keyboard" msgid "Keyboard"
msgstr "Teclat" msgstr "Teclat"
#: js/ui/status/keyboard.js:847 #: js/ui/status/keyboard.js:840
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Mostra la disposició del teclat" msgstr "Mostra la disposició del teclat"
@@ -1884,12 +1877,12 @@ msgid "Enable"
msgstr "Habilita" msgstr "Habilita"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:355 #: js/ui/status/location.js:357
#, javascript-format #, javascript-format
msgid "Give %s access to your location?" msgid "Give %s access to your location?"
msgstr "Voleu donar a %s accés a la vostra ubicació?" msgstr "Voleu donar a %s accés a la vostra ubicació?"
#: js/ui/status/location.js:361 #: js/ui/status/location.js:358
msgid "Location access can be changed at any time from the privacy settings." msgid "Location access can be changed at any time from the privacy settings."
msgstr "" msgstr ""
"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu " "Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu "
@@ -2271,11 +2264,11 @@ msgstr "Entra amb un altre usuari"
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Desbloqueja la finestra" msgstr "Desbloqueja la finestra"
#: js/ui/viewSelector.js:181 #: js/ui/viewSelector.js:180
msgid "Applications" msgid "Applications"
msgstr "Aplicacions" msgstr "Aplicacions"
#: js/ui/viewSelector.js:185 #: js/ui/viewSelector.js:184
msgid "Search" msgid "Search"
msgstr "Cerca" msgstr "Cerca"
@@ -2284,22 +2277,22 @@ msgstr "Cerca"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "«%s» ja està a punt" msgstr "«%s» ja està a punt"
#: js/ui/windowManager.js:54 #: js/ui/windowManager.js:57
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "Voleu mantenir aquesta configuració de la pantalla?" msgstr "Voleu mantenir aquesta configuració de la pantalla?"
#. Translators: this and the following message should be limited in length, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:71
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Descarta els canvis" msgstr "Descarta els canvis"
#: js/ui/windowManager.js:71 #: js/ui/windowManager.js:74
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Mantén els canvis" msgstr "Mantén els canvis"
#: js/ui/windowManager.js:89 #: js/ui/windowManager.js:92
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@@ -2308,7 +2301,7 @@ msgstr[1] "Es descartaran els canvis d'aquí %d segons"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546 #: js/ui/windowManager.js:690
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2397,12 +2390,12 @@ msgstr "Utilitza un mode específic, p. ex. «gdm» per la pantalla d'entrada"
msgid "List possible modes" msgid "List possible modes"
msgstr "Llista els modes possibles" msgstr "Llista els modes possibles"
#: src/shell-app.c:279 #: src/shell-app.c:265
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Desconegut" msgstr "Desconegut"
#: src/shell-app.c:530 #: src/shell-app.c:516
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "No s'ha pogut iniciar «%s»" msgstr "No s'ha pogut iniciar «%s»"
@@ -2760,9 +2753,6 @@ msgstr[1] "%u entrades"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sons del sistema" msgstr "Sons del sistema"
#~ msgid "Rename"
#~ msgstr "Canvia el nom"
#~ msgid "Account Settings" #~ msgid "Account Settings"
#~ msgstr "Paràmetres del compte" #~ msgstr "Paràmetres del compte"

365
po/es.po
View File

@@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-01-28 15:54+0000\n" "POT-Creation-Date: 2020-01-09 01:33+0000\n"
"PO-Revision-Date: 2020-01-29 10:33+0100\n" "PO-Revision-Date: 2020-01-09 14:58+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n" "Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
"Language: es_ES\n" "Language: es_ES\n"
@@ -464,9 +464,9 @@ msgstr ""
"ha iniciado sesión en GNOME e inténtelo de nuevo." "ha iniciado sesión en GNOME e inténtelo de nuevo."
#: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:129 js/ui/components/polkitAgent.js:138 #: js/ui/components/networkAgent.js:130 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:190 #: js/ui/endSessionDialog.js:445 js/ui/extensionDownloader.js:190
#: js/ui/shellMountOperation.js:381 js/ui/shellMountOperation.js:391 #: js/ui/shellMountOperation.js:402 js/ui/shellMountOperation.js:412
#: js/ui/status/network.js:910 #: js/ui/status/network.js:910
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
@@ -475,7 +475,7 @@ msgstr "Cancelar"
msgid "Next" msgid "Next"
msgstr "Siguiente" msgstr "Siguiente"
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:385 #: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:406
#: js/ui/unlockDialog.js:44 #: js/ui/unlockDialog.js:44
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
@@ -503,8 +503,8 @@ msgstr "(ej., usuario o %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256 #: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:257
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297 #: js/ui/components/networkAgent.js:280 js/ui/components/networkAgent.js:298
msgid "Username: " msgid "Username: "
msgstr "Nombre de usuario:" msgstr "Nombre de usuario:"
@@ -580,23 +580,16 @@ msgstr "Cambiar de usuario"
msgid "switch user" msgid "switch user"
msgstr "cambiar;usuario" msgstr "cambiar;usuario"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:129
msgctxt "search-result"
msgid "Lock Orientation"
msgstr "Bloquear la orientación"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons #. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131 #: js/misc/systemActions.js:132
#| msgid "lock orientation;screen;rotation" msgid "lock orientation;screen;rotation"
msgid "lock orientation;unlock orientation;screen;rotation" msgstr "bloqueo;orientación;pantalla"
msgstr "bloquear orientación;desbloquear orientación;pantalla;rotación"
#: js/misc/systemActions.js:251
#| msgid "Lock Screen Rotation"
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Desbloquear la rotación de la pantalla"
#: js/misc/systemActions.js:252
#| msgid "Lock Screen Rotation"
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Bloquear la rotación de la pantalla"
#: js/misc/util.js:116 #: js/misc/util.js:116
msgid "Command not found" msgid "Command not found"
@@ -750,52 +743,56 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option #. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true; #. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374 #: js/ui/accessDialog.js:39 js/ui/status/location.js:364
msgid "Deny Access" msgid "Deny Access"
msgstr "Denegar acceso" msgstr "Denegar acceso"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377 #: js/ui/accessDialog.js:40 js/ui/status/location.js:367
msgid "Grant Access" msgid "Grant Access"
msgstr "Conceder acceso" msgstr "Conceder acceso"
#: js/ui/appDisplay.js:904 #: js/ui/appDisplay.js:947
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Carpeta sin nombre" msgstr "Carpeta sin nombre"
#: js/ui/appDisplay.js:927 #: js/ui/appDisplay.js:970
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí" msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí"
#: js/ui/appDisplay.js:1062 #: js/ui/appDisplay.js:1105
msgid "Frequent" msgid "Frequent"
msgstr "Frecuentes" msgstr "Frecuentes"
#: js/ui/appDisplay.js:1069 #: js/ui/appDisplay.js:1112
msgid "All" msgid "All"
msgstr "Todas" msgstr "Todas"
#: js/ui/appDisplay.js:1887
msgid "Rename"
msgstr "Renombrar"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2452 js/ui/panel.js:75 #: js/ui/appDisplay.js:2575 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Ventanas abiertas" msgstr "Ventanas abiertas"
#: js/ui/appDisplay.js:2472 js/ui/panel.js:82 #: js/ui/appDisplay.js:2595 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Ventana nueva" msgstr "Ventana nueva"
#: js/ui/appDisplay.js:2483 #: js/ui/appDisplay.js:2606
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica dedicada" msgstr "Lanzar usando la tarjeta gráfica dedicada"
#: js/ui/appDisplay.js:2511 js/ui/dash.js:239 #: js/ui/appDisplay.js:2634 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Quitar de los favoritos" msgstr "Quitar de los favoritos"
#: js/ui/appDisplay.js:2517 #: js/ui/appDisplay.js:2640
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Añadir a los favoritos" msgstr "Añadir a los favoritos"
#: js/ui/appDisplay.js:2527 js/ui/panel.js:93 #: js/ui/appDisplay.js:2650 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Mostrar detalles" msgstr "Mostrar detalles"
@@ -809,7 +806,7 @@ msgstr "Se ha añadido %s a sus favoritos."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "Se ha quitado %s de sus favoritos." msgstr "Se ha quitado %s de sus favoritos."
#: js/ui/audioDeviceSelection.js:41 #: js/ui/audioDeviceSelection.js:40
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Seleccionar dispositivo de sonido" msgstr "Seleccionar dispositivo de sonido"
@@ -842,7 +839,7 @@ msgid "Settings"
msgstr "Configuración" msgstr "Configuración"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41 #: js/ui/calendar.js:40
msgctxt "calendar-no-work" msgctxt "calendar-no-work"
msgid "06" msgid "06"
msgstr "06" msgstr "06"
@@ -852,43 +849,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: js/ui/calendar.js:70 #: js/ui/calendar.js:69
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "D" msgstr "D"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72 #: js/ui/calendar.js:71
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "L" msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74 #: js/ui/calendar.js:73
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "M" msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76 #: js/ui/calendar.js:75
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "X" msgstr "X"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78 #: js/ui/calendar.js:77
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "J" msgstr "J"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80 #: js/ui/calendar.js:79
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "V" msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82 #: js/ui/calendar.js:81
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "S" msgstr "S"
@@ -899,7 +896,7 @@ msgstr "S"
#. * "%OB" is the new format specifier introduced in glibc 2.27, #. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it. #. * in most cases you should not change it.
#. #.
#: js/ui/calendar.js:371 #: js/ui/calendar.js:370
msgid "%OB" msgid "%OB"
msgstr "%OB" msgstr "%OB"
@@ -912,61 +909,55 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you #. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing. #. * absolutely know what you are doing.
#. #.
#: js/ui/calendar.js:381 #: js/ui/calendar.js:380
msgid "%OB %Y" msgid "%OB %Y"
msgstr "%OB de %Y" msgstr "%OB de %Y"
#: js/ui/calendar.js:440 #: js/ui/calendar.js:439
msgid "Previous month" msgid "Previous month"
msgstr "Mes anterior" msgstr "Mes anterior"
#: js/ui/calendar.js:455 #: js/ui/calendar.js:454
msgid "Next month" msgid "Next month"
msgstr "Siguiente mes" msgstr "Siguiente mes"
#: js/ui/calendar.js:605 #: js/ui/calendar.js:604
#, no-javascript-format #, no-javascript-format
msgctxt "date day number format" msgctxt "date day number format"
msgid "%d" msgid "%d"
msgstr "%d" msgstr "%d"
#: js/ui/calendar.js:661 #: js/ui/calendar.js:660
msgid "Week %V" msgid "Week %V"
msgstr "Semana %V" msgstr "Semana %V"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: js/ui/calendar.js:730 #: js/ui/calendar.js:729
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Todo el día" msgstr "Todo el día"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:867 #: js/ui/calendar.js:867
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d" msgid "%A, %B %-d"
msgstr "%A, %d de %B" msgstr "%A, %d de %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #: js/ui/calendar.js:871
#: js/ui/calendar.js:870
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d, %Y" msgid "%A, %B %-d, %Y"
msgstr "%A, %d de %B de %Y" msgstr "%A, %d de %B de %Y"
#: js/ui/calendar.js:1096 #: js/ui/calendar.js:1097
msgid "No Notifications" msgid "No Notifications"
msgstr "No hay notificaciones" msgstr "No hay notificaciones"
#: js/ui/calendar.js:1099 #: js/ui/calendar.js:1100
msgid "No Events" msgid "No Events"
msgstr "No hay eventos" msgstr "No hay eventos"
#: js/ui/calendar.js:1153 #: js/ui/calendar.js:1132
msgid "Do Not Disturb"
msgstr "No molestar"
#: js/ui/calendar.js:1167
msgid "Clear" msgid "Clear"
msgstr "Limpiar" msgstr "Limpiar"
@@ -984,11 +975,11 @@ msgstr ""
"Puede elegir esperar un momento para que continúe o forzar a la aplicación a " "Puede elegir esperar un momento para que continúe o forzar a la aplicación a "
"terminar." "terminar."
#: js/ui/closeDialog.js:70 #: js/ui/closeDialog.js:71
msgid "Force Quit" msgid "Force Quit"
msgstr "Forzar la salida" msgstr "Forzar la salida"
#: js/ui/closeDialog.js:73 #: js/ui/closeDialog.js:74
msgid "Wait" msgid "Wait"
msgstr "Esperar" msgstr "Esperar"
@@ -1013,54 +1004,54 @@ msgstr "La versión de udisks instalada no soporta la configuración PIM"
msgid "Open with %s" msgid "Open with %s"
msgstr "Abrir con %s" msgstr "Abrir con %s"
#: js/ui/components/keyring.js:70 js/ui/components/polkitAgent.js:278 #: js/ui/components/keyring.js:71 js/ui/components/polkitAgent.js:279
msgid "Password:" msgid "Password:"
msgstr "Contraseña:" msgstr "Contraseña:"
#: js/ui/components/keyring.js:104 #: js/ui/components/keyring.js:105
msgid "Type again:" msgid "Type again:"
msgstr "Escriba de nuevo:" msgstr "Escriba de nuevo:"
#: js/ui/components/networkAgent.js:115 #: js/ui/components/networkAgent.js:116
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "" msgstr ""
"Alternativamente puede conectarse pulsando el botón «WPS» de su router." "Alternativamente puede conectarse pulsando el botón «WPS» de su router."
#: js/ui/components/networkAgent.js:123 js/ui/status/network.js:223 #: js/ui/components/networkAgent.js:124 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:913 #: js/ui/status/network.js:314 js/ui/status/network.js:913
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:224 js/ui/components/networkAgent.js:236 #: js/ui/components/networkAgent.js:225 js/ui/components/networkAgent.js:237
#: js/ui/components/networkAgent.js:260 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:282
#: js/ui/components/networkAgent.js:301 js/ui/components/networkAgent.js:311 #: js/ui/components/networkAgent.js:302 js/ui/components/networkAgent.js:312
msgid "Password: " msgid "Password: "
msgstr "Contraseña: " msgstr "Contraseña: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:229 #: js/ui/components/networkAgent.js:230
msgid "Key: " msgid "Key: "
msgstr "Clave:" msgstr "Clave:"
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287 #: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:288
msgid "Private key password: " msgid "Private key password: "
msgstr "Contraseña de la clave privada:" msgstr "Contraseña de la clave privada:"
#: js/ui/components/networkAgent.js:285 #: js/ui/components/networkAgent.js:286
msgid "Identity: " msgid "Identity: "
msgstr "Identidad:" msgstr "Identidad:"
#: js/ui/components/networkAgent.js:299 #: js/ui/components/networkAgent.js:300
msgid "Service: " msgid "Service: "
msgstr "Servicio:" msgstr "Servicio:"
#: js/ui/components/networkAgent.js:328 js/ui/components/networkAgent.js:703 #: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "La red inalámbrica requiere autenticación" msgstr "La red inalámbrica requiere autenticación"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704 #: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:705
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@@ -1069,58 +1060,59 @@ msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red " "Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»." "inalámbrica «%s»."
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708 #: js/ui/components/networkAgent.js:334 js/ui/components/networkAgent.js:709
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Autenticación 802.1X cableada" msgstr "Autenticación 802.1X cableada"
#: js/ui/components/networkAgent.js:335 #: js/ui/components/networkAgent.js:336
msgid "Network name: " msgid "Network name: "
msgstr "Nombre de la red: " msgstr "Nombre de la red: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:713
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autenticación DSL" msgstr "Autenticación DSL"
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717 #: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
msgid "PIN code required" msgid "PIN code required"
msgstr "Código PIN requerido" msgstr "Código PIN requerido"
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718 #: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:719
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil" msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
#: js/ui/components/networkAgent.js:349 #: js/ui/components/networkAgent.js:350
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:356 js/ui/components/networkAgent.js:724 #: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:725
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Contraseña de la red de banda ancha móvil" msgstr "Contraseña de la red de banda ancha móvil"
#: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:709 #: js/ui/components/networkAgent.js:358 js/ui/components/networkAgent.js:710
#: js/ui/components/networkAgent.js:713 js/ui/components/networkAgent.js:725 #: js/ui/components/networkAgent.js:714 js/ui/components/networkAgent.js:726
#: js/ui/components/networkAgent.js:729 #: js/ui/components/networkAgent.js:730
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Se requiere una contraseña para conectarse a «%s»." msgstr "Se requiere una contraseña para conectarse a «%s»."
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688 #: js/ui/components/networkAgent.js:693 js/ui/status/network.js:1688
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
#: js/ui/components/networkAgent.js:728 #: js/ui/components/networkAgent.js:729
#| msgid "Password"
msgid "VPN password" msgid "VPN password"
msgstr "Contraseña de la VPN" msgstr "Contraseña de la VPN"
#: js/ui/components/polkitAgent.js:41 #: js/ui/components/polkitAgent.js:42
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Se necesita autenticación" msgstr "Se necesita autenticación"
#: js/ui/components/polkitAgent.js:81 #: js/ui/components/polkitAgent.js:82
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: js/ui/components/polkitAgent.js:141 #: js/ui/components/polkitAgent.js:142
msgid "Authenticate" msgid "Authenticate"
msgstr "Autenticar" msgstr "Autenticar"
@@ -1128,7 +1120,7 @@ msgstr "Autenticar"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:365 #: js/ui/components/polkitAgent.js:260 js/ui/shellMountOperation.js:386
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Eso no ha funcionado. Inténtelo de nuevo." msgstr "Eso no ha funcionado. Inténtelo de nuevo."
@@ -1182,19 +1174,19 @@ msgstr "Relojes del mundo"
msgid "Weather" msgid "Weather"
msgstr "Meteorología" msgstr "Meteorología"
#: js/ui/dateMenu.js:391 #: js/ui/dateMenu.js:389
msgid "Select a location…" msgid "Select a location…"
msgstr "Seleccionar ubicación…" msgstr "Seleccionar ubicación…"
#: js/ui/dateMenu.js:404 #: js/ui/dateMenu.js:402
msgid "Loading…" msgid "Loading…"
msgstr "Cargando…" msgstr "Cargando…"
#: js/ui/dateMenu.js:414 #: js/ui/dateMenu.js:412
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Conectarse para obtener la información meteorológica" msgstr "Conectarse para obtener la información meteorológica"
#: js/ui/dateMenu.js:416 #: js/ui/dateMenu.js:414
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "La información meteorológica no está disponible actualmente." msgstr "La información meteorológica no está disponible actualmente."
@@ -1228,56 +1220,56 @@ msgctxt "button"
msgid "Log Out" msgid "Log Out"
msgstr "Cerrar la sesión" msgstr "Cerrar la sesión"
#: js/ui/endSessionDialog.js:56 #: js/ui/endSessionDialog.js:57
msgctxt "title" msgctxt "title"
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
#: js/ui/endSessionDialog.js:57 #: js/ui/endSessionDialog.js:58
msgctxt "title" msgctxt "title"
msgid "Install Updates & Power Off" msgid "Install Updates & Power Off"
msgstr "Instalar actualizaciones y apagar" msgstr "Instalar actualizaciones y apagar"
#: js/ui/endSessionDialog.js:59 #: js/ui/endSessionDialog.js:60
#, javascript-format #, javascript-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "El sistema se apagará automáticamente en %d segundo." msgstr[0] "El sistema se apagará automáticamente en %d segundo."
msgstr[1] "El sistema se apagará automáticamente en %d segundos." msgstr[1] "El sistema se apagará automáticamente en %d segundos."
#: js/ui/endSessionDialog.js:63 #: js/ui/endSessionDialog.js:64
msgctxt "checkbox" msgctxt "checkbox"
msgid "Install pending software updates" msgid "Install pending software updates"
msgstr "Instalar las actualizaciones de software pendientes" msgstr "Instalar las actualizaciones de software pendientes"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82 #: js/ui/endSessionDialog.js:67 js/ui/endSessionDialog.js:84
msgctxt "button" msgctxt "button"
msgid "Restart" msgid "Restart"
msgstr "Reiniciar" msgstr "Reiniciar"
#: js/ui/endSessionDialog.js:68 #: js/ui/endSessionDialog.js:69
msgctxt "button" msgctxt "button"
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
#: js/ui/endSessionDialog.js:74 #: js/ui/endSessionDialog.js:76
msgctxt "title" msgctxt "title"
msgid "Restart" msgid "Restart"
msgstr "Reiniciar" msgstr "Reiniciar"
#: js/ui/endSessionDialog.js:76 #: js/ui/endSessionDialog.js:78
#, javascript-format #, javascript-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "El sistema se reiniciará automáticamente en %d segundo." msgstr[0] "El sistema se reiniciará automáticamente en %d segundo."
msgstr[1] "El sistema se reiniciará automáticamente en %d segundos." msgstr[1] "El sistema se reiniciará automáticamente en %d segundos."
#: js/ui/endSessionDialog.js:89 #: js/ui/endSessionDialog.js:92
msgctxt "title" msgctxt "title"
msgid "Restart & Install Updates" msgid "Restart & Install Updates"
msgstr "Reiniciar e instalar actualizaciones" msgstr "Reiniciar e instalar actualizaciones"
#: js/ui/endSessionDialog.js:91 #: js/ui/endSessionDialog.js:94
#, javascript-format #, javascript-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
@@ -1289,22 +1281,22 @@ msgstr[1] ""
"El sistema se reiniciará automáticamente e instalará las actualizaciones en " "El sistema se reiniciará automáticamente e instalará las actualizaciones en "
"%d segundos." "%d segundos."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116 #: js/ui/endSessionDialog.js:100 js/ui/endSessionDialog.js:120
msgctxt "button" msgctxt "button"
msgid "Restart &amp; Install" msgid "Restart &amp; Install"
msgstr "Reiniciar e instalar" msgstr "Reiniciar e instalar"
#: js/ui/endSessionDialog.js:98 #: js/ui/endSessionDialog.js:101
msgctxt "button" msgctxt "button"
msgid "Install &amp; Power Off" msgid "Install &amp; Power Off"
msgstr "Instalar y apagar" msgstr "Instalar y apagar"
#: js/ui/endSessionDialog.js:99 #: js/ui/endSessionDialog.js:102
msgctxt "checkbox" msgctxt "checkbox"
msgid "Power off after updates are installed" msgid "Power off after updates are installed"
msgstr "Apagar después de instalar las actualizaciones" msgstr "Apagar después de instalar las actualizaciones"
#: js/ui/endSessionDialog.js:106 #: js/ui/endSessionDialog.js:110
msgctxt "title" msgctxt "title"
msgid "Restart & Install Upgrade" msgid "Restart & Install Upgrade"
msgstr "Reiniciar e instalar actualizaciones" msgstr "Reiniciar e instalar actualizaciones"
@@ -1312,7 +1304,7 @@ msgstr "Reiniciar e instalar actualizaciones"
#. Translators: This is the text displayed for system upgrades in the #. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and #. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to #. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111 #: js/ui/endSessionDialog.js:115
#, javascript-format #, javascript-format
msgid "" msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long " "%s %s will be installed after restart. Upgrade installation can take a long "
@@ -1322,27 +1314,27 @@ msgstr ""
"puede tardar mucho tiempo: asegúrese de que tiene una copia de respaldo y de " "puede tardar mucho tiempo: asegúrese de que tiene una copia de respaldo y de "
"que el equipo está enchufado." "que el equipo está enchufado."
#: js/ui/endSessionDialog.js:259 #: js/ui/endSessionDialog.js:301
msgid "Running on battery power: Please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"Funcionando con batería: conéctese antes de instalar las actualizaciones." "Funcionando con batería: conéctese antes de instalar las actualizaciones."
#: js/ui/endSessionDialog.js:268 #: js/ui/endSessionDialog.js:320
msgid "Some applications are busy or have unsaved work" msgid "Some applications are busy or have unsaved work."
msgstr "Algunas aplicaciones están ocupadas o tienen trabajo sin guardar" msgstr "Algunas aplicaciones están ocupadas o tienen trabajo sin guardar."
#: js/ui/endSessionDialog.js:273 #: js/ui/endSessionDialog.js:327
msgid "Other users are logged in" msgid "Other users are logged in."
msgstr "Hay otros usuarios con la sesión iniciada" msgstr "Hay otros usuarios con la sesión iniciada."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588 #: js/ui/endSessionDialog.js:649
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (remoto)" msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591 #: js/ui/endSessionDialog.js:652
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (consola)" msgstr "%s (consola)"
@@ -1352,27 +1344,18 @@ msgid "Install"
msgstr "Instalar" msgstr "Instalar"
#: js/ui/extensionDownloader.js:200 #: js/ui/extensionDownloader.js:200
msgid "Install Extension"
msgstr "Instalar extensión"
#: js/ui/extensionDownloader.js:201
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?" msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
#: js/ui/inhibitShortcutsDialog.js:79 #: js/ui/inhibitShortcutsDialog.js:80
msgid "Allow inhibiting shortcuts"
msgstr "Permitir inhibir los atajos"
#. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:82
#, javascript-format #, javascript-format
msgid "The application %s wants to inhibit shortcuts" msgid "%s wants to inhibit shortcuts"
msgstr "La aplicación %s quiere inhibir los atajos" msgstr "%s quiere inhibir los atajos"
#: js/ui/inhibitShortcutsDialog.js:83 #: js/ui/inhibitShortcutsDialog.js:81
msgid "An application wants to inhibit shortcuts" msgid "Application wants to inhibit shortcuts"
msgstr "Una aplicación quiere inhibir los atajos" msgstr "Su aplicación quiere inhibir los atajos"
#. Translators: %s is a keyboard shortcut like "Super+x" #. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:90 #: js/ui/inhibitShortcutsDialog.js:90
@@ -1380,11 +1363,11 @@ msgstr "Una aplicación quiere inhibir los atajos"
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Puede restaurar los atajos pulsando %s." msgstr "Puede restaurar los atajos pulsando %s."
#: js/ui/inhibitShortcutsDialog.js:98 #: js/ui/inhibitShortcutsDialog.js:96
msgid "Deny" msgid "Deny"
msgstr "Denegar" msgstr "Denegar"
#: js/ui/inhibitShortcutsDialog.js:105 #: js/ui/inhibitShortcutsDialog.js:103
msgid "Allow" msgid "Allow"
msgstr "Permitir" msgstr "Permitir"
@@ -1432,16 +1415,16 @@ msgstr ""
"veces seguidas. Esto desactiva la característica de «Teclas persistentes», " "veces seguidas. Esto desactiva la característica de «Teclas persistentes», "
"lo cual afecta a la forma en que funciona su teclado." "lo cual afecta a la forma en que funciona su teclado."
#: js/ui/kbdA11yDialog.js:55 #: js/ui/kbdA11yDialog.js:58
msgid "Leave On" msgid "Leave On"
msgstr "Dejar activada" msgstr "Dejar activada"
#: js/ui/kbdA11yDialog.js:55 js/ui/status/bluetooth.js:135 #: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:135
#: js/ui/status/network.js:1285 #: js/ui/status/network.js:1285
msgid "Turn On" msgid "Turn On"
msgstr "Encendido" msgstr "Encendido"
#: js/ui/kbdA11yDialog.js:63 js/ui/status/bluetooth.js:135 #: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:135
#: js/ui/status/network.js:131 js/ui/status/network.js:315 #: js/ui/status/network.js:131 js/ui/status/network.js:315
#: js/ui/status/network.js:1285 js/ui/status/network.js:1397 #: js/ui/status/network.js:1285 js/ui/status/network.js:1397
#: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81 #: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
@@ -1449,7 +1432,7 @@ msgstr "Encendido"
msgid "Turn Off" msgid "Turn Off"
msgstr "Apagar" msgstr "Apagar"
#: js/ui/kbdA11yDialog.js:63 #: js/ui/kbdA11yDialog.js:66
msgid "Leave Off" msgid "Leave Off"
msgstr "Dejar apagado" msgstr "Dejar apagado"
@@ -1619,18 +1602,18 @@ msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
#: js/ui/runDialog.js:58 #: js/ui/runDialog.js:58
msgid "Run a Command" msgid "Enter a Command"
msgstr "Eejcutar un comando" msgstr "Introducir un comando"
#: js/ui/runDialog.js:73 #: js/ui/runDialog.js:97 js/ui/windowMenu.js:167
msgid "Press ESC to close" msgid "Close"
msgstr "Pulse Esc para cerrar" msgstr "Cerrar"
#: js/ui/runDialog.js:238 #: js/ui/runDialog.js:259
msgid "Restart is not available on Wayland" msgid "Restart is not available on Wayland"
msgstr "Reiniciar no está disponible en Wayland" msgstr "Reiniciar no está disponible en Wayland"
#: js/ui/runDialog.js:243 #: js/ui/runDialog.js:264
msgid "Restarting…" msgid "Restarting…"
msgstr "Reiniciando…" msgstr "Reiniciando…"
@@ -1654,7 +1637,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d notificación nueva" msgstr[0] "%d notificación nueva"
msgstr[1] "%d notificaciones nuevas" msgstr[1] "%d notificaciones nuevas"
#: js/ui/screenShield.js:454 js/ui/status/system.js:98 #: js/ui/screenShield.js:454 js/ui/status/system.js:93
msgid "Lock" msgid "Lock"
msgstr "Bloquear" msgstr "Bloquear"
@@ -1669,11 +1652,11 @@ msgstr "GNOME necesita bloquear la pantalla"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:830 js/ui/screenShield.js:1301 #: js/ui/screenShield.js:831 js/ui/screenShield.js:1303
msgid "Unable to lock" msgid "Unable to lock"
msgstr "No se pudo bloquear" msgstr "No se pudo bloquear"
#: js/ui/screenShield.js:831 js/ui/screenShield.js:1302 #: js/ui/screenShield.js:832 js/ui/screenShield.js:1304
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Una aplicación impidió el bloqueo" msgstr "Una aplicación impidió el bloqueo"
@@ -1708,24 +1691,24 @@ msgstr "Mostrar texto"
msgid "Hide Text" msgid "Hide Text"
msgstr "Ocultar texto" msgstr "Ocultar texto"
#: js/ui/shellEntry.js:162 #: js/ui/shellEntry.js:161
msgid "Caps lock is on." msgid "Caps lock is on."
msgstr "Bloq. Mayús. está activo" msgstr "Bloq. Mayús. está activo"
#: js/ui/shellMountOperation.js:287 #: js/ui/shellMountOperation.js:308
msgid "Hidden Volume" msgid "Hidden Volume"
msgstr "Ocultar volumen" msgstr "Ocultar volumen"
#: js/ui/shellMountOperation.js:290 #: js/ui/shellMountOperation.js:311
msgid "Windows System Volume" msgid "Windows System Volume"
msgstr "Volumen de sistema Windows" msgstr "Volumen de sistema Windows"
#: js/ui/shellMountOperation.js:293 #: js/ui/shellMountOperation.js:314
msgid "Uses Keyfiles" msgid "Uses Keyfiles"
msgstr "Usa archivos de claves" msgstr "Usa archivos de claves"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:299 #: js/ui/shellMountOperation.js:320
#, javascript-format #, javascript-format
msgid "" msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead." "To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
@@ -1733,36 +1716,36 @@ msgstr ""
"Para desbloquear un volumen que usa archivos de claves use la herramienta <i>" "Para desbloquear un volumen que usa archivos de claves use la herramienta <i>"
"%s</i> en su lugar." "%s</i> en su lugar."
#: js/ui/shellMountOperation.js:306 #: js/ui/shellMountOperation.js:327
msgid "PIM Number" msgid "PIM Number"
msgstr "Número PIM" msgstr "Número PIM"
#: js/ui/shellMountOperation.js:325 #: js/ui/shellMountOperation.js:346
msgid "The PIM must be a number or empty." msgid "The PIM must be a number or empty."
msgstr "El PIM debe ser un número o estar vacío." msgstr "El PIM debe ser un número o estar vacío."
#: js/ui/shellMountOperation.js:336 #: js/ui/shellMountOperation.js:357
msgid "Password" msgid "Password"
msgstr "Contraseña" msgstr "Contraseña"
#: js/ui/shellMountOperation.js:372 #: js/ui/shellMountOperation.js:393
msgid "Remember Password" msgid "Remember Password"
msgstr "Recordar contraseña" msgstr "Recordar contraseña"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:396 #: js/ui/shellMountOperation.js:417
#, javascript-format #, javascript-format
msgid "Open %s" msgid "Open %s"
msgstr "Abrir %s" msgstr "Abrir %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:468 #: js/ui/shellMountOperation.js:489
#, javascript-format #, javascript-format
msgid "Unable to start %s" msgid "Unable to start %s"
msgstr "No se puede iniciar %s" msgstr "No se puede iniciar %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:470 #: js/ui/shellMountOperation.js:491
#, javascript-format #, javascript-format
msgid "Couldnt find the %s application" msgid "Couldnt find the %s application"
msgstr "No se pudo encontrar la aplicación %s" msgstr "No se pudo encontrar la aplicación %s"
@@ -1891,17 +1874,13 @@ msgstr "Ubicación desactivada"
msgid "Enable" msgid "Enable"
msgstr "Activar" msgstr "Activar"
#: js/ui/status/location.js:355
msgid "Allow location access"
msgstr "Permitir acceso a la ubicación"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:357 #: js/ui/status/location.js:357
#, javascript-format #, javascript-format
msgid "The app %s wants to access your location" msgid "Give %s access to your location?"
msgstr "La aplicación %s quiere acceder a su ubicación" msgstr "¿Conceder acceso a %s a su ubicación?"
#: js/ui/status/location.js:367 #: js/ui/status/location.js:358
msgid "Location access can be changed at any time from the privacy settings." msgid "Location access can be changed at any time from the privacy settings."
msgstr "" msgstr ""
"Los servicios de ubicación se pueden cambiar en cualquier momento desde la " "Los servicios de ubicación se pueden cambiar en cualquier momento desde la "
@@ -2178,23 +2157,27 @@ msgstr "Apagar"
msgid "Airplane Mode On" msgid "Airplane Mode On"
msgstr "Modo avión activado" msgstr "Modo avión activado"
#: js/ui/status/system.js:111 #: js/ui/status/system.js:57
msgid "Lock Screen Rotation"
msgstr "Bloquear la rotación de la pantalla"
#: js/ui/status/system.js:106
msgid "Power Off / Log Out" msgid "Power Off / Log Out"
msgstr "Apagar / cerrar sesión" msgstr "Apagar / cerrar sesión"
#: js/ui/status/system.js:114 #: js/ui/status/system.js:109
msgid "Log Out" msgid "Log Out"
msgstr "Cerrar la sesión" msgstr "Cerrar la sesión"
#: js/ui/status/system.js:126 #: js/ui/status/system.js:121
msgid "Switch User…" msgid "Switch User…"
msgstr "Cambiar de usuario…" msgstr "Cambiar de usuario…"
#: js/ui/status/system.js:140 #: js/ui/status/system.js:135
msgid "Suspend" msgid "Suspend"
msgstr "Suspender" msgstr "Suspender"
#: js/ui/status/system.js:152 #: js/ui/status/system.js:147
msgid "Power Off…" msgid "Power Off…"
msgstr "Apagar…" msgstr "Apagar…"
@@ -2290,22 +2273,22 @@ msgstr "Buscar"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "«%s» está preparado" msgstr "«%s» está preparado"
#: js/ui/windowManager.js:54 #: js/ui/windowManager.js:57
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "¿Quiere mantener esta configuración de la pantalla?" msgstr "¿Quiere mantener esta configuración de la pantalla?"
#. Translators: this and the following message should be limited in length, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:71
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Revertir configuración" msgstr "Revertir configuración"
#: js/ui/windowManager.js:71 #: js/ui/windowManager.js:74
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Mantener cambios" msgstr "Mantener cambios"
#: js/ui/windowManager.js:89 #: js/ui/windowManager.js:92
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@@ -2314,7 +2297,7 @@ msgstr[1] "La configuración se revertirá en %d segundos"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546 #: js/ui/windowManager.js:690
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2383,10 +2366,6 @@ msgstr "Mover a la pantalla de la izquierda"
msgid "Move to Monitor Right" msgid "Move to Monitor Right"
msgstr "Mover a la pantalla de la derecha" msgstr "Mover a la pantalla de la derecha"
#: js/ui/windowMenu.js:167
msgid "Close"
msgstr "Cerrar"
#: src/calendar-server/evolution-calendar.desktop.in:3 #: src/calendar-server/evolution-calendar.desktop.in:3
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Calendario de Evolution" msgstr "Calendario de Evolution"
@@ -2409,12 +2388,12 @@ msgstr ""
msgid "List possible modes" msgid "List possible modes"
msgstr "Listar los modos posibles" msgstr "Listar los modos posibles"
#: src/shell-app.c:279 #: src/shell-app.c:265
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
#: src/shell-app.c:530 #: src/shell-app.c:516
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Falló al lanzar «%s»" msgstr "Falló al lanzar «%s»"
@@ -2773,13 +2752,6 @@ msgstr[1] "%u entradas"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sonidos del sistema" msgstr "Sonidos del sistema"
#~ msgctxt "search-result"
#~ msgid "Lock Orientation"
#~ msgstr "Bloquear la orientación"
#~ msgid "Rename"
#~ msgstr "Renombrar"
#~ msgid "Account Settings" #~ msgid "Account Settings"
#~ msgstr "Configuración de la cuenta" #~ msgstr "Configuración de la cuenta"
@@ -3669,6 +3641,9 @@ msgstr "Sonidos del sistema"
#~ msgid "calendar:week_start:0" #~ msgid "calendar:week_start:0"
#~ msgstr "calendar:week_start:1" #~ msgstr "calendar:week_start:1"
#~ msgid "Do Not Disturb"
#~ msgstr "No molestar"
#, fuzzy #, fuzzy
#~ msgid "The length of the server certificate, or the depth of the " #~ msgid "The length of the server certificate, or the depth of the "
#~ msgstr "La longitud del certificado del servidor o la profundidad del" #~ msgstr "La longitud del certificado del servidor o la profundidad del"

1385
po/fi.po

File diff suppressed because it is too large Load Diff

308
po/fur.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: video-subtitles master\n" "Project-Id-Version: video-subtitles master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-01-26 09:11+0000\n" "POT-Creation-Date: 2019-12-20 22:04+0000\n"
"PO-Revision-Date: 2020-01-26 20:08+0100\n" "PO-Revision-Date: 2019-12-22 19:58+0100\n"
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n" "Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
"Language-Team: Friulian <fur@li.org>\n" "Language-Team: Friulian <fur@li.org>\n"
"Language: fur\n" "Language: fur\n"
@@ -43,7 +43,7 @@ msgid "Open the application menu"
msgstr "Vierç il menù aplicazions" msgstr "Vierç il menù aplicazions"
#: data/gnome-shell-extension-prefs.desktop.in.in:4 #: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:209 #: js/extensionPrefs/main.js:210
msgid "Shell Extensions" msgid "Shell Extensions"
msgstr "Estensions Shell" msgstr "Estensions Shell"
@@ -400,11 +400,11 @@ msgstr ""
msgid "Network Login" msgid "Network Login"
msgstr "Acès di rêt" msgstr "Acès di rêt"
#: js/extensionPrefs/main.js:102 js/extensionPrefs/main.js:525 #: js/extensionPrefs/main.js:103 js/extensionPrefs/main.js:526
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Alc al è lât stuart" msgstr "Alc al è lât stuart"
#: js/extensionPrefs/main.js:109 #: js/extensionPrefs/main.js:110
msgid "" msgid ""
"Were very sorry, but theres been a problem: the settings for this " "Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the " "extension cant be displayed. We recommend that you report the issue to the "
@@ -414,27 +414,27 @@ msgstr ""
"puedin jessi mostradis. Si consee di segnalâ il probleme ai autôrs de " "puedin jessi mostradis. Si consee di segnalâ il probleme ai autôrs de "
"estension." "estension."
#: js/extensionPrefs/main.js:116 #: js/extensionPrefs/main.js:117
msgid "Technical Details" msgid "Technical Details"
msgstr "Detais tecnics" msgstr "Detais tecnics"
#: js/extensionPrefs/main.js:151 #: js/extensionPrefs/main.js:152
msgid "Copy Error" msgid "Copy Error"
msgstr "Copie erôr" msgstr "Copie erôr"
#: js/extensionPrefs/main.js:178 #: js/extensionPrefs/main.js:179
msgid "Homepage" msgid "Homepage"
msgstr "Pagjine principâl" msgstr "Pagjine principâl"
#: js/extensionPrefs/main.js:179 #: js/extensionPrefs/main.js:180
msgid "Visit extension homepage" msgid "Visit extension homepage"
msgstr "Visite la pagjine principâl de estension" msgstr "Visite la pagjine principâl de estension"
#: js/extensionPrefs/main.js:467 #: js/extensionPrefs/main.js:468
msgid "No Extensions Installed" msgid "No Extensions Installed"
msgstr "Nissune estension instalade" msgstr "Nissune estension instalade"
#: js/extensionPrefs/main.js:477 #: js/extensionPrefs/main.js:478
msgid "" msgid ""
"Extensions can be installed through Software or <a href=\"https://extensions." "Extensions can be installed through Software or <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>." "gnome.org\">extensions.gnome.org</a>."
@@ -442,11 +442,11 @@ msgstr ""
"Si puedin instalâ lis estension cun Software o cun <a href=\"https://" "Si puedin instalâ lis estension cun Software o cun <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>." "extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/main.js:492 #: js/extensionPrefs/main.js:493
msgid "Browse in Software" msgid "Browse in Software"
msgstr "Esplore in Software" msgstr "Esplore in Software"
#: js/extensionPrefs/main.js:532 #: js/extensionPrefs/main.js:533
msgid "" msgid ""
"Were very sorry, but it was not possible to get the list of installed " "Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again." "extensions. Make sure you are logged into GNOME and try again."
@@ -455,9 +455,9 @@ msgstr ""
"instaladis. Controle di jessi jentrât in GNOME e torne prove." "instaladis. Controle di jessi jentrât in GNOME e torne prove."
#: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:129 js/ui/components/polkitAgent.js:138 #: js/ui/components/networkAgent.js:130 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:190 #: js/ui/endSessionDialog.js:445 js/ui/extensionDownloader.js:190
#: js/ui/shellMountOperation.js:399 js/ui/shellMountOperation.js:409 #: js/ui/shellMountOperation.js:402 js/ui/shellMountOperation.js:412
#: js/ui/status/network.js:910 #: js/ui/status/network.js:910
msgid "Cancel" msgid "Cancel"
msgstr "Anule" msgstr "Anule"
@@ -466,7 +466,7 @@ msgstr "Anule"
msgid "Next" msgid "Next"
msgstr "Indenant" msgstr "Indenant"
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:403 #: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:406
#: js/ui/unlockDialog.js:44 #: js/ui/unlockDialog.js:44
msgid "Unlock" msgid "Unlock"
msgstr "Sbloche" msgstr "Sbloche"
@@ -494,8 +494,8 @@ msgstr "(p.e., utent o %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256 #: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:257
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297 #: js/ui/components/networkAgent.js:280 js/ui/components/networkAgent.js:298
msgid "Username: " msgid "Username: "
msgstr "Non utent: " msgstr "Non utent: "
@@ -524,8 +524,8 @@ msgstr "Distudâ"
#. Translators: A list of keywords that match the power-off action, separated by semicolons #. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92 #: js/misc/systemActions.js:92
msgid "power off;shutdown;reboot;restart;halt;stop" msgid "power off;shutdown;reboot;restart"
msgstr "distudâ;studâ;tornâ a inviâ;fermâ" msgstr "distudâ;studâ;tornâ a inviâ"
#. Translators: The name of the lock screen action in search #. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97 #: js/misc/systemActions.js:97
@@ -735,52 +735,56 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option #. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true; #. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:366 #: js/ui/accessDialog.js:39 js/ui/status/location.js:364
msgid "Deny Access" msgid "Deny Access"
msgstr "Dinee acès" msgstr "Dinee acès"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:369 #: js/ui/accessDialog.js:40 js/ui/status/location.js:367
msgid "Grant Access" msgid "Grant Access"
msgstr "Garantìs l'acès" msgstr "Garantìs l'acès"
#: js/ui/appDisplay.js:904 #: js/ui/appDisplay.js:921
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Cartele cence non" msgstr "Cartele cence non"
#: js/ui/appDisplay.js:927 #: js/ui/appDisplay.js:944
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Lis aplicazions dopradis dispès a vignaran mostradis culì" msgstr "Lis aplicazions dopradis dispès a vignaran mostradis culì"
#: js/ui/appDisplay.js:1062 #: js/ui/appDisplay.js:1079
msgid "Frequent" msgid "Frequent"
msgstr "Dispès" msgstr "Dispès"
#: js/ui/appDisplay.js:1069 #: js/ui/appDisplay.js:1086
msgid "All" msgid "All"
msgstr "Dutis" msgstr "Dutis"
#: js/ui/appDisplay.js:1861
msgid "Rename"
msgstr "Cambie non"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2452 js/ui/panel.js:75 #: js/ui/appDisplay.js:2549 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Barcons vierts" msgstr "Barcons vierts"
#: js/ui/appDisplay.js:2472 js/ui/panel.js:82 #: js/ui/appDisplay.js:2569 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Gnûf barcon" msgstr "Gnûf barcon"
#: js/ui/appDisplay.js:2483 #: js/ui/appDisplay.js:2580
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Invie doprant une schede grafiche dedicade" msgstr "Invie doprant une schede grafiche dedicade"
#: js/ui/appDisplay.js:2511 js/ui/dash.js:239 #: js/ui/appDisplay.js:2608 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Gjave dai preferîts" msgstr "Gjave dai preferîts"
#: js/ui/appDisplay.js:2517 #: js/ui/appDisplay.js:2614
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Zonte tai preferîts" msgstr "Zonte tai preferîts"
#: js/ui/appDisplay.js:2527 js/ui/panel.js:93 #: js/ui/appDisplay.js:2624 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Mostre Detais" msgstr "Mostre Detais"
@@ -827,7 +831,7 @@ msgid "Settings"
msgstr "Impostazions" msgstr "Impostazions"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41 #: js/ui/calendar.js:40
msgctxt "calendar-no-work" msgctxt "calendar-no-work"
msgid "06" msgid "06"
msgstr "06" msgstr "06"
@@ -837,43 +841,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: js/ui/calendar.js:70 #: js/ui/calendar.js:69
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "D" msgstr "D"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72 #: js/ui/calendar.js:71
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "L" msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74 #: js/ui/calendar.js:73
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "M" msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76 #: js/ui/calendar.js:75
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "M" msgstr "M"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78 #: js/ui/calendar.js:77
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "J" msgstr "J"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80 #: js/ui/calendar.js:79
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "V" msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82 #: js/ui/calendar.js:81
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "S" msgstr "S"
@@ -884,7 +888,7 @@ msgstr "S"
#. * "%OB" is the new format specifier introduced in glibc 2.27, #. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it. #. * in most cases you should not change it.
#. #.
#: js/ui/calendar.js:371 #: js/ui/calendar.js:370
msgid "%OB" msgid "%OB"
msgstr "%OB" msgstr "%OB"
@@ -897,61 +901,55 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you #. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing. #. * absolutely know what you are doing.
#. #.
#: js/ui/calendar.js:381 #: js/ui/calendar.js:380
msgid "%OB %Y" msgid "%OB %Y"
msgstr "%OB dal %Y" msgstr "%OB dal %Y"
#: js/ui/calendar.js:440 #: js/ui/calendar.js:439
msgid "Previous month" msgid "Previous month"
msgstr "Mês indaûr" msgstr "Mês indaûr"
#: js/ui/calendar.js:455 #: js/ui/calendar.js:454
msgid "Next month" msgid "Next month"
msgstr "Prossim mês" msgstr "Prossim mês"
#: js/ui/calendar.js:605 #: js/ui/calendar.js:604
#, no-javascript-format #, no-javascript-format
msgctxt "date day number format" msgctxt "date day number format"
msgid "%d" msgid "%d"
msgstr "%d" msgstr "%d"
#: js/ui/calendar.js:661 #: js/ui/calendar.js:660
msgid "Week %V" msgid "Week %V"
msgstr "Setemane %V" msgstr "Setemane %V"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: js/ui/calendar.js:730 #: js/ui/calendar.js:729
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Dut il dì" msgstr "Dut il dì"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:867 #: js/ui/calendar.js:867
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d" msgid "%A, %B %-d"
msgstr "%A, %-d di %B" msgstr "%A, %-d di %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #: js/ui/calendar.js:871
#: js/ui/calendar.js:870
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d, %Y" msgid "%A, %B %-d, %Y"
msgstr "%A, %-d di %B dal %Y" msgstr "%A, %-d di %B dal %Y"
#: js/ui/calendar.js:1096 #: js/ui/calendar.js:1097
msgid "No Notifications" msgid "No Notifications"
msgstr "Nissune notifiche" msgstr "Nissune notifiche"
#: js/ui/calendar.js:1099 #: js/ui/calendar.js:1100
msgid "No Events" msgid "No Events"
msgstr "Nissun event" msgstr "Nissun event"
#: js/ui/calendar.js:1153 #: js/ui/calendar.js:1132
msgid "Do Not Disturb"
msgstr "No sta disturbâ"
#: js/ui/calendar.js:1167
msgid "Clear" msgid "Clear"
msgstr "Nete" msgstr "Nete"
@@ -969,11 +967,11 @@ msgstr ""
"Si pues sielzi di spietâ un tic che al continui o sfuarçâ la aplicazion a " "Si pues sielzi di spietâ un tic che al continui o sfuarçâ la aplicazion a "
"jessî dal dut." "jessî dal dut."
#: js/ui/closeDialog.js:70 #: js/ui/closeDialog.js:71
msgid "Force Quit" msgid "Force Quit"
msgstr "Sfuarce jessude" msgstr "Sfuarce jessude"
#: js/ui/closeDialog.js:73 #: js/ui/closeDialog.js:74
msgid "Wait" msgid "Wait"
msgstr "Spiete" msgstr "Spiete"
@@ -998,54 +996,54 @@ msgstr "La version di udisks instalade no supuarte la impostazion PIM"
msgid "Open with %s" msgid "Open with %s"
msgstr "Vierç cun %s" msgstr "Vierç cun %s"
#: js/ui/components/keyring.js:70 js/ui/components/polkitAgent.js:278 #: js/ui/components/keyring.js:71 js/ui/components/polkitAgent.js:279
msgid "Password:" msgid "Password:"
msgstr "Password:" msgstr "Password:"
#: js/ui/components/keyring.js:104 #: js/ui/components/keyring.js:105
msgid "Type again:" msgid "Type again:"
msgstr "Scîf di gnûf:" msgstr "Scîf di gnûf:"
#: js/ui/components/networkAgent.js:115 #: js/ui/components/networkAgent.js:116
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "" msgstr ""
"In alternative al è pussibil conetisi fracant il boton “WPS” sul router." "In alternative al è pussibil conetisi fracant il boton “WPS” sul router."
#: js/ui/components/networkAgent.js:123 js/ui/status/network.js:223 #: js/ui/components/networkAgent.js:124 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:913 #: js/ui/status/network.js:314 js/ui/status/network.js:913
msgid "Connect" msgid "Connect"
msgstr "Conet" msgstr "Conet"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:224 js/ui/components/networkAgent.js:236 #: js/ui/components/networkAgent.js:225 js/ui/components/networkAgent.js:237
#: js/ui/components/networkAgent.js:260 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:282
#: js/ui/components/networkAgent.js:301 js/ui/components/networkAgent.js:311 #: js/ui/components/networkAgent.js:302 js/ui/components/networkAgent.js:312
msgid "Password: " msgid "Password: "
msgstr "Password: " msgstr "Password: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:229 #: js/ui/components/networkAgent.js:230
msgid "Key: " msgid "Key: "
msgstr "Clâf: " msgstr "Clâf: "
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287 #: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:288
msgid "Private key password: " msgid "Private key password: "
msgstr "Password di clâf privade: " msgstr "Password di clâf privade: "
#: js/ui/components/networkAgent.js:285 #: js/ui/components/networkAgent.js:286
msgid "Identity: " msgid "Identity: "
msgstr "Identitât: " msgstr "Identitât: "
#: js/ui/components/networkAgent.js:299 #: js/ui/components/networkAgent.js:300
msgid "Service: " msgid "Service: "
msgstr "Servizi: " msgstr "Servizi: "
#: js/ui/components/networkAgent.js:328 js/ui/components/networkAgent.js:703 #: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "La rêt cence fîl e domande autenticazion" msgstr "La rêt cence fîl e domande autenticazion"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704 #: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:705
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@@ -1054,58 +1052,53 @@ msgstr ""
"Si scugne meti une password o une clâf di cifradure par jentrâ te rêt cence " "Si scugne meti une password o une clâf di cifradure par jentrâ te rêt cence "
"fîl \"%s\"." "fîl \"%s\"."
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708 #: js/ui/components/networkAgent.js:334 js/ui/components/networkAgent.js:709
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Autenticazion vie fîl 802.1X" msgstr "Autenticazion vie fîl 802.1X"
#: js/ui/components/networkAgent.js:335 #: js/ui/components/networkAgent.js:336
msgid "Network name: " msgid "Network name: "
msgstr "Non rêt: " msgstr "Non rêt: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:713
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autenticazion DSL" msgstr "Autenticazion DSL"
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717 #: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
msgid "PIN code required" msgid "PIN code required"
msgstr "Si pretint un codiç PIN" msgstr "Si pretint un codiç PIN"
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718 #: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:719
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Si scugne meti un codiç PIN pal dispositîf a bande largje mobil" msgstr "Si scugne meti un codiç PIN pal dispositîf a bande largje mobil"
#: js/ui/components/networkAgent.js:349 #: js/ui/components/networkAgent.js:350
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:356 js/ui/components/networkAgent.js:724 #: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:725
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Passowrd rêt mobil a bande largje" msgstr "Passowrd rêt mobil a bande largje"
#: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:709 #: js/ui/components/networkAgent.js:358 js/ui/components/networkAgent.js:710
#: js/ui/components/networkAgent.js:713 js/ui/components/networkAgent.js:725 #: js/ui/components/networkAgent.js:714 js/ui/components/networkAgent.js:726
#: js/ui/components/networkAgent.js:729
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "A covente une password par tacâsi a '%s'." msgstr "A covente une password par tacâsi a '%s'."
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688 #: js/ui/components/networkAgent.js:693 js/ui/status/network.js:1688
msgid "Network Manager" msgid "Network Manager"
msgstr "Ministradôr di rêt" msgstr "Ministradôr di rêt"
#: js/ui/components/networkAgent.js:728 #: js/ui/components/polkitAgent.js:42
msgid "VPN password"
msgstr "Password VPN"
#: js/ui/components/polkitAgent.js:41
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Autenticazion Necessarie" msgstr "Autenticazion Necessarie"
#: js/ui/components/polkitAgent.js:81 #: js/ui/components/polkitAgent.js:82
msgid "Administrator" msgid "Administrator"
msgstr "Aministradôr" msgstr "Aministradôr"
#: js/ui/components/polkitAgent.js:141 #: js/ui/components/polkitAgent.js:142
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentiche" msgstr "Autentiche"
@@ -1113,7 +1106,7 @@ msgstr "Autentiche"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:383 #: js/ui/components/polkitAgent.js:260 js/ui/shellMountOperation.js:386
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Mi displâs, no je lade drete. Prove di gnûf." msgstr "Mi displâs, no je lade drete. Prove di gnûf."
@@ -1124,7 +1117,7 @@ msgstr "Mi displâs, no je lade drete. Prove di gnûf."
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "L'utent %s al è cognossût cumò come %s" msgstr "L'utent %s al è cognossût cumò come %s"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177 #: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:176
msgid "Windows" msgid "Windows"
msgstr "Barcons" msgstr "Barcons"
@@ -1167,19 +1160,19 @@ msgstr "Orlois mondiâi"
msgid "Weather" msgid "Weather"
msgstr "Timp" msgstr "Timp"
#: js/ui/dateMenu.js:391 #: js/ui/dateMenu.js:389
msgid "Select a location…" msgid "Select a location…"
msgstr "Selezione une posizion…" msgstr "Selezione une posizion…"
#: js/ui/dateMenu.js:404 #: js/ui/dateMenu.js:402
msgid "Loading…" msgid "Loading…"
msgstr "Daûr a cjariâ…" msgstr "Daûr a cjariâ…"
#: js/ui/dateMenu.js:414 #: js/ui/dateMenu.js:412
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Va in rêt pes informazions sul timp" msgstr "Va in rêt pes informazions sul timp"
#: js/ui/dateMenu.js:416 #: js/ui/dateMenu.js:414
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Lis informazions sul timp al moment no son disponibilis" msgstr "Lis informazions sul timp al moment no son disponibilis"
@@ -1213,56 +1206,56 @@ msgctxt "button"
msgid "Log Out" msgid "Log Out"
msgstr "Jes" msgstr "Jes"
#: js/ui/endSessionDialog.js:56 #: js/ui/endSessionDialog.js:57
msgctxt "title" msgctxt "title"
msgid "Power Off" msgid "Power Off"
msgstr "Distude" msgstr "Distude"
#: js/ui/endSessionDialog.js:57 #: js/ui/endSessionDialog.js:58
msgctxt "title" msgctxt "title"
msgid "Install Updates & Power Off" msgid "Install Updates & Power Off"
msgstr "Instale inzornaments e distude" msgstr "Instale inzornaments e distude"
#: js/ui/endSessionDialog.js:59 #: js/ui/endSessionDialog.js:60
#, javascript-format #, javascript-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Il sisteme si distudarà in automatic chi di %d secont." msgstr[0] "Il sisteme si distudarà in automatic chi di %d secont."
msgstr[1] "Il sisteme si studarà in automatic chi di %d seconts." msgstr[1] "Il sisteme si studarà in automatic chi di %d seconts."
#: js/ui/endSessionDialog.js:63 #: js/ui/endSessionDialog.js:64
msgctxt "checkbox" msgctxt "checkbox"
msgid "Install pending software updates" msgid "Install pending software updates"
msgstr "Instale i inzornaments software in spiete" msgstr "Instale i inzornaments software in spiete"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82 #: js/ui/endSessionDialog.js:67 js/ui/endSessionDialog.js:84
msgctxt "button" msgctxt "button"
msgid "Restart" msgid "Restart"
msgstr "Torne invie" msgstr "Torne invie"
#: js/ui/endSessionDialog.js:68 #: js/ui/endSessionDialog.js:69
msgctxt "button" msgctxt "button"
msgid "Power Off" msgid "Power Off"
msgstr "Distude" msgstr "Distude"
#: js/ui/endSessionDialog.js:74 #: js/ui/endSessionDialog.js:76
msgctxt "title" msgctxt "title"
msgid "Restart" msgid "Restart"
msgstr "Torne invie" msgstr "Torne invie"
#: js/ui/endSessionDialog.js:76 #: js/ui/endSessionDialog.js:78
#, javascript-format #, javascript-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Il sisteme si tornarà a inviâ in automatic chi di %d secont." msgstr[0] "Il sisteme si tornarà a inviâ in automatic chi di %d secont."
msgstr[1] "Il sisteme si tornarà a inviâ in automatic chi di %d secont." msgstr[1] "Il sisteme si tornarà a inviâ in automatic chi di %d secont."
#: js/ui/endSessionDialog.js:89 #: js/ui/endSessionDialog.js:92
msgctxt "title" msgctxt "title"
msgid "Restart & Install Updates" msgid "Restart & Install Updates"
msgstr "Torne a inviâ e instale inzornaments" msgstr "Torne a inviâ e instale inzornaments"
#: js/ui/endSessionDialog.js:91 #: js/ui/endSessionDialog.js:94
#, javascript-format #, javascript-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
@@ -1274,22 +1267,22 @@ msgstr[1] ""
"Il sisteme al tornarà a inviâsi in automatic instalant i inzornaments chi di " "Il sisteme al tornarà a inviâsi in automatic instalant i inzornaments chi di "
"%d seconts." "%d seconts."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116 #: js/ui/endSessionDialog.js:100 js/ui/endSessionDialog.js:120
msgctxt "button" msgctxt "button"
msgid "Restart &amp; Install" msgid "Restart &amp; Install"
msgstr "Torne invie e instale" msgstr "Torne invie e instale"
#: js/ui/endSessionDialog.js:98 #: js/ui/endSessionDialog.js:101
msgctxt "button" msgctxt "button"
msgid "Install &amp; Power Off" msgid "Install &amp; Power Off"
msgstr "Instale e distude" msgstr "Instale e distude"
#: js/ui/endSessionDialog.js:99 #: js/ui/endSessionDialog.js:102
msgctxt "checkbox" msgctxt "checkbox"
msgid "Power off after updates are installed" msgid "Power off after updates are installed"
msgstr "Distude dopo vê instalât i inzornaments" msgstr "Distude dopo vê instalât i inzornaments"
#: js/ui/endSessionDialog.js:106 #: js/ui/endSessionDialog.js:110
msgctxt "title" msgctxt "title"
msgid "Restart & Install Upgrade" msgid "Restart & Install Upgrade"
msgstr "Torne invie e instale avanzament" msgstr "Torne invie e instale avanzament"
@@ -1297,7 +1290,7 @@ msgstr "Torne invie e instale avanzament"
#. Translators: This is the text displayed for system upgrades in the #. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and #. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to #. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111 #: js/ui/endSessionDialog.js:115
#, javascript-format #, javascript-format
msgid "" msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long " "%s %s will be installed after restart. Upgrade installation can take a long "
@@ -1307,28 +1300,28 @@ msgstr ""
"dal avanzament e pues tirâ a dilunc: siguriti di vê fat i backup e che il to " "dal avanzament e pues tirâ a dilunc: siguriti di vê fat i backup e che il to "
"computer al sedi tacât." "computer al sedi tacât."
#: js/ui/endSessionDialog.js:259 #: js/ui/endSessionDialog.js:301
msgid "Running on battery power: Please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"Funzionament su batarie: par plasê tache la spine prime di instalâ i " "Funzionament su batarie: par plasê tache la spine prime di instalâ i "
"inzornaments." "inzornaments."
#: js/ui/endSessionDialog.js:268 #: js/ui/endSessionDialog.js:320
msgid "Some applications are busy or have unsaved work" msgid "Some applications are busy or have unsaved work."
msgstr "Cualchi aplicazion e je impegnade opûr e à lavôrs no salvâts" msgstr "Cualchi aplicazion e je impegnade opûr e à lavôrs no salvâts."
#: js/ui/endSessionDialog.js:273 #: js/ui/endSessionDialog.js:327
msgid "Other users are logged in" msgid "Other users are logged in."
msgstr "Altris utents a son jentrâts" msgstr "Altris utents a son jentrâts."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588 #: js/ui/endSessionDialog.js:649
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (rimot)" msgstr "%s (rimot)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591 #: js/ui/endSessionDialog.js:652
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (locâl vie tastiere)" msgstr "%s (locâl vie tastiere)"
@@ -1352,16 +1345,16 @@ msgid "Application wants to inhibit shortcuts"
msgstr "Une aplicazion e desidere inibî lis scurtis" msgstr "Une aplicazion e desidere inibî lis scurtis"
#. Translators: %s is a keyboard shortcut like "Super+x" #. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:89 #: js/ui/inhibitShortcutsDialog.js:90
#, javascript-format #, javascript-format
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Si pues ripristinâ lis scurtis fracant %s." msgstr "Si pues ripristinâ lis scurtis fracant %s."
#: js/ui/inhibitShortcutsDialog.js:95 #: js/ui/inhibitShortcutsDialog.js:96
msgid "Deny" msgid "Deny"
msgstr "Dinee" msgstr "Dinee"
#: js/ui/inhibitShortcutsDialog.js:102 #: js/ui/inhibitShortcutsDialog.js:103
msgid "Allow" msgid "Allow"
msgstr "Pemet" msgstr "Pemet"
@@ -1408,16 +1401,16 @@ msgstr ""
"Chest al disative la funzion tascj singui/tacadiçs, che al determine il mût " "Chest al disative la funzion tascj singui/tacadiçs, che al determine il mût "
"di lavorâ de tastiere." "di lavorâ de tastiere."
#: js/ui/kbdA11yDialog.js:57 #: js/ui/kbdA11yDialog.js:58
msgid "Leave On" msgid "Leave On"
msgstr "Lasse ativât" msgstr "Lasse ativât"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:135 #: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:135
#: js/ui/status/network.js:1285 #: js/ui/status/network.js:1285
msgid "Turn On" msgid "Turn On"
msgstr "Impie" msgstr "Impie"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:135 #: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:135
#: js/ui/status/network.js:131 js/ui/status/network.js:315 #: js/ui/status/network.js:131 js/ui/status/network.js:315
#: js/ui/status/network.js:1285 js/ui/status/network.js:1397 #: js/ui/status/network.js:1285 js/ui/status/network.js:1397
#: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81 #: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
@@ -1425,7 +1418,7 @@ msgstr "Impie"
msgid "Turn Off" msgid "Turn Off"
msgstr "Distude" msgstr "Distude"
#: js/ui/kbdA11yDialog.js:65 #: js/ui/kbdA11yDialog.js:66
msgid "Leave Off" msgid "Leave Off"
msgstr "Lasse disativât" msgstr "Lasse disativât"
@@ -1647,11 +1640,11 @@ msgstr "GNOME al à di blocâ il visôr"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:830 js/ui/screenShield.js:1301 #: js/ui/screenShield.js:831 js/ui/screenShield.js:1303
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Impussibil blocâ" msgstr "Impussibil blocâ"
#: js/ui/screenShield.js:831 js/ui/screenShield.js:1302 #: js/ui/screenShield.js:832 js/ui/screenShield.js:1304
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Il bloc al è stât dineât di une aplicazion" msgstr "Il bloc al è stât dineât di une aplicazion"
@@ -1687,24 +1680,24 @@ msgstr "Mostre Test"
msgid "Hide Text" msgid "Hide Text"
msgstr "Plate Test" msgstr "Plate Test"
#: js/ui/shellEntry.js:162 #: js/ui/shellEntry.js:161
msgid "Caps lock is on." msgid "Caps lock is on."
msgstr "BlocMaiusc al è atîf." msgstr "BlocMaiusc al è atîf."
#: js/ui/shellMountOperation.js:305 #: js/ui/shellMountOperation.js:308
msgid "Hidden Volume" msgid "Hidden Volume"
msgstr "Volum platât" msgstr "Volum platât"
#: js/ui/shellMountOperation.js:308 #: js/ui/shellMountOperation.js:311
msgid "Windows System Volume" msgid "Windows System Volume"
msgstr "Volum di sisteme Windows" msgstr "Volum di sisteme Windows"
#: js/ui/shellMountOperation.js:311 #: js/ui/shellMountOperation.js:314
msgid "Uses Keyfiles" msgid "Uses Keyfiles"
msgstr "Al dopre i File-clâf" msgstr "Al dopre i File-clâf"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:317 #: js/ui/shellMountOperation.js:320
#, javascript-format #, javascript-format
msgid "" msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead." "To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
@@ -1712,36 +1705,36 @@ msgstr ""
"Par sblocâ un volum che al dopre i file-clâf dopre invezit il program di " "Par sblocâ un volum che al dopre i file-clâf dopre invezit il program di "
"utilitât <i>%s</i>." "utilitât <i>%s</i>."
#: js/ui/shellMountOperation.js:324 #: js/ui/shellMountOperation.js:327
msgid "PIM Number" msgid "PIM Number"
msgstr "Numar PIM" msgstr "Numar PIM"
#: js/ui/shellMountOperation.js:343 #: js/ui/shellMountOperation.js:346
msgid "The PIM must be a number or empty." msgid "The PIM must be a number or empty."
msgstr "Il PIM al scugne jessi un numar o vueit." msgstr "Il PIM al scugne jessi un numar o vueit."
#: js/ui/shellMountOperation.js:354 #: js/ui/shellMountOperation.js:357
msgid "Password" msgid "Password"
msgstr "Password" msgstr "Password"
#: js/ui/shellMountOperation.js:390 #: js/ui/shellMountOperation.js:393
msgid "Remember Password" msgid "Remember Password"
msgstr "Visâsi Password" msgstr "Visâsi Password"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:414 #: js/ui/shellMountOperation.js:417
#, javascript-format #, javascript-format
msgid "Open %s" msgid "Open %s"
msgstr "Vierç %s" msgstr "Vierç %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:486 #: js/ui/shellMountOperation.js:489
#, javascript-format #, javascript-format
msgid "Unable to start %s" msgid "Unable to start %s"
msgstr "Impussibil inviâ %s" msgstr "Impussibil inviâ %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:488 #: js/ui/shellMountOperation.js:491
#, javascript-format #, javascript-format
msgid "Couldnt find the %s application" msgid "Couldnt find the %s application"
msgstr "Impussibil cjatâ la aplicazion %s" msgstr "Impussibil cjatâ la aplicazion %s"
@@ -1838,11 +1831,11 @@ msgstr "Clic secondari"
msgid "Dwell Click" msgid "Dwell Click"
msgstr "Clic in polse" msgstr "Clic in polse"
#: js/ui/status/keyboard.js:825 #: js/ui/status/keyboard.js:818
msgid "Keyboard" msgid "Keyboard"
msgstr "Tastiere" msgstr "Tastiere"
#: js/ui/status/keyboard.js:847 #: js/ui/status/keyboard.js:840
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Mostre la disposizion de tastiere" msgstr "Mostre la disposizion de tastiere"
@@ -1871,12 +1864,12 @@ msgid "Enable"
msgstr "Abilite" msgstr "Abilite"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:355 #: js/ui/status/location.js:357
#, javascript-format #, javascript-format
msgid "Give %s access to your location?" msgid "Give %s access to your location?"
msgstr "Permeti a %s di cognossi la tô posizion?" msgstr "Permeti a %s di cognossi la tô posizion?"
#: js/ui/status/location.js:361 #: js/ui/status/location.js:358
msgid "Location access can be changed at any time from the privacy settings." msgid "Location access can be changed at any time from the privacy settings."
msgstr "" msgstr ""
"L'acès ae posizion al pues jessi cambiât cuant che tu vuelis su impostazions " "L'acès ae posizion al pues jessi cambiât cuant che tu vuelis su impostazions "
@@ -2257,11 +2250,11 @@ msgstr "Jentre come altri utent"
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Sbloche barcon" msgstr "Sbloche barcon"
#: js/ui/viewSelector.js:181 #: js/ui/viewSelector.js:180
msgid "Applications" msgid "Applications"
msgstr "Aplicazions" msgstr "Aplicazions"
#: js/ui/viewSelector.js:185 #: js/ui/viewSelector.js:184
msgid "Search" msgid "Search"
msgstr "Cîr" msgstr "Cîr"
@@ -2270,22 +2263,22 @@ msgstr "Cîr"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "“%s” al è pront" msgstr "“%s” al è pront"
#: js/ui/windowManager.js:54 #: js/ui/windowManager.js:57
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "Vûstu tignî chestis impostazions di visôr?" msgstr "Vûstu tignî chestis impostazions di visôr?"
#. Translators: this and the following message should be limited in length, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:71
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Ripristine impostazions" msgstr "Ripristine impostazions"
#: js/ui/windowManager.js:71 #: js/ui/windowManager.js:74
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Ten lis modifichis" msgstr "Ten lis modifichis"
#: js/ui/windowManager.js:89 #: js/ui/windowManager.js:92
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@@ -2296,7 +2289,7 @@ msgstr[1] ""
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546 #: js/ui/windowManager.js:690
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2385,12 +2378,12 @@ msgstr "Dopre une modalitât specifiche, par esempli “gdm” pe videade di ac
msgid "List possible modes" msgid "List possible modes"
msgstr "Liste modalitâts pussibilis" msgstr "Liste modalitâts pussibilis"
#: src/shell-app.c:279 #: src/shell-app.c:265
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "No cognossût" msgstr "No cognossût"
#: src/shell-app.c:530 #: src/shell-app.c:516
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "No soi rivât a eseguî '%s'" msgstr "No soi rivât a eseguî '%s'"
@@ -2750,9 +2743,6 @@ msgstr[1] "%u jentradis"
msgid "System Sounds" msgid "System Sounds"
msgstr "Suns di sisteme" msgstr "Suns di sisteme"
#~ msgid "Rename"
#~ msgstr "Cambie non"
#~ msgid "Account Settings" #~ msgid "Account Settings"
#~ msgstr "Impostazions account" #~ msgstr "Impostazions account"

275
po/id.po
View File

@@ -4,23 +4,23 @@
# Andika Triwidada <andika@gmail.com>, 2010-2014, 2017. # Andika Triwidada <andika@gmail.com>, 2010-2014, 2017.
# Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014. # Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.
# Wibiharto <wibinem@yahoo.com>, 2011. # Wibiharto <wibinem@yahoo.com>, 2011.
# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-2020. # Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017, 2018, 2019.
# Sucipto <sucipto@pm.me>, 2020. # Sucipto <sucipto@pm.me>, 2020.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-01-22 22:00+0000\n" "POT-Creation-Date: 2020-01-09 01:33+0000\n"
"PO-Revision-Date: 2020-01-23 16:31+0700\n" "PO-Revision-Date: 2020-01-13 17:07+0700\n"
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n" "Last-Translator: Sucipto <sucipto@pm.me>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n" "Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n" "Language: id\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural= n!=1;\n" "Plural-Forms: nplurals=2; plural= n!=1;\n"
"X-Generator: Poedit 2.2.4\n" "X-Generator: Gtranslator 3.34.0\n"
"X-DamnedLies-Scope: partial\n" "X-DamnedLies-Scope: partial\n"
"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-SourceCharset: UTF-8\n"
@@ -460,9 +460,9 @@ msgstr ""
"dipasang. Pastikan Anda masuk ke GNOME dan coba lagi." "dipasang. Pastikan Anda masuk ke GNOME dan coba lagi."
#: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:129 js/ui/components/polkitAgent.js:138 #: js/ui/components/networkAgent.js:130 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:190 #: js/ui/endSessionDialog.js:445 js/ui/extensionDownloader.js:190
#: js/ui/shellMountOperation.js:399 js/ui/shellMountOperation.js:409 #: js/ui/shellMountOperation.js:402 js/ui/shellMountOperation.js:412
#: js/ui/status/network.js:910 #: js/ui/status/network.js:910
msgid "Cancel" msgid "Cancel"
msgstr "Batal" msgstr "Batal"
@@ -471,7 +471,7 @@ msgstr "Batal"
msgid "Next" msgid "Next"
msgstr "Selanjutnya" msgstr "Selanjutnya"
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:403 #: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:406
#: js/ui/unlockDialog.js:44 #: js/ui/unlockDialog.js:44
msgid "Unlock" msgid "Unlock"
msgstr "Buka Kunci" msgstr "Buka Kunci"
@@ -499,8 +499,8 @@ msgstr "(cth., pengguna dari %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256 #: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:257
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297 #: js/ui/components/networkAgent.js:280 js/ui/components/networkAgent.js:298
msgid "Username: " msgid "Username: "
msgstr "Nama pengguna: " msgstr "Nama pengguna: "
@@ -740,52 +740,56 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option #. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true; #. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:366 #: js/ui/accessDialog.js:39 js/ui/status/location.js:364
msgid "Deny Access" msgid "Deny Access"
msgstr "Tolak Akses" msgstr "Tolak Akses"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:369 #: js/ui/accessDialog.js:40 js/ui/status/location.js:367
msgid "Grant Access" msgid "Grant Access"
msgstr "Beri Akses" msgstr "Beri Akses"
#: js/ui/appDisplay.js:904 #: js/ui/appDisplay.js:947
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Folder Tanpa Nama" msgstr "Folder Tanpa Nama"
#: js/ui/appDisplay.js:927 #: js/ui/appDisplay.js:970
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Aplikasi yang sering dipakai akan muncul di sini" msgstr "Aplikasi yang sering dipakai akan muncul di sini"
#: js/ui/appDisplay.js:1062 #: js/ui/appDisplay.js:1105
msgid "Frequent" msgid "Frequent"
msgstr "Sering" msgstr "Sering"
#: js/ui/appDisplay.js:1069 #: js/ui/appDisplay.js:1112
msgid "All" msgid "All"
msgstr "Semua" msgstr "Semua"
#: js/ui/appDisplay.js:1887
msgid "Rename"
msgstr "Ubah Nama"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2452 js/ui/panel.js:75 #: js/ui/appDisplay.js:2575 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Buka Jendela" msgstr "Buka Jendela"
#: js/ui/appDisplay.js:2472 js/ui/panel.js:82 #: js/ui/appDisplay.js:2595 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Jendela Baru" msgstr "Jendela Baru"
#: js/ui/appDisplay.js:2483 #: js/ui/appDisplay.js:2606
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi" msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi"
#: js/ui/appDisplay.js:2511 js/ui/dash.js:239 #: js/ui/appDisplay.js:2634 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Hapus dari Favorit" msgstr "Hapus dari Favorit"
#: js/ui/appDisplay.js:2517 #: js/ui/appDisplay.js:2640
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Tambah ke Favorit" msgstr "Tambah ke Favorit"
#: js/ui/appDisplay.js:2527 js/ui/panel.js:93 #: js/ui/appDisplay.js:2650 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Tampilkan Rincian" msgstr "Tampilkan Rincian"
@@ -832,7 +836,7 @@ msgid "Settings"
msgstr "Pengaturan" msgstr "Pengaturan"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41 #: js/ui/calendar.js:40
msgctxt "calendar-no-work" msgctxt "calendar-no-work"
msgid "06" msgid "06"
msgstr "06" msgstr "06"
@@ -842,43 +846,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: js/ui/calendar.js:70 #: js/ui/calendar.js:69
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "M" msgstr "M"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72 #: js/ui/calendar.js:71
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "S" msgstr "S"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74 #: js/ui/calendar.js:73
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "S" msgstr "S"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76 #: js/ui/calendar.js:75
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "R" msgstr "R"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78 #: js/ui/calendar.js:77
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "K" msgstr "K"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80 #: js/ui/calendar.js:79
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "J" msgstr "J"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82 #: js/ui/calendar.js:81
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "S" msgstr "S"
@@ -889,7 +893,7 @@ msgstr "S"
#. * "%OB" is the new format specifier introduced in glibc 2.27, #. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it. #. * in most cases you should not change it.
#. #.
#: js/ui/calendar.js:371 #: js/ui/calendar.js:370
msgid "%OB" msgid "%OB"
msgstr "%OB" msgstr "%OB"
@@ -902,61 +906,55 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you #. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing. #. * absolutely know what you are doing.
#. #.
#: js/ui/calendar.js:381 #: js/ui/calendar.js:380
msgid "%OB %Y" msgid "%OB %Y"
msgstr "%OB %Y" msgstr "%OB %Y"
#: js/ui/calendar.js:440 #: js/ui/calendar.js:439
msgid "Previous month" msgid "Previous month"
msgstr "Bulan sebelumnya" msgstr "Bulan sebelumnya"
#: js/ui/calendar.js:455 #: js/ui/calendar.js:454
msgid "Next month" msgid "Next month"
msgstr "Bulan selanjutnya" msgstr "Bulan selanjutnya"
#: js/ui/calendar.js:605 #: js/ui/calendar.js:604
#, no-javascript-format #, no-javascript-format
msgctxt "date day number format" msgctxt "date day number format"
msgid "%d" msgid "%d"
msgstr "%d" msgstr "%d"
#: js/ui/calendar.js:661 #: js/ui/calendar.js:660
msgid "Week %V" msgid "Week %V"
msgstr "Minggu %V" msgstr "Minggu %V"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: js/ui/calendar.js:730 #: js/ui/calendar.js:729
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Sepanjang Hari" msgstr "Sepanjang Hari"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:867 #: js/ui/calendar.js:867
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d" msgid "%A, %B %-d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #: js/ui/calendar.js:871
#: js/ui/calendar.js:870
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d, %Y" msgid "%A, %B %-d, %Y"
msgstr "%A, %d %B %Y" msgstr "%A, %d %B %Y"
#: js/ui/calendar.js:1096 #: js/ui/calendar.js:1097
msgid "No Notifications" msgid "No Notifications"
msgstr "Tak Ada Pemberitahuan" msgstr "Tak Ada Pemberitahuan"
#: js/ui/calendar.js:1099 #: js/ui/calendar.js:1100
msgid "No Events" msgid "No Events"
msgstr "Tak Ada Kejadian" msgstr "Tak Ada Kejadian"
#: js/ui/calendar.js:1153 #: js/ui/calendar.js:1132
msgid "Do Not Disturb"
msgstr "Jangan Ganggu"
#: js/ui/calendar.js:1167
msgid "Clear" msgid "Clear"
msgstr "Bersihkan" msgstr "Bersihkan"
@@ -974,11 +972,11 @@ msgstr ""
"Anda dapat memilih untuk menunggu sebentar untuk melanjutkan atau memaksa " "Anda dapat memilih untuk menunggu sebentar untuk melanjutkan atau memaksa "
"aplikasi keluar." "aplikasi keluar."
#: js/ui/closeDialog.js:70 #: js/ui/closeDialog.js:71
msgid "Force Quit" msgid "Force Quit"
msgstr "Tutup Paksa" msgstr "Tutup Paksa"
#: js/ui/closeDialog.js:73 #: js/ui/closeDialog.js:74
msgid "Wait" msgid "Wait"
msgstr "Tunggu" msgstr "Tunggu"
@@ -1003,55 +1001,55 @@ msgstr "Versi udisks yang dipasang tidak mendukung pengaturan PIM"
msgid "Open with %s" msgid "Open with %s"
msgstr "Buka dengan %s" msgstr "Buka dengan %s"
#: js/ui/components/keyring.js:70 js/ui/components/polkitAgent.js:278 #: js/ui/components/keyring.js:71 js/ui/components/polkitAgent.js:279
msgid "Password:" msgid "Password:"
msgstr "Sandi:" msgstr "Sandi:"
#: js/ui/components/keyring.js:104 #: js/ui/components/keyring.js:105
msgid "Type again:" msgid "Type again:"
msgstr "Ketik lagi:" msgstr "Ketik lagi:"
#: js/ui/components/networkAgent.js:115 #: js/ui/components/networkAgent.js:116
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "" msgstr ""
"Sebagai alternatif Anda dapat terhubung dengan menekan tombol \"WPS\" pada " "Sebagai alternatif Anda dapat terhubung dengan menekan tombol \"WPS\" pada "
"router Anda." "router Anda."
#: js/ui/components/networkAgent.js:123 js/ui/status/network.js:223 #: js/ui/components/networkAgent.js:124 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:913 #: js/ui/status/network.js:314 js/ui/status/network.js:913
msgid "Connect" msgid "Connect"
msgstr "Sambung" msgstr "Sambung"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:224 js/ui/components/networkAgent.js:236 #: js/ui/components/networkAgent.js:225 js/ui/components/networkAgent.js:237
#: js/ui/components/networkAgent.js:260 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:282
#: js/ui/components/networkAgent.js:301 js/ui/components/networkAgent.js:311 #: js/ui/components/networkAgent.js:302 js/ui/components/networkAgent.js:312
msgid "Password: " msgid "Password: "
msgstr "Sandi: " msgstr "Sandi: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:229 #: js/ui/components/networkAgent.js:230
msgid "Key: " msgid "Key: "
msgstr "Tombol: " msgstr "Tombol: "
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287 #: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:288
msgid "Private key password: " msgid "Private key password: "
msgstr "Sandi kunci privat: " msgstr "Sandi kunci privat: "
#: js/ui/components/networkAgent.js:285 #: js/ui/components/networkAgent.js:286
msgid "Identity: " msgid "Identity: "
msgstr "Identitas: " msgstr "Identitas: "
#: js/ui/components/networkAgent.js:299 #: js/ui/components/networkAgent.js:300
msgid "Service: " msgid "Service: "
msgstr "Layanan: " msgstr "Layanan: "
#: js/ui/components/networkAgent.js:328 js/ui/components/networkAgent.js:703 #: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "Autentikasi diperlukan oleh jaringan nirkabel" msgstr "Autentikasi diperlukan oleh jaringan nirkabel"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704 #: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:705
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@@ -1060,58 +1058,58 @@ msgstr ""
"Sandi atau kunci enkripsi diperlukan untuk mengakses jaringan nirkabel \"%s" "Sandi atau kunci enkripsi diperlukan untuk mengakses jaringan nirkabel \"%s"
"\"." "\"."
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708 #: js/ui/components/networkAgent.js:334 js/ui/components/networkAgent.js:709
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Autentikasi 802.1X kabel" msgstr "Autentikasi 802.1X kabel"
#: js/ui/components/networkAgent.js:335 #: js/ui/components/networkAgent.js:336
msgid "Network name: " msgid "Network name: "
msgstr "Nama jaringan: " msgstr "Nama jaringan: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:713
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autentikasi DSL" msgstr "Autentikasi DSL"
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717 #: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
msgid "PIN code required" msgid "PIN code required"
msgstr "Perlu kode PIN" msgstr "Perlu kode PIN"
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718 #: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:719
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Kode PIN diperlukan untuk perangkat data seluler" msgstr "Kode PIN diperlukan untuk perangkat data seluler"
#: js/ui/components/networkAgent.js:349 #: js/ui/components/networkAgent.js:350
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:356 js/ui/components/networkAgent.js:724 #: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:725
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Sandi jaringan data seluler" msgstr "Sandi jaringan data seluler"
#: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:709 #: js/ui/components/networkAgent.js:358 js/ui/components/networkAgent.js:710
#: js/ui/components/networkAgent.js:713 js/ui/components/networkAgent.js:725 #: js/ui/components/networkAgent.js:714 js/ui/components/networkAgent.js:726
#: js/ui/components/networkAgent.js:729 #: js/ui/components/networkAgent.js:730
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Perlu suatu sandi untuk menyambung ke \"%s\"." msgstr "Perlu suatu sandi untuk menyambung ke \"%s\"."
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688 #: js/ui/components/networkAgent.js:693 js/ui/status/network.js:1688
msgid "Network Manager" msgid "Network Manager"
msgstr "Manajer Jaringan" msgstr "Manajer Jaringan"
#: js/ui/components/networkAgent.js:728 #: js/ui/components/networkAgent.js:729
msgid "VPN password" msgid "VPN password"
msgstr "Sandi VPN" msgstr "Sandi VPN"
#: js/ui/components/polkitAgent.js:41 #: js/ui/components/polkitAgent.js:42
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Diperlukan Autentikasi" msgstr "Diperlukan Autentikasi"
#: js/ui/components/polkitAgent.js:81 #: js/ui/components/polkitAgent.js:82
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: js/ui/components/polkitAgent.js:141 #: js/ui/components/polkitAgent.js:142
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentikasi" msgstr "Autentikasi"
@@ -1119,7 +1117,7 @@ msgstr "Autentikasi"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:383 #: js/ui/components/polkitAgent.js:260 js/ui/shellMountOperation.js:386
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Maaf, tidak berhasil. Silakan coba lagi." msgstr "Maaf, tidak berhasil. Silakan coba lagi."
@@ -1173,19 +1171,19 @@ msgstr "Jam Dunia"
msgid "Weather" msgid "Weather"
msgstr "Cuaca" msgstr "Cuaca"
#: js/ui/dateMenu.js:391 #: js/ui/dateMenu.js:389
msgid "Select a location…" msgid "Select a location…"
msgstr "Pilih lokasi…" msgstr "Pilih lokasi…"
#: js/ui/dateMenu.js:404 #: js/ui/dateMenu.js:402
msgid "Loading…" msgid "Loading…"
msgstr "Memuat…" msgstr "Memuat…"
#: js/ui/dateMenu.js:414 #: js/ui/dateMenu.js:412
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Pergi daring untuk informasi cuaca" msgstr "Pergi daring untuk informasi cuaca"
#: js/ui/dateMenu.js:416 #: js/ui/dateMenu.js:414
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Informasi cuaca saat ini tidak tersedia" msgstr "Informasi cuaca saat ini tidak tersedia"
@@ -1219,56 +1217,56 @@ msgctxt "button"
msgid "Log Out" msgid "Log Out"
msgstr "Keluar" msgstr "Keluar"
#: js/ui/endSessionDialog.js:56 #: js/ui/endSessionDialog.js:57
msgctxt "title" msgctxt "title"
msgid "Power Off" msgid "Power Off"
msgstr "Matikan" msgstr "Matikan"
#: js/ui/endSessionDialog.js:57 #: js/ui/endSessionDialog.js:58
msgctxt "title" msgctxt "title"
msgid "Install Updates & Power Off" msgid "Install Updates & Power Off"
msgstr "Pasang Pemutakhiran & Matikan" msgstr "Pasang Pemutakhiran & Matikan"
#: js/ui/endSessionDialog.js:59 #: js/ui/endSessionDialog.js:60
#, javascript-format #, javascript-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Sistem ini akan otomatis dimatikan dalam %d detik." msgstr[0] "Sistem ini akan otomatis dimatikan dalam %d detik."
msgstr[1] "Sistem ini akan otomatis dimatikan dalam %d detik." msgstr[1] "Sistem ini akan otomatis dimatikan dalam %d detik."
#: js/ui/endSessionDialog.js:63 #: js/ui/endSessionDialog.js:64
msgctxt "checkbox" msgctxt "checkbox"
msgid "Install pending software updates" msgid "Install pending software updates"
msgstr "Pasang pemutakhiran perangkat lunak yang tertunda" msgstr "Pasang pemutakhiran perangkat lunak yang tertunda"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82 #: js/ui/endSessionDialog.js:67 js/ui/endSessionDialog.js:84
msgctxt "button" msgctxt "button"
msgid "Restart" msgid "Restart"
msgstr "Nyalakan Ulang" msgstr "Nyalakan Ulang"
#: js/ui/endSessionDialog.js:68 #: js/ui/endSessionDialog.js:69
msgctxt "button" msgctxt "button"
msgid "Power Off" msgid "Power Off"
msgstr "Matikan" msgstr "Matikan"
#: js/ui/endSessionDialog.js:74 #: js/ui/endSessionDialog.js:76
msgctxt "title" msgctxt "title"
msgid "Restart" msgid "Restart"
msgstr "Nyalakan Ulang" msgstr "Nyalakan Ulang"
#: js/ui/endSessionDialog.js:76 #: js/ui/endSessionDialog.js:78
#, javascript-format #, javascript-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Sistem ini akan otomatis dimulai ulang dalam %d detik." msgstr[0] "Sistem ini akan otomatis dimulai ulang dalam %d detik."
msgstr[1] "Sistem ini akan otomatis dimulai ulang dalam %d detik." msgstr[1] "Sistem ini akan otomatis dimulai ulang dalam %d detik."
#: js/ui/endSessionDialog.js:89 #: js/ui/endSessionDialog.js:92
msgctxt "title" msgctxt "title"
msgid "Restart & Install Updates" msgid "Restart & Install Updates"
msgstr "Start Ulang & Pasang Pemutakhiran" msgstr "Start Ulang & Pasang Pemutakhiran"
#: js/ui/endSessionDialog.js:91 #: js/ui/endSessionDialog.js:94
#, javascript-format #, javascript-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
@@ -1280,22 +1278,22 @@ msgstr[1] ""
"Sistem ini akan otomatis dimulai ulang dan memasang pemutakhiran dalam %d " "Sistem ini akan otomatis dimulai ulang dan memasang pemutakhiran dalam %d "
"detik." "detik."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116 #: js/ui/endSessionDialog.js:100 js/ui/endSessionDialog.js:120
msgctxt "button" msgctxt "button"
msgid "Restart &amp; Install" msgid "Restart &amp; Install"
msgstr "Nyalakan Ulang &amp; Pasang" msgstr "Nyalakan Ulang &amp; Pasang"
#: js/ui/endSessionDialog.js:98 #: js/ui/endSessionDialog.js:101
msgctxt "button" msgctxt "button"
msgid "Install &amp; Power Off" msgid "Install &amp; Power Off"
msgstr "Pasang &amp; Matikan" msgstr "Pasang &amp; Matikan"
#: js/ui/endSessionDialog.js:99 #: js/ui/endSessionDialog.js:102
msgctxt "checkbox" msgctxt "checkbox"
msgid "Power off after updates are installed" msgid "Power off after updates are installed"
msgstr "Matikan daya setelah pemutakhiran dipasang" msgstr "Matikan daya setelah pemutakhiran dipasang"
#: js/ui/endSessionDialog.js:106 #: js/ui/endSessionDialog.js:110
msgctxt "title" msgctxt "title"
msgid "Restart & Install Upgrade" msgid "Restart & Install Upgrade"
msgstr "Start Ulang & Pasang Peningkatan" msgstr "Start Ulang & Pasang Peningkatan"
@@ -1303,7 +1301,7 @@ msgstr "Start Ulang & Pasang Peningkatan"
#. Translators: This is the text displayed for system upgrades in the #. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and #. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to #. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111 #: js/ui/endSessionDialog.js:115
#, javascript-format #, javascript-format
msgid "" msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long " "%s %s will be installed after restart. Upgrade installation can take a long "
@@ -1313,27 +1311,27 @@ msgstr ""
"waktu lama: pastikan bahwa Anda telah melakukan back up dan komputer " "waktu lama: pastikan bahwa Anda telah melakukan back up dan komputer "
"tersambung ke listrik." "tersambung ke listrik."
#: js/ui/endSessionDialog.js:259 #: js/ui/endSessionDialog.js:301
msgid "Running on battery power: Please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"Berjalan memakai daya baterai: Harap tancapkan sebelum memasang pemutakhiran." "Berjalan memakai daya baterai: harap tancapkan sebelum memasang pemutakhiran."
#: js/ui/endSessionDialog.js:268 #: js/ui/endSessionDialog.js:320
msgid "Some applications are busy or have unsaved work" msgid "Some applications are busy or have unsaved work."
msgstr "Beberapa aplikasi sedang sibuk atau belum disimpan perubahannya" msgstr "Beberapa aplikasi sedang sibuk atau belum disimpan perubahannya."
#: js/ui/endSessionDialog.js:273 #: js/ui/endSessionDialog.js:327
msgid "Other users are logged in" msgid "Other users are logged in."
msgstr "Pengguna lain sedang log masuk" msgstr "Pengguna lain sedang log masuk."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588 #: js/ui/endSessionDialog.js:649
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (jarak jauh)" msgstr "%s (jarak jauh)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591 #: js/ui/endSessionDialog.js:652
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konsol)" msgstr "%s (konsol)"
@@ -1357,16 +1355,16 @@ msgid "Application wants to inhibit shortcuts"
msgstr "Aplikasi ingin mencegah pintasan" msgstr "Aplikasi ingin mencegah pintasan"
#. Translators: %s is a keyboard shortcut like "Super+x" #. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:89 #: js/ui/inhibitShortcutsDialog.js:90
#, javascript-format #, javascript-format
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Anda dapat memulihkan pintasan dengan menekan %s." msgstr "Anda dapat memulihkan pintasan dengan menekan %s."
#: js/ui/inhibitShortcutsDialog.js:95 #: js/ui/inhibitShortcutsDialog.js:96
msgid "Deny" msgid "Deny"
msgstr "Tolak" msgstr "Tolak"
#: js/ui/inhibitShortcutsDialog.js:102 #: js/ui/inhibitShortcutsDialog.js:103
msgid "Allow" msgid "Allow"
msgstr "Izinkan" msgstr "Izinkan"
@@ -1412,16 +1410,16 @@ msgstr ""
"berturut-turut. Ini mematikan fitur Tombol Lengket, yang mempengaruhi cara " "berturut-turut. Ini mematikan fitur Tombol Lengket, yang mempengaruhi cara "
"kerja papan tik Anda." "kerja papan tik Anda."
#: js/ui/kbdA11yDialog.js:57 #: js/ui/kbdA11yDialog.js:58
msgid "Leave On" msgid "Leave On"
msgstr "Biarkan Menyala" msgstr "Biarkan Menyala"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:135 #: js/ui/kbdA11yDialog.js:58 js/ui/status/bluetooth.js:135
#: js/ui/status/network.js:1285 #: js/ui/status/network.js:1285
msgid "Turn On" msgid "Turn On"
msgstr "Nyalakan" msgstr "Nyalakan"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:135 #: js/ui/kbdA11yDialog.js:66 js/ui/status/bluetooth.js:135
#: js/ui/status/network.js:131 js/ui/status/network.js:315 #: js/ui/status/network.js:131 js/ui/status/network.js:315
#: js/ui/status/network.js:1285 js/ui/status/network.js:1397 #: js/ui/status/network.js:1285 js/ui/status/network.js:1397
#: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81 #: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
@@ -1429,7 +1427,7 @@ msgstr "Nyalakan"
msgid "Turn Off" msgid "Turn Off"
msgstr "Matikan" msgstr "Matikan"
#: js/ui/kbdA11yDialog.js:65 #: js/ui/kbdA11yDialog.js:66
msgid "Leave Off" msgid "Leave Off"
msgstr "Biarkan Mati" msgstr "Biarkan Mati"
@@ -1649,11 +1647,11 @@ msgstr "GNOME perlu mengunci layar"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:830 js/ui/screenShield.js:1301 #: js/ui/screenShield.js:831 js/ui/screenShield.js:1303
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Tak bisa mengunci" msgstr "Tak bisa mengunci"
#: js/ui/screenShield.js:831 js/ui/screenShield.js:1302 #: js/ui/screenShield.js:832 js/ui/screenShield.js:1304
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Kunci diblokir oleh suatu aplikasi" msgstr "Kunci diblokir oleh suatu aplikasi"
@@ -1688,24 +1686,24 @@ msgstr "Tampilkan Teks"
msgid "Hide Text" msgid "Hide Text"
msgstr "Sembunyikan Teks" msgstr "Sembunyikan Teks"
#: js/ui/shellEntry.js:162 #: js/ui/shellEntry.js:161
msgid "Caps lock is on." msgid "Caps lock is on."
msgstr "Caps lock menyala." msgstr "Caps lock menyala."
#: js/ui/shellMountOperation.js:305 #: js/ui/shellMountOperation.js:308
msgid "Hidden Volume" msgid "Hidden Volume"
msgstr "Volume Tersembunyi" msgstr "Volume Tersembunyi"
#: js/ui/shellMountOperation.js:308 #: js/ui/shellMountOperation.js:311
msgid "Windows System Volume" msgid "Windows System Volume"
msgstr "Volume Sistem Windows" msgstr "Volume Sistem Windows"
#: js/ui/shellMountOperation.js:311 #: js/ui/shellMountOperation.js:314
msgid "Uses Keyfiles" msgid "Uses Keyfiles"
msgstr "Gunakan Berkas Kunci" msgstr "Gunakan Berkas Kunci"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:317 #: js/ui/shellMountOperation.js:320
#, javascript-format #, javascript-format
msgid "" msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead." "To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
@@ -1713,36 +1711,36 @@ msgstr ""
"Untuk membuka kunci volume yang menggunakan berkas kunci, gunakan utilitas " "Untuk membuka kunci volume yang menggunakan berkas kunci, gunakan utilitas "
"<i>%s</i>." "<i>%s</i>."
#: js/ui/shellMountOperation.js:324 #: js/ui/shellMountOperation.js:327
msgid "PIM Number" msgid "PIM Number"
msgstr "Nomor PIM" msgstr "Nomor PIM"
#: js/ui/shellMountOperation.js:343 #: js/ui/shellMountOperation.js:346
msgid "The PIM must be a number or empty." msgid "The PIM must be a number or empty."
msgstr "PIM harus berupa angka atau kosong." msgstr "PIM harus berupa angka atau kosong."
#: js/ui/shellMountOperation.js:354 #: js/ui/shellMountOperation.js:357
msgid "Password" msgid "Password"
msgstr "Sandi" msgstr "Sandi"
#: js/ui/shellMountOperation.js:390 #: js/ui/shellMountOperation.js:393
msgid "Remember Password" msgid "Remember Password"
msgstr "Ingat Sandi" msgstr "Ingat Sandi"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:414 #: js/ui/shellMountOperation.js:417
#, javascript-format #, javascript-format
msgid "Open %s" msgid "Open %s"
msgstr "Buka %s" msgstr "Buka %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:486 #: js/ui/shellMountOperation.js:489
#, javascript-format #, javascript-format
msgid "Unable to start %s" msgid "Unable to start %s"
msgstr "Tak bisa memulai %s" msgstr "Tak bisa memulai %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:488 #: js/ui/shellMountOperation.js:491
#, javascript-format #, javascript-format
msgid "Couldnt find the %s application" msgid "Couldnt find the %s application"
msgstr "Tak bisa menemukan aplikasi %s" msgstr "Tak bisa menemukan aplikasi %s"
@@ -1872,12 +1870,12 @@ msgid "Enable"
msgstr "Fungsikan" msgstr "Fungsikan"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:355 #: js/ui/status/location.js:357
#, javascript-format #, javascript-format
msgid "Give %s access to your location?" msgid "Give %s access to your location?"
msgstr "Beri %s akses ke lokasi Anda?" msgstr "Beri %s akses ke lokasi Anda?"
#: js/ui/status/location.js:361 #: js/ui/status/location.js:358
msgid "Location access can be changed at any time from the privacy settings." msgid "Location access can be changed at any time from the privacy settings."
msgstr "Akses lokasi dapat diubah setiap saat dari pengaturan privasi." msgstr "Akses lokasi dapat diubah setiap saat dari pengaturan privasi."
@@ -2268,22 +2266,22 @@ msgstr "Cari"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "“%s” siap" msgstr "“%s” siap"
#: js/ui/windowManager.js:54 #: js/ui/windowManager.js:57
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "Apakah Anda ingin mempertahankan pengaturan tampilan ini?" msgstr "Apakah Anda ingin mempertahankan pengaturan tampilan ini?"
#. Translators: this and the following message should be limited in length, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:71
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Balikkan Tatanan" msgstr "Balikkan Tatanan"
#: js/ui/windowManager.js:71 #: js/ui/windowManager.js:74
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Simpan Perubahan" msgstr "Simpan Perubahan"
#: js/ui/windowManager.js:89 #: js/ui/windowManager.js:92
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@@ -2292,7 +2290,7 @@ msgstr[1] "Perubahan tatanan akan dikembalikan dalam %d detik"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546 #: js/ui/windowManager.js:690
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2744,6 +2742,3 @@ msgstr[1] "%u Masukan"
#: subprojects/gvc/gvc-mixer-control.c:2766 #: subprojects/gvc/gvc-mixer-control.c:2766
msgid "System Sounds" msgid "System Sounds"
msgstr "Suara Sistem" msgstr "Suara Sistem"
#~ msgid "Rename"
#~ msgstr "Ubah Nama"

1404
po/ja.po

File diff suppressed because it is too large Load Diff

4050
po/ms.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

457
po/sk.po

File diff suppressed because it is too large Load Diff

1913
po/uk.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -24,6 +24,52 @@ def show_version(option, opt_str, value, parser):
print("GNOME Shell Performance Test @VERSION@") print("GNOME Shell Performance Test @VERSION@")
sys.exit() sys.exit()
def wait_for_dbus_name(wait_name):
loop = GLib.MainLoop()
def on_name_appeared(connection, name, new_owner, *args):
if not (name == wait_name and new_owner != ''):
return
loop.quit()
return
watch_id = Gio.bus_watch_name(Gio.BusType.SESSION,
wait_name,
Gio.BusNameWatcherFlags.NONE,
on_name_appeared,
None)
def on_timeout():
print("\nFailed to start %s: timed out" % (wait_name,))
sys.exit(1)
GLib.timeout_add_seconds(7, on_timeout)
loop.run()
Gio.bus_unwatch_name(watch_id)
PERF_HELPER_NAME = "org.gnome.Shell.PerfHelper"
PERF_HELPER_IFACE = "org.gnome.Shell.PerfHelper"
PERF_HELPER_PATH = "/org/gnome/Shell/PerfHelper"
def start_perf_helper():
self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
perf_helper_path = "@libexecdir@/gnome-shell-perf-helper"
subprocess.Popen([perf_helper_path])
wait_for_dbus_name (PERF_HELPER_NAME)
def stop_perf_helper():
bus = Gio.bus_get_sync(Gio.BusType.SESSION, None)
proxy = Gio.DBusProxy.new_sync(bus,
Gio.DBusProxyFlags.NONE,
None,
PERF_HELPER_NAME,
PERF_HELPER_PATH,
PERF_HELPER_IFACE,
None)
proxy.Exit()
def start_shell(perf_output=None): def start_shell(perf_output=None):
# Set up environment # Set up environment
env = dict(os.environ) env = dict(os.environ)
@@ -45,13 +91,6 @@ def start_shell(perf_output=None):
if options.replace: if options.replace:
args.append('--replace') args.append('--replace')
if options.wayland or options.nested:
args.append('--wayland')
if options.nested:
args.append('--nested')
else:
args.append('--display-server')
return subprocess.Popen(args, env=env) return subprocess.Popen(args, env=env)
def run_shell(perf_output=None): def run_shell(perf_output=None):
@@ -165,6 +204,8 @@ def run_performance_test():
logs = [] logs = []
metric_summaries = {} metric_summaries = {}
start_perf_helper()
for i in range(0, iters): for i in range(0, iters):
# We create an empty temporary file that the shell will overwrite # We create an empty temporary file that the shell will overwrite
# with the contents. # with the contents.
@@ -176,12 +217,14 @@ def run_performance_test():
try: try:
normal_exit = run_shell(perf_output=output_file) normal_exit = run_shell(perf_output=output_file)
except: except:
stop_perf_helper()
raise raise
finally: finally:
if not normal_exit: if not normal_exit:
os.remove(output_file) os.remove(output_file)
if not normal_exit: if not normal_exit:
stop_perf_helper()
return False return False
try: try:
@@ -189,6 +232,7 @@ def run_performance_test():
output = json.load(f) output = json.load(f)
f.close() f.close()
except: except:
stop_perf_helper()
raise raise
finally: finally:
os.remove(output_file) os.remove(output_file)
@@ -216,6 +260,8 @@ def run_performance_test():
logs.append(output['log']) logs.append(output['log'])
stop_perf_helper()
if options.perf_output or options.perf_upload: if options.perf_output or options.perf_upload:
# Write a complete report, formatted as JSON. The Javascript/C code that # Write a complete report, formatted as JSON. The Javascript/C code that
# generates the individual reports we are summarizing here is very careful # generates the individual reports we are summarizing here is very careful
@@ -291,10 +337,6 @@ parser.add_option("", "--version", action="callback", callback=show_version,
parser.add_option("-r", "--replace", action="store_true", parser.add_option("-r", "--replace", action="store_true",
help="Replace the running window manager") help="Replace the running window manager")
parser.add_option("-w", "--wayland", action="store_true",
help="Run as a Wayland compositor")
parser.add_option("-n", "--nested", action="store_true",
help="Run as a Wayland nested compositor")
options, args = parser.parse_args() options, args = parser.parse_args()

View File

@@ -186,7 +186,7 @@ window_backed_app_get_icon (ShellApp *app,
{ {
MetaWindow *window = NULL; MetaWindow *window = NULL;
StWidget *widget; StWidget *widget;
int scale, scaled_size; gint scale;
ShellGlobal *global; ShellGlobal *global;
StThemeContext *context; StThemeContext *context;
@@ -194,7 +194,7 @@ window_backed_app_get_icon (ShellApp *app,
context = st_theme_context_get_for_stage (shell_global_get_stage (global)); context = st_theme_context_get_for_stage (shell_global_get_stage (global));
g_object_get (context, "scale-factor", &scale, NULL); g_object_get (context, "scale-factor", &scale, NULL);
scaled_size = size * scale; size *= scale;
/* During a state transition from running to not-running for /* During a state transition from running to not-running for
* window-backend apps, it's possible we get a request for the icon. * window-backend apps, it's possible we get a request for the icon.
@@ -208,28 +208,14 @@ window_backed_app_get_icon (ShellApp *app,
ClutterActor *actor; ClutterActor *actor;
actor = clutter_actor_new (); actor = clutter_actor_new ();
g_object_set (actor, g_object_set (actor, "opacity", 0, "width", (float) size, "height", (float) size, NULL);
"opacity", 0,
"width", (float) scaled_size,
"height", (float) scaled_size,
NULL);
return actor; return actor;
} }
if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11) widget = st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
{ G_OBJECT (window),
widget = st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (), "icon",
G_OBJECT (window), size);
"icon",
scaled_size);
}
else
{
widget = g_object_new (ST_TYPE_ICON,
"icon-size", size,
"icon-name", "application-x-executable",
NULL);
}
st_widget_add_style_class_name (widget, "fallback-app-icon"); st_widget_add_style_class_name (widget, "fallback-app-icon");
return CLUTTER_ACTOR (widget); return CLUTTER_ACTOR (widget);

View File

@@ -1333,12 +1333,9 @@ shell_global_sync_pointer (ShellGlobal *global)
int x, y; int x, y;
ClutterModifierType mods; ClutterModifierType mods;
ClutterMotionEvent event; ClutterMotionEvent event;
ClutterSeat *seat;
shell_global_get_pointer (global, &x, &y, &mods); shell_global_get_pointer (global, &x, &y, &mods);
seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
event.type = CLUTTER_MOTION; event.type = CLUTTER_MOTION;
event.time = shell_global_get_current_time (global); event.time = shell_global_get_current_time (global);
event.flags = CLUTTER_EVENT_FLAG_SYNTHETIC; event.flags = CLUTTER_EVENT_FLAG_SYNTHETIC;
@@ -1347,7 +1344,8 @@ shell_global_sync_pointer (ShellGlobal *global)
event.y = y; event.y = y;
event.modifier_state = mods; event.modifier_state = mods;
event.axes = NULL; event.axes = NULL;
event.device = clutter_seat_get_pointer (seat); event.device = clutter_device_manager_get_device (clutter_device_manager_get_default (),
META_VIRTUAL_CORE_POINTER_ID);
/* Leaving event.source NULL will force clutter to look it up, which /* Leaving event.source NULL will force clutter to look it up, which
* will generate enter/leave events as a side effect, if they are * will generate enter/leave events as a side effect, if they are

View File

@@ -146,7 +146,7 @@ G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
/* The default pipeline. /* The default pipeline.
*/ */
#define DEFAULT_PIPELINE "vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux" #define DEFAULT_PIPELINE "vp9enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux"
/* If we can find the amount of memory on the machine, we use half /* If we can find the amount of memory on the machine, we use half
* of that for memory_target, otherwise, we use this value, in kB. * of that for memory_target, otherwise, we use this value, in kB.
@@ -1467,7 +1467,7 @@ shell_recorder_set_draw_cursor (ShellRecorder *recorder,
* might be used to send the output to an icecast server * might be used to send the output to an icecast server
* via shout2send or similar. * via shout2send or similar.
* *
* The default value is 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' * The default value is 'vp9enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux'
*/ */
void void
shell_recorder_set_pipeline (ShellRecorder *recorder, shell_recorder_set_pipeline (ShellRecorder *recorder,

View File

@@ -27,7 +27,6 @@ st_headers = [
'st-theme-context.h', 'st-theme-context.h',
'st-theme-node.h', 'st-theme-node.h',
'st-types.h', 'st-types.h',
'st-viewport.h',
'st-widget.h', 'st-widget.h',
'st-widget-accessible.h' 'st-widget-accessible.h'
] ]
@@ -141,7 +140,6 @@ st_sources = [
'st-theme-node.c', 'st-theme-node.c',
'st-theme-node-drawing.c', 'st-theme-node-drawing.c',
'st-theme-node-transition.c', 'st-theme-node-transition.c',
'st-viewport.c',
'st-widget.c' 'st-widget.c'
] ]

View File

@@ -57,12 +57,16 @@
static void st_box_container_iface_init (ClutterContainerIface *iface); static void st_box_container_iface_init (ClutterContainerIface *iface);
static void st_box_scrollable_interface_init (StScrollableInterface *iface);
enum { enum {
PROP_0, PROP_0,
PROP_VERTICAL, PROP_VERTICAL,
PROP_PACK_START, PROP_PACK_START,
PROP_HADJUST,
PROP_VADJUST
}; };
struct _StBoxLayoutPrivate struct _StBoxLayoutPrivate
@@ -71,10 +75,104 @@ struct _StBoxLayoutPrivate
StAdjustment *vadjustment; StAdjustment *vadjustment;
}; };
G_DEFINE_TYPE_WITH_CODE (StBoxLayout, st_box_layout, ST_TYPE_VIEWPORT, G_DEFINE_TYPE_WITH_CODE (StBoxLayout, st_box_layout, ST_TYPE_WIDGET,
G_ADD_PRIVATE (StBoxLayout) G_ADD_PRIVATE (StBoxLayout)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER, G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
st_box_container_iface_init)); st_box_container_iface_init)
G_IMPLEMENT_INTERFACE (ST_TYPE_SCROLLABLE,
st_box_scrollable_interface_init));
/*
* StScrollable Interface Implementation
*/
static void
adjustment_value_notify_cb (StAdjustment *adjustment,
GParamSpec *pspec,
StBoxLayout *box)
{
clutter_actor_queue_relayout (CLUTTER_ACTOR (box));
}
static void
scrollable_set_adjustments (StScrollable *scrollable,
StAdjustment *hadjustment,
StAdjustment *vadjustment)
{
StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (scrollable)->priv;
g_object_freeze_notify (G_OBJECT (scrollable));
if (hadjustment != priv->hadjustment)
{
if (priv->hadjustment)
{
g_signal_handlers_disconnect_by_func (priv->hadjustment,
adjustment_value_notify_cb,
scrollable);
g_object_unref (priv->hadjustment);
}
if (hadjustment)
{
g_object_ref (hadjustment);
g_signal_connect (hadjustment, "notify::value",
G_CALLBACK (adjustment_value_notify_cb),
scrollable);
}
priv->hadjustment = hadjustment;
g_object_notify (G_OBJECT (scrollable), "hadjustment");
}
if (vadjustment != priv->vadjustment)
{
if (priv->vadjustment)
{
g_signal_handlers_disconnect_by_func (priv->vadjustment,
adjustment_value_notify_cb,
scrollable);
g_object_unref (priv->vadjustment);
}
if (vadjustment)
{
g_object_ref (vadjustment);
g_signal_connect (vadjustment, "notify::value",
G_CALLBACK (adjustment_value_notify_cb),
scrollable);
}
priv->vadjustment = vadjustment;
g_object_notify (G_OBJECT (scrollable), "vadjustment");
}
g_object_thaw_notify (G_OBJECT (scrollable));
}
static void
scrollable_get_adjustments (StScrollable *scrollable,
StAdjustment **hadjustment,
StAdjustment **vadjustment)
{
StBoxLayoutPrivate *priv;
priv = (ST_BOX_LAYOUT (scrollable))->priv;
if (hadjustment)
*hadjustment = priv->hadjustment;
if (vadjustment)
*vadjustment = priv->vadjustment;
}
static void
st_box_scrollable_interface_init (StScrollableInterface *iface)
{
iface->set_adjustments = scrollable_set_adjustments;
iface->get_adjustments = scrollable_get_adjustments;
}
static void static void
st_box_container_iface_init (ClutterContainerIface *iface) st_box_container_iface_init (ClutterContainerIface *iface)
@@ -90,6 +188,7 @@ st_box_layout_get_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ClutterLayoutManager *layout; ClutterLayoutManager *layout;
StAdjustment *adjustment;
ClutterOrientation orientation; ClutterOrientation orientation;
switch (property_id) switch (property_id)
@@ -105,6 +204,16 @@ st_box_layout_get_property (GObject *object,
g_value_set_boolean (value, clutter_box_layout_get_pack_start (CLUTTER_BOX_LAYOUT (layout))); g_value_set_boolean (value, clutter_box_layout_get_pack_start (CLUTTER_BOX_LAYOUT (layout)));
break; break;
case PROP_HADJUST:
scrollable_get_adjustments (ST_SCROLLABLE (object), &adjustment, NULL);
g_value_set_object (value, adjustment);
break;
case PROP_VADJUST:
scrollable_get_adjustments (ST_SCROLLABLE (object), NULL, &adjustment);
g_value_set_object (value, adjustment);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
} }
@@ -128,11 +237,343 @@ st_box_layout_set_property (GObject *object,
st_box_layout_set_pack_start (box, g_value_get_boolean (value)); st_box_layout_set_pack_start (box, g_value_get_boolean (value));
break; break;
case PROP_HADJUST:
scrollable_set_adjustments (ST_SCROLLABLE (object),
g_value_get_object (value),
box->priv->vadjustment);
break;
case PROP_VADJUST:
scrollable_set_adjustments (ST_SCROLLABLE (object),
box->priv->hadjustment,
g_value_get_object (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
} }
} }
static void
st_box_layout_dispose (GObject *object)
{
StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (object)->priv;
if (priv->hadjustment)
{
g_object_unref (priv->hadjustment);
priv->hadjustment = NULL;
}
if (priv->vadjustment)
{
g_object_unref (priv->vadjustment);
priv->vadjustment = NULL;
}
G_OBJECT_CLASS (st_box_layout_parent_class)->dispose (object);
}
static void
st_box_layout_allocate (ClutterActor *actor,
const ClutterActorBox *box,
ClutterAllocationFlags flags)
{
StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (actor)->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
ClutterLayoutManager *layout = clutter_actor_get_layout_manager (actor);
ClutterActorBox viewport_content_box;
ClutterActorBox content_box;
gfloat avail_width, avail_height, min_width, natural_width, min_height, natural_height;
st_theme_node_get_content_box (theme_node, box, &viewport_content_box);
clutter_actor_box_get_size (&viewport_content_box, &avail_width, &avail_height);
clutter_layout_manager_get_preferred_width (layout, CLUTTER_CONTAINER (actor),
avail_height,
&min_width, &natural_width);
clutter_layout_manager_get_preferred_height (layout, CLUTTER_CONTAINER (actor),
MAX (avail_width, min_width),
&min_height, &natural_height);
/* Because StBoxLayout implements StScrollable, the allocation box passed here
* may not match the minimum sizes reported by the layout manager. When that
* happens, the content box needs to be adjusted to match the reported minimum
* sizes before being passed to clutter_layout_manager_allocate() */
clutter_actor_set_allocation (actor, box, flags);
content_box = viewport_content_box;
content_box.x2 += MAX (0, min_width - avail_width);
content_box.y2 += MAX (0, min_height - avail_height);
clutter_layout_manager_allocate (layout, CLUTTER_CONTAINER (actor),
&content_box, flags);
/* update adjustments for scrolling */
if (priv->vadjustment)
{
gdouble prev_value;
g_object_set (G_OBJECT (priv->vadjustment),
"lower", 0.0,
"upper", MAX (min_height, avail_height),
"page-size", avail_height,
"step-increment", avail_height / 6,
"page-increment", avail_height - avail_height / 6,
NULL);
prev_value = st_adjustment_get_value (priv->vadjustment);
st_adjustment_set_value (priv->vadjustment, prev_value);
}
if (priv->hadjustment)
{
gdouble prev_value;
g_object_set (G_OBJECT (priv->hadjustment),
"lower", 0.0,
"upper", MAX (min_width, avail_width),
"page-size", avail_width,
"step-increment", avail_width / 6,
"page-increment", avail_width - avail_width / 6,
NULL);
prev_value = st_adjustment_get_value (priv->hadjustment);
st_adjustment_set_value (priv->hadjustment, prev_value);
}
}
static void
st_box_layout_apply_transform (ClutterActor *a,
CoglMatrix *m)
{
StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (a)->priv;
gdouble x, y;
CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->apply_transform (a, m);
if (priv->hadjustment)
x = st_adjustment_get_value (priv->hadjustment);
else
x = 0;
if (priv->vadjustment)
y = st_adjustment_get_value (priv->vadjustment);
else
y = 0;
cogl_matrix_translate (m, (int) -x, (int) -y, 0);
}
/* If we are translated, then we need to translate back before chaining
* up or the background and borders will be drawn in the wrong place */
static void
get_border_paint_offsets (StBoxLayout *self,
double *x,
double *y)
{
StBoxLayoutPrivate *priv = self->priv;
if (priv->hadjustment)
*x = st_adjustment_get_value (priv->hadjustment);
else
*x = 0;
if (priv->vadjustment)
*y = st_adjustment_get_value (priv->vadjustment);
else
*y = 0;
}
static void
st_box_layout_paint (ClutterActor *actor,
ClutterPaintContext *paint_context)
{
StBoxLayout *self = ST_BOX_LAYOUT (actor);
StBoxLayoutPrivate *priv = self->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
gdouble x, y;
ClutterActorBox allocation_box;
ClutterActorBox content_box;
ClutterActor *child;
CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context);
get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
{
cogl_framebuffer_push_matrix (fb);
cogl_framebuffer_translate (fb, (int)x, (int)y, 0);
}
st_widget_paint_background (ST_WIDGET (actor), paint_context);
if (x != 0 || y != 0)
{
cogl_framebuffer_pop_matrix (fb);
}
if (clutter_actor_get_n_children (actor) == 0)
return;
clutter_actor_get_allocation_box (actor, &allocation_box);
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
content_box.x1 += x;
content_box.y1 += y;
content_box.x2 += x;
content_box.y2 += y;
/* The content area forms the viewport into the scrolled contents, while
* the borders and background stay in place; after drawing the borders and
* background, we clip to the content area */
if (priv->hadjustment || priv->vadjustment)
cogl_framebuffer_push_rectangle_clip (fb,
(int)content_box.x1,
(int)content_box.y1,
(int)content_box.x2,
(int)content_box.y2);
for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
clutter_actor_paint (child, paint_context);
if (priv->hadjustment || priv->vadjustment)
cogl_framebuffer_pop_clip (fb);
}
static void
st_box_layout_pick (ClutterActor *actor,
ClutterPickContext *pick_context)
{
StBoxLayout *self = ST_BOX_LAYOUT (actor);
StBoxLayoutPrivate *priv = self->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
gdouble x, y;
ClutterActorBox allocation_box;
ClutterActorBox content_box;
ClutterActor *child;
CoglFramebuffer *fb = clutter_pick_context_get_framebuffer (pick_context);
get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
{
cogl_framebuffer_push_matrix (fb);
cogl_framebuffer_translate (fb, (int)x, (int)y, 0);
}
CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->pick (actor, pick_context);
if (x != 0 || y != 0)
{
cogl_framebuffer_pop_matrix (fb);
}
if (clutter_actor_get_n_children (actor) == 0)
return;
clutter_actor_get_allocation_box (actor, &allocation_box);
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
content_box.x1 += x;
content_box.y1 += y;
content_box.x2 += x;
content_box.y2 += y;
if (priv->hadjustment || priv->vadjustment)
cogl_framebuffer_push_rectangle_clip (fb,
(int)content_box.x1,
(int)content_box.y1,
(int)content_box.x2,
(int)content_box.y2);
for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
clutter_actor_pick (child, pick_context);
if (priv->hadjustment || priv->vadjustment)
cogl_framebuffer_pop_clip (fb);
}
static gboolean
st_box_layout_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
StBoxLayout *self = ST_BOX_LAYOUT (actor);
gdouble x, y, lower, upper;
StBoxLayoutPrivate *priv = self->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
ClutterActorBox allocation_box;
ClutterActorBox content_box;
graphene_point3d_t origin;
/* Setting the paint volume does not make sense when we don't have any allocation */
if (!clutter_actor_has_allocation (actor))
return FALSE;
/* When have an adjustment we are clipped to the content box, so base
* our paint volume on that. */
if (priv->hadjustment || priv->vadjustment)
{
gdouble width, height;
clutter_actor_get_allocation_box (actor, &allocation_box);
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
origin.x = content_box.x1 - allocation_box.x1;
origin.y = content_box.y1 - allocation_box.y2;
origin.z = 0.f;
if (priv->hadjustment)
{
g_object_get (priv->hadjustment,
"lower", &lower,
"upper", &upper,
NULL);
width = upper - lower;
}
else
{
width = content_box.x2 - content_box.x1;
}
if (priv->vadjustment)
{
g_object_get (priv->vadjustment,
"lower", &lower,
"upper", &upper,
NULL);
height = upper - lower;
}
else
{
height = content_box.y2 - content_box.y1;
}
clutter_paint_volume_set_width (volume, width);
clutter_paint_volume_set_height (volume, height);
}
else if (!CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume))
return FALSE;
/* When scrolled, st_box_layout_apply_transform() includes the scroll offset
* and affects paint volumes. This is right for our children, but our paint volume
* is determined by our allocation and borders and doesn't scroll, so we need
* to reverse-compensate here, the same as we do when painting.
*/
get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
{
clutter_paint_volume_get_origin (volume, &origin);
origin.x += x;
origin.y += y;
clutter_paint_volume_set_origin (volume, &origin);
}
return TRUE;
}
static void static void
st_box_layout_style_changed (StWidget *self) st_box_layout_style_changed (StWidget *self)
{ {
@@ -182,11 +623,20 @@ static void
st_box_layout_class_init (StBoxLayoutClass *klass) st_box_layout_class_init (StBoxLayoutClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass); StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
object_class->get_property = st_box_layout_get_property; object_class->get_property = st_box_layout_get_property;
object_class->set_property = st_box_layout_set_property; object_class->set_property = st_box_layout_set_property;
object_class->dispose = st_box_layout_dispose;
actor_class->allocate = st_box_layout_allocate;
actor_class->apply_transform = st_box_layout_apply_transform;
actor_class->paint = st_box_layout_paint;
actor_class->get_paint_volume = st_box_layout_get_paint_volume;
actor_class->pick = st_box_layout_pick;
widget_class->style_changed = st_box_layout_style_changed; widget_class->style_changed = st_box_layout_style_changed;
@@ -204,6 +654,16 @@ st_box_layout_class_init (StBoxLayoutClass *klass)
FALSE, FALSE,
ST_PARAM_READWRITE); ST_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_PACK_START, pspec); g_object_class_install_property (object_class, PROP_PACK_START, pspec);
/* StScrollable properties */
g_object_class_override_property (object_class,
PROP_HADJUST,
"hadjustment");
g_object_class_override_property (object_class,
PROP_VADJUST,
"vadjustment");
} }
static void static void

View File

@@ -26,12 +26,11 @@
#define _ST_BOX_LAYOUT_H #define _ST_BOX_LAYOUT_H
#include <st/st-widget.h> #include <st/st-widget.h>
#include <st/st-viewport.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_BOX_LAYOUT st_box_layout_get_type() #define ST_TYPE_BOX_LAYOUT st_box_layout_get_type()
G_DECLARE_FINAL_TYPE (StBoxLayout, st_box_layout, ST, BOX_LAYOUT, StViewport) G_DECLARE_FINAL_TYPE (StBoxLayout, st_box_layout, ST, BOX_LAYOUT, StWidget)
typedef struct _StBoxLayout StBoxLayout; typedef struct _StBoxLayout StBoxLayout;
typedef struct _StBoxLayoutPrivate StBoxLayoutPrivate; typedef struct _StBoxLayoutPrivate StBoxLayoutPrivate;
@@ -45,7 +44,7 @@ typedef struct _StBoxLayoutPrivate StBoxLayoutPrivate;
struct _StBoxLayout struct _StBoxLayout
{ {
/*< private >*/ /*< private >*/
StViewport parent; StWidget parent;
StBoxLayoutPrivate *priv; StBoxLayoutPrivate *priv;
}; };

View File

@@ -232,7 +232,8 @@ st_entry_update_hint_visibility (StEntry *self)
StEntryPrivate *priv = ST_ENTRY_PRIV (self); StEntryPrivate *priv = ST_ENTRY_PRIV (self);
gboolean hint_visible = gboolean hint_visible =
priv->hint_actor != NULL && priv->hint_actor != NULL &&
strcmp (clutter_text_get_text (CLUTTER_TEXT (priv->entry)), "") == 0; strcmp (clutter_text_get_text (CLUTTER_TEXT (priv->entry)), "") == 0 &&
!HAS_FOCUS (priv->entry);
if (priv->hint_actor) if (priv->hint_actor)
g_object_set (priv->hint_actor, "visible", hint_visible, NULL); g_object_set (priv->hint_actor, "visible", hint_visible, NULL);
@@ -518,6 +519,10 @@ static void
clutter_text_focus_in_cb (ClutterText *text, clutter_text_focus_in_cb (ClutterText *text,
ClutterActor *actor) ClutterActor *actor)
{ {
StEntry *entry = ST_ENTRY (actor);
st_entry_update_hint_visibility (entry);
st_widget_add_style_pseudo_class (ST_WIDGET (actor), "focus"); st_widget_add_style_pseudo_class (ST_WIDGET (actor), "focus");
clutter_text_set_cursor_visible (text, TRUE); clutter_text_set_cursor_visible (text, TRUE);
} }
@@ -526,7 +531,12 @@ static void
clutter_text_focus_out_cb (ClutterText *text, clutter_text_focus_out_cb (ClutterText *text,
ClutterActor *actor) ClutterActor *actor)
{ {
StEntry *entry = ST_ENTRY (actor);
st_widget_remove_style_pseudo_class (ST_WIDGET (actor), "focus"); st_widget_remove_style_pseudo_class (ST_WIDGET (actor), "focus");
st_entry_update_hint_visibility (entry);
clutter_text_set_cursor_visible (text, FALSE); clutter_text_set_cursor_visible (text, FALSE);
} }
@@ -538,12 +548,8 @@ clutter_text_changed_cb (GObject *object,
StEntry *entry = ST_ENTRY (user_data); StEntry *entry = ST_ENTRY (user_data);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry); StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
st_entry_update_hint_visibility (entry);
/* Since the text changed, force a regen of the shadow texture */ /* Since the text changed, force a regen of the shadow texture */
cogl_clear_object (&priv->text_shadow_material); cogl_clear_object (&priv->text_shadow_material);
g_object_notify_by_pspec (G_OBJECT (entry), props[PROP_TEXT]);
} }
static void static void
@@ -1033,8 +1039,10 @@ st_entry_get_text (StEntry *entry)
g_return_val_if_fail (ST_IS_ENTRY (entry), NULL); g_return_val_if_fail (ST_IS_ENTRY (entry), NULL);
priv = st_entry_get_instance_private (entry); priv = st_entry_get_instance_private (entry);
if (priv->hint_actor != NULL && clutter_actor_is_visible (priv->hint_actor))
return clutter_text_get_text (CLUTTER_TEXT (priv->entry)); return "";
else
return clutter_text_get_text (CLUTTER_TEXT (priv->entry));
} }
/** /**
@@ -1056,8 +1064,9 @@ st_entry_set_text (StEntry *entry,
clutter_text_set_text (CLUTTER_TEXT (priv->entry), text); clutter_text_set_text (CLUTTER_TEXT (priv->entry), text);
/* Note: PROP_TEXT will get notfied from our notify::text handler connected st_entry_update_hint_visibility (entry);
* to priv->entry. */
g_object_notify_by_pspec (G_OBJECT (entry), props[PROP_TEXT]);
} }
/** /**
@@ -1095,8 +1104,6 @@ st_entry_set_hint_text (StEntry *entry,
g_return_if_fail (ST_IS_ENTRY (entry)); g_return_if_fail (ST_IS_ENTRY (entry));
label = st_label_new (text); label = st_label_new (text);
st_widget_add_style_class_name (label, "hint-text");
st_entry_set_hint_actor (ST_ENTRY (entry), CLUTTER_ACTOR (label)); st_entry_set_hint_actor (ST_ENTRY (entry), CLUTTER_ACTOR (label));
} }

View File

@@ -549,7 +549,7 @@ void
st_icon_set_icon_name (StIcon *icon, st_icon_set_icon_name (StIcon *icon,
const gchar *icon_name) const gchar *icon_name)
{ {
g_autoptr(GIcon) gicon = NULL; GIcon *gicon = NULL;
g_return_if_fail (ST_IS_ICON (icon)); g_return_if_fail (ST_IS_ICON (icon));
@@ -726,7 +726,7 @@ void
st_icon_set_fallback_icon_name (StIcon *icon, st_icon_set_fallback_icon_name (StIcon *icon,
const gchar *fallback_icon_name) const gchar *fallback_icon_name)
{ {
g_autoptr(GIcon) gicon = NULL; GIcon *gicon = NULL;
g_return_if_fail (ST_IS_ICON (icon)); g_return_if_fail (ST_IS_ICON (icon));

View File

@@ -1,572 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-scrollable-wiget.c: a scrollable actor
*
* Copyright 2009 Intel Corporation.
* Copyright 2009 Abderrahim Kitouni
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2010 Florian Muellner
* Copyright 2019 Endless, Inc
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU Lesser General Public License,
* version 2.1, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* Portions copied from Clutter:
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Authored By Matthew Allum <mallum@openedhand.com>
*
* Copyright (C) 2006 OpenedHand
* This library 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.
*/
/**
* SECTION:st-viewport
* @short_description: a scrollable container
*
* The #StViewport is a generic #StScrollable implementation.
*
*/
#include <stdlib.h>
#include "st-viewport.h"
#include "st-private.h"
#include "st-scrollable.h"
static void st_viewport_scrollable_interface_init (StScrollableInterface *iface);
enum {
PROP_0,
PROP_HADJUST,
PROP_VADJUST
};
typedef struct
{
StAdjustment *hadjustment;
StAdjustment *vadjustment;
} StViewportPrivate;
G_DEFINE_TYPE_WITH_CODE (StViewport, st_viewport, ST_TYPE_WIDGET,
G_ADD_PRIVATE (StViewport)
G_IMPLEMENT_INTERFACE (ST_TYPE_SCROLLABLE,
st_viewport_scrollable_interface_init));
/*
* StScrollable Interface Implementation
*/
static void
adjustment_value_notify_cb (StAdjustment *adjustment,
GParamSpec *pspec,
StViewport *viewport)
{
clutter_actor_queue_relayout (CLUTTER_ACTOR (viewport));
}
static void
scrollable_set_adjustments (StScrollable *scrollable,
StAdjustment *hadjustment,
StAdjustment *vadjustment)
{
StViewport *viewport = ST_VIEWPORT (scrollable);
StViewportPrivate *priv =
st_viewport_get_instance_private (viewport);
g_object_freeze_notify (G_OBJECT (scrollable));
if (hadjustment != priv->hadjustment)
{
if (priv->hadjustment)
{
g_signal_handlers_disconnect_by_func (priv->hadjustment,
adjustment_value_notify_cb,
scrollable);
g_object_unref (priv->hadjustment);
}
if (hadjustment)
{
g_object_ref (hadjustment);
g_signal_connect (hadjustment, "notify::value",
G_CALLBACK (adjustment_value_notify_cb),
scrollable);
}
priv->hadjustment = hadjustment;
g_object_notify (G_OBJECT (scrollable), "hadjustment");
}
if (vadjustment != priv->vadjustment)
{
if (priv->vadjustment)
{
g_signal_handlers_disconnect_by_func (priv->vadjustment,
adjustment_value_notify_cb,
scrollable);
g_object_unref (priv->vadjustment);
}
if (vadjustment)
{
g_object_ref (vadjustment);
g_signal_connect (vadjustment, "notify::value",
G_CALLBACK (adjustment_value_notify_cb),
scrollable);
}
priv->vadjustment = vadjustment;
g_object_notify (G_OBJECT (scrollable), "vadjustment");
}
g_object_thaw_notify (G_OBJECT (scrollable));
}
static void
scrollable_get_adjustments (StScrollable *scrollable,
StAdjustment **hadjustment,
StAdjustment **vadjustment)
{
StViewport *viewport = ST_VIEWPORT (scrollable);
StViewportPrivate *priv =
st_viewport_get_instance_private (viewport);
if (hadjustment)
*hadjustment = priv->hadjustment;
if (vadjustment)
*vadjustment = priv->vadjustment;
}
static void
st_viewport_scrollable_interface_init (StScrollableInterface *iface)
{
iface->set_adjustments = scrollable_set_adjustments;
iface->get_adjustments = scrollable_get_adjustments;
}
static void
st_viewport_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
StAdjustment *adjustment;
switch (property_id)
{
case PROP_HADJUST:
scrollable_get_adjustments (ST_SCROLLABLE (object), &adjustment, NULL);
g_value_set_object (value, adjustment);
break;
case PROP_VADJUST:
scrollable_get_adjustments (ST_SCROLLABLE (object), NULL, &adjustment);
g_value_set_object (value, adjustment);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
st_viewport_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
StViewport *viewport = ST_VIEWPORT (object);
StViewportPrivate *priv =
st_viewport_get_instance_private (viewport);
switch (property_id)
{
case PROP_HADJUST:
scrollable_set_adjustments (ST_SCROLLABLE (object),
g_value_get_object (value),
priv->vadjustment);
break;
case PROP_VADJUST:
scrollable_set_adjustments (ST_SCROLLABLE (object),
priv->hadjustment,
g_value_get_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
st_viewport_dispose (GObject *object)
{
StViewport *viewport = ST_VIEWPORT (object);
StViewportPrivate *priv =
st_viewport_get_instance_private (viewport);
g_clear_object (&priv->hadjustment);
g_clear_object (&priv->vadjustment);
G_OBJECT_CLASS (st_viewport_parent_class)->dispose (object);
}
static void
st_viewport_allocate (ClutterActor *actor,
const ClutterActorBox *box,
ClutterAllocationFlags flags)
{
StViewport *viewport = ST_VIEWPORT (actor);
StViewportPrivate *priv =
st_viewport_get_instance_private (viewport);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
ClutterLayoutManager *layout = clutter_actor_get_layout_manager (actor);
ClutterActorBox viewport_box;
ClutterActorBox content_box;
float avail_width, avail_height;
float min_width, natural_width;
float min_height, natural_height;
st_theme_node_get_content_box (theme_node, box, &viewport_box);
clutter_actor_box_get_size (&viewport_box, &avail_width, &avail_height);
clutter_layout_manager_get_preferred_width (layout, CLUTTER_CONTAINER (actor),
avail_height,
&min_width, &natural_width);
clutter_layout_manager_get_preferred_height (layout, CLUTTER_CONTAINER (actor),
MAX (avail_width, min_width),
&min_height, &natural_height);
/* Because StViewport implements StScrollable, the allocation box passed here
* may not match the minimum sizes reported by the layout manager. When that
* happens, the content box needs to be adjusted to match the reported minimum
* sizes before being passed to clutter_layout_manager_allocate() */
clutter_actor_set_allocation (actor, box, flags);
content_box = viewport_box;
content_box.x2 += MAX (0, min_width - avail_width);
content_box.y2 += MAX (0, min_height - avail_height);
clutter_layout_manager_allocate (layout, CLUTTER_CONTAINER (actor),
&content_box, flags);
/* update adjustments for scrolling */
if (priv->vadjustment)
{
double prev_value;
g_object_set (G_OBJECT (priv->vadjustment),
"lower", 0.0,
"upper", MAX (min_height, avail_height),
"page-size", avail_height,
"step-increment", avail_height / 6,
"page-increment", avail_height - avail_height / 6,
NULL);
prev_value = st_adjustment_get_value (priv->vadjustment);
st_adjustment_set_value (priv->vadjustment, prev_value);
}
if (priv->hadjustment)
{
double prev_value;
g_object_set (G_OBJECT (priv->hadjustment),
"lower", 0.0,
"upper", MAX (min_width, avail_width),
"page-size", avail_width,
"step-increment", avail_width / 6,
"page-increment", avail_width - avail_width / 6,
NULL);
prev_value = st_adjustment_get_value (priv->hadjustment);
st_adjustment_set_value (priv->hadjustment, prev_value);
}
}
static void
st_viewport_apply_transform (ClutterActor *actor,
CoglMatrix *matrix)
{
StViewport *viewport = ST_VIEWPORT (actor);
StViewportPrivate *priv = st_viewport_get_instance_private (viewport);
ClutterActorClass *parent_class =
CLUTTER_ACTOR_CLASS (st_viewport_parent_class);
double x, y;
parent_class->apply_transform (actor, matrix);
if (priv->hadjustment)
x = st_adjustment_get_value (priv->hadjustment);
else
x = 0;
if (priv->vadjustment)
y = st_adjustment_get_value (priv->vadjustment);
else
y = 0;
cogl_matrix_translate (matrix, (int) -x, (int) -y, 0);
}
/* If we are translated, then we need to translate back before chaining
* up or the background and borders will be drawn in the wrong place */
static void
get_border_paint_offsets (StViewport *viewport,
double *x,
double *y)
{
StViewportPrivate *priv = st_viewport_get_instance_private (viewport);
if (priv->hadjustment)
*x = st_adjustment_get_value (priv->hadjustment);
else
*x = 0;
if (priv->vadjustment)
*y = st_adjustment_get_value (priv->vadjustment);
else
*y = 0;
}
static void
st_viewport_paint (ClutterActor *actor,
ClutterPaintContext *paint_context)
{
StViewport *viewport = ST_VIEWPORT (actor);
StViewportPrivate *priv = st_viewport_get_instance_private (viewport);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
double x, y;
ClutterActorBox allocation_box;
ClutterActorBox content_box;
ClutterActor *child;
CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context);
get_border_paint_offsets (viewport, &x, &y);
if (x != 0 || y != 0)
{
cogl_framebuffer_push_matrix (fb);
cogl_framebuffer_translate (fb, (int)x, (int)y, 0);
}
st_widget_paint_background (ST_WIDGET (actor), paint_context);
if (x != 0 || y != 0)
cogl_framebuffer_pop_matrix (fb);
if (clutter_actor_get_n_children (actor) == 0)
return;
clutter_actor_get_allocation_box (actor, &allocation_box);
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
content_box.x1 += x;
content_box.y1 += y;
content_box.x2 += x;
content_box.y2 += y;
/* The content area forms the viewport into the scrolled contents, while
* the borders and background stay in place; after drawing the borders and
* background, we clip to the content area */
if (priv->hadjustment || priv->vadjustment)
{
cogl_framebuffer_push_rectangle_clip (fb,
(int)content_box.x1,
(int)content_box.y1,
(int)content_box.x2,
(int)content_box.y2);
}
for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
clutter_actor_paint (child, paint_context);
if (priv->hadjustment || priv->vadjustment)
cogl_framebuffer_pop_clip (fb);
}
static void
st_viewport_pick (ClutterActor *actor,
ClutterPickContext *pick_context)
{
StViewport *viewport = ST_VIEWPORT (actor);
StViewportPrivate *priv = st_viewport_get_instance_private (viewport);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
double x, y;
ClutterActorBox allocation_box;
ClutterActorBox content_box;
ClutterActor *child;
CoglFramebuffer *fb = clutter_pick_context_get_framebuffer (pick_context);
get_border_paint_offsets (viewport, &x, &y);
if (x != 0 || y != 0)
{
cogl_framebuffer_push_matrix (fb);
cogl_framebuffer_translate (fb, (int)x, (int)y, 0);
}
CLUTTER_ACTOR_CLASS (st_viewport_parent_class)->pick (actor, pick_context);
if (x != 0 || y != 0)
cogl_framebuffer_pop_matrix (fb);
if (clutter_actor_get_n_children (actor) == 0)
return;
clutter_actor_get_allocation_box (actor, &allocation_box);
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
content_box.x1 += x;
content_box.y1 += y;
content_box.x2 += x;
content_box.y2 += y;
if (priv->hadjustment || priv->vadjustment)
{
cogl_framebuffer_push_rectangle_clip (fb,
(int)content_box.x1,
(int)content_box.y1,
(int)content_box.x2,
(int)content_box.y2);
}
for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
clutter_actor_pick (child, pick_context);
if (priv->hadjustment || priv->vadjustment)
cogl_framebuffer_pop_clip (fb);
}
static gboolean
st_viewport_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
StViewport *viewport = ST_VIEWPORT (actor);
StViewportPrivate *priv = st_viewport_get_instance_private (viewport);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
ClutterActorBox allocation_box;
ClutterActorBox content_box;
graphene_point3d_t origin;
double x, y, lower, upper;
/* Setting the paint volume does not make sense when we don't have any allocation */
if (!clutter_actor_has_allocation (actor))
return FALSE;
/* When have an adjustment we are clipped to the content box, so base
* our paint volume on that. */
if (priv->hadjustment || priv->vadjustment)
{
double width, height;
clutter_actor_get_allocation_box (actor, &allocation_box);
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
origin.x = content_box.x1 - allocation_box.x1;
origin.y = content_box.y1 - allocation_box.y2;
origin.z = 0.f;
if (priv->hadjustment)
{
g_object_get (priv->hadjustment,
"lower", &lower,
"upper", &upper,
NULL);
width = upper - lower;
}
else
{
width = content_box.x2 - content_box.x1;
}
if (priv->vadjustment)
{
g_object_get (priv->vadjustment,
"lower", &lower,
"upper", &upper,
NULL);
height = upper - lower;
}
else
{
height = content_box.y2 - content_box.y1;
}
clutter_paint_volume_set_width (volume, width);
clutter_paint_volume_set_height (volume, height);
}
else if (!CLUTTER_ACTOR_CLASS (st_viewport_parent_class)->get_paint_volume (actor, volume))
{
return FALSE;
}
/* When scrolled, st_viewport_apply_transform() includes the scroll offset
* and affects paint volumes. This is right for our children, but our paint volume
* is determined by our allocation and borders and doesn't scroll, so we need
* to reverse-compensate here, the same as we do when painting.
*/
get_border_paint_offsets (viewport, &x, &y);
if (x != 0 || y != 0)
{
clutter_paint_volume_get_origin (volume, &origin);
origin.x += x;
origin.y += y;
clutter_paint_volume_set_origin (volume, &origin);
}
return TRUE;
}
static void
st_viewport_class_init (StViewportClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
object_class->get_property = st_viewport_get_property;
object_class->set_property = st_viewport_set_property;
object_class->dispose = st_viewport_dispose;
actor_class->allocate = st_viewport_allocate;
actor_class->apply_transform = st_viewport_apply_transform;
actor_class->paint = st_viewport_paint;
actor_class->get_paint_volume = st_viewport_get_paint_volume;
actor_class->pick = st_viewport_pick;
/* StScrollable properties */
g_object_class_override_property (object_class,
PROP_HADJUST,
"hadjustment");
g_object_class_override_property (object_class,
PROP_VADJUST,
"vadjustment");
}
static void
st_viewport_init (StViewport *self)
{
}

View File

@@ -1,40 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-viewport.h: viewport actor
*
* Copyright 2009 Intel Corporation.
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2019 Endless, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU Lesser General Public License,
* version 2.1, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)
#error "Only <st/st.h> can be included directly.h"
#endif
#pragma once
#include <st/st-widget.h>
G_BEGIN_DECLS
#define ST_TYPE_VIEWPORT (st_viewport_get_type())
G_DECLARE_DERIVABLE_TYPE (StViewport, st_viewport, ST, VIEWPORT, StWidget)
struct _StViewportClass
{
StWidgetClass parent_class;
};
G_END_DECLS

View File

@@ -1897,12 +1897,12 @@ st_widget_set_hover (StWidget *widget,
void void
st_widget_sync_hover (StWidget *widget) st_widget_sync_hover (StWidget *widget)
{ {
ClutterDeviceManager *device_manager;
ClutterInputDevice *pointer; ClutterInputDevice *pointer;
ClutterActor *pointer_actor; ClutterActor *pointer_actor;
ClutterSeat *seat;
seat = clutter_backend_get_default_seat (clutter_get_default_backend ()); device_manager = clutter_device_manager_get_default ();
pointer = clutter_seat_get_pointer (seat); pointer = clutter_device_manager_get_device (device_manager, VIRTUAL_CORE_POINTER_ID);
pointer_actor = clutter_input_device_get_pointer_actor (pointer); pointer_actor = clutter_input_device_get_pointer_actor (pointer);
if (pointer_actor && clutter_actor_get_reactive (CLUTTER_ACTOR (widget))) if (pointer_actor && clutter_actor_get_reactive (CLUTTER_ACTOR (widget)))
st_widget_set_hover (widget, clutter_actor_contains (CLUTTER_ACTOR (widget), pointer_actor)); st_widget_set_hover (widget, clutter_actor_contains (CLUTTER_ACTOR (widget), pointer_actor));