Compare commits
1 Commits
wip/exalm/
...
wip/ewlsh/
Author | SHA1 | Date | |
---|---|---|---|
![]() |
170fe945a9 |
35
NEWS
35
NEWS
@@ -1,38 +1,3 @@
|
|||||||
3.37.3
|
|
||||||
======
|
|
||||||
* Refactor and clean up window picker
|
|
||||||
[Jonas D., Florian; !1297, !1298, !1305, !1345, !1353]
|
|
||||||
* Move calendar events out of notifications list [Florian; !1282]
|
|
||||||
* Refine app folder dialogs [Georges; !1301]
|
|
||||||
* Hide switch-user button on lock screen if unsupported [Chingkai; #2687]
|
|
||||||
* Refactor and clean up app picker pagination [Georges; !1271]
|
|
||||||
* Add API to retrieve specified mimetypes from clipboards [Carlos; !1321]
|
|
||||||
* Support prepending workspace with horizontal layouts [Florian; #2916]
|
|
||||||
* Update microphone icon on input volume changes [fludixx; #2902]
|
|
||||||
* Cache labels on GPU [Daniel; !1329]
|
|
||||||
* Fix regressions in redesigned modal dialogs [Florian, Jonas D.; #2491, !1336]
|
|
||||||
* Use GIcon for all application icons [Florian; !1342]
|
|
||||||
* Support pre-authenticated logins in vmware environments [yun341; #1983]
|
|
||||||
* Better support sandboxed apps with multiple .desktop files [Florian; #219]
|
|
||||||
* Fix on-screen keyboard size in portrait orientation [Florian; #2349]
|
|
||||||
* Plugged leaks [Sebastian, Daniel, Florian; !1306, !1319, !1341]
|
|
||||||
* Misc. bug fixes and cleanups [Jonas D., Georges, Marco, Florian, Sebastian,
|
|
||||||
MOZGIII, Daniel, Mariana, Jonas Å.; !1296, !1295, #2643, !1300, !1309,
|
|
||||||
!1119, #2901, !1313, !1251, !1285, !1307, !1318, !1310, !1320, !1327, !1315,
|
|
||||||
!1289, !1331, !1332, !1333, !1334, !1340, !1287, !1308, !1346, !1299, !1343,
|
|
||||||
!1351, !1352, !1322]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Marco Trevisan (Treviño), Chingkai, Jonas Dreßler, Carlos Garnacho,
|
|
||||||
Sebastian Keller, MOZGIII, Florian Müllner, Georges Basile Stavracas Neto,
|
|
||||||
Mariana Picolo, Daniel van Vugt, fludixx, yun341, Jonas Ådahl
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Daniel Mustieles [es], Boyuan Yang [zh_CN], Yuri Chornoivan [uk],
|
|
||||||
Jordi Mas [ca], sicklylife [ja], Emin Tufan Çetin [tr],
|
|
||||||
Baurzhan Muftakhidinov [kk], Florentina Mușat [ro], Aurimas Černius [lt],
|
|
||||||
Rūdolfs Mazurs [lv]
|
|
||||||
|
|
||||||
3.37.2
|
3.37.2
|
||||||
======
|
======
|
||||||
* Add support for "PrefersNonDefaultGPU" desktop key [Bastien; !1226]
|
* Add support for "PrefersNonDefaultGPU" desktop key [Bastien; !1226]
|
||||||
|
@@ -6,25 +6,25 @@
|
|||||||
<file>checkbox-off-focused.svg</file>
|
<file>checkbox-off-focused.svg</file>
|
||||||
<file>checkbox-off.svg</file>
|
<file>checkbox-off.svg</file>
|
||||||
<file>checkbox.svg</file>
|
<file>checkbox.svg</file>
|
||||||
<file alias="icons/scalable/actions/color-pick.svg">color-pick.svg</file>
|
<file alias="icons/color-pick.svg">color-pick.svg</file>
|
||||||
<file>dash-placeholder.svg</file>
|
<file>dash-placeholder.svg</file>
|
||||||
<file>gnome-shell.css</file>
|
<file>gnome-shell.css</file>
|
||||||
<file>gnome-shell-high-contrast.css</file>
|
<file>gnome-shell-high-contrast.css</file>
|
||||||
<file alias="icons/scalable/status/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
|
<file alias="icons/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
|
||||||
<file>no-events.svg</file>
|
<file>no-events.svg</file>
|
||||||
<file>no-notifications.svg</file>
|
<file>no-notifications.svg</file>
|
||||||
<file>pad-osd.css</file>
|
<file>pad-osd.css</file>
|
||||||
<file alias="icons/scalable/status/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
|
<file alias="icons/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/status/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
|
<file alias="icons/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/actions/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
<file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/actions/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
<file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/actions/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/actions/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
|
<file alias="icons/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/status/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file>
|
<file alias="icons/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/status/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file>
|
<file alias="icons/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/status/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file>
|
<file alias="icons/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/status/keyboard-layout-filled-symbolic.svg">keyboard-layout-filled-symbolic.svg</file>
|
<file alias="icons/keyboard-layout-filled-symbolic.svg">keyboard-layout-filled-symbolic.svg</file>
|
||||||
<file alias="icons/scalable/status/keyboard-shift-filled-symbolic.svg">keyboard-shift-filled-symbolic.svg</file>
|
<file alias="icons/keyboard-shift-filled-symbolic.svg">keyboard-shift-filled-symbolic.svg</file>
|
||||||
<file>process-working.svg</file>
|
<file>process-working.svg</file>
|
||||||
<file>toggle-off.svg</file>
|
<file>toggle-off.svg</file>
|
||||||
<file>toggle-off-dark.svg</file>
|
<file>toggle-off-dark.svg</file>
|
||||||
|
@@ -109,17 +109,6 @@
|
|||||||
the shell.
|
the shell.
|
||||||
</description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="app-picker-layout" type="aa{sv}">
|
|
||||||
<default>[]</default>
|
|
||||||
<summary>Layout of the app picker</summary>
|
|
||||||
<description>
|
|
||||||
Layout of the app picker. Each entry in the array is a page. Pages are
|
|
||||||
stored in the order they appear in GNOME Shell. Each page contains an
|
|
||||||
“application id” → 'data' pair. Currently, the following values are
|
|
||||||
stored as 'data':
|
|
||||||
• “position”: the position of the application icon in the page
|
|
||||||
</description>
|
|
||||||
</key>
|
|
||||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/* Window Picker */
|
/* Window Picker */
|
||||||
|
|
||||||
$window_picker_spacing: $base_spacing; // 6px
|
$window_picker_spacing: $base_spacing * 2; // 16px
|
||||||
$window_picker_padding: $base_padding * 2; // 12px
|
$window_picker_padding: $base_padding * 2; // 16px
|
||||||
|
|
||||||
$window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
|
$window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
|
||||||
|
|
||||||
@@ -13,8 +13,8 @@ $window_clone_border_size: 6px;
|
|||||||
// Window picker
|
// Window picker
|
||||||
.window-picker {
|
.window-picker {
|
||||||
// Space between window thumbnails
|
// Space between window thumbnails
|
||||||
spacing: $window_picker_spacing;
|
-horizontal-spacing: $window_picker_spacing;
|
||||||
|
-vertical-spacing: $window_picker_spacing;
|
||||||
// Padding for container around window thumbnails
|
// Padding for container around window thumbnails
|
||||||
padding: $window_picker_padding;
|
padding: $window_picker_padding;
|
||||||
|
|
||||||
|
@@ -71,7 +71,7 @@ var AuthPrompt = GObject.registerClass({
|
|||||||
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
|
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
|
||||||
this._userVerifier.connect('reset', this._onReset.bind(this));
|
this._userVerifier.connect('reset', this._onReset.bind(this));
|
||||||
this._userVerifier.connect('smartcard-status-changed', this._onSmartcardStatusChanged.bind(this));
|
this._userVerifier.connect('smartcard-status-changed', this._onSmartcardStatusChanged.bind(this));
|
||||||
this._userVerifier.connect('credential-manager-authenticated', this._onCredentialManagerAuthenticated.bind(this));
|
this._userVerifier.connect('ovirt-user-authenticated', this._onOVirtUserAuthenticated.bind(this));
|
||||||
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
||||||
|
|
||||||
this.connect('destroy', this._onDestroy.bind(this));
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
@@ -242,7 +242,7 @@ var AuthPrompt = GObject.registerClass({
|
|||||||
this.emit('prompted');
|
this.emit('prompted');
|
||||||
}
|
}
|
||||||
|
|
||||||
_onCredentialManagerAuthenticated() {
|
_onOVirtUserAuthenticated() {
|
||||||
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
||||||
this.reset();
|
this.reset();
|
||||||
}
|
}
|
||||||
|
@@ -1,24 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
/* exported CredentialManager */
|
|
||||||
|
|
||||||
class CredentialManager {
|
|
||||||
constructor(service) {
|
|
||||||
this._token = null;
|
|
||||||
this._service = service;
|
|
||||||
this._authenticatedSignalId = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
get token() {
|
|
||||||
return this._token;
|
|
||||||
}
|
|
||||||
|
|
||||||
set token(t) {
|
|
||||||
this._token = t;
|
|
||||||
if (this._token)
|
|
||||||
this.emit('user-authenticated', this._token);
|
|
||||||
}
|
|
||||||
|
|
||||||
get service() {
|
|
||||||
return this._service;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -810,8 +810,8 @@ var LoginDialog = GObject.registerClass({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._logoBin.destroy_all_children();
|
this._logoBin.destroy_all_children();
|
||||||
const resourceScale = this._logoBin.get_resource_scale();
|
const [valid, resourceScale] = this._logoBin.get_resource_scale();
|
||||||
if (this._logoFile) {
|
if (this._logoFile && valid) {
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
|
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
|
||||||
-1, -1,
|
-1, -1,
|
||||||
|
@@ -3,9 +3,6 @@
|
|||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Credential = imports.gdm.credentialManager;
|
|
||||||
|
|
||||||
var SERVICE_NAME = 'gdm-ovirtcred';
|
|
||||||
|
|
||||||
const OVirtCredentialsIface = `
|
const OVirtCredentialsIface = `
|
||||||
<node>
|
<node>
|
||||||
@@ -31,14 +28,30 @@ function OVirtCredentials() {
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
var OVirtCredentialsManager = class OVirtCredentialsManager extends Credential.CredentialManager {
|
var OVirtCredentialsManager = class {
|
||||||
constructor() {
|
constructor() {
|
||||||
super(SERVICE_NAME);
|
this._token = null;
|
||||||
|
|
||||||
this._credentials = new OVirtCredentials();
|
this._credentials = new OVirtCredentials();
|
||||||
this._credentials.connectSignal('UserAuthenticated',
|
this._credentials.connectSignal('UserAuthenticated',
|
||||||
(proxy, sender, [token]) => {
|
this._onUserAuthenticated.bind(this));
|
||||||
this.token = token;
|
}
|
||||||
});
|
|
||||||
|
_onUserAuthenticated(proxy, sender, [token]) {
|
||||||
|
this._token = token;
|
||||||
|
this.emit('user-authenticated', token);
|
||||||
|
}
|
||||||
|
|
||||||
|
hasToken() {
|
||||||
|
return this._token != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
getToken() {
|
||||||
|
return this._token;
|
||||||
|
}
|
||||||
|
|
||||||
|
resetToken() {
|
||||||
|
this._token = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(OVirtCredentialsManager.prototype);
|
Signals.addSignalMethods(OVirtCredentialsManager.prototype);
|
||||||
|
@@ -8,7 +8,6 @@ const Signals = imports.signals;
|
|||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
const Fprint = imports.gdm.fingerprint;
|
const Fprint = imports.gdm.fingerprint;
|
||||||
const OVirt = imports.gdm.oVirt;
|
const OVirt = imports.gdm.oVirt;
|
||||||
const Vmware = imports.gdm.vmware;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const SmartcardManager = imports.misc.smartcardManager;
|
const SmartcardManager = imports.misc.smartcardManager;
|
||||||
@@ -25,6 +24,7 @@ Gio._promisify(Gdm.UserVerifierProxy.prototype,
|
|||||||
var PASSWORD_SERVICE_NAME = 'gdm-password';
|
var PASSWORD_SERVICE_NAME = 'gdm-password';
|
||||||
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
||||||
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
||||||
|
var OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
||||||
var FADE_ANIMATION_TIME = 160;
|
var FADE_ANIMATION_TIME = 160;
|
||||||
var CLONE_FADE_ANIMATION_TIME = 250;
|
var CLONE_FADE_ANIMATION_TIME = 250;
|
||||||
|
|
||||||
@@ -160,20 +160,13 @@ var ShellUserVerifier = class {
|
|||||||
|
|
||||||
this._failCounter = 0;
|
this._failCounter = 0;
|
||||||
|
|
||||||
this._credentialManagers = {};
|
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
|
||||||
this._credentialManagers[OVirt.SERVICE_NAME] = OVirt.getOVirtCredentialsManager();
|
|
||||||
this._credentialManagers[Vmware.SERVICE_NAME] = Vmware.getVmwareCredentialsManager();
|
|
||||||
|
|
||||||
for (let service in this._credentialManagers) {
|
if (this._oVirtCredentialsManager.hasToken())
|
||||||
if (this._credentialManagers[service].token) {
|
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
|
||||||
this._onCredentialManagerAuthenticated(this._credentialManagers[service],
|
|
||||||
this._credentialManagers[service].token);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._credentialManagers[service]._authenticatedSignalId =
|
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
|
||||||
this._credentialManagers[service].connect('user-authenticated',
|
this._oVirtUserAuthenticated.bind(this));
|
||||||
this._onCredentialManagerAuthenticated.bind(this));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
begin(userName, hold) {
|
begin(userName, hold) {
|
||||||
@@ -229,11 +222,8 @@ var ShellUserVerifier = class {
|
|||||||
this._smartcardManager.disconnect(this._smartcardRemovedId);
|
this._smartcardManager.disconnect(this._smartcardRemovedId);
|
||||||
this._smartcardManager = null;
|
this._smartcardManager = null;
|
||||||
|
|
||||||
for (let service in this._credentialManagers) {
|
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
|
||||||
let credentialManager = this._credentialManagers[service];
|
this._oVirtCredentialsManager = null;
|
||||||
credentialManager.disconnect(credentialManager._authenticatedSignalId);
|
|
||||||
credentialManager = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
answerQuery(serviceName, answer) {
|
answerQuery(serviceName, answer) {
|
||||||
@@ -321,9 +311,9 @@ var ShellUserVerifier = class {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_onCredentialManagerAuthenticated(credentialManager, _token) {
|
_oVirtUserAuthenticated(_token) {
|
||||||
this._preemptingService = credentialManager.service;
|
this._preemptingService = OVIRT_SERVICE_NAME;
|
||||||
this.emit('credential-manager-authenticated');
|
this.emit('ovirt-user-authenticated');
|
||||||
}
|
}
|
||||||
|
|
||||||
_checkForSmartcard() {
|
_checkForSmartcard() {
|
||||||
@@ -500,12 +490,9 @@ var ShellUserVerifier = class {
|
|||||||
if (!this.serviceIsForeground(serviceName))
|
if (!this.serviceIsForeground(serviceName))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let token = null;
|
if (serviceName == OVIRT_SERVICE_NAME) {
|
||||||
if (this._credentialManagers[serviceName])
|
// The only question asked by this service is "Token?"
|
||||||
token = this._credentialManagers[serviceName].token;
|
this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken());
|
||||||
|
|
||||||
if (token) {
|
|
||||||
this.answerQuery(serviceName, token);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -573,10 +560,8 @@ var ShellUserVerifier = class {
|
|||||||
// If the login failed with the preauthenticated oVirt credentials
|
// If the login failed with the preauthenticated oVirt credentials
|
||||||
// then discard the credentials and revert to default authentication
|
// then discard the credentials and revert to default authentication
|
||||||
// mechanism.
|
// mechanism.
|
||||||
let foregroundService = Object.keys(this._credentialManagers).find(service =>
|
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
|
||||||
this.serviceIsForeground(service));
|
this._oVirtCredentialsManager.resetToken();
|
||||||
if (foregroundService) {
|
|
||||||
this._credentialManagers[foregroundService].token = null;
|
|
||||||
this._preemptingService = null;
|
this._preemptingService = null;
|
||||||
this._verificationFailed(false);
|
this._verificationFailed(false);
|
||||||
return;
|
return;
|
||||||
|
@@ -1,54 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
/* exported getVmwareCredentialsManager */
|
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const Credential = imports.gdm.credentialManager;
|
|
||||||
|
|
||||||
const dbusPath = '/org/vmware/viewagent/Credentials';
|
|
||||||
const dbusInterface = 'org.vmware.viewagent.Credentials';
|
|
||||||
|
|
||||||
var SERVICE_NAME = 'gdm-vmwcred';
|
|
||||||
|
|
||||||
const VmwareCredentialsIface = '<node> \
|
|
||||||
<interface name="' + dbusInterface + '"> \
|
|
||||||
<signal name="UserAuthenticated"> \
|
|
||||||
<arg type="s" name="token"/> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
|
|
||||||
const VmwareCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(VmwareCredentialsIface);
|
|
||||||
|
|
||||||
let _vmwareCredentialsManager = null;
|
|
||||||
|
|
||||||
function VmwareCredentials() {
|
|
||||||
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
|
|
||||||
g_interface_name: VmwareCredentialsInfo.name,
|
|
||||||
g_interface_info: VmwareCredentialsInfo,
|
|
||||||
g_name: dbusInterface,
|
|
||||||
g_object_path: dbusPath,
|
|
||||||
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
|
|
||||||
self.init(null);
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
var VmwareCredentialsManager = class VmwareCredentialsManager extends Credential.CredentialManager {
|
|
||||||
constructor() {
|
|
||||||
super(SERVICE_NAME);
|
|
||||||
this._credentials = new VmwareCredentials();
|
|
||||||
this._credentials.connectSignal('UserAuthenticated',
|
|
||||||
(proxy, sender, [token]) => {
|
|
||||||
this.token = token;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Signals.addSignalMethods(VmwareCredentialsManager.prototype);
|
|
||||||
|
|
||||||
function getVmwareCredentialsManager() {
|
|
||||||
if (!_vmwareCredentialsManager)
|
|
||||||
_vmwareCredentialsManager = new VmwareCredentialsManager();
|
|
||||||
|
|
||||||
return _vmwareCredentialsManager;
|
|
||||||
}
|
|
@@ -6,8 +6,6 @@
|
|||||||
<file>gdm/fingerprint.js</file>
|
<file>gdm/fingerprint.js</file>
|
||||||
<file>gdm/loginDialog.js</file>
|
<file>gdm/loginDialog.js</file>
|
||||||
<file>gdm/oVirt.js</file>
|
<file>gdm/oVirt.js</file>
|
||||||
<file>gdm/credentialManager.js</file>
|
|
||||||
<file>gdm/vmware.js</file>
|
|
||||||
<file>gdm/realmd.js</file>
|
<file>gdm/realmd.js</file>
|
||||||
<file>gdm/util.js</file>
|
<file>gdm/util.js</file>
|
||||||
|
|
||||||
@@ -112,7 +110,6 @@
|
|||||||
<file>ui/windowManager.js</file>
|
<file>ui/windowManager.js</file>
|
||||||
<file>ui/windowPreview.js</file>
|
<file>ui/windowPreview.js</file>
|
||||||
<file>ui/workspace.js</file>
|
<file>ui/workspace.js</file>
|
||||||
<file>ui/workspaceAnimation.js</file>
|
|
||||||
<file>ui/workspaceSwitcherPopup.js</file>
|
<file>ui/workspaceSwitcherPopup.js</file>
|
||||||
<file>ui/workspaceThumbnail.js</file>
|
<file>ui/workspaceThumbnail.js</file>
|
||||||
<file>ui/workspacesView.js</file>
|
<file>ui/workspacesView.js</file>
|
||||||
|
@@ -852,9 +852,6 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
if (index === -1)
|
if (index === -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._arrows[index].destroy();
|
|
||||||
this._arrows.splice(index, 1);
|
|
||||||
|
|
||||||
this.icons.splice(index, 1);
|
this.icons.splice(index, 1);
|
||||||
this.removeItem(index);
|
this.removeItem(index);
|
||||||
}
|
}
|
||||||
|
@@ -60,7 +60,7 @@ class Animation extends St.Bin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_loadFile(file, width, height) {
|
_loadFile(file, width, height) {
|
||||||
const resourceScale = this.get_resource_scale();
|
let [validResourceScale, resourceScale] = this.get_resource_scale();
|
||||||
let wasPlaying = this._isPlaying;
|
let wasPlaying = this._isPlaying;
|
||||||
|
|
||||||
if (this._isPlaying)
|
if (this._isPlaying)
|
||||||
@@ -69,6 +69,12 @@ class Animation extends St.Bin {
|
|||||||
this._isLoaded = false;
|
this._isLoaded = false;
|
||||||
this.destroy_all_children();
|
this.destroy_all_children();
|
||||||
|
|
||||||
|
if (!validResourceScale) {
|
||||||
|
if (wasPlaying)
|
||||||
|
this.play();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let textureCache = St.TextureCache.get_default();
|
let textureCache = St.TextureCache.get_default();
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
this._animations = textureCache.load_sliced_image(file, width, height,
|
this._animations = textureCache.load_sliced_image(file, width, height,
|
||||||
|
1320
js/ui/appDisplay.js
1320
js/ui/appDisplay.js
File diff suppressed because it is too large
Load Diff
@@ -712,18 +712,13 @@ var BackgroundManager = class BackgroundManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let newBackgroundActor = this._createBackgroundActor();
|
let newBackgroundActor = this._createBackgroundActor();
|
||||||
|
newBackgroundActor.vignette_sharpness = this.backgroundActor.vignette_sharpness;
|
||||||
const oldContent = this.backgroundActor.content;
|
newBackgroundActor.brightness = this.backgroundActor.brightness;
|
||||||
const newContent = newBackgroundActor.content;
|
|
||||||
|
|
||||||
newContent.vignette_sharpness = oldContent.vignette_sharpness;
|
|
||||||
newContent.brightness = oldContent.brightness;
|
|
||||||
|
|
||||||
newBackgroundActor.visible = this.backgroundActor.visible;
|
newBackgroundActor.visible = this.backgroundActor.visible;
|
||||||
|
|
||||||
this._newBackgroundActor = newBackgroundActor;
|
this._newBackgroundActor = newBackgroundActor;
|
||||||
|
|
||||||
const { background } = newBackgroundActor.content;
|
let background = newBackgroundActor.background;
|
||||||
|
|
||||||
if (background.isLoaded) {
|
if (background.isLoaded) {
|
||||||
this._swapBackgroundActor();
|
this._swapBackgroundActor();
|
||||||
|
@@ -784,7 +784,6 @@ class DateMenuButton extends PanelMenu.Button {
|
|||||||
|
|
||||||
this._clockDisplay = new St.Label({ style_class: 'clock' });
|
this._clockDisplay = new St.Label({ style_class: 'clock' });
|
||||||
this._clockDisplay.clutter_text.y_align = Clutter.ActorAlign.CENTER;
|
this._clockDisplay.clutter_text.y_align = Clutter.ActorAlign.CENTER;
|
||||||
this._clockDisplay.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
|
|
||||||
this._indicator = new MessagesIndicator();
|
this._indicator = new MessagesIndicator();
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/* exported Dialog, MessageDialogContent, ListSection, ListSectionItem */
|
/* exported Dialog, MessageDialogContent, ListSection, ListSectionItem */
|
||||||
|
|
||||||
const { Clutter, GLib, GObject, Meta, Pango, St } = imports.gi;
|
const { Clutter, GObject, Meta, Pango, St } = imports.gi;
|
||||||
|
|
||||||
function _setLabel(label, value) {
|
function _setLabel(label, value) {
|
||||||
label.set({
|
label.set({
|
||||||
@@ -221,16 +221,13 @@ var MessageDialogContent = GObject.registerClass({
|
|||||||
this._updateTitleStyleLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
this._updateTitleStyleLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||||
this._updateTitleStyleLater = 0;
|
this._updateTitleStyleLater = 0;
|
||||||
this._title.add_style_class_name('leightweight');
|
this._title.add_style_class_name('leightweight');
|
||||||
return GLib.SOURCE_REMOVE;
|
return false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set title(title) {
|
set title(title) {
|
||||||
if (this._title.text === title)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_setLabel(this._title, title);
|
_setLabel(this._title, title);
|
||||||
|
|
||||||
this._title.remove_style_class_name('leightweight');
|
this._title.remove_style_class_name('leightweight');
|
||||||
@@ -240,9 +237,6 @@ var MessageDialogContent = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
set description(description) {
|
set description(description) {
|
||||||
if (this._description.text === description)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_setLabel(this._description, description);
|
_setLabel(this._description, description);
|
||||||
this.notify('description');
|
this.notify('description');
|
||||||
}
|
}
|
||||||
|
@@ -139,9 +139,7 @@ function checkForUpdates() {
|
|||||||
return;
|
return;
|
||||||
if (extension.hasUpdate)
|
if (extension.hasUpdate)
|
||||||
return;
|
return;
|
||||||
metadatas[uuid] = {
|
metadatas[uuid] = extension.metadata;
|
||||||
version: extension.metadata.version,
|
|
||||||
};
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Object.keys(metadatas).length === 0)
|
if (Object.keys(metadatas).length === 0)
|
||||||
|
@@ -31,7 +31,7 @@ var IconSize = {
|
|||||||
var APPICON_ANIMATION_OUT_SCALE = 3;
|
var APPICON_ANIMATION_OUT_SCALE = 3;
|
||||||
var APPICON_ANIMATION_OUT_TIME = 250;
|
var APPICON_ANIMATION_OUT_TIME = 250;
|
||||||
|
|
||||||
const ICON_POSITION_DELAY = 10;
|
const ICON_POSITION_DELAY = 25;
|
||||||
|
|
||||||
const defaultGridModes = [
|
const defaultGridModes = [
|
||||||
{
|
{
|
||||||
@@ -52,17 +52,6 @@ const defaultGridModes = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
var LEFT_DIVIDER_LEEWAY = 20;
|
|
||||||
var RIGHT_DIVIDER_LEEWAY = 20;
|
|
||||||
|
|
||||||
var DragLocation = {
|
|
||||||
INVALID: 0,
|
|
||||||
START_EDGE: 1,
|
|
||||||
ON_ICON: 2,
|
|
||||||
END_EDGE: 3,
|
|
||||||
EMPTY_SPACE: 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
var BaseIcon = GObject.registerClass(
|
var BaseIcon = GObject.registerClass(
|
||||||
class BaseIcon extends St.Bin {
|
class BaseIcon extends St.Bin {
|
||||||
_init(label, params) {
|
_init(label, params) {
|
||||||
@@ -957,99 +946,6 @@ var IconGridLayout = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* getDropTarget:
|
|
||||||
* @param {int} x: position of the horizontal axis
|
|
||||||
* @param {int} y: position of the vertical axis
|
|
||||||
*
|
|
||||||
* Retrieves the item located at (@x, @y), as well as the drag location.
|
|
||||||
* Both @x and @y are relative to the grid.
|
|
||||||
*
|
|
||||||
* @returns {[Clutter.Actor, DragLocation]} the item and drag location
|
|
||||||
* under (@x, @y)
|
|
||||||
*/
|
|
||||||
getDropTarget(x, y) {
|
|
||||||
const childSize = this._getChildrenMaxSize();
|
|
||||||
const [leftEmptySpace, topEmptySpace, hSpacing, vSpacing] =
|
|
||||||
this._calculateSpacing(childSize);
|
|
||||||
|
|
||||||
const isRtl =
|
|
||||||
Clutter.get_default_text_direction() === Clutter.TextDirection.RTL;
|
|
||||||
|
|
||||||
let page = this._orientation === Clutter.Orientation.VERTICAL
|
|
||||||
? Math.floor(y / this._pageHeight)
|
|
||||||
: Math.floor(x / this._pageWidth);
|
|
||||||
|
|
||||||
// Out of bounds
|
|
||||||
if (page >= this._pages.length)
|
|
||||||
return [null, DragLocation.INVALID];
|
|
||||||
|
|
||||||
if (isRtl && this._orientation === Clutter.Orientation.HORIZONTAL)
|
|
||||||
page = swap(page, this._pages.length);
|
|
||||||
|
|
||||||
// Page-relative coordinates from now on
|
|
||||||
x %= this._pageWidth;
|
|
||||||
y %= this._pageHeight;
|
|
||||||
|
|
||||||
if (x < leftEmptySpace || y < topEmptySpace)
|
|
||||||
return [null, DragLocation.INVALID];
|
|
||||||
|
|
||||||
const gridWidth =
|
|
||||||
childSize * this._columnsPerPage +
|
|
||||||
hSpacing * (this._columnsPerPage - 1);
|
|
||||||
const gridHeight =
|
|
||||||
childSize * this._rowsPerPage +
|
|
||||||
vSpacing * (this._rowsPerPage - 1);
|
|
||||||
|
|
||||||
if (x > leftEmptySpace + gridWidth || y > topEmptySpace + gridHeight)
|
|
||||||
return [null, DragLocation.INVALID];
|
|
||||||
|
|
||||||
const halfHSpacing = hSpacing / 2;
|
|
||||||
const halfVSpacing = vSpacing / 2;
|
|
||||||
const visibleItems = this._getVisibleChildrenForPage(page);
|
|
||||||
|
|
||||||
for (const item of visibleItems) {
|
|
||||||
const childBox = item.allocation.copy();
|
|
||||||
|
|
||||||
// Page offset
|
|
||||||
switch (this._orientation) {
|
|
||||||
case Clutter.Orientation.HORIZONTAL:
|
|
||||||
childBox.set_origin(childBox.x1 % this._pageWidth, childBox.y1);
|
|
||||||
break;
|
|
||||||
case Clutter.Orientation.VERTICAL:
|
|
||||||
childBox.set_origin(childBox.x1, childBox.y1 % this._pageHeight);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Outside the icon boundaries
|
|
||||||
if (x < childBox.x1 - halfHSpacing ||
|
|
||||||
x > childBox.x2 + halfHSpacing ||
|
|
||||||
y < childBox.y1 - halfVSpacing ||
|
|
||||||
y > childBox.y2 + halfVSpacing)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
let dragLocation;
|
|
||||||
|
|
||||||
if (x < childBox.x1 + LEFT_DIVIDER_LEEWAY)
|
|
||||||
dragLocation = DragLocation.START_EDGE;
|
|
||||||
else if (x > childBox.x2 - RIGHT_DIVIDER_LEEWAY)
|
|
||||||
dragLocation = DragLocation.END_EDGE;
|
|
||||||
else
|
|
||||||
dragLocation = DragLocation.ON_ICON;
|
|
||||||
|
|
||||||
if (isRtl) {
|
|
||||||
if (dragLocation === DragLocation.START_EDGE)
|
|
||||||
dragLocation = DragLocation.END_EDGE;
|
|
||||||
else if (dragLocation === DragLocation.END_EDGE)
|
|
||||||
dragLocation = DragLocation.START_EDGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return [item, dragLocation];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [null, DragLocation.EMPTY_SPACE];
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line camelcase
|
// eslint-disable-next-line camelcase
|
||||||
get allow_incomplete_pages() {
|
get allow_incomplete_pages() {
|
||||||
return this._allowIncompletePages;
|
return this._allowIncompletePages;
|
||||||
@@ -1663,11 +1559,6 @@ var IconGrid = GObject.registerClass({
|
|||||||
this.queue_relayout();
|
this.queue_relayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
getDropTarget(x, y) {
|
|
||||||
const layoutManager = this.layout_manager;
|
|
||||||
return layoutManager.getDropTarget(x, y, this._currentPage);
|
|
||||||
}
|
|
||||||
|
|
||||||
get itemsPerPage() {
|
get itemsPerPage() {
|
||||||
const layoutManager = this.layout_manager;
|
const layoutManager = this.layout_manager;
|
||||||
return layoutManager.rows_per_page * layoutManager.columns_per_page;
|
return layoutManager.rows_per_page * layoutManager.columns_per_page;
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/* exported InhibitShortcutsDialog */
|
/* exported InhibitShortcutsDialog */
|
||||||
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Pango, Shell, St } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const Dialog = imports.ui.dialog;
|
const Dialog = imports.ui.dialog;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
@@ -90,8 +90,6 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
|||||||
text: _('You can restore shortcuts by pressing %s.').format(restoreAccel),
|
text: _('You can restore shortcuts by pressing %s.').format(restoreAccel),
|
||||||
style_class: 'message-dialog-description',
|
style_class: 'message-dialog-description',
|
||||||
});
|
});
|
||||||
restoreLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
restoreLabel.clutter_text.line_wrap = true;
|
|
||||||
content.add_child(restoreLabel);
|
content.add_child(restoreLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -42,7 +42,7 @@ const defaultKeysPost = [
|
|||||||
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
|
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
|
||||||
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
|
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
|
||||||
[{ label: '=/<', width: 3, level: 3, right: true }],
|
[{ label: '=/<', width: 3, level: 3, right: true }],
|
||||||
[{ action: 'emoji', icon: 'face-smile-symbolic' }, { action: 'languageMenu', extraClassName: 'layout-key', icon: 'keyboard-layout-filled-symbolic' }, { action: 'hide', extraClassName: 'hide-key', icon: 'go-down-symbolic' }]],
|
[{ action: 'emoji', icon: 'face-smile-symbolic' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
|
||||||
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
|
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
|
||||||
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
|
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
|
||||||
[{ label: '?123', width: 3, level: 2, right: true }],
|
[{ label: '?123', width: 3, level: 2, right: true }],
|
||||||
@@ -61,24 +61,6 @@ class AspectContainer extends St.Widget {
|
|||||||
this.queue_relayout();
|
this.queue_relayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_get_preferred_width(forHeight) {
|
|
||||||
let [min, nat] = super.vfunc_get_preferred_width(forHeight);
|
|
||||||
|
|
||||||
if (forHeight > 0)
|
|
||||||
nat = forHeight * this._ratio;
|
|
||||||
|
|
||||||
return [min, nat];
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_preferred_height(forWidth) {
|
|
||||||
let [min, nat] = super.vfunc_get_preferred_height(forWidth);
|
|
||||||
|
|
||||||
if (forWidth > 0)
|
|
||||||
nat = forWidth / this._ratio;
|
|
||||||
|
|
||||||
return [min, nat];
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_allocate(box) {
|
vfunc_allocate(box) {
|
||||||
if (box.get_width() > 0 && box.get_height() > 0) {
|
if (box.get_width() > 0 && box.get_height() > 0) {
|
||||||
let sizeRatio = box.get_width() / box.get_height();
|
let sizeRatio = box.get_width() / box.get_height();
|
||||||
@@ -1626,9 +1608,7 @@ class Keyboard extends St.BoxLayout {
|
|||||||
* we allow the OSK being smaller than 1/3rd of the monitor height
|
* we allow the OSK being smaller than 1/3rd of the monitor height
|
||||||
* there.
|
* there.
|
||||||
*/
|
*/
|
||||||
const forWidth = this.get_theme_node().adjust_for_width(monitor.width);
|
this.height = Math.min(maxHeight, this.get_preferred_height(monitor.width));
|
||||||
const [, natHeight] = this.get_preferred_height(forWidth);
|
|
||||||
this.height = Math.min(maxHeight, natHeight);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,6 +6,7 @@ const Signals = imports.signals;
|
|||||||
|
|
||||||
const Background = imports.ui.background;
|
const Background = imports.ui.background;
|
||||||
const BackgroundMenu = imports.ui.backgroundMenu;
|
const BackgroundMenu = imports.ui.backgroundMenu;
|
||||||
|
const LoginManager = imports.misc.loginManager;
|
||||||
|
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@@ -294,6 +295,18 @@ var LayoutManager = GObject.registerClass({
|
|||||||
monitorManager.connect('monitors-changed',
|
monitorManager.connect('monitors-changed',
|
||||||
this._monitorsChanged.bind(this));
|
this._monitorsChanged.bind(this));
|
||||||
this._monitorsChanged();
|
this._monitorsChanged();
|
||||||
|
|
||||||
|
// NVIDIA drivers don't preserve FBO contents across
|
||||||
|
// suspend/resume, see
|
||||||
|
// https://bugzilla.gnome.org/show_bug.cgi?id=739178
|
||||||
|
if (Shell.util_need_background_refresh()) {
|
||||||
|
LoginManager.getLoginManager().connect('prepare-for-sleep',
|
||||||
|
(lm, suspending) => {
|
||||||
|
if (suspending)
|
||||||
|
return;
|
||||||
|
Meta.Background.refresh_all();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is called by Main after everything else is constructed
|
// This is called by Main after everything else is constructed
|
||||||
@@ -1191,8 +1204,7 @@ class HotCorner extends Clutter.Actor {
|
|||||||
|
|
||||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||||
this._corner.set_position(this.width - this._corner.width, 0);
|
this._corner.set_position(this.width - this._corner.width, 0);
|
||||||
this.set_pivot_point(1.0, 0.0);
|
this.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
|
||||||
this.translation_x = -this.width;
|
|
||||||
} else {
|
} else {
|
||||||
this._corner.set_position(0, 0);
|
this._corner.set_position(0, 0);
|
||||||
}
|
}
|
||||||
|
@@ -489,10 +489,7 @@ var Magnifier = class Magnifier {
|
|||||||
_updateMouseSprite() {
|
_updateMouseSprite() {
|
||||||
this._updateSpriteTexture();
|
this._updateSpriteTexture();
|
||||||
let [xHot, yHot] = this._cursorTracker.get_hot();
|
let [xHot, yHot] = this._cursorTracker.get_hot();
|
||||||
this._mouseSprite.set({
|
this._mouseSprite.set_anchor_point(xHot, yHot);
|
||||||
translation_x: -xHot,
|
|
||||||
translation_y: -yHot,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateSpriteTexture() {
|
_updateSpriteTexture() {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/* exported NotificationPolicy, NotificationGenericPolicy,
|
/* exported NotificationPolicy, NotificationGenericPolicy,
|
||||||
NotificationApplicationPolicy, Source, SourceActor,
|
NotificationApplicationPolicy, Source, SourceActor, SourceActorWithLabel,
|
||||||
SystemNotificationSource, MessageTray */
|
SystemNotificationSource, MessageTray */
|
||||||
|
|
||||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||||
@@ -655,6 +655,77 @@ class SourceActor extends St.Widget {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var SourceActorWithLabel = GObject.registerClass(
|
||||||
|
class SourceActorWithLabel extends SourceActor {
|
||||||
|
_init(source, size) {
|
||||||
|
super._init(source, size);
|
||||||
|
|
||||||
|
this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER,
|
||||||
|
x_expand: true,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
y_expand: true });
|
||||||
|
|
||||||
|
this._counterBin = new St.Bin({ style_class: 'summary-source-counter',
|
||||||
|
child: this._counterLabel,
|
||||||
|
layout_manager: new Clutter.BinLayout() });
|
||||||
|
this._counterBin.hide();
|
||||||
|
|
||||||
|
this._counterBin.connect('style-changed', () => {
|
||||||
|
let themeNode = this._counterBin.get_theme_node();
|
||||||
|
this._counterBin.translation_x = themeNode.get_length('-shell-counter-overlap-x');
|
||||||
|
this._counterBin.translation_y = themeNode.get_length('-shell-counter-overlap-y');
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add_actor(this._counterBin);
|
||||||
|
|
||||||
|
this._countUpdatedId = this._source.connect('notify::count', this._updateCount.bind(this));
|
||||||
|
this._updateCount();
|
||||||
|
|
||||||
|
this.connect('destroy', () => {
|
||||||
|
this._source.disconnect(this._countUpdatedId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
vfunc_allocate(box) {
|
||||||
|
super.vfunc_allocate(box);
|
||||||
|
|
||||||
|
let childBox = new Clutter.ActorBox();
|
||||||
|
|
||||||
|
let [, , naturalWidth, naturalHeight] = this._counterBin.get_preferred_size();
|
||||||
|
let direction = this.get_text_direction();
|
||||||
|
|
||||||
|
if (direction == Clutter.TextDirection.LTR) {
|
||||||
|
// allocate on the right in LTR
|
||||||
|
childBox.x1 = box.x2 - naturalWidth;
|
||||||
|
childBox.x2 = box.x2;
|
||||||
|
} else {
|
||||||
|
// allocate on the left in RTL
|
||||||
|
childBox.x1 = 0;
|
||||||
|
childBox.x2 = naturalWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
childBox.y1 = box.y2 - naturalHeight;
|
||||||
|
childBox.y2 = box.y2;
|
||||||
|
|
||||||
|
this._counterBin.allocate(childBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateCount() {
|
||||||
|
if (this._actorDestroyed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._counterBin.visible = this._source.countVisible;
|
||||||
|
|
||||||
|
let text;
|
||||||
|
if (this._source.count < 100)
|
||||||
|
text = this._source.count.toString();
|
||||||
|
else
|
||||||
|
text = String.fromCharCode(0x22EF); // midline horizontal ellipsis
|
||||||
|
|
||||||
|
this._counterLabel.set_text(text);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var Source = GObject.registerClass({
|
var Source = GObject.registerClass({
|
||||||
Properties: {
|
Properties: {
|
||||||
'count': GObject.ParamSpec.int(
|
'count': GObject.ParamSpec.int(
|
||||||
|
@@ -4,10 +4,6 @@
|
|||||||
const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
|
const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
// Time for initial animation going into Overview mode;
|
|
||||||
// this is defined here to make it available in imports.
|
|
||||||
var ANIMATION_TIME = 250;
|
|
||||||
|
|
||||||
const Background = imports.ui.background;
|
const Background = imports.ui.background;
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
const LayoutManager = imports.ui.layout;
|
const LayoutManager = imports.ui.layout;
|
||||||
@@ -18,6 +14,9 @@ const OverviewControls = imports.ui.overviewControls;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
|
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
|
||||||
|
|
||||||
|
// Time for initial animation going into Overview mode
|
||||||
|
var ANIMATION_TIME = 250;
|
||||||
|
|
||||||
// Must be less than ANIMATION_TIME, since we switch to
|
// Must be less than ANIMATION_TIME, since we switch to
|
||||||
// or from the overview completely after ANIMATION_TIME,
|
// or from the overview completely after ANIMATION_TIME,
|
||||||
// and don't want the shading animation to get cut off
|
// and don't want the shading animation to get cut off
|
||||||
@@ -440,19 +439,19 @@ var Overview = class {
|
|||||||
this.emit('windows-restacked', stackIndices);
|
this.emit('windows-restacked', stackIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
beginItemDrag(source) {
|
beginItemDrag(_source) {
|
||||||
this.emit('item-drag-begin', source);
|
this.emit('item-drag-begin');
|
||||||
this._inItemDrag = true;
|
this._inItemDrag = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cancelledItemDrag(source) {
|
cancelledItemDrag(_source) {
|
||||||
this.emit('item-drag-cancelled', source);
|
this.emit('item-drag-cancelled');
|
||||||
}
|
}
|
||||||
|
|
||||||
endItemDrag(source) {
|
endItemDrag(_source) {
|
||||||
if (!this._inItemDrag)
|
if (!this._inItemDrag)
|
||||||
return;
|
return;
|
||||||
this.emit('item-drag-end', source);
|
this.emit('item-drag-end');
|
||||||
this._inItemDrag = false;
|
this._inItemDrag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,9 +8,8 @@ const Main = imports.ui.main;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const ViewSelector = imports.ui.viewSelector;
|
const ViewSelector = imports.ui.viewSelector;
|
||||||
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
|
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
|
||||||
const Overview = imports.ui.overview;
|
|
||||||
|
|
||||||
var SIDE_CONTROLS_ANIMATION_TIME = Overview.ANIMATION_TIME;
|
var SIDE_CONTROLS_ANIMATION_TIME = 160;
|
||||||
|
|
||||||
function getRtlSlideDirection(direction, actor) {
|
function getRtlSlideDirection(direction, actor) {
|
||||||
let rtl = actor.text_direction == Clutter.TextDirection.RTL;
|
let rtl = actor.text_direction == Clutter.TextDirection.RTL;
|
||||||
@@ -423,7 +422,6 @@ class ControlsManager extends St.Widget {
|
|||||||
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
|
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
|
||||||
|
|
||||||
this._workspaceAdjustment = new St.Adjustment({
|
this._workspaceAdjustment = new St.Adjustment({
|
||||||
actor: this,
|
|
||||||
value: activeWorkspaceIndex,
|
value: activeWorkspaceIndex,
|
||||||
lower: 0,
|
lower: 0,
|
||||||
page_increment: 1,
|
page_increment: 1,
|
||||||
@@ -455,6 +453,8 @@ class ControlsManager extends St.Widget {
|
|||||||
this._group.add_child(this.viewSelector);
|
this._group.add_child(this.viewSelector);
|
||||||
this._group.add_actor(this._thumbnailsSlider);
|
this._group.add_actor(this._thumbnailsSlider);
|
||||||
|
|
||||||
|
layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this));
|
||||||
|
|
||||||
Main.overview.connect('showing', this._updateSpacerVisibility.bind(this));
|
Main.overview.connect('showing', this._updateSpacerVisibility.bind(this));
|
||||||
|
|
||||||
this.connect('destroy', this._onDestroy.bind(this));
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
@@ -477,6 +477,26 @@ class ControlsManager extends St.Widget {
|
|||||||
this._workspaceAdjustment.value = activeIndex;
|
this._workspaceAdjustment.value = activeIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_updateWorkspacesGeometry() {
|
||||||
|
let [x, y] = this.get_transformed_position();
|
||||||
|
let [width, height] = this.get_transformed_size();
|
||||||
|
let geometry = { x, y, width, height };
|
||||||
|
|
||||||
|
let spacing = this.get_theme_node().get_length('spacing');
|
||||||
|
let dashWidth = this._dashSlider.getVisibleWidth() + spacing;
|
||||||
|
let thumbnailsWidth = this._thumbnailsSlider.getNonExpandedWidth() + spacing;
|
||||||
|
|
||||||
|
geometry.width -= dashWidth;
|
||||||
|
geometry.width -= thumbnailsWidth;
|
||||||
|
|
||||||
|
if (this.get_text_direction() == Clutter.TextDirection.LTR)
|
||||||
|
geometry.x += dashWidth;
|
||||||
|
else
|
||||||
|
geometry.x += thumbnailsWidth;
|
||||||
|
|
||||||
|
this.viewSelector.setWorkspacesFullGeometry(geometry);
|
||||||
|
}
|
||||||
|
|
||||||
_setVisibility() {
|
_setVisibility() {
|
||||||
// Ignore the case when we're leaving the overview, since
|
// Ignore the case when we're leaving the overview, since
|
||||||
// actors will be made visible again when entering the overview
|
// actors will be made visible again when entering the overview
|
||||||
|
@@ -5,6 +5,7 @@ const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
|||||||
const Cairo = imports.cairo;
|
const Cairo = imports.cairo;
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
|
const AppDisplay = imports.ui.appDisplay;
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
@@ -60,69 +61,20 @@ function _unpremultiply(color) {
|
|||||||
return new Clutter.Color({ red, green, blue, alpha: color.alpha });
|
return new Clutter.Color({ red, green, blue, alpha: color.alpha });
|
||||||
}
|
}
|
||||||
|
|
||||||
class AppMenu extends PopupMenu.PopupMenu {
|
class AppMenu extends AppDisplay.BaseAppMenu {
|
||||||
constructor(sourceActor) {
|
constructor(sourceActor) {
|
||||||
super(sourceActor, 0.5, St.Side.TOP);
|
super(sourceActor, St.Side.TOP);
|
||||||
|
|
||||||
this.actor.add_style_class_name('app-menu');
|
this.actor.add_style_class_name('app-menu');
|
||||||
|
|
||||||
this._app = null;
|
this._app = null;
|
||||||
this._appSystem = Shell.AppSystem.get_default();
|
|
||||||
|
|
||||||
this._windowsChangedId = 0;
|
this._windowsChangedId = 0;
|
||||||
|
|
||||||
/* Translators: This is the heading of a list of open windows */
|
|
||||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
|
|
||||||
|
|
||||||
this._windowSection = new PopupMenu.PopupMenuSection();
|
|
||||||
this.addMenuItem(this._windowSection);
|
|
||||||
|
|
||||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
|
||||||
|
|
||||||
this._newWindowItem = this.addAction(_("New Window"), () => {
|
|
||||||
this._app.open_new_window(-1);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
|
||||||
|
|
||||||
this._actionSection = new PopupMenu.PopupMenuSection();
|
|
||||||
this.addMenuItem(this._actionSection);
|
|
||||||
|
|
||||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
|
||||||
|
|
||||||
this._detailsItem = this.addAction(_('Show Details'), async () => {
|
|
||||||
let id = this._app.get_id();
|
|
||||||
let args = GLib.Variant.new('(ss)', [id, '']);
|
|
||||||
const bus = await Gio.DBus.get(Gio.BusType.SESSION, null);
|
|
||||||
bus.call(
|
|
||||||
'org.gnome.Software',
|
|
||||||
'/org/gnome/Software',
|
|
||||||
'org.gtk.Actions', 'Activate',
|
|
||||||
new GLib.Variant('(sava{sv})', ['details', [args], null]),
|
|
||||||
null, 0, -1, null);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
|
||||||
|
|
||||||
this.addAction(_("Quit"), () => {
|
|
||||||
this._app.request_quit();
|
|
||||||
});
|
|
||||||
|
|
||||||
this._appSystem.connect('installed-changed', () => {
|
|
||||||
this._updateDetailsVisibility();
|
|
||||||
});
|
|
||||||
this._updateDetailsVisibility();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateDetailsVisibility() {
|
get app() {
|
||||||
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
return this._app;
|
||||||
this._detailsItem.visible = sw != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
isEmpty() {
|
|
||||||
if (!this._app)
|
|
||||||
return true;
|
|
||||||
return super.isEmpty();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setApp(app) {
|
setApp(app) {
|
||||||
@@ -157,25 +109,6 @@ class AppMenu extends PopupMenu.PopupMenu {
|
|||||||
this._newWindowItem.visible =
|
this._newWindowItem.visible =
|
||||||
app && app.can_open_new_window() && !actions.includes('new-window');
|
app && app.can_open_new_window() && !actions.includes('new-window');
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateWindowsSection() {
|
|
||||||
this._windowSection.removeAll();
|
|
||||||
|
|
||||||
if (!this._app)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let windows = this._app.get_windows();
|
|
||||||
windows.forEach(window => {
|
|
||||||
let title = window.title || this._app.get_name();
|
|
||||||
let item = this._windowSection.addAction(title, event => {
|
|
||||||
Main.activateWindow(window, event.get_time());
|
|
||||||
});
|
|
||||||
let id = window.connect('notify::title', () => {
|
|
||||||
item.label.text = window.title || this._app.get_name();
|
|
||||||
});
|
|
||||||
item.connect('destroy', () => window.disconnect(id));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -675,7 +608,7 @@ class PanelCorner extends St.DrawingArea {
|
|||||||
let borderWidth = node.get_length('-panel-corner-border-width');
|
let borderWidth = node.get_length('-panel-corner-border-width');
|
||||||
|
|
||||||
this.set_size(cornerRadius, borderWidth + cornerRadius);
|
this.set_size(cornerRadius, borderWidth + cornerRadius);
|
||||||
this.translation_y = -borderWidth;
|
this.set_anchor_point(0, borderWidth);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -62,7 +62,6 @@ var StreamSlider = class {
|
|||||||
|
|
||||||
this._stream = null;
|
this._stream = null;
|
||||||
this._volumeCancellable = null;
|
this._volumeCancellable = null;
|
||||||
this._icons = [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get stream() {
|
get stream() {
|
||||||
@@ -183,15 +182,24 @@ var StreamSlider = class {
|
|||||||
if (!this._stream)
|
if (!this._stream)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
let icons = ["audio-volume-muted-symbolic",
|
||||||
|
"audio-volume-low-symbolic",
|
||||||
|
"audio-volume-medium-symbolic",
|
||||||
|
"audio-volume-high-symbolic",
|
||||||
|
"audio-volume-overamplified-symbolic"];
|
||||||
|
|
||||||
let volume = this._stream.volume;
|
let volume = this._stream.volume;
|
||||||
let n;
|
let n;
|
||||||
if (this._stream.is_muted || volume <= 0) {
|
if (this._stream.is_muted || volume <= 0) {
|
||||||
n = 0;
|
n = 0;
|
||||||
} else {
|
} else {
|
||||||
n = Math.ceil(3 * volume / this._control.get_vol_max_norm());
|
n = Math.ceil(3 * volume / this._control.get_vol_max_norm());
|
||||||
n = Math.clamp(n, 1, this._icons.length - 1);
|
if (n < 1)
|
||||||
|
n = 1;
|
||||||
|
else if (n > 3)
|
||||||
|
n = 4;
|
||||||
}
|
}
|
||||||
return this._icons[n];
|
return icons[n];
|
||||||
}
|
}
|
||||||
|
|
||||||
getLevel() {
|
getLevel() {
|
||||||
@@ -215,13 +223,6 @@ var OutputStreamSlider = class extends StreamSlider {
|
|||||||
constructor(control) {
|
constructor(control) {
|
||||||
super(control);
|
super(control);
|
||||||
this._slider.accessible_name = _("Volume");
|
this._slider.accessible_name = _("Volume");
|
||||||
this._icons = [
|
|
||||||
'audio-volume-muted-symbolic',
|
|
||||||
'audio-volume-low-symbolic',
|
|
||||||
'audio-volume-medium-symbolic',
|
|
||||||
'audio-volume-high-symbolic',
|
|
||||||
'audio-volume-overamplified-symbolic',
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_connectStream(stream) {
|
_connectStream(stream) {
|
||||||
@@ -273,12 +274,6 @@ var InputStreamSlider = class extends StreamSlider {
|
|||||||
this._control.connect('stream-added', this._maybeShowInput.bind(this));
|
this._control.connect('stream-added', this._maybeShowInput.bind(this));
|
||||||
this._control.connect('stream-removed', this._maybeShowInput.bind(this));
|
this._control.connect('stream-removed', this._maybeShowInput.bind(this));
|
||||||
this._icon.icon_name = 'audio-input-microphone-symbolic';
|
this._icon.icon_name = 'audio-input-microphone-symbolic';
|
||||||
this._icons = [
|
|
||||||
'microphone-sensitivity-muted-symbolic',
|
|
||||||
'microphone-sensitivity-low-symbolic',
|
|
||||||
'microphone-sensitivity-medium-symbolic',
|
|
||||||
'microphone-sensitivity-high-symbolic',
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_connectStream(stream) {
|
_connectStream(stream) {
|
||||||
@@ -324,7 +319,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
|||||||
|
|
||||||
this._output = new OutputStreamSlider(this._control);
|
this._output = new OutputStreamSlider(this._control);
|
||||||
this._output.connect('stream-updated', () => {
|
this._output.connect('stream-updated', () => {
|
||||||
this.emit('output-icon-changed');
|
this.emit('icon-changed');
|
||||||
});
|
});
|
||||||
this.addMenuItem(this._output.item);
|
this.addMenuItem(this._output.item);
|
||||||
|
|
||||||
@@ -332,9 +327,6 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
|||||||
this._input.item.connect('notify::visible', () => {
|
this._input.item.connect('notify::visible', () => {
|
||||||
this.emit('input-visible-changed');
|
this.emit('input-visible-changed');
|
||||||
});
|
});
|
||||||
this._input.connect('stream-updated', () => {
|
|
||||||
this.emit('input-icon-changed');
|
|
||||||
});
|
|
||||||
this.addMenuItem(this._input.item);
|
this.addMenuItem(this._input.item);
|
||||||
|
|
||||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
@@ -351,7 +343,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
|||||||
this._readInput();
|
this._readInput();
|
||||||
this._readOutput();
|
this._readOutput();
|
||||||
} else {
|
} else {
|
||||||
this.emit('output-icon-changed');
|
this.emit('icon-changed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,14 +355,10 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
|||||||
this._input.stream = this._control.get_default_source();
|
this._input.stream = this._control.get_default_source();
|
||||||
}
|
}
|
||||||
|
|
||||||
getOutputIcon() {
|
getIcon() {
|
||||||
return this._output.getIcon();
|
return this._output.getIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
getInputIcon() {
|
|
||||||
return this._input.getIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
getLevel() {
|
getLevel() {
|
||||||
return this._output.getLevel();
|
return this._output.getLevel();
|
||||||
}
|
}
|
||||||
@@ -394,24 +382,21 @@ class Indicator extends PanelMenu.SystemIndicator {
|
|||||||
|
|
||||||
this._control = getMixerControl();
|
this._control = getMixerControl();
|
||||||
this._volumeMenu = new VolumeMenu(this._control);
|
this._volumeMenu = new VolumeMenu(this._control);
|
||||||
this._volumeMenu.connect('output-icon-changed', () => {
|
this._volumeMenu.connect('icon-changed', () => {
|
||||||
let icon = this._volumeMenu.getOutputIcon();
|
let icon = this._volumeMenu.getIcon();
|
||||||
|
|
||||||
if (icon != null)
|
if (icon != null)
|
||||||
this._primaryIndicator.icon_name = icon;
|
this._primaryIndicator.icon_name = icon;
|
||||||
this._primaryIndicator.visible = icon !== null;
|
this._primaryIndicator.visible = icon !== null;
|
||||||
});
|
});
|
||||||
|
|
||||||
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
|
this._inputIndicator.set({
|
||||||
|
icon_name: 'audio-input-microphone-symbolic',
|
||||||
|
visible: this._volumeMenu.getInputVisible(),
|
||||||
|
});
|
||||||
this._volumeMenu.connect('input-visible-changed', () => {
|
this._volumeMenu.connect('input-visible-changed', () => {
|
||||||
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
|
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
|
||||||
});
|
});
|
||||||
this._volumeMenu.connect('input-icon-changed', () => {
|
|
||||||
let icon = this._volumeMenu.getInputIcon();
|
|
||||||
|
|
||||||
if (icon !== null)
|
|
||||||
this._inputIndicator.icon_name = icon;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.menu.addMenuItem(this._volumeMenu);
|
this.menu.addMenuItem(this._volumeMenu);
|
||||||
}
|
}
|
||||||
@@ -421,7 +406,7 @@ class Indicator extends PanelMenu.SystemIndicator {
|
|||||||
if (result == Clutter.EVENT_PROPAGATE || this.menu.actor.mapped)
|
if (result == Clutter.EVENT_PROPAGATE || this.menu.actor.mapped)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getOutputIcon() });
|
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() });
|
||||||
let level = this._volumeMenu.getLevel();
|
let level = this._volumeMenu.getLevel();
|
||||||
let maxLevel = this._volumeMenu.getMaxLevel();
|
let maxLevel = this._volumeMenu.getMaxLevel();
|
||||||
Main.osdWindowManager.show(-1, gicon, null, level, maxLevel);
|
Main.osdWindowManager.show(-1, gicon, null, level, maxLevel);
|
||||||
|
@@ -485,7 +485,6 @@ var UnlockDialog = GObject.registerClass({
|
|||||||
this._gdmClient = new Gdm.Client();
|
this._gdmClient = new Gdm.Client();
|
||||||
|
|
||||||
this._adjustment = new St.Adjustment({
|
this._adjustment = new St.Adjustment({
|
||||||
actor: this,
|
|
||||||
lower: 0,
|
lower: 0,
|
||||||
upper: 2,
|
upper: 2,
|
||||||
page_size: 1,
|
page_size: 1,
|
||||||
@@ -525,10 +524,6 @@ var UnlockDialog = GObject.registerClass({
|
|||||||
|
|
||||||
this._bgManagers = [];
|
this._bgManagers = [];
|
||||||
|
|
||||||
const themeContext = St.ThemeContext.get_for_stage(global.stage);
|
|
||||||
this._scaleChangedId = themeContext.connect('notify::scale-factor',
|
|
||||||
() => this._updateBackgroundEffects());
|
|
||||||
|
|
||||||
this._updateBackgrounds();
|
this._updateBackgrounds();
|
||||||
this._monitorsChangedId =
|
this._monitorsChangedId =
|
||||||
Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this));
|
Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this));
|
||||||
@@ -573,9 +568,11 @@ var UnlockDialog = GObject.registerClass({
|
|||||||
|
|
||||||
this._screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
|
this._screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
|
||||||
|
|
||||||
|
this._userSwitchEnabledId = 0;
|
||||||
this._userSwitchEnabledId = this._screenSaverSettings.connect('changed::user-switch-enabled',
|
this._userSwitchEnabledId = this._screenSaverSettings.connect('changed::user-switch-enabled',
|
||||||
this._updateUserSwitchVisibility.bind(this));
|
this._updateUserSwitchVisibility.bind(this));
|
||||||
|
|
||||||
|
this._userLoadedId = 0;
|
||||||
this._userLoadedId = this._user.connect('notify::is-loaded',
|
this._userLoadedId = this._user.connect('notify::is-loaded',
|
||||||
this._updateUserSwitchVisibility.bind(this));
|
this._updateUserSwitchVisibility.bind(this));
|
||||||
|
|
||||||
@@ -629,7 +626,6 @@ var UnlockDialog = GObject.registerClass({
|
|||||||
y: monitor.y,
|
y: monitor.y,
|
||||||
width: monitor.width,
|
width: monitor.width,
|
||||||
height: monitor.height,
|
height: monitor.height,
|
||||||
effect: new Shell.BlurEffect({ name: 'blur' }),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let bgManager = new Background.BackgroundManager({
|
let bgManager = new Background.BackgroundManager({
|
||||||
@@ -641,17 +637,19 @@ var UnlockDialog = GObject.registerClass({
|
|||||||
this._bgManagers.push(bgManager);
|
this._bgManagers.push(bgManager);
|
||||||
|
|
||||||
this._backgroundGroup.add_child(widget);
|
this._backgroundGroup.add_child(widget);
|
||||||
}
|
|
||||||
|
|
||||||
_updateBackgroundEffects() {
|
|
||||||
const themeContext = St.ThemeContext.get_for_stage(global.stage);
|
const themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||||
|
|
||||||
for (const widget of this._backgroundGroup) {
|
let effect = new Shell.BlurEffect({
|
||||||
widget.get_effect('blur').set({
|
brightness: BLUR_BRIGHTNESS,
|
||||||
brightness: BLUR_BRIGHTNESS,
|
sigma: BLUR_SIGMA * themeContext.scale_factor,
|
||||||
sigma: BLUR_SIGMA * themeContext.scale_factor,
|
});
|
||||||
});
|
|
||||||
}
|
this._scaleChangedId = themeContext.connect('notify::scale-factor', () => {
|
||||||
|
effect.sigma = BLUR_SIGMA * themeContext.scale_factor;
|
||||||
|
});
|
||||||
|
|
||||||
|
widget.add_effect(effect);
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateBackgrounds() {
|
_updateBackgrounds() {
|
||||||
@@ -663,7 +661,6 @@ var UnlockDialog = GObject.registerClass({
|
|||||||
|
|
||||||
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
|
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
|
||||||
this._createBackground(i);
|
this._createBackground(i);
|
||||||
this._updateBackgroundEffects();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_ensureAuthPrompt() {
|
_ensureAuthPrompt() {
|
||||||
|
@@ -299,6 +299,10 @@ var ViewSelector = GObject.registerClass({
|
|||||||
Main.overview.fadeInDesktop();
|
Main.overview.fadeInDesktop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setWorkspacesFullGeometry(geom) {
|
||||||
|
this._workspacesDisplay.setWorkspacesFullGeometry(geom);
|
||||||
|
}
|
||||||
|
|
||||||
vfunc_hide() {
|
vfunc_hide() {
|
||||||
this.reset();
|
this.reset();
|
||||||
this._workspacesDisplay.hide();
|
this._workspacesDisplay.hide();
|
||||||
|
@@ -14,9 +14,9 @@ const WindowMenu = imports.ui.windowMenu;
|
|||||||
const PadOsd = imports.ui.padOsd;
|
const PadOsd = imports.ui.padOsd;
|
||||||
const EdgeDragAction = imports.ui.edgeDragAction;
|
const EdgeDragAction = imports.ui.edgeDragAction;
|
||||||
const CloseDialog = imports.ui.closeDialog;
|
const CloseDialog = imports.ui.closeDialog;
|
||||||
|
const SwipeTracker = imports.ui.swipeTracker;
|
||||||
const SwitchMonitor = imports.ui.switchMonitor;
|
const SwitchMonitor = imports.ui.switchMonitor;
|
||||||
const IBusManager = imports.misc.ibusManager;
|
const IBusManager = imports.misc.ibusManager;
|
||||||
const WorkspaceAnimation = imports.ui.workspaceAnimation;
|
|
||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
@@ -561,6 +561,7 @@ var WindowManager = class {
|
|||||||
this._resizing = new Set();
|
this._resizing = new Set();
|
||||||
this._resizePending = new Set();
|
this._resizePending = new Set();
|
||||||
this._destroying = new Set();
|
this._destroying = new Set();
|
||||||
|
this._movingWindow = null;
|
||||||
|
|
||||||
this._dimmedWindows = [];
|
this._dimmedWindows = [];
|
||||||
|
|
||||||
@@ -570,6 +571,15 @@ var WindowManager = class {
|
|||||||
|
|
||||||
this._isWorkspacePrepended = false;
|
this._isWorkspacePrepended = false;
|
||||||
|
|
||||||
|
this._switchData = null;
|
||||||
|
this._shellwm.connect('kill-switch-workspace', shellwm => {
|
||||||
|
if (this._switchData) {
|
||||||
|
if (this._switchData.inProgress)
|
||||||
|
this._switchWorkspaceDone(shellwm);
|
||||||
|
else if (!this._switchData.gestureActivated)
|
||||||
|
this._finishWorkspaceSwitch(this._switchData);
|
||||||
|
}
|
||||||
|
});
|
||||||
this._shellwm.connect('kill-window-effects', (shellwm, actor) => {
|
this._shellwm.connect('kill-window-effects', (shellwm, actor) => {
|
||||||
this._minimizeWindowDone(shellwm, actor);
|
this._minimizeWindowDone(shellwm, actor);
|
||||||
this._mapWindowDone(shellwm, actor);
|
this._mapWindowDone(shellwm, actor);
|
||||||
@@ -591,6 +601,7 @@ var WindowManager = class {
|
|||||||
this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this));
|
this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this));
|
||||||
this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this));
|
this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this));
|
||||||
this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this));
|
this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this));
|
||||||
|
global.display.connect('restacked', this._syncStacking.bind(this));
|
||||||
|
|
||||||
this._workspaceSwitcherPopup = null;
|
this._workspaceSwitcherPopup = null;
|
||||||
this._tilePreview = null;
|
this._tilePreview = null;
|
||||||
@@ -936,10 +947,17 @@ var WindowManager = class {
|
|||||||
Main.overview.connect('showing', () => {
|
Main.overview.connect('showing', () => {
|
||||||
for (let i = 0; i < this._dimmedWindows.length; i++)
|
for (let i = 0; i < this._dimmedWindows.length; i++)
|
||||||
this._undimWindow(this._dimmedWindows[i]);
|
this._undimWindow(this._dimmedWindows[i]);
|
||||||
|
|
||||||
|
if (this._switchData) {
|
||||||
|
if (this._switchData.gestureActivated)
|
||||||
|
this._switchWorkspaceStop();
|
||||||
|
this._swipeTracker.enabled = false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
Main.overview.connect('hiding', () => {
|
Main.overview.connect('hiding', () => {
|
||||||
for (let i = 0; i < this._dimmedWindows.length; i++)
|
for (let i = 0; i < this._dimmedWindows.length; i++)
|
||||||
this._dimWindow(this._dimmedWindows[i]);
|
this._dimWindow(this._dimmedWindows[i]);
|
||||||
|
this._swipeTracker.enabled = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
this._windowMenuManager = new WindowMenu.WindowMenuManager();
|
this._windowMenuManager = new WindowMenu.WindowMenuManager();
|
||||||
@@ -950,6 +968,13 @@ var WindowManager = class {
|
|||||||
global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
|
global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
|
||||||
false, -1, 1);
|
false, -1, 1);
|
||||||
|
|
||||||
|
let swipeTracker = new SwipeTracker.SwipeTracker(global.stage,
|
||||||
|
Shell.ActionMode.NORMAL, { allowDrag: false, allowScroll: false });
|
||||||
|
swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this));
|
||||||
|
swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this));
|
||||||
|
swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this));
|
||||||
|
this._swipeTracker = swipeTracker;
|
||||||
|
|
||||||
let appSwitchAction = new AppSwitchAction();
|
let appSwitchAction = new AppSwitchAction();
|
||||||
appSwitchAction.connect('activated', this._switchApp.bind(this));
|
appSwitchAction.connect('activated', this._switchApp.bind(this));
|
||||||
global.stage.add_action(appSwitchAction);
|
global.stage.add_action(appSwitchAction);
|
||||||
@@ -981,14 +1006,6 @@ var WindowManager = class {
|
|||||||
global.display.connect('in-fullscreen-changed', updateUnfullscreenGesture);
|
global.display.connect('in-fullscreen-changed', updateUnfullscreenGesture);
|
||||||
|
|
||||||
global.stage.add_action(topDragAction);
|
global.stage.add_action(topDragAction);
|
||||||
|
|
||||||
this._workspaceAnimation =
|
|
||||||
new WorkspaceAnimation.WorkspaceAnimationController();
|
|
||||||
|
|
||||||
this._shellwm.connect('kill-switch-workspace', () => {
|
|
||||||
this._workspaceAnimation.cancelSwitchAnimation();
|
|
||||||
this._switchWorkspaceDone();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) {
|
_showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) {
|
||||||
@@ -1111,7 +1128,8 @@ var WindowManager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_shouldAnimate() {
|
_shouldAnimate() {
|
||||||
return !(Main.overview.visible || this._workspaceAnimation.gestureActive);
|
return !(Main.overview.visible ||
|
||||||
|
(this._switchData && this._switchData.gestureActivated));
|
||||||
}
|
}
|
||||||
|
|
||||||
_shouldAnimateActor(actor, types) {
|
_shouldAnimateActor(actor, types) {
|
||||||
@@ -1607,26 +1625,377 @@ var WindowManager = class {
|
|||||||
return !(this._allowedKeybindings[binding.get_name()] & Main.actionMode);
|
return !(this._allowedKeybindings[binding.get_name()] & Main.actionMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_syncStacking() {
|
||||||
|
if (this._switchData == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let windows = global.get_window_actors();
|
||||||
|
let lastCurSibling = null;
|
||||||
|
let lastDirSibling = [];
|
||||||
|
for (let i = 0; i < windows.length; i++) {
|
||||||
|
if (windows[i].get_parent() == this._switchData.curGroup) {
|
||||||
|
this._switchData.curGroup.set_child_above_sibling(windows[i], lastCurSibling);
|
||||||
|
lastCurSibling = windows[i];
|
||||||
|
} else {
|
||||||
|
for (let dir of Object.values(Meta.MotionDirection)) {
|
||||||
|
let info = this._switchData.surroundings[dir];
|
||||||
|
if (!info || windows[i].get_parent() != info.actor)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
let sibling = lastDirSibling[dir];
|
||||||
|
if (sibling == undefined)
|
||||||
|
sibling = null;
|
||||||
|
|
||||||
|
info.actor.set_child_above_sibling(windows[i], sibling);
|
||||||
|
lastDirSibling[dir] = windows[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_getPositionForDirection(direction, fromWs, toWs) {
|
||||||
|
let xDest = 0, yDest = 0;
|
||||||
|
|
||||||
|
let oldWsIsFullscreen = fromWs.list_windows().some(w => w.is_fullscreen());
|
||||||
|
let newWsIsFullscreen = toWs.list_windows().some(w => w.is_fullscreen());
|
||||||
|
|
||||||
|
// We have to shift windows up or down by the height of the panel to prevent having a
|
||||||
|
// visible gap between the windows while switching workspaces. Since fullscreen windows
|
||||||
|
// hide the panel, they don't need to be shifted up or down.
|
||||||
|
let shiftHeight = Main.panel.height;
|
||||||
|
|
||||||
|
if (direction == Meta.MotionDirection.UP ||
|
||||||
|
direction == Meta.MotionDirection.UP_LEFT ||
|
||||||
|
direction == Meta.MotionDirection.UP_RIGHT)
|
||||||
|
yDest = -global.screen_height + (oldWsIsFullscreen ? 0 : shiftHeight);
|
||||||
|
else if (direction == Meta.MotionDirection.DOWN ||
|
||||||
|
direction == Meta.MotionDirection.DOWN_LEFT ||
|
||||||
|
direction == Meta.MotionDirection.DOWN_RIGHT)
|
||||||
|
yDest = global.screen_height - (newWsIsFullscreen ? 0 : shiftHeight);
|
||||||
|
|
||||||
|
if (direction == Meta.MotionDirection.LEFT ||
|
||||||
|
direction == Meta.MotionDirection.UP_LEFT ||
|
||||||
|
direction == Meta.MotionDirection.DOWN_LEFT)
|
||||||
|
xDest = -global.screen_width;
|
||||||
|
else if (direction == Meta.MotionDirection.RIGHT ||
|
||||||
|
direction == Meta.MotionDirection.UP_RIGHT ||
|
||||||
|
direction == Meta.MotionDirection.DOWN_RIGHT)
|
||||||
|
xDest = global.screen_width;
|
||||||
|
|
||||||
|
return [xDest, yDest];
|
||||||
|
}
|
||||||
|
|
||||||
|
_prepareWorkspaceSwitch(from, to, direction) {
|
||||||
|
if (this._switchData)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let wgroup = global.window_group;
|
||||||
|
let windows = global.get_window_actors();
|
||||||
|
let switchData = {};
|
||||||
|
|
||||||
|
this._switchData = switchData;
|
||||||
|
switchData.curGroup = new Clutter.Actor();
|
||||||
|
switchData.movingWindowBin = new Clutter.Actor();
|
||||||
|
switchData.windows = [];
|
||||||
|
switchData.surroundings = {};
|
||||||
|
switchData.gestureActivated = false;
|
||||||
|
switchData.inProgress = false;
|
||||||
|
|
||||||
|
switchData.container = new Clutter.Actor();
|
||||||
|
switchData.container.add_actor(switchData.curGroup);
|
||||||
|
|
||||||
|
wgroup.add_actor(switchData.movingWindowBin);
|
||||||
|
wgroup.add_actor(switchData.container);
|
||||||
|
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let curWs = workspaceManager.get_workspace_by_index(from);
|
||||||
|
|
||||||
|
for (let dir of Object.values(Meta.MotionDirection)) {
|
||||||
|
let ws = null;
|
||||||
|
|
||||||
|
if (to < 0)
|
||||||
|
ws = curWs.get_neighbor(dir);
|
||||||
|
else if (dir == direction)
|
||||||
|
ws = workspaceManager.get_workspace_by_index(to);
|
||||||
|
|
||||||
|
if (ws == null || ws == curWs) {
|
||||||
|
switchData.surroundings[dir] = null;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let [x, y] = this._getPositionForDirection(dir, curWs, ws);
|
||||||
|
let info = {
|
||||||
|
index: ws.index(),
|
||||||
|
actor: new Clutter.Actor(),
|
||||||
|
xDest: x,
|
||||||
|
yDest: y,
|
||||||
|
};
|
||||||
|
switchData.surroundings[dir] = info;
|
||||||
|
switchData.container.add_actor(info.actor);
|
||||||
|
switchData.container.set_child_above_sibling(info.actor, null);
|
||||||
|
|
||||||
|
info.actor.set_position(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
wgroup.set_child_above_sibling(switchData.movingWindowBin, null);
|
||||||
|
|
||||||
|
for (let i = 0; i < windows.length; i++) {
|
||||||
|
let actor = windows[i];
|
||||||
|
let window = actor.get_meta_window();
|
||||||
|
|
||||||
|
if (!window.showing_on_its_workspace())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (window.is_on_all_workspaces())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
let record = { window: actor,
|
||||||
|
parent: actor.get_parent() };
|
||||||
|
|
||||||
|
if (this._movingWindow && window == this._movingWindow) {
|
||||||
|
record.parent.remove_child(actor);
|
||||||
|
switchData.movingWindow = record;
|
||||||
|
switchData.windows.push(switchData.movingWindow);
|
||||||
|
switchData.movingWindowBin.add_child(actor);
|
||||||
|
} else if (window.get_workspace().index() == from) {
|
||||||
|
record.parent.remove_child(actor);
|
||||||
|
switchData.windows.push(record);
|
||||||
|
switchData.curGroup.add_child(actor);
|
||||||
|
} else {
|
||||||
|
let visible = false;
|
||||||
|
for (let dir of Object.values(Meta.MotionDirection)) {
|
||||||
|
let info = switchData.surroundings[dir];
|
||||||
|
|
||||||
|
if (!info || info.index != window.get_workspace().index())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
record.parent.remove_child(actor);
|
||||||
|
switchData.windows.push(record);
|
||||||
|
info.actor.add_child(actor);
|
||||||
|
visible = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
actor.visible = visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < switchData.windows.length; i++) {
|
||||||
|
let w = switchData.windows[i];
|
||||||
|
|
||||||
|
w.windowDestroyId = w.window.connect('destroy', () => {
|
||||||
|
switchData.windows.splice(switchData.windows.indexOf(w), 1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_finishWorkspaceSwitch(switchData) {
|
||||||
|
this._switchData = null;
|
||||||
|
|
||||||
|
for (let i = 0; i < switchData.windows.length; i++) {
|
||||||
|
let w = switchData.windows[i];
|
||||||
|
|
||||||
|
w.window.disconnect(w.windowDestroyId);
|
||||||
|
w.window.get_parent().remove_child(w.window);
|
||||||
|
w.parent.add_child(w.window);
|
||||||
|
|
||||||
|
if (w.window.get_meta_window().get_workspace() !=
|
||||||
|
global.workspace_manager.get_active_workspace())
|
||||||
|
w.window.hide();
|
||||||
|
}
|
||||||
|
switchData.container.destroy();
|
||||||
|
switchData.movingWindowBin.destroy();
|
||||||
|
|
||||||
|
this._movingWindow = null;
|
||||||
|
}
|
||||||
|
|
||||||
_switchWorkspace(shellwm, from, to, direction) {
|
_switchWorkspace(shellwm, from, to, direction) {
|
||||||
if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) {
|
if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) {
|
||||||
shellwm.completed_switch_workspace();
|
shellwm.completed_switch_workspace();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._switchInProgress = true;
|
this._prepareWorkspaceSwitch(from, to, direction);
|
||||||
|
this._switchData.inProgress = true;
|
||||||
|
|
||||||
this._workspaceAnimation.animateSwitch(from, to, direction, () => {
|
let workspaceManager = global.workspace_manager;
|
||||||
this._shellwm.completed_switch_workspace();
|
let fromWs = workspaceManager.get_workspace_by_index(from);
|
||||||
this._switchInProgress = false;
|
let toWs = workspaceManager.get_workspace_by_index(to);
|
||||||
|
|
||||||
|
let [xDest, yDest] = this._getPositionForDirection(direction, fromWs, toWs);
|
||||||
|
|
||||||
|
/* @direction is the direction that the "camera" moves, so the
|
||||||
|
* screen contents have to move one screen's worth in the
|
||||||
|
* opposite direction.
|
||||||
|
*/
|
||||||
|
xDest = -xDest;
|
||||||
|
yDest = -yDest;
|
||||||
|
|
||||||
|
this._switchData.container.ease({
|
||||||
|
x: xDest,
|
||||||
|
y: yDest,
|
||||||
|
duration: WINDOW_ANIMATION_TIME,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
|
onComplete: () => this._switchWorkspaceDone(shellwm),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_switchWorkspaceDone() {
|
_switchWorkspaceDone(shellwm) {
|
||||||
if (!this._switchInProgress)
|
this._finishWorkspaceSwitch(this._switchData);
|
||||||
|
shellwm.completed_switch_workspace();
|
||||||
|
}
|
||||||
|
|
||||||
|
_directionForProgress(progress) {
|
||||||
|
if (global.workspace_manager.layout_rows === -1) {
|
||||||
|
return progress > 0
|
||||||
|
? Meta.MotionDirection.DOWN
|
||||||
|
: Meta.MotionDirection.UP;
|
||||||
|
} else if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL) {
|
||||||
|
return progress > 0
|
||||||
|
? Meta.MotionDirection.LEFT
|
||||||
|
: Meta.MotionDirection.RIGHT;
|
||||||
|
} else {
|
||||||
|
return progress > 0
|
||||||
|
? Meta.MotionDirection.RIGHT
|
||||||
|
: Meta.MotionDirection.LEFT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_getProgressRange() {
|
||||||
|
if (!this._switchData)
|
||||||
|
return [0, 0];
|
||||||
|
|
||||||
|
let lower = 0;
|
||||||
|
let upper = 0;
|
||||||
|
|
||||||
|
let horiz = global.workspace_manager.layout_rows !== -1;
|
||||||
|
let baseDistance;
|
||||||
|
if (horiz)
|
||||||
|
baseDistance = global.screen_width;
|
||||||
|
else
|
||||||
|
baseDistance = global.screen_height;
|
||||||
|
|
||||||
|
let direction = this._directionForProgress(-1);
|
||||||
|
let info = this._switchData.surroundings[direction];
|
||||||
|
if (info !== null) {
|
||||||
|
let distance = horiz ? info.xDest : info.yDest;
|
||||||
|
lower = -Math.abs(distance) / baseDistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
direction = this._directionForProgress(1);
|
||||||
|
info = this._switchData.surroundings[direction];
|
||||||
|
if (info !== null) {
|
||||||
|
let distance = horiz ? info.xDest : info.yDest;
|
||||||
|
upper = Math.abs(distance) / baseDistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [lower, upper];
|
||||||
|
}
|
||||||
|
|
||||||
|
_switchWorkspaceBegin(tracker, monitor) {
|
||||||
|
if (Meta.prefs_get_workspaces_only_on_primary() &&
|
||||||
|
monitor !== Main.layoutManager.primaryIndex)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._shellwm.completed_switch_workspace();
|
let workspaceManager = global.workspace_manager;
|
||||||
this._switchInProgress = false;
|
let horiz = workspaceManager.layout_rows !== -1;
|
||||||
|
tracker.orientation = horiz
|
||||||
|
? Clutter.Orientation.HORIZONTAL
|
||||||
|
: Clutter.Orientation.VERTICAL;
|
||||||
|
|
||||||
|
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||||
|
|
||||||
|
let baseDistance;
|
||||||
|
if (horiz)
|
||||||
|
baseDistance = global.screen_width;
|
||||||
|
else
|
||||||
|
baseDistance = global.screen_height;
|
||||||
|
|
||||||
|
let progress;
|
||||||
|
if (this._switchData && this._switchData.gestureActivated) {
|
||||||
|
this._switchData.container.remove_all_transitions();
|
||||||
|
if (!horiz)
|
||||||
|
progress = -this._switchData.container.y / baseDistance;
|
||||||
|
else if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
|
||||||
|
progress = this._switchData.container.x / baseDistance;
|
||||||
|
else
|
||||||
|
progress = -this._switchData.container.x / baseDistance;
|
||||||
|
} else {
|
||||||
|
this._prepareWorkspaceSwitch(activeWorkspace.index(), -1);
|
||||||
|
progress = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
let points = [];
|
||||||
|
let [lower, upper] = this._getProgressRange();
|
||||||
|
|
||||||
|
if (lower !== 0)
|
||||||
|
points.push(lower);
|
||||||
|
|
||||||
|
points.push(0);
|
||||||
|
|
||||||
|
if (upper !== 0)
|
||||||
|
points.push(upper);
|
||||||
|
|
||||||
|
tracker.confirmSwipe(baseDistance, points, progress, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
_switchWorkspaceUpdate(tracker, progress) {
|
||||||
|
if (!this._switchData)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let direction = this._directionForProgress(progress);
|
||||||
|
let info = this._switchData.surroundings[direction];
|
||||||
|
let xPos = 0;
|
||||||
|
let yPos = 0;
|
||||||
|
if (info) {
|
||||||
|
if (global.workspace_manager.layout_rows === -1)
|
||||||
|
yPos = -Math.round(progress * global.screen_height);
|
||||||
|
else if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
|
||||||
|
xPos = Math.round(progress * global.screen_width);
|
||||||
|
else
|
||||||
|
xPos = -Math.round(progress * global.screen_width);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._switchData.container.set_position(xPos, yPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
_switchWorkspaceEnd(tracker, duration, endProgress) {
|
||||||
|
if (!this._switchData)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||||
|
let newWs = activeWorkspace;
|
||||||
|
let xDest = 0;
|
||||||
|
let yDest = 0;
|
||||||
|
if (endProgress !== 0) {
|
||||||
|
let direction = this._directionForProgress(endProgress);
|
||||||
|
newWs = activeWorkspace.get_neighbor(direction);
|
||||||
|
xDest = -this._switchData.surroundings[direction].xDest;
|
||||||
|
yDest = -this._switchData.surroundings[direction].yDest;
|
||||||
|
}
|
||||||
|
|
||||||
|
let switchData = this._switchData;
|
||||||
|
switchData.gestureActivated = true;
|
||||||
|
|
||||||
|
this._switchData.container.ease({
|
||||||
|
x: xDest,
|
||||||
|
y: yDest,
|
||||||
|
duration,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
|
onComplete: () => {
|
||||||
|
if (newWs !== activeWorkspace)
|
||||||
|
this.actionMoveWorkspace(newWs);
|
||||||
|
this._finishWorkspaceSwitch(switchData);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_switchWorkspaceStop() {
|
||||||
|
this._switchData.container.x = 0;
|
||||||
|
this._switchData.container.y = 0;
|
||||||
|
this._finishWorkspaceSwitch(this._switchData);
|
||||||
}
|
}
|
||||||
|
|
||||||
_showTilePreview(shellwm, window, tileRect, monitorIndex) {
|
_showTilePreview(shellwm, window, tileRect, monitorIndex) {
|
||||||
@@ -1816,7 +2185,10 @@ var WindowManager = class {
|
|||||||
if (!Main.sessionMode.hasWorkspaces)
|
if (!Main.sessionMode.hasWorkspaces)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!workspace.active)
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||||
|
|
||||||
|
if (activeWorkspace != workspace)
|
||||||
workspace.activate(global.get_current_time());
|
workspace.activate(global.get_current_time());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1824,11 +2196,14 @@ var WindowManager = class {
|
|||||||
if (!Main.sessionMode.hasWorkspaces)
|
if (!Main.sessionMode.hasWorkspaces)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!workspace.active) {
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||||
|
|
||||||
|
if (activeWorkspace != workspace) {
|
||||||
// This won't have any effect for "always sticky" windows
|
// This won't have any effect for "always sticky" windows
|
||||||
// (like desktop windows or docks)
|
// (like desktop windows or docks)
|
||||||
|
|
||||||
this._workspaceAnimation.movingWindow = window;
|
this._movingWindow = window;
|
||||||
window.change_workspace(workspace);
|
window.change_workspace(workspace);
|
||||||
|
|
||||||
global.display.clear_mouse_mode();
|
global.display.clear_mouse_mode();
|
||||||
|
@@ -67,12 +67,8 @@ var WindowPreviewLayout = GObject.registerClass({
|
|||||||
vfunc_allocate(container, box) {
|
vfunc_allocate(container, box) {
|
||||||
// If the scale isn't 1, we weren't allocated our preferred size
|
// If the scale isn't 1, we weren't allocated our preferred size
|
||||||
// and have to scale the children allocations accordingly.
|
// and have to scale the children allocations accordingly.
|
||||||
const scaleX = this._boundingBox.get_width() > 0
|
const scaleX = box.get_width() / this._boundingBox.get_width();
|
||||||
? box.get_width() / this._boundingBox.get_width()
|
const scaleY = box.get_height() / this._boundingBox.get_height();
|
||||||
: 1;
|
|
||||||
const scaleY = this._boundingBox.get_height() > 0
|
|
||||||
? box.get_height() / this._boundingBox.get_height()
|
|
||||||
: 1;
|
|
||||||
|
|
||||||
const childBox = new Clutter.ActorBox();
|
const childBox = new Clutter.ActorBox();
|
||||||
|
|
||||||
@@ -97,7 +93,7 @@ var WindowPreviewLayout = GObject.registerClass({
|
|||||||
|
|
||||||
child.allocate(childBox);
|
child.allocate(childBox);
|
||||||
} else {
|
} else {
|
||||||
child.allocate_preferred_size(0, 0);
|
child.allocate_preferred_size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,12 +185,6 @@ var WindowPreviewLayout = GObject.registerClass({
|
|||||||
});
|
});
|
||||||
|
|
||||||
var WindowPreview = GObject.registerClass({
|
var WindowPreview = GObject.registerClass({
|
||||||
Properties: {
|
|
||||||
'overlay-enabled': GObject.ParamSpec.boolean(
|
|
||||||
'overlay-enabled', 'overlay-enabled', 'overlay-enabled',
|
|
||||||
GObject.ParamFlags.READWRITE,
|
|
||||||
true),
|
|
||||||
},
|
|
||||||
Signals: {
|
Signals: {
|
||||||
'drag-begin': {},
|
'drag-begin': {},
|
||||||
'drag-cancelled': {},
|
'drag-cancelled': {},
|
||||||
@@ -229,6 +219,7 @@ var WindowPreview = GObject.registerClass({
|
|||||||
|
|
||||||
this._delegate = this;
|
this._delegate = this;
|
||||||
|
|
||||||
|
this.slotId = 0;
|
||||||
this._stackAbove = null;
|
this._stackAbove = null;
|
||||||
|
|
||||||
this._windowContainer.layout_manager.connect(
|
this._windowContainer.layout_manager.connect(
|
||||||
@@ -242,6 +233,8 @@ var WindowPreview = GObject.registerClass({
|
|||||||
this._windowActor.connect('destroy', () => this.destroy());
|
this._windowActor.connect('destroy', () => this.destroy());
|
||||||
|
|
||||||
this._updateAttachedDialogs();
|
this._updateAttachedDialogs();
|
||||||
|
this.x = this.boundingBox.x;
|
||||||
|
this.y = this.boundingBox.y;
|
||||||
|
|
||||||
let clickAction = new Clutter.ClickAction();
|
let clickAction = new Clutter.ClickAction();
|
||||||
clickAction.connect('clicked', () => this._activate());
|
clickAction.connect('clicked', () => this._activate());
|
||||||
@@ -260,7 +253,6 @@ var WindowPreview = GObject.registerClass({
|
|||||||
this.inDrag = false;
|
this.inDrag = false;
|
||||||
|
|
||||||
this._selected = false;
|
this._selected = false;
|
||||||
this._overlayEnabled = true;
|
|
||||||
this._closeRequested = false;
|
this._closeRequested = false;
|
||||||
this._idleHideOverlayId = 0;
|
this._idleHideOverlayId = 0;
|
||||||
|
|
||||||
@@ -353,14 +345,6 @@ var WindowPreview = GObject.registerClass({
|
|||||||
this.add_child(this._border);
|
this.add_child(this._border);
|
||||||
this.add_child(this._title);
|
this.add_child(this._title);
|
||||||
this.add_child(this._closeButton);
|
this.add_child(this._closeButton);
|
||||||
|
|
||||||
this.connect('notify::realized', () => {
|
|
||||||
if (!this.realized)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._border.ensure_style();
|
|
||||||
this._title.ensure_style();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_get_preferred_width(forHeight) {
|
vfunc_get_preferred_width(forHeight) {
|
||||||
@@ -415,6 +399,8 @@ var WindowPreview = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
chromeHeights() {
|
chromeHeights() {
|
||||||
|
this._border.ensure_style();
|
||||||
|
this._title.ensure_style();
|
||||||
const [, closeButtonHeight] = this._closeButton.get_preferred_height(-1);
|
const [, closeButtonHeight] = this._closeButton.get_preferred_height(-1);
|
||||||
const [, titleHeight] = this._title.get_preferred_height(-1);
|
const [, titleHeight] = this._title.get_preferred_height(-1);
|
||||||
|
|
||||||
@@ -427,6 +413,7 @@ var WindowPreview = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
chromeWidths() {
|
chromeWidths() {
|
||||||
|
this._border.ensure_style();
|
||||||
const [, closeButtonWidth] = this._closeButton.get_preferred_width(-1);
|
const [, closeButtonWidth] = this._closeButton.get_preferred_width(-1);
|
||||||
|
|
||||||
const leftOversize = this._closeButtonSide === St.Side.LEFT
|
const leftOversize = this._closeButtonSide === St.Side.LEFT
|
||||||
@@ -440,9 +427,6 @@ var WindowPreview = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
showOverlay(animate) {
|
showOverlay(animate) {
|
||||||
if (!this._overlayEnabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const ongoingTransition = this._border.get_transition('opacity');
|
const ongoingTransition = this._border.get_transition('opacity');
|
||||||
|
|
||||||
// Don't do anything if we're fully visible already
|
// Don't do anything if we're fully visible already
|
||||||
@@ -578,25 +562,6 @@ var WindowPreview = GObject.registerClass({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line camelcase
|
|
||||||
get overlay_enabled() {
|
|
||||||
return this._overlayEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line camelcase
|
|
||||||
set overlay_enabled(enabled) {
|
|
||||||
if (this._overlayEnabled === enabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._overlayEnabled = enabled;
|
|
||||||
this.notify('overlay-enabled');
|
|
||||||
|
|
||||||
if (!enabled)
|
|
||||||
this.hideOverlay(false);
|
|
||||||
else if (this['has-pointer'] || global.stage.key_focus === this)
|
|
||||||
this.showOverlay(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the actor just below us, respecting reparenting done by DND code
|
// Find the actor just below us, respecting reparenting done by DND code
|
||||||
_getActualStackAbove() {
|
_getActualStackAbove() {
|
||||||
if (this._stackAbove == null)
|
if (this._stackAbove == null)
|
||||||
|
1069
js/ui/workspace.js
1069
js/ui/workspace.js
File diff suppressed because it is too large
Load Diff
@@ -1,475 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
/* exported WorkspaceAnimationController */
|
|
||||||
|
|
||||||
const { Clutter, GObject, Meta, Shell } = imports.gi;
|
|
||||||
|
|
||||||
const Background = imports.ui.background;
|
|
||||||
const Layout = imports.ui.layout;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const SwipeTracker = imports.ui.swipeTracker;
|
|
||||||
|
|
||||||
const WINDOW_ANIMATION_TIME = 250;
|
|
||||||
|
|
||||||
const WorkspaceGroup = GObject.registerClass(
|
|
||||||
class WorkspaceGroup extends Clutter.Actor {
|
|
||||||
_init(workspace, monitor, movingWindow) {
|
|
||||||
super._init();
|
|
||||||
|
|
||||||
this._workspace = workspace;
|
|
||||||
this._monitor = monitor;
|
|
||||||
this._movingWindow = movingWindow;
|
|
||||||
this._windowRecords = [];
|
|
||||||
|
|
||||||
this._createWindows();
|
|
||||||
|
|
||||||
this.connect('destroy', this._onDestroy.bind(this));
|
|
||||||
this._restackedId = global.display.connect('restacked',
|
|
||||||
this._syncStacking.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
get workspace() {
|
|
||||||
return this._workspace;
|
|
||||||
}
|
|
||||||
|
|
||||||
_shouldShowWindow(window) {
|
|
||||||
if (!window.showing_on_its_workspace())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const geometry = global.display.get_monitor_geometry(this._monitor.index);
|
|
||||||
const [intersects, intersection_] = window.get_frame_rect().intersect(geometry);
|
|
||||||
if (!intersects)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const isSticky =
|
|
||||||
window.is_on_all_workspaces() || window === this._movingWindow;
|
|
||||||
|
|
||||||
// No workspace means we should show windows that are on all workspaces
|
|
||||||
if (!this._workspace)
|
|
||||||
return isSticky;
|
|
||||||
|
|
||||||
// Otherwise only show windows that are (only) on that workspace
|
|
||||||
return !isSticky && window.located_on_workspace(this._workspace);
|
|
||||||
}
|
|
||||||
|
|
||||||
_syncStacking() {
|
|
||||||
const windowActors = global.get_window_actors().filter(w =>
|
|
||||||
this._shouldShowWindow(w.meta_window));
|
|
||||||
|
|
||||||
let lastRecord;
|
|
||||||
|
|
||||||
for (const windowActor of windowActors) {
|
|
||||||
const record = this._windowRecords.find(r => r.windowActor === windowActor);
|
|
||||||
|
|
||||||
this.set_child_above_sibling(record.clone, lastRecord ? lastRecord.clone : null);
|
|
||||||
lastRecord = record;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_createWindows() {
|
|
||||||
const windowActors = global.get_window_actors().filter(w =>
|
|
||||||
this._shouldShowWindow(w.meta_window));
|
|
||||||
|
|
||||||
for (const windowActor of windowActors) {
|
|
||||||
const clone = new Clutter.Clone({
|
|
||||||
source: windowActor,
|
|
||||||
x: windowActor.x - this._monitor.x,
|
|
||||||
y: windowActor.y - this._monitor.y,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.add_child(clone);
|
|
||||||
|
|
||||||
const record = { windowActor, clone };
|
|
||||||
|
|
||||||
record.windowDestroyId = windowActor.connect('destroy', () => {
|
|
||||||
clone.destroy();
|
|
||||||
this._windowRecords.splice(this._windowRecords.indexOf(record), 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._windowRecords.push(record);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_removeWindows() {
|
|
||||||
for (const record of this._windowRecords) {
|
|
||||||
record.windowActor.disconnect(record.windowDestroyId);
|
|
||||||
record.clone.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
this._windowRecords = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
_onDestroy() {
|
|
||||||
global.display.disconnect(this._restackedId);
|
|
||||||
this._removeWindows();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const MonitorGroup = GObject.registerClass({
|
|
||||||
Properties: {
|
|
||||||
'progress': GObject.ParamSpec.double(
|
|
||||||
'progress', 'progress', 'progress',
|
|
||||||
GObject.ParamFlags.READWRITE,
|
|
||||||
-Infinity, Infinity, 0),
|
|
||||||
},
|
|
||||||
}, class MonitorGroup extends Clutter.Actor {
|
|
||||||
_init(monitor, workspaceIndices, movingWindow) {
|
|
||||||
super._init({
|
|
||||||
clip_to_allocation: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
this._monitor = monitor;
|
|
||||||
|
|
||||||
const constraint = new Layout.MonitorConstraint({ index: monitor.index });
|
|
||||||
this.add_constraint(constraint);
|
|
||||||
|
|
||||||
const background = new Meta.BackgroundGroup();
|
|
||||||
|
|
||||||
this.add_child(background);
|
|
||||||
|
|
||||||
this._container = new Clutter.Actor();
|
|
||||||
this.add_child(this._container);
|
|
||||||
|
|
||||||
const stickyGroup = new WorkspaceGroup(null, monitor, movingWindow);
|
|
||||||
this.add_child(stickyGroup);
|
|
||||||
|
|
||||||
this._workspaceGroups = [];
|
|
||||||
|
|
||||||
const workspaceManager = global.workspace_manager;
|
|
||||||
const vertical = workspaceManager.layout_rows === -1;
|
|
||||||
const activeWorkspace = workspaceManager.get_active_workspace();
|
|
||||||
|
|
||||||
let x = 0;
|
|
||||||
let y = 0;
|
|
||||||
|
|
||||||
for (const i of workspaceIndices) {
|
|
||||||
const ws = workspaceManager.get_workspace_by_index(i);
|
|
||||||
const fullscreen = ws.list_windows().some(w => w.get_monitor() === monitor.index && w.is_fullscreen());
|
|
||||||
|
|
||||||
if (i > 0 && vertical && !fullscreen && monitor.index === Main.layoutManager.primaryIndex) {
|
|
||||||
// We have to shift windows up or down by the height of the panel to prevent having a
|
|
||||||
// visible gap between the windows while switching workspaces. Since fullscreen windows
|
|
||||||
// hide the panel, they don't need to be shifted up or down.
|
|
||||||
y -= Main.panel.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
const group = new WorkspaceGroup(ws, monitor, movingWindow);
|
|
||||||
|
|
||||||
this._workspaceGroups.push(group);
|
|
||||||
this._container.add_child(group);
|
|
||||||
group.set_position(x, y);
|
|
||||||
|
|
||||||
if (vertical)
|
|
||||||
y += this.baseDistance;
|
|
||||||
else if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
|
|
||||||
x -= this.baseDistance;
|
|
||||||
else
|
|
||||||
x += this.baseDistance;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.progress = this.getWorkspaceProgress(activeWorkspace);
|
|
||||||
|
|
||||||
this._bgManager = new Background.BackgroundManager({
|
|
||||||
container: background,
|
|
||||||
monitorIndex: monitor.index,
|
|
||||||
controlPosition: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.connect('destroy', this._onDestroy.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
_onDestroy() {
|
|
||||||
this._bgManager.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
get baseDistance() {
|
|
||||||
if (global.workspace_manager.layout_rows === -1)
|
|
||||||
return this._monitor.height;
|
|
||||||
else
|
|
||||||
return this._monitor.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
get progress() {
|
|
||||||
if (global.workspace_manager.layout_rows === -1)
|
|
||||||
return -this._container.y / this.baseDistance;
|
|
||||||
else if (this.get_text_direction() === Clutter.TextDirection.RTL)
|
|
||||||
return this._container.x / this.baseDistance;
|
|
||||||
else
|
|
||||||
return -this._container.x / this.baseDistance;
|
|
||||||
}
|
|
||||||
|
|
||||||
set progress(p) {
|
|
||||||
if (global.workspace_manager.layout_rows === -1)
|
|
||||||
this._container.y = -Math.round(p * this.baseDistance);
|
|
||||||
else if (this.get_text_direction() === Clutter.TextDirection.RTL)
|
|
||||||
this._container.x = Math.round(p * this.baseDistance);
|
|
||||||
else
|
|
||||||
this._container.x = -Math.round(p * this.baseDistance);
|
|
||||||
}
|
|
||||||
|
|
||||||
get index() {
|
|
||||||
return this._monitor.index;
|
|
||||||
}
|
|
||||||
|
|
||||||
getWorkspaceProgress(workspace) {
|
|
||||||
const group = this._workspaceGroups.find(g =>
|
|
||||||
g.workspace.index() === workspace.index());
|
|
||||||
return this._getWorkspaceGroupProgress(group);
|
|
||||||
}
|
|
||||||
|
|
||||||
_getWorkspaceGroupProgress(group) {
|
|
||||||
if (global.workspace_manager.layout_rows === -1)
|
|
||||||
return group.y / this.baseDistance;
|
|
||||||
else if (this.get_text_direction() === Clutter.TextDirection.RTL)
|
|
||||||
return -group.x / this.baseDistance;
|
|
||||||
else
|
|
||||||
return group.x / this.baseDistance;
|
|
||||||
}
|
|
||||||
|
|
||||||
getSnapPoints() {
|
|
||||||
return this._workspaceGroups.map(g =>
|
|
||||||
this._getWorkspaceGroupProgress(g));
|
|
||||||
}
|
|
||||||
|
|
||||||
findClosestWorkspace(progress) {
|
|
||||||
const distances = this.getSnapPoints().map(p =>
|
|
||||||
Math.abs(p - progress));
|
|
||||||
const index = distances.indexOf(Math.min(...distances));
|
|
||||||
return this._workspaceGroups[index].workspace;
|
|
||||||
}
|
|
||||||
|
|
||||||
_interpolateProgress(progress, monitorGroup) {
|
|
||||||
if (this.index === monitorGroup.index)
|
|
||||||
return progress;
|
|
||||||
|
|
||||||
const points1 = monitorGroup.getSnapPoints();
|
|
||||||
const points2 = this.getSnapPoints();
|
|
||||||
|
|
||||||
const upper = points1.indexOf(points1.find(p => p >= progress));
|
|
||||||
const lower = points1.indexOf(points1.slice().reverse().find(p => p <= progress));
|
|
||||||
|
|
||||||
if (points1[upper] === points1[lower])
|
|
||||||
return points2[upper];
|
|
||||||
|
|
||||||
const t = (progress - points1[lower]) / (points1[upper] - points1[lower]);
|
|
||||||
|
|
||||||
return points2[lower] + (points2[upper] - points2[lower]) * t;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateSwipeForMonitor(progress, monitorGroup) {
|
|
||||||
this.progress = this._interpolateProgress(progress, monitorGroup);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var WorkspaceAnimationController = class {
|
|
||||||
constructor() {
|
|
||||||
this._movingWindow = null;
|
|
||||||
this._switchData = null;
|
|
||||||
|
|
||||||
Main.overview.connect('showing', () => {
|
|
||||||
if (this._switchData) {
|
|
||||||
if (this._switchData.gestureActivated)
|
|
||||||
this._finishWorkspaceSwitch(this._switchData);
|
|
||||||
this._swipeTracker.enabled = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Main.overview.connect('hiding', () => {
|
|
||||||
this._swipeTracker.enabled = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
let swipeTracker = new SwipeTracker.SwipeTracker(global.stage,
|
|
||||||
Shell.ActionMode.NORMAL, { allowDrag: false, allowScroll: false });
|
|
||||||
swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this));
|
|
||||||
swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this));
|
|
||||||
swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this));
|
|
||||||
this._swipeTracker = swipeTracker;
|
|
||||||
}
|
|
||||||
|
|
||||||
_prepareWorkspaceSwitch(workspaceIndices) {
|
|
||||||
if (this._switchData)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const workspaceManager = global.workspace_manager;
|
|
||||||
const nWorkspaces = workspaceManager.get_n_workspaces();
|
|
||||||
|
|
||||||
const switchData = {};
|
|
||||||
|
|
||||||
this._switchData = switchData;
|
|
||||||
switchData.monitors = [];
|
|
||||||
|
|
||||||
switchData.gestureActivated = false;
|
|
||||||
switchData.inProgress = false;
|
|
||||||
|
|
||||||
if (!workspaceIndices)
|
|
||||||
workspaceIndices = [...Array(nWorkspaces).keys()];
|
|
||||||
|
|
||||||
const monitors = Meta.prefs_get_workspaces_only_on_primary()
|
|
||||||
? [Main.layoutManager.primaryMonitor] : Main.layoutManager.monitors;
|
|
||||||
|
|
||||||
for (const monitor of monitors) {
|
|
||||||
if (Meta.prefs_get_workspaces_only_on_primary() &&
|
|
||||||
monitor.index !== Main.layoutManager.primaryIndex)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const group = new MonitorGroup(monitor, workspaceIndices, this.movingWindow);
|
|
||||||
|
|
||||||
Main.uiGroup.insert_child_above(group, global.window_group);
|
|
||||||
|
|
||||||
switchData.monitors.push(group);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_finishWorkspaceSwitch(switchData) {
|
|
||||||
this._switchData = null;
|
|
||||||
|
|
||||||
switchData.monitors.forEach(m => m.destroy());
|
|
||||||
|
|
||||||
this.movingWindow = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
animateSwitch(from, to, direction, onComplete) {
|
|
||||||
this._swipeTracker.enabled = false;
|
|
||||||
|
|
||||||
let workspaceIndices = [];
|
|
||||||
|
|
||||||
switch (direction) {
|
|
||||||
case Meta.MotionDirection.UP:
|
|
||||||
case Meta.MotionDirection.LEFT:
|
|
||||||
case Meta.MotionDirection.UP_LEFT:
|
|
||||||
case Meta.MotionDirection.UP_RIGHT:
|
|
||||||
workspaceIndices = [to, from];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Meta.MotionDirection.DOWN:
|
|
||||||
case Meta.MotionDirection.RIGHT:
|
|
||||||
case Meta.MotionDirection.DOWN_LEFT:
|
|
||||||
case Meta.MotionDirection.DOWN_RIGHT:
|
|
||||||
workspaceIndices = [from, to];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL &&
|
|
||||||
direction !== Meta.MotionDirection.UP &&
|
|
||||||
direction !== Meta.MotionDirection.DOWN)
|
|
||||||
workspaceIndices.reverse();
|
|
||||||
|
|
||||||
this._prepareWorkspaceSwitch(workspaceIndices);
|
|
||||||
this._switchData.inProgress = true;
|
|
||||||
|
|
||||||
const fromWs = global.workspace_manager.get_workspace_by_index(from);
|
|
||||||
const toWs = global.workspace_manager.get_workspace_by_index(to);
|
|
||||||
|
|
||||||
for (const monitorGroup of this._switchData.monitors) {
|
|
||||||
monitorGroup.progress = monitorGroup.getWorkspaceProgress(fromWs);
|
|
||||||
const progress = monitorGroup.getWorkspaceProgress(toWs);
|
|
||||||
|
|
||||||
const params = {
|
|
||||||
duration: WINDOW_ANIMATION_TIME,
|
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (monitorGroup.index === Main.layoutManager.primaryIndex) {
|
|
||||||
params.onComplete = () => {
|
|
||||||
this._finishWorkspaceSwitch(this._switchData);
|
|
||||||
onComplete();
|
|
||||||
this._swipeTracker.enabled = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
monitorGroup.ease_property('progress', progress, params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_findMonitorGroup(monitorIndex) {
|
|
||||||
return this._switchData.monitors.find(m => m.index === monitorIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
_switchWorkspaceBegin(tracker, monitor) {
|
|
||||||
if (Meta.prefs_get_workspaces_only_on_primary() &&
|
|
||||||
monitor !== Main.layoutManager.primaryIndex)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const workspaceManager = global.workspace_manager;
|
|
||||||
const horiz = workspaceManager.layout_rows !== -1;
|
|
||||||
tracker.orientation = horiz
|
|
||||||
? Clutter.Orientation.HORIZONTAL
|
|
||||||
: Clutter.Orientation.VERTICAL;
|
|
||||||
|
|
||||||
if (this._switchData && this._switchData.gestureActivated) {
|
|
||||||
for (const group of this._switchData.monitors)
|
|
||||||
group.remove_all_transitions();
|
|
||||||
} else {
|
|
||||||
this._prepareWorkspaceSwitch();
|
|
||||||
}
|
|
||||||
|
|
||||||
const monitorGroup = this._findMonitorGroup(monitor);
|
|
||||||
const baseDistance = monitorGroup.baseDistance;
|
|
||||||
const progress = monitorGroup.progress;
|
|
||||||
|
|
||||||
const closestWs = monitorGroup.findClosestWorkspace(progress);
|
|
||||||
const cancelProgress = monitorGroup.getWorkspaceProgress(closestWs);
|
|
||||||
const points = monitorGroup.getSnapPoints();
|
|
||||||
|
|
||||||
this._switchData.baseMonitorGroup = monitorGroup;
|
|
||||||
|
|
||||||
tracker.confirmSwipe(baseDistance, points, progress, cancelProgress);
|
|
||||||
}
|
|
||||||
|
|
||||||
_switchWorkspaceUpdate(tracker, progress) {
|
|
||||||
if (!this._switchData)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (const monitorGroup of this._switchData.monitors)
|
|
||||||
monitorGroup.updateSwipeForMonitor(progress, this._switchData.baseMonitorGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
_switchWorkspaceEnd(tracker, duration, endProgress) {
|
|
||||||
if (!this._switchData)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const switchData = this._switchData;
|
|
||||||
switchData.gestureActivated = true;
|
|
||||||
|
|
||||||
const newWs = switchData.baseMonitorGroup.findClosestWorkspace(endProgress);
|
|
||||||
|
|
||||||
for (const monitorGroup of this._switchData.monitors) {
|
|
||||||
const progress = monitorGroup.getWorkspaceProgress(newWs);
|
|
||||||
|
|
||||||
const params = {
|
|
||||||
duration,
|
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (monitorGroup.index === Main.layoutManager.primaryIndex) {
|
|
||||||
params.onComplete = () => {
|
|
||||||
if (!newWs.active)
|
|
||||||
newWs.activate(global.get_current_time());
|
|
||||||
this._finishWorkspaceSwitch(switchData);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
monitorGroup.ease_property('progress', progress, params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get gestureActive() {
|
|
||||||
return this._switchData !== null && this._switchData.gestureActivated;
|
|
||||||
}
|
|
||||||
|
|
||||||
cancelSwitchAnimation() {
|
|
||||||
if (!this._switchData)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this._switchData.gestureActivated)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._finishWorkspaceSwitch(this._switchData);
|
|
||||||
}
|
|
||||||
|
|
||||||
set movingWindow(movingWindow) {
|
|
||||||
this._movingWindow = movingWindow;
|
|
||||||
}
|
|
||||||
|
|
||||||
get movingWindow() {
|
|
||||||
return this._movingWindow;
|
|
||||||
}
|
|
||||||
};
|
|
@@ -11,10 +11,7 @@ var DISPLAY_TIMEOUT = 600;
|
|||||||
var WorkspaceSwitcherPopupList = GObject.registerClass(
|
var WorkspaceSwitcherPopupList = GObject.registerClass(
|
||||||
class WorkspaceSwitcherPopupList extends St.Widget {
|
class WorkspaceSwitcherPopupList extends St.Widget {
|
||||||
_init() {
|
_init() {
|
||||||
super._init({
|
super._init({ style_class: 'workspace-switcher' });
|
||||||
style_class: 'workspace-switcher',
|
|
||||||
offscreen_redirect: Clutter.OffscreenRedirect.ALWAYS,
|
|
||||||
});
|
|
||||||
|
|
||||||
this._itemSpacing = 0;
|
this._itemSpacing = 0;
|
||||||
this._childHeight = 0;
|
this._childHeight = 0;
|
||||||
|
@@ -549,7 +549,9 @@ var WorkspaceThumbnail = GObject.registerClass({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// a click on the already current workspace should go back to the main view
|
// a click on the already current workspace should go back to the main view
|
||||||
if (this.metaWorkspace.active)
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||||
|
if (this.metaWorkspace == activeWorkspace)
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
else
|
else
|
||||||
this.metaWorkspace.activate(time);
|
this.metaWorkspace.activate(time);
|
||||||
|
@@ -7,7 +7,6 @@ const Main = imports.ui.main;
|
|||||||
const SwipeTracker = imports.ui.swipeTracker;
|
const SwipeTracker = imports.ui.swipeTracker;
|
||||||
const Workspace = imports.ui.workspace;
|
const Workspace = imports.ui.workspace;
|
||||||
|
|
||||||
var { ANIMATION_TIME } = imports.ui.overview;
|
|
||||||
var WORKSPACE_SWITCH_TIME = 250;
|
var WORKSPACE_SWITCH_TIME = 250;
|
||||||
var SCROLL_TIMEOUT_TIME = 150;
|
var SCROLL_TIMEOUT_TIME = 150;
|
||||||
|
|
||||||
@@ -22,18 +21,18 @@ var WorkspacesViewBase = GObject.registerClass({
|
|||||||
GTypeFlags: GObject.TypeFlags.ABSTRACT,
|
GTypeFlags: GObject.TypeFlags.ABSTRACT,
|
||||||
}, class WorkspacesViewBase extends St.Widget {
|
}, class WorkspacesViewBase extends St.Widget {
|
||||||
_init(monitorIndex) {
|
_init(monitorIndex) {
|
||||||
const { x, y, width, height } =
|
super._init({ style_class: 'workspaces-view', reactive: true });
|
||||||
Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
|
|
||||||
|
|
||||||
super._init({
|
|
||||||
style_class: 'workspaces-view',
|
|
||||||
x, y, width, height,
|
|
||||||
});
|
|
||||||
this.connect('destroy', this._onDestroy.bind(this));
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
global.focus_manager.add_group(this);
|
global.focus_manager.add_group(this);
|
||||||
|
|
||||||
|
// The actor itself isn't a drop target, so we don't want to pick on its area
|
||||||
|
this.set_size(0, 0);
|
||||||
|
|
||||||
this._monitorIndex = monitorIndex;
|
this._monitorIndex = monitorIndex;
|
||||||
|
|
||||||
|
this._fullGeometry = null;
|
||||||
|
this._actualGeometry = null;
|
||||||
|
|
||||||
this._inDrag = false;
|
this._inDrag = false;
|
||||||
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
|
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
|
||||||
this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
|
this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
|
||||||
@@ -52,19 +51,24 @@ var WorkspacesViewBase = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_dragBegin() {
|
_dragBegin(overview, window) {
|
||||||
this._inDrag = true;
|
this._inDrag = true;
|
||||||
|
this._setReservedSlot(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
_dragEnd() {
|
_dragEnd() {
|
||||||
this._inDrag = false;
|
this._inDrag = false;
|
||||||
|
this._setReservedSlot(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_allocate(box) {
|
setFullGeometry(geom) {
|
||||||
this.set_allocation(box);
|
this._fullGeometry = geom;
|
||||||
|
this._syncFullGeometry();
|
||||||
|
}
|
||||||
|
|
||||||
for (const child of this)
|
setActualGeometry(geom) {
|
||||||
child.allocate_available_size(0, 0, box.get_width(), box.get_height());
|
this._actualGeometry = geom;
|
||||||
|
this._syncActualGeometry();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -79,8 +83,9 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
this._gestureActive = false; // touch(pad) gestures
|
this._gestureActive = false; // touch(pad) gestures
|
||||||
|
|
||||||
this._scrollAdjustment = scrollAdjustment;
|
this._scrollAdjustment = scrollAdjustment;
|
||||||
this._onScrollId = this._scrollAdjustment.connect('notify::value',
|
this._onScrollId =
|
||||||
this._updateScrollPosition.bind(this));
|
this._scrollAdjustment.connect('notify::value',
|
||||||
|
this._onScroll.bind(this));
|
||||||
|
|
||||||
this._workspaces = [];
|
this._workspaces = [];
|
||||||
this._updateWorkspaces();
|
this._updateWorkspaces();
|
||||||
@@ -92,42 +97,34 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
this._workspaces.sort((a, b) => {
|
this._workspaces.sort((a, b) => {
|
||||||
return a.metaWorkspace.index() - b.metaWorkspace.index();
|
return a.metaWorkspace.index() - b.metaWorkspace.index();
|
||||||
});
|
});
|
||||||
this._workspaces.forEach(
|
this._updateWorkspaceActors(false);
|
||||||
(ws, i) => this.set_child_at_index(ws, i));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this._overviewShownId = Main.overview.connect('shown', () => {
|
|
||||||
this.clip_to_allocation = true;
|
this._overviewShownId =
|
||||||
});
|
Main.overview.connect('shown', () => {
|
||||||
|
this.set_clip(this._fullGeometry.x, this._fullGeometry.y,
|
||||||
|
this._fullGeometry.width, this._fullGeometry.height);
|
||||||
|
});
|
||||||
|
|
||||||
this._switchWorkspaceNotifyId =
|
this._switchWorkspaceNotifyId =
|
||||||
global.window_manager.connect('switch-workspace',
|
global.window_manager.connect('switch-workspace',
|
||||||
this._activeWorkspaceChanged.bind(this));
|
this._activeWorkspaceChanged.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_allocate(box) {
|
_setReservedSlot(window) {
|
||||||
this.set_allocation(box);
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
|
this._workspaces[i].setReservedSlot(window);
|
||||||
|
}
|
||||||
|
|
||||||
if (this.get_n_children() === 0)
|
_syncFullGeometry() {
|
||||||
return;
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
|
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
||||||
|
}
|
||||||
|
|
||||||
const { workspaceManager } = global;
|
_syncActualGeometry() {
|
||||||
const { nWorkspaces } = workspaceManager;
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
|
this._workspaces[i].setActualGeometry(this._actualGeometry);
|
||||||
const vertical = workspaceManager.layout_rows === -1;
|
|
||||||
const rtl = this.text_direction === Clutter.TextDirection.RTL;
|
|
||||||
|
|
||||||
this._workspaces.forEach((child, index) => {
|
|
||||||
if (rtl && !vertical)
|
|
||||||
index = nWorkspaces - index - 1;
|
|
||||||
|
|
||||||
const x = vertical ? 0 : index * this.width;
|
|
||||||
const y = vertical ? index * this.height : 0;
|
|
||||||
|
|
||||||
child.allocate_available_size(x, y, box.get_width(), box.get_height());
|
|
||||||
});
|
|
||||||
|
|
||||||
this._updateScrollPosition();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getActiveWorkspace() {
|
getActiveWorkspace() {
|
||||||
@@ -143,11 +140,11 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
else
|
else
|
||||||
this._workspaces[w].fadeToOverview();
|
this._workspaces[w].fadeToOverview();
|
||||||
}
|
}
|
||||||
this._updateScrollPosition();
|
this._updateWorkspaceActors(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
animateFromOverview(animationType) {
|
animateFromOverview(animationType) {
|
||||||
this.clip_to_allocation = false;
|
this.remove_clip();
|
||||||
|
|
||||||
for (let w = 0; w < this._workspaces.length; w++) {
|
for (let w = 0; w < this._workspaces.length; w++) {
|
||||||
if (animationType == AnimationType.ZOOM)
|
if (animationType == AnimationType.ZOOM)
|
||||||
@@ -162,22 +159,49 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
this._workspaces[i].syncStacking(stackIndices);
|
this._workspaces[i].syncStacking(stackIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
_scrollToActive() {
|
// Update workspace actors parameters
|
||||||
const { workspaceManager } = global;
|
// @showAnimation: iff %true, transition between states
|
||||||
const active = workspaceManager.get_active_workspace_index();
|
_updateWorkspaceActors(showAnimation) {
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let active = workspaceManager.get_active_workspace_index();
|
||||||
|
|
||||||
this._animating = true;
|
this._animating = showAnimation;
|
||||||
this._updateVisibility();
|
|
||||||
|
|
||||||
this._scrollAdjustment.remove_transition('value');
|
for (let w = 0; w < this._workspaces.length; w++) {
|
||||||
this._scrollAdjustment.ease(active, {
|
let workspace = this._workspaces[w];
|
||||||
duration: WORKSPACE_SWITCH_TIME,
|
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
workspace.remove_all_transitions();
|
||||||
onComplete: () => {
|
|
||||||
this._animating = false;
|
let params = {};
|
||||||
this._updateVisibility();
|
if (workspaceManager.layout_rows == -1)
|
||||||
},
|
params.y = (w - active) * this._fullGeometry.height;
|
||||||
});
|
else if (this.text_direction == Clutter.TextDirection.RTL)
|
||||||
|
params.x = (active - w) * this._fullGeometry.width;
|
||||||
|
else
|
||||||
|
params.x = (w - active) * this._fullGeometry.width;
|
||||||
|
|
||||||
|
if (showAnimation) {
|
||||||
|
let easeParams = Object.assign(params, {
|
||||||
|
duration: WORKSPACE_SWITCH_TIME,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
|
});
|
||||||
|
// we have to call _updateVisibility() once before the
|
||||||
|
// animation and once afterwards - it does not really
|
||||||
|
// matter which tween we use, so we pick the first one ...
|
||||||
|
if (w == 0) {
|
||||||
|
this._updateVisibility();
|
||||||
|
easeParams.onComplete = () => {
|
||||||
|
this._animating = false;
|
||||||
|
this._updateVisibility();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
workspace.ease(easeParams);
|
||||||
|
} else {
|
||||||
|
workspace.set(params);
|
||||||
|
if (w == 0)
|
||||||
|
this._updateVisibility();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateVisibility() {
|
_updateVisibility() {
|
||||||
@@ -218,14 +242,19 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._updateScrollPosition();
|
if (this._fullGeometry) {
|
||||||
|
this._updateWorkspaceActors(false);
|
||||||
|
this._syncFullGeometry();
|
||||||
|
}
|
||||||
|
if (this._actualGeometry)
|
||||||
|
this._syncActualGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
|
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
|
||||||
if (this._scrolling)
|
if (this._scrolling)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._scrollToActive();
|
this._updateWorkspaceActors(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
@@ -241,33 +270,27 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
|
|
||||||
startTouchGesture() {
|
startTouchGesture() {
|
||||||
this._gestureActive = true;
|
this._gestureActive = true;
|
||||||
|
|
||||||
this._updateVisibility();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
endTouchGesture() {
|
endTouchGesture() {
|
||||||
this._gestureActive = false;
|
this._gestureActive = false;
|
||||||
|
|
||||||
// Make sure title captions etc are shown as necessary
|
// Make sure title captions etc are shown as necessary
|
||||||
this._scrollToActive();
|
this._updateWorkspaceActors(true);
|
||||||
this._updateVisibility();
|
this._updateVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
// sync the workspaces' positions to the value of the scroll adjustment
|
// sync the workspaces' positions to the value of the scroll adjustment
|
||||||
// and change the active workspace if appropriate
|
// and change the active workspace if appropriate
|
||||||
_updateScrollPosition() {
|
_onScroll(adj) {
|
||||||
if (!this.has_allocation())
|
if (adj.get_transition('value') !== null && !this._gestureActive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const adj = this._scrollAdjustment;
|
|
||||||
const allowSwitch =
|
|
||||||
adj.get_transition('value') === null && !this._gestureActive;
|
|
||||||
|
|
||||||
let workspaceManager = global.workspace_manager;
|
let workspaceManager = global.workspace_manager;
|
||||||
let active = workspaceManager.get_active_workspace_index();
|
let active = workspaceManager.get_active_workspace_index();
|
||||||
let current = Math.round(adj.value);
|
let current = Math.round(adj.value);
|
||||||
|
|
||||||
if (allowSwitch && active !== current) {
|
if (active != current && !this._gestureActive) {
|
||||||
if (!this._workspaces[current]) {
|
if (!this._workspaces[current]) {
|
||||||
// The current workspace was destroyed. This could happen
|
// The current workspace was destroyed. This could happen
|
||||||
// when you are on the last empty workspace, and consolidate
|
// when you are on the last empty workspace, and consolidate
|
||||||
@@ -284,16 +307,36 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
if (adj.upper == 1)
|
if (adj.upper == 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const vertical = workspaceManager.layout_rows === -1;
|
let last = this._workspaces.length - 1;
|
||||||
const rtl = this.text_direction === Clutter.TextDirection.RTL;
|
|
||||||
const progress = vertical || !rtl
|
|
||||||
? adj.value : adj.upper - adj.value;
|
|
||||||
|
|
||||||
for (const ws of this._workspaces) {
|
if (workspaceManager.layout_rows == -1) {
|
||||||
if (vertical)
|
let firstWorkspaceY = this._workspaces[0].y;
|
||||||
ws.translation_y = -progress * this.height;
|
let lastWorkspaceY = this._workspaces[last].y;
|
||||||
else
|
let workspacesHeight = lastWorkspaceY - firstWorkspaceY;
|
||||||
ws.translation_x = -progress * this.width;
|
|
||||||
|
let currentY = firstWorkspaceY;
|
||||||
|
let newY = -Math.round(adj.value / (adj.upper - 1) * workspacesHeight);
|
||||||
|
|
||||||
|
let dy = newY - currentY;
|
||||||
|
|
||||||
|
for (let i = 0; i < this._workspaces.length; i++) {
|
||||||
|
this._workspaces[i].visible = Math.abs(i - adj.value) <= 1;
|
||||||
|
this._workspaces[i].y += dy;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let firstWorkspaceX = this._workspaces[0].x;
|
||||||
|
let lastWorkspaceX = this._workspaces[last].x;
|
||||||
|
let workspacesWidth = lastWorkspaceX - firstWorkspaceX;
|
||||||
|
|
||||||
|
let currentX = firstWorkspaceX;
|
||||||
|
let newX = -Math.round(adj.value / (adj.upper - 1) * workspacesWidth);
|
||||||
|
|
||||||
|
let dx = newX - currentX;
|
||||||
|
|
||||||
|
for (let i = 0; i < this._workspaces.length; i++) {
|
||||||
|
this._workspaces[i].visible = Math.abs(i - adj.value) <= 1;
|
||||||
|
this._workspaces[i].x += dx;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -306,6 +349,18 @@ class ExtraWorkspaceView extends WorkspacesViewBase {
|
|||||||
this.add_actor(this._workspace);
|
this.add_actor(this._workspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_setReservedSlot(window) {
|
||||||
|
this._workspace.setReservedSlot(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
_syncFullGeometry() {
|
||||||
|
this._workspace.setFullGeometry(this._fullGeometry);
|
||||||
|
}
|
||||||
|
|
||||||
|
_syncActualGeometry() {
|
||||||
|
this._workspace.setActualGeometry(this._actualGeometry);
|
||||||
|
}
|
||||||
|
|
||||||
getActiveWorkspace() {
|
getActiveWorkspace() {
|
||||||
return this._workspace;
|
return this._workspace;
|
||||||
}
|
}
|
||||||
@@ -383,10 +438,6 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
this._windowDragEndId =
|
this._windowDragEndId =
|
||||||
Main.overview.connect('window-drag-begin',
|
Main.overview.connect('window-drag-begin',
|
||||||
this._windowDragEnd.bind(this));
|
this._windowDragEnd.bind(this));
|
||||||
this._overviewShownId = Main.overview.connect('shown', () => {
|
|
||||||
this._inWindowFade = false;
|
|
||||||
this._syncWorkspacesActualGeometry();
|
|
||||||
});
|
|
||||||
|
|
||||||
this._primaryIndex = Main.layoutManager.primaryIndex;
|
this._primaryIndex = Main.layoutManager.primaryIndex;
|
||||||
this._workspacesViews = [];
|
this._workspacesViews = [];
|
||||||
@@ -401,11 +452,10 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
this._scrollEventId = 0;
|
this._scrollEventId = 0;
|
||||||
this._keyPressEventId = 0;
|
this._keyPressEventId = 0;
|
||||||
this._scrollTimeoutId = 0;
|
this._scrollTimeoutId = 0;
|
||||||
this._syncActualGeometryLater = 0;
|
|
||||||
|
|
||||||
this._actualGeometry = null;
|
this._actualGeometry = null;
|
||||||
|
this._fullGeometry = null;
|
||||||
this._inWindowDrag = false;
|
this._inWindowDrag = false;
|
||||||
this._inWindowFade = 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
|
||||||
@@ -426,11 +476,6 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
this._parentSetLater = 0;
|
this._parentSetLater = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._syncActualGeometryLater) {
|
|
||||||
Meta.later_remove(this._syncActualGeometryLater);
|
|
||||||
this._syncActualGeometryLater = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._scrollTimeoutId !== 0) {
|
if (this._scrollTimeoutId !== 0) {
|
||||||
GLib.source_remove(this._scrollTimeoutId);
|
GLib.source_remove(this._scrollTimeoutId);
|
||||||
this._scrollTimeoutId = 0;
|
this._scrollTimeoutId = 0;
|
||||||
@@ -440,7 +485,6 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
global.workspace_manager.disconnect(this._reorderWorkspacesdId);
|
global.workspace_manager.disconnect(this._reorderWorkspacesdId);
|
||||||
Main.overview.disconnect(this._windowDragBeginId);
|
Main.overview.disconnect(this._windowDragBeginId);
|
||||||
Main.overview.disconnect(this._windowDragEndId);
|
Main.overview.disconnect(this._windowDragEndId);
|
||||||
Main.overview.disconnect(this._overviewShownId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_windowDragBegin() {
|
_windowDragBegin() {
|
||||||
@@ -464,11 +508,25 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
workspaceManager.get_active_workspace_index();
|
workspaceManager.get_active_workspace_index();
|
||||||
}
|
}
|
||||||
|
|
||||||
_activeWorkspaceChanged(_wm, _from, to, _direction) {
|
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
|
||||||
if (this._gestureActive)
|
if (this._gestureActive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._scrollAdjustment.ease(to, {
|
this._scrollToActive();
|
||||||
|
}
|
||||||
|
|
||||||
|
_scrollToActive() {
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let active = workspaceManager.get_active_workspace_index();
|
||||||
|
|
||||||
|
this._updateScrollAdjustment(active);
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateScrollAdjustment(index) {
|
||||||
|
if (this._gestureActive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._scrollAdjustment.ease(index, {
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
duration: WORKSPACE_SWITCH_TIME,
|
duration: WORKSPACE_SWITCH_TIME,
|
||||||
});
|
});
|
||||||
@@ -506,8 +564,11 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||||
this._workspacesViews[i].startTouchGesture();
|
this._workspacesViews[i].startTouchGesture();
|
||||||
|
|
||||||
|
let monitors = Main.layoutManager.monitors;
|
||||||
|
let geometry = monitor === this._primaryIndex
|
||||||
|
? this._fullGeometry : monitors[monitor];
|
||||||
let distance = global.workspace_manager.layout_rows === -1
|
let distance = global.workspace_manager.layout_rows === -1
|
||||||
? this.height : this.width;
|
? geometry.height : geometry.width;
|
||||||
|
|
||||||
let progress = adjustment.value / adjustment.page_size;
|
let progress = adjustment.value / adjustment.page_size;
|
||||||
let points = Array.from(
|
let points = Array.from(
|
||||||
@@ -527,13 +588,14 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
this._clickAction.release();
|
this._clickAction.release();
|
||||||
|
|
||||||
let workspaceManager = global.workspace_manager;
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||||
let newWs = workspaceManager.get_workspace_by_index(endProgress);
|
let newWs = workspaceManager.get_workspace_by_index(endProgress);
|
||||||
|
|
||||||
this._scrollAdjustment.ease(endProgress, {
|
this._scrollAdjustment.ease(endProgress, {
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
duration,
|
duration,
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
if (!newWs.active)
|
if (newWs !== activeWorkspace)
|
||||||
newWs.activate(global.get_current_time());
|
newWs.activate(global.get_current_time());
|
||||||
this._endTouchGesture();
|
this._endTouchGesture();
|
||||||
},
|
},
|
||||||
@@ -554,20 +616,17 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
this.show();
|
this.show();
|
||||||
this._updateWorkspacesViews();
|
this._updateWorkspacesViews();
|
||||||
|
|
||||||
for (let i = 0; i < this._workspacesViews.length; i++) {
|
if (this._actualGeometry && this._fullGeometry) {
|
||||||
let animationType;
|
for (let i = 0; i < this._workspacesViews.length; i++) {
|
||||||
if (fadeOnPrimary && i == this._primaryIndex)
|
let animationType;
|
||||||
animationType = AnimationType.FADE;
|
if (fadeOnPrimary && i == this._primaryIndex)
|
||||||
else
|
animationType = AnimationType.FADE;
|
||||||
animationType = AnimationType.ZOOM;
|
else
|
||||||
this._workspacesViews[i].animateToOverview(animationType);
|
animationType = AnimationType.ZOOM;
|
||||||
|
this._workspacesViews[i].animateToOverview(animationType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._inWindowFade = fadeOnPrimary;
|
|
||||||
|
|
||||||
if (this._actualGeometry && !fadeOnPrimary)
|
|
||||||
this._syncWorkspacesActualGeometry();
|
|
||||||
|
|
||||||
this._restackedNotifyId =
|
this._restackedNotifyId =
|
||||||
Main.overview.connect('windows-restacked',
|
Main.overview.connect('windows-restacked',
|
||||||
this._onRestacked.bind(this));
|
this._onRestacked.bind(this));
|
||||||
@@ -587,17 +646,6 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
animationType = AnimationType.ZOOM;
|
animationType = AnimationType.ZOOM;
|
||||||
this._workspacesViews[i].animateFromOverview(animationType);
|
this._workspacesViews[i].animateFromOverview(animationType);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._inWindowFade = fadeOnPrimary;
|
|
||||||
|
|
||||||
const { primaryIndex } = Main.layoutManager;
|
|
||||||
const { x, y, width, height } =
|
|
||||||
Main.layoutManager.getWorkAreaForMonitor(primaryIndex);
|
|
||||||
this._getPrimaryView().ease({
|
|
||||||
x, y, width, height,
|
|
||||||
duration: fadeOnPrimary ? 0 : ANIMATION_TIME,
|
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_hide() {
|
vfunc_hide() {
|
||||||
@@ -627,7 +675,6 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._updateWorkspacesViews();
|
this._updateWorkspacesViews();
|
||||||
this._syncWorkspacesActualGeometry();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateWorkspacesViews() {
|
_updateWorkspacesViews() {
|
||||||
@@ -644,9 +691,19 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
else
|
else
|
||||||
view = new WorkspacesView(i, this._scrollAdjustment);
|
view = new WorkspacesView(i, this._scrollAdjustment);
|
||||||
|
|
||||||
|
// HACK: Avoid spurious allocation changes while updating views
|
||||||
|
view.hide();
|
||||||
|
|
||||||
this._workspacesViews.push(view);
|
this._workspacesViews.push(view);
|
||||||
Main.layoutManager.overviewGroup.add_actor(view);
|
Main.layoutManager.overviewGroup.add_actor(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._workspacesViews.forEach(v => v.show());
|
||||||
|
|
||||||
|
if (this._fullGeometry)
|
||||||
|
this._syncWorkspacesFullGeometry();
|
||||||
|
if (this._actualGeometry)
|
||||||
|
this._syncWorkspacesActualGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
_getMonitorIndexForEvent(event) {
|
_getMonitorIndexForEvent(event) {
|
||||||
@@ -693,35 +750,43 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This geometry should always be the fullest geometry
|
||||||
|
// the workspaces switcher can ever be allocated, as if
|
||||||
|
// the sliding controls were never slid in at all.
|
||||||
|
setWorkspacesFullGeometry(geom) {
|
||||||
|
this._fullGeometry = geom;
|
||||||
|
this._syncWorkspacesFullGeometry();
|
||||||
|
}
|
||||||
|
|
||||||
|
_syncWorkspacesFullGeometry() {
|
||||||
|
if (!this._workspacesViews.length)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let monitors = Main.layoutManager.monitors;
|
||||||
|
for (let i = 0; i < monitors.length; i++) {
|
||||||
|
let geometry = i == this._primaryIndex ? this._fullGeometry : monitors[i];
|
||||||
|
this._workspacesViews[i].setFullGeometry(geometry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_updateWorkspacesActualGeometry() {
|
_updateWorkspacesActualGeometry() {
|
||||||
const [x, y] = this.get_transformed_position();
|
const [x, y] = this.get_transformed_position();
|
||||||
const width = this.allocation.get_width();
|
const width = this.allocation.get_width();
|
||||||
const height = this.allocation.get_height();
|
const height = this.allocation.get_height();
|
||||||
|
|
||||||
this._actualGeometry = { x, y, width, height };
|
this._actualGeometry = { x, y, width, height };
|
||||||
|
this._syncWorkspacesActualGeometry();
|
||||||
if (this._syncActualGeometryLater > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._syncActualGeometryLater =
|
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
|
||||||
this._syncWorkspacesActualGeometry();
|
|
||||||
|
|
||||||
this._syncActualGeometryLater = 0;
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_syncWorkspacesActualGeometry() {
|
_syncWorkspacesActualGeometry() {
|
||||||
const primaryView = this._getPrimaryView();
|
if (!this._workspacesViews.length)
|
||||||
if (!primaryView || this._inWindowFade)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
primaryView.ease({
|
let monitors = Main.layoutManager.monitors;
|
||||||
...this._actualGeometry,
|
for (let i = 0; i < monitors.length; i++) {
|
||||||
duration: Main.overview.animationInProgress ? ANIMATION_TIME : 0,
|
let geometry = i === this._primaryIndex ? this._actualGeometry : monitors[i];
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
this._workspacesViews[i].setActualGeometry(geometry);
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_onRestacked(overview, stackIndices) {
|
_onRestacked(overview, stackIndices) {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
project('gnome-shell', 'c',
|
project('gnome-shell', 'c',
|
||||||
version: '3.37.3',
|
version: '3.37.2',
|
||||||
meson_version: '>= 0.53.0',
|
meson_version: '>= 0.53.0',
|
||||||
license: 'GPLv2+'
|
license: 'GPLv2+'
|
||||||
)
|
)
|
||||||
@@ -25,7 +25,7 @@ gio_req = '>= 2.56.0'
|
|||||||
gi_req = '>= 1.49.1'
|
gi_req = '>= 1.49.1'
|
||||||
gjs_req = '>= 1.65.1'
|
gjs_req = '>= 1.65.1'
|
||||||
gtk_req = '>= 3.15.0'
|
gtk_req = '>= 3.15.0'
|
||||||
mutter_req = '>= 3.37.3'
|
mutter_req = '>= 3.37.2'
|
||||||
polkit_req = '>= 0.100'
|
polkit_req = '>= 0.100'
|
||||||
schemas_req = '>= 3.33.1'
|
schemas_req = '>= 3.33.1'
|
||||||
startup_req = '>= 0.11'
|
startup_req = '>= 0.11'
|
||||||
|
1
mutter
Submodule
1
mutter
Submodule
Submodule mutter added at 1551b6d386
313
po/kk.po
313
po/kk.po
@@ -1,14 +1,14 @@
|
|||||||
# Kazakh translation for gnome-shell.
|
# Kazakh translation for gnome-shell.
|
||||||
# Copyright (C) 2015 The gnome-shell authors.
|
# Copyright (C) 2015 The gnome-shell authors.
|
||||||
# This file is distributed under the same license as the gnome-shell package.
|
# This file is distributed under the same license as the gnome-shell package.
|
||||||
# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2012-2020.
|
# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2012-2019.
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: master\n"
|
"Project-Id-Version: 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-06-25 04:35+0000\n"
|
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
|
||||||
"PO-Revision-Date: 2020-06-27 23:27+0500\n"
|
"PO-Revision-Date: 2020-06-15 18:37+0500\n"
|
||||||
"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
|
"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
|
||||||
"Language-Team: Kazakh <kk_KZ@googlegroups.com>\n"
|
"Language-Team: Kazakh <kk_KZ@googlegroups.com>\n"
|
||||||
"Language: kk\n"
|
"Language: kk\n"
|
||||||
@@ -81,10 +81,16 @@ msgstr ""
|
|||||||
"DisableExtension DBus тәсілдерімен де өзгертуге болады."
|
"DisableExtension DBus тәсілдерімен де өзгертуге болады."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:26
|
#: data/org.gnome.shell.gschema.xml.in:26
|
||||||
|
#| msgid "UUIDs of extensions to enable"
|
||||||
msgid "UUIDs of extensions to force disabling"
|
msgid "UUIDs of extensions to force disabling"
|
||||||
msgstr "Мәжбүрлі сөндіру үшін кеңейтулер UUID-лары"
|
msgstr ""
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:27
|
#: data/org.gnome.shell.gschema.xml.in:27
|
||||||
|
#| msgid ""
|
||||||
|
#| "GNOME Shell extensions have a UUID property; this key lists extensions "
|
||||||
|
#| "which should be loaded. Any extension that wants to be loaded needs to be "
|
||||||
|
#| "in this list. You can also manipulate this list with the EnableExtension "
|
||||||
|
#| "and DisableExtension D-Bus methods on org.gnome.Shell."
|
||||||
msgid ""
|
msgid ""
|
||||||
"GNOME Shell extensions have a UUID property; this key lists extensions which "
|
"GNOME Shell extensions have a UUID property; this key lists extensions which "
|
||||||
"should be disabled, even if loaded as part of the current mode. You can also "
|
"should be disabled, even if loaded as part of the current mode. You can also "
|
||||||
@@ -92,11 +98,6 @@ msgid ""
|
|||||||
"methods on org.gnome.Shell. This key takes precedence over the “enabled-"
|
"methods on org.gnome.Shell. This key takes precedence over the “enabled-"
|
||||||
"extensions” setting."
|
"extensions” setting."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"GNOME Shell кеңейтулерінде UUID қасиеті бар; бұл кілт сөндіру үшін "
|
|
||||||
"кеңейтулер тізімін сақтайды, олар қазіргі режимде іске қосылған болса да. "
|
|
||||||
"Сонымен қатар, бұл тізімді org.gnome.Shell EnableExtension және "
|
|
||||||
"DisableExtension D-Bus тәсілдері арқылы түзетуге болады. Бұл кілт \"enabled-"
|
|
||||||
"extensions\" баптауын үстінен басады."
|
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:37
|
#: data/org.gnome.shell.gschema.xml.in:37
|
||||||
msgid "Disable user extensions"
|
msgid "Disable user extensions"
|
||||||
@@ -332,19 +333,19 @@ msgstr ""
|
|||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:234
|
#: data/org.gnome.shell.gschema.xml.in:234
|
||||||
msgid "Locations"
|
msgid "Locations"
|
||||||
msgstr "Орналасулар"
|
msgstr "Орналасу"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:235
|
#: data/org.gnome.shell.gschema.xml.in:235
|
||||||
msgid "The locations to show in world clocks"
|
msgid "The locations to show in world clocks"
|
||||||
msgstr "Дүниежүзілік сағаттарда көрсетілетін орналасулар"
|
msgstr ""
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:245
|
#: data/org.gnome.shell.gschema.xml.in:245
|
||||||
msgid "Automatic location"
|
msgid "Automatic location"
|
||||||
msgstr "Автоматты орналасу"
|
msgstr ""
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:246
|
#: data/org.gnome.shell.gschema.xml.in:246
|
||||||
msgid "Whether to fetch the current location or not"
|
msgid "Whether to fetch the current location or not"
|
||||||
msgstr "Ағымдағы орналасуды алу керек пе, жоқ па"
|
msgstr ""
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:253
|
#: data/org.gnome.shell.gschema.xml.in:253
|
||||||
msgid "Location"
|
msgid "Location"
|
||||||
@@ -352,7 +353,7 @@ msgstr "Орналасу"
|
|||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:254
|
#: data/org.gnome.shell.gschema.xml.in:254
|
||||||
msgid "The location for which to show a forecast"
|
msgid "The location for which to show a forecast"
|
||||||
msgstr "Ауа райы болжамын көрсету үшін орналасу"
|
msgstr ""
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:266
|
#: data/org.gnome.shell.gschema.xml.in:266
|
||||||
msgid "Attach modal dialog to the parent window"
|
msgid "Attach modal dialog to the parent window"
|
||||||
@@ -531,20 +532,23 @@ msgstr "пайдаланушыны ауыстыру"
|
|||||||
|
|
||||||
#. 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:135
|
#: js/misc/systemActions.js:135
|
||||||
|
#| msgid "lock orientation;screen;rotation"
|
||||||
msgid "lock orientation;unlock orientation;screen;rotation"
|
msgid "lock orientation;unlock orientation;screen;rotation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"lock orientation;unlock orientation;screen;rotation;бұрылуды құлыптау;экран "
|
|
||||||
"бұрылуы"
|
|
||||||
|
|
||||||
#: js/misc/systemActions.js:255
|
#: js/misc/systemActions.js:255
|
||||||
|
#| msgctxt "search-result"
|
||||||
|
#| msgid "Lock Orientation"
|
||||||
msgctxt "search-result"
|
msgctxt "search-result"
|
||||||
msgid "Unlock Screen Rotation"
|
msgid "Unlock Screen Rotation"
|
||||||
msgstr "Экранды бұруды құлыптан босату"
|
msgstr ""
|
||||||
|
|
||||||
#: js/misc/systemActions.js:256
|
#: js/misc/systemActions.js:256
|
||||||
|
#| msgctxt "search-result"
|
||||||
|
#| msgid "Lock Orientation"
|
||||||
msgctxt "search-result"
|
msgctxt "search-result"
|
||||||
msgid "Lock Screen Rotation"
|
msgid "Lock Screen Rotation"
|
||||||
msgstr "Экранды бұруды құлыптау"
|
msgstr ""
|
||||||
|
|
||||||
#: js/misc/util.js:120
|
#: js/misc/util.js:120
|
||||||
msgid "Command not found"
|
msgid "Command not found"
|
||||||
@@ -701,36 +705,38 @@ msgstr "Тыйым салу"
|
|||||||
msgid "Grant Access"
|
msgid "Grant Access"
|
||||||
msgstr "Рұқсат ету"
|
msgstr "Рұқсат ету"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:903
|
#: js/ui/appDisplay.js:956
|
||||||
msgid "Unnamed Folder"
|
msgid "Unnamed Folder"
|
||||||
msgstr "Атаусыз бума"
|
msgstr "Атаусыз бума"
|
||||||
|
|
||||||
#. 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:2225 js/ui/panel.js:75
|
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
|
||||||
msgid "Open Windows"
|
msgid "Open Windows"
|
||||||
msgstr "Ашық терезелер"
|
msgstr "Ашық терезелер"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2244 js/ui/panel.js:82
|
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Жаңа терезе"
|
msgstr "Жаңа терезе"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2260
|
#: js/ui/appDisplay.js:2250
|
||||||
|
#| msgid "Launch using Dedicated Graphics Card"
|
||||||
msgid "Launch using Integrated Graphics Card"
|
msgid "Launch using Integrated Graphics Card"
|
||||||
msgstr "Құрамындағы графикалық картаны пайдаланып жөнелту"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2261
|
#: js/ui/appDisplay.js:2251
|
||||||
|
#| msgid "Launch using Dedicated Graphics Card"
|
||||||
msgid "Launch using Discrete Graphics Card"
|
msgid "Launch using Discrete Graphics Card"
|
||||||
msgstr "Бөлек графикалық картаны пайдаланып жөнелту"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2289 js/ui/dash.js:239
|
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Таңдамалылардан өшіру"
|
msgstr "Таңдамалылардан өшіру"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2295
|
#: js/ui/appDisplay.js:2285
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Таңдамалыларға қосу"
|
msgstr "Таңдамалыларға қосу"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2305 js/ui/panel.js:93
|
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "Деректерді көрсету"
|
msgstr "Деректерді көрсету"
|
||||||
|
|
||||||
@@ -760,7 +766,7 @@ msgstr "Құлаққап"
|
|||||||
msgid "Headset"
|
msgid "Headset"
|
||||||
msgstr "Микрофонды құлаққап"
|
msgstr "Микрофонды құлаққап"
|
||||||
|
|
||||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Микрофон"
|
msgstr "Микрофон"
|
||||||
|
|
||||||
@@ -912,8 +918,9 @@ msgid "External drive disconnected"
|
|||||||
msgstr "Сыртқы диск алынды"
|
msgstr "Сыртқы диск алынды"
|
||||||
|
|
||||||
#: js/ui/components/automountManager.js:208
|
#: js/ui/components/automountManager.js:208
|
||||||
|
#| msgid "Unable to lock"
|
||||||
msgid "Unable to unlock volume"
|
msgid "Unable to unlock volume"
|
||||||
msgstr "Томды босату мүмкін емес"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/components/automountManager.js:209
|
#: js/ui/components/automountManager.js:209
|
||||||
msgid "The installed udisks version does not support the PIM setting"
|
msgid "The installed udisks version does not support the PIM setting"
|
||||||
@@ -986,6 +993,7 @@ msgid "PIN code is needed for the mobile broadband device"
|
|||||||
msgstr "Сымсыз кеңжолақты құрылғы үшін PIN коды керек"
|
msgstr "Сымсыз кеңжолақты құрылғы үшін PIN коды керек"
|
||||||
|
|
||||||
#: js/ui/components/networkAgent.js:334
|
#: js/ui/components/networkAgent.js:334
|
||||||
|
#| msgid "PIN: "
|
||||||
msgid "PIN"
|
msgid "PIN"
|
||||||
msgstr "PIN"
|
msgstr "PIN"
|
||||||
|
|
||||||
@@ -1121,8 +1129,9 @@ msgid "Weather"
|
|||||||
msgstr "Ауа райы"
|
msgstr "Ауа райы"
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:653
|
#: js/ui/dateMenu.js:653
|
||||||
|
#| msgid "Select a location…"
|
||||||
msgid "Select weather location…"
|
msgid "Select weather location…"
|
||||||
msgstr "Ауа райы орнын таңдау…"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/endSessionDialog.js:37
|
#: js/ui/endSessionDialog.js:37
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
@@ -1242,10 +1251,9 @@ msgstr ""
|
|||||||
"эл. желісіне жалғанып тұрғанына көз жеткізіңіз."
|
"эл. желісіне жалғанып тұрғанына көз жеткізіңіз."
|
||||||
|
|
||||||
#: js/ui/endSessionDialog.js:259
|
#: js/ui/endSessionDialog.js:259
|
||||||
|
#| msgid "Running on battery power: please plug in before installing updates."
|
||||||
msgid "Running on battery power: Please plug in before installing updates."
|
msgid "Running on battery power: Please plug in before installing updates."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Батарея қорегінен жұмыс істеуде. Жаңартуларды орнату алдында эл. қорегі "
|
|
||||||
"желісіне жалғаңыз."
|
|
||||||
|
|
||||||
#: js/ui/endSessionDialog.js:268
|
#: js/ui/endSessionDialog.js:268
|
||||||
msgid "Some applications are busy or have unsaved work"
|
msgid "Some applications are busy or have unsaved work"
|
||||||
@@ -1281,26 +1289,30 @@ msgid "Download and install “%s” from extensions.gnome.org?"
|
|||||||
msgstr "extensions.gnome.org адресінен \"%s\" жүктеп алып, орнату керек пе?"
|
msgstr "extensions.gnome.org адресінен \"%s\" жүктеп алып, орнату керек пе?"
|
||||||
|
|
||||||
#: js/ui/extensionSystem.js:252
|
#: js/ui/extensionSystem.js:252
|
||||||
|
#| msgid "No Extensions Installed"
|
||||||
msgid "Extension Updates Available"
|
msgid "Extension Updates Available"
|
||||||
msgstr "Кеңейту жаңартулары дайын"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/extensionSystem.js:253
|
#: js/ui/extensionSystem.js:253
|
||||||
msgid "Extension updates are ready to be installed."
|
msgid "Extension updates are ready to be installed."
|
||||||
msgstr "Кеңейту жаңартулары орнатылуға дайын."
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:79
|
#: js/ui/inhibitShortcutsDialog.js:79
|
||||||
|
#| msgid "%s wants to inhibit shortcuts"
|
||||||
msgid "Allow inhibiting shortcuts"
|
msgid "Allow inhibiting shortcuts"
|
||||||
msgstr "Пернелер жарлығын алмастыруды рұқсат ету"
|
msgstr ""
|
||||||
|
|
||||||
#. Translators: %s is an application name like "Settings"
|
#. Translators: %s is an application name like "Settings"
|
||||||
#: js/ui/inhibitShortcutsDialog.js:82
|
#: js/ui/inhibitShortcutsDialog.js:82
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
|
#| msgid "Application wants to inhibit shortcuts"
|
||||||
msgid "The application %s wants to inhibit shortcuts"
|
msgid "The application %s wants to inhibit shortcuts"
|
||||||
msgstr "%s қолданбасы пернелер жарлығын алмастырғысы келеді"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:83
|
#: js/ui/inhibitShortcutsDialog.js:83
|
||||||
|
#| msgid "Application wants to inhibit shortcuts"
|
||||||
msgid "An application wants to inhibit shortcuts"
|
msgid "An application wants to inhibit shortcuts"
|
||||||
msgstr "Қолданба пернелер жарлығын алмастырғысы келеді"
|
msgstr ""
|
||||||
|
|
||||||
#. 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
|
||||||
@@ -1433,25 +1445,23 @@ msgid "Web Page"
|
|||||||
msgstr "Веб парағы"
|
msgstr "Веб парағы"
|
||||||
|
|
||||||
#: js/ui/main.js:297
|
#: js/ui/main.js:297
|
||||||
|
#| msgid "Log in as another user"
|
||||||
msgid "Logged in as a privileged user"
|
msgid "Logged in as a privileged user"
|
||||||
msgstr "Привилегияланған пайдаланушы ретінде жүйеге кірген"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/main.js:298
|
#: js/ui/main.js:298
|
||||||
msgid ""
|
msgid ""
|
||||||
"Running a session as a privileged user should be avoided for security "
|
"Running a session as a privileged user should be avoided for security "
|
||||||
"reasons. If possible, you should log in as a normal user."
|
"reasons. If possible, you should log in as a normal user."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Привилегияланған пайдаланушы ретінде сессияны орындаудан қауіпсіздік "
|
|
||||||
"салдарынан аулақ болу керек. Мүмкін болса, қалыпты пайдаланушы ретінде "
|
|
||||||
"жүйеге кіріңіз."
|
|
||||||
|
|
||||||
#: js/ui/main.js:337
|
#: js/ui/main.js:337
|
||||||
msgid "Screen Lock disabled"
|
msgid "Screen Lock disabled"
|
||||||
msgstr "Экранды блоктау сөндірілген"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/main.js:338
|
#: js/ui/main.js:338
|
||||||
msgid "Screen Locking requires the GNOME display manager."
|
msgid "Screen Locking requires the GNOME display manager."
|
||||||
msgstr "Экранды блоктау GNOME дисплейлер басқарушысын талап етеді."
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/messageTray.js:1547
|
#: js/ui/messageTray.js:1547
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
@@ -1465,13 +1475,13 @@ msgstr "Белгісіз әртіс"
|
|||||||
msgid "Unknown title"
|
msgid "Unknown title"
|
||||||
msgstr "Белгісіз атауы"
|
msgstr "Белгісіз атауы"
|
||||||
|
|
||||||
#: js/ui/overview.js:74
|
#: js/ui/overview.js:73
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Болдырмау"
|
msgstr "Болдырмау"
|
||||||
|
|
||||||
#. Translators: This is the main view to select
|
#. Translators: This is the main view to select
|
||||||
#. activities. See also note for "Activities" string.
|
#. activities. See also note for "Activities" string.
|
||||||
#: js/ui/overview.js:87
|
#: js/ui/overview.js:86
|
||||||
msgid "Overview"
|
msgid "Overview"
|
||||||
msgstr "Шолу"
|
msgstr "Шолу"
|
||||||
|
|
||||||
@@ -1479,7 +1489,7 @@ msgstr "Шолу"
|
|||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
#: js/ui/overview.js:108
|
#: js/ui/overview.js:107
|
||||||
msgid "Type to search"
|
msgid "Type to search"
|
||||||
msgstr "Іздеу үшін теріңіз"
|
msgstr "Іздеу үшін теріңіз"
|
||||||
|
|
||||||
@@ -1616,16 +1626,18 @@ msgid "Caps lock is on."
|
|||||||
msgstr "Caps lock іске қосылған."
|
msgstr "Caps lock іске қосылған."
|
||||||
|
|
||||||
#: js/ui/shellMountOperation.js:285
|
#: js/ui/shellMountOperation.js:285
|
||||||
|
#| msgid "Volume"
|
||||||
msgid "Hidden Volume"
|
msgid "Hidden Volume"
|
||||||
msgstr "Жасырын том"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/shellMountOperation.js:288
|
#: js/ui/shellMountOperation.js:288
|
||||||
msgid "Windows System Volume"
|
msgid "Windows System Volume"
|
||||||
msgstr "Windows жүйелік томы"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/shellMountOperation.js:291
|
#: js/ui/shellMountOperation.js:291
|
||||||
|
#| msgid "Mouse Keys"
|
||||||
msgid "Uses Keyfiles"
|
msgid "Uses Keyfiles"
|
||||||
msgstr "Кілт файлдарды қолданады"
|
msgstr ""
|
||||||
|
|
||||||
#. Translators: %s is the Disks application
|
#. Translators: %s is the Disks application
|
||||||
#: js/ui/shellMountOperation.js:298
|
#: js/ui/shellMountOperation.js:298
|
||||||
@@ -1633,7 +1645,6 @@ msgstr "Кілт файлдарды қолданады"
|
|||||||
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 ""
|
||||||
"Кілт файлдарын қолданатын томды босату үшін, <i>%s</i> утилитасын қолданыңыз."
|
|
||||||
|
|
||||||
#: js/ui/shellMountOperation.js:306
|
#: js/ui/shellMountOperation.js:306
|
||||||
msgid "PIM Number"
|
msgid "PIM Number"
|
||||||
@@ -1655,7 +1666,7 @@ msgstr "%s ашу"
|
|||||||
|
|
||||||
#: js/ui/shellMountOperation.js:423
|
#: js/ui/shellMountOperation.js:423
|
||||||
msgid "The PIM must be a number or empty."
|
msgid "The PIM must be a number or empty."
|
||||||
msgstr "PIM тек сандардан тұруы, немесе бос болуы тиіс."
|
msgstr ""
|
||||||
|
|
||||||
#. Translators: %s is the Disks application
|
#. Translators: %s is the Disks application
|
||||||
#: js/ui/shellMountOperation.js:465
|
#: js/ui/shellMountOperation.js:465
|
||||||
@@ -1667,7 +1678,7 @@ msgstr "%s іске қосу мүмкін емес"
|
|||||||
#: js/ui/shellMountOperation.js:467
|
#: js/ui/shellMountOperation.js:467
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Couldn’t find the %s application"
|
msgid "Couldn’t find the %s application"
|
||||||
msgstr "%s қолданбасы табылмады"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/status/accessibility.js:35
|
#: js/ui/status/accessibility.js:35
|
||||||
msgid "Accessibility"
|
msgid "Accessibility"
|
||||||
@@ -1722,12 +1733,14 @@ msgid "Bluetooth Settings"
|
|||||||
msgstr "Bluetooth баптаулары"
|
msgstr "Bluetooth баптаулары"
|
||||||
|
|
||||||
#: js/ui/status/bluetooth.js:152
|
#: js/ui/status/bluetooth.js:152
|
||||||
|
#| msgid "Bluetooth"
|
||||||
msgid "Bluetooth Off"
|
msgid "Bluetooth Off"
|
||||||
msgstr "Bluetooth сөндірілген"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/status/bluetooth.js:154
|
#: js/ui/status/bluetooth.js:154
|
||||||
|
#| msgid "Bluetooth"
|
||||||
msgid "Bluetooth On"
|
msgid "Bluetooth On"
|
||||||
msgstr "Bluetooth іске қосылған"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/status/brightness.js:39
|
#: js/ui/status/brightness.js:39
|
||||||
msgid "Brightness"
|
msgid "Brightness"
|
||||||
@@ -1735,7 +1748,7 @@ msgstr "Жарықтылығы"
|
|||||||
|
|
||||||
#: js/ui/status/dwellClick.js:13
|
#: js/ui/status/dwellClick.js:13
|
||||||
msgid "Single Click"
|
msgid "Single Click"
|
||||||
msgstr "Дара шерту"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/status/dwellClick.js:18
|
#: js/ui/status/dwellClick.js:18
|
||||||
msgid "Double Click"
|
msgid "Double Click"
|
||||||
@@ -1747,11 +1760,11 @@ msgstr "Тартып апару"
|
|||||||
|
|
||||||
#: js/ui/status/dwellClick.js:28
|
#: js/ui/status/dwellClick.js:28
|
||||||
msgid "Secondary Click"
|
msgid "Secondary Click"
|
||||||
msgstr "Екінші шерту"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/status/dwellClick.js:37
|
#: js/ui/status/dwellClick.js:37
|
||||||
msgid "Dwell Click"
|
msgid "Dwell Click"
|
||||||
msgstr "Пернеде кідіртуден кейінгі сол жақпен шерту"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/status/keyboard.js:826
|
#: js/ui/status/keyboard.js:826
|
||||||
msgid "Keyboard"
|
msgid "Keyboard"
|
||||||
@@ -1787,7 +1800,7 @@ msgstr "Іске қосу"
|
|||||||
|
|
||||||
#: js/ui/status/location.js:350
|
#: js/ui/status/location.js:350
|
||||||
msgid "Allow location access"
|
msgid "Allow location access"
|
||||||
msgstr "Орналасуға қатынауды рұқсат ету"
|
msgstr ""
|
||||||
|
|
||||||
#. Translators: %s is an application name
|
#. Translators: %s is an application name
|
||||||
#: js/ui/status/location.js:352
|
#: js/ui/status/location.js:352
|
||||||
@@ -2127,11 +2140,11 @@ msgstr "Thunderbolt авторизация қатесі"
|
|||||||
msgid "Could not authorize the Thunderbolt device: %s"
|
msgid "Could not authorize the Thunderbolt device: %s"
|
||||||
msgstr "Thunderbolt құралғысын авторизациялау мүмкін емес: %s"
|
msgstr "Thunderbolt құралғысын авторизациялау мүмкін емес: %s"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:155
|
#: js/ui/status/volume.js:154
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "Дыбыс өзгертілді"
|
msgstr "Дыбыс өзгертілді"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:217
|
#: js/ui/status/volume.js:225
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Дыбыс деңгейі"
|
msgstr "Дыбыс деңгейі"
|
||||||
|
|
||||||
@@ -2166,16 +2179,18 @@ msgstr "Тек құрамындағы"
|
|||||||
#. Translators: This is a time format for a date in
|
#. Translators: This is a time format for a date in
|
||||||
#. long format
|
#. long format
|
||||||
#: js/ui/unlockDialog.js:371
|
#: js/ui/unlockDialog.js:371
|
||||||
|
#| msgctxt "calendar heading"
|
||||||
|
#| msgid "%A, %B %-d"
|
||||||
msgid "%A %B %-d"
|
msgid "%A %B %-d"
|
||||||
msgstr "%A %B %-d"
|
msgstr "%A %B %-d"
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:377
|
#: js/ui/unlockDialog.js:377
|
||||||
msgid "Swipe up to unlock"
|
msgid "Swipe up to unlock"
|
||||||
msgstr "Босату үшін жоғары өткізіңіз"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:378
|
#: js/ui/unlockDialog.js:378
|
||||||
msgid "Click or press a key to unlock"
|
msgid "Click or press a key to unlock"
|
||||||
msgstr "Босату үшін шертіңіз немесе пернені басыңыз"
|
msgstr ""
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:550
|
#: js/ui/unlockDialog.js:550
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
@@ -2358,8 +2373,6 @@ msgid ""
|
|||||||
"GNOME Extensions handles updating extensions, configuring extension "
|
"GNOME Extensions handles updating extensions, configuring extension "
|
||||||
"preferences and removing or disabling unwanted extensions."
|
"preferences and removing or disabling unwanted extensions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"GNOME кеңейтулері көмегімен кеңейтулерді жаңарту, баптау және оларды өшіру "
|
|
||||||
"немесе сөндіруге болады."
|
|
||||||
|
|
||||||
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
|
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
|
||||||
msgid "Configure GNOME Shell Extensions"
|
msgid "Configure GNOME Shell Extensions"
|
||||||
@@ -2375,7 +2388,6 @@ msgid ""
|
|||||||
"If you remove the extension, you need to return to download it if you want "
|
"If you remove the extension, you need to return to download it if you want "
|
||||||
"to enable it again"
|
"to enable it again"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Кеңейтуді өшірсеңіз, оны қайта іске қосу үшін қайта жүктеп алу керек болады"
|
|
||||||
|
|
||||||
#: subprojects/extensions-app/js/main.js:150
|
#: subprojects/extensions-app/js/main.js:150
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
@@ -2389,15 +2401,15 @@ msgstr "Baurzhan Muftakhidinov <baurthefirst@gmail.com>"
|
|||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "%d extension will be updated on next login."
|
msgid "%d extension will be updated on next login."
|
||||||
msgid_plural "%d extensions will be updated on next login."
|
msgid_plural "%d extensions will be updated on next login."
|
||||||
msgstr[0] "%d кеңейту жүйеге келесі рет кірген кезде жаңартылатын болады."
|
msgstr[0] ""
|
||||||
|
|
||||||
#: subprojects/extensions-app/js/main.js:461
|
#: subprojects/extensions-app/js/main.js:461
|
||||||
msgid "The extension is incompatible with the current GNOME version"
|
msgid "The extension is incompatible with the current GNOME version"
|
||||||
msgstr "Бұл кеңейту ағымдағы GNOME нұсқасымен үйлеспейді"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-app/js/main.js:464
|
#: subprojects/extensions-app/js/main.js:464
|
||||||
msgid "The extension had an error"
|
msgid "The extension had an error"
|
||||||
msgstr "Кеңейтуде қате болды"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-app/data/ui/extension-row.ui:109
|
#: subprojects/extensions-app/data/ui/extension-row.ui:109
|
||||||
#: subprojects/extensions-tool/src/command-create.c:325
|
#: subprojects/extensions-tool/src/command-create.c:325
|
||||||
@@ -2416,7 +2428,7 @@ msgstr "Авторы"
|
|||||||
|
|
||||||
#: subprojects/extensions-app/data/ui/extension-row.ui:216
|
#: subprojects/extensions-app/data/ui/extension-row.ui:216
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Веб сайт"
|
msgstr "Веб-сайт"
|
||||||
|
|
||||||
#: subprojects/extensions-app/data/ui/extension-row.ui:233
|
#: subprojects/extensions-app/data/ui/extension-row.ui:233
|
||||||
msgid "Remove…"
|
msgid "Remove…"
|
||||||
@@ -2448,9 +2460,6 @@ msgid ""
|
|||||||
"encounter problems with your system, it is recommended to disable all "
|
"encounter problems with your system, it is recommended to disable all "
|
||||||
"extensions."
|
"extensions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Кеңейтулер жүйелік мәселелерді, соның ішінде өнімділік мәселелерін туғызуы "
|
|
||||||
"мүмкін. Жүйелік мәселелерге тап болсаңыз, барлық кеңейтулерді сөндіру "
|
|
||||||
"ұсынылады."
|
|
||||||
|
|
||||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
|
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
|
||||||
msgid "Manually Installed"
|
msgid "Manually Installed"
|
||||||
@@ -2469,12 +2478,10 @@ msgid ""
|
|||||||
"We’re very sorry, but it was not possible to get the list of installed "
|
"We’re 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."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Кешірім өтінеміз, барлық орнатылған кеңейтулер тізімін алу мүмкін болмады. "
|
|
||||||
"GNOME ішіне кіргеніңізді тексеріп, қайталап көріңіз."
|
|
||||||
|
|
||||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
|
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
|
||||||
msgid "Extension Updates Ready"
|
msgid "Extension Updates Ready"
|
||||||
msgstr "Кеңейту жаңартулары дайын"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
|
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
|
||||||
msgid "Log Out…"
|
msgid "Log Out…"
|
||||||
@@ -2484,7 +2491,7 @@ msgstr "Жүйеден шығу…"
|
|||||||
#: subprojects/extensions-tool/src/command-create.c:226
|
#: subprojects/extensions-tool/src/command-create.c:226
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "The new extension was successfully created in %s.\n"
|
msgid "The new extension was successfully created in %s.\n"
|
||||||
msgstr "Жаңа кеңейту %s ішінде сәтті жасалды.\n"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:299
|
#: subprojects/extensions-tool/src/command-create.c:299
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -2492,13 +2499,11 @@ msgid ""
|
|||||||
"Name should be a very short (ideally descriptive) string.\n"
|
"Name should be a very short (ideally descriptive) string.\n"
|
||||||
"Examples are: %s"
|
"Examples are: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Атауы қысқа мәтіндік жол (сипаттайтын) болуы тиіс.\n"
|
|
||||||
"Мысалы: %s"
|
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:305
|
#: subprojects/extensions-tool/src/command-create.c:305
|
||||||
#: subprojects/extensions-tool/src/main.c:238
|
#: subprojects/extensions-tool/src/main.c:238
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Аты"
|
msgstr "Атауы"
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:319
|
#: subprojects/extensions-tool/src/command-create.c:319
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -2506,9 +2511,6 @@ msgid ""
|
|||||||
"Description is a single-sentence explanation of what your extension does.\n"
|
"Description is a single-sentence explanation of what your extension does.\n"
|
||||||
"Examples are: %s"
|
"Examples are: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Сипаттамасы - бұл сіздің кеңейтуіңіз жасайтын әрекеттің бір сөйлемді "
|
|
||||||
"анықтамасы.\n"
|
|
||||||
"Мысалы: %s"
|
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:339
|
#: subprojects/extensions-tool/src/command-create.c:339
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -2516,12 +2518,10 @@ msgid ""
|
|||||||
"This should be in the format of an email address (clicktofocus@janedoe."
|
"This should be in the format of an email address (clicktofocus@janedoe."
|
||||||
"example.com)\n"
|
"example.com)\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"UUID - бұл кеңейтуңіздің глобалды деңгейдегі бірегей идентификаторы.\n"
|
|
||||||
"Ол эл. пошта адресі пішімінде болуы тиіс (clicktofocus@janedoe.example.com)\n"
|
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:366
|
#: subprojects/extensions-tool/src/command-create.c:366
|
||||||
msgid "Choose one of the available templates:\n"
|
msgid "Choose one of the available templates:\n"
|
||||||
msgstr "Қол жетімді үлгілердің бірін таңдаңыз:\n"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:380
|
#: subprojects/extensions-tool/src/command-create.c:380
|
||||||
msgid "Template"
|
msgid "Template"
|
||||||
@@ -2529,7 +2529,7 @@ msgstr "Үлгі"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:435
|
#: subprojects/extensions-tool/src/command-create.c:435
|
||||||
msgid "The unique identifier of the new extension"
|
msgid "The unique identifier of the new extension"
|
||||||
msgstr "Жаңа кеңейтудің бірегей идентификаторы"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:438
|
#: subprojects/extensions-tool/src/command-create.c:438
|
||||||
msgid "NAME"
|
msgid "NAME"
|
||||||
@@ -2537,7 +2537,7 @@ msgstr "АТАУЫ"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:439
|
#: subprojects/extensions-tool/src/command-create.c:439
|
||||||
msgid "The user-visible name of the new extension"
|
msgid "The user-visible name of the new extension"
|
||||||
msgstr "Жаңа кеңейтудің пайдаланушыға көрінетін атауы"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:441
|
#: subprojects/extensions-tool/src/command-create.c:441
|
||||||
msgid "DESCRIPTION"
|
msgid "DESCRIPTION"
|
||||||
@@ -2545,7 +2545,7 @@ msgstr "СИПАТТАМАСЫ"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:443
|
#: subprojects/extensions-tool/src/command-create.c:443
|
||||||
msgid "A short description of what the extension does"
|
msgid "A short description of what the extension does"
|
||||||
msgstr "Кеңейтудің қысқаша сипаттамасы"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:446
|
#: subprojects/extensions-tool/src/command-create.c:446
|
||||||
msgid "TEMPLATE"
|
msgid "TEMPLATE"
|
||||||
@@ -2553,11 +2553,11 @@ msgstr "ҮЛГІ"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:447
|
#: subprojects/extensions-tool/src/command-create.c:447
|
||||||
msgid "The template to use for the new extension"
|
msgid "The template to use for the new extension"
|
||||||
msgstr "Жаңа кеңейту үшін қолданылатын үлгі"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:453
|
#: subprojects/extensions-tool/src/command-create.c:453
|
||||||
msgid "Enter extension information interactively"
|
msgid "Enter extension information interactively"
|
||||||
msgstr "Кеңейту ақпаратын интерактивті түрде енгізу"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:461
|
#: subprojects/extensions-tool/src/command-create.c:461
|
||||||
msgid "Create a new extension"
|
msgid "Create a new extension"
|
||||||
@@ -2570,20 +2570,20 @@ msgstr "Белгісіз аргументтер"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:504
|
#: subprojects/extensions-tool/src/command-create.c:504
|
||||||
msgid "UUID, name and description are required"
|
msgid "UUID, name and description are required"
|
||||||
msgstr "UUID, аты және сипаттамасы керек"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-disable.c:46
|
#: subprojects/extensions-tool/src/command-disable.c:46
|
||||||
#: subprojects/extensions-tool/src/command-enable.c:46
|
#: subprojects/extensions-tool/src/command-enable.c:46
|
||||||
#: subprojects/extensions-tool/src/command-info.c:50
|
#: subprojects/extensions-tool/src/command-info.c:50
|
||||||
#: subprojects/extensions-tool/src/command-list.c:64
|
#: subprojects/extensions-tool/src/command-list.c:64
|
||||||
msgid "Failed to connect to GNOME Shell\n"
|
msgid "Failed to connect to GNOME Shell\n"
|
||||||
msgstr "GNOME Shell-ға байланысты орнату сәтсіз аяқталды\n"
|
msgstr "GNOME Shell-ға байланысты орнату мүмкін емес\n"
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-disable.c:53
|
#: subprojects/extensions-tool/src/command-disable.c:53
|
||||||
#: subprojects/extensions-tool/src/command-enable.c:53
|
#: subprojects/extensions-tool/src/command-enable.c:53
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Extension “%s” does not exist\n"
|
msgid "Extension “%s” does not exist\n"
|
||||||
msgstr "\"%s\" кеңейтуі жоқ\n"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-disable.c:101
|
#: subprojects/extensions-tool/src/command-disable.c:101
|
||||||
msgid "Disable an extension"
|
msgid "Disable an extension"
|
||||||
@@ -2605,7 +2605,7 @@ msgstr "UUID көрсетілмеген"
|
|||||||
#: subprojects/extensions-tool/src/command-reset.c:81
|
#: subprojects/extensions-tool/src/command-reset.c:81
|
||||||
#: subprojects/extensions-tool/src/command-uninstall.c:109
|
#: subprojects/extensions-tool/src/command-uninstall.c:109
|
||||||
msgid "More than one UUID given"
|
msgid "More than one UUID given"
|
||||||
msgstr "Бірден көп UUID көрсетілген"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-enable.c:101
|
#: subprojects/extensions-tool/src/command-enable.c:101
|
||||||
msgid "Enable an extension"
|
msgid "Enable an extension"
|
||||||
@@ -2615,7 +2615,7 @@ msgstr "Кеңейтуді іске қосу"
|
|||||||
#: subprojects/extensions-tool/src/main.c:155
|
#: subprojects/extensions-tool/src/main.c:155
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Extension “%s” doesn't exist\n"
|
msgid "Extension “%s” doesn't exist\n"
|
||||||
msgstr "\"%s\" кеңейтуі жоқ\n"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-info.c:85
|
#: subprojects/extensions-tool/src/command-info.c:85
|
||||||
msgid "Show extensions info"
|
msgid "Show extensions info"
|
||||||
@@ -2623,51 +2623,60 @@ msgstr "Кеңейтулер ақпаратын көрсету"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-install.c:173
|
#: subprojects/extensions-tool/src/command-install.c:173
|
||||||
msgid "Overwrite an existing extension"
|
msgid "Overwrite an existing extension"
|
||||||
msgstr "Бар болып тұрған кеңейтуді үстінен жазу"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-install.c:175
|
#: subprojects/extensions-tool/src/command-install.c:175
|
||||||
msgid "EXTENSION_BUNDLE"
|
msgid "EXTENSION_BUNDLE"
|
||||||
msgstr "КЕҢЕЙТУ_ДЕСТЕСІ"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-install.c:184
|
#: subprojects/extensions-tool/src/command-install.c:184
|
||||||
|
#| msgid "UUIDs of extensions to enable"
|
||||||
msgid "Install an extension bundle"
|
msgid "Install an extension bundle"
|
||||||
msgstr "Кеңейту дестесін орнату"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-install.c:202
|
#: subprojects/extensions-tool/src/command-install.c:202
|
||||||
|
#| msgid "No extensions installed"
|
||||||
msgid "No extension bundle specified"
|
msgid "No extension bundle specified"
|
||||||
msgstr "Кеңейту дестесі көрсетілмеген"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-install.c:208
|
#: subprojects/extensions-tool/src/command-install.c:208
|
||||||
msgid "More than one extension bundle specified"
|
msgid "More than one extension bundle specified"
|
||||||
msgstr "Бірден көп кеңейту дестесі көрсетілген"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-list.c:128
|
#: subprojects/extensions-tool/src/command-list.c:128
|
||||||
|
#| msgid "Shell Extensions"
|
||||||
msgid "Show user-installed extensions"
|
msgid "Show user-installed extensions"
|
||||||
msgstr "Пайдаланушы орнатқан кеңейтулерді көрсету"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-list.c:131
|
#: subprojects/extensions-tool/src/command-list.c:131
|
||||||
|
#| msgid "Shell Extensions"
|
||||||
msgid "Show system-installed extensions"
|
msgid "Show system-installed extensions"
|
||||||
msgstr "Жүйелік деңгейде орнатылған кеңейтулерді көрсету"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-list.c:134
|
#: subprojects/extensions-tool/src/command-list.c:134
|
||||||
|
#| msgid "Shell Extensions"
|
||||||
msgid "Show enabled extensions"
|
msgid "Show enabled extensions"
|
||||||
msgstr "Іске қосылған кеңейтулерді көрсету"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-list.c:137
|
#: subprojects/extensions-tool/src/command-list.c:137
|
||||||
|
#| msgid "Disable user extensions"
|
||||||
msgid "Show disabled extensions"
|
msgid "Show disabled extensions"
|
||||||
msgstr "Сөндірілген кеңейтулерді көрсету"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-list.c:140
|
#: subprojects/extensions-tool/src/command-list.c:140
|
||||||
|
#| msgid "GNOME Shell Extension Preferences"
|
||||||
msgid "Show extensions with preferences"
|
msgid "Show extensions with preferences"
|
||||||
msgstr "Баптаулары бар кеңейтулерді көрсету"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-list.c:143
|
#: subprojects/extensions-tool/src/command-list.c:143
|
||||||
|
#| msgid "No extensions installed"
|
||||||
msgid "Show extensions with updates"
|
msgid "Show extensions with updates"
|
||||||
msgstr "Жаңартулары бар кеңейтулерді көрсету"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-list.c:146
|
#: subprojects/extensions-tool/src/command-list.c:146
|
||||||
|
#| msgid "Visit extension homepage"
|
||||||
msgid "Print extension details"
|
msgid "Print extension details"
|
||||||
msgstr "Кеңейту ақпаратын басып шығару"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-list.c:154
|
#: subprojects/extensions-tool/src/command-list.c:154
|
||||||
msgid "List installed extensions"
|
msgid "List installed extensions"
|
||||||
@@ -2679,7 +2688,7 @@ msgstr "ФАЙЛ"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:451
|
#: subprojects/extensions-tool/src/command-pack.c:451
|
||||||
msgid "Additional source to include in the bundle"
|
msgid "Additional source to include in the bundle"
|
||||||
msgstr "Дестеге қосылатын қосымша қайнар көз"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:454
|
#: subprojects/extensions-tool/src/command-pack.c:454
|
||||||
msgid "SCHEMA"
|
msgid "SCHEMA"
|
||||||
@@ -2687,7 +2696,7 @@ msgstr "СҰЛБА"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:455
|
#: subprojects/extensions-tool/src/command-pack.c:455
|
||||||
msgid "A GSettings schema that should be included"
|
msgid "A GSettings schema that should be included"
|
||||||
msgstr "Құрамына енуі тиіс GSettings сұлбасы"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:457
|
#: subprojects/extensions-tool/src/command-pack.c:457
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:468
|
#: subprojects/extensions-tool/src/command-pack.c:468
|
||||||
@@ -2696,7 +2705,7 @@ msgstr "БУМА"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:459
|
#: subprojects/extensions-tool/src/command-pack.c:459
|
||||||
msgid "The directory where translations are found"
|
msgid "The directory where translations are found"
|
||||||
msgstr "Аудармалар орналасқан бума"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:461
|
#: subprojects/extensions-tool/src/command-pack.c:461
|
||||||
msgid "DOMAIN"
|
msgid "DOMAIN"
|
||||||
@@ -2704,37 +2713,37 @@ msgstr "ДОМЕН"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:463
|
#: subprojects/extensions-tool/src/command-pack.c:463
|
||||||
msgid "The gettext domain to use for translations"
|
msgid "The gettext domain to use for translations"
|
||||||
msgstr "Аудармалар үшін қолданылуы тиіс gettext домені"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:466
|
#: subprojects/extensions-tool/src/command-pack.c:466
|
||||||
msgid "Overwrite an existing pack"
|
msgid "Overwrite an existing pack"
|
||||||
msgstr "Бар болып тұрған пакетті үстінен жазу"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:470
|
#: subprojects/extensions-tool/src/command-pack.c:470
|
||||||
msgid "The directory where the pack should be created"
|
msgid "The directory where the pack should be created"
|
||||||
msgstr "Десте жасалуы тиіс бума"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:472
|
#: subprojects/extensions-tool/src/command-pack.c:472
|
||||||
msgid "SOURCE_DIRECTORY"
|
msgid "SOURCE_DIRECTORY"
|
||||||
msgstr "ҚАЙНАР_КӨЗ_БУМАСЫ"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:481
|
#: subprojects/extensions-tool/src/command-pack.c:481
|
||||||
msgid "Create an extension bundle"
|
msgid "Create an extension bundle"
|
||||||
msgstr "Кеңейту дестесін жасау"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-pack.c:501
|
#: subprojects/extensions-tool/src/command-pack.c:501
|
||||||
msgid "More than one source directory specified"
|
msgid "More than one source directory specified"
|
||||||
msgstr "Бірден көп қайнар көз бумасы көрсетілген"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-prefs.c:47
|
#: subprojects/extensions-tool/src/command-prefs.c:47
|
||||||
#, c-format
|
#, c-format
|
||||||
#| msgid "Show extensions with preferences"
|
|
||||||
msgid "Extension “%s” doesn't have preferences\n"
|
msgid "Extension “%s” doesn't have preferences\n"
|
||||||
msgstr "\"%s\" кеңейтудің баптаулары жоқ\n"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-prefs.c:79
|
#: subprojects/extensions-tool/src/command-prefs.c:79
|
||||||
|
#| msgid "GNOME Shell Extension Preferences"
|
||||||
msgid "Opens extension preferences"
|
msgid "Opens extension preferences"
|
||||||
msgstr "Кеңейту баптауларын ашады"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-reset.c:58
|
#: subprojects/extensions-tool/src/command-reset.c:58
|
||||||
msgid "Reset an extension"
|
msgid "Reset an extension"
|
||||||
@@ -2755,11 +2764,11 @@ msgstr "Кеңейтуді өшіру"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/main.c:72
|
#: subprojects/extensions-tool/src/main.c:72
|
||||||
msgid "Do not print error messages"
|
msgid "Do not print error messages"
|
||||||
msgstr "Қате туралы хабарламаларды басып шығармау"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/main.c:146
|
#: subprojects/extensions-tool/src/main.c:146
|
||||||
msgid "Failed to connect to GNOME Shell"
|
msgid "Failed to connect to GNOME Shell"
|
||||||
msgstr "GNOME Shell-ға байланысты орнату сәтсіз аяқталды"
|
msgstr "GNOME Shell-ға байланысты орнату мүмкін емес"
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/main.c:244
|
#: subprojects/extensions-tool/src/main.c:244
|
||||||
msgid "Path"
|
msgid "Path"
|
||||||
@@ -2779,7 +2788,7 @@ msgstr "Қалып-күйі"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/main.c:290
|
#: subprojects/extensions-tool/src/main.c:290
|
||||||
msgid "“version” takes no arguments"
|
msgid "“version” takes no arguments"
|
||||||
msgstr "“version” аргументтерді қабылдамайды"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/main.c:292
|
#: subprojects/extensions-tool/src/main.c:292
|
||||||
#: subprojects/extensions-tool/src/main.c:312
|
#: subprojects/extensions-tool/src/main.c:312
|
||||||
@@ -2851,11 +2860,11 @@ msgstr "Кеңейту дестесін орнату"
|
|||||||
#: subprojects/extensions-tool/src/main.c:330
|
#: subprojects/extensions-tool/src/main.c:330
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Use “%s” to get detailed help.\n"
|
msgid "Use “%s” to get detailed help.\n"
|
||||||
msgstr "Толық көмекті алу үшін \"%s\" пайдаланыңыз.\n"
|
msgstr ""
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/templates/00-plain.desktop.in:4
|
#: subprojects/extensions-tool/src/templates/00-plain.desktop.in:4
|
||||||
msgid "Plain"
|
msgid "Plain"
|
||||||
msgstr "Қалыпты"
|
msgstr "Кәдімгі"
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/templates/00-plain.desktop.in:5
|
#: subprojects/extensions-tool/src/templates/00-plain.desktop.in:5
|
||||||
msgid "An empty extension"
|
msgid "An empty extension"
|
||||||
@@ -2867,7 +2876,7 @@ msgstr "Индикатор"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/templates/indicator.desktop.in:5
|
#: subprojects/extensions-tool/src/templates/indicator.desktop.in:5
|
||||||
msgid "Add an icon to the top bar"
|
msgid "Add an icon to the top bar"
|
||||||
msgstr "Жоғарғы панельге таңбашаны қосу"
|
msgstr ""
|
||||||
|
|
||||||
#. translators:
|
#. translators:
|
||||||
#. * The number of sound outputs on a particular device
|
#. * The number of sound outputs on a particular device
|
||||||
@@ -2889,33 +2898,6 @@ msgstr[0] "%u кірісі"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Жүйелік дыбыстар"
|
msgstr "Жүйелік дыбыстар"
|
||||||
|
|
||||||
#~ msgid "Frequently used applications will appear here"
|
|
||||||
#~ msgstr "Жиі қолданылатын қолданбалар осында көрінеді"
|
|
||||||
|
|
||||||
#~ msgid "Frequent"
|
|
||||||
#~ msgstr "Жиі қолданылатын"
|
|
||||||
|
|
||||||
#~ msgid "All"
|
|
||||||
#~ msgstr "Барлығы"
|
|
||||||
|
|
||||||
#~ msgctxt "calendar heading"
|
|
||||||
#~ msgid "%A, %B %-d"
|
|
||||||
#~ msgstr "%A, %B %-d"
|
|
||||||
|
|
||||||
#~ msgctxt "calendar heading"
|
|
||||||
#~ msgid "%A, %B %-d, %Y"
|
|
||||||
#~ msgstr "%A, %B %-d, %Y"
|
|
||||||
|
|
||||||
#~ msgid "%d Connected"
|
|
||||||
#~ msgid_plural "%d Connected"
|
|
||||||
#~ msgstr[0] "%d байланысқан"
|
|
||||||
|
|
||||||
#~ msgid "Off"
|
|
||||||
#~ msgstr "Сөнд."
|
|
||||||
|
|
||||||
#~ msgid "On"
|
|
||||||
#~ msgstr "Іске қос."
|
|
||||||
|
|
||||||
#~ msgid ""
|
#~ msgid ""
|
||||||
#~ "Keybinding that pauses and resumes all running tweens, for debugging "
|
#~ "Keybinding that pauses and resumes all running tweens, for debugging "
|
||||||
#~ "purposes"
|
#~ "purposes"
|
||||||
@@ -2945,6 +2927,21 @@ msgstr "Жүйелік дыбыстар"
|
|||||||
#~ msgid "Sign In"
|
#~ msgid "Sign In"
|
||||||
#~ msgstr "Кіру"
|
#~ msgstr "Кіру"
|
||||||
|
|
||||||
|
#~ msgid "Frequently used applications will appear here"
|
||||||
|
#~ msgstr "Жиі қолданылатын қолданбалар осында көрінеді"
|
||||||
|
|
||||||
|
#~ msgid "Frequent"
|
||||||
|
#~ msgstr "Жиі қолданылатын"
|
||||||
|
|
||||||
|
#~ msgid "All"
|
||||||
|
#~ msgstr "Барлығы"
|
||||||
|
|
||||||
|
#~| msgctxt "calendar heading"
|
||||||
|
#~| msgid "%A, %B %d, %Y"
|
||||||
|
#~ msgctxt "calendar heading"
|
||||||
|
#~ msgid "%A, %B %-d, %Y"
|
||||||
|
#~ msgstr "%A, %B %-d, %Y"
|
||||||
|
|
||||||
#~ msgid "Password:"
|
#~ msgid "Password:"
|
||||||
#~ msgstr "Пароль:"
|
#~ msgstr "Пароль:"
|
||||||
|
|
||||||
@@ -2974,6 +2971,16 @@ msgstr "Жүйелік дыбыстар"
|
|||||||
#~ msgid_plural "%d new notifications"
|
#~ msgid_plural "%d new notifications"
|
||||||
#~ msgstr[0] "%d жаңа ескерту"
|
#~ msgstr[0] "%d жаңа ескерту"
|
||||||
|
|
||||||
|
#~ msgid "%d Connected"
|
||||||
|
#~ msgid_plural "%d Connected"
|
||||||
|
#~ msgstr[0] "%d байланысқан"
|
||||||
|
|
||||||
|
#~ msgid "Off"
|
||||||
|
#~ msgstr "Сөнд."
|
||||||
|
|
||||||
|
#~ msgid "On"
|
||||||
|
#~ msgstr "Іске қос."
|
||||||
|
|
||||||
#~ msgid "Account Settings"
|
#~ msgid "Account Settings"
|
||||||
#~ msgstr "Тіркелгі баптаулары"
|
#~ msgstr "Тіркелгі баптаулары"
|
||||||
|
|
||||||
|
906
po/pt_BR.po
906
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
159
po/ro.po
159
po/ro.po
@@ -10,8 +10,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-07-21 05:44+0000\n"
|
"POT-Creation-Date: 2020-06-09 19:41+0000\n"
|
||||||
"PO-Revision-Date: 2020-07-21 09:07+0200\n"
|
"PO-Revision-Date: 2020-06-17 18:47+0300\n"
|
||||||
"Last-Translator: Florentina Mușat <florentina [dot] musat [dot] 28 [at] "
|
"Last-Translator: Florentina Mușat <florentina [dot] musat [dot] 28 [at] "
|
||||||
"gmail [dot] com>\n"
|
"gmail [dot] com>\n"
|
||||||
"Language-Team: Gnome Romanian Translation Team <gnomero-list@lists."
|
"Language-Team: Gnome Romanian Translation Team <gnomero-list@lists."
|
||||||
@@ -224,112 +224,95 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Activează un API D-Bus care permite introspecția stării aplicației shell."
|
"Activează un API D-Bus care permite introspecția stării aplicației shell."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:114
|
#: data/org.gnome.shell.gschema.xml.in:119
|
||||||
msgid "Layout of the app picker"
|
|
||||||
msgstr "Aspectul selectorului de aplicații"
|
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:115
|
|
||||||
msgid ""
|
|
||||||
"Layout of the app picker. Each entry in the array is a page. Pages are "
|
|
||||||
"stored in the order they appear in GNOME Shell. Each page contains an "
|
|
||||||
"“application id” → 'data' pair. Currently, the following values are stored "
|
|
||||||
"as 'data': • “position”: the position of the application icon in the page"
|
|
||||||
msgstr ""
|
|
||||||
"Aspectul selectorului de aplicații. Fiecare intrare din matrice este o "
|
|
||||||
"pagină. Paginile sunt stocate în ordinea în care apar în GNOME Shell. "
|
|
||||||
"Fiecare pagină conține o pereche de „id aplicație” → „date”. Momentan, "
|
|
||||||
"următoarele valori sunt stocate ca „data”: • „poziție”: poziția iconiței "
|
|
||||||
"aplicației în pagină."
|
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:130
|
|
||||||
msgid "Keybinding to open the application menu"
|
msgid "Keybinding to open the application menu"
|
||||||
msgstr "Combinație de taste pentru deschiderea meniului aplicației"
|
msgstr "Combinație de taste pentru deschiderea meniului aplicației"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:131
|
#: data/org.gnome.shell.gschema.xml.in:120
|
||||||
msgid "Keybinding to open the application menu."
|
msgid "Keybinding to open the application menu."
|
||||||
msgstr "Combinație de taste pentru deschiderea meniului aplicației."
|
msgstr "Combinație de taste pentru deschiderea meniului aplicației."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:137
|
#: data/org.gnome.shell.gschema.xml.in:126
|
||||||
msgid "Keybinding to open the “Show Applications” view"
|
msgid "Keybinding to open the “Show Applications” view"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Combinație de taste pentru deschiderea modului de afișare „Arată aplicațiile”"
|
"Combinație de taste pentru deschiderea modului de afișare „Arată aplicațiile”"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:138
|
#: data/org.gnome.shell.gschema.xml.in:127
|
||||||
msgid ""
|
msgid ""
|
||||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Combinație de taste pentru deschiderea modului de afișare „Arată "
|
"Combinație de taste pentru deschiderea modului de afișare „Arată "
|
||||||
"aplicațiile” a prezentării generale a activităților."
|
"aplicațiile” a prezentării generale a activităților."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:145
|
#: data/org.gnome.shell.gschema.xml.in:134
|
||||||
msgid "Keybinding to open the overview"
|
msgid "Keybinding to open the overview"
|
||||||
msgstr "Combinație de taste pentru deschiderea prezentării generale"
|
msgstr "Combinație de taste pentru deschiderea prezentării generale"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:146
|
#: data/org.gnome.shell.gschema.xml.in:135
|
||||||
msgid "Keybinding to open the Activities Overview."
|
msgid "Keybinding to open the Activities Overview."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Combinație de taste pentru deschiderea prezentării generale a activităților."
|
"Combinație de taste pentru deschiderea prezentării generale a activităților."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:152
|
#: data/org.gnome.shell.gschema.xml.in:141
|
||||||
msgid "Keybinding to toggle the visibility of the notification list"
|
msgid "Keybinding to toggle the visibility of the notification list"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Combinație de taste pentru comutarea vizibilității listei de notificare"
|
"Combinație de taste pentru comutarea vizibilității listei de notificare"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:153
|
#: data/org.gnome.shell.gschema.xml.in:142
|
||||||
msgid "Keybinding to toggle the visibility of the notification list."
|
msgid "Keybinding to toggle the visibility of the notification list."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Combinație de taste pentru comutarea vizibilității listei de notificare."
|
"Combinație de taste pentru comutarea vizibilității listei de notificare."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:159
|
#: data/org.gnome.shell.gschema.xml.in:148
|
||||||
msgid "Keybinding to focus the active notification"
|
msgid "Keybinding to focus the active notification"
|
||||||
msgstr "Combinație de taste pentru focalizarea notificării active"
|
msgstr "Combinație de taste pentru focalizarea notificării active"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:160
|
#: data/org.gnome.shell.gschema.xml.in:149
|
||||||
msgid "Keybinding to focus the active notification."
|
msgid "Keybinding to focus the active notification."
|
||||||
msgstr "Combinație de taste pentru focalizarea notificării active."
|
msgstr "Combinație de taste pentru focalizarea notificării active."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:166
|
#: data/org.gnome.shell.gschema.xml.in:155
|
||||||
msgid "Switch to application 1"
|
msgid "Switch to application 1"
|
||||||
msgstr "Comută la aplicația 1"
|
msgstr "Comută la aplicația 1"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:170
|
#: data/org.gnome.shell.gschema.xml.in:159
|
||||||
msgid "Switch to application 2"
|
msgid "Switch to application 2"
|
||||||
msgstr "Comută la aplicația 2"
|
msgstr "Comută la aplicația 2"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:174
|
#: data/org.gnome.shell.gschema.xml.in:163
|
||||||
msgid "Switch to application 3"
|
msgid "Switch to application 3"
|
||||||
msgstr "Comută la aplicația 3"
|
msgstr "Comută la aplicația 3"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:178
|
#: data/org.gnome.shell.gschema.xml.in:167
|
||||||
msgid "Switch to application 4"
|
msgid "Switch to application 4"
|
||||||
msgstr "Comută la aplicația 4"
|
msgstr "Comută la aplicația 4"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:182
|
#: data/org.gnome.shell.gschema.xml.in:171
|
||||||
msgid "Switch to application 5"
|
msgid "Switch to application 5"
|
||||||
msgstr "Comută la aplicația 5"
|
msgstr "Comută la aplicația 5"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:186
|
#: data/org.gnome.shell.gschema.xml.in:175
|
||||||
msgid "Switch to application 6"
|
msgid "Switch to application 6"
|
||||||
msgstr "Comută la aplicația 6"
|
msgstr "Comută la aplicația 6"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:190
|
#: data/org.gnome.shell.gschema.xml.in:179
|
||||||
msgid "Switch to application 7"
|
msgid "Switch to application 7"
|
||||||
msgstr "Comută la aplicația 7"
|
msgstr "Comută la aplicația 7"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:194
|
#: data/org.gnome.shell.gschema.xml.in:183
|
||||||
msgid "Switch to application 8"
|
msgid "Switch to application 8"
|
||||||
msgstr "Comută la aplicația 8"
|
msgstr "Comută la aplicația 8"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:198
|
#: data/org.gnome.shell.gschema.xml.in:187
|
||||||
msgid "Switch to application 9"
|
msgid "Switch to application 9"
|
||||||
msgstr "Comută la aplicația 9"
|
msgstr "Comută la aplicația 9"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:207
|
#: data/org.gnome.shell.gschema.xml.in:196
|
||||||
#: data/org.gnome.shell.gschema.xml.in:234
|
#: data/org.gnome.shell.gschema.xml.in:223
|
||||||
msgid "Limit switcher to current workspace."
|
msgid "Limit switcher to current workspace."
|
||||||
msgstr "Limitează comutatorul la spațiul de lucru curent."
|
msgstr "Limitează comutatorul la spațiul de lucru curent."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:208
|
#: data/org.gnome.shell.gschema.xml.in:197
|
||||||
msgid ""
|
msgid ""
|
||||||
"If true, only applications that have windows on the current workspace are "
|
"If true, only applications that have windows on the current workspace are "
|
||||||
"shown in the switcher. Otherwise, all applications are included."
|
"shown in the switcher. Otherwise, all applications are included."
|
||||||
@@ -337,11 +320,11 @@ msgstr ""
|
|||||||
"Dacă este activat, doar aplicațiile care au ferestre în spațiul de lucru "
|
"Dacă este activat, doar aplicațiile care au ferestre în spațiul de lucru "
|
||||||
"curent sunt arătate în comutator. Altfel, toate aplicațiile sunt incluse."
|
"curent sunt arătate în comutator. Altfel, toate aplicațiile sunt incluse."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:225
|
#: data/org.gnome.shell.gschema.xml.in:214
|
||||||
msgid "The application icon mode."
|
msgid "The application icon mode."
|
||||||
msgstr "Miniatură și pictograma aplicației."
|
msgstr "Miniatură și pictograma aplicației."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:226
|
#: data/org.gnome.shell.gschema.xml.in:215
|
||||||
msgid ""
|
msgid ""
|
||||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||||
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
|
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
|
||||||
@@ -351,7 +334,7 @@ msgstr ""
|
|||||||
"Posibilități valide sunt „mod miniatură” (arată o miniatură a ferestrei) "
|
"Posibilități valide sunt „mod miniatură” (arată o miniatură a ferestrei) "
|
||||||
"„mod iconiță” (arată doar iconița aplicației) sau „ambele”."
|
"„mod iconiță” (arată doar iconița aplicației) sau „ambele”."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:235
|
#: data/org.gnome.shell.gschema.xml.in:224
|
||||||
msgid ""
|
msgid ""
|
||||||
"If true, only windows from the current workspace are shown in the switcher. "
|
"If true, only windows from the current workspace are shown in the switcher. "
|
||||||
"Otherwise, all windows are included."
|
"Otherwise, all windows are included."
|
||||||
@@ -359,59 +342,59 @@ msgstr ""
|
|||||||
"Dacă este activat, doar ferestrele din spațiul de lucru curent sunt arătate "
|
"Dacă este activat, doar ferestrele din spațiul de lucru curent sunt arătate "
|
||||||
"în comutator. Altfel, toate ferestrele sunt incluse."
|
"în comutator. Altfel, toate ferestrele sunt incluse."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:245
|
#: data/org.gnome.shell.gschema.xml.in:234
|
||||||
msgid "Locations"
|
msgid "Locations"
|
||||||
msgstr "Locații"
|
msgstr "Locații"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:246
|
#: data/org.gnome.shell.gschema.xml.in:235
|
||||||
msgid "The locations to show in world clocks"
|
msgid "The locations to show in world clocks"
|
||||||
msgstr "Locațiile de arătat în ceasuri globale"
|
msgstr "Locațiile de arătat în ceasuri globale"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:256
|
#: data/org.gnome.shell.gschema.xml.in:245
|
||||||
msgid "Automatic location"
|
msgid "Automatic location"
|
||||||
msgstr "Locație automată"
|
msgstr "Locație automată"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:257
|
#: data/org.gnome.shell.gschema.xml.in:246
|
||||||
msgid "Whether to fetch the current location or not"
|
msgid "Whether to fetch the current location or not"
|
||||||
msgstr "Dacă să se obțină locația curentă"
|
msgstr "Dacă să se obțină locația curentă"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:264
|
#: data/org.gnome.shell.gschema.xml.in:253
|
||||||
msgid "Location"
|
msgid "Location"
|
||||||
msgstr "Locație"
|
msgstr "Locație"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:265
|
#: data/org.gnome.shell.gschema.xml.in:254
|
||||||
msgid "The location for which to show a forecast"
|
msgid "The location for which to show a forecast"
|
||||||
msgstr "Locația pentru care să se arate o prognoză"
|
msgstr "Locația pentru care să se arate o prognoză"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:277
|
#: data/org.gnome.shell.gschema.xml.in:266
|
||||||
msgid "Attach modal dialog to the parent window"
|
msgid "Attach modal dialog to the parent window"
|
||||||
msgstr "Atașează dialogul modal la fereastra părinte"
|
msgstr "Atașează dialogul modal la fereastra părinte"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:278
|
#: data/org.gnome.shell.gschema.xml.in:267
|
||||||
#: data/org.gnome.shell.gschema.xml.in:287
|
#: data/org.gnome.shell.gschema.xml.in:276
|
||||||
#: data/org.gnome.shell.gschema.xml.in:295
|
#: data/org.gnome.shell.gschema.xml.in:284
|
||||||
#: data/org.gnome.shell.gschema.xml.in:303
|
#: data/org.gnome.shell.gschema.xml.in:292
|
||||||
#: data/org.gnome.shell.gschema.xml.in:311
|
#: data/org.gnome.shell.gschema.xml.in:300
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Această cheie suprascrie cheia corespondentă din org.gnome.mutter când "
|
"Această cheie suprascrie cheia corespondentă din org.gnome.mutter când "
|
||||||
"Vizualizatorul activităților GNOME rulează."
|
"Vizualizatorul activităților GNOME rulează."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:286
|
#: data/org.gnome.shell.gschema.xml.in:275
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Activează mozaic lateral la plasarea ferestrelor pe marginile ecranului"
|
"Activează mozaic lateral la plasarea ferestrelor pe marginile ecranului"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:294
|
#: data/org.gnome.shell.gschema.xml.in:283
|
||||||
msgid "Workspaces are managed dynamically"
|
msgid "Workspaces are managed dynamically"
|
||||||
msgstr "Spațiile de lucru sunt gestionate în mod dinamic"
|
msgstr "Spațiile de lucru sunt gestionate în mod dinamic"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:302
|
#: data/org.gnome.shell.gschema.xml.in:291
|
||||||
msgid "Workspaces only on primary monitor"
|
msgid "Workspaces only on primary monitor"
|
||||||
msgstr "Spații de lucru doar pe monitorul principal"
|
msgstr "Spații de lucru doar pe monitorul principal"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:310
|
#: data/org.gnome.shell.gschema.xml.in:299
|
||||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Întârzie schimbările de focalizare în maus până când cursorul încetează să "
|
"Întârzie schimbările de focalizare în maus până când cursorul încetează să "
|
||||||
@@ -450,7 +433,7 @@ msgstr "Vizitează pagina principală a extensiei"
|
|||||||
|
|
||||||
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
|
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
|
||||||
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
|
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
|
||||||
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:183
|
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181
|
||||||
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
|
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
|
||||||
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
@@ -492,7 +475,7 @@ msgstr "Nume de utilizator"
|
|||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Fereastră de autentificare"
|
msgstr "Fereastră de autentificare"
|
||||||
|
|
||||||
#: js/gdm/util.js:355
|
#: js/gdm/util.js:345
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "Eroare de autentificare"
|
msgstr "Eroare de autentificare"
|
||||||
|
|
||||||
@@ -501,7 +484,7 @@ msgstr "Eroare de autentificare"
|
|||||||
#. as a cue to display our own message.
|
#. as a cue to display our own message.
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
#: js/gdm/util.js:481
|
#: js/gdm/util.js:471
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(sau treceți degetul peste)"
|
msgstr "(sau treceți degetul peste)"
|
||||||
|
|
||||||
@@ -744,36 +727,36 @@ msgstr "Refuză accesul"
|
|||||||
msgid "Grant Access"
|
msgid "Grant Access"
|
||||||
msgstr "Permite accesul"
|
msgstr "Permite accesul"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:1297
|
#: js/ui/appDisplay.js:902
|
||||||
msgid "Unnamed Folder"
|
msgid "Unnamed Folder"
|
||||||
msgstr "Dosar nedenumit"
|
msgstr "Dosar nedenumit"
|
||||||
|
|
||||||
#. 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:2767 js/ui/panel.js:75
|
#: js/ui/appDisplay.js:2241 js/ui/panel.js:75
|
||||||
msgid "Open Windows"
|
msgid "Open Windows"
|
||||||
msgstr "Ferestre deschise"
|
msgstr "Ferestre deschise"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2786 js/ui/panel.js:82
|
#: js/ui/appDisplay.js:2260 js/ui/panel.js:82
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Fereastră nouă"
|
msgstr "Fereastră nouă"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2802
|
#: js/ui/appDisplay.js:2276
|
||||||
msgid "Launch using Integrated Graphics Card"
|
msgid "Launch using Integrated Graphics Card"
|
||||||
msgstr "Lansează folosind placa grafică integrată"
|
msgstr "Lansează folosind placa grafică integrată"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2803
|
#: js/ui/appDisplay.js:2277
|
||||||
msgid "Launch using Discrete Graphics Card"
|
msgid "Launch using Discrete Graphics Card"
|
||||||
msgstr "Lansează folosind placa grafică discretă"
|
msgstr "Lansează folosind placa grafică discretă"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2831 js/ui/dash.js:239
|
#: js/ui/appDisplay.js:2305 js/ui/dash.js:239
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Elimină din favorite"
|
msgstr "Elimină din favorite"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2837
|
#: js/ui/appDisplay.js:2311
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Adaugă la Favorite"
|
msgstr "Adaugă la Favorite"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2847 js/ui/panel.js:93
|
#: js/ui/appDisplay.js:2321 js/ui/panel.js:93
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "Arată detaliile"
|
msgstr "Arată detaliile"
|
||||||
|
|
||||||
@@ -803,7 +786,7 @@ msgstr "Căști auriculare"
|
|||||||
msgid "Headset"
|
msgid "Headset"
|
||||||
msgstr "Căști cu microfon"
|
msgstr "Căști cu microfon"
|
||||||
|
|
||||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Microfon"
|
msgstr "Microfon"
|
||||||
|
|
||||||
@@ -1317,15 +1300,15 @@ msgstr "%s (la distanță)"
|
|||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (consolă)"
|
msgstr "%s (consolă)"
|
||||||
|
|
||||||
#: js/ui/extensionDownloader.js:187
|
#: js/ui/extensionDownloader.js:185
|
||||||
msgid "Install"
|
msgid "Install"
|
||||||
msgstr "Instalează"
|
msgstr "Instalează"
|
||||||
|
|
||||||
#: js/ui/extensionDownloader.js:193
|
#: js/ui/extensionDownloader.js:191
|
||||||
msgid "Install Extension"
|
msgid "Install Extension"
|
||||||
msgstr "Instalează extensia"
|
msgstr "Instalează extensia"
|
||||||
|
|
||||||
#: js/ui/extensionDownloader.js:194
|
#: js/ui/extensionDownloader.js:192
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||||
msgstr "Descărcați și instalați „%s” de la extensions.gnome.org?"
|
msgstr "Descărcați și instalați „%s” de la extensions.gnome.org?"
|
||||||
@@ -1358,11 +1341,11 @@ msgstr "O aplicație vrea să inhibe scurtăturile"
|
|||||||
msgid "You can restore shortcuts by pressing %s."
|
msgid "You can restore shortcuts by pressing %s."
|
||||||
msgstr "Puteți restaura scurtăturile apăsând %s."
|
msgstr "Puteți restaura scurtăturile apăsând %s."
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:100
|
#: js/ui/inhibitShortcutsDialog.js:98
|
||||||
msgid "Deny"
|
msgid "Deny"
|
||||||
msgstr "Refuză"
|
msgstr "Refuză"
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:107
|
#: js/ui/inhibitShortcutsDialog.js:105
|
||||||
msgid "Allow"
|
msgid "Allow"
|
||||||
msgstr "Permite"
|
msgstr "Permite"
|
||||||
|
|
||||||
@@ -1431,7 +1414,7 @@ msgstr "Oprește"
|
|||||||
msgid "Leave Off"
|
msgid "Leave Off"
|
||||||
msgstr "Lasă oprit"
|
msgstr "Lasă oprit"
|
||||||
|
|
||||||
#: js/ui/keyboard.js:225
|
#: js/ui/keyboard.js:207
|
||||||
msgid "Region & Language Settings"
|
msgid "Region & Language Settings"
|
||||||
msgstr "Configurări de regiune și limbă"
|
msgstr "Configurări de regiune și limbă"
|
||||||
|
|
||||||
@@ -1505,7 +1488,7 @@ msgstr "Blocarea ecranului este dezactivată"
|
|||||||
msgid "Screen Locking requires the GNOME display manager."
|
msgid "Screen Locking requires the GNOME display manager."
|
||||||
msgstr "Blocarea ecranului necesită administratorul de afișaj GNOME."
|
msgstr "Blocarea ecranului necesită administratorul de afișaj GNOME."
|
||||||
|
|
||||||
#: js/ui/messageTray.js:1476
|
#: js/ui/messageTray.js:1547
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Informații despre sistem"
|
msgstr "Informații despre sistem"
|
||||||
|
|
||||||
@@ -1517,13 +1500,13 @@ msgstr "Artist necunoscut"
|
|||||||
msgid "Unknown title"
|
msgid "Unknown title"
|
||||||
msgstr "Titlu necunoscut"
|
msgstr "Titlu necunoscut"
|
||||||
|
|
||||||
#: js/ui/overview.js:74
|
#: js/ui/overview.js:73
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Anulează"
|
msgstr "Anulează"
|
||||||
|
|
||||||
#. Translators: This is the main view to select
|
#. Translators: This is the main view to select
|
||||||
#. activities. See also note for "Activities" string.
|
#. activities. See also note for "Activities" string.
|
||||||
#: js/ui/overview.js:87
|
#: js/ui/overview.js:86
|
||||||
msgid "Overview"
|
msgid "Overview"
|
||||||
msgstr "Prezentare generală"
|
msgstr "Prezentare generală"
|
||||||
|
|
||||||
@@ -1531,7 +1514,7 @@ msgstr "Prezentare generală"
|
|||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
#: js/ui/overview.js:108
|
#: js/ui/overview.js:107
|
||||||
msgid "Type to search"
|
msgid "Type to search"
|
||||||
msgstr "Tastați pentru a căuta"
|
msgstr "Tastați pentru a căuta"
|
||||||
|
|
||||||
@@ -2189,11 +2172,11 @@ msgstr "Eroare de autorizare Thunderbolt"
|
|||||||
msgid "Could not authorize the Thunderbolt device: %s"
|
msgid "Could not authorize the Thunderbolt device: %s"
|
||||||
msgstr "Nu s-a putut autoriza dispozitivul Thunderbolt: %s"
|
msgstr "Nu s-a putut autoriza dispozitivul Thunderbolt: %s"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:155
|
#: js/ui/status/volume.js:154
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "Volumul a fost schimbat"
|
msgstr "Volumul a fost schimbat"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:217
|
#: js/ui/status/volume.js:225
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Volum"
|
msgstr "Volum"
|
||||||
|
|
||||||
@@ -2239,11 +2222,11 @@ msgstr "Glisați în sus pentru a debloca"
|
|||||||
msgid "Click or press a key to unlock"
|
msgid "Click or press a key to unlock"
|
||||||
msgstr "Apăsați clic sau o tastă pentru a debloca"
|
msgstr "Apăsați clic sau o tastă pentru a debloca"
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:555
|
#: js/ui/unlockDialog.js:550
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Deblochează fereastră"
|
msgstr "Deblochează fereastră"
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:564
|
#: js/ui/unlockDialog.js:559
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Intră în sesiune ca utilizator diferit"
|
msgstr "Intră în sesiune ca utilizator diferit"
|
||||||
|
|
||||||
@@ -2379,12 +2362,12 @@ msgstr "Utilizează un mod specific, de exemplu „gdm” pentru ecranul de loga
|
|||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Enumeră câmpurile care pot fi afișate"
|
msgstr "Enumeră câmpurile care pot fi afișate"
|
||||||
|
|
||||||
#: src/shell-app.c:268
|
#: src/shell-app.c:286
|
||||||
msgctxt "program"
|
msgctxt "program"
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Necunoscut"
|
msgstr "Necunoscut"
|
||||||
|
|
||||||
#: src/shell-app.c:519
|
#: src/shell-app.c:537
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to launch “%s”"
|
msgid "Failed to launch “%s”"
|
||||||
msgstr "Nu s-a putut lansa „%s”"
|
msgstr "Nu s-a putut lansa „%s”"
|
||||||
|
194
po/uk.po
194
po/uk.po
@@ -10,8 +10,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-07-20 16:18+0000\n"
|
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
|
||||||
"PO-Revision-Date: 2020-07-21 08:42+0300\n"
|
"PO-Revision-Date: 2020-06-06 15:53+0300\n"
|
||||||
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
|
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
|
||||||
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
|
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
|
||||||
"Language: uk\n"
|
"Language: uk\n"
|
||||||
@@ -216,106 +216,89 @@ msgid ""
|
|||||||
"shell."
|
"shell."
|
||||||
msgstr "Вмикає D-Bus API для самоаналізу стану оболонки."
|
msgstr "Вмикає D-Bus API для самоаналізу стану оболонки."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:114
|
#: data/org.gnome.shell.gschema.xml.in:119
|
||||||
msgid "Layout of the app picker"
|
|
||||||
msgstr "Компонування засобу вибору програм"
|
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:115
|
|
||||||
msgid ""
|
|
||||||
"Layout of the app picker. Each entry in the array is a page. Pages are "
|
|
||||||
"stored in the order they appear in GNOME Shell. Each page contains an "
|
|
||||||
"“application id” → 'data' pair. Currently, the following values are stored "
|
|
||||||
"as 'data': • “position”: the position of the application icon in the page"
|
|
||||||
msgstr ""
|
|
||||||
"Компонування засобу вибору програм. Кожен запис у цьому масиві є сторінкою."
|
|
||||||
" Сторінки зберігаються у порядку, у якому їх буде показано у GNOME Shell."
|
|
||||||
" Кожна сторінка містить пану записів “ідентифікатор програми” → 'дані'. У"
|
|
||||||
" поточній версії як 'дані' може бути збережено такі значення: • “позиція”:"
|
|
||||||
" позиція піктограми програми на сторінці"
|
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:130
|
|
||||||
msgid "Keybinding to open the application menu"
|
msgid "Keybinding to open the application menu"
|
||||||
msgstr "Комбінація клавіш, щоб відкрити меню програм"
|
msgstr "Комбінація клавіш, щоб відкрити меню програм"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:131
|
#: data/org.gnome.shell.gschema.xml.in:120
|
||||||
msgid "Keybinding to open the application menu."
|
msgid "Keybinding to open the application menu."
|
||||||
msgstr "Комбінація клавіш, щоб відкрити меню програм."
|
msgstr "Комбінація клавіш, щоб відкрити меню програм."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:137
|
#: data/org.gnome.shell.gschema.xml.in:126
|
||||||
msgid "Keybinding to open the “Show Applications” view"
|
msgid "Keybinding to open the “Show Applications” view"
|
||||||
msgstr "Комбінація клавіш, щоб «Показати програми»"
|
msgstr "Комбінація клавіш, щоб «Показати програми»"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:138
|
#: data/org.gnome.shell.gschema.xml.in:127
|
||||||
msgid ""
|
msgid ""
|
||||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
||||||
msgstr "Комбінація клавіш, щоб «Показати програми» в огляді діяльності."
|
msgstr "Комбінація клавіш, щоб «Показати програми» в огляді діяльності."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:145
|
#: data/org.gnome.shell.gschema.xml.in:134
|
||||||
msgid "Keybinding to open the overview"
|
msgid "Keybinding to open the overview"
|
||||||
msgstr "Комбінація клавіш, щоб відкрити огляд"
|
msgstr "Комбінація клавіш, щоб відкрити огляд"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:146
|
#: data/org.gnome.shell.gschema.xml.in:135
|
||||||
msgid "Keybinding to open the Activities Overview."
|
msgid "Keybinding to open the Activities Overview."
|
||||||
msgstr "Комбінація клавіш, щоб відкрити огляд діяльності."
|
msgstr "Комбінація клавіш, щоб відкрити огляд діяльності."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:152
|
#: data/org.gnome.shell.gschema.xml.in:141
|
||||||
msgid "Keybinding to toggle the visibility of the notification list"
|
msgid "Keybinding to toggle the visibility of the notification list"
|
||||||
msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень"
|
msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:153
|
#: data/org.gnome.shell.gschema.xml.in:142
|
||||||
msgid "Keybinding to toggle the visibility of the notification list."
|
msgid "Keybinding to toggle the visibility of the notification list."
|
||||||
msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень."
|
msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:159
|
#: data/org.gnome.shell.gschema.xml.in:148
|
||||||
msgid "Keybinding to focus the active notification"
|
msgid "Keybinding to focus the active notification"
|
||||||
msgstr "Комбінація клавіш, щоб перейти до активних сповіщень"
|
msgstr "Комбінація клавіш, щоб перейти до активних сповіщень"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:160
|
#: data/org.gnome.shell.gschema.xml.in:149
|
||||||
msgid "Keybinding to focus the active notification."
|
msgid "Keybinding to focus the active notification."
|
||||||
msgstr "Комбінація клавіш, щоб перейти до активних сповіщень."
|
msgstr "Комбінація клавіш, щоб перейти до активних сповіщень."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:166
|
#: data/org.gnome.shell.gschema.xml.in:155
|
||||||
msgid "Switch to application 1"
|
msgid "Switch to application 1"
|
||||||
msgstr "Перемкнутися на програму 1"
|
msgstr "Перемкнутися на програму 1"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:170
|
#: data/org.gnome.shell.gschema.xml.in:159
|
||||||
msgid "Switch to application 2"
|
msgid "Switch to application 2"
|
||||||
msgstr "Перемкнутися на програму 2"
|
msgstr "Перемкнутися на програму 2"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:174
|
#: data/org.gnome.shell.gschema.xml.in:163
|
||||||
msgid "Switch to application 3"
|
msgid "Switch to application 3"
|
||||||
msgstr "Перемкнутися на програму 3"
|
msgstr "Перемкнутися на програму 3"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:178
|
#: data/org.gnome.shell.gschema.xml.in:167
|
||||||
msgid "Switch to application 4"
|
msgid "Switch to application 4"
|
||||||
msgstr "Перемкнутися на програму 4"
|
msgstr "Перемкнутися на програму 4"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:182
|
#: data/org.gnome.shell.gschema.xml.in:171
|
||||||
msgid "Switch to application 5"
|
msgid "Switch to application 5"
|
||||||
msgstr "Перемкнутися на програму 5"
|
msgstr "Перемкнутися на програму 5"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:186
|
#: data/org.gnome.shell.gschema.xml.in:175
|
||||||
msgid "Switch to application 6"
|
msgid "Switch to application 6"
|
||||||
msgstr "Перемкнутися на програму 6"
|
msgstr "Перемкнутися на програму 6"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:190
|
#: data/org.gnome.shell.gschema.xml.in:179
|
||||||
msgid "Switch to application 7"
|
msgid "Switch to application 7"
|
||||||
msgstr "Перемкнутися на програму 7"
|
msgstr "Перемкнутися на програму 7"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:194
|
#: data/org.gnome.shell.gschema.xml.in:183
|
||||||
msgid "Switch to application 8"
|
msgid "Switch to application 8"
|
||||||
msgstr "Перемкнутися на програму 8"
|
msgstr "Перемкнутися на програму 8"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:198
|
#: data/org.gnome.shell.gschema.xml.in:187
|
||||||
msgid "Switch to application 9"
|
msgid "Switch to application 9"
|
||||||
msgstr "Перемкнутися на програму 9"
|
msgstr "Перемкнутися на програму 9"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:207
|
#: data/org.gnome.shell.gschema.xml.in:196
|
||||||
#: data/org.gnome.shell.gschema.xml.in:234
|
#: data/org.gnome.shell.gschema.xml.in:223
|
||||||
msgid "Limit switcher to current workspace."
|
msgid "Limit switcher to current workspace."
|
||||||
msgstr "Обмежити перемикач на поточний робочий простір."
|
msgstr "Обмежити перемикач на поточний робочий простір."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:208
|
#: data/org.gnome.shell.gschema.xml.in:197
|
||||||
msgid ""
|
msgid ""
|
||||||
"If true, only applications that have windows on the current workspace are "
|
"If true, only applications that have windows on the current workspace are "
|
||||||
"shown in the switcher. Otherwise, all applications are included."
|
"shown in the switcher. Otherwise, all applications are included."
|
||||||
@@ -323,11 +306,11 @@ msgstr ""
|
|||||||
"Якщо це вказано, то тільки програми з поточного робочого простору будуть "
|
"Якщо це вказано, то тільки програми з поточного робочого простору будуть "
|
||||||
"показані в перемикачі. Інакше — програми з усіх просторів."
|
"показані в перемикачі. Інакше — програми з усіх просторів."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:225
|
#: data/org.gnome.shell.gschema.xml.in:214
|
||||||
msgid "The application icon mode."
|
msgid "The application icon mode."
|
||||||
msgstr "Режим піктограм для програм."
|
msgstr "Режим піктограм для програм."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:226
|
#: data/org.gnome.shell.gschema.xml.in:215
|
||||||
msgid ""
|
msgid ""
|
||||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||||
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
|
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
|
||||||
@@ -337,7 +320,7 @@ msgstr ""
|
|||||||
"«thumbnail-only» (показує мініатюру вікна), «app-icon-only» (показує тільки "
|
"«thumbnail-only» (показує мініатюру вікна), «app-icon-only» (показує тільки "
|
||||||
"піктограми програм) або «both» (обидва)."
|
"піктограми програм) або «both» (обидва)."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:235
|
#: data/org.gnome.shell.gschema.xml.in:224
|
||||||
msgid ""
|
msgid ""
|
||||||
"If true, only windows from the current workspace are shown in the switcher. "
|
"If true, only windows from the current workspace are shown in the switcher. "
|
||||||
"Otherwise, all windows are included."
|
"Otherwise, all windows are included."
|
||||||
@@ -345,57 +328,57 @@ msgstr ""
|
|||||||
"Якщо це вказано, то тільки вікна з поточного робочого простору будуть "
|
"Якщо це вказано, то тільки вікна з поточного робочого простору будуть "
|
||||||
"показані в перемикачі. Інакше — вікна з усіх просторів."
|
"показані в перемикачі. Інакше — вікна з усіх просторів."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:245
|
#: data/org.gnome.shell.gschema.xml.in:234
|
||||||
msgid "Locations"
|
msgid "Locations"
|
||||||
msgstr "Місцевості"
|
msgstr "Місцевості"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:246
|
#: data/org.gnome.shell.gschema.xml.in:235
|
||||||
msgid "The locations to show in world clocks"
|
msgid "The locations to show in world clocks"
|
||||||
msgstr "Місцевість для світового годинника"
|
msgstr "Місцевість для світового годинника"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:256
|
#: data/org.gnome.shell.gschema.xml.in:245
|
||||||
msgid "Automatic location"
|
msgid "Automatic location"
|
||||||
msgstr "Автоматичне визначення місцевості"
|
msgstr "Автоматичне визначення місцевості"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:257
|
#: data/org.gnome.shell.gschema.xml.in:246
|
||||||
msgid "Whether to fetch the current location or not"
|
msgid "Whether to fetch the current location or not"
|
||||||
msgstr "Чи одержувати поточну локацію"
|
msgstr "Чи одержувати поточну локацію"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:264
|
#: data/org.gnome.shell.gschema.xml.in:253
|
||||||
msgid "Location"
|
msgid "Location"
|
||||||
msgstr "Місцевість"
|
msgstr "Місцевість"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:265
|
#: data/org.gnome.shell.gschema.xml.in:254
|
||||||
msgid "The location for which to show a forecast"
|
msgid "The location for which to show a forecast"
|
||||||
msgstr "Місцевість для прогнозу погоди"
|
msgstr "Місцевість для прогнозу погоди"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:277
|
#: data/org.gnome.shell.gschema.xml.in:266
|
||||||
msgid "Attach modal dialog to the parent window"
|
msgid "Attach modal dialog to the parent window"
|
||||||
msgstr "Приєднати модальне вікно до батьківського вікна"
|
msgstr "Приєднати модальне вікно до батьківського вікна"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:278
|
#: data/org.gnome.shell.gschema.xml.in:267
|
||||||
#: data/org.gnome.shell.gschema.xml.in:287
|
#: data/org.gnome.shell.gschema.xml.in:276
|
||||||
#: data/org.gnome.shell.gschema.xml.in:295
|
#: data/org.gnome.shell.gschema.xml.in:284
|
||||||
#: data/org.gnome.shell.gschema.xml.in:303
|
#: data/org.gnome.shell.gschema.xml.in:292
|
||||||
#: data/org.gnome.shell.gschema.xml.in:311
|
#: data/org.gnome.shell.gschema.xml.in:300
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Цей ключ перевизначає ключ у org.gnome.mutter, коли запущено GNOME Shell."
|
"Цей ключ перевизначає ключ у org.gnome.mutter, коли запущено GNOME Shell."
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:286
|
#: data/org.gnome.shell.gschema.xml.in:275
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
msgstr "Увімкнути розбиття країв, коли кладуться вікна на краї екрана"
|
msgstr "Увімкнути розбиття країв, коли кладуться вікна на краї екрана"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:294
|
#: data/org.gnome.shell.gschema.xml.in:283
|
||||||
msgid "Workspaces are managed dynamically"
|
msgid "Workspaces are managed dynamically"
|
||||||
msgstr "Робочі простори організовуються динамічно"
|
msgstr "Робочі простори організовуються динамічно"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:302
|
#: data/org.gnome.shell.gschema.xml.in:291
|
||||||
msgid "Workspaces only on primary monitor"
|
msgid "Workspaces only on primary monitor"
|
||||||
msgstr "Робочий простір лише на основному моніторі"
|
msgstr "Робочий простір лише на основному моніторі"
|
||||||
|
|
||||||
#: data/org.gnome.shell.gschema.xml.in:310
|
#: data/org.gnome.shell.gschema.xml.in:299
|
||||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||||
msgstr "Затримувати зміни фокусу миші, поки вказівник не перестане рухатись"
|
msgstr "Затримувати зміни фокусу миші, поки вказівник не перестане рухатись"
|
||||||
|
|
||||||
@@ -431,7 +414,7 @@ msgstr "Відвідати сторінку розширення"
|
|||||||
|
|
||||||
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
|
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
|
||||||
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
|
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
|
||||||
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:183
|
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181
|
||||||
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
|
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
|
||||||
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
@@ -473,7 +456,7 @@ msgstr "Користувач"
|
|||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Вікно входу"
|
msgstr "Вікно входу"
|
||||||
|
|
||||||
#: js/gdm/util.js:355
|
#: js/gdm/util.js:345
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "Помилка розпізнавання"
|
msgstr "Помилка розпізнавання"
|
||||||
|
|
||||||
@@ -482,7 +465,7 @@ msgstr "Помилка розпізнавання"
|
|||||||
#. as a cue to display our own message.
|
#. as a cue to display our own message.
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
#: js/gdm/util.js:481
|
#: js/gdm/util.js:471
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(або проведіть пальцем)"
|
msgstr "(або проведіть пальцем)"
|
||||||
|
|
||||||
@@ -730,36 +713,36 @@ msgstr "Заборонити доступ"
|
|||||||
msgid "Grant Access"
|
msgid "Grant Access"
|
||||||
msgstr "Надати доступ"
|
msgstr "Надати доступ"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:1297
|
#: js/ui/appDisplay.js:956
|
||||||
msgid "Unnamed Folder"
|
msgid "Unnamed Folder"
|
||||||
msgstr "Неназвана тека"
|
msgstr "Неназвана тека"
|
||||||
|
|
||||||
#. 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:2767 js/ui/panel.js:75
|
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
|
||||||
msgid "Open Windows"
|
msgid "Open Windows"
|
||||||
msgstr "Відкрити вікна"
|
msgstr "Відкрити вікна"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2786 js/ui/panel.js:82
|
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Нове вікно"
|
msgstr "Нове вікно"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2802
|
#: js/ui/appDisplay.js:2250
|
||||||
msgid "Launch using Integrated Graphics Card"
|
msgid "Launch using Integrated Graphics Card"
|
||||||
msgstr "Запустити через інтегровану графічну плату"
|
msgstr "Запустити через інтегровану графічну плату"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2803
|
#: js/ui/appDisplay.js:2251
|
||||||
msgid "Launch using Discrete Graphics Card"
|
msgid "Launch using Discrete Graphics Card"
|
||||||
msgstr "Запустити через дискретну графічну плату"
|
msgstr "Запустити через дискретну графічну плату"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2831 js/ui/dash.js:239
|
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Вилучити з улюбленого"
|
msgstr "Вилучити з улюбленого"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2837
|
#: js/ui/appDisplay.js:2285
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Додати до улюбленого"
|
msgstr "Додати до улюбленого"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2847 js/ui/panel.js:93
|
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "Показати подробиці"
|
msgstr "Показати подробиці"
|
||||||
|
|
||||||
@@ -789,7 +772,7 @@ msgstr "Навушники"
|
|||||||
msgid "Headset"
|
msgid "Headset"
|
||||||
msgstr "Гарнітура"
|
msgstr "Гарнітура"
|
||||||
|
|
||||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Мікрофон"
|
msgstr "Мікрофон"
|
||||||
|
|
||||||
@@ -1090,12 +1073,14 @@ msgstr "%A %-d %B %Y"
|
|||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: js/ui/dateMenu.js:151
|
#: js/ui/dateMenu.js:151
|
||||||
|
#| msgid "%B %-d %Y"
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%B %-d"
|
msgid "%B %-d"
|
||||||
msgstr "%-d %B"
|
msgstr "%-d %B"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: js/ui/dateMenu.js:154
|
#: js/ui/dateMenu.js:154
|
||||||
|
#| msgid "%B %-d %Y"
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%B %-d %Y"
|
msgid "%B %-d %Y"
|
||||||
msgstr "%-d %B %Y"
|
msgstr "%-d %B %Y"
|
||||||
@@ -1308,15 +1293,15 @@ msgstr "%s (віддалено)"
|
|||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (консоль)"
|
msgstr "%s (консоль)"
|
||||||
|
|
||||||
#: js/ui/extensionDownloader.js:187
|
#: js/ui/extensionDownloader.js:185
|
||||||
msgid "Install"
|
msgid "Install"
|
||||||
msgstr "Встановити"
|
msgstr "Встановити"
|
||||||
|
|
||||||
#: js/ui/extensionDownloader.js:193
|
#: js/ui/extensionDownloader.js:191
|
||||||
msgid "Install Extension"
|
msgid "Install Extension"
|
||||||
msgstr "Встановити розширення"
|
msgstr "Встановити розширення"
|
||||||
|
|
||||||
#: js/ui/extensionDownloader.js:194
|
#: js/ui/extensionDownloader.js:192
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||||
msgstr "Звантажити і встановити «%s» з extensions.gnome.org?"
|
msgstr "Звантажити і встановити «%s» з extensions.gnome.org?"
|
||||||
@@ -1349,11 +1334,11 @@ msgstr "Програма бажає успадкувати скорочення"
|
|||||||
msgid "You can restore shortcuts by pressing %s."
|
msgid "You can restore shortcuts by pressing %s."
|
||||||
msgstr "Можна відновити скорочення, натиснувши %s."
|
msgstr "Можна відновити скорочення, натиснувши %s."
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:100
|
#: js/ui/inhibitShortcutsDialog.js:98
|
||||||
msgid "Deny"
|
msgid "Deny"
|
||||||
msgstr "Заборонити"
|
msgstr "Заборонити"
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:107
|
#: js/ui/inhibitShortcutsDialog.js:105
|
||||||
msgid "Allow"
|
msgid "Allow"
|
||||||
msgstr "Дозволити"
|
msgstr "Дозволити"
|
||||||
|
|
||||||
@@ -1419,7 +1404,7 @@ msgstr "Вимкнути"
|
|||||||
msgid "Leave Off"
|
msgid "Leave Off"
|
||||||
msgstr "Покинути"
|
msgstr "Покинути"
|
||||||
|
|
||||||
#: js/ui/keyboard.js:225
|
#: js/ui/keyboard.js:207
|
||||||
msgid "Region & Language Settings"
|
msgid "Region & Language Settings"
|
||||||
msgstr "Параметри регіону та мови"
|
msgstr "Параметри регіону та мови"
|
||||||
|
|
||||||
@@ -1492,7 +1477,7 @@ msgstr "Блокування екрана вимкнено"
|
|||||||
msgid "Screen Locking requires the GNOME display manager."
|
msgid "Screen Locking requires the GNOME display manager."
|
||||||
msgstr "Блокування екрана потребує керування входом GNOME."
|
msgstr "Блокування екрана потребує керування входом GNOME."
|
||||||
|
|
||||||
#: js/ui/messageTray.js:1476
|
#: js/ui/messageTray.js:1547
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Інформація про систему"
|
msgstr "Інформація про систему"
|
||||||
|
|
||||||
@@ -1504,13 +1489,13 @@ msgstr "Невідомий виконавець"
|
|||||||
msgid "Unknown title"
|
msgid "Unknown title"
|
||||||
msgstr "Невідома назва"
|
msgstr "Невідома назва"
|
||||||
|
|
||||||
#: js/ui/overview.js:74
|
#: js/ui/overview.js:73
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Повернути"
|
msgstr "Повернути"
|
||||||
|
|
||||||
#. Translators: This is the main view to select
|
#. Translators: This is the main view to select
|
||||||
#. activities. See also note for "Activities" string.
|
#. activities. See also note for "Activities" string.
|
||||||
#: js/ui/overview.js:87
|
#: js/ui/overview.js:86
|
||||||
msgid "Overview"
|
msgid "Overview"
|
||||||
msgstr "Огляд"
|
msgstr "Огляд"
|
||||||
|
|
||||||
@@ -1518,7 +1503,7 @@ msgstr "Огляд"
|
|||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
#: js/ui/overview.js:108
|
#: js/ui/overview.js:107
|
||||||
msgid "Type to search"
|
msgid "Type to search"
|
||||||
msgstr "Введіть текст для пошуку"
|
msgstr "Введіть текст для пошуку"
|
||||||
|
|
||||||
@@ -2177,11 +2162,11 @@ msgstr "Помилка завірення Thunderbolt"
|
|||||||
msgid "Could not authorize the Thunderbolt device: %s"
|
msgid "Could not authorize the Thunderbolt device: %s"
|
||||||
msgstr "Неможливо завірити пристрій Thunderbolt: %s"
|
msgstr "Неможливо завірити пристрій Thunderbolt: %s"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:155
|
#: js/ui/status/volume.js:154
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "Гучність змінено"
|
msgstr "Гучність змінено"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:217
|
#: js/ui/status/volume.js:225
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Гучність"
|
msgstr "Гучність"
|
||||||
|
|
||||||
@@ -2227,11 +2212,11 @@ msgstr "Проведіть вгору для розблокування"
|
|||||||
msgid "Click or press a key to unlock"
|
msgid "Click or press a key to unlock"
|
||||||
msgstr "Клацніть або натисніть клавішу для розблокування"
|
msgstr "Клацніть або натисніть клавішу для розблокування"
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:555
|
#: js/ui/unlockDialog.js:550
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Розблокувати вікно"
|
msgstr "Розблокувати вікно"
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:564
|
#: js/ui/unlockDialog.js:559
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Увійти як інший користувач"
|
msgstr "Увійти як інший користувач"
|
||||||
|
|
||||||
@@ -2368,12 +2353,12 @@ msgstr "Використовувати вказаний режим, прикла
|
|||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Перелік можливих режимів"
|
msgstr "Перелік можливих режимів"
|
||||||
|
|
||||||
#: src/shell-app.c:268
|
#: src/shell-app.c:286
|
||||||
msgctxt "program"
|
msgctxt "program"
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Невідомо"
|
msgstr "Невідомо"
|
||||||
|
|
||||||
#: src/shell-app.c:519
|
#: src/shell-app.c:537
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to launch “%s”"
|
msgid "Failed to launch “%s”"
|
||||||
msgstr "Не вдалося запустити «%s»"
|
msgstr "Не вдалося запустити «%s»"
|
||||||
@@ -2953,3 +2938,36 @@ msgstr[3] "%u вхід"
|
|||||||
#: subprojects/gvc/gvc-mixer-control.c:2766
|
#: subprojects/gvc/gvc-mixer-control.c:2766
|
||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Системні звуки"
|
msgstr "Системні звуки"
|
||||||
|
|
||||||
|
#~ msgid "Frequently used applications will appear here"
|
||||||
|
#~ msgstr "Часто використовувані програми будуть з'являтись тут"
|
||||||
|
|
||||||
|
#~ msgid "Frequent"
|
||||||
|
#~ msgstr "Частовживане"
|
||||||
|
|
||||||
|
#~ msgid "All"
|
||||||
|
#~ msgstr "Усе"
|
||||||
|
|
||||||
|
#~ msgctxt "calendar heading"
|
||||||
|
#~ msgid "%A, %B %-d"
|
||||||
|
#~ msgstr "%A, %-d %B"
|
||||||
|
|
||||||
|
#~ msgctxt "calendar heading"
|
||||||
|
#~ msgid "%A, %B %-d, %Y"
|
||||||
|
#~ msgstr "%A, %-d %B, %Y"
|
||||||
|
|
||||||
|
#~ msgid "Copy Error"
|
||||||
|
#~ msgstr "Скопіювати помилку"
|
||||||
|
|
||||||
|
#~ msgid "%d Connected"
|
||||||
|
#~ msgid_plural "%d Connected"
|
||||||
|
#~ msgstr[0] "%d під'єднано"
|
||||||
|
#~ msgstr[1] "%d під'єднано"
|
||||||
|
#~ msgstr[2] "%d під'єднано"
|
||||||
|
#~ msgstr[3] "%d під'єднано"
|
||||||
|
|
||||||
|
#~ msgid "Off"
|
||||||
|
#~ msgstr "Вимкнено"
|
||||||
|
|
||||||
|
#~ msgid "On"
|
||||||
|
#~ msgstr "Увімкнено"
|
||||||
|
204
po/zh_CN.po
204
po/zh_CN.po
@@ -23,8 +23,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-07-12 02:14+0000\n"
|
"POT-Creation-Date: 2020-05-28 11:29+0000\n"
|
||||||
"PO-Revision-Date: 2020-07-11 22:32-0400\n"
|
"PO-Revision-Date: 2020-05-29 09:03-0400\n"
|
||||||
"Last-Translator: Boyuan Yang <073plan@gmail.com>\n"
|
"Last-Translator: Boyuan Yang <073plan@gmail.com>\n"
|
||||||
"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
|
"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
|
||||||
"Language: zh_CN\n"
|
"Language: zh_CN\n"
|
||||||
@@ -444,7 +444,7 @@ msgstr "用户名"
|
|||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "登录窗口"
|
msgstr "登录窗口"
|
||||||
|
|
||||||
#: js/gdm/util.js:355
|
#: js/gdm/util.js:345
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "认证出错"
|
msgstr "认证出错"
|
||||||
|
|
||||||
@@ -453,7 +453,7 @@ msgstr "认证出错"
|
|||||||
#. as a cue to display our own message.
|
#. as a cue to display our own message.
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
#: js/gdm/util.js:481
|
#: js/gdm/util.js:471
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(或滑动手指)"
|
msgstr "(或滑动手指)"
|
||||||
|
|
||||||
@@ -559,7 +559,7 @@ msgid "%d hour ago"
|
|||||||
msgid_plural "%d hours ago"
|
msgid_plural "%d hours ago"
|
||||||
msgstr[0] "%d 小时前"
|
msgstr[0] "%d 小时前"
|
||||||
|
|
||||||
#: js/misc/util.js:191 js/ui/dateMenu.js:162
|
#: js/misc/util.js:191
|
||||||
msgid "Yesterday"
|
msgid "Yesterday"
|
||||||
msgstr "昨天"
|
msgstr "昨天"
|
||||||
|
|
||||||
@@ -672,44 +672,44 @@ 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:369
|
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374
|
||||||
msgid "Deny Access"
|
msgid "Deny Access"
|
||||||
msgstr "拒绝访问"
|
msgstr "拒绝访问"
|
||||||
|
|
||||||
#: js/ui/accessDialog.js:40 js/ui/status/location.js:372
|
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377
|
||||||
msgid "Grant Access"
|
msgid "Grant Access"
|
||||||
msgstr "允许访问"
|
msgstr "允许访问"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:903
|
#: js/ui/appDisplay.js:960
|
||||||
msgid "Unnamed Folder"
|
msgid "Unnamed Folder"
|
||||||
msgstr "未命名文件夹"
|
msgstr "未命名文件夹"
|
||||||
|
|
||||||
#. 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:2225 js/ui/panel.js:75
|
#: js/ui/appDisplay.js:2219 js/ui/panel.js:75
|
||||||
msgid "Open Windows"
|
msgid "Open Windows"
|
||||||
msgstr "打开窗口"
|
msgstr "打开窗口"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2244 js/ui/panel.js:82
|
#: js/ui/appDisplay.js:2238 js/ui/panel.js:82
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "新窗口"
|
msgstr "新窗口"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2260
|
#: js/ui/appDisplay.js:2254
|
||||||
msgid "Launch using Integrated Graphics Card"
|
msgid "Launch using Integrated Graphics Card"
|
||||||
msgstr "使用集成显卡启动"
|
msgstr "使用集成显卡启动"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2261
|
#: js/ui/appDisplay.js:2255
|
||||||
msgid "Launch using Discrete Graphics Card"
|
msgid "Launch using Discrete Graphics Card"
|
||||||
msgstr "使用独立显卡启动"
|
msgstr "使用独立显卡启动"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2289 js/ui/dash.js:239
|
#: js/ui/appDisplay.js:2283 js/ui/dash.js:239
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "从收藏夹中移除"
|
msgstr "从收藏夹中移除"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2295
|
#: js/ui/appDisplay.js:2289
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "添加到收藏夹"
|
msgstr "添加到收藏夹"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2305 js/ui/panel.js:93
|
#: js/ui/appDisplay.js:2299 js/ui/panel.js:93
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "显示细节"
|
msgstr "显示细节"
|
||||||
|
|
||||||
@@ -739,7 +739,7 @@ msgstr "耳机"
|
|||||||
msgid "Headset"
|
msgid "Headset"
|
||||||
msgstr "耳麦"
|
msgstr "耳麦"
|
||||||
|
|
||||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "麦克风"
|
msgstr "麦克风"
|
||||||
|
|
||||||
@@ -756,7 +756,7 @@ msgid "Settings"
|
|||||||
msgstr "设置"
|
msgstr "设置"
|
||||||
|
|
||||||
#. 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:36
|
#: js/ui/calendar.js:41
|
||||||
msgctxt "calendar-no-work"
|
msgctxt "calendar-no-work"
|
||||||
msgid "06"
|
msgid "06"
|
||||||
msgstr "06"
|
msgstr "06"
|
||||||
@@ -766,43 +766,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:65
|
#: js/ui/calendar.js:70
|
||||||
msgctxt "grid sunday"
|
msgctxt "grid sunday"
|
||||||
msgid "S"
|
msgid "S"
|
||||||
msgstr "日"
|
msgstr "日"
|
||||||
|
|
||||||
#. Translators: Calendar grid abbreviation for Monday
|
#. Translators: Calendar grid abbreviation for Monday
|
||||||
#: js/ui/calendar.js:67
|
#: js/ui/calendar.js:72
|
||||||
msgctxt "grid monday"
|
msgctxt "grid monday"
|
||||||
msgid "M"
|
msgid "M"
|
||||||
msgstr "一"
|
msgstr "一"
|
||||||
|
|
||||||
#. Translators: Calendar grid abbreviation for Tuesday
|
#. Translators: Calendar grid abbreviation for Tuesday
|
||||||
#: js/ui/calendar.js:69
|
#: js/ui/calendar.js:74
|
||||||
msgctxt "grid tuesday"
|
msgctxt "grid tuesday"
|
||||||
msgid "T"
|
msgid "T"
|
||||||
msgstr "二"
|
msgstr "二"
|
||||||
|
|
||||||
#. Translators: Calendar grid abbreviation for Wednesday
|
#. Translators: Calendar grid abbreviation for Wednesday
|
||||||
#: js/ui/calendar.js:71
|
#: js/ui/calendar.js:76
|
||||||
msgctxt "grid wednesday"
|
msgctxt "grid wednesday"
|
||||||
msgid "W"
|
msgid "W"
|
||||||
msgstr "三"
|
msgstr "三"
|
||||||
|
|
||||||
#. Translators: Calendar grid abbreviation for Thursday
|
#. Translators: Calendar grid abbreviation for Thursday
|
||||||
#: js/ui/calendar.js:73
|
#: js/ui/calendar.js:78
|
||||||
msgctxt "grid thursday"
|
msgctxt "grid thursday"
|
||||||
msgid "T"
|
msgid "T"
|
||||||
msgstr "四"
|
msgstr "四"
|
||||||
|
|
||||||
#. Translators: Calendar grid abbreviation for Friday
|
#. Translators: Calendar grid abbreviation for Friday
|
||||||
#: js/ui/calendar.js:75
|
#: js/ui/calendar.js:80
|
||||||
msgctxt "grid friday"
|
msgctxt "grid friday"
|
||||||
msgid "F"
|
msgid "F"
|
||||||
msgstr "五"
|
msgstr "五"
|
||||||
|
|
||||||
#. Translators: Calendar grid abbreviation for Saturday
|
#. Translators: Calendar grid abbreviation for Saturday
|
||||||
#: js/ui/calendar.js:77
|
#: js/ui/calendar.js:82
|
||||||
msgctxt "grid saturday"
|
msgctxt "grid saturday"
|
||||||
msgid "S"
|
msgid "S"
|
||||||
msgstr "六"
|
msgstr "六"
|
||||||
@@ -813,7 +813,7 @@ msgstr "六"
|
|||||||
#. * "%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:392
|
#: js/ui/calendar.js:397
|
||||||
msgid "%OB"
|
msgid "%OB"
|
||||||
msgstr "%OB"
|
msgstr "%OB"
|
||||||
|
|
||||||
@@ -826,37 +826,61 @@ 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:402
|
#: js/ui/calendar.js:407
|
||||||
msgid "%OB %Y"
|
msgid "%OB %Y"
|
||||||
msgstr "%Y %OB"
|
msgstr "%Y %OB"
|
||||||
|
|
||||||
#: js/ui/calendar.js:461
|
#: js/ui/calendar.js:466
|
||||||
msgid "Previous month"
|
msgid "Previous month"
|
||||||
msgstr "上个月"
|
msgstr "上个月"
|
||||||
|
|
||||||
#: js/ui/calendar.js:476
|
#: js/ui/calendar.js:481
|
||||||
msgid "Next month"
|
msgid "Next month"
|
||||||
msgstr "下个月"
|
msgstr "下个月"
|
||||||
|
|
||||||
#: js/ui/calendar.js:626
|
#: js/ui/calendar.js:631
|
||||||
#, 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:682
|
#: js/ui/calendar.js:687
|
||||||
msgid "Week %V"
|
msgid "Week %V"
|
||||||
msgstr "第 %V 个星期"
|
msgstr "第 %V 个星期"
|
||||||
|
|
||||||
#: js/ui/calendar.js:895
|
#. Translators: Shown in calendar event list for all day events
|
||||||
|
#. * Keep it short, best if you can use less then 10 characters
|
||||||
|
#.
|
||||||
|
#: js/ui/calendar.js:762
|
||||||
|
msgctxt "event list time"
|
||||||
|
msgid "All Day"
|
||||||
|
msgstr "全天"
|
||||||
|
|
||||||
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
|
#: js/ui/calendar.js:900
|
||||||
|
msgctxt "calendar heading"
|
||||||
|
msgid "%A, %B %-d"
|
||||||
|
msgstr "%-m月%-d日 %A"
|
||||||
|
|
||||||
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
|
#: js/ui/calendar.js:903
|
||||||
|
msgctxt "calendar heading"
|
||||||
|
msgid "%A, %B %-d, %Y"
|
||||||
|
msgstr "%Y年%-m月%-d日 %A"
|
||||||
|
|
||||||
|
#: js/ui/calendar.js:1133
|
||||||
msgid "No Notifications"
|
msgid "No Notifications"
|
||||||
msgstr "无通知"
|
msgstr "无通知"
|
||||||
|
|
||||||
#: js/ui/calendar.js:949
|
#: js/ui/calendar.js:1136
|
||||||
|
msgid "No Events"
|
||||||
|
msgstr "无事件"
|
||||||
|
|
||||||
|
#: js/ui/calendar.js:1190
|
||||||
msgid "Do Not Disturb"
|
msgid "Do Not Disturb"
|
||||||
msgstr "请勿打扰"
|
msgstr "请勿打扰"
|
||||||
|
|
||||||
#: js/ui/calendar.js:968
|
#: js/ui/calendar.js:1209
|
||||||
msgid "Clear"
|
msgid "Clear"
|
||||||
msgstr "清除"
|
msgstr "清除"
|
||||||
|
|
||||||
@@ -1006,7 +1030,7 @@ msgstr "抱歉,认证失败。请重试。"
|
|||||||
msgid "%s is now known as %s"
|
msgid "%s is now known as %s"
|
||||||
msgstr "%s 现在叫做 %s"
|
msgstr "%s 现在叫做 %s"
|
||||||
|
|
||||||
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
|
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "窗口"
|
msgstr "窗口"
|
||||||
|
|
||||||
@@ -1025,7 +1049,7 @@ msgstr "Dash"
|
|||||||
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
|
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
|
||||||
#. * "February 17 2015".
|
#. * "February 17 2015".
|
||||||
#.
|
#.
|
||||||
#: js/ui/dateMenu.js:79
|
#: js/ui/dateMenu.js:75
|
||||||
msgid "%B %-d %Y"
|
msgid "%B %-d %Y"
|
||||||
msgstr "%Y年%-m月%-d日"
|
msgstr "%Y年%-m月%-d日"
|
||||||
|
|
||||||
@@ -1033,67 +1057,35 @@ msgstr "%Y年%-m月%-d日"
|
|||||||
#. * below the time in the shell; it should combine the weekday and the
|
#. * below the time in the shell; it should combine the weekday and the
|
||||||
#. * date, e.g. "Tuesday February 17 2015".
|
#. * date, e.g. "Tuesday February 17 2015".
|
||||||
#.
|
#.
|
||||||
#: js/ui/dateMenu.js:86
|
#: js/ui/dateMenu.js:82
|
||||||
msgid "%A %B %e %Y"
|
msgid "%A %B %e %Y"
|
||||||
msgstr "%Y年%-m月%-d日 %A"
|
msgstr "%Y年%-m月%-d日 %A"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#: js/ui/dateMenu.js:162
|
||||||
#: js/ui/dateMenu.js:151
|
|
||||||
msgctxt "calendar heading"
|
|
||||||
msgid "%B %-d"
|
|
||||||
msgstr "%-m月%-d日"
|
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
|
||||||
#: js/ui/dateMenu.js:154
|
|
||||||
msgctxt "calendar heading"
|
|
||||||
msgid "%B %-d %Y"
|
|
||||||
msgstr "%Y年%-m月%-d日"
|
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:160
|
|
||||||
msgid "Today"
|
|
||||||
msgstr "今天"
|
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:164
|
|
||||||
msgid "Tomorrow"
|
|
||||||
msgstr "明天"
|
|
||||||
|
|
||||||
#. Translators: Shown in calendar event list for all day events
|
|
||||||
#. * Keep it short, best if you can use less then 10 characters
|
|
||||||
#.
|
|
||||||
#: js/ui/dateMenu.js:180
|
|
||||||
msgctxt "event list time"
|
|
||||||
msgid "All Day"
|
|
||||||
msgstr "全天"
|
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:231
|
|
||||||
msgid "No Events"
|
|
||||||
msgstr "无事件"
|
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:348
|
|
||||||
msgid "Add world clocks…"
|
msgid "Add world clocks…"
|
||||||
msgstr "添加世界时钟…"
|
msgstr "添加世界时钟…"
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:349
|
#: js/ui/dateMenu.js:163
|
||||||
msgid "World Clocks"
|
msgid "World Clocks"
|
||||||
msgstr "世界时钟"
|
msgstr "世界时钟"
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:629
|
#: js/ui/dateMenu.js:443
|
||||||
msgid "Loading…"
|
msgid "Loading…"
|
||||||
msgstr "正在载入……"
|
msgstr "正在载入……"
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:639
|
#: js/ui/dateMenu.js:453
|
||||||
msgid "Go online for weather information"
|
msgid "Go online for weather information"
|
||||||
msgstr "通过互联网查看天气信息"
|
msgstr "通过互联网查看天气信息"
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:641
|
#: js/ui/dateMenu.js:455
|
||||||
msgid "Weather information is currently unavailable"
|
msgid "Weather information is currently unavailable"
|
||||||
msgstr "天气信息目前不可用"
|
msgstr "天气信息目前不可用"
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:651
|
#: js/ui/dateMenu.js:465
|
||||||
msgid "Weather"
|
msgid "Weather"
|
||||||
msgstr "天气"
|
msgstr "天气"
|
||||||
|
|
||||||
#: js/ui/dateMenu.js:653
|
#: js/ui/dateMenu.js:467
|
||||||
msgid "Select weather location…"
|
msgid "Select weather location…"
|
||||||
msgstr "选择天气地点…"
|
msgstr "选择天气地点…"
|
||||||
|
|
||||||
@@ -1276,11 +1268,11 @@ msgstr "某应用程序希望禁用快捷键"
|
|||||||
msgid "You can restore shortcuts by pressing %s."
|
msgid "You can restore shortcuts by pressing %s."
|
||||||
msgstr "按 %s 以恢复快捷键。"
|
msgstr "按 %s 以恢复快捷键。"
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:100
|
#: js/ui/inhibitShortcutsDialog.js:98
|
||||||
msgid "Deny"
|
msgid "Deny"
|
||||||
msgstr "拒绝"
|
msgstr "拒绝"
|
||||||
|
|
||||||
#: js/ui/inhibitShortcutsDialog.js:107
|
#: js/ui/inhibitShortcutsDialog.js:105
|
||||||
msgid "Allow"
|
msgid "Allow"
|
||||||
msgstr "允许"
|
msgstr "允许"
|
||||||
|
|
||||||
@@ -1345,7 +1337,7 @@ msgstr "关闭"
|
|||||||
msgid "Leave Off"
|
msgid "Leave Off"
|
||||||
msgstr "保持关闭"
|
msgstr "保持关闭"
|
||||||
|
|
||||||
#: js/ui/keyboard.js:225
|
#: js/ui/keyboard.js:207
|
||||||
msgid "Region & Language Settings"
|
msgid "Region & Language Settings"
|
||||||
msgstr "区域与语言设置"
|
msgstr "区域与语言设置"
|
||||||
|
|
||||||
@@ -1418,25 +1410,25 @@ msgstr "屏幕锁定已禁用"
|
|||||||
msgid "Screen Locking requires the GNOME display manager."
|
msgid "Screen Locking requires the GNOME display manager."
|
||||||
msgstr "屏幕锁定需要 GNOME 显示管理器。"
|
msgstr "屏幕锁定需要 GNOME 显示管理器。"
|
||||||
|
|
||||||
#: js/ui/messageTray.js:1476
|
#: js/ui/messageTray.js:1547
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "系统信息"
|
msgstr "系统信息"
|
||||||
|
|
||||||
#: js/ui/mpris.js:203
|
#: js/ui/mpris.js:204
|
||||||
msgid "Unknown artist"
|
msgid "Unknown artist"
|
||||||
msgstr "未知艺人"
|
msgstr "未知艺人"
|
||||||
|
|
||||||
#: js/ui/mpris.js:213
|
#: js/ui/mpris.js:214
|
||||||
msgid "Unknown title"
|
msgid "Unknown title"
|
||||||
msgstr "未知标题"
|
msgstr "未知标题"
|
||||||
|
|
||||||
#: js/ui/overview.js:74
|
#: js/ui/overview.js:73
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "撤消"
|
msgstr "撤消"
|
||||||
|
|
||||||
#. Translators: This is the main view to select
|
#. Translators: This is the main view to select
|
||||||
#. activities. See also note for "Activities" string.
|
#. activities. See also note for "Activities" string.
|
||||||
#: js/ui/overview.js:87
|
#: js/ui/overview.js:86
|
||||||
msgid "Overview"
|
msgid "Overview"
|
||||||
msgstr "概览"
|
msgstr "概览"
|
||||||
|
|
||||||
@@ -1444,7 +1436,7 @@ msgstr "概览"
|
|||||||
#. in the search entry when no search is
|
#. in the search entry when no search is
|
||||||
#. active; it should not exceed ~30
|
#. active; it should not exceed ~30
|
||||||
#. characters.
|
#. characters.
|
||||||
#: js/ui/overview.js:108
|
#: js/ui/overview.js:107
|
||||||
msgid "Type to search"
|
msgid "Type to search"
|
||||||
msgstr "输入以搜索"
|
msgstr "输入以搜索"
|
||||||
|
|
||||||
@@ -1472,23 +1464,23 @@ msgstr "分配按键"
|
|||||||
msgid "Done"
|
msgid "Done"
|
||||||
msgstr "完成"
|
msgstr "完成"
|
||||||
|
|
||||||
#: js/ui/padOsd.js:732
|
#: js/ui/padOsd.js:745
|
||||||
msgid "Edit…"
|
msgid "Edit…"
|
||||||
msgstr "编辑…"
|
msgstr "编辑…"
|
||||||
|
|
||||||
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
|
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "无"
|
msgstr "无"
|
||||||
|
|
||||||
#: js/ui/padOsd.js:845
|
#: js/ui/padOsd.js:863
|
||||||
msgid "Press a button to configure"
|
msgid "Press a button to configure"
|
||||||
msgstr "按下按键以配置"
|
msgstr "按下按键以配置"
|
||||||
|
|
||||||
#: js/ui/padOsd.js:846
|
#: js/ui/padOsd.js:864
|
||||||
msgid "Press Esc to exit"
|
msgid "Press Esc to exit"
|
||||||
msgstr "按 Esc 以退出"
|
msgstr "按 Esc 以退出"
|
||||||
|
|
||||||
#: js/ui/padOsd.js:849
|
#: js/ui/padOsd.js:867
|
||||||
msgid "Press any key to exit"
|
msgid "Press any key to exit"
|
||||||
msgstr "按任意键退出"
|
msgstr "按任意键退出"
|
||||||
|
|
||||||
@@ -1578,7 +1570,7 @@ msgstr "隐藏文本"
|
|||||||
|
|
||||||
#: js/ui/shellEntry.js:162
|
#: js/ui/shellEntry.js:162
|
||||||
msgid "Caps lock is on."
|
msgid "Caps lock is on."
|
||||||
msgstr "大写锁定已开启。"
|
msgstr "大写锁定键已开启。"
|
||||||
|
|
||||||
#: js/ui/shellMountOperation.js:285
|
#: js/ui/shellMountOperation.js:285
|
||||||
msgid "Hidden Volume"
|
msgid "Hidden Volume"
|
||||||
@@ -1750,17 +1742,17 @@ msgstr "定位服务已禁用"
|
|||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "启用"
|
msgstr "启用"
|
||||||
|
|
||||||
#: js/ui/status/location.js:350
|
#: js/ui/status/location.js:355
|
||||||
msgid "Allow location access"
|
msgid "Allow location access"
|
||||||
msgstr "允许获取位置信息"
|
msgstr "允许获取位置信息"
|
||||||
|
|
||||||
#. Translators: %s is an application name
|
#. Translators: %s is an application name
|
||||||
#: js/ui/status/location.js:352
|
#: js/ui/status/location.js:357
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "The app %s wants to access your location"
|
msgid "The app %s wants to access your location"
|
||||||
msgstr "应用 %s 想要获取您的位置信息"
|
msgstr "应用 %s 想要获取您的位置信息"
|
||||||
|
|
||||||
#: js/ui/status/location.js:362
|
#: js/ui/status/location.js:367
|
||||||
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 "位置访问权限可以随时在隐私设置里更改。"
|
||||||
|
|
||||||
@@ -2089,11 +2081,11 @@ msgstr "Thunderbolt 授权错误"
|
|||||||
msgid "Could not authorize the Thunderbolt device: %s"
|
msgid "Could not authorize the Thunderbolt device: %s"
|
||||||
msgstr "无法授权 Thunderbolt 设备:%s"
|
msgstr "无法授权 Thunderbolt 设备:%s"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:155
|
#: js/ui/status/volume.js:154
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "音量已变更"
|
msgstr "音量已变更"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:217
|
#: js/ui/status/volume.js:225
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "音量"
|
msgstr "音量"
|
||||||
|
|
||||||
@@ -2139,19 +2131,19 @@ msgstr "向上滑动解锁"
|
|||||||
msgid "Click or press a key to unlock"
|
msgid "Click or press a key to unlock"
|
||||||
msgstr "单击或按键解锁"
|
msgstr "单击或按键解锁"
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:555
|
#: js/ui/unlockDialog.js:550
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "解锁窗口"
|
msgstr "解锁窗口"
|
||||||
|
|
||||||
#: js/ui/unlockDialog.js:564
|
#: js/ui/unlockDialog.js:559
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "以另一个用户身份登录"
|
msgstr "以另一个用户身份登录"
|
||||||
|
|
||||||
#: js/ui/viewSelector.js:182
|
#: js/ui/viewSelector.js:181
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "应用程序"
|
msgstr "应用程序"
|
||||||
|
|
||||||
#: js/ui/viewSelector.js:186
|
#: js/ui/viewSelector.js:185
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "搜索"
|
msgstr "搜索"
|
||||||
|
|
||||||
@@ -2277,12 +2269,12 @@ msgstr "使用指定模式,如“gdm”用于登录屏幕"
|
|||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "列出可用的模式"
|
msgstr "列出可用的模式"
|
||||||
|
|
||||||
#: src/shell-app.c:268
|
#: src/shell-app.c:286
|
||||||
msgctxt "program"
|
msgctxt "program"
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "未知"
|
msgstr "未知"
|
||||||
|
|
||||||
#: src/shell-app.c:519
|
#: src/shell-app.c:537
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to launch “%s”"
|
msgid "Failed to launch “%s”"
|
||||||
msgstr "启动“%s”失败"
|
msgstr "启动“%s”失败"
|
||||||
@@ -2512,7 +2504,7 @@ msgstr "描述"
|
|||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:443
|
#: subprojects/extensions-tool/src/command-create.c:443
|
||||||
msgid "A short description of what the extension does"
|
msgid "A short description of what the extension does"
|
||||||
msgstr "扩展功能的简短描述"
|
msgstr "简短描述下扩展所做的事情"
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:446
|
#: subprojects/extensions-tool/src/command-create.c:446
|
||||||
msgid "TEMPLATE"
|
msgid "TEMPLATE"
|
||||||
@@ -2855,14 +2847,6 @@ msgstr[0] "%u 个输入"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "系统声音"
|
msgstr "系统声音"
|
||||||
|
|
||||||
#~ msgctxt "calendar heading"
|
|
||||||
#~ msgid "%A, %B %-d"
|
|
||||||
#~ msgstr "%-m月%-d日 %A"
|
|
||||||
|
|
||||||
#~ msgctxt "calendar heading"
|
|
||||||
#~ msgid "%A, %B %-d, %Y"
|
|
||||||
#~ msgstr "%Y年%-m月%-d日 %A"
|
|
||||||
|
|
||||||
#~ msgid "Frequently used applications will appear here"
|
#~ msgid "Frequently used applications will appear here"
|
||||||
#~ msgstr "常用的应用程序会出现在这里"
|
#~ msgstr "常用的应用程序会出现在这里"
|
||||||
|
|
||||||
|
@@ -346,6 +346,8 @@ struct _App
|
|||||||
|
|
||||||
GSList *notify_appointments; /* CalendarAppointment *, for EventsAdded */
|
GSList *notify_appointments; /* CalendarAppointment *, for EventsAdded */
|
||||||
GSList *notify_ids; /* gchar *, for EventsRemoved */
|
GSList *notify_ids; /* gchar *, for EventsRemoved */
|
||||||
|
guint events_added_timeout_id;
|
||||||
|
guint events_removed_timeout_id;
|
||||||
|
|
||||||
GSList *live_views;
|
GSList *live_views;
|
||||||
};
|
};
|
||||||
@@ -368,19 +370,24 @@ app_update_timezone (App *app)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
app_notify_events_added (App *app)
|
on_app_schedule_events_added_cb (gpointer user_data)
|
||||||
{
|
{
|
||||||
|
App *app = user_data;
|
||||||
GVariantBuilder builder, extras_builder;
|
GVariantBuilder builder, extras_builder;
|
||||||
GSList *events, *link;
|
GSList *events, *link;
|
||||||
|
|
||||||
|
if (g_source_is_destroyed (g_main_current_source ()))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
events = g_slist_reverse (app->notify_appointments);
|
events = g_slist_reverse (app->notify_appointments);
|
||||||
app->notify_appointments = NULL;
|
app->notify_appointments = NULL;
|
||||||
|
app->events_added_timeout_id = 0;
|
||||||
|
|
||||||
print_debug ("Emitting EventsAddedOrUpdated with %d events", g_slist_length (events));
|
print_debug ("Emitting EventsAddedOrUpdated with %d events", g_slist_length (events));
|
||||||
|
|
||||||
if (!events)
|
if (!events)
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
/* The a{sv} is used as an escape hatch in case we want to provide more
|
/* The a{sv} is used as an escape hatch in case we want to provide more
|
||||||
* information in the future without breaking ABI
|
* information in the future without breaking ABI
|
||||||
@@ -421,21 +428,41 @@ app_notify_events_added (App *app)
|
|||||||
g_variant_builder_clear (&builder);
|
g_variant_builder_clear (&builder);
|
||||||
|
|
||||||
g_slist_free_full (events, calendar_appointment_free);
|
g_slist_free_full (events, calendar_appointment_free);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
app_notify_events_removed (App *app)
|
app_schedule_events_added (App *app)
|
||||||
{
|
{
|
||||||
|
print_debug ("Scheduling EventsAddedOrUpdated");
|
||||||
|
if (app->events_added_timeout_id == 0)
|
||||||
|
{
|
||||||
|
app->events_added_timeout_id = g_timeout_add_seconds (2,
|
||||||
|
on_app_schedule_events_added_cb,
|
||||||
|
app);
|
||||||
|
g_source_set_name_by_id (app->events_added_timeout_id, "[gnome-shell] on_app_schedule_events_added_cb");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
on_app_schedule_events_removed_cb (gpointer user_data)
|
||||||
|
{
|
||||||
|
App *app = user_data;
|
||||||
GVariantBuilder builder;
|
GVariantBuilder builder;
|
||||||
GSList *ids, *link;
|
GSList *ids, *link;
|
||||||
|
|
||||||
|
if (g_source_is_destroyed (g_main_current_source ()))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
ids = app->notify_ids;
|
ids = app->notify_ids;
|
||||||
app->notify_ids = NULL;
|
app->notify_ids = NULL;
|
||||||
|
app->events_removed_timeout_id = 0;
|
||||||
|
|
||||||
print_debug ("Emitting EventsRemoved with %d ids", g_slist_length (ids));
|
print_debug ("Emitting EventsRemoved with %d ids", g_slist_length (ids));
|
||||||
|
|
||||||
if (!ids)
|
if (!ids)
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
|
||||||
for (link = ids; link; link = g_slist_next (link))
|
for (link = ids; link; link = g_slist_next (link))
|
||||||
@@ -456,7 +483,20 @@ app_notify_events_removed (App *app)
|
|||||||
|
|
||||||
g_slist_free_full (ids, g_free);
|
g_slist_free_full (ids, g_free);
|
||||||
|
|
||||||
return;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
app_schedule_events_removed (App *app)
|
||||||
|
{
|
||||||
|
print_debug ("Scheduling EventsRemoved");
|
||||||
|
if (app->events_removed_timeout_id == 0)
|
||||||
|
{
|
||||||
|
app->events_removed_timeout_id = g_timeout_add_seconds (2,
|
||||||
|
on_app_schedule_events_removed_cb,
|
||||||
|
app);
|
||||||
|
g_source_set_name_by_id (app->events_removed_timeout_id, "[gnome-shell] on_app_schedule_events_removed_cb");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -506,7 +546,7 @@ app_process_added_modified_objects (App *app,
|
|||||||
g_clear_object (&cal_client);
|
g_clear_object (&cal_client);
|
||||||
|
|
||||||
if (app->notify_appointments)
|
if (app->notify_appointments)
|
||||||
app_notify_events_added (app);
|
app_schedule_events_added (app);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -570,7 +610,7 @@ on_objects_removed (ECalClientView *view,
|
|||||||
g_clear_object (&client);
|
g_clear_object (&client);
|
||||||
|
|
||||||
if (app->notify_ids)
|
if (app->notify_ids)
|
||||||
app_notify_events_removed (app);
|
app_schedule_events_removed (app);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -834,6 +874,9 @@ app_free (App *app)
|
|||||||
{
|
{
|
||||||
GSList *ll;
|
GSList *ll;
|
||||||
|
|
||||||
|
g_clear_handle_id (&app->events_added_timeout_id, g_source_remove);
|
||||||
|
g_clear_handle_id (&app->events_removed_timeout_id, g_source_remove);
|
||||||
|
|
||||||
for (ll = app->live_views; ll != NULL; ll = g_slist_next (ll))
|
for (ll = app->live_views; ll != NULL; ll = g_slist_next (ll))
|
||||||
{
|
{
|
||||||
ECalClientView *view = E_CAL_CLIENT_VIEW (ll->data);
|
ECalClientView *view = E_CAL_CLIENT_VIEW (ll->data);
|
||||||
|
@@ -78,7 +78,6 @@ struct _ShellApp
|
|||||||
* want (e.g. it will be of TYPE_NORMAL from
|
* want (e.g. it will be of TYPE_NORMAL from
|
||||||
* the way shell-window-tracker.c works).
|
* the way shell-window-tracker.c works).
|
||||||
*/
|
*/
|
||||||
GIcon *fallback_icon;
|
|
||||||
|
|
||||||
ShellAppRunningState *running_state;
|
ShellAppRunningState *running_state;
|
||||||
|
|
||||||
@@ -181,47 +180,66 @@ window_backed_app_get_window (ShellApp *app)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static ClutterActor *
|
||||||
* shell_app_get_icon:
|
window_backed_app_get_icon (ShellApp *app,
|
||||||
*
|
int size)
|
||||||
* Look up the icon for this application
|
|
||||||
*
|
|
||||||
* Return value: (transfer none): A #GIcon
|
|
||||||
*/
|
|
||||||
GIcon *
|
|
||||||
shell_app_get_icon (ShellApp *app)
|
|
||||||
{
|
{
|
||||||
MetaWindow *window = NULL;
|
MetaWindow *window = NULL;
|
||||||
|
StWidget *widget;
|
||||||
|
int scale, scaled_size;
|
||||||
|
ShellGlobal *global;
|
||||||
|
StThemeContext *context;
|
||||||
|
|
||||||
g_return_val_if_fail (SHELL_IS_APP (app), NULL);
|
global = shell_global_get ();
|
||||||
|
context = st_theme_context_get_for_stage (shell_global_get_stage (global));
|
||||||
|
g_object_get (context, "scale-factor", &scale, NULL);
|
||||||
|
|
||||||
if (app->info)
|
scaled_size = size * scale;
|
||||||
return g_app_info_get_icon (G_APP_INFO (app->info));
|
|
||||||
|
|
||||||
if (app->fallback_icon)
|
|
||||||
return app->fallback_icon;
|
|
||||||
|
|
||||||
/* 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.
|
||||||
* Avoid asserting here and just return a fallback icon
|
* Avoid asserting here and just return an empty image.
|
||||||
*/
|
*/
|
||||||
if (app->running_state != NULL)
|
if (app->running_state != NULL)
|
||||||
window = window_backed_app_get_window (app);
|
window = window_backed_app_get_window (app);
|
||||||
|
|
||||||
if (window &&
|
if (window == NULL)
|
||||||
meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
|
|
||||||
{
|
{
|
||||||
app->fallback_icon =
|
ClutterActor *actor;
|
||||||
|
|
||||||
|
actor = clutter_actor_new ();
|
||||||
|
g_object_set (actor,
|
||||||
|
"opacity", 0,
|
||||||
|
"width", (float) scaled_size,
|
||||||
|
"height", (float) scaled_size,
|
||||||
|
NULL);
|
||||||
|
return actor;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
|
||||||
|
{
|
||||||
|
StWidget *texture_actor;
|
||||||
|
|
||||||
|
texture_actor =
|
||||||
st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
|
st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
|
||||||
G_OBJECT (window),
|
G_OBJECT (window),
|
||||||
"icon");
|
"icon",
|
||||||
|
scaled_size);
|
||||||
|
|
||||||
|
widget = g_object_new (ST_TYPE_BIN,
|
||||||
|
"child", texture_actor,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
app->fallback_icon = g_themed_icon_new ("application-x-executable");
|
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");
|
||||||
|
|
||||||
return app->fallback_icon;
|
return CLUTTER_ACTOR (widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -239,16 +257,16 @@ shell_app_create_icon_texture (ShellApp *app,
|
|||||||
GIcon *icon;
|
GIcon *icon;
|
||||||
ClutterActor *ret;
|
ClutterActor *ret;
|
||||||
|
|
||||||
|
if (app->info == NULL)
|
||||||
|
return window_backed_app_get_icon (app, size);
|
||||||
|
|
||||||
ret = st_icon_new ();
|
ret = st_icon_new ();
|
||||||
st_icon_set_icon_size (ST_ICON (ret), size);
|
st_icon_set_icon_size (ST_ICON (ret), size);
|
||||||
st_icon_set_fallback_icon_name (ST_ICON (ret), "application-x-executable");
|
st_icon_set_fallback_icon_name (ST_ICON (ret), "application-x-executable");
|
||||||
|
|
||||||
icon = shell_app_get_icon (app);
|
icon = g_app_info_get_icon (G_APP_INFO (app->info));
|
||||||
st_icon_set_gicon (ST_ICON (ret), icon);
|
st_icon_set_gicon (ST_ICON (ret), icon);
|
||||||
|
|
||||||
if (shell_app_is_window_backed (app))
|
|
||||||
st_widget_add_style_class_name (ST_WIDGET (ret), "fallback-app-icon");
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1558,7 +1576,6 @@ shell_app_dispose (GObject *object)
|
|||||||
ShellApp *app = SHELL_APP (object);
|
ShellApp *app = SHELL_APP (object);
|
||||||
|
|
||||||
g_clear_object (&app->info);
|
g_clear_object (&app->info);
|
||||||
g_clear_object (&app->fallback_icon);
|
|
||||||
|
|
||||||
while (app->running_state)
|
while (app->running_state)
|
||||||
_shell_app_remove_window (app, app->running_state->windows->data);
|
_shell_app_remove_window (app, app->running_state->windows->data);
|
||||||
|
@@ -29,7 +29,6 @@ const char *shell_app_get_id (ShellApp *app);
|
|||||||
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
|
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
|
||||||
|
|
||||||
ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size);
|
ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size);
|
||||||
GIcon *shell_app_get_icon (ShellApp *app);
|
|
||||||
const char *shell_app_get_name (ShellApp *app);
|
const char *shell_app_get_name (ShellApp *app);
|
||||||
const char *shell_app_get_description (ShellApp *app);
|
const char *shell_app_get_description (ShellApp *app);
|
||||||
gboolean shell_app_is_window_backed (ShellApp *app);
|
gboolean shell_app_is_window_backed (ShellApp *app);
|
||||||
|
@@ -899,9 +899,8 @@ load_gl_symbol (const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
global_stage_after_paint (ClutterStage *stage,
|
global_stage_after_paint (ClutterStage *stage,
|
||||||
ClutterStageView *stage_view,
|
ShellGlobal *global)
|
||||||
ShellGlobal *global)
|
|
||||||
{
|
{
|
||||||
/* At this point, we've finished all layout and painting, but haven't
|
/* At this point, we've finished all layout and painting, but haven't
|
||||||
* actually flushed or swapped */
|
* actually flushed or swapped */
|
||||||
|
@@ -508,7 +508,9 @@ recorder_update_size (ShellRecorder *recorder)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
recorder_on_stage_notify_size (ShellRecorder *recorder)
|
recorder_on_stage_notify_size (GObject *object,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
ShellRecorder *recorder)
|
||||||
{
|
{
|
||||||
recorder_update_size (recorder);
|
recorder_update_size (recorder);
|
||||||
|
|
||||||
@@ -612,15 +614,12 @@ recorder_connect_stage_callbacks (ShellRecorder *recorder)
|
|||||||
G_CALLBACK (recorder_on_stage_destroy), recorder);
|
G_CALLBACK (recorder_on_stage_destroy), recorder);
|
||||||
g_signal_connect_after (recorder->stage, "paint",
|
g_signal_connect_after (recorder->stage, "paint",
|
||||||
G_CALLBACK (recorder_on_stage_paint), recorder);
|
G_CALLBACK (recorder_on_stage_paint), recorder);
|
||||||
g_signal_connect_swapped (recorder->stage, "notify::width",
|
g_signal_connect (recorder->stage, "notify::width",
|
||||||
G_CALLBACK (recorder_on_stage_notify_size),
|
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
||||||
recorder);
|
g_signal_connect (recorder->stage, "notify::height",
|
||||||
g_signal_connect_swapped (recorder->stage, "notify::height",
|
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
||||||
G_CALLBACK (recorder_on_stage_notify_size),
|
g_signal_connect (recorder->stage, "notify::resource-scale",
|
||||||
recorder);
|
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
||||||
g_signal_connect_swapped (recorder->stage, "resource-scale-changed",
|
|
||||||
G_CALLBACK (recorder_on_stage_notify_size),
|
|
||||||
recorder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -393,7 +393,8 @@ grab_window_screenshot (ClutterActor *stage,
|
|||||||
if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_WAYLAND)
|
if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_WAYLAND)
|
||||||
{
|
{
|
||||||
float resource_scale;
|
float resource_scale;
|
||||||
resource_scale = clutter_actor_get_resource_scale (window_actor);
|
if (!clutter_actor_get_resource_scale (window_actor, &resource_scale))
|
||||||
|
resource_scale = 1.0f;
|
||||||
|
|
||||||
cairo_surface_set_device_scale (priv->image, resource_scale, resource_scale);
|
cairo_surface_set_device_scale (priv->image, resource_scale, resource_scale);
|
||||||
}
|
}
|
||||||
|
@@ -409,6 +409,34 @@ shell_util_create_pixbuf_from_data (const guchar *data,
|
|||||||
|
|
||||||
typedef const gchar *(*ShellGLGetString) (GLenum);
|
typedef const gchar *(*ShellGLGetString) (GLenum);
|
||||||
|
|
||||||
|
static const gchar *
|
||||||
|
get_gl_vendor (void)
|
||||||
|
{
|
||||||
|
static const gchar *vendor = NULL;
|
||||||
|
|
||||||
|
if (!vendor)
|
||||||
|
{
|
||||||
|
ShellGLGetString gl_get_string;
|
||||||
|
gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString");
|
||||||
|
if (gl_get_string)
|
||||||
|
vendor = gl_get_string (GL_VENDOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return vendor;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
shell_util_need_background_refresh (void)
|
||||||
|
{
|
||||||
|
if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
canvas_draw_cb (ClutterContent *content,
|
canvas_draw_cb (ClutterContent *content,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
|
@@ -49,6 +49,8 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar *data,
|
|||||||
int height,
|
int height,
|
||||||
int rowstride);
|
int rowstride);
|
||||||
|
|
||||||
|
gboolean shell_util_need_background_refresh (void);
|
||||||
|
|
||||||
ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
|
ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
|
||||||
MetaRectangle *window_rect);
|
MetaRectangle *window_rect);
|
||||||
|
|
||||||
|
@@ -119,16 +119,6 @@ shell_window_tracker_class_init (ShellWindowTrackerClass *klass)
|
|||||||
G_TYPE_NONE, 0);
|
G_TYPE_NONE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
check_app_id_prefix (ShellApp *app,
|
|
||||||
const char *prefix)
|
|
||||||
{
|
|
||||||
if (prefix == NULL)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
return g_str_has_prefix (shell_app_get_id (app), prefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* get_app_from_window_wmclass:
|
* get_app_from_window_wmclass:
|
||||||
*
|
*
|
||||||
@@ -145,15 +135,9 @@ get_app_from_window_wmclass (MetaWindow *window)
|
|||||||
ShellAppSystem *appsys;
|
ShellAppSystem *appsys;
|
||||||
const char *wm_class;
|
const char *wm_class;
|
||||||
const char *wm_instance;
|
const char *wm_instance;
|
||||||
const char *sandbox_id;
|
|
||||||
g_autofree char *app_prefix = NULL;
|
|
||||||
|
|
||||||
appsys = shell_app_system_get_default ();
|
appsys = shell_app_system_get_default ();
|
||||||
|
|
||||||
sandbox_id = meta_window_get_sandboxed_app_id (window);
|
|
||||||
if (sandbox_id)
|
|
||||||
app_prefix = g_strdup_printf ("%s.", sandbox_id);
|
|
||||||
|
|
||||||
/* Notes on the heuristics used here:
|
/* Notes on the heuristics used here:
|
||||||
much of the complexity here comes from the desire to support
|
much of the complexity here comes from the desire to support
|
||||||
Chrome apps.
|
Chrome apps.
|
||||||
@@ -192,23 +176,23 @@ get_app_from_window_wmclass (MetaWindow *window)
|
|||||||
/* first try a match from WM_CLASS (instance part) to StartupWMClass */
|
/* first try a match from WM_CLASS (instance part) to StartupWMClass */
|
||||||
wm_instance = meta_window_get_wm_class_instance (window);
|
wm_instance = meta_window_get_wm_class_instance (window);
|
||||||
app = shell_app_system_lookup_startup_wmclass (appsys, wm_instance);
|
app = shell_app_system_lookup_startup_wmclass (appsys, wm_instance);
|
||||||
if (app != NULL && check_app_id_prefix (app, app_prefix))
|
if (app != NULL)
|
||||||
return g_object_ref (app);
|
return g_object_ref (app);
|
||||||
|
|
||||||
/* then try a match from WM_CLASS to StartupWMClass */
|
/* then try a match from WM_CLASS to StartupWMClass */
|
||||||
wm_class = meta_window_get_wm_class (window);
|
wm_class = meta_window_get_wm_class (window);
|
||||||
app = shell_app_system_lookup_startup_wmclass (appsys, wm_class);
|
app = shell_app_system_lookup_startup_wmclass (appsys, wm_class);
|
||||||
if (app != NULL && check_app_id_prefix (app, app_prefix))
|
if (app != NULL)
|
||||||
return g_object_ref (app);
|
return g_object_ref (app);
|
||||||
|
|
||||||
/* then try a match from WM_CLASS (instance part) to .desktop */
|
/* then try a match from WM_CLASS (instance part) to .desktop */
|
||||||
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_instance);
|
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_instance);
|
||||||
if (app != NULL && check_app_id_prefix (app, app_prefix))
|
if (app != NULL)
|
||||||
return g_object_ref (app);
|
return g_object_ref (app);
|
||||||
|
|
||||||
/* finally, try a match from WM_CLASS to .desktop */
|
/* finally, try a match from WM_CLASS to .desktop */
|
||||||
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_class);
|
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_class);
|
||||||
if (app != NULL && check_app_id_prefix (app, app_prefix))
|
if (app != NULL)
|
||||||
return g_object_ref (app);
|
return g_object_ref (app);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -230,7 +214,7 @@ get_app_from_id (MetaWindow *window,
|
|||||||
{
|
{
|
||||||
ShellApp *app;
|
ShellApp *app;
|
||||||
ShellAppSystem *appsys;
|
ShellAppSystem *appsys;
|
||||||
g_autofree char *desktop_file = NULL;
|
char *desktop_file;
|
||||||
|
|
||||||
g_return_val_if_fail (id != NULL, NULL);
|
g_return_val_if_fail (id != NULL, NULL);
|
||||||
|
|
||||||
@@ -239,9 +223,10 @@ get_app_from_id (MetaWindow *window,
|
|||||||
desktop_file = g_strconcat (id, ".desktop", NULL);
|
desktop_file = g_strconcat (id, ".desktop", NULL);
|
||||||
app = shell_app_system_lookup_app (appsys, desktop_file);
|
app = shell_app_system_lookup_app (appsys, desktop_file);
|
||||||
if (app)
|
if (app)
|
||||||
return g_object_ref (app);
|
g_object_ref (app);
|
||||||
|
|
||||||
return NULL;
|
g_free (desktop_file);
|
||||||
|
return app;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -406,13 +391,6 @@ get_app_for_window (ShellWindowTracker *tracker,
|
|||||||
if (meta_window_is_remote (window))
|
if (meta_window_is_remote (window))
|
||||||
return _shell_app_new_for_window (window);
|
return _shell_app_new_for_window (window);
|
||||||
|
|
||||||
/* Check if the app's WM_CLASS specifies an app; this is
|
|
||||||
* canonical if it does.
|
|
||||||
*/
|
|
||||||
result = get_app_from_window_wmclass (window);
|
|
||||||
if (result != NULL)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
/* Check if the window was opened from within a sandbox; if this
|
/* Check if the window was opened from within a sandbox; if this
|
||||||
* is the case, a corresponding .desktop file is guaranteed to match;
|
* is the case, a corresponding .desktop file is guaranteed to match;
|
||||||
*/
|
*/
|
||||||
@@ -427,6 +405,13 @@ get_app_for_window (ShellWindowTracker *tracker,
|
|||||||
if (result != NULL)
|
if (result != NULL)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
/* Check if the app's WM_CLASS specifies an app; this is
|
||||||
|
* canonical if it does.
|
||||||
|
*/
|
||||||
|
result = get_app_from_window_wmclass (window);
|
||||||
|
if (result != NULL)
|
||||||
|
return result;
|
||||||
|
|
||||||
result = get_app_from_window_pid (tracker, window);
|
result = get_app_from_window_pid (tracker, window);
|
||||||
if (result != NULL)
|
if (result != NULL)
|
||||||
return result;
|
return result;
|
||||||
|
@@ -41,8 +41,6 @@ typedef struct _StAdjustmentPrivate StAdjustmentPrivate;
|
|||||||
|
|
||||||
struct _StAdjustmentPrivate
|
struct _StAdjustmentPrivate
|
||||||
{
|
{
|
||||||
ClutterActor *actor;
|
|
||||||
|
|
||||||
/* Do not sanity-check values while constructing,
|
/* Do not sanity-check values while constructing,
|
||||||
* not all properties may be set yet. */
|
* not all properties may be set yet. */
|
||||||
guint is_constructing : 1;
|
guint is_constructing : 1;
|
||||||
@@ -68,7 +66,6 @@ enum
|
|||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
|
||||||
PROP_ACTOR,
|
|
||||||
PROP_LOWER,
|
PROP_LOWER,
|
||||||
PROP_UPPER,
|
PROP_UPPER,
|
||||||
PROP_VALUE,
|
PROP_VALUE,
|
||||||
@@ -109,21 +106,9 @@ static gboolean st_adjustment_set_page_increment (StAdjustment *adjustment,
|
|||||||
static gboolean st_adjustment_set_page_size (StAdjustment *adjustment,
|
static gboolean st_adjustment_set_page_size (StAdjustment *adjustment,
|
||||||
gdouble size);
|
gdouble size);
|
||||||
|
|
||||||
static ClutterActor *
|
|
||||||
st_adjustment_get_actor (ClutterAnimatable *animatable)
|
|
||||||
{
|
|
||||||
StAdjustment *adjustment = ST_ADJUSTMENT (animatable);
|
|
||||||
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adjustment);
|
|
||||||
|
|
||||||
g_warn_if_fail (priv->actor);
|
|
||||||
|
|
||||||
return priv->actor;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
animatable_iface_init (ClutterAnimatableInterface *iface)
|
animatable_iface_init (ClutterAnimatableInterface *iface)
|
||||||
{
|
{
|
||||||
iface->get_actor = st_adjustment_get_actor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -156,10 +141,6 @@ st_adjustment_get_property (GObject *gobject,
|
|||||||
|
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case PROP_ACTOR:
|
|
||||||
g_value_set_object (value, priv->actor);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_LOWER:
|
case PROP_LOWER:
|
||||||
g_value_set_double (value, priv->lower);
|
g_value_set_double (value, priv->lower);
|
||||||
break;
|
break;
|
||||||
@@ -190,18 +171,6 @@ st_adjustment_get_property (GObject *gobject,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
actor_destroyed (gpointer user_data,
|
|
||||||
GObject *where_the_object_was)
|
|
||||||
{
|
|
||||||
StAdjustment *adj = ST_ADJUSTMENT (user_data);
|
|
||||||
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adj);
|
|
||||||
|
|
||||||
priv->actor = NULL;
|
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (adj), props[PROP_ACTOR]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_adjustment_set_property (GObject *gobject,
|
st_adjustment_set_property (GObject *gobject,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
@@ -209,20 +178,9 @@ st_adjustment_set_property (GObject *gobject,
|
|||||||
GParamSpec *pspec)
|
GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
StAdjustment *adj = ST_ADJUSTMENT (gobject);
|
StAdjustment *adj = ST_ADJUSTMENT (gobject);
|
||||||
StAdjustmentPrivate *priv;
|
|
||||||
|
|
||||||
priv = st_adjustment_get_instance_private (ST_ADJUSTMENT (gobject));
|
|
||||||
|
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case PROP_ACTOR:
|
|
||||||
if (priv->actor)
|
|
||||||
g_object_weak_unref (G_OBJECT (priv->actor), actor_destroyed, adj);
|
|
||||||
priv->actor = g_value_get_object (value);
|
|
||||||
if (priv->actor)
|
|
||||||
g_object_weak_ref (G_OBJECT (priv->actor), actor_destroyed, adj);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_LOWER:
|
case PROP_LOWER:
|
||||||
st_adjustment_set_lower (adj, g_value_get_double (value));
|
st_adjustment_set_lower (adj, g_value_get_double (value));
|
||||||
break;
|
break;
|
||||||
@@ -259,11 +217,6 @@ st_adjustment_dispose (GObject *object)
|
|||||||
StAdjustmentPrivate *priv;
|
StAdjustmentPrivate *priv;
|
||||||
|
|
||||||
priv = st_adjustment_get_instance_private (ST_ADJUSTMENT (object));
|
priv = st_adjustment_get_instance_private (ST_ADJUSTMENT (object));
|
||||||
if (priv->actor)
|
|
||||||
{
|
|
||||||
g_object_weak_unref (G_OBJECT (priv->actor), actor_destroyed, object);
|
|
||||||
priv->actor = NULL;
|
|
||||||
}
|
|
||||||
g_clear_pointer (&priv->transitions, g_hash_table_unref);
|
g_clear_pointer (&priv->transitions, g_hash_table_unref);
|
||||||
|
|
||||||
G_OBJECT_CLASS (st_adjustment_parent_class)->dispose (object);
|
G_OBJECT_CLASS (st_adjustment_parent_class)->dispose (object);
|
||||||
@@ -279,11 +232,6 @@ st_adjustment_class_init (StAdjustmentClass *klass)
|
|||||||
object_class->set_property = st_adjustment_set_property;
|
object_class->set_property = st_adjustment_set_property;
|
||||||
object_class->dispose = st_adjustment_dispose;
|
object_class->dispose = st_adjustment_dispose;
|
||||||
|
|
||||||
props[PROP_ACTOR] =
|
|
||||||
g_param_spec_object ("actor", "Actor", "Actor",
|
|
||||||
CLUTTER_TYPE_ACTOR,
|
|
||||||
ST_PARAM_READWRITE);
|
|
||||||
|
|
||||||
props[PROP_LOWER] =
|
props[PROP_LOWER] =
|
||||||
g_param_spec_double ("lower", "Lower", "Lower bound",
|
g_param_spec_double ("lower", "Lower", "Lower bound",
|
||||||
-G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
|
-G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
|
||||||
@@ -351,8 +299,7 @@ st_adjustment_init (StAdjustment *self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
StAdjustment *
|
StAdjustment *
|
||||||
st_adjustment_new (ClutterActor *actor,
|
st_adjustment_new (gdouble value,
|
||||||
gdouble value,
|
|
||||||
gdouble lower,
|
gdouble lower,
|
||||||
gdouble upper,
|
gdouble upper,
|
||||||
gdouble step_increment,
|
gdouble step_increment,
|
||||||
@@ -360,7 +307,6 @@ st_adjustment_new (ClutterActor *actor,
|
|||||||
gdouble page_size)
|
gdouble page_size)
|
||||||
{
|
{
|
||||||
return g_object_new (ST_TYPE_ADJUSTMENT,
|
return g_object_new (ST_TYPE_ADJUSTMENT,
|
||||||
"actor", actor,
|
|
||||||
"value", value,
|
"value", value,
|
||||||
"lower", lower,
|
"lower", lower,
|
||||||
"upper", upper,
|
"upper", upper,
|
||||||
|
@@ -48,8 +48,7 @@ struct _StAdjustmentClass
|
|||||||
void (* changed) (StAdjustment *adjustment);
|
void (* changed) (StAdjustment *adjustment);
|
||||||
};
|
};
|
||||||
|
|
||||||
StAdjustment *st_adjustment_new (ClutterActor *actor,
|
StAdjustment *st_adjustment_new (gdouble value,
|
||||||
gdouble value,
|
|
||||||
gdouble lower,
|
gdouble lower,
|
||||||
gdouble upper,
|
gdouble upper,
|
||||||
gdouble step_increment,
|
gdouble step_increment,
|
||||||
|
@@ -85,7 +85,12 @@ st_drawing_area_allocate (ClutterActor *self,
|
|||||||
int width, height;
|
int width, height;
|
||||||
float resource_scale;
|
float resource_scale;
|
||||||
|
|
||||||
resource_scale = clutter_actor_get_resource_scale (self);
|
if (!st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
|
||||||
|
{
|
||||||
|
ClutterActorBox empty = CLUTTER_ACTOR_BOX_INIT_ZERO;
|
||||||
|
clutter_actor_set_allocation (self, &empty);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
clutter_actor_set_allocation (self, box);
|
clutter_actor_set_allocation (self, box);
|
||||||
st_theme_node_get_content_box (theme_node, box, &content_box);
|
st_theme_node_get_content_box (theme_node, box, &content_box);
|
||||||
@@ -106,16 +111,13 @@ st_drawing_area_style_changed (StWidget *self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_drawing_area_resource_scale_changed (ClutterActor *self)
|
st_drawing_area_resource_scale_changed (StWidget *self)
|
||||||
{
|
{
|
||||||
float resource_scale;
|
float resource_scale;
|
||||||
ClutterContent *content = clutter_actor_get_content (self);
|
ClutterContent *content = clutter_actor_get_content (CLUTTER_ACTOR (self));
|
||||||
|
|
||||||
resource_scale = clutter_actor_get_resource_scale (self);
|
if (st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
|
||||||
clutter_canvas_set_scale_factor (CLUTTER_CANVAS (content), resource_scale);
|
clutter_canvas_set_scale_factor (CLUTTER_CANVAS (content), resource_scale);
|
||||||
|
|
||||||
if (CLUTTER_ACTOR_CLASS (st_drawing_area_parent_class)->resource_scale_changed)
|
|
||||||
CLUTTER_ACTOR_CLASS (st_drawing_area_parent_class)->resource_scale_changed (self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -126,7 +128,7 @@ st_drawing_area_class_init (StDrawingAreaClass *klass)
|
|||||||
|
|
||||||
actor_class->allocate = st_drawing_area_allocate;
|
actor_class->allocate = st_drawing_area_allocate;
|
||||||
widget_class->style_changed = st_drawing_area_style_changed;
|
widget_class->style_changed = st_drawing_area_style_changed;
|
||||||
actor_class->resource_scale_changed = st_drawing_area_resource_scale_changed;
|
widget_class->resource_scale_changed = st_drawing_area_resource_scale_changed;
|
||||||
|
|
||||||
st_drawing_area_signals[REPAINT] =
|
st_drawing_area_signals[REPAINT] =
|
||||||
g_signal_new ("repaint",
|
g_signal_new ("repaint",
|
||||||
@@ -213,10 +215,15 @@ st_drawing_area_get_surface_size (StDrawingArea *area,
|
|||||||
content = clutter_actor_get_content (CLUTTER_ACTOR (area));
|
content = clutter_actor_get_content (CLUTTER_ACTOR (area));
|
||||||
clutter_content_get_preferred_size (content, &w, &h);
|
clutter_content_get_preferred_size (content, &w, &h);
|
||||||
|
|
||||||
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (area));
|
if (st_widget_get_resource_scale (ST_WIDGET (area), &resource_scale))
|
||||||
|
{
|
||||||
w /= resource_scale;
|
w /= resource_scale;
|
||||||
h /= resource_scale;
|
h /= resource_scale;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
w = h = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
if (width)
|
if (width)
|
||||||
*width = ceilf (w);
|
*width = ceilf (w);
|
||||||
|
@@ -231,12 +231,9 @@ st_icon_style_changed (StWidget *widget)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_icon_resource_scale_changed (ClutterActor *actor)
|
st_icon_resource_scale_changed (StWidget *widget)
|
||||||
{
|
{
|
||||||
st_icon_update (ST_ICON (actor));
|
st_icon_update (ST_ICON (widget));
|
||||||
|
|
||||||
if (CLUTTER_ACTOR_CLASS (st_icon_parent_class)->resource_scale_changed)
|
|
||||||
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->resource_scale_changed (actor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -253,7 +250,7 @@ st_icon_class_init (StIconClass *klass)
|
|||||||
actor_class->paint = st_icon_paint;
|
actor_class->paint = st_icon_paint;
|
||||||
|
|
||||||
widget_class->style_changed = st_icon_style_changed;
|
widget_class->style_changed = st_icon_style_changed;
|
||||||
actor_class->resource_scale_changed = st_icon_resource_scale_changed;
|
widget_class->resource_scale_changed = st_icon_resource_scale_changed;
|
||||||
|
|
||||||
props[PROP_GICON] =
|
props[PROP_GICON] =
|
||||||
g_param_spec_object ("gicon",
|
g_param_spec_object ("gicon",
|
||||||
@@ -428,7 +425,8 @@ st_icon_update (StIcon *icon)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (icon));
|
if (!st_widget_get_resource_scale (ST_WIDGET (icon), &resource_scale))
|
||||||
|
return;
|
||||||
|
|
||||||
theme_node = st_widget_peek_theme_node (ST_WIDGET (icon));
|
theme_node = st_widget_peek_theme_node (ST_WIDGET (icon));
|
||||||
if (theme_node == NULL)
|
if (theme_node == NULL)
|
||||||
|
@@ -42,17 +42,11 @@ enum
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void clutter_content_interface_init (ClutterContentInterface *iface);
|
static void clutter_content_interface_init (ClutterContentInterface *iface);
|
||||||
static void g_icon_interface_init (GIconIface *iface);
|
|
||||||
static void g_loadable_icon_interface_init (GLoadableIconIface *iface);
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (StImageContent, st_image_content, CLUTTER_TYPE_IMAGE,
|
G_DEFINE_TYPE_WITH_CODE (StImageContent, st_image_content, CLUTTER_TYPE_IMAGE,
|
||||||
G_ADD_PRIVATE (StImageContent)
|
G_ADD_PRIVATE (StImageContent)
|
||||||
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTENT,
|
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTENT,
|
||||||
clutter_content_interface_init)
|
clutter_content_interface_init))
|
||||||
G_IMPLEMENT_INTERFACE (G_TYPE_ICON,
|
|
||||||
g_icon_interface_init)
|
|
||||||
G_IMPLEMENT_INTERFACE (G_TYPE_LOADABLE_ICON,
|
|
||||||
g_loadable_icon_interface_init))
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_image_content_init (StImageContent *self)
|
st_image_content_init (StImageContent *self)
|
||||||
@@ -171,157 +165,12 @@ st_image_content_get_preferred_size (ClutterContent *content,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GdkPixbuf*
|
|
||||||
pixbuf_from_image (StImageContent *image)
|
|
||||||
{
|
|
||||||
CoglTexture *texture;
|
|
||||||
int width, height, rowstride;
|
|
||||||
uint8_t *data;
|
|
||||||
|
|
||||||
texture = clutter_image_get_texture (CLUTTER_IMAGE (image));
|
|
||||||
if (!texture || !cogl_texture_is_get_data_supported (texture))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
width = cogl_texture_get_width (texture);
|
|
||||||
height = cogl_texture_get_width (texture);
|
|
||||||
rowstride = 4 * width;
|
|
||||||
data = g_new (uint8_t, rowstride * height);
|
|
||||||
|
|
||||||
cogl_texture_get_data (texture, COGL_PIXEL_FORMAT_RGBA_8888, rowstride, data);
|
|
||||||
|
|
||||||
return gdk_pixbuf_new_from_data ((const guchar *)data,
|
|
||||||
GDK_COLORSPACE_RGB,
|
|
||||||
TRUE, 8, width, height, rowstride,
|
|
||||||
(GdkPixbufDestroyNotify)g_free, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_content_interface_init (ClutterContentInterface *iface)
|
clutter_content_interface_init (ClutterContentInterface *iface)
|
||||||
{
|
{
|
||||||
iface->get_preferred_size = st_image_content_get_preferred_size;
|
iface->get_preferred_size = st_image_content_get_preferred_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static guint
|
|
||||||
st_image_content_hash (GIcon *icon)
|
|
||||||
{
|
|
||||||
return g_direct_hash (icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
st_image_content_equal (GIcon *icon1,
|
|
||||||
GIcon *icon2)
|
|
||||||
{
|
|
||||||
return g_direct_equal (icon1, icon2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GVariant *
|
|
||||||
st_image_content_serialize (GIcon *icon)
|
|
||||||
{
|
|
||||||
g_autoptr (GdkPixbuf) pixbuf = NULL;
|
|
||||||
|
|
||||||
pixbuf = pixbuf_from_image (ST_IMAGE_CONTENT (icon));
|
|
||||||
if (!pixbuf)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return g_icon_serialize (G_ICON (pixbuf));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
g_icon_interface_init (GIconIface *iface)
|
|
||||||
{
|
|
||||||
iface->hash = st_image_content_hash;
|
|
||||||
iface->equal = st_image_content_equal;
|
|
||||||
iface->serialize = st_image_content_serialize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GInputStream *
|
|
||||||
st_image_load (GLoadableIcon *icon,
|
|
||||||
int size,
|
|
||||||
char **type,
|
|
||||||
GCancellable *cancellable,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
g_autoptr (GdkPixbuf) pixbuf = NULL;
|
|
||||||
|
|
||||||
pixbuf = pixbuf_from_image (ST_IMAGE_CONTENT (icon));
|
|
||||||
if (!pixbuf)
|
|
||||||
{
|
|
||||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Failed to read texture");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return g_loadable_icon_load (G_LOADABLE_ICON (pixbuf),
|
|
||||||
size, type, cancellable, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
load_image_thread (GTask *task,
|
|
||||||
gpointer object,
|
|
||||||
gpointer task_data,
|
|
||||||
GCancellable *cancellable)
|
|
||||||
{
|
|
||||||
GInputStream *stream;
|
|
||||||
GError *error = NULL;
|
|
||||||
char *type;
|
|
||||||
|
|
||||||
stream = st_image_load (G_LOADABLE_ICON (object),
|
|
||||||
GPOINTER_TO_INT (task_data),
|
|
||||||
&type,
|
|
||||||
cancellable,
|
|
||||||
&error);
|
|
||||||
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
g_task_return_error (task, error);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_task_set_task_data (task, type, g_free);
|
|
||||||
g_task_return_pointer (task, stream, g_object_unref);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
st_image_load_async (GLoadableIcon *icon,
|
|
||||||
int size,
|
|
||||||
GCancellable *cancellable,
|
|
||||||
GAsyncReadyCallback callback,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
g_autoptr (GTask) task = NULL;
|
|
||||||
|
|
||||||
task = g_task_new (icon, cancellable, callback, user_data);
|
|
||||||
g_task_set_task_data (task, GINT_TO_POINTER (size), NULL);
|
|
||||||
g_task_run_in_thread (task, load_image_thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GInputStream *
|
|
||||||
st_image_load_finish (GLoadableIcon *icon,
|
|
||||||
GAsyncResult *res,
|
|
||||||
char **type,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
GInputStream *stream;
|
|
||||||
|
|
||||||
stream = g_task_propagate_pointer (G_TASK (res), error);
|
|
||||||
if (!stream)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (type)
|
|
||||||
*type = g_strdup (g_task_get_task_data (G_TASK (res)));
|
|
||||||
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
g_loadable_icon_interface_init (GLoadableIconIface *iface)
|
|
||||||
{
|
|
||||||
iface->load = st_image_load;
|
|
||||||
iface->load_async = st_image_load_async;
|
|
||||||
iface->load_finish = st_image_load_finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* st_image_content_new_with_preferred_size:
|
* st_image_content_new_with_preferred_size:
|
||||||
* @width: The preferred width to be used when drawing the content
|
* @width: The preferred width to be used when drawing the content
|
||||||
|
@@ -201,42 +201,44 @@ st_label_paint (ClutterActor *actor,
|
|||||||
|
|
||||||
if (shadow_spec)
|
if (shadow_spec)
|
||||||
{
|
{
|
||||||
ClutterActorBox allocation;
|
|
||||||
float width, height;
|
|
||||||
float resource_scale;
|
float resource_scale;
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (priv->label, &allocation);
|
if (clutter_actor_get_resource_scale (priv->label, &resource_scale))
|
||||||
clutter_actor_box_get_size (&allocation, &width, &height);
|
|
||||||
|
|
||||||
resource_scale = clutter_actor_get_resource_scale (priv->label);
|
|
||||||
|
|
||||||
width *= resource_scale;
|
|
||||||
height *= resource_scale;
|
|
||||||
|
|
||||||
if (priv->text_shadow_pipeline == NULL ||
|
|
||||||
width != priv->shadow_width ||
|
|
||||||
height != priv->shadow_height)
|
|
||||||
{
|
{
|
||||||
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
|
ClutterActorBox allocation;
|
||||||
|
float width, height;
|
||||||
|
|
||||||
priv->shadow_width = width;
|
clutter_actor_get_allocation_box (priv->label, &allocation);
|
||||||
priv->shadow_height = height;
|
clutter_actor_box_get_size (&allocation, &width, &height);
|
||||||
priv->text_shadow_pipeline =
|
|
||||||
_st_create_shadow_pipeline_from_actor (shadow_spec,
|
|
||||||
priv->label);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->text_shadow_pipeline != NULL)
|
width *= resource_scale;
|
||||||
{
|
height *= resource_scale;
|
||||||
CoglFramebuffer *framebuffer;
|
|
||||||
|
|
||||||
framebuffer =
|
if (priv->text_shadow_pipeline == NULL ||
|
||||||
clutter_paint_context_get_framebuffer (paint_context);
|
width != priv->shadow_width ||
|
||||||
_st_paint_shadow_with_opacity (shadow_spec,
|
height != priv->shadow_height)
|
||||||
framebuffer,
|
{
|
||||||
priv->text_shadow_pipeline,
|
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
|
||||||
&allocation,
|
|
||||||
clutter_actor_get_paint_opacity (priv->label));
|
priv->shadow_width = width;
|
||||||
|
priv->shadow_height = height;
|
||||||
|
priv->text_shadow_pipeline =
|
||||||
|
_st_create_shadow_pipeline_from_actor (shadow_spec,
|
||||||
|
priv->label);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priv->text_shadow_pipeline != NULL)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer;
|
||||||
|
|
||||||
|
framebuffer =
|
||||||
|
clutter_paint_context_get_framebuffer (paint_context);
|
||||||
|
_st_paint_shadow_with_opacity (shadow_spec,
|
||||||
|
framebuffer,
|
||||||
|
priv->text_shadow_pipeline,
|
||||||
|
&allocation,
|
||||||
|
clutter_actor_get_paint_opacity (priv->label));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,14 +246,11 @@ st_label_paint (ClutterActor *actor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_label_resource_scale_changed (ClutterActor *actor)
|
st_label_resource_scale_changed (StWidget *widget)
|
||||||
{
|
{
|
||||||
StLabelPrivate *priv = ST_LABEL (actor)->priv;
|
StLabelPrivate *priv = ST_LABEL (widget)->priv;
|
||||||
|
|
||||||
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
|
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
|
||||||
|
|
||||||
if (CLUTTER_ACTOR_CLASS (st_label_parent_class)->resource_scale_changed)
|
|
||||||
CLUTTER_ACTOR_CLASS (st_label_parent_class)->resource_scale_changed (actor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -269,9 +268,9 @@ st_label_class_init (StLabelClass *klass)
|
|||||||
actor_class->allocate = st_label_allocate;
|
actor_class->allocate = st_label_allocate;
|
||||||
actor_class->get_preferred_width = st_label_get_preferred_width;
|
actor_class->get_preferred_width = st_label_get_preferred_width;
|
||||||
actor_class->get_preferred_height = st_label_get_preferred_height;
|
actor_class->get_preferred_height = st_label_get_preferred_height;
|
||||||
actor_class->resource_scale_changed = st_label_resource_scale_changed;
|
|
||||||
|
|
||||||
widget_class->style_changed = st_label_style_changed;
|
widget_class->style_changed = st_label_style_changed;
|
||||||
|
widget_class->resource_scale_changed = st_label_resource_scale_changed;
|
||||||
widget_class->get_accessible_type = st_label_accessible_get_type;
|
widget_class->get_accessible_type = st_label_accessible_get_type;
|
||||||
|
|
||||||
props[PROP_CLUTTER_TEXT] =
|
props[PROP_CLUTTER_TEXT] =
|
||||||
@@ -294,7 +293,6 @@ st_label_class_init (StLabelClass *klass)
|
|||||||
static void
|
static void
|
||||||
st_label_init (StLabel *label)
|
st_label_init (StLabel *label)
|
||||||
{
|
{
|
||||||
ClutterActor *actor = CLUTTER_ACTOR (label);
|
|
||||||
StLabelPrivate *priv;
|
StLabelPrivate *priv;
|
||||||
|
|
||||||
label->priv = priv = st_label_get_instance_private (label);
|
label->priv = priv = st_label_get_instance_private (label);
|
||||||
@@ -306,10 +304,7 @@ st_label_init (StLabel *label)
|
|||||||
label->priv->shadow_width = -1.;
|
label->priv->shadow_width = -1.;
|
||||||
label->priv->shadow_height = -1.;
|
label->priv->shadow_height = -1.;
|
||||||
|
|
||||||
clutter_actor_add_child (actor, priv->label);
|
clutter_actor_add_child (CLUTTER_ACTOR (label), priv->label);
|
||||||
|
|
||||||
clutter_actor_set_offscreen_redirect (actor,
|
|
||||||
CLUTTER_OFFSCREEN_REDIRECT_ALWAYS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -461,7 +461,8 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
|
|||||||
if (width == 0 || height == 0)
|
if (width == 0 || height == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
resource_scale = clutter_actor_get_resource_scale (actor);
|
if (!clutter_actor_get_resource_scale (actor, &resource_scale))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
width = ceilf (width * resource_scale);
|
width = ceilf (width * resource_scale);
|
||||||
height = ceilf (height * resource_scale);
|
height = ceilf (height * resource_scale);
|
||||||
|
@@ -899,17 +899,13 @@ st_scroll_view_init (StScrollView *self)
|
|||||||
priv->hscrollbar_policy = ST_POLICY_AUTOMATIC;
|
priv->hscrollbar_policy = ST_POLICY_AUTOMATIC;
|
||||||
priv->vscrollbar_policy = ST_POLICY_AUTOMATIC;
|
priv->vscrollbar_policy = ST_POLICY_AUTOMATIC;
|
||||||
|
|
||||||
priv->hadjustment = g_object_new (ST_TYPE_ADJUSTMENT,
|
priv->hadjustment = g_object_new (ST_TYPE_ADJUSTMENT, NULL);
|
||||||
"actor", self,
|
|
||||||
NULL);
|
|
||||||
priv->hscroll = g_object_new (ST_TYPE_SCROLL_BAR,
|
priv->hscroll = g_object_new (ST_TYPE_SCROLL_BAR,
|
||||||
"adjustment", priv->hadjustment,
|
"adjustment", priv->hadjustment,
|
||||||
"vertical", FALSE,
|
"vertical", FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
priv->vadjustment = g_object_new (ST_TYPE_ADJUSTMENT,
|
priv->vadjustment = g_object_new (ST_TYPE_ADJUSTMENT, NULL);
|
||||||
"actor", self,
|
|
||||||
NULL);
|
|
||||||
priv->vscroll = g_object_new (ST_TYPE_SCROLL_BAR,
|
priv->vscroll = g_object_new (ST_TYPE_SCROLL_BAR,
|
||||||
"adjustment", priv->vadjustment,
|
"adjustment", priv->vadjustment,
|
||||||
"vertical", TRUE,
|
"vertical", TRUE,
|
||||||
|
@@ -722,7 +722,8 @@ load_texture_async (StTextureCache *cache,
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
StTextureCache *cache;
|
StTextureCache *cache;
|
||||||
ClutterContent *image;
|
ClutterActor *actor;
|
||||||
|
gint size;
|
||||||
GObject *source;
|
GObject *source;
|
||||||
gulong notify_signal_id;
|
gulong notify_signal_id;
|
||||||
gboolean weakref_active;
|
gboolean weakref_active;
|
||||||
@@ -741,33 +742,37 @@ st_texture_cache_reset_texture (StTextureCachePropertyBind *bind,
|
|||||||
(cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32 ||
|
(cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32 ||
|
||||||
cairo_image_surface_get_format (surface) == CAIRO_FORMAT_RGB24))
|
cairo_image_surface_get_format (surface) == CAIRO_FORMAT_RGB24))
|
||||||
{
|
{
|
||||||
|
g_autoptr(ClutterContent) image = NULL;
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
int width, height, size;
|
int size = bind->size;
|
||||||
|
|
||||||
width = cairo_image_surface_get_width (surface);
|
if (size < 0)
|
||||||
height = cairo_image_surface_get_width (surface);
|
clutter_actor_get_preferred_width (bind->actor, -1, NULL, (float *)&size);
|
||||||
size = MAX(width, height);
|
|
||||||
|
|
||||||
if (!bind->image)
|
image = clutter_actor_get_content (bind->actor);
|
||||||
bind->image = st_image_content_new_with_preferred_size (size, size);
|
if (!image || !CLUTTER_IS_IMAGE (image))
|
||||||
|
image = st_image_content_new_with_preferred_size (size, size);
|
||||||
|
else
|
||||||
|
g_object_ref (image);
|
||||||
|
|
||||||
clutter_image_set_data (CLUTTER_IMAGE (bind->image),
|
clutter_image_set_data (CLUTTER_IMAGE (image),
|
||||||
cairo_image_surface_get_data (surface),
|
cairo_image_surface_get_data (surface),
|
||||||
cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32 ?
|
cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32 ?
|
||||||
COGL_PIXEL_FORMAT_BGRA_8888 : COGL_PIXEL_FORMAT_BGR_888,
|
COGL_PIXEL_FORMAT_BGRA_8888 : COGL_PIXEL_FORMAT_BGR_888,
|
||||||
width,
|
cairo_image_surface_get_width (surface),
|
||||||
height,
|
cairo_image_surface_get_height (surface),
|
||||||
cairo_image_surface_get_stride (surface),
|
cairo_image_surface_get_stride (surface),
|
||||||
&error);
|
&error);
|
||||||
|
|
||||||
if (error)
|
if (image)
|
||||||
|
clutter_actor_set_content (bind->actor, image);
|
||||||
|
else if (error)
|
||||||
g_warning ("Failed to allocate texture: %s", error->message);
|
g_warning ("Failed to allocate texture: %s", error->message);
|
||||||
|
|
||||||
|
clutter_actor_set_opacity (bind->actor, 255);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bind->image = g_object_new (ST_TYPE_IMAGE_CONTENT,
|
clutter_actor_set_opacity (bind->actor, 0);
|
||||||
"preferred-width", 0, /* tough luck */
|
|
||||||
"preferred-height", 0,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -793,48 +798,57 @@ st_texture_cache_free_bind (gpointer data)
|
|||||||
{
|
{
|
||||||
StTextureCachePropertyBind *bind = data;
|
StTextureCachePropertyBind *bind = data;
|
||||||
if (bind->weakref_active)
|
if (bind->weakref_active)
|
||||||
g_object_weak_unref (G_OBJECT (bind->image), st_texture_cache_bind_weak_notify, bind);
|
g_object_weak_unref (G_OBJECT (bind->actor), st_texture_cache_bind_weak_notify, bind);
|
||||||
g_slice_free (StTextureCachePropertyBind, bind);
|
g_slice_free (StTextureCachePropertyBind, bind);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* st_texture_cache_bind_cairo_surface_property:
|
* st_texture_cache_bind_cairo_surface_property:
|
||||||
* @cache:
|
* @cache:
|
||||||
* @object: A #GObject with a property @property_name of type #cairo_surface_t
|
* @object: A #GObject with a property @property_name of type #GdkPixbuf
|
||||||
* @property_name: Name of a property
|
* @property_name: Name of a property
|
||||||
*
|
*
|
||||||
* Create a #GIcon which tracks the #cairo_surface_t value of a GObject property
|
* Create a #ClutterActor which tracks the #cairo_surface_t value of a GObject property
|
||||||
* named by @property_name. Unlike other methods in StTextureCache, the underlying
|
* named by @property_name. Unlike other methods in StTextureCache, the underlying
|
||||||
* #CoglTexture is not shared by default with other invocations to this method.
|
* #CoglTexture is not shared by default with other invocations to this method.
|
||||||
*
|
*
|
||||||
* If the source object is destroyed, the texture will continue to show the last
|
* If the source object is destroyed, the texture will continue to show the last
|
||||||
* value of the property.
|
* value of the property.
|
||||||
*
|
*
|
||||||
* Return value: (transfer none): A new #GIcon
|
* Return value: (transfer none): A new #StWidget
|
||||||
*/
|
*/
|
||||||
GIcon *
|
StWidget *
|
||||||
st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
|
st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
|
||||||
GObject *object,
|
GObject *object,
|
||||||
const char *property_name)
|
const char *property_name,
|
||||||
|
gint size)
|
||||||
{
|
{
|
||||||
|
StWidget *widget;
|
||||||
gchar *notify_key;
|
gchar *notify_key;
|
||||||
StTextureCachePropertyBind *bind;
|
StTextureCachePropertyBind *bind;
|
||||||
|
|
||||||
|
widget = g_object_new (ST_TYPE_WIDGET,
|
||||||
|
"opacity", 0,
|
||||||
|
"width", (float)size,
|
||||||
|
"height", (float)size,
|
||||||
|
NULL);
|
||||||
|
|
||||||
bind = g_slice_new0 (StTextureCachePropertyBind);
|
bind = g_slice_new0 (StTextureCachePropertyBind);
|
||||||
bind->cache = cache;
|
bind->cache = cache;
|
||||||
|
bind->actor = CLUTTER_ACTOR (widget);
|
||||||
|
bind->size = size;
|
||||||
bind->source = object;
|
bind->source = object;
|
||||||
|
g_object_weak_ref (G_OBJECT (widget), st_texture_cache_bind_weak_notify, bind);
|
||||||
|
bind->weakref_active = TRUE;
|
||||||
|
|
||||||
st_texture_cache_reset_texture (bind, property_name);
|
st_texture_cache_reset_texture (bind, property_name);
|
||||||
|
|
||||||
g_object_weak_ref (G_OBJECT (bind->image), st_texture_cache_bind_weak_notify, bind);
|
|
||||||
bind->weakref_active = TRUE;
|
|
||||||
|
|
||||||
notify_key = g_strdup_printf ("notify::%s", property_name);
|
notify_key = g_strdup_printf ("notify::%s", property_name);
|
||||||
bind->notify_signal_id = g_signal_connect_data (object, notify_key, G_CALLBACK(st_texture_cache_on_pixbuf_notify),
|
bind->notify_signal_id = g_signal_connect_data (object, notify_key, G_CALLBACK(st_texture_cache_on_pixbuf_notify),
|
||||||
bind, (GClosureNotify)st_texture_cache_free_bind, 0);
|
bind, (GClosureNotify)st_texture_cache_free_bind, 0);
|
||||||
g_free (notify_key);
|
g_free (notify_key);
|
||||||
|
|
||||||
return G_ICON (bind->image);
|
return widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -967,18 +981,6 @@ st_texture_cache_load_gicon (StTextureCache *cache,
|
|||||||
StIconStyle icon_style = ST_ICON_STYLE_REQUESTED;
|
StIconStyle icon_style = ST_ICON_STYLE_REQUESTED;
|
||||||
GtkIconLookupFlags lookup_flags;
|
GtkIconLookupFlags lookup_flags;
|
||||||
|
|
||||||
actor_size = size * paint_scale;
|
|
||||||
|
|
||||||
if (ST_IS_IMAGE_CONTENT (icon))
|
|
||||||
{
|
|
||||||
return g_object_new (CLUTTER_TYPE_ACTOR,
|
|
||||||
"request-mode", CLUTTER_REQUEST_CONTENT_SIZE,
|
|
||||||
"width", actor_size,
|
|
||||||
"height", actor_size,
|
|
||||||
"content", CLUTTER_CONTENT (icon),
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (theme_node)
|
if (theme_node)
|
||||||
{
|
{
|
||||||
colors = st_theme_node_get_icon_colors (theme_node);
|
colors = st_theme_node_get_icon_colors (theme_node);
|
||||||
@@ -1032,6 +1034,7 @@ st_texture_cache_load_gicon (StTextureCache *cache,
|
|||||||
g_free (gicon_string);
|
g_free (gicon_string);
|
||||||
|
|
||||||
actor = create_invisible_actor ();
|
actor = create_invisible_actor ();
|
||||||
|
actor_size = size * paint_scale;
|
||||||
clutter_actor_set_size (actor, actor_size, actor_size);
|
clutter_actor_set_size (actor, actor_size, actor_size);
|
||||||
if (ensure_request (cache, key, policy, &request, actor))
|
if (ensure_request (cache, key, policy, &request, actor))
|
||||||
{
|
{
|
||||||
|
@@ -64,9 +64,10 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
|
|||||||
GFunc load_callback,
|
GFunc load_callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
GIcon *st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
|
StWidget *st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
|
||||||
GObject *object,
|
GObject *object,
|
||||||
const char *property_name);
|
const char *property_name,
|
||||||
|
gint size);
|
||||||
|
|
||||||
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
|
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
|
||||||
StThemeNode *theme_node,
|
StThemeNode *theme_node,
|
||||||
|
@@ -84,11 +84,10 @@ on_timeline_new_frame (ClutterTimeline *timeline,
|
|||||||
}
|
}
|
||||||
|
|
||||||
StThemeNodeTransition *
|
StThemeNodeTransition *
|
||||||
st_theme_node_transition_new (ClutterActor *actor,
|
st_theme_node_transition_new (StThemeNode *from_node,
|
||||||
StThemeNode *from_node,
|
StThemeNode *to_node,
|
||||||
StThemeNode *to_node,
|
|
||||||
StThemeNodePaintState *old_paint_state,
|
StThemeNodePaintState *old_paint_state,
|
||||||
unsigned int duration)
|
guint duration)
|
||||||
{
|
{
|
||||||
StThemeNodeTransition *transition;
|
StThemeNodeTransition *transition;
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (from_node), NULL);
|
g_return_val_if_fail (ST_IS_THEME_NODE (from_node), NULL);
|
||||||
@@ -104,7 +103,7 @@ st_theme_node_transition_new (ClutterActor *actor,
|
|||||||
st_theme_node_paint_state_copy (&transition->priv->old_paint_state,
|
st_theme_node_paint_state_copy (&transition->priv->old_paint_state,
|
||||||
old_paint_state);
|
old_paint_state);
|
||||||
|
|
||||||
transition->priv->timeline = clutter_timeline_new_for_actor (actor, duration);
|
transition->priv->timeline = clutter_timeline_new (duration);
|
||||||
|
|
||||||
transition->priv->timeline_completed_id =
|
transition->priv->timeline_completed_id =
|
||||||
g_signal_connect (transition->priv->timeline, "completed",
|
g_signal_connect (transition->priv->timeline, "completed",
|
||||||
|
@@ -32,11 +32,10 @@ G_BEGIN_DECLS
|
|||||||
G_DECLARE_FINAL_TYPE (StThemeNodeTransition, st_theme_node_transition,
|
G_DECLARE_FINAL_TYPE (StThemeNodeTransition, st_theme_node_transition,
|
||||||
ST, THEME_NODE_TRANSITION, GObject)
|
ST, THEME_NODE_TRANSITION, GObject)
|
||||||
|
|
||||||
StThemeNodeTransition *st_theme_node_transition_new (ClutterActor *actor,
|
StThemeNodeTransition *st_theme_node_transition_new (StThemeNode *from_node,
|
||||||
StThemeNode *from_node,
|
StThemeNode *to_node,
|
||||||
StThemeNode *to_node,
|
|
||||||
StThemeNodePaintState *old_paint_state,
|
StThemeNodePaintState *old_paint_state,
|
||||||
guint duration);
|
guint duration);
|
||||||
|
|
||||||
void st_theme_node_transition_update (StThemeNodeTransition *transition,
|
void st_theme_node_transition_update (StThemeNodeTransition *transition,
|
||||||
StThemeNode *new_node);
|
StThemeNode *new_node);
|
||||||
|
@@ -78,7 +78,6 @@ adjustment_value_notify_cb (StAdjustment *adjustment,
|
|||||||
GParamSpec *pspec,
|
GParamSpec *pspec,
|
||||||
StViewport *viewport)
|
StViewport *viewport)
|
||||||
{
|
{
|
||||||
clutter_actor_invalidate_transform (CLUTTER_ACTOR (viewport));
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (viewport));
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (viewport));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,10 +261,8 @@ st_viewport_allocate (ClutterActor *actor,
|
|||||||
clutter_actor_set_allocation (actor, box);
|
clutter_actor_set_allocation (actor, box);
|
||||||
|
|
||||||
content_box = viewport_box;
|
content_box = viewport_box;
|
||||||
if (priv->hadjustment)
|
content_box.x2 += MAX (0, min_width - avail_width);
|
||||||
content_box.x2 += MAX (0, min_width - avail_width);
|
content_box.y2 += MAX (0, min_height - avail_height);
|
||||||
if (priv->vadjustment)
|
|
||||||
content_box.y2 += MAX (0, min_height - avail_height);
|
|
||||||
|
|
||||||
clutter_layout_manager_allocate (layout, CLUTTER_CONTAINER (actor),
|
clutter_layout_manager_allocate (layout, CLUTTER_CONTAINER (actor),
|
||||||
&content_box);
|
&content_box);
|
||||||
|
@@ -124,6 +124,7 @@ enum
|
|||||||
{
|
{
|
||||||
STYLE_CHANGED,
|
STYLE_CHANGED,
|
||||||
POPUP_MENU,
|
POPUP_MENU,
|
||||||
|
RESOURCE_SCALE_CHANGED,
|
||||||
|
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
@@ -411,7 +412,8 @@ st_widget_paint_background (StWidget *widget,
|
|||||||
float resource_scale;
|
float resource_scale;
|
||||||
guint8 opacity;
|
guint8 opacity;
|
||||||
|
|
||||||
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (widget));
|
if (!st_widget_get_resource_scale (widget, &resource_scale))
|
||||||
|
return;
|
||||||
|
|
||||||
framebuffer = clutter_paint_context_get_framebuffer (paint_context);
|
framebuffer = clutter_paint_context_get_framebuffer (paint_context);
|
||||||
theme_node = st_widget_get_theme_node (widget);
|
theme_node = st_widget_get_theme_node (widget);
|
||||||
@@ -818,20 +820,6 @@ st_widget_real_get_focus_chain (StWidget *widget)
|
|||||||
return g_list_reverse (visible);
|
return g_list_reverse (visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
st_widget_resource_scale_changed (ClutterActor *actor)
|
|
||||||
{
|
|
||||||
StWidget *widget = ST_WIDGET (actor);
|
|
||||||
StWidgetPrivate *priv = st_widget_get_instance_private (widget);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++)
|
|
||||||
st_theme_node_paint_state_invalidate (&priv->paint_states[i]);
|
|
||||||
|
|
||||||
if (CLUTTER_ACTOR_CLASS (st_widget_parent_class)->resource_scale_changed)
|
|
||||||
CLUTTER_ACTOR_CLASS (st_widget_parent_class)->resource_scale_changed (actor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_widget_class_init (StWidgetClass *klass)
|
st_widget_class_init (StWidgetClass *klass)
|
||||||
{
|
{
|
||||||
@@ -861,8 +849,6 @@ st_widget_class_init (StWidgetClass *klass)
|
|||||||
actor_class->get_accessible = st_widget_get_accessible;
|
actor_class->get_accessible = st_widget_get_accessible;
|
||||||
actor_class->has_accessible = st_widget_has_accessible;
|
actor_class->has_accessible = st_widget_has_accessible;
|
||||||
|
|
||||||
actor_class->resource_scale_changed = st_widget_resource_scale_changed;
|
|
||||||
|
|
||||||
klass->style_changed = st_widget_real_style_changed;
|
klass->style_changed = st_widget_real_style_changed;
|
||||||
klass->navigate_focus = st_widget_real_navigate_focus;
|
klass->navigate_focus = st_widget_real_navigate_focus;
|
||||||
klass->get_accessible_type = st_widget_accessible_get_type;
|
klass->get_accessible_type = st_widget_accessible_get_type;
|
||||||
@@ -1016,6 +1002,21 @@ st_widget_class_init (StWidgetClass *klass)
|
|||||||
G_STRUCT_OFFSET (StWidgetClass, popup_menu),
|
G_STRUCT_OFFSET (StWidgetClass, popup_menu),
|
||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
G_TYPE_NONE, 0);
|
G_TYPE_NONE, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StWidget::resource-scale-changed:
|
||||||
|
* @widget: the #StWidget
|
||||||
|
*
|
||||||
|
* Emitted when the paint scale that the widget will be painted as
|
||||||
|
* changed.
|
||||||
|
*/
|
||||||
|
signals[RESOURCE_SCALE_CHANGED] =
|
||||||
|
g_signal_new ("resource-scale-changed",
|
||||||
|
G_TYPE_FROM_CLASS (klass),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
G_STRUCT_OFFSET (StWidgetClass, resource_scale_changed),
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const gchar *
|
static const gchar *
|
||||||
@@ -1399,6 +1400,23 @@ st_widget_get_style (StWidget *actor)
|
|||||||
return ST_WIDGET_PRIVATE (actor)->inline_style;
|
return ST_WIDGET_PRIVATE (actor)->inline_style;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* st_widget_get_resource_scale:
|
||||||
|
* @widget: A #StWidget
|
||||||
|
* @resource_scale: (out): return location for the resource scale
|
||||||
|
*
|
||||||
|
* Retrieves the resource scale for this #StWidget, if available.
|
||||||
|
*
|
||||||
|
* The resource scale refers to the scale the actor should use for its resources.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
st_widget_get_resource_scale (StWidget *widget,
|
||||||
|
float *resource_scale)
|
||||||
|
{
|
||||||
|
return clutter_actor_get_resource_scale (CLUTTER_ACTOR (widget),
|
||||||
|
resource_scale);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_widget_set_first_visible_child (StWidget *widget,
|
st_widget_set_first_visible_child (StWidget *widget,
|
||||||
ClutterActor *actor)
|
ClutterActor *actor)
|
||||||
@@ -1465,6 +1483,23 @@ st_widget_name_notify (StWidget *widget,
|
|||||||
st_widget_style_changed (widget);
|
st_widget_style_changed (widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
st_widget_resource_scale_notify (StWidget *widget,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
StWidgetPrivate *priv = st_widget_get_instance_private (widget);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++)
|
||||||
|
st_theme_node_paint_state_invalidate (&priv->paint_states[i]);
|
||||||
|
|
||||||
|
g_signal_emit (widget, signals[RESOURCE_SCALE_CHANGED], 0);
|
||||||
|
|
||||||
|
if (clutter_actor_is_mapped (CLUTTER_ACTOR (widget)))
|
||||||
|
clutter_actor_queue_redraw (CLUTTER_ACTOR (widget));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_widget_reactive_notify (StWidget *widget,
|
st_widget_reactive_notify (StWidget *widget,
|
||||||
GParamSpec *pspec,
|
GParamSpec *pspec,
|
||||||
@@ -1616,6 +1651,7 @@ st_widget_init (StWidget *actor)
|
|||||||
|
|
||||||
/* connect style changed */
|
/* connect style changed */
|
||||||
g_signal_connect (actor, "notify::name", G_CALLBACK (st_widget_name_notify), NULL);
|
g_signal_connect (actor, "notify::name", G_CALLBACK (st_widget_name_notify), NULL);
|
||||||
|
g_signal_connect (actor, "notify::resource-scale", G_CALLBACK (st_widget_resource_scale_notify), NULL);
|
||||||
g_signal_connect (actor, "notify::reactive", G_CALLBACK (st_widget_reactive_notify), NULL);
|
g_signal_connect (actor, "notify::reactive", G_CALLBACK (st_widget_reactive_notify), NULL);
|
||||||
|
|
||||||
g_signal_connect (actor, "notify::visible", G_CALLBACK (st_widget_visible_notify), NULL);
|
g_signal_connect (actor, "notify::visible", G_CALLBACK (st_widget_visible_notify), NULL);
|
||||||
@@ -1687,8 +1723,7 @@ st_widget_recompute_style (StWidget *widget,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
priv->transition_animation =
|
priv->transition_animation =
|
||||||
st_theme_node_transition_new (CLUTTER_ACTOR (widget),
|
st_theme_node_transition_new (old_theme_node,
|
||||||
old_theme_node,
|
|
||||||
new_theme_node,
|
new_theme_node,
|
||||||
current_paint_state (widget),
|
current_paint_state (widget),
|
||||||
transition_duration);
|
transition_duration);
|
||||||
|
@@ -63,6 +63,7 @@ struct _StWidgetClass
|
|||||||
/* signals */
|
/* signals */
|
||||||
void (* style_changed) (StWidget *self);
|
void (* style_changed) (StWidget *self);
|
||||||
void (* popup_menu) (StWidget *self);
|
void (* popup_menu) (StWidget *self);
|
||||||
|
void (* resource_scale_changed) (StWidget *self);
|
||||||
|
|
||||||
/* vfuncs */
|
/* vfuncs */
|
||||||
|
|
||||||
@@ -134,6 +135,8 @@ StThemeNode * st_widget_peek_theme_node (StWidget *widg
|
|||||||
GList * st_widget_get_focus_chain (StWidget *widget);
|
GList * st_widget_get_focus_chain (StWidget *widget);
|
||||||
void st_widget_paint_background (StWidget *widget,
|
void st_widget_paint_background (StWidget *widget,
|
||||||
ClutterPaintContext *paint_context);
|
ClutterPaintContext *paint_context);
|
||||||
|
gboolean st_widget_get_resource_scale (StWidget *widget,
|
||||||
|
float *resource_scale);
|
||||||
|
|
||||||
/* debug methods */
|
/* debug methods */
|
||||||
char *st_describe_actor (ClutterActor *actor);
|
char *st_describe_actor (ClutterActor *actor);
|
||||||
|
@@ -566,26 +566,26 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
root = st_theme_context_get_root_node (context);
|
root = st_theme_context_get_root_node (context);
|
||||||
group1 = st_theme_node_new (context, root, NULL,
|
group1 = st_theme_node_new (context, root, NULL,
|
||||||
CLUTTER_TYPE_ACTOR, "group1", NULL, NULL, NULL);
|
CLUTTER_TYPE_GROUP, "group1", NULL, NULL, NULL);
|
||||||
text1 = st_theme_node_new (context, group1, NULL,
|
text1 = st_theme_node_new (context, group1, NULL,
|
||||||
CLUTTER_TYPE_TEXT, "text1", "special-text", NULL, NULL);
|
CLUTTER_TYPE_TEXT, "text1", "special-text", NULL, NULL);
|
||||||
text2 = st_theme_node_new (context, group1, NULL,
|
text2 = st_theme_node_new (context, group1, NULL,
|
||||||
CLUTTER_TYPE_TEXT, "text2", NULL, NULL, NULL);
|
CLUTTER_TYPE_TEXT, "text2", NULL, NULL, NULL);
|
||||||
group2 = st_theme_node_new (context, root, NULL,
|
group2 = st_theme_node_new (context, root, NULL,
|
||||||
CLUTTER_TYPE_ACTOR, "group2", NULL, NULL, NULL);
|
CLUTTER_TYPE_GROUP, "group2", NULL, NULL, NULL);
|
||||||
group4 = st_theme_node_new (context, root, NULL,
|
group4 = st_theme_node_new (context, root, NULL,
|
||||||
CLUTTER_TYPE_ACTOR, "group4", NULL, NULL, NULL);
|
CLUTTER_TYPE_GROUP, "group4", NULL, NULL, NULL);
|
||||||
group5 = st_theme_node_new (context, root, NULL,
|
group5 = st_theme_node_new (context, root, NULL,
|
||||||
CLUTTER_TYPE_ACTOR, "group5", NULL, NULL, NULL);
|
CLUTTER_TYPE_GROUP, "group5", NULL, NULL, NULL);
|
||||||
group6 = st_theme_node_new (context, root, NULL,
|
group6 = st_theme_node_new (context, root, NULL,
|
||||||
CLUTTER_TYPE_ACTOR, "group6", NULL, NULL, NULL);
|
CLUTTER_TYPE_GROUP, "group6", NULL, NULL, NULL);
|
||||||
text3 = st_theme_node_new (context, group2, NULL,
|
text3 = st_theme_node_new (context, group2, NULL,
|
||||||
CLUTTER_TYPE_TEXT, "text3", NULL, NULL,
|
CLUTTER_TYPE_TEXT, "text3", NULL, NULL,
|
||||||
"color: #0000ff; padding-bottom: 12px;");
|
"color: #0000ff; padding-bottom: 12px;");
|
||||||
text4 = st_theme_node_new (context, group2, NULL,
|
text4 = st_theme_node_new (context, group2, NULL,
|
||||||
CLUTTER_TYPE_TEXT, "text4", NULL, "visited hover", NULL);
|
CLUTTER_TYPE_TEXT, "text4", NULL, "visited hover", NULL);
|
||||||
group3 = st_theme_node_new (context, group2, NULL,
|
group3 = st_theme_node_new (context, group2, NULL,
|
||||||
CLUTTER_TYPE_ACTOR, "group3", NULL, "hover", NULL);
|
CLUTTER_TYPE_GROUP, "group3", NULL, "hover", NULL);
|
||||||
button = st_theme_node_new (context, root, NULL,
|
button = st_theme_node_new (context, root, NULL,
|
||||||
ST_TYPE_BUTTON, "button", NULL, NULL, NULL);
|
ST_TYPE_BUTTON, "button", NULL, NULL, NULL);
|
||||||
|
|
||||||
|
@@ -39,7 +39,6 @@
|
|||||||
</description>
|
</description>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
<release version="3.37.3" date="2020-07-07"/>
|
|
||||||
<release version="3.37.2" date="2020-06-02"/>
|
<release version="3.37.2" date="2020-06-02"/>
|
||||||
<release version="3.37.1" date="2020-04-29"/>
|
<release version="3.37.1" date="2020-04-29"/>
|
||||||
</releases>
|
</releases>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
project('gnome-extensions-app',
|
project('gnome-extensions-app',
|
||||||
version: '3.37.3',
|
version: '3.37.2',
|
||||||
meson_version: '>= 0.53.0',
|
meson_version: '>= 0.53.0',
|
||||||
license: 'GPLv2+'
|
license: 'GPLv2+'
|
||||||
)
|
)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
project('gnome-extensions-tool', 'c',
|
project('gnome-extensions-tool', 'c',
|
||||||
version: '3.37.3',
|
version: '3.37.2',
|
||||||
meson_version: '>= 0.53.0',
|
meson_version: '>= 0.53.0',
|
||||||
license: 'GPLv2+'
|
license: 'GPLv2+'
|
||||||
)
|
)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
project('shew', 'c',
|
project('shew', 'c',
|
||||||
version: '3.37.3',
|
version: '3.37.2',
|
||||||
meson_version: '>= 0.53.0',
|
meson_version: '>= 0.53.0',
|
||||||
license: 'LGPLv2+',
|
license: 'LGPLv2+',
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user