Compare commits
71 Commits
wip/ewlsh/
...
3.37.3
Author | SHA1 | Date | |
---|---|---|---|
7031449f01 | |||
06df79286d | |||
9297d87775 | |||
ef56b14553 | |||
30ff76272e | |||
52a7481ba6 | |||
14cfd74f08 | |||
fa97f7141b | |||
03bcd4c05b | |||
89574abc83 | |||
602078cbde | |||
96f63b08c2 | |||
d66cd0d206 | |||
ff13ad9e71 | |||
5e4b65d37e | |||
51fd0875d1 | |||
75f8903c7e | |||
124eb1ca18 | |||
b5d925817f | |||
c134091268 | |||
ff89693998 | |||
c26860dcb7 | |||
6757c7d20a | |||
751189253a | |||
21187a4cec | |||
b7db56ca9b | |||
261d36ba72 | |||
1e72874192 | |||
f29dbd1f18 | |||
b60836932a | |||
bf47d1b22d | |||
4ea0fca4fc | |||
809f820cd4 | |||
75235624b2 | |||
5ea54426b9 | |||
4aabcd9e7d | |||
918b3eeb42 | |||
482c655590 | |||
86b5a43008 | |||
d7cb2eeebc | |||
770231c2d7 | |||
ecdf62d63e | |||
d885486397 | |||
1524abc947 | |||
cb9842e4a4 | |||
140ab4dec1 | |||
845122497b | |||
d51a622fc0 | |||
e90466347a | |||
73f8c1c482 | |||
0ff75941ea | |||
e4bb2037ca | |||
481014ac9e | |||
6dbcb5f9da | |||
c1f06daf88 | |||
0717f76362 | |||
da738988cd | |||
e86e88ea47 | |||
ae338af1e8 | |||
3f9cc0ed37 | |||
8f8ecdb983 | |||
8f547c9d5d | |||
821f3e8ddf | |||
81be25bbd6 | |||
26d27fdbf8 | |||
c7e597cf72 | |||
e4db68a1da | |||
980a90f8fb | |||
87e4bf52b7 | |||
a368df61ac | |||
5e66b104dc |
35
NEWS
35
NEWS
@ -1,3 +1,38 @@
|
|||||||
|
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]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* Window Picker */
|
/* Window Picker */
|
||||||
|
|
||||||
$window_picker_spacing: $base_spacing * 2; // 16px
|
$window_picker_spacing: $base_spacing; // 6px
|
||||||
$window_picker_padding: $base_padding * 2; // 16px
|
$window_picker_padding: $base_padding * 2; // 12px
|
||||||
|
|
||||||
$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
|
||||||
-horizontal-spacing: $window_picker_spacing;
|
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('ovirt-user-authenticated', this._onOVirtUserAuthenticated.bind(this));
|
this._userVerifier.connect('credential-manager-authenticated', this._onCredentialManagerAuthenticated.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');
|
||||||
}
|
}
|
||||||
|
|
||||||
_onOVirtUserAuthenticated() {
|
_onCredentialManagerAuthenticated() {
|
||||||
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
||||||
this.reset();
|
this.reset();
|
||||||
}
|
}
|
||||||
|
24
js/gdm/credentialManager.js
Normal file
24
js/gdm/credentialManager.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// -*- 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 [valid, resourceScale] = this._logoBin.get_resource_scale();
|
const resourceScale = this._logoBin.get_resource_scale();
|
||||||
if (this._logoFile && valid) {
|
if (this._logoFile) {
|
||||||
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,6 +3,9 @@
|
|||||||
|
|
||||||
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>
|
||||||
@ -28,30 +31,14 @@ function OVirtCredentials() {
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
var OVirtCredentialsManager = class {
|
var OVirtCredentialsManager = class OVirtCredentialsManager extends Credential.CredentialManager {
|
||||||
constructor() {
|
constructor() {
|
||||||
this._token = null;
|
super(SERVICE_NAME);
|
||||||
|
|
||||||
this._credentials = new OVirtCredentials();
|
this._credentials = new OVirtCredentials();
|
||||||
this._credentials.connectSignal('UserAuthenticated',
|
this._credentials.connectSignal('UserAuthenticated',
|
||||||
this._onUserAuthenticated.bind(this));
|
(proxy, sender, [token]) => {
|
||||||
}
|
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,6 +8,7 @@ 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;
|
||||||
@ -24,7 +25,6 @@ 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,13 +160,20 @@ var ShellUserVerifier = class {
|
|||||||
|
|
||||||
this._failCounter = 0;
|
this._failCounter = 0;
|
||||||
|
|
||||||
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
|
this._credentialManagers = {};
|
||||||
|
this._credentialManagers[OVirt.SERVICE_NAME] = OVirt.getOVirtCredentialsManager();
|
||||||
|
this._credentialManagers[Vmware.SERVICE_NAME] = Vmware.getVmwareCredentialsManager();
|
||||||
|
|
||||||
if (this._oVirtCredentialsManager.hasToken())
|
for (let service in this._credentialManagers) {
|
||||||
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
|
if (this._credentialManagers[service].token) {
|
||||||
|
this._onCredentialManagerAuthenticated(this._credentialManagers[service],
|
||||||
|
this._credentialManagers[service].token);
|
||||||
|
}
|
||||||
|
|
||||||
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
|
this._credentialManagers[service]._authenticatedSignalId =
|
||||||
this._oVirtUserAuthenticated.bind(this));
|
this._credentialManagers[service].connect('user-authenticated',
|
||||||
|
this._onCredentialManagerAuthenticated.bind(this));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
begin(userName, hold) {
|
begin(userName, hold) {
|
||||||
@ -222,8 +229,11 @@ var ShellUserVerifier = class {
|
|||||||
this._smartcardManager.disconnect(this._smartcardRemovedId);
|
this._smartcardManager.disconnect(this._smartcardRemovedId);
|
||||||
this._smartcardManager = null;
|
this._smartcardManager = null;
|
||||||
|
|
||||||
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
|
for (let service in this._credentialManagers) {
|
||||||
this._oVirtCredentialsManager = null;
|
let credentialManager = this._credentialManagers[service];
|
||||||
|
credentialManager.disconnect(credentialManager._authenticatedSignalId);
|
||||||
|
credentialManager = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
answerQuery(serviceName, answer) {
|
answerQuery(serviceName, answer) {
|
||||||
@ -311,9 +321,9 @@ var ShellUserVerifier = class {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_oVirtUserAuthenticated(_token) {
|
_onCredentialManagerAuthenticated(credentialManager, _token) {
|
||||||
this._preemptingService = OVIRT_SERVICE_NAME;
|
this._preemptingService = credentialManager.service;
|
||||||
this.emit('ovirt-user-authenticated');
|
this.emit('credential-manager-authenticated');
|
||||||
}
|
}
|
||||||
|
|
||||||
_checkForSmartcard() {
|
_checkForSmartcard() {
|
||||||
@ -490,9 +500,12 @@ var ShellUserVerifier = class {
|
|||||||
if (!this.serviceIsForeground(serviceName))
|
if (!this.serviceIsForeground(serviceName))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (serviceName == OVIRT_SERVICE_NAME) {
|
let token = null;
|
||||||
// The only question asked by this service is "Token?"
|
if (this._credentialManagers[serviceName])
|
||||||
this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken());
|
token = this._credentialManagers[serviceName].token;
|
||||||
|
|
||||||
|
if (token) {
|
||||||
|
this.answerQuery(serviceName, token);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -560,8 +573,10 @@ 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.
|
||||||
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
|
let foregroundService = Object.keys(this._credentialManagers).find(service =>
|
||||||
this._oVirtCredentialsManager.resetToken();
|
this.serviceIsForeground(service));
|
||||||
|
if (foregroundService) {
|
||||||
|
this._credentialManagers[foregroundService].token = null;
|
||||||
this._preemptingService = null;
|
this._preemptingService = null;
|
||||||
this._verificationFailed(false);
|
this._verificationFailed(false);
|
||||||
return;
|
return;
|
||||||
|
54
js/gdm/vmware.js
Normal file
54
js/gdm/vmware.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
// -*- 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,6 +6,8 @@
|
|||||||
<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>
|
||||||
|
|
||||||
|
@ -852,6 +852,9 @@ 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) {
|
||||||
let [validResourceScale, resourceScale] = this.get_resource_scale();
|
const resourceScale = this.get_resource_scale();
|
||||||
let wasPlaying = this._isPlaying;
|
let wasPlaying = this._isPlaying;
|
||||||
|
|
||||||
if (this._isPlaying)
|
if (this._isPlaying)
|
||||||
@ -69,12 +69,6 @@ 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,
|
||||||
|
@ -1782,8 +1782,8 @@ var AppFolderDialog = GObject.registerClass({
|
|||||||
this._zoomAndFadeOut();
|
this._zoomAndFadeOut();
|
||||||
this._showFolderLabel();
|
this._showFolderLabel();
|
||||||
|
|
||||||
this._grabHelper.ungrab({ actor: this });
|
|
||||||
this._isOpen = false;
|
this._isOpen = false;
|
||||||
|
this._grabHelper.ungrab({ actor: this });
|
||||||
this.emit('open-state-changed', false);
|
this.emit('open-state-changed', false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -2185,17 +2185,20 @@ var AppIcon = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
||||||
constructor(source, side) {
|
constructor(source) {
|
||||||
|
let side = St.Side.LEFT;
|
||||||
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||||
|
side = St.Side.RIGHT;
|
||||||
|
|
||||||
super(source, 0.5, side);
|
super(source, 0.5, side);
|
||||||
|
|
||||||
this._source = source;
|
// We want to keep the item hovered while the menu is up
|
||||||
this._appSystem = Shell.AppSystem.get_default();
|
this.blockSourceEvents = true;
|
||||||
|
|
||||||
this._appSystem.connect('installed-changed', () => {
|
this._source = source;
|
||||||
this._updateDetailsVisibility();
|
|
||||||
});
|
this.actor.add_style_class_name('app-well-menu');
|
||||||
this._updateDetailsVisibility();
|
|
||||||
|
|
||||||
// Chain our visibility and lifecycle to that of the source
|
// Chain our visibility and lifecycle to that of the source
|
||||||
this._sourceMappedId = source.connect('notify::mapped', () => {
|
this._sourceMappedId = source.connect('notify::mapped', () => {
|
||||||
@ -2206,50 +2209,14 @@ var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
|||||||
source.disconnect(this._sourceMappedId);
|
source.disconnect(this._sourceMappedId);
|
||||||
this.destroy();
|
this.destroy();
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
_updateDetailsVisibility() {
|
Main.uiGroup.add_actor(this.actor);
|
||||||
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
|
||||||
this._detailsItem.visible = sw != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
get app() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
isEmpty() {
|
|
||||||
const { app } = this;
|
|
||||||
|
|
||||||
if (!app)
|
|
||||||
return true;
|
|
||||||
return super.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
_updateWindowsSection() {
|
|
||||||
this._windowSection.removeAll();
|
|
||||||
|
|
||||||
if (!this.app)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let windows = this.app.get_windows().filter(
|
|
||||||
w => !w.skip_taskbar);
|
|
||||||
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));
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_rebuildMenu() {
|
_rebuildMenu() {
|
||||||
this.removeAll();
|
this.removeAll();
|
||||||
|
|
||||||
let windows = this.app.get_windows().filter(
|
let windows = this._source.app.get_windows().filter(
|
||||||
w => !w.skip_taskbar);
|
w => !w.skip_taskbar);
|
||||||
|
|
||||||
if (windows.length > 0) {
|
if (windows.length > 0) {
|
||||||
@ -2258,29 +2225,33 @@ var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
|||||||
new PopupMenu.PopupSeparatorMenuItem(_('Open Windows')));
|
new PopupMenu.PopupSeparatorMenuItem(_('Open Windows')));
|
||||||
}
|
}
|
||||||
|
|
||||||
this._windowSection = new PopupMenu.PopupMenuSection();
|
windows.forEach(window => {
|
||||||
this.addMenuItem(this._windowSection);
|
let title = window.title
|
||||||
|
? window.title : this._source.app.get_name();
|
||||||
|
let item = this._appendMenuItem(title);
|
||||||
|
item.connect('activate', () => {
|
||||||
|
this.emit('activate-window', window);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
this._updateWindowsSection();
|
if (!this._source.app.is_window_backed()) {
|
||||||
|
|
||||||
if (!this.app.is_window_backed()) {
|
|
||||||
this._appendSeparator();
|
this._appendSeparator();
|
||||||
|
|
||||||
let appInfo = this.app.get_app_info();
|
let appInfo = this._source.app.get_app_info();
|
||||||
let actions = appInfo.list_actions();
|
let actions = appInfo.list_actions();
|
||||||
if (this.app.can_open_new_window() &&
|
if (this._source.app.can_open_new_window() &&
|
||||||
!actions.includes('new-window')) {
|
!actions.includes('new-window')) {
|
||||||
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
|
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
|
||||||
this._newWindowMenuItem.connect('activate', () => {
|
this._newWindowMenuItem.connect('activate', () => {
|
||||||
this._source.animateLaunch();
|
this._source.animateLaunch();
|
||||||
this.app.open_new_window(-1);
|
this._source.app.open_new_window(-1);
|
||||||
this.emit('activate-window', null);
|
this.emit('activate-window', null);
|
||||||
});
|
});
|
||||||
this._appendSeparator();
|
this._appendSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (discreteGpuAvailable &&
|
if (discreteGpuAvailable &&
|
||||||
this.app.state == Shell.AppState.STOPPED) {
|
this._source.app.state == Shell.AppState.STOPPED) {
|
||||||
const appPrefersNonDefaultGPU = appInfo.get_boolean('PrefersNonDefaultGPU');
|
const appPrefersNonDefaultGPU = appInfo.get_boolean('PrefersNonDefaultGPU');
|
||||||
const gpuPref = appPrefersNonDefaultGPU
|
const gpuPref = appPrefersNonDefaultGPU
|
||||||
? Shell.AppLaunchGpu.DEFAULT
|
? Shell.AppLaunchGpu.DEFAULT
|
||||||
@ -2290,7 +2261,7 @@ var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
|||||||
: _('Launch using Discrete Graphics Card'));
|
: _('Launch using Discrete Graphics Card'));
|
||||||
this._onGpuMenuItem.connect('activate', () => {
|
this._onGpuMenuItem.connect('activate', () => {
|
||||||
this._source.animateLaunch();
|
this._source.animateLaunch();
|
||||||
this.app.launch(0, -1, gpuPref);
|
this._source.app.launch(0, -1, gpuPref);
|
||||||
this.emit('activate-window', null);
|
this.emit('activate-window', null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2302,7 +2273,7 @@ var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
|||||||
if (action == 'new-window')
|
if (action == 'new-window')
|
||||||
this._source.animateLaunch();
|
this._source.animateLaunch();
|
||||||
|
|
||||||
this.app.launch_action(action, event.get_time(), -1);
|
this._source.app.launch_action(action, event.get_time(), -1);
|
||||||
this.emit('activate-window', null);
|
this.emit('activate-window', null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2312,19 +2283,19 @@ var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
|||||||
if (canFavorite) {
|
if (canFavorite) {
|
||||||
this._appendSeparator();
|
this._appendSeparator();
|
||||||
|
|
||||||
let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._app.get_id());
|
let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id());
|
||||||
|
|
||||||
if (isFavorite) {
|
if (isFavorite) {
|
||||||
let item = this._appendMenuItem(_("Remove from Favorites"));
|
let item = this._appendMenuItem(_("Remove from Favorites"));
|
||||||
item.connect('activate', () => {
|
item.connect('activate', () => {
|
||||||
let favs = AppFavorites.getAppFavorites();
|
let favs = AppFavorites.getAppFavorites();
|
||||||
favs.removeFavorite(this.app.get_id());
|
favs.removeFavorite(this._source.app.get_id());
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
let item = this._appendMenuItem(_("Add to Favorites"));
|
let item = this._appendMenuItem(_("Add to Favorites"));
|
||||||
item.connect('activate', () => {
|
item.connect('activate', () => {
|
||||||
let favs = AppFavorites.getAppFavorites();
|
let favs = AppFavorites.getAppFavorites();
|
||||||
favs.addFavorite(this.app.get_id());
|
favs.addFavorite(this._source.app.get_id());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2333,7 +2304,7 @@ var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
|||||||
this._appendSeparator();
|
this._appendSeparator();
|
||||||
let item = this._appendMenuItem(_("Show Details"));
|
let item = this._appendMenuItem(_("Show Details"));
|
||||||
item.connect('activate', async () => {
|
item.connect('activate', async () => {
|
||||||
let id = this.app.get_id();
|
let id = this._source.app.get_id();
|
||||||
let args = GLib.Variant.new('(ss)', [id, '']);
|
let args = GLib.Variant.new('(ss)', [id, '']);
|
||||||
const bus = await Gio.DBus.get(Gio.BusType.SESSION, null);
|
const bus = await Gio.DBus.get(Gio.BusType.SESSION, null);
|
||||||
bus.call(
|
bus.call(
|
||||||
@ -2345,17 +2316,7 @@ var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
|||||||
null, 0, -1, null);
|
null, 0, -1, null);
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
this._detailsItem = item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._appendSeparator();
|
|
||||||
|
|
||||||
let item = this._appendMenuItem(_("Quit"));
|
|
||||||
|
|
||||||
item.connect('activate', () => {
|
|
||||||
this.app.request_quit();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2378,27 +2339,6 @@ var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
|
|||||||
};
|
};
|
||||||
Signals.addSignalMethods(AppIconMenu.prototype);
|
Signals.addSignalMethods(AppIconMenu.prototype);
|
||||||
|
|
||||||
var AppIconMenu = class AppIconMenu extends BaseAppMenu {
|
|
||||||
constructor(source) {
|
|
||||||
let side = St.Side.LEFT;
|
|
||||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
|
||||||
side = St.Side.RIGHT;
|
|
||||||
|
|
||||||
super(source, side);
|
|
||||||
|
|
||||||
// We want to keep the item hovered while the menu is up
|
|
||||||
this.blockSourceEvents = true;
|
|
||||||
|
|
||||||
this.actor.add_style_class_name('app-well-menu');
|
|
||||||
|
|
||||||
Main.uiGroup.add_actor(this.actor);
|
|
||||||
}
|
|
||||||
|
|
||||||
get app() {
|
|
||||||
return this._source.app;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var SystemActionIcon = GObject.registerClass(
|
var SystemActionIcon = GObject.registerClass(
|
||||||
class SystemActionIcon extends Search.GridSearchResult {
|
class SystemActionIcon extends Search.GridSearchResult {
|
||||||
activate() {
|
activate() {
|
||||||
|
@ -712,13 +712,18 @@ var BackgroundManager = class BackgroundManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let newBackgroundActor = this._createBackgroundActor();
|
let newBackgroundActor = this._createBackgroundActor();
|
||||||
newBackgroundActor.vignette_sharpness = this.backgroundActor.vignette_sharpness;
|
|
||||||
newBackgroundActor.brightness = this.backgroundActor.brightness;
|
const oldContent = this.backgroundActor.content;
|
||||||
|
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;
|
||||||
|
|
||||||
let background = newBackgroundActor.background;
|
const { background } = newBackgroundActor.content;
|
||||||
|
|
||||||
if (background.isLoaded) {
|
if (background.isLoaded) {
|
||||||
this._swapBackgroundActor();
|
this._swapBackgroundActor();
|
||||||
|
@ -784,6 +784,7 @@ 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, GObject, Meta, Pango, St } = imports.gi;
|
const { Clutter, GLib, GObject, Meta, Pango, St } = imports.gi;
|
||||||
|
|
||||||
function _setLabel(label, value) {
|
function _setLabel(label, value) {
|
||||||
label.set({
|
label.set({
|
||||||
@ -221,13 +221,16 @@ 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 false;
|
return GLib.SOURCE_REMOVE;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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');
|
||||||
@ -237,6 +240,9 @@ 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');
|
||||||
}
|
}
|
||||||
|
@ -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 = 25;
|
const ICON_POSITION_DELAY = 10;
|
||||||
|
|
||||||
const defaultGridModes = [
|
const defaultGridModes = [
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* exported InhibitShortcutsDialog */
|
/* exported InhibitShortcutsDialog */
|
||||||
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Pango, 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,6 +90,8 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +61,24 @@ 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();
|
||||||
@ -1608,7 +1626,9 @@ 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.
|
||||||
*/
|
*/
|
||||||
this.height = Math.min(maxHeight, this.get_preferred_height(monitor.width));
|
const forWidth = this.get_theme_node().adjust_for_width(monitor.width);
|
||||||
|
const [, natHeight] = this.get_preferred_height(forWidth);
|
||||||
|
this.height = Math.min(maxHeight, natHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1204,7 +1204,8 @@ 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_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
|
this.set_pivot_point(1.0, 0.0);
|
||||||
|
this.translation_x = -this.width;
|
||||||
} else {
|
} else {
|
||||||
this._corner.set_position(0, 0);
|
this._corner.set_position(0, 0);
|
||||||
}
|
}
|
||||||
|
@ -489,7 +489,10 @@ 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_anchor_point(xHot, yHot);
|
this._mouseSprite.set({
|
||||||
|
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, SourceActorWithLabel,
|
NotificationApplicationPolicy, Source, SourceActor,
|
||||||
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,77 +655,6 @@ 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,6 +4,10 @@
|
|||||||
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;
|
||||||
@ -14,9 +18,6 @@ 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
|
||||||
@ -439,19 +440,19 @@ var Overview = class {
|
|||||||
this.emit('windows-restacked', stackIndices);
|
this.emit('windows-restacked', stackIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
beginItemDrag(_source) {
|
beginItemDrag(source) {
|
||||||
this.emit('item-drag-begin');
|
this.emit('item-drag-begin', source);
|
||||||
this._inItemDrag = true;
|
this._inItemDrag = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cancelledItemDrag(_source) {
|
cancelledItemDrag(source) {
|
||||||
this.emit('item-drag-cancelled');
|
this.emit('item-drag-cancelled', source);
|
||||||
}
|
}
|
||||||
|
|
||||||
endItemDrag(_source) {
|
endItemDrag(source) {
|
||||||
if (!this._inItemDrag)
|
if (!this._inItemDrag)
|
||||||
return;
|
return;
|
||||||
this.emit('item-drag-end');
|
this.emit('item-drag-end', source);
|
||||||
this._inItemDrag = false;
|
this._inItemDrag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,8 +8,9 @@ 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 = 160;
|
var SIDE_CONTROLS_ANIMATION_TIME = Overview.ANIMATION_TIME;
|
||||||
|
|
||||||
function getRtlSlideDirection(direction, actor) {
|
function getRtlSlideDirection(direction, actor) {
|
||||||
let rtl = actor.text_direction == Clutter.TextDirection.RTL;
|
let rtl = actor.text_direction == Clutter.TextDirection.RTL;
|
||||||
@ -422,6 +423,7 @@ 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,
|
||||||
@ -453,8 +455,6 @@ 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,26 +477,6 @@ 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,7 +5,6 @@ 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;
|
||||||
@ -61,20 +60,69 @@ 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 AppDisplay.BaseAppMenu {
|
class AppMenu extends PopupMenu.PopupMenu {
|
||||||
constructor(sourceActor) {
|
constructor(sourceActor) {
|
||||||
super(sourceActor, St.Side.TOP);
|
super(sourceActor, 0.5, 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
get app() {
|
_updateDetailsVisibility() {
|
||||||
return this._app;
|
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
||||||
|
this._detailsItem.visible = sw != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
isEmpty() {
|
||||||
|
if (!this._app)
|
||||||
|
return true;
|
||||||
|
return super.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
setApp(app) {
|
setApp(app) {
|
||||||
@ -109,6 +157,25 @@ class AppMenu extends AppDisplay.BaseAppMenu {
|
|||||||
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));
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -608,7 +675,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.set_anchor_point(0, borderWidth);
|
this.translation_y = -borderWidth;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -62,6 +62,7 @@ var StreamSlider = class {
|
|||||||
|
|
||||||
this._stream = null;
|
this._stream = null;
|
||||||
this._volumeCancellable = null;
|
this._volumeCancellable = null;
|
||||||
|
this._icons = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
get stream() {
|
get stream() {
|
||||||
@ -182,24 +183,15 @@ 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());
|
||||||
if (n < 1)
|
n = Math.clamp(n, 1, this._icons.length - 1);
|
||||||
n = 1;
|
|
||||||
else if (n > 3)
|
|
||||||
n = 4;
|
|
||||||
}
|
}
|
||||||
return icons[n];
|
return this._icons[n];
|
||||||
}
|
}
|
||||||
|
|
||||||
getLevel() {
|
getLevel() {
|
||||||
@ -223,6 +215,13 @@ 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) {
|
||||||
@ -274,6 +273,12 @@ 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) {
|
||||||
@ -319,7 +324,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('icon-changed');
|
this.emit('output-icon-changed');
|
||||||
});
|
});
|
||||||
this.addMenuItem(this._output.item);
|
this.addMenuItem(this._output.item);
|
||||||
|
|
||||||
@ -327,6 +332,9 @@ 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());
|
||||||
@ -343,7 +351,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
|||||||
this._readInput();
|
this._readInput();
|
||||||
this._readOutput();
|
this._readOutput();
|
||||||
} else {
|
} else {
|
||||||
this.emit('icon-changed');
|
this.emit('output-icon-changed');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -355,10 +363,14 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
|||||||
this._input.stream = this._control.get_default_source();
|
this._input.stream = this._control.get_default_source();
|
||||||
}
|
}
|
||||||
|
|
||||||
getIcon() {
|
getOutputIcon() {
|
||||||
return this._output.getIcon();
|
return this._output.getIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getInputIcon() {
|
||||||
|
return this._input.getIcon();
|
||||||
|
}
|
||||||
|
|
||||||
getLevel() {
|
getLevel() {
|
||||||
return this._output.getLevel();
|
return this._output.getLevel();
|
||||||
}
|
}
|
||||||
@ -382,21 +394,24 @@ 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('icon-changed', () => {
|
this._volumeMenu.connect('output-icon-changed', () => {
|
||||||
let icon = this._volumeMenu.getIcon();
|
let icon = this._volumeMenu.getOutputIcon();
|
||||||
|
|
||||||
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.set({
|
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
|
||||||
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);
|
||||||
}
|
}
|
||||||
@ -406,7 +421,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.getIcon() });
|
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getOutputIcon() });
|
||||||
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,6 +485,7 @@ 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,
|
||||||
@ -524,6 +525,10 @@ 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));
|
||||||
@ -568,11 +573,9 @@ 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));
|
||||||
|
|
||||||
@ -626,6 +629,7 @@ 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({
|
||||||
@ -637,19 +641,17 @@ 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);
|
||||||
|
|
||||||
let effect = new Shell.BlurEffect({
|
for (const widget of this._backgroundGroup) {
|
||||||
brightness: BLUR_BRIGHTNESS,
|
widget.get_effect('blur').set({
|
||||||
sigma: BLUR_SIGMA * themeContext.scale_factor,
|
brightness: BLUR_BRIGHTNESS,
|
||||||
});
|
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() {
|
||||||
@ -661,6 +663,7 @@ 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,10 +299,6 @@ 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();
|
||||||
|
@ -1800,8 +1800,7 @@ var WindowManager = class {
|
|||||||
w.window.get_parent().remove_child(w.window);
|
w.window.get_parent().remove_child(w.window);
|
||||||
w.parent.add_child(w.window);
|
w.parent.add_child(w.window);
|
||||||
|
|
||||||
if (w.window.get_meta_window().get_workspace() !=
|
if (!w.window.get_meta_window().get_workspace().active)
|
||||||
global.workspace_manager.get_active_workspace())
|
|
||||||
w.window.hide();
|
w.window.hide();
|
||||||
}
|
}
|
||||||
switchData.container.destroy();
|
switchData.container.destroy();
|
||||||
@ -1985,7 +1984,7 @@ var WindowManager = class {
|
|||||||
duration,
|
duration,
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
if (newWs !== activeWorkspace)
|
if (!newWs.active)
|
||||||
this.actionMoveWorkspace(newWs);
|
this.actionMoveWorkspace(newWs);
|
||||||
this._finishWorkspaceSwitch(switchData);
|
this._finishWorkspaceSwitch(switchData);
|
||||||
},
|
},
|
||||||
@ -2185,10 +2184,7 @@ var WindowManager = class {
|
|||||||
if (!Main.sessionMode.hasWorkspaces)
|
if (!Main.sessionMode.hasWorkspaces)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let workspaceManager = global.workspace_manager;
|
if (!workspace.active)
|
||||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
|
||||||
|
|
||||||
if (activeWorkspace != workspace)
|
|
||||||
workspace.activate(global.get_current_time());
|
workspace.activate(global.get_current_time());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2196,10 +2192,7 @@ var WindowManager = class {
|
|||||||
if (!Main.sessionMode.hasWorkspaces)
|
if (!Main.sessionMode.hasWorkspaces)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let workspaceManager = global.workspace_manager;
|
if (!workspace.active) {
|
||||||
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)
|
||||||
|
|
||||||
|
@ -67,8 +67,12 @@ 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 = box.get_width() / this._boundingBox.get_width();
|
const scaleX = this._boundingBox.get_width() > 0
|
||||||
const scaleY = box.get_height() / this._boundingBox.get_height();
|
? box.get_width() / this._boundingBox.get_width()
|
||||||
|
: 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();
|
||||||
|
|
||||||
@ -93,7 +97,7 @@ var WindowPreviewLayout = GObject.registerClass({
|
|||||||
|
|
||||||
child.allocate(childBox);
|
child.allocate(childBox);
|
||||||
} else {
|
} else {
|
||||||
child.allocate_preferred_size();
|
child.allocate_preferred_size(0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -185,6 +189,12 @@ 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': {},
|
||||||
@ -219,7 +229,6 @@ 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(
|
||||||
@ -233,8 +242,6 @@ 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());
|
||||||
@ -253,6 +260,7 @@ 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;
|
||||||
|
|
||||||
@ -345,6 +353,14 @@ 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) {
|
||||||
@ -399,8 +415,6 @@ 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);
|
||||||
|
|
||||||
@ -413,7 +427,6 @@ 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
|
||||||
@ -427,6 +440,9 @@ 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
|
||||||
@ -562,6 +578,25 @@ 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)
|
||||||
|
1057
js/ui/workspace.js
1057
js/ui/workspace.js
File diff suppressed because it is too large
Load Diff
@ -549,9 +549,7 @@ 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
|
||||||
let workspaceManager = global.workspace_manager;
|
if (this.metaWorkspace.active)
|
||||||
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,6 +7,7 @@ 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;
|
||||||
|
|
||||||
@ -21,18 +22,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) {
|
||||||
super._init({ style_class: 'workspaces-view', reactive: true });
|
const { x, y, width, height } =
|
||||||
|
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));
|
||||||
@ -51,24 +52,19 @@ var WorkspacesViewBase = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_dragBegin(overview, window) {
|
_dragBegin() {
|
||||||
this._inDrag = true;
|
this._inDrag = true;
|
||||||
this._setReservedSlot(window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_dragEnd() {
|
_dragEnd() {
|
||||||
this._inDrag = false;
|
this._inDrag = false;
|
||||||
this._setReservedSlot(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setFullGeometry(geom) {
|
vfunc_allocate(box) {
|
||||||
this._fullGeometry = geom;
|
this.set_allocation(box);
|
||||||
this._syncFullGeometry();
|
|
||||||
}
|
|
||||||
|
|
||||||
setActualGeometry(geom) {
|
for (const child of this)
|
||||||
this._actualGeometry = geom;
|
child.allocate_available_size(0, 0, box.get_width(), box.get_height());
|
||||||
this._syncActualGeometry();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -83,9 +79,8 @@ 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._onScrollId = this._scrollAdjustment.connect('notify::value',
|
||||||
this._scrollAdjustment.connect('notify::value',
|
this._updateScrollPosition.bind(this));
|
||||||
this._onScroll.bind(this));
|
|
||||||
|
|
||||||
this._workspaces = [];
|
this._workspaces = [];
|
||||||
this._updateWorkspaces();
|
this._updateWorkspaces();
|
||||||
@ -97,34 +92,42 @@ 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._updateWorkspaceActors(false);
|
this._workspaces.forEach(
|
||||||
|
(ws, i) => this.set_child_at_index(ws, i));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this._overviewShownId = Main.overview.connect('shown', () => {
|
||||||
this._overviewShownId =
|
this.clip_to_allocation = true;
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
_setReservedSlot(window) {
|
vfunc_allocate(box) {
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
this.set_allocation(box);
|
||||||
this._workspaces[i].setReservedSlot(window);
|
|
||||||
}
|
|
||||||
|
|
||||||
_syncFullGeometry() {
|
if (this.get_n_children() === 0)
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
return;
|
||||||
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
|
||||||
}
|
|
||||||
|
|
||||||
_syncActualGeometry() {
|
const { workspaceManager } = global;
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
const { nWorkspaces } = workspaceManager;
|
||||||
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() {
|
||||||
@ -140,11 +143,11 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
else
|
else
|
||||||
this._workspaces[w].fadeToOverview();
|
this._workspaces[w].fadeToOverview();
|
||||||
}
|
}
|
||||||
this._updateWorkspaceActors(false);
|
this._updateScrollPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
animateFromOverview(animationType) {
|
animateFromOverview(animationType) {
|
||||||
this.remove_clip();
|
this.clip_to_allocation = false;
|
||||||
|
|
||||||
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)
|
||||||
@ -159,49 +162,22 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
this._workspaces[i].syncStacking(stackIndices);
|
this._workspaces[i].syncStacking(stackIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update workspace actors parameters
|
_scrollToActive() {
|
||||||
// @showAnimation: iff %true, transition between states
|
const { workspaceManager } = global;
|
||||||
_updateWorkspaceActors(showAnimation) {
|
const active = workspaceManager.get_active_workspace_index();
|
||||||
let workspaceManager = global.workspace_manager;
|
|
||||||
let active = workspaceManager.get_active_workspace_index();
|
|
||||||
|
|
||||||
this._animating = showAnimation;
|
this._animating = true;
|
||||||
|
this._updateVisibility();
|
||||||
|
|
||||||
for (let w = 0; w < this._workspaces.length; w++) {
|
this._scrollAdjustment.remove_transition('value');
|
||||||
let workspace = this._workspaces[w];
|
this._scrollAdjustment.ease(active, {
|
||||||
|
duration: WORKSPACE_SWITCH_TIME,
|
||||||
workspace.remove_all_transitions();
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
|
onComplete: () => {
|
||||||
let params = {};
|
this._animating = false;
|
||||||
if (workspaceManager.layout_rows == -1)
|
this._updateVisibility();
|
||||||
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() {
|
||||||
@ -242,19 +218,14 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._fullGeometry) {
|
this._updateScrollPosition();
|
||||||
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._updateWorkspaceActors(true);
|
this._scrollToActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
@ -276,21 +247,25 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
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._updateWorkspaceActors(true);
|
this._scrollToActive();
|
||||||
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
|
||||||
_onScroll(adj) {
|
_updateScrollPosition() {
|
||||||
if (adj.get_transition('value') !== null && !this._gestureActive)
|
if (!this.has_allocation())
|
||||||
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 (active != current && !this._gestureActive) {
|
if (allowSwitch && active !== current) {
|
||||||
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
|
||||||
@ -307,36 +282,16 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
if (adj.upper == 1)
|
if (adj.upper == 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let last = this._workspaces.length - 1;
|
const vertical = workspaceManager.layout_rows === -1;
|
||||||
|
const rtl = this.text_direction === Clutter.TextDirection.RTL;
|
||||||
|
const progress = vertical || !rtl
|
||||||
|
? adj.value : adj.upper - adj.value;
|
||||||
|
|
||||||
if (workspaceManager.layout_rows == -1) {
|
for (const ws of this._workspaces) {
|
||||||
let firstWorkspaceY = this._workspaces[0].y;
|
if (vertical)
|
||||||
let lastWorkspaceY = this._workspaces[last].y;
|
ws.translation_y = -progress * this.height;
|
||||||
let workspacesHeight = lastWorkspaceY - firstWorkspaceY;
|
else
|
||||||
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -349,18 +304,6 @@ 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;
|
||||||
}
|
}
|
||||||
@ -438,6 +381,8 @@ 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._syncWorkspacesActualGeometry.bind(this));
|
||||||
|
|
||||||
this._primaryIndex = Main.layoutManager.primaryIndex;
|
this._primaryIndex = Main.layoutManager.primaryIndex;
|
||||||
this._workspacesViews = [];
|
this._workspacesViews = [];
|
||||||
@ -452,9 +397,9 @@ 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._gestureActive = false; // touch(pad) gestures
|
this._gestureActive = false; // touch(pad) gestures
|
||||||
@ -476,6 +421,11 @@ 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;
|
||||||
@ -485,6 +435,7 @@ 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() {
|
||||||
@ -508,25 +459,11 @@ 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._scrollToActive();
|
this._scrollAdjustment.ease(to, {
|
||||||
}
|
|
||||||
|
|
||||||
_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,
|
||||||
});
|
});
|
||||||
@ -564,11 +501,8 @@ 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
|
||||||
? geometry.height : geometry.width;
|
? this.height : this.width;
|
||||||
|
|
||||||
let progress = adjustment.value / adjustment.page_size;
|
let progress = adjustment.value / adjustment.page_size;
|
||||||
let points = Array.from(
|
let points = Array.from(
|
||||||
@ -588,14 +522,13 @@ 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 !== activeWorkspace)
|
if (!newWs.active)
|
||||||
newWs.activate(global.get_current_time());
|
newWs.activate(global.get_current_time());
|
||||||
this._endTouchGesture();
|
this._endTouchGesture();
|
||||||
},
|
},
|
||||||
@ -616,7 +549,7 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
this.show();
|
this.show();
|
||||||
this._updateWorkspacesViews();
|
this._updateWorkspacesViews();
|
||||||
|
|
||||||
if (this._actualGeometry && this._fullGeometry) {
|
if (this._actualGeometry) {
|
||||||
for (let i = 0; i < this._workspacesViews.length; i++) {
|
for (let i = 0; i < this._workspacesViews.length; i++) {
|
||||||
let animationType;
|
let animationType;
|
||||||
if (fadeOnPrimary && i == this._primaryIndex)
|
if (fadeOnPrimary && i == this._primaryIndex)
|
||||||
@ -625,6 +558,9 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
animationType = AnimationType.ZOOM;
|
animationType = AnimationType.ZOOM;
|
||||||
this._workspacesViews[i].animateToOverview(animationType);
|
this._workspacesViews[i].animateToOverview(animationType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!fadeOnPrimary)
|
||||||
|
this._syncWorkspacesActualGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._restackedNotifyId =
|
this._restackedNotifyId =
|
||||||
@ -646,6 +582,15 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
animationType = AnimationType.ZOOM;
|
animationType = AnimationType.ZOOM;
|
||||||
this._workspacesViews[i].animateFromOverview(animationType);
|
this._workspacesViews[i].animateFromOverview(animationType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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() {
|
||||||
@ -675,6 +620,7 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._updateWorkspacesViews();
|
this._updateWorkspacesViews();
|
||||||
|
this._syncWorkspacesActualGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateWorkspacesViews() {
|
_updateWorkspacesViews() {
|
||||||
@ -691,19 +637,9 @@ 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) {
|
||||||
@ -750,43 +686,35 @@ 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() {
|
||||||
if (!this._workspacesViews.length)
|
const primaryView = this._getPrimaryView();
|
||||||
|
if (!primaryView)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let monitors = Main.layoutManager.monitors;
|
primaryView.ease({
|
||||||
for (let i = 0; i < monitors.length; i++) {
|
...this._actualGeometry,
|
||||||
let geometry = i === this._primaryIndex ? this._actualGeometry : monitors[i];
|
duration: Main.overview.animationInProgress ? ANIMATION_TIME : 0,
|
||||||
this._workspacesViews[i].setActualGeometry(geometry);
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_onRestacked(overview, stackIndices) {
|
_onRestacked(overview, stackIndices) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
project('gnome-shell', 'c',
|
project('gnome-shell', 'c',
|
||||||
version: '3.37.2',
|
version: '3.37.3',
|
||||||
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.2'
|
mutter_req = '>= 3.37.3'
|
||||||
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
1
mutter
Submodule mutter deleted from 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-2019.
|
# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2012-2020.
|
||||||
#
|
#
|
||||||
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-05 23:11+0000\n"
|
"POT-Creation-Date: 2020-06-25 04:35+0000\n"
|
||||||
"PO-Revision-Date: 2020-06-15 18:37+0500\n"
|
"PO-Revision-Date: 2020-06-27 23:27+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,16 +81,10 @@ 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 ""
|
msgstr "Мәжбүрлі сөндіру үшін кеңейтулер UUID-лары"
|
||||||
|
|
||||||
#: 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 "
|
||||||
@ -98,6 +92,11 @@ 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"
|
||||||
@ -333,19 +332,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"
|
||||||
@ -353,7 +352,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"
|
||||||
@ -532,23 +531,20 @@ 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"
|
||||||
@ -705,38 +701,36 @@ msgstr "Тыйым салу"
|
|||||||
msgid "Grant Access"
|
msgid "Grant Access"
|
||||||
msgstr "Рұқсат ету"
|
msgstr "Рұқсат ету"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:956
|
#: js/ui/appDisplay.js:903
|
||||||
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:2215 js/ui/panel.js:75
|
#: js/ui/appDisplay.js:2225 js/ui/panel.js:75
|
||||||
msgid "Open Windows"
|
msgid "Open Windows"
|
||||||
msgstr "Ашық терезелер"
|
msgstr "Ашық терезелер"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
|
#: js/ui/appDisplay.js:2244 js/ui/panel.js:82
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Жаңа терезе"
|
msgstr "Жаңа терезе"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2250
|
#: js/ui/appDisplay.js:2260
|
||||||
#| msgid "Launch using Dedicated Graphics Card"
|
|
||||||
msgid "Launch using Integrated Graphics Card"
|
msgid "Launch using Integrated Graphics Card"
|
||||||
msgstr ""
|
msgstr "Құрамындағы графикалық картаны пайдаланып жөнелту"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2251
|
#: js/ui/appDisplay.js:2261
|
||||||
#| msgid "Launch using Dedicated Graphics Card"
|
|
||||||
msgid "Launch using Discrete Graphics Card"
|
msgid "Launch using Discrete Graphics Card"
|
||||||
msgstr ""
|
msgstr "Бөлек графикалық картаны пайдаланып жөнелту"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
|
#: js/ui/appDisplay.js:2289 js/ui/dash.js:239
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Таңдамалылардан өшіру"
|
msgstr "Таңдамалылардан өшіру"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2285
|
#: js/ui/appDisplay.js:2295
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Таңдамалыларға қосу"
|
msgstr "Таңдамалыларға қосу"
|
||||||
|
|
||||||
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
|
#: js/ui/appDisplay.js:2305 js/ui/panel.js:93
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "Деректерді көрсету"
|
msgstr "Деректерді көрсету"
|
||||||
|
|
||||||
@ -766,7 +760,7 @@ msgstr "Құлаққап"
|
|||||||
msgid "Headset"
|
msgid "Headset"
|
||||||
msgstr "Микрофонды құлаққап"
|
msgstr "Микрофонды құлаққап"
|
||||||
|
|
||||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Микрофон"
|
msgstr "Микрофон"
|
||||||
|
|
||||||
@ -918,9 +912,8 @@ 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"
|
||||||
@ -993,7 +986,6 @@ 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"
|
||||||
|
|
||||||
@ -1129,9 +1121,8 @@ 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
|
||||||
@ -1251,9 +1242,10 @@ 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"
|
||||||
@ -1289,30 +1281,26 @@ 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 ""
|
msgstr "%s қолданбасы пернелер жарлығын алмастырғысы келеді"
|
||||||
|
|
||||||
#: 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
|
||||||
@ -1445,23 +1433,25 @@ 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 ""
|
msgstr "Экранды блоктау GNOME дисплейлер басқарушысын талап етеді."
|
||||||
|
|
||||||
#: js/ui/messageTray.js:1547
|
#: js/ui/messageTray.js:1547
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
@ -1475,13 +1465,13 @@ msgstr "Белгісіз әртіс"
|
|||||||
msgid "Unknown title"
|
msgid "Unknown title"
|
||||||
msgstr "Белгісіз атауы"
|
msgstr "Белгісіз атауы"
|
||||||
|
|
||||||
#: js/ui/overview.js:73
|
#: js/ui/overview.js:74
|
||||||
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:86
|
#: js/ui/overview.js:87
|
||||||
msgid "Overview"
|
msgid "Overview"
|
||||||
msgstr "Шолу"
|
msgstr "Шолу"
|
||||||
|
|
||||||
@ -1489,7 +1479,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:107
|
#: js/ui/overview.js:108
|
||||||
msgid "Type to search"
|
msgid "Type to search"
|
||||||
msgstr "Іздеу үшін теріңіз"
|
msgstr "Іздеу үшін теріңіз"
|
||||||
|
|
||||||
@ -1626,18 +1616,16 @@ 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 ""
|
msgstr "Windows жүйелік томы"
|
||||||
|
|
||||||
#: 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
|
||||||
@ -1645,6 +1633,7 @@ 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"
|
||||||
@ -1666,7 +1655,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 ""
|
msgstr "PIM тек сандардан тұруы, немесе бос болуы тиіс."
|
||||||
|
|
||||||
#. Translators: %s is the Disks application
|
#. Translators: %s is the Disks application
|
||||||
#: js/ui/shellMountOperation.js:465
|
#: js/ui/shellMountOperation.js:465
|
||||||
@ -1678,7 +1667,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 ""
|
msgstr "%s қолданбасы табылмады"
|
||||||
|
|
||||||
#: js/ui/status/accessibility.js:35
|
#: js/ui/status/accessibility.js:35
|
||||||
msgid "Accessibility"
|
msgid "Accessibility"
|
||||||
@ -1733,14 +1722,12 @@ 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 ""
|
msgstr "Bluetooth сөндірілген"
|
||||||
|
|
||||||
#: js/ui/status/bluetooth.js:154
|
#: js/ui/status/bluetooth.js:154
|
||||||
#| msgid "Bluetooth"
|
|
||||||
msgid "Bluetooth On"
|
msgid "Bluetooth On"
|
||||||
msgstr ""
|
msgstr "Bluetooth іске қосылған"
|
||||||
|
|
||||||
#: js/ui/status/brightness.js:39
|
#: js/ui/status/brightness.js:39
|
||||||
msgid "Brightness"
|
msgid "Brightness"
|
||||||
@ -1748,7 +1735,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"
|
||||||
@ -1760,11 +1747,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"
|
||||||
@ -1800,7 +1787,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
|
||||||
@ -2140,11 +2127,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:154
|
#: js/ui/status/volume.js:155
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "Дыбыс өзгертілді"
|
msgstr "Дыбыс өзгертілді"
|
||||||
|
|
||||||
#: js/ui/status/volume.js:225
|
#: js/ui/status/volume.js:217
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Дыбыс деңгейі"
|
msgstr "Дыбыс деңгейі"
|
||||||
|
|
||||||
@ -2179,18 +2166,16 @@ 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"
|
||||||
@ -2373,6 +2358,8 @@ 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"
|
||||||
@ -2388,6 +2375,7 @@ 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"
|
||||||
@ -2401,15 +2389,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] ""
|
msgstr[0] "%d кеңейту жүйеге келесі рет кірген кезде жаңартылатын болады."
|
||||||
|
|
||||||
#: 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 ""
|
msgstr "Бұл кеңейту ағымдағы GNOME нұсқасымен үйлеспейді"
|
||||||
|
|
||||||
#: 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
|
||||||
@ -2428,7 +2416,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…"
|
||||||
@ -2460,6 +2448,9 @@ 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"
|
||||||
@ -2478,10 +2469,12 @@ 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…"
|
||||||
@ -2491,7 +2484,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 ""
|
msgstr "Жаңа кеңейту %s ішінде сәтті жасалды.\n"
|
||||||
|
|
||||||
#: subprojects/extensions-tool/src/command-create.c:299
|
#: subprojects/extensions-tool/src/command-create.c:299
|
||||||
#, c-format
|
#, c-format
|
||||||
@ -2499,11 +2492,13 @@ 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
|
||||||
@ -2511,6 +2506,9 @@ 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 ""
|
||||||
@ -2518,10 +2516,12 @@ 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 ""
|
msgstr "Қол жетімді үлгілердің бірін таңдаңыз:\n"
|
||||||
|
|
||||||
#: 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 ""
|
msgstr "UUID, аты және сипаттамасы керек"
|
||||||
|
|
||||||
#: 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 ""
|
msgstr "\"%s\" кеңейтуі жоқ\n"
|
||||||
|
|
||||||
#: 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 ""
|
msgstr "Бірден көп UUID көрсетілген"
|
||||||
|
|
||||||
#: 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 ""
|
msgstr "\"%s\" кеңейтуі жоқ\n"
|
||||||
|
|
||||||
#: 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,60 +2623,51 @@ 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"
|
||||||
@ -2688,7 +2679,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"
|
||||||
@ -2696,7 +2687,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 ""
|
msgstr "Құрамына енуі тиіс GSettings сұлбасы"
|
||||||
|
|
||||||
#: 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
|
||||||
@ -2705,7 +2696,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"
|
||||||
@ -2713,37 +2704,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 ""
|
msgstr "Аудармалар үшін қолданылуы тиіс gettext домені"
|
||||||
|
|
||||||
#: 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 ""
|
msgstr "\"%s\" кеңейтудің баптаулары жоқ\n"
|
||||||
|
|
||||||
#: 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"
|
||||||
@ -2764,11 +2755,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"
|
||||||
@ -2788,7 +2779,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 ""
|
msgstr "“version” аргументтерді қабылдамайды"
|
||||||
|
|
||||||
#: 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
|
||||||
@ -2860,11 +2851,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 ""
|
msgstr "Толық көмекті алу үшін \"%s\" пайдаланыңыз.\n"
|
||||||
|
|
||||||
#: 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"
|
||||||
@ -2876,7 +2867,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
|
||||||
@ -2898,6 +2889,33 @@ 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"
|
||||||
@ -2927,21 +2945,6 @@ 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 "Пароль:"
|
||||||
|
|
||||||
@ -2971,16 +2974,6 @@ 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 "Тіркелгі баптаулары"
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ 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;
|
||||||
|
|
||||||
@ -180,66 +181,47 @@ window_backed_app_get_window (ShellApp *app)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClutterActor *
|
/**
|
||||||
window_backed_app_get_icon (ShellApp *app,
|
* shell_app_get_icon:
|
||||||
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;
|
|
||||||
|
|
||||||
global = shell_global_get ();
|
g_return_val_if_fail (SHELL_IS_APP (app), NULL);
|
||||||
context = st_theme_context_get_for_stage (shell_global_get_stage (global));
|
|
||||||
g_object_get (context, "scale-factor", &scale, NULL);
|
|
||||||
|
|
||||||
scaled_size = size * scale;
|
if (app->info)
|
||||||
|
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 an empty image.
|
* Avoid asserting here and just return a fallback icon
|
||||||
*/
|
*/
|
||||||
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 == NULL)
|
if (window &&
|
||||||
|
meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
|
||||||
{
|
{
|
||||||
ClutterActor *actor;
|
app->fallback_icon =
|
||||||
|
|
||||||
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
|
||||||
{
|
{
|
||||||
widget = g_object_new (ST_TYPE_ICON,
|
app->fallback_icon = g_themed_icon_new ("application-x-executable");
|
||||||
"icon-size", size,
|
|
||||||
"icon-name", "application-x-executable",
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
st_widget_add_style_class_name (widget, "fallback-app-icon");
|
|
||||||
|
|
||||||
return CLUTTER_ACTOR (widget);
|
return app->fallback_icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -257,16 +239,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 = g_app_info_get_icon (G_APP_INFO (app->info));
|
icon = shell_app_get_icon (app);
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1576,6 +1558,7 @@ 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,6 +29,7 @@ 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,8 +899,9 @@ load_gl_symbol (const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
global_stage_after_paint (ClutterStage *stage,
|
global_stage_after_paint (ClutterStage *stage,
|
||||||
ShellGlobal *global)
|
ClutterStageView *stage_view,
|
||||||
|
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,9 +508,7 @@ recorder_update_size (ShellRecorder *recorder)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
recorder_on_stage_notify_size (GObject *object,
|
recorder_on_stage_notify_size (ShellRecorder *recorder)
|
||||||
GParamSpec *pspec,
|
|
||||||
ShellRecorder *recorder)
|
|
||||||
{
|
{
|
||||||
recorder_update_size (recorder);
|
recorder_update_size (recorder);
|
||||||
|
|
||||||
@ -614,12 +612,15 @@ 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 (recorder->stage, "notify::width",
|
g_signal_connect_swapped (recorder->stage, "notify::width",
|
||||||
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
G_CALLBACK (recorder_on_stage_notify_size),
|
||||||
g_signal_connect (recorder->stage, "notify::height",
|
recorder);
|
||||||
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
g_signal_connect_swapped (recorder->stage, "notify::height",
|
||||||
g_signal_connect (recorder->stage, "notify::resource-scale",
|
G_CALLBACK (recorder_on_stage_notify_size),
|
||||||
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
recorder);
|
||||||
|
g_signal_connect_swapped (recorder->stage, "resource-scale-changed",
|
||||||
|
G_CALLBACK (recorder_on_stage_notify_size),
|
||||||
|
recorder);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -393,8 +393,7 @@ 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;
|
||||||
if (!clutter_actor_get_resource_scale (window_actor, &resource_scale))
|
resource_scale = clutter_actor_get_resource_scale (window_actor);
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
@ -119,6 +119,16 @@ 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:
|
||||||
*
|
*
|
||||||
@ -135,8 +145,10 @@ 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;
|
||||||
|
|
||||||
appsys = shell_app_system_get_default ();
|
appsys = shell_app_system_get_default ();
|
||||||
|
sandbox_id = meta_window_get_sandboxed_app_id (window);
|
||||||
|
|
||||||
/* 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
|
||||||
@ -176,23 +188,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)
|
if (app != NULL && check_app_id_prefix (app, sandbox_id))
|
||||||
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)
|
if (app != NULL && check_app_id_prefix (app, sandbox_id))
|
||||||
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)
|
if (app != NULL && check_app_id_prefix (app, sandbox_id))
|
||||||
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)
|
if (app != NULL && check_app_id_prefix (app, sandbox_id))
|
||||||
return g_object_ref (app);
|
return g_object_ref (app);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -214,7 +226,7 @@ get_app_from_id (MetaWindow *window,
|
|||||||
{
|
{
|
||||||
ShellApp *app;
|
ShellApp *app;
|
||||||
ShellAppSystem *appsys;
|
ShellAppSystem *appsys;
|
||||||
char *desktop_file;
|
g_autofree char *desktop_file = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (id != NULL, NULL);
|
g_return_val_if_fail (id != NULL, NULL);
|
||||||
|
|
||||||
@ -223,10 +235,9 @@ 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)
|
||||||
g_object_ref (app);
|
return g_object_ref (app);
|
||||||
|
|
||||||
g_free (desktop_file);
|
return NULL;
|
||||||
return app;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -391,6 +402,13 @@ 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;
|
||||||
*/
|
*/
|
||||||
@ -405,13 +423,6 @@ 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,6 +41,8 @@ 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;
|
||||||
@ -66,6 +68,7 @@ enum
|
|||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
|
||||||
|
PROP_ACTOR,
|
||||||
PROP_LOWER,
|
PROP_LOWER,
|
||||||
PROP_UPPER,
|
PROP_UPPER,
|
||||||
PROP_VALUE,
|
PROP_VALUE,
|
||||||
@ -106,9 +109,21 @@ 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
|
||||||
@ -141,6 +156,10 @@ 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;
|
||||||
@ -171,6 +190,18 @@ 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,
|
||||||
@ -178,9 +209,20 @@ 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;
|
||||||
@ -217,6 +259,11 @@ 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);
|
||||||
@ -232,6 +279,11 @@ 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,
|
||||||
@ -299,7 +351,8 @@ st_adjustment_init (StAdjustment *self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
StAdjustment *
|
StAdjustment *
|
||||||
st_adjustment_new (gdouble value,
|
st_adjustment_new (ClutterActor *actor,
|
||||||
|
gdouble value,
|
||||||
gdouble lower,
|
gdouble lower,
|
||||||
gdouble upper,
|
gdouble upper,
|
||||||
gdouble step_increment,
|
gdouble step_increment,
|
||||||
@ -307,6 +360,7 @@ st_adjustment_new (gdouble value,
|
|||||||
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,7 +48,8 @@ struct _StAdjustmentClass
|
|||||||
void (* changed) (StAdjustment *adjustment);
|
void (* changed) (StAdjustment *adjustment);
|
||||||
};
|
};
|
||||||
|
|
||||||
StAdjustment *st_adjustment_new (gdouble value,
|
StAdjustment *st_adjustment_new (ClutterActor *actor,
|
||||||
|
gdouble value,
|
||||||
gdouble lower,
|
gdouble lower,
|
||||||
gdouble upper,
|
gdouble upper,
|
||||||
gdouble step_increment,
|
gdouble step_increment,
|
||||||
|
@ -85,12 +85,7 @@ st_drawing_area_allocate (ClutterActor *self,
|
|||||||
int width, height;
|
int width, height;
|
||||||
float resource_scale;
|
float resource_scale;
|
||||||
|
|
||||||
if (!st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
|
resource_scale = clutter_actor_get_resource_scale (self);
|
||||||
{
|
|
||||||
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);
|
||||||
@ -111,13 +106,16 @@ st_drawing_area_style_changed (StWidget *self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_drawing_area_resource_scale_changed (StWidget *self)
|
st_drawing_area_resource_scale_changed (ClutterActor *self)
|
||||||
{
|
{
|
||||||
float resource_scale;
|
float resource_scale;
|
||||||
ClutterContent *content = clutter_actor_get_content (CLUTTER_ACTOR (self));
|
ClutterContent *content = clutter_actor_get_content (self);
|
||||||
|
|
||||||
if (st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
|
resource_scale = clutter_actor_get_resource_scale (self);
|
||||||
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
|
||||||
@ -128,7 +126,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;
|
||||||
widget_class->resource_scale_changed = st_drawing_area_resource_scale_changed;
|
actor_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",
|
||||||
@ -215,15 +213,10 @@ 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);
|
||||||
|
|
||||||
if (st_widget_get_resource_scale (ST_WIDGET (area), &resource_scale))
|
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (area));
|
||||||
{
|
|
||||||
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,9 +231,12 @@ st_icon_style_changed (StWidget *widget)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_icon_resource_scale_changed (StWidget *widget)
|
st_icon_resource_scale_changed (ClutterActor *actor)
|
||||||
{
|
{
|
||||||
st_icon_update (ST_ICON (widget));
|
st_icon_update (ST_ICON (actor));
|
||||||
|
|
||||||
|
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
|
||||||
@ -250,7 +253,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;
|
||||||
widget_class->resource_scale_changed = st_icon_resource_scale_changed;
|
actor_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",
|
||||||
@ -425,8 +428,7 @@ st_icon_update (StIcon *icon)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!st_widget_get_resource_scale (ST_WIDGET (icon), &resource_scale))
|
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (icon));
|
||||||
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,11 +42,17 @@ 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)
|
||||||
@ -165,12 +171,157 @@ 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,44 +201,42 @@ st_label_paint (ClutterActor *actor,
|
|||||||
|
|
||||||
if (shadow_spec)
|
if (shadow_spec)
|
||||||
{
|
{
|
||||||
|
ClutterActorBox allocation;
|
||||||
|
float width, height;
|
||||||
float resource_scale;
|
float resource_scale;
|
||||||
|
|
||||||
if (clutter_actor_get_resource_scale (priv->label, &resource_scale))
|
clutter_actor_get_allocation_box (priv->label, &allocation);
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
ClutterActorBox allocation;
|
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
|
||||||
float width, height;
|
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (priv->label, &allocation);
|
priv->shadow_width = width;
|
||||||
clutter_actor_box_get_size (&allocation, &width, &height);
|
priv->shadow_height = height;
|
||||||
|
priv->text_shadow_pipeline =
|
||||||
|
_st_create_shadow_pipeline_from_actor (shadow_spec,
|
||||||
|
priv->label);
|
||||||
|
}
|
||||||
|
|
||||||
width *= resource_scale;
|
if (priv->text_shadow_pipeline != NULL)
|
||||||
height *= resource_scale;
|
{
|
||||||
|
CoglFramebuffer *framebuffer;
|
||||||
|
|
||||||
if (priv->text_shadow_pipeline == NULL ||
|
framebuffer =
|
||||||
width != priv->shadow_width ||
|
clutter_paint_context_get_framebuffer (paint_context);
|
||||||
height != priv->shadow_height)
|
_st_paint_shadow_with_opacity (shadow_spec,
|
||||||
{
|
framebuffer,
|
||||||
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
|
priv->text_shadow_pipeline,
|
||||||
|
&allocation,
|
||||||
priv->shadow_width = width;
|
clutter_actor_get_paint_opacity (priv->label));
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,11 +244,14 @@ st_label_paint (ClutterActor *actor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_label_resource_scale_changed (StWidget *widget)
|
st_label_resource_scale_changed (ClutterActor *actor)
|
||||||
{
|
{
|
||||||
StLabelPrivate *priv = ST_LABEL (widget)->priv;
|
StLabelPrivate *priv = ST_LABEL (actor)->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
|
||||||
@ -268,9 +269,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] =
|
||||||
@ -293,6 +294,7 @@ 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);
|
||||||
@ -304,7 +306,10 @@ 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 (CLUTTER_ACTOR (label), priv->label);
|
clutter_actor_add_child (actor, priv->label);
|
||||||
|
|
||||||
|
clutter_actor_set_offscreen_redirect (actor,
|
||||||
|
CLUTTER_OFFSCREEN_REDIRECT_ALWAYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -461,8 +461,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
|
|||||||
if (width == 0 || height == 0)
|
if (width == 0 || height == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!clutter_actor_get_resource_scale (actor, &resource_scale))
|
resource_scale = clutter_actor_get_resource_scale (actor);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
width = ceilf (width * resource_scale);
|
width = ceilf (width * resource_scale);
|
||||||
height = ceilf (height * resource_scale);
|
height = ceilf (height * resource_scale);
|
||||||
|
@ -899,13 +899,17 @@ 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, NULL);
|
priv->hadjustment = g_object_new (ST_TYPE_ADJUSTMENT,
|
||||||
|
"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, NULL);
|
priv->vadjustment = g_object_new (ST_TYPE_ADJUSTMENT,
|
||||||
|
"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,8 +722,7 @@ load_texture_async (StTextureCache *cache,
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
StTextureCache *cache;
|
StTextureCache *cache;
|
||||||
ClutterActor *actor;
|
ClutterContent *image;
|
||||||
gint size;
|
|
||||||
GObject *source;
|
GObject *source;
|
||||||
gulong notify_signal_id;
|
gulong notify_signal_id;
|
||||||
gboolean weakref_active;
|
gboolean weakref_active;
|
||||||
@ -742,37 +741,33 @@ 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 size = bind->size;
|
int width, height, size;
|
||||||
|
|
||||||
if (size < 0)
|
width = cairo_image_surface_get_width (surface);
|
||||||
clutter_actor_get_preferred_width (bind->actor, -1, NULL, (float *)&size);
|
height = cairo_image_surface_get_width (surface);
|
||||||
|
size = MAX(width, height);
|
||||||
|
|
||||||
image = clutter_actor_get_content (bind->actor);
|
if (!bind->image)
|
||||||
if (!image || !CLUTTER_IS_IMAGE (image))
|
bind->image = st_image_content_new_with_preferred_size (size, size);
|
||||||
image = st_image_content_new_with_preferred_size (size, size);
|
|
||||||
else
|
|
||||||
g_object_ref (image);
|
|
||||||
|
|
||||||
clutter_image_set_data (CLUTTER_IMAGE (image),
|
clutter_image_set_data (CLUTTER_IMAGE (bind->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,
|
||||||
cairo_image_surface_get_width (surface),
|
width,
|
||||||
cairo_image_surface_get_height (surface),
|
height,
|
||||||
cairo_image_surface_get_stride (surface),
|
cairo_image_surface_get_stride (surface),
|
||||||
&error);
|
&error);
|
||||||
|
|
||||||
if (image)
|
if (error)
|
||||||
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
|
||||||
clutter_actor_set_opacity (bind->actor, 0);
|
bind->image = g_object_new (ST_TYPE_IMAGE_CONTENT,
|
||||||
|
"preferred-width", 0, /* tough luck */
|
||||||
|
"preferred-height", 0,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -798,57 +793,48 @@ 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->actor), st_texture_cache_bind_weak_notify, bind);
|
g_object_weak_unref (G_OBJECT (bind->image), 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 #GdkPixbuf
|
* @object: A #GObject with a property @property_name of type #cairo_surface_t
|
||||||
* @property_name: Name of a property
|
* @property_name: Name of a property
|
||||||
*
|
*
|
||||||
* Create a #ClutterActor which tracks the #cairo_surface_t value of a GObject property
|
* Create a #GIcon 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 #StWidget
|
* Return value: (transfer none): A new #GIcon
|
||||||
*/
|
*/
|
||||||
StWidget *
|
GIcon *
|
||||||
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 widget;
|
return G_ICON (bind->image);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -981,6 +967,18 @@ 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);
|
||||||
@ -1034,7 +1032,6 @@ 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,10 +64,9 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
|
|||||||
GFunc load_callback,
|
GFunc load_callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
StWidget *st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
|
GIcon *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,10 +84,11 @@ on_timeline_new_frame (ClutterTimeline *timeline,
|
|||||||
}
|
}
|
||||||
|
|
||||||
StThemeNodeTransition *
|
StThemeNodeTransition *
|
||||||
st_theme_node_transition_new (StThemeNode *from_node,
|
st_theme_node_transition_new (ClutterActor *actor,
|
||||||
StThemeNode *to_node,
|
StThemeNode *from_node,
|
||||||
|
StThemeNode *to_node,
|
||||||
StThemeNodePaintState *old_paint_state,
|
StThemeNodePaintState *old_paint_state,
|
||||||
guint duration)
|
unsigned int 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);
|
||||||
@ -103,7 +104,7 @@ st_theme_node_transition_new (StThemeNode *from_node,
|
|||||||
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 (duration);
|
transition->priv->timeline = clutter_timeline_new_for_actor (actor, 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,10 +32,11 @@ 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 (StThemeNode *from_node,
|
StThemeNodeTransition *st_theme_node_transition_new (ClutterActor *actor,
|
||||||
StThemeNode *to_node,
|
StThemeNode *from_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,6 +78,7 @@ 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,8 +262,10 @@ 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;
|
||||||
content_box.x2 += MAX (0, min_width - avail_width);
|
if (priv->hadjustment)
|
||||||
content_box.y2 += MAX (0, min_height - avail_height);
|
content_box.x2 += MAX (0, min_width - avail_width);
|
||||||
|
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,7 +124,6 @@ enum
|
|||||||
{
|
{
|
||||||
STYLE_CHANGED,
|
STYLE_CHANGED,
|
||||||
POPUP_MENU,
|
POPUP_MENU,
|
||||||
RESOURCE_SCALE_CHANGED,
|
|
||||||
|
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
@ -412,8 +411,7 @@ st_widget_paint_background (StWidget *widget,
|
|||||||
float resource_scale;
|
float resource_scale;
|
||||||
guint8 opacity;
|
guint8 opacity;
|
||||||
|
|
||||||
if (!st_widget_get_resource_scale (widget, &resource_scale))
|
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (widget));
|
||||||
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);
|
||||||
@ -820,6 +818,20 @@ 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)
|
||||||
{
|
{
|
||||||
@ -849,6 +861,8 @@ 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;
|
||||||
@ -1002,21 +1016,6 @@ 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 *
|
||||||
@ -1400,23 +1399,6 @@ 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)
|
||||||
@ -1483,23 +1465,6 @@ 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,
|
||||||
@ -1651,7 +1616,6 @@ 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);
|
||||||
@ -1723,7 +1687,8 @@ st_widget_recompute_style (StWidget *widget,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
priv->transition_animation =
|
priv->transition_animation =
|
||||||
st_theme_node_transition_new (old_theme_node,
|
st_theme_node_transition_new (CLUTTER_ACTOR (widget),
|
||||||
|
old_theme_node,
|
||||||
new_theme_node,
|
new_theme_node,
|
||||||
current_paint_state (widget),
|
current_paint_state (widget),
|
||||||
transition_duration);
|
transition_duration);
|
||||||
|
@ -63,7 +63,6 @@ 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 */
|
||||||
|
|
||||||
@ -135,8 +134,6 @@ 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_GROUP, "group1", NULL, NULL, NULL);
|
CLUTTER_TYPE_ACTOR, "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_GROUP, "group2", NULL, NULL, NULL);
|
CLUTTER_TYPE_ACTOR, "group2", NULL, NULL, NULL);
|
||||||
group4 = st_theme_node_new (context, root, NULL,
|
group4 = st_theme_node_new (context, root, NULL,
|
||||||
CLUTTER_TYPE_GROUP, "group4", NULL, NULL, NULL);
|
CLUTTER_TYPE_ACTOR, "group4", NULL, NULL, NULL);
|
||||||
group5 = st_theme_node_new (context, root, NULL,
|
group5 = st_theme_node_new (context, root, NULL,
|
||||||
CLUTTER_TYPE_GROUP, "group5", NULL, NULL, NULL);
|
CLUTTER_TYPE_ACTOR, "group5", NULL, NULL, NULL);
|
||||||
group6 = st_theme_node_new (context, root, NULL,
|
group6 = st_theme_node_new (context, root, NULL,
|
||||||
CLUTTER_TYPE_GROUP, "group6", NULL, NULL, NULL);
|
CLUTTER_TYPE_ACTOR, "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_GROUP, "group3", NULL, "hover", NULL);
|
CLUTTER_TYPE_ACTOR, "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,6 +39,7 @@
|
|||||||
</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.2',
|
version: '3.37.3',
|
||||||
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.2',
|
version: '3.37.3',
|
||||||
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.2',
|
version: '3.37.3',
|
||||||
meson_version: '>= 0.53.0',
|
meson_version: '>= 0.53.0',
|
||||||
license: 'LGPLv2+',
|
license: 'LGPLv2+',
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user