Compare commits

..

1 Commits

Author SHA1 Message Date
Evan Welsh
170fe945a9 Initial experiment unifying app menus. 2020-06-21 03:28:17 -05:00
63 changed files with 2264 additions and 2706 deletions

35
NEWS
View File

@@ -1,38 +1,3 @@
3.37.3
======
* Refactor and clean up window picker
[Jonas D., Florian; !1297, !1298, !1305, !1345, !1353]
* Move calendar events out of notifications list [Florian; !1282]
* Refine app folder dialogs [Georges; !1301]
* Hide switch-user button on lock screen if unsupported [Chingkai; #2687]
* Refactor and clean up app picker pagination [Georges; !1271]
* Add API to retrieve specified mimetypes from clipboards [Carlos; !1321]
* Support prepending workspace with horizontal layouts [Florian; #2916]
* Update microphone icon on input volume changes [fludixx; #2902]
* Cache labels on GPU [Daniel; !1329]
* Fix regressions in redesigned modal dialogs [Florian, Jonas D.; #2491, !1336]
* Use GIcon for all application icons [Florian; !1342]
* Support pre-authenticated logins in vmware environments [yun341; #1983]
* Better support sandboxed apps with multiple .desktop files [Florian; #219]
* Fix on-screen keyboard size in portrait orientation [Florian; #2349]
* Plugged leaks [Sebastian, Daniel, Florian; !1306, !1319, !1341]
* Misc. bug fixes and cleanups [Jonas D., Georges, Marco, Florian, Sebastian,
MOZGIII, Daniel, Mariana, Jonas Å.; !1296, !1295, #2643, !1300, !1309,
!1119, #2901, !1313, !1251, !1285, !1307, !1318, !1310, !1320, !1327, !1315,
!1289, !1331, !1332, !1333, !1334, !1340, !1287, !1308, !1346, !1299, !1343,
!1351, !1352, !1322]
Contributors:
Marco Trevisan (Treviño), Chingkai, Jonas Dreßler, Carlos Garnacho,
Sebastian Keller, MOZGIII, Florian Müllner, Georges Basile Stavracas Neto,
Mariana Picolo, Daniel van Vugt, fludixx, yun341, Jonas Ådahl
Translators:
Daniel Mustieles [es], Boyuan Yang [zh_CN], Yuri Chornoivan [uk],
Jordi Mas [ca], sicklylife [ja], Emin Tufan Çetin [tr],
Baurzhan Muftakhidinov [kk], Florentina Mușat [ro], Aurimas Černius [lt],
Rūdolfs Mazurs [lv]
3.37.2
======
* Add support for "PrefersNonDefaultGPU" desktop key [Bastien; !1226]

View File

@@ -1,7 +1,7 @@
/* Window Picker */
$window_picker_spacing: $base_spacing; // 6px
$window_picker_padding: $base_padding * 2; // 12px
$window_picker_spacing: $base_spacing * 2; // 16px
$window_picker_padding: $base_padding * 2; // 16px
$window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
@@ -13,8 +13,8 @@ $window_clone_border_size: 6px;
// Window picker
.window-picker {
// Space between window thumbnails
spacing: $window_picker_spacing;
-horizontal-spacing: $window_picker_spacing;
-vertical-spacing: $window_picker_spacing;
// Padding for container around window thumbnails
padding: $window_picker_padding;

View File

@@ -71,7 +71,7 @@ var AuthPrompt = GObject.registerClass({
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
this._userVerifier.connect('reset', this._onReset.bind(this));
this._userVerifier.connect('smartcard-status-changed', this._onSmartcardStatusChanged.bind(this));
this._userVerifier.connect('credential-manager-authenticated', this._onCredentialManagerAuthenticated.bind(this));
this._userVerifier.connect('ovirt-user-authenticated', this._onOVirtUserAuthenticated.bind(this));
this.smartcardDetected = this._userVerifier.smartcardDetected;
this.connect('destroy', this._onDestroy.bind(this));
@@ -242,7 +242,7 @@ var AuthPrompt = GObject.registerClass({
this.emit('prompted');
}
_onCredentialManagerAuthenticated() {
_onOVirtUserAuthenticated() {
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset();
}

View File

@@ -1,24 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported CredentialManager */
class CredentialManager {
constructor(service) {
this._token = null;
this._service = service;
this._authenticatedSignalId = null;
}
get token() {
return this._token;
}
set token(t) {
this._token = t;
if (this._token)
this.emit('user-authenticated', this._token);
}
get service() {
return this._service;
}
}

View File

@@ -810,8 +810,8 @@ var LoginDialog = GObject.registerClass({
return;
this._logoBin.destroy_all_children();
const resourceScale = this._logoBin.get_resource_scale();
if (this._logoFile) {
const [valid, resourceScale] = this._logoBin.get_resource_scale();
if (this._logoFile && valid) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
-1, -1,

View File

@@ -3,9 +3,6 @@
const Gio = imports.gi.Gio;
const Signals = imports.signals;
const Credential = imports.gdm.credentialManager;
var SERVICE_NAME = 'gdm-ovirtcred';
const OVirtCredentialsIface = `
<node>
@@ -31,14 +28,30 @@ function OVirtCredentials() {
return self;
}
var OVirtCredentialsManager = class OVirtCredentialsManager extends Credential.CredentialManager {
var OVirtCredentialsManager = class {
constructor() {
super(SERVICE_NAME);
this._token = null;
this._credentials = new OVirtCredentials();
this._credentials.connectSignal('UserAuthenticated',
(proxy, sender, [token]) => {
this.token = token;
});
this._onUserAuthenticated.bind(this));
}
_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);

View File

@@ -8,7 +8,6 @@ const Signals = imports.signals;
const Batch = imports.gdm.batch;
const Fprint = imports.gdm.fingerprint;
const OVirt = imports.gdm.oVirt;
const Vmware = imports.gdm.vmware;
const Main = imports.ui.main;
const Params = imports.misc.params;
const SmartcardManager = imports.misc.smartcardManager;
@@ -25,6 +24,7 @@ Gio._promisify(Gdm.UserVerifierProxy.prototype,
var PASSWORD_SERVICE_NAME = 'gdm-password';
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
var OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
var FADE_ANIMATION_TIME = 160;
var CLONE_FADE_ANIMATION_TIME = 250;
@@ -160,20 +160,13 @@ var ShellUserVerifier = class {
this._failCounter = 0;
this._credentialManagers = {};
this._credentialManagers[OVirt.SERVICE_NAME] = OVirt.getOVirtCredentialsManager();
this._credentialManagers[Vmware.SERVICE_NAME] = Vmware.getVmwareCredentialsManager();
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
for (let service in this._credentialManagers) {
if (this._credentialManagers[service].token) {
this._onCredentialManagerAuthenticated(this._credentialManagers[service],
this._credentialManagers[service].token);
}
if (this._oVirtCredentialsManager.hasToken())
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
this._credentialManagers[service]._authenticatedSignalId =
this._credentialManagers[service].connect('user-authenticated',
this._onCredentialManagerAuthenticated.bind(this));
}
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
this._oVirtUserAuthenticated.bind(this));
}
begin(userName, hold) {
@@ -229,11 +222,8 @@ var ShellUserVerifier = class {
this._smartcardManager.disconnect(this._smartcardRemovedId);
this._smartcardManager = null;
for (let service in this._credentialManagers) {
let credentialManager = this._credentialManagers[service];
credentialManager.disconnect(credentialManager._authenticatedSignalId);
credentialManager = null;
}
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
this._oVirtCredentialsManager = null;
}
answerQuery(serviceName, answer) {
@@ -321,9 +311,9 @@ var ShellUserVerifier = class {
});
}
_onCredentialManagerAuthenticated(credentialManager, _token) {
this._preemptingService = credentialManager.service;
this.emit('credential-manager-authenticated');
_oVirtUserAuthenticated(_token) {
this._preemptingService = OVIRT_SERVICE_NAME;
this.emit('ovirt-user-authenticated');
}
_checkForSmartcard() {
@@ -500,12 +490,9 @@ var ShellUserVerifier = class {
if (!this.serviceIsForeground(serviceName))
return;
let token = null;
if (this._credentialManagers[serviceName])
token = this._credentialManagers[serviceName].token;
if (token) {
this.answerQuery(serviceName, token);
if (serviceName == OVIRT_SERVICE_NAME) {
// The only question asked by this service is "Token?"
this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken());
return;
}
@@ -573,10 +560,8 @@ var ShellUserVerifier = class {
// If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication
// mechanism.
let foregroundService = Object.keys(this._credentialManagers).find(service =>
this.serviceIsForeground(service));
if (foregroundService) {
this._credentialManagers[foregroundService].token = null;
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
this._oVirtCredentialsManager.resetToken();
this._preemptingService = null;
this._verificationFailed(false);
return;

View File

@@ -1,54 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported getVmwareCredentialsManager */
const Gio = imports.gi.Gio;
const Signals = imports.signals;
const Credential = imports.gdm.credentialManager;
const dbusPath = '/org/vmware/viewagent/Credentials';
const dbusInterface = 'org.vmware.viewagent.Credentials';
var SERVICE_NAME = 'gdm-vmwcred';
const VmwareCredentialsIface = '<node> \
<interface name="' + dbusInterface + '"> \
<signal name="UserAuthenticated"> \
<arg type="s" name="token"/> \
</signal> \
</interface> \
</node>';
const VmwareCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(VmwareCredentialsIface);
let _vmwareCredentialsManager = null;
function VmwareCredentials() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
g_interface_name: VmwareCredentialsInfo.name,
g_interface_info: VmwareCredentialsInfo,
g_name: dbusInterface,
g_object_path: dbusPath,
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
self.init(null);
return self;
}
var VmwareCredentialsManager = class VmwareCredentialsManager extends Credential.CredentialManager {
constructor() {
super(SERVICE_NAME);
this._credentials = new VmwareCredentials();
this._credentials.connectSignal('UserAuthenticated',
(proxy, sender, [token]) => {
this.token = token;
});
}
};
Signals.addSignalMethods(VmwareCredentialsManager.prototype);
function getVmwareCredentialsManager() {
if (!_vmwareCredentialsManager)
_vmwareCredentialsManager = new VmwareCredentialsManager();
return _vmwareCredentialsManager;
}

View File

@@ -6,8 +6,6 @@
<file>gdm/fingerprint.js</file>
<file>gdm/loginDialog.js</file>
<file>gdm/oVirt.js</file>
<file>gdm/credentialManager.js</file>
<file>gdm/vmware.js</file>
<file>gdm/realmd.js</file>
<file>gdm/util.js</file>

View File

@@ -852,9 +852,6 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
if (index === -1)
return;
this._arrows[index].destroy();
this._arrows.splice(index, 1);
this.icons.splice(index, 1);
this.removeItem(index);
}

View File

@@ -60,7 +60,7 @@ class Animation extends St.Bin {
}
_loadFile(file, width, height) {
const resourceScale = this.get_resource_scale();
let [validResourceScale, resourceScale] = this.get_resource_scale();
let wasPlaying = this._isPlaying;
if (this._isPlaying)
@@ -69,6 +69,12 @@ class Animation extends St.Bin {
this._isLoaded = false;
this.destroy_all_children();
if (!validResourceScale) {
if (wasPlaying)
this.play();
return;
}
let textureCache = St.TextureCache.get_default();
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._animations = textureCache.load_sliced_image(file, width, height,

View File

@@ -1782,8 +1782,8 @@ var AppFolderDialog = GObject.registerClass({
this._zoomAndFadeOut();
this._showFolderLabel();
this._isOpen = false;
this._grabHelper.ungrab({ actor: this });
this._isOpen = false;
this.emit('open-state-changed', false);
}
});
@@ -2185,20 +2185,17 @@ var AppIcon = GObject.registerClass({
}
});
var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
constructor(source) {
let side = St.Side.LEFT;
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
side = St.Side.RIGHT;
var BaseAppMenu = class BaseAppMenu extends PopupMenu.PopupMenu {
constructor(source, side) {
super(source, 0.5, side);
// We want to keep the item hovered while the menu is up
this.blockSourceEvents = true;
this._source = source;
this._appSystem = Shell.AppSystem.get_default();
this.actor.add_style_class_name('app-well-menu');
this._appSystem.connect('installed-changed', () => {
this._updateDetailsVisibility();
});
this._updateDetailsVisibility();
// Chain our visibility and lifecycle to that of the source
this._sourceMappedId = source.connect('notify::mapped', () => {
@@ -2209,14 +2206,50 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
source.disconnect(this._sourceMappedId);
this.destroy();
});
}
Main.uiGroup.add_actor(this.actor);
_updateDetailsVisibility() {
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() {
this.removeAll();
let windows = this._source.app.get_windows().filter(
let windows = this.app.get_windows().filter(
w => !w.skip_taskbar);
if (windows.length > 0) {
@@ -2225,33 +2258,29 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
new PopupMenu.PopupSeparatorMenuItem(_('Open Windows')));
}
windows.forEach(window => {
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._windowSection = new PopupMenu.PopupMenuSection();
this.addMenuItem(this._windowSection);
if (!this._source.app.is_window_backed()) {
this._updateWindowsSection();
if (!this.app.is_window_backed()) {
this._appendSeparator();
let appInfo = this._source.app.get_app_info();
let appInfo = this.app.get_app_info();
let actions = appInfo.list_actions();
if (this._source.app.can_open_new_window() &&
if (this.app.can_open_new_window() &&
!actions.includes('new-window')) {
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
this._newWindowMenuItem.connect('activate', () => {
this._source.animateLaunch();
this._source.app.open_new_window(-1);
this.app.open_new_window(-1);
this.emit('activate-window', null);
});
this._appendSeparator();
}
if (discreteGpuAvailable &&
this._source.app.state == Shell.AppState.STOPPED) {
this.app.state == Shell.AppState.STOPPED) {
const appPrefersNonDefaultGPU = appInfo.get_boolean('PrefersNonDefaultGPU');
const gpuPref = appPrefersNonDefaultGPU
? Shell.AppLaunchGpu.DEFAULT
@@ -2261,7 +2290,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
: _('Launch using Discrete Graphics Card'));
this._onGpuMenuItem.connect('activate', () => {
this._source.animateLaunch();
this._source.app.launch(0, -1, gpuPref);
this.app.launch(0, -1, gpuPref);
this.emit('activate-window', null);
});
}
@@ -2273,7 +2302,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
if (action == 'new-window')
this._source.animateLaunch();
this._source.app.launch_action(action, event.get_time(), -1);
this.app.launch_action(action, event.get_time(), -1);
this.emit('activate-window', null);
});
}
@@ -2283,19 +2312,19 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
if (canFavorite) {
this._appendSeparator();
let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id());
let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._app.get_id());
if (isFavorite) {
let item = this._appendMenuItem(_("Remove from Favorites"));
item.connect('activate', () => {
let favs = AppFavorites.getAppFavorites();
favs.removeFavorite(this._source.app.get_id());
favs.removeFavorite(this.app.get_id());
});
} else {
let item = this._appendMenuItem(_("Add to Favorites"));
item.connect('activate', () => {
let favs = AppFavorites.getAppFavorites();
favs.addFavorite(this._source.app.get_id());
favs.addFavorite(this.app.get_id());
});
}
}
@@ -2304,7 +2333,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
this._appendSeparator();
let item = this._appendMenuItem(_("Show Details"));
item.connect('activate', async () => {
let id = this._source.app.get_id();
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(
@@ -2316,7 +2345,17 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
null, 0, -1, null);
Main.overview.hide();
});
this._detailsItem = item;
}
this._appendSeparator();
let item = this._appendMenuItem(_("Quit"));
item.connect('activate', () => {
this.app.request_quit();
});
}
}
@@ -2339,6 +2378,27 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
};
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(
class SystemActionIcon extends Search.GridSearchResult {
activate() {

View File

@@ -712,18 +712,13 @@ var BackgroundManager = class BackgroundManager {
}
let newBackgroundActor = this._createBackgroundActor();
const oldContent = this.backgroundActor.content;
const newContent = newBackgroundActor.content;
newContent.vignette_sharpness = oldContent.vignette_sharpness;
newContent.brightness = oldContent.brightness;
newBackgroundActor.vignette_sharpness = this.backgroundActor.vignette_sharpness;
newBackgroundActor.brightness = this.backgroundActor.brightness;
newBackgroundActor.visible = this.backgroundActor.visible;
this._newBackgroundActor = newBackgroundActor;
const { background } = newBackgroundActor.content;
let background = newBackgroundActor.background;
if (background.isLoaded) {
this._swapBackgroundActor();

View File

@@ -784,7 +784,6 @@ class DateMenuButton extends PanelMenu.Button {
this._clockDisplay = new St.Label({ style_class: 'clock' });
this._clockDisplay.clutter_text.y_align = Clutter.ActorAlign.CENTER;
this._clockDisplay.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._indicator = new MessagesIndicator();

View File

@@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported Dialog, MessageDialogContent, ListSection, ListSectionItem */
const { Clutter, GLib, GObject, Meta, Pango, St } = imports.gi;
const { Clutter, GObject, Meta, Pango, St } = imports.gi;
function _setLabel(label, value) {
label.set({
@@ -221,16 +221,13 @@ var MessageDialogContent = GObject.registerClass({
this._updateTitleStyleLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this._updateTitleStyleLater = 0;
this._title.add_style_class_name('leightweight');
return GLib.SOURCE_REMOVE;
return false;
});
}
}
set title(title) {
if (this._title.text === title)
return;
_setLabel(this._title, title);
this._title.remove_style_class_name('leightweight');
@@ -240,9 +237,6 @@ var MessageDialogContent = GObject.registerClass({
}
set description(description) {
if (this._description.text === description)
return;
_setLabel(this._description, description);
this.notify('description');
}

View File

@@ -31,7 +31,7 @@ var IconSize = {
var APPICON_ANIMATION_OUT_SCALE = 3;
var APPICON_ANIMATION_OUT_TIME = 250;
const ICON_POSITION_DELAY = 10;
const ICON_POSITION_DELAY = 25;
const defaultGridModes = [
{

View File

@@ -1,5 +1,5 @@
/* exported InhibitShortcutsDialog */
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Pango, Shell, St } = imports.gi;
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
const Dialog = imports.ui.dialog;
const ModalDialog = imports.ui.modalDialog;
@@ -90,8 +90,6 @@ var InhibitShortcutsDialog = GObject.registerClass({
text: _('You can restore shortcuts by pressing %s.').format(restoreAccel),
style_class: 'message-dialog-description',
});
restoreLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
restoreLabel.clutter_text.line_wrap = true;
content.add_child(restoreLabel);
}

View File

@@ -61,24 +61,6 @@ class AspectContainer extends St.Widget {
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) {
if (box.get_width() > 0 && box.get_height() > 0) {
let sizeRatio = box.get_width() / box.get_height();
@@ -1626,9 +1608,7 @@ class Keyboard extends St.BoxLayout {
* we allow the OSK being smaller than 1/3rd of the monitor height
* there.
*/
const forWidth = this.get_theme_node().adjust_for_width(monitor.width);
const [, natHeight] = this.get_preferred_height(forWidth);
this.height = Math.min(maxHeight, natHeight);
this.height = Math.min(maxHeight, this.get_preferred_height(monitor.width));
}
}

View File

@@ -1204,8 +1204,7 @@ class HotCorner extends Clutter.Actor {
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
this._corner.set_position(this.width - this._corner.width, 0);
this.set_pivot_point(1.0, 0.0);
this.translation_x = -this.width;
this.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
} else {
this._corner.set_position(0, 0);
}

View File

@@ -489,10 +489,7 @@ var Magnifier = class Magnifier {
_updateMouseSprite() {
this._updateSpriteTexture();
let [xHot, yHot] = this._cursorTracker.get_hot();
this._mouseSprite.set({
translation_x: -xHot,
translation_y: -yHot,
});
this._mouseSprite.set_anchor_point(xHot, yHot);
}
_updateSpriteTexture() {

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported NotificationPolicy, NotificationGenericPolicy,
NotificationApplicationPolicy, Source, SourceActor,
NotificationApplicationPolicy, Source, SourceActor, SourceActorWithLabel,
SystemNotificationSource, MessageTray */
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
@@ -655,6 +655,77 @@ class SourceActor extends St.Widget {
}
});
var SourceActorWithLabel = GObject.registerClass(
class SourceActorWithLabel extends SourceActor {
_init(source, size) {
super._init(source, size);
this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_align: Clutter.ActorAlign.CENTER,
y_expand: true });
this._counterBin = new St.Bin({ style_class: 'summary-source-counter',
child: this._counterLabel,
layout_manager: new Clutter.BinLayout() });
this._counterBin.hide();
this._counterBin.connect('style-changed', () => {
let themeNode = this._counterBin.get_theme_node();
this._counterBin.translation_x = themeNode.get_length('-shell-counter-overlap-x');
this._counterBin.translation_y = themeNode.get_length('-shell-counter-overlap-y');
});
this.add_actor(this._counterBin);
this._countUpdatedId = this._source.connect('notify::count', this._updateCount.bind(this));
this._updateCount();
this.connect('destroy', () => {
this._source.disconnect(this._countUpdatedId);
});
}
vfunc_allocate(box) {
super.vfunc_allocate(box);
let childBox = new Clutter.ActorBox();
let [, , naturalWidth, naturalHeight] = this._counterBin.get_preferred_size();
let direction = this.get_text_direction();
if (direction == Clutter.TextDirection.LTR) {
// allocate on the right in LTR
childBox.x1 = box.x2 - naturalWidth;
childBox.x2 = box.x2;
} else {
// allocate on the left in RTL
childBox.x1 = 0;
childBox.x2 = naturalWidth;
}
childBox.y1 = box.y2 - naturalHeight;
childBox.y2 = box.y2;
this._counterBin.allocate(childBox);
}
_updateCount() {
if (this._actorDestroyed)
return;
this._counterBin.visible = this._source.countVisible;
let text;
if (this._source.count < 100)
text = this._source.count.toString();
else
text = String.fromCharCode(0x22EF); // midline horizontal ellipsis
this._counterLabel.set_text(text);
}
});
var Source = GObject.registerClass({
Properties: {
'count': GObject.ParamSpec.int(

View File

@@ -4,10 +4,6 @@
const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
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 DND = imports.ui.dnd;
const LayoutManager = imports.ui.layout;
@@ -18,6 +14,9 @@ const OverviewControls = imports.ui.overviewControls;
const Params = imports.misc.params;
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
// or from the overview completely after ANIMATION_TIME,
// and don't want the shading animation to get cut off
@@ -440,19 +439,19 @@ var Overview = class {
this.emit('windows-restacked', stackIndices);
}
beginItemDrag(source) {
this.emit('item-drag-begin', source);
beginItemDrag(_source) {
this.emit('item-drag-begin');
this._inItemDrag = true;
}
cancelledItemDrag(source) {
this.emit('item-drag-cancelled', source);
cancelledItemDrag(_source) {
this.emit('item-drag-cancelled');
}
endItemDrag(source) {
endItemDrag(_source) {
if (!this._inItemDrag)
return;
this.emit('item-drag-end', source);
this.emit('item-drag-end');
this._inItemDrag = false;
}

View File

@@ -8,9 +8,8 @@ const Main = imports.ui.main;
const Params = imports.misc.params;
const ViewSelector = imports.ui.viewSelector;
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
const Overview = imports.ui.overview;
var SIDE_CONTROLS_ANIMATION_TIME = Overview.ANIMATION_TIME;
var SIDE_CONTROLS_ANIMATION_TIME = 160;
function getRtlSlideDirection(direction, actor) {
let rtl = actor.text_direction == Clutter.TextDirection.RTL;
@@ -423,7 +422,6 @@ class ControlsManager extends St.Widget {
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
this._workspaceAdjustment = new St.Adjustment({
actor: this,
value: activeWorkspaceIndex,
lower: 0,
page_increment: 1,
@@ -455,6 +453,8 @@ class ControlsManager extends St.Widget {
this._group.add_child(this.viewSelector);
this._group.add_actor(this._thumbnailsSlider);
layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this));
Main.overview.connect('showing', this._updateSpacerVisibility.bind(this));
this.connect('destroy', this._onDestroy.bind(this));
@@ -477,6 +477,26 @@ class ControlsManager extends St.Widget {
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() {
// Ignore the case when we're leaving the overview, since
// actors will be made visible again when entering the overview

View File

@@ -5,6 +5,7 @@ const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Cairo = imports.cairo;
const Animation = imports.ui.animation;
const AppDisplay = imports.ui.appDisplay;
const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab;
const DND = imports.ui.dnd;
@@ -60,69 +61,20 @@ function _unpremultiply(color) {
return new Clutter.Color({ red, green, blue, alpha: color.alpha });
}
class AppMenu extends PopupMenu.PopupMenu {
class AppMenu extends AppDisplay.BaseAppMenu {
constructor(sourceActor) {
super(sourceActor, 0.5, St.Side.TOP);
super(sourceActor, St.Side.TOP);
this.actor.add_style_class_name('app-menu');
this._app = null;
this._appSystem = Shell.AppSystem.get_default();
this._windowsChangedId = 0;
/* Translators: This is the heading of a list of open windows */
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
this._windowSection = new PopupMenu.PopupMenuSection();
this.addMenuItem(this._windowSection);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._newWindowItem = this.addAction(_("New Window"), () => {
this._app.open_new_window(-1);
});
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._actionSection = new PopupMenu.PopupMenuSection();
this.addMenuItem(this._actionSection);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._detailsItem = this.addAction(_('Show Details'), async () => {
let id = this._app.get_id();
let args = GLib.Variant.new('(ss)', [id, '']);
const bus = await Gio.DBus.get(Gio.BusType.SESSION, null);
bus.call(
'org.gnome.Software',
'/org/gnome/Software',
'org.gtk.Actions', 'Activate',
new GLib.Variant('(sava{sv})', ['details', [args], null]),
null, 0, -1, null);
});
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.addAction(_("Quit"), () => {
this._app.request_quit();
});
this._appSystem.connect('installed-changed', () => {
this._updateDetailsVisibility();
});
this._updateDetailsVisibility();
}
_updateDetailsVisibility() {
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
this._detailsItem.visible = sw != null;
}
isEmpty() {
if (!this._app)
return true;
return super.isEmpty();
get app() {
return this._app;
}
setApp(app) {
@@ -157,25 +109,6 @@ class AppMenu extends PopupMenu.PopupMenu {
this._newWindowItem.visible =
app && app.can_open_new_window() && !actions.includes('new-window');
}
_updateWindowsSection() {
this._windowSection.removeAll();
if (!this._app)
return;
let windows = this._app.get_windows();
windows.forEach(window => {
let title = window.title || this._app.get_name();
let item = this._windowSection.addAction(title, event => {
Main.activateWindow(window, event.get_time());
});
let id = window.connect('notify::title', () => {
item.label.text = window.title || this._app.get_name();
});
item.connect('destroy', () => window.disconnect(id));
});
}
}
/**
@@ -675,7 +608,7 @@ class PanelCorner extends St.DrawingArea {
let borderWidth = node.get_length('-panel-corner-border-width');
this.set_size(cornerRadius, borderWidth + cornerRadius);
this.translation_y = -borderWidth;
this.set_anchor_point(0, borderWidth);
}
});

View File

@@ -62,7 +62,6 @@ var StreamSlider = class {
this._stream = null;
this._volumeCancellable = null;
this._icons = [];
}
get stream() {
@@ -183,15 +182,24 @@ var StreamSlider = class {
if (!this._stream)
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 n;
if (this._stream.is_muted || volume <= 0) {
n = 0;
} else {
n = Math.ceil(3 * volume / this._control.get_vol_max_norm());
n = Math.clamp(n, 1, this._icons.length - 1);
if (n < 1)
n = 1;
else if (n > 3)
n = 4;
}
return this._icons[n];
return icons[n];
}
getLevel() {
@@ -215,13 +223,6 @@ var OutputStreamSlider = class extends StreamSlider {
constructor(control) {
super(control);
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) {
@@ -273,12 +274,6 @@ var InputStreamSlider = class extends StreamSlider {
this._control.connect('stream-added', this._maybeShowInput.bind(this));
this._control.connect('stream-removed', this._maybeShowInput.bind(this));
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) {
@@ -324,7 +319,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
this._output = new OutputStreamSlider(this._control);
this._output.connect('stream-updated', () => {
this.emit('output-icon-changed');
this.emit('icon-changed');
});
this.addMenuItem(this._output.item);
@@ -332,9 +327,6 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
this._input.item.connect('notify::visible', () => {
this.emit('input-visible-changed');
});
this._input.connect('stream-updated', () => {
this.emit('input-icon-changed');
});
this.addMenuItem(this._input.item);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@@ -351,7 +343,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
this._readInput();
this._readOutput();
} else {
this.emit('output-icon-changed');
this.emit('icon-changed');
}
}
@@ -363,14 +355,10 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
this._input.stream = this._control.get_default_source();
}
getOutputIcon() {
getIcon() {
return this._output.getIcon();
}
getInputIcon() {
return this._input.getIcon();
}
getLevel() {
return this._output.getLevel();
}
@@ -394,24 +382,21 @@ class Indicator extends PanelMenu.SystemIndicator {
this._control = getMixerControl();
this._volumeMenu = new VolumeMenu(this._control);
this._volumeMenu.connect('output-icon-changed', () => {
let icon = this._volumeMenu.getOutputIcon();
this._volumeMenu.connect('icon-changed', () => {
let icon = this._volumeMenu.getIcon();
if (icon != null)
this._primaryIndicator.icon_name = icon;
this._primaryIndicator.visible = icon !== null;
});
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
this._inputIndicator.set({
icon_name: 'audio-input-microphone-symbolic',
visible: this._volumeMenu.getInputVisible(),
});
this._volumeMenu.connect('input-visible-changed', () => {
this._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);
}
@@ -421,7 +406,7 @@ class Indicator extends PanelMenu.SystemIndicator {
if (result == Clutter.EVENT_PROPAGATE || this.menu.actor.mapped)
return result;
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getOutputIcon() });
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() });
let level = this._volumeMenu.getLevel();
let maxLevel = this._volumeMenu.getMaxLevel();
Main.osdWindowManager.show(-1, gicon, null, level, maxLevel);

View File

@@ -485,7 +485,6 @@ var UnlockDialog = GObject.registerClass({
this._gdmClient = new Gdm.Client();
this._adjustment = new St.Adjustment({
actor: this,
lower: 0,
upper: 2,
page_size: 1,
@@ -525,10 +524,6 @@ var UnlockDialog = GObject.registerClass({
this._bgManagers = [];
const themeContext = St.ThemeContext.get_for_stage(global.stage);
this._scaleChangedId = themeContext.connect('notify::scale-factor',
() => this._updateBackgroundEffects());
this._updateBackgrounds();
this._monitorsChangedId =
Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this));
@@ -573,9 +568,11 @@ var UnlockDialog = GObject.registerClass({
this._screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
this._userSwitchEnabledId = 0;
this._userSwitchEnabledId = this._screenSaverSettings.connect('changed::user-switch-enabled',
this._updateUserSwitchVisibility.bind(this));
this._userLoadedId = 0;
this._userLoadedId = this._user.connect('notify::is-loaded',
this._updateUserSwitchVisibility.bind(this));
@@ -629,7 +626,6 @@ var UnlockDialog = GObject.registerClass({
y: monitor.y,
width: monitor.width,
height: monitor.height,
effect: new Shell.BlurEffect({ name: 'blur' }),
});
let bgManager = new Background.BackgroundManager({
@@ -641,17 +637,19 @@ var UnlockDialog = GObject.registerClass({
this._bgManagers.push(bgManager);
this._backgroundGroup.add_child(widget);
}
_updateBackgroundEffects() {
const themeContext = St.ThemeContext.get_for_stage(global.stage);
for (const widget of this._backgroundGroup) {
widget.get_effect('blur').set({
brightness: BLUR_BRIGHTNESS,
sigma: BLUR_SIGMA * themeContext.scale_factor,
});
}
let effect = new Shell.BlurEffect({
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() {
@@ -663,7 +661,6 @@ var UnlockDialog = GObject.registerClass({
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
this._createBackground(i);
this._updateBackgroundEffects();
}
_ensureAuthPrompt() {

View File

@@ -299,6 +299,10 @@ var ViewSelector = GObject.registerClass({
Main.overview.fadeInDesktop();
}
setWorkspacesFullGeometry(geom) {
this._workspacesDisplay.setWorkspacesFullGeometry(geom);
}
vfunc_hide() {
this.reset();
this._workspacesDisplay.hide();

View File

@@ -1800,7 +1800,8 @@ var WindowManager = class {
w.window.get_parent().remove_child(w.window);
w.parent.add_child(w.window);
if (!w.window.get_meta_window().get_workspace().active)
if (w.window.get_meta_window().get_workspace() !=
global.workspace_manager.get_active_workspace())
w.window.hide();
}
switchData.container.destroy();
@@ -1984,7 +1985,7 @@ var WindowManager = class {
duration,
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
onComplete: () => {
if (!newWs.active)
if (newWs !== activeWorkspace)
this.actionMoveWorkspace(newWs);
this._finishWorkspaceSwitch(switchData);
},
@@ -2184,7 +2185,10 @@ var WindowManager = class {
if (!Main.sessionMode.hasWorkspaces)
return;
if (!workspace.active)
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
if (activeWorkspace != workspace)
workspace.activate(global.get_current_time());
}
@@ -2192,7 +2196,10 @@ var WindowManager = class {
if (!Main.sessionMode.hasWorkspaces)
return;
if (!workspace.active) {
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
if (activeWorkspace != workspace) {
// This won't have any effect for "always sticky" windows
// (like desktop windows or docks)

View File

@@ -67,12 +67,8 @@ var WindowPreviewLayout = GObject.registerClass({
vfunc_allocate(container, box) {
// If the scale isn't 1, we weren't allocated our preferred size
// and have to scale the children allocations accordingly.
const scaleX = this._boundingBox.get_width() > 0
? box.get_width() / this._boundingBox.get_width()
: 1;
const scaleY = this._boundingBox.get_height() > 0
? box.get_height() / this._boundingBox.get_height()
: 1;
const scaleX = box.get_width() / this._boundingBox.get_width();
const scaleY = box.get_height() / this._boundingBox.get_height();
const childBox = new Clutter.ActorBox();
@@ -97,7 +93,7 @@ var WindowPreviewLayout = GObject.registerClass({
child.allocate(childBox);
} else {
child.allocate_preferred_size(0, 0);
child.allocate_preferred_size();
}
}
}
@@ -189,12 +185,6 @@ var WindowPreviewLayout = GObject.registerClass({
});
var WindowPreview = GObject.registerClass({
Properties: {
'overlay-enabled': GObject.ParamSpec.boolean(
'overlay-enabled', 'overlay-enabled', 'overlay-enabled',
GObject.ParamFlags.READWRITE,
true),
},
Signals: {
'drag-begin': {},
'drag-cancelled': {},
@@ -229,6 +219,7 @@ var WindowPreview = GObject.registerClass({
this._delegate = this;
this.slotId = 0;
this._stackAbove = null;
this._windowContainer.layout_manager.connect(
@@ -242,6 +233,8 @@ var WindowPreview = GObject.registerClass({
this._windowActor.connect('destroy', () => this.destroy());
this._updateAttachedDialogs();
this.x = this.boundingBox.x;
this.y = this.boundingBox.y;
let clickAction = new Clutter.ClickAction();
clickAction.connect('clicked', () => this._activate());
@@ -260,7 +253,6 @@ var WindowPreview = GObject.registerClass({
this.inDrag = false;
this._selected = false;
this._overlayEnabled = true;
this._closeRequested = false;
this._idleHideOverlayId = 0;
@@ -353,14 +345,6 @@ var WindowPreview = GObject.registerClass({
this.add_child(this._border);
this.add_child(this._title);
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) {
@@ -415,6 +399,8 @@ var WindowPreview = GObject.registerClass({
}
chromeHeights() {
this._border.ensure_style();
this._title.ensure_style();
const [, closeButtonHeight] = this._closeButton.get_preferred_height(-1);
const [, titleHeight] = this._title.get_preferred_height(-1);
@@ -427,6 +413,7 @@ var WindowPreview = GObject.registerClass({
}
chromeWidths() {
this._border.ensure_style();
const [, closeButtonWidth] = this._closeButton.get_preferred_width(-1);
const leftOversize = this._closeButtonSide === St.Side.LEFT
@@ -440,9 +427,6 @@ var WindowPreview = GObject.registerClass({
}
showOverlay(animate) {
if (!this._overlayEnabled)
return;
const ongoingTransition = this._border.get_transition('opacity');
// Don't do anything if we're fully visible already
@@ -578,25 +562,6 @@ var WindowPreview = GObject.registerClass({
});
}
// eslint-disable-next-line camelcase
get overlay_enabled() {
return this._overlayEnabled;
}
// eslint-disable-next-line camelcase
set overlay_enabled(enabled) {
if (this._overlayEnabled === enabled)
return;
this._overlayEnabled = enabled;
this.notify('overlay-enabled');
if (!enabled)
this.hideOverlay(false);
else if (this['has-pointer'] || global.stage.key_focus === this)
this.showOverlay(true);
}
// Find the actor just below us, respecting reparenting done by DND code
_getActualStackAbove() {
if (this._stackAbove == null)

File diff suppressed because it is too large Load Diff

View File

@@ -549,7 +549,9 @@ var WorkspaceThumbnail = GObject.registerClass({
return;
// a click on the already current workspace should go back to the main view
if (this.metaWorkspace.active)
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
if (this.metaWorkspace == activeWorkspace)
Main.overview.hide();
else
this.metaWorkspace.activate(time);

View File

@@ -7,7 +7,6 @@ const Main = imports.ui.main;
const SwipeTracker = imports.ui.swipeTracker;
const Workspace = imports.ui.workspace;
var { ANIMATION_TIME } = imports.ui.overview;
var WORKSPACE_SWITCH_TIME = 250;
var SCROLL_TIMEOUT_TIME = 150;
@@ -22,18 +21,18 @@ var WorkspacesViewBase = GObject.registerClass({
GTypeFlags: GObject.TypeFlags.ABSTRACT,
}, class WorkspacesViewBase extends St.Widget {
_init(monitorIndex) {
const { x, y, width, height } =
Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
super._init({
style_class: 'workspaces-view',
x, y, width, height,
});
super._init({ style_class: 'workspaces-view', reactive: true });
this.connect('destroy', this._onDestroy.bind(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._fullGeometry = null;
this._actualGeometry = null;
this._inDrag = false;
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
@@ -52,19 +51,24 @@ var WorkspacesViewBase = GObject.registerClass({
}
}
_dragBegin() {
_dragBegin(overview, window) {
this._inDrag = true;
this._setReservedSlot(window);
}
_dragEnd() {
this._inDrag = false;
this._setReservedSlot(null);
}
vfunc_allocate(box) {
this.set_allocation(box);
setFullGeometry(geom) {
this._fullGeometry = geom;
this._syncFullGeometry();
}
for (const child of this)
child.allocate_available_size(0, 0, box.get_width(), box.get_height());
setActualGeometry(geom) {
this._actualGeometry = geom;
this._syncActualGeometry();
}
});
@@ -79,8 +83,9 @@ class WorkspacesView extends WorkspacesViewBase {
this._gestureActive = false; // touch(pad) gestures
this._scrollAdjustment = scrollAdjustment;
this._onScrollId = this._scrollAdjustment.connect('notify::value',
this._updateScrollPosition.bind(this));
this._onScrollId =
this._scrollAdjustment.connect('notify::value',
this._onScroll.bind(this));
this._workspaces = [];
this._updateWorkspaces();
@@ -92,42 +97,34 @@ class WorkspacesView extends WorkspacesViewBase {
this._workspaces.sort((a, b) => {
return a.metaWorkspace.index() - b.metaWorkspace.index();
});
this._workspaces.forEach(
(ws, i) => this.set_child_at_index(ws, i));
this._updateWorkspaceActors(false);
});
this._overviewShownId = Main.overview.connect('shown', () => {
this.clip_to_allocation = true;
});
this._overviewShownId =
Main.overview.connect('shown', () => {
this.set_clip(this._fullGeometry.x, this._fullGeometry.y,
this._fullGeometry.width, this._fullGeometry.height);
});
this._switchWorkspaceNotifyId =
global.window_manager.connect('switch-workspace',
this._activeWorkspaceChanged.bind(this));
}
vfunc_allocate(box) {
this.set_allocation(box);
_setReservedSlot(window) {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(window);
}
if (this.get_n_children() === 0)
return;
_syncFullGeometry() {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setFullGeometry(this._fullGeometry);
}
const { workspaceManager } = global;
const { nWorkspaces } = workspaceManager;
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();
_syncActualGeometry() {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setActualGeometry(this._actualGeometry);
}
getActiveWorkspace() {
@@ -143,11 +140,11 @@ class WorkspacesView extends WorkspacesViewBase {
else
this._workspaces[w].fadeToOverview();
}
this._updateScrollPosition();
this._updateWorkspaceActors(false);
}
animateFromOverview(animationType) {
this.clip_to_allocation = false;
this.remove_clip();
for (let w = 0; w < this._workspaces.length; w++) {
if (animationType == AnimationType.ZOOM)
@@ -162,22 +159,49 @@ class WorkspacesView extends WorkspacesViewBase {
this._workspaces[i].syncStacking(stackIndices);
}
_scrollToActive() {
const { workspaceManager } = global;
const active = workspaceManager.get_active_workspace_index();
// Update workspace actors parameters
// @showAnimation: iff %true, transition between states
_updateWorkspaceActors(showAnimation) {
let workspaceManager = global.workspace_manager;
let active = workspaceManager.get_active_workspace_index();
this._animating = true;
this._updateVisibility();
this._animating = showAnimation;
this._scrollAdjustment.remove_transition('value');
this._scrollAdjustment.ease(active, {
duration: WORKSPACE_SWITCH_TIME,
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
onComplete: () => {
this._animating = false;
this._updateVisibility();
},
});
for (let w = 0; w < this._workspaces.length; w++) {
let workspace = this._workspaces[w];
workspace.remove_all_transitions();
let params = {};
if (workspaceManager.layout_rows == -1)
params.y = (w - active) * this._fullGeometry.height;
else if (this.text_direction == Clutter.TextDirection.RTL)
params.x = (active - w) * this._fullGeometry.width;
else
params.x = (w - active) * this._fullGeometry.width;
if (showAnimation) {
let easeParams = Object.assign(params, {
duration: WORKSPACE_SWITCH_TIME,
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
});
// we have to call _updateVisibility() once before the
// animation and once afterwards - it does not really
// matter which tween we use, so we pick the first one ...
if (w == 0) {
this._updateVisibility();
easeParams.onComplete = () => {
this._animating = false;
this._updateVisibility();
};
}
workspace.ease(easeParams);
} else {
workspace.set(params);
if (w == 0)
this._updateVisibility();
}
}
}
_updateVisibility() {
@@ -218,14 +242,19 @@ class WorkspacesView extends WorkspacesViewBase {
}
}
this._updateScrollPosition();
if (this._fullGeometry) {
this._updateWorkspaceActors(false);
this._syncFullGeometry();
}
if (this._actualGeometry)
this._syncActualGeometry();
}
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
if (this._scrolling)
return;
this._scrollToActive();
this._updateWorkspaceActors(true);
}
_onDestroy() {
@@ -247,25 +276,21 @@ class WorkspacesView extends WorkspacesViewBase {
this._gestureActive = false;
// Make sure title captions etc are shown as necessary
this._scrollToActive();
this._updateWorkspaceActors(true);
this._updateVisibility();
}
// sync the workspaces' positions to the value of the scroll adjustment
// and change the active workspace if appropriate
_updateScrollPosition() {
if (!this.has_allocation())
_onScroll(adj) {
if (adj.get_transition('value') !== null && !this._gestureActive)
return;
const adj = this._scrollAdjustment;
const allowSwitch =
adj.get_transition('value') === null && !this._gestureActive;
let workspaceManager = global.workspace_manager;
let active = workspaceManager.get_active_workspace_index();
let current = Math.round(adj.value);
if (allowSwitch && active !== current) {
if (active != current && !this._gestureActive) {
if (!this._workspaces[current]) {
// The current workspace was destroyed. This could happen
// when you are on the last empty workspace, and consolidate
@@ -282,16 +307,36 @@ class WorkspacesView extends WorkspacesViewBase {
if (adj.upper == 1)
return;
const vertical = workspaceManager.layout_rows === -1;
const rtl = this.text_direction === Clutter.TextDirection.RTL;
const progress = vertical || !rtl
? adj.value : adj.upper - adj.value;
let last = this._workspaces.length - 1;
for (const ws of this._workspaces) {
if (vertical)
ws.translation_y = -progress * this.height;
else
ws.translation_x = -progress * this.width;
if (workspaceManager.layout_rows == -1) {
let firstWorkspaceY = this._workspaces[0].y;
let lastWorkspaceY = this._workspaces[last].y;
let workspacesHeight = lastWorkspaceY - firstWorkspaceY;
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;
}
}
}
});
@@ -304,6 +349,18 @@ class ExtraWorkspaceView extends WorkspacesViewBase {
this.add_actor(this._workspace);
}
_setReservedSlot(window) {
this._workspace.setReservedSlot(window);
}
_syncFullGeometry() {
this._workspace.setFullGeometry(this._fullGeometry);
}
_syncActualGeometry() {
this._workspace.setActualGeometry(this._actualGeometry);
}
getActiveWorkspace() {
return this._workspace;
}
@@ -381,8 +438,6 @@ class WorkspacesDisplay extends St.Widget {
this._windowDragEndId =
Main.overview.connect('window-drag-begin',
this._windowDragEnd.bind(this));
this._overviewShownId = Main.overview.connect('shown',
this._syncWorkspacesActualGeometry.bind(this));
this._primaryIndex = Main.layoutManager.primaryIndex;
this._workspacesViews = [];
@@ -397,9 +452,9 @@ class WorkspacesDisplay extends St.Widget {
this._scrollEventId = 0;
this._keyPressEventId = 0;
this._scrollTimeoutId = 0;
this._syncActualGeometryLater = 0;
this._actualGeometry = null;
this._fullGeometry = null;
this._inWindowDrag = false;
this._gestureActive = false; // touch(pad) gestures
@@ -421,11 +476,6 @@ class WorkspacesDisplay extends St.Widget {
this._parentSetLater = 0;
}
if (this._syncActualGeometryLater) {
Meta.later_remove(this._syncActualGeometryLater);
this._syncActualGeometryLater = 0;
}
if (this._scrollTimeoutId !== 0) {
GLib.source_remove(this._scrollTimeoutId);
this._scrollTimeoutId = 0;
@@ -435,7 +485,6 @@ class WorkspacesDisplay extends St.Widget {
global.workspace_manager.disconnect(this._reorderWorkspacesdId);
Main.overview.disconnect(this._windowDragBeginId);
Main.overview.disconnect(this._windowDragEndId);
Main.overview.disconnect(this._overviewShownId);
}
_windowDragBegin() {
@@ -459,11 +508,25 @@ class WorkspacesDisplay extends St.Widget {
workspaceManager.get_active_workspace_index();
}
_activeWorkspaceChanged(_wm, _from, to, _direction) {
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
if (this._gestureActive)
return;
this._scrollAdjustment.ease(to, {
this._scrollToActive();
}
_scrollToActive() {
let workspaceManager = global.workspace_manager;
let active = workspaceManager.get_active_workspace_index();
this._updateScrollAdjustment(active);
}
_updateScrollAdjustment(index) {
if (this._gestureActive)
return;
this._scrollAdjustment.ease(index, {
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
duration: WORKSPACE_SWITCH_TIME,
});
@@ -501,8 +564,11 @@ class WorkspacesDisplay extends St.Widget {
for (let i = 0; i < this._workspacesViews.length; i++)
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
? this.height : this.width;
? geometry.height : geometry.width;
let progress = adjustment.value / adjustment.page_size;
let points = Array.from(
@@ -522,13 +588,14 @@ class WorkspacesDisplay extends St.Widget {
this._clickAction.release();
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
let newWs = workspaceManager.get_workspace_by_index(endProgress);
this._scrollAdjustment.ease(endProgress, {
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
duration,
onComplete: () => {
if (!newWs.active)
if (newWs !== activeWorkspace)
newWs.activate(global.get_current_time());
this._endTouchGesture();
},
@@ -549,7 +616,7 @@ class WorkspacesDisplay extends St.Widget {
this.show();
this._updateWorkspacesViews();
if (this._actualGeometry) {
if (this._actualGeometry && this._fullGeometry) {
for (let i = 0; i < this._workspacesViews.length; i++) {
let animationType;
if (fadeOnPrimary && i == this._primaryIndex)
@@ -558,9 +625,6 @@ class WorkspacesDisplay extends St.Widget {
animationType = AnimationType.ZOOM;
this._workspacesViews[i].animateToOverview(animationType);
}
if (!fadeOnPrimary)
this._syncWorkspacesActualGeometry();
}
this._restackedNotifyId =
@@ -582,15 +646,6 @@ class WorkspacesDisplay extends St.Widget {
animationType = AnimationType.ZOOM;
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() {
@@ -620,7 +675,6 @@ class WorkspacesDisplay extends St.Widget {
return;
this._updateWorkspacesViews();
this._syncWorkspacesActualGeometry();
}
_updateWorkspacesViews() {
@@ -637,9 +691,19 @@ class WorkspacesDisplay extends St.Widget {
else
view = new WorkspacesView(i, this._scrollAdjustment);
// HACK: Avoid spurious allocation changes while updating views
view.hide();
this._workspacesViews.push(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) {
@@ -686,35 +750,43 @@ class WorkspacesDisplay extends St.Widget {
});
}
// This geometry should always be the fullest geometry
// the workspaces switcher can ever be allocated, as if
// the sliding controls were never slid in at all.
setWorkspacesFullGeometry(geom) {
this._fullGeometry = geom;
this._syncWorkspacesFullGeometry();
}
_syncWorkspacesFullGeometry() {
if (!this._workspacesViews.length)
return;
let monitors = Main.layoutManager.monitors;
for (let i = 0; i < monitors.length; i++) {
let geometry = i == this._primaryIndex ? this._fullGeometry : monitors[i];
this._workspacesViews[i].setFullGeometry(geometry);
}
}
_updateWorkspacesActualGeometry() {
const [x, y] = this.get_transformed_position();
const width = this.allocation.get_width();
const height = this.allocation.get_height();
this._actualGeometry = { x, y, width, height };
if (this._syncActualGeometryLater > 0)
return;
this._syncActualGeometryLater =
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this._syncWorkspacesActualGeometry();
this._syncActualGeometryLater = 0;
return GLib.SOURCE_REMOVE;
});
this._syncWorkspacesActualGeometry();
}
_syncWorkspacesActualGeometry() {
const primaryView = this._getPrimaryView();
if (!primaryView)
if (!this._workspacesViews.length)
return;
primaryView.ease({
...this._actualGeometry,
duration: Main.overview.animationInProgress ? ANIMATION_TIME : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
let monitors = Main.layoutManager.monitors;
for (let i = 0; i < monitors.length; i++) {
let geometry = i === this._primaryIndex ? this._actualGeometry : monitors[i];
this._workspacesViews[i].setActualGeometry(geometry);
}
}
_onRestacked(overview, stackIndices) {

View File

@@ -1,5 +1,5 @@
project('gnome-shell', 'c',
version: '3.37.3',
version: '3.37.2',
meson_version: '>= 0.53.0',
license: 'GPLv2+'
)
@@ -25,7 +25,7 @@ gio_req = '>= 2.56.0'
gi_req = '>= 1.49.1'
gjs_req = '>= 1.65.1'
gtk_req = '>= 3.15.0'
mutter_req = '>= 3.37.3'
mutter_req = '>= 3.37.2'
polkit_req = '>= 0.100'
schemas_req = '>= 3.33.1'
startup_req = '>= 0.11'

1
mutter Submodule

Submodule mutter added at 1551b6d386

313
po/kk.po
View File

@@ -1,14 +1,14 @@
# Kazakh translation for gnome-shell.
# Copyright (C) 2015 The gnome-shell authors.
# This file is distributed under the same license as the gnome-shell package.
# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2012-2020.
# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2012-2019.
#
msgid ""
msgstr ""
"Project-Id-Version: master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-06-25 04:35+0000\n"
"PO-Revision-Date: 2020-06-27 23:27+0500\n"
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
"PO-Revision-Date: 2020-06-15 18:37+0500\n"
"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
"Language-Team: Kazakh <kk_KZ@googlegroups.com>\n"
"Language: kk\n"
@@ -81,10 +81,16 @@ msgstr ""
"DisableExtension DBus тәсілдерімен де өзгертуге болады."
#: data/org.gnome.shell.gschema.xml.in:26
#| msgid "UUIDs of extensions to enable"
msgid "UUIDs of extensions to force disabling"
msgstr "Мәжбүрлі сөндіру үшін кеңейтулер UUID-лары"
msgstr ""
#: 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 ""
"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 "
@@ -92,11 +98,6 @@ msgid ""
"methods on org.gnome.Shell. This key takes precedence over the “enabled-"
"extensions” setting."
msgstr ""
"GNOME Shell кеңейтулерінде UUID қасиеті бар; бұл кілт сөндіру үшін "
"кеңейтулер тізімін сақтайды, олар қазіргі режимде іске қосылған болса да. "
"Сонымен қатар, бұл тізімді org.gnome.Shell EnableExtension және "
"DisableExtension D-Bus тәсілдері арқылы түзетуге болады. Бұл кілт \"enabled-"
"extensions\" баптауын үстінен басады."
#: data/org.gnome.shell.gschema.xml.in:37
msgid "Disable user extensions"
@@ -332,19 +333,19 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:234
msgid "Locations"
msgstr "Орналасулар"
msgstr "Орналасу"
#: data/org.gnome.shell.gschema.xml.in:235
msgid "The locations to show in world clocks"
msgstr "Дүниежүзілік сағаттарда көрсетілетін орналасулар"
msgstr ""
#: data/org.gnome.shell.gschema.xml.in:245
msgid "Automatic location"
msgstr "Автоматты орналасу"
msgstr ""
#: data/org.gnome.shell.gschema.xml.in:246
msgid "Whether to fetch the current location or not"
msgstr "Ағымдағы орналасуды алу керек пе, жоқ па"
msgstr ""
#: data/org.gnome.shell.gschema.xml.in:253
msgid "Location"
@@ -352,7 +353,7 @@ msgstr "Орналасу"
#: data/org.gnome.shell.gschema.xml.in:254
msgid "The location for which to show a forecast"
msgstr "Ауа райы болжамын көрсету үшін орналасу"
msgstr ""
#: data/org.gnome.shell.gschema.xml.in:266
msgid "Attach modal dialog to the parent window"
@@ -531,20 +532,23 @@ msgstr "пайдаланушыны ауыстыру"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:135
#| msgid "lock orientation;screen;rotation"
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr ""
"lock orientation;unlock orientation;screen;rotation;бұрылуды құлыптау;экран "
"бұрылуы"
#: js/misc/systemActions.js:255
#| msgctxt "search-result"
#| msgid "Lock Orientation"
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Экранды бұруды құлыптан босату"
msgstr ""
#: js/misc/systemActions.js:256
#| msgctxt "search-result"
#| msgid "Lock Orientation"
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Экранды бұруды құлыптау"
msgstr ""
#: js/misc/util.js:120
msgid "Command not found"
@@ -701,36 +705,38 @@ msgstr "Тыйым салу"
msgid "Grant Access"
msgstr "Рұқсат ету"
#: js/ui/appDisplay.js:903
#: js/ui/appDisplay.js:956
msgid "Unnamed Folder"
msgstr "Атаусыз бума"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2225 js/ui/panel.js:75
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Ашық терезелер"
#: js/ui/appDisplay.js:2244 js/ui/panel.js:82
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
msgid "New Window"
msgstr "Жаңа терезе"
#: js/ui/appDisplay.js:2260
#: js/ui/appDisplay.js:2250
#| msgid "Launch using Dedicated Graphics Card"
msgid "Launch using Integrated Graphics Card"
msgstr "Құрамындағы графикалық картаны пайдаланып жөнелту"
msgstr ""
#: js/ui/appDisplay.js:2261
#: js/ui/appDisplay.js:2251
#| msgid "Launch using Dedicated Graphics Card"
msgid "Launch using Discrete Graphics Card"
msgstr "Бөлек графикалық картаны пайдаланып жөнелту"
msgstr ""
#: js/ui/appDisplay.js:2289 js/ui/dash.js:239
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Таңдамалылардан өшіру"
#: js/ui/appDisplay.js:2295
#: js/ui/appDisplay.js:2285
msgid "Add to Favorites"
msgstr "Таңдамалыларға қосу"
#: js/ui/appDisplay.js:2305 js/ui/panel.js:93
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
msgid "Show Details"
msgstr "Деректерді көрсету"
@@ -760,7 +766,7 @@ msgstr "Құлаққап"
msgid "Headset"
msgstr "Микрофонды құлаққап"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
msgid "Microphone"
msgstr "Микрофон"
@@ -912,8 +918,9 @@ msgid "External drive disconnected"
msgstr "Сыртқы диск алынды"
#: js/ui/components/automountManager.js:208
#| msgid "Unable to lock"
msgid "Unable to unlock volume"
msgstr "Томды босату мүмкін емес"
msgstr ""
#: js/ui/components/automountManager.js:209
msgid "The installed udisks version does not support the PIM setting"
@@ -986,6 +993,7 @@ msgid "PIN code is needed for the mobile broadband device"
msgstr "Сымсыз кеңжолақты құрылғы үшін PIN коды керек"
#: js/ui/components/networkAgent.js:334
#| msgid "PIN: "
msgid "PIN"
msgstr "PIN"
@@ -1121,8 +1129,9 @@ msgid "Weather"
msgstr "Ауа райы"
#: js/ui/dateMenu.js:653
#| msgid "Select a location…"
msgid "Select weather location…"
msgstr "Ауа райы орнын таңдау…"
msgstr ""
#: js/ui/endSessionDialog.js:37
#, javascript-format
@@ -1242,10 +1251,9 @@ msgstr ""
"эл. желісіне жалғанып тұрғанына көз жеткізіңіз."
#: 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."
msgstr ""
"Батарея қорегінен жұмыс істеуде. Жаңартуларды орнату алдында эл. қорегі "
"желісіне жалғаңыз."
#: js/ui/endSessionDialog.js:268
msgid "Some applications are busy or have unsaved work"
@@ -1281,26 +1289,30 @@ msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org адресінен \"%s\" жүктеп алып, орнату керек пе?"
#: js/ui/extensionSystem.js:252
#| msgid "No Extensions Installed"
msgid "Extension Updates Available"
msgstr "Кеңейту жаңартулары дайын"
msgstr ""
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Кеңейту жаңартулары орнатылуға дайын."
msgstr ""
#: js/ui/inhibitShortcutsDialog.js:79
#| msgid "%s wants to inhibit shortcuts"
msgid "Allow inhibiting shortcuts"
msgstr "Пернелер жарлығын алмастыруды рұқсат ету"
msgstr ""
#. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:82
#, javascript-format
#| msgid "Application wants to inhibit shortcuts"
msgid "The application %s wants to inhibit shortcuts"
msgstr "%s қолданбасы пернелер жарлығын алмастырғысы келеді"
msgstr ""
#: js/ui/inhibitShortcutsDialog.js:83
#| msgid "Application wants to inhibit shortcuts"
msgid "An application wants to inhibit shortcuts"
msgstr "Қолданба пернелер жарлығын алмастырғысы келеді"
msgstr ""
#. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:90
@@ -1433,25 +1445,23 @@ msgid "Web Page"
msgstr "Веб парағы"
#: js/ui/main.js:297
#| msgid "Log in as another user"
msgid "Logged in as a privileged user"
msgstr "Привилегияланған пайдаланушы ретінде жүйеге кірген"
msgstr ""
#: js/ui/main.js:298
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
msgstr ""
"Привилегияланған пайдаланушы ретінде сессияны орындаудан қауіпсіздік "
"салдарынан аулақ болу керек. Мүмкін болса, қалыпты пайдаланушы ретінде "
"жүйеге кіріңіз."
#: js/ui/main.js:337
msgid "Screen Lock disabled"
msgstr "Экранды блоктау сөндірілген"
msgstr ""
#: js/ui/main.js:338
msgid "Screen Locking requires the GNOME display manager."
msgstr "Экранды блоктау GNOME дисплейлер басқарушысын талап етеді."
msgstr ""
#: js/ui/messageTray.js:1547
msgid "System Information"
@@ -1465,13 +1475,13 @@ msgstr "Белгісіз әртіс"
msgid "Unknown title"
msgstr "Белгісіз атауы"
#: js/ui/overview.js:74
#: js/ui/overview.js:73
msgid "Undo"
msgstr "Болдырмау"
#. Translators: This is the main view to select
#. activities. See also note for "Activities" string.
#: js/ui/overview.js:87
#: js/ui/overview.js:86
msgid "Overview"
msgstr "Шолу"
@@ -1479,7 +1489,7 @@ msgstr "Шолу"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: js/ui/overview.js:108
#: js/ui/overview.js:107
msgid "Type to search"
msgstr "Іздеу үшін теріңіз"
@@ -1616,16 +1626,18 @@ msgid "Caps lock is on."
msgstr "Caps lock іске қосылған."
#: js/ui/shellMountOperation.js:285
#| msgid "Volume"
msgid "Hidden Volume"
msgstr "Жасырын том"
msgstr ""
#: js/ui/shellMountOperation.js:288
msgid "Windows System Volume"
msgstr "Windows жүйелік томы"
msgstr ""
#: js/ui/shellMountOperation.js:291
#| msgid "Mouse Keys"
msgid "Uses Keyfiles"
msgstr "Кілт файлдарды қолданады"
msgstr ""
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:298
@@ -1633,7 +1645,6 @@ msgstr "Кілт файлдарды қолданады"
msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
msgstr ""
"Кілт файлдарын қолданатын томды босату үшін, <i>%s</i> утилитасын қолданыңыз."
#: js/ui/shellMountOperation.js:306
msgid "PIM Number"
@@ -1655,7 +1666,7 @@ msgstr "%s ашу"
#: js/ui/shellMountOperation.js:423
msgid "The PIM must be a number or empty."
msgstr "PIM тек сандардан тұруы, немесе бос болуы тиіс."
msgstr ""
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:465
@@ -1667,7 +1678,7 @@ msgstr "%s іске қосу мүмкін емес"
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "%s қолданбасы табылмады"
msgstr ""
#: js/ui/status/accessibility.js:35
msgid "Accessibility"
@@ -1722,12 +1733,14 @@ msgid "Bluetooth Settings"
msgstr "Bluetooth баптаулары"
#: js/ui/status/bluetooth.js:152
#| msgid "Bluetooth"
msgid "Bluetooth Off"
msgstr "Bluetooth сөндірілген"
msgstr ""
#: js/ui/status/bluetooth.js:154
#| msgid "Bluetooth"
msgid "Bluetooth On"
msgstr "Bluetooth іске қосылған"
msgstr ""
#: js/ui/status/brightness.js:39
msgid "Brightness"
@@ -1735,7 +1748,7 @@ msgstr "Жарықтылығы"
#: js/ui/status/dwellClick.js:13
msgid "Single Click"
msgstr "Дара шерту"
msgstr ""
#: js/ui/status/dwellClick.js:18
msgid "Double Click"
@@ -1747,11 +1760,11 @@ msgstr "Тартып апару"
#: js/ui/status/dwellClick.js:28
msgid "Secondary Click"
msgstr "Екінші шерту"
msgstr ""
#: js/ui/status/dwellClick.js:37
msgid "Dwell Click"
msgstr "Пернеде кідіртуден кейінгі сол жақпен шерту"
msgstr ""
#: js/ui/status/keyboard.js:826
msgid "Keyboard"
@@ -1787,7 +1800,7 @@ msgstr "Іске қосу"
#: js/ui/status/location.js:350
msgid "Allow location access"
msgstr "Орналасуға қатынауды рұқсат ету"
msgstr ""
#. Translators: %s is an application name
#: js/ui/status/location.js:352
@@ -2127,11 +2140,11 @@ msgstr "Thunderbolt авторизация қатесі"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Thunderbolt құралғысын авторизациялау мүмкін емес: %s"
#: js/ui/status/volume.js:155
#: js/ui/status/volume.js:154
msgid "Volume changed"
msgstr "Дыбыс өзгертілді"
#: js/ui/status/volume.js:217
#: js/ui/status/volume.js:225
msgid "Volume"
msgstr "Дыбыс деңгейі"
@@ -2166,16 +2179,18 @@ msgstr "Тек құрамындағы"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:371
#| msgctxt "calendar heading"
#| msgid "%A, %B %-d"
msgid "%A %B %-d"
msgstr "%A %B %-d"
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Босату үшін жоғары өткізіңіз"
msgstr ""
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Босату үшін шертіңіз немесе пернені басыңыз"
msgstr ""
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
@@ -2358,8 +2373,6 @@ msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME кеңейтулері көмегімен кеңейтулерді жаңарту, баптау және оларды өшіру "
"немесе сөндіруге болады."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
@@ -2375,7 +2388,6 @@ msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Кеңейтуді өшірсеңіз, оны қайта іске қосу үшін қайта жүктеп алу керек болады"
#: subprojects/extensions-app/js/main.js:150
msgid "Remove"
@@ -2389,15 +2401,15 @@ msgstr "Baurzhan Muftakhidinov <baurthefirst@gmail.com>"
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d кеңейту жүйеге келесі рет кірген кезде жаңартылатын болады."
msgstr[0] ""
#: subprojects/extensions-app/js/main.js:461
msgid "The extension is incompatible with the current GNOME version"
msgstr "Бұл кеңейту ағымдағы GNOME нұсқасымен үйлеспейді"
msgstr ""
#: subprojects/extensions-app/js/main.js:464
msgid "The extension had an error"
msgstr "Кеңейтуде қате болды"
msgstr ""
#: subprojects/extensions-app/data/ui/extension-row.ui:109
#: subprojects/extensions-tool/src/command-create.c:325
@@ -2416,7 +2428,7 @@ msgstr "Авторы"
#: subprojects/extensions-app/data/ui/extension-row.ui:216
msgid "Website"
msgstr "Веб сайт"
msgstr "Веб-сайт"
#: subprojects/extensions-app/data/ui/extension-row.ui:233
msgid "Remove…"
@@ -2448,9 +2460,6 @@ msgid ""
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Кеңейтулер жүйелік мәселелерді, соның ішінде өнімділік мәселелерін туғызуы "
"мүмкін. Жүйелік мәселелерге тап болсаңыз, барлық кеңейтулерді сөндіру "
"ұсынылады."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
@@ -2469,12 +2478,10 @@ msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Кешірім өтінеміз, барлық орнатылған кеңейтулер тізімін алу мүмкін болмады. "
"GNOME ішіне кіргеніңізді тексеріп, қайталап көріңіз."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Кеңейту жаңартулары дайын"
msgstr ""
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
@@ -2484,7 +2491,7 @@ msgstr "Жүйеден шығу…"
#: subprojects/extensions-tool/src/command-create.c:226
#, c-format
msgid "The new extension was successfully created in %s.\n"
msgstr "Жаңа кеңейту %s ішінде сәтті жасалды.\n"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:299
#, c-format
@@ -2492,13 +2499,11 @@ msgid ""
"Name should be a very short (ideally descriptive) string.\n"
"Examples are: %s"
msgstr ""
"Атауы қысқа мәтіндік жол (сипаттайтын) болуы тиіс.\n"
"Мысалы: %s"
#: subprojects/extensions-tool/src/command-create.c:305
#: subprojects/extensions-tool/src/main.c:238
msgid "Name"
msgstr "Аты"
msgstr "Атауы"
#: subprojects/extensions-tool/src/command-create.c:319
#, c-format
@@ -2506,9 +2511,6 @@ msgid ""
"Description is a single-sentence explanation of what your extension does.\n"
"Examples are: %s"
msgstr ""
"Сипаттамасы - бұл сіздің кеңейтуіңіз жасайтын әрекеттің бір сөйлемді "
"анықтамасы.\n"
"Мысалы: %s"
#: subprojects/extensions-tool/src/command-create.c:339
msgid ""
@@ -2516,12 +2518,10 @@ msgid ""
"This should be in the format of an email address (clicktofocus@janedoe."
"example.com)\n"
msgstr ""
"UUID - бұл кеңейтуңіздің глобалды деңгейдегі бірегей идентификаторы.\n"
"Ол эл. пошта адресі пішімінде болуы тиіс (clicktofocus@janedoe.example.com)\n"
#: subprojects/extensions-tool/src/command-create.c:366
msgid "Choose one of the available templates:\n"
msgstr "Қол жетімді үлгілердің бірін таңдаңыз:\n"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:380
msgid "Template"
@@ -2529,7 +2529,7 @@ msgstr "Үлгі"
#: subprojects/extensions-tool/src/command-create.c:435
msgid "The unique identifier of the new extension"
msgstr "Жаңа кеңейтудің бірегей идентификаторы"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:438
msgid "NAME"
@@ -2537,7 +2537,7 @@ msgstr "АТАУЫ"
#: subprojects/extensions-tool/src/command-create.c:439
msgid "The user-visible name of the new extension"
msgstr "Жаңа кеңейтудің пайдаланушыға көрінетін атауы"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:441
msgid "DESCRIPTION"
@@ -2545,7 +2545,7 @@ msgstr "СИПАТТАМАСЫ"
#: subprojects/extensions-tool/src/command-create.c:443
msgid "A short description of what the extension does"
msgstr "Кеңейтудің қысқаша сипаттамасы"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:446
msgid "TEMPLATE"
@@ -2553,11 +2553,11 @@ msgstr "ҮЛГІ"
#: subprojects/extensions-tool/src/command-create.c:447
msgid "The template to use for the new extension"
msgstr "Жаңа кеңейту үшін қолданылатын үлгі"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:453
msgid "Enter extension information interactively"
msgstr "Кеңейту ақпаратын интерактивті түрде енгізу"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:461
msgid "Create a new extension"
@@ -2570,20 +2570,20 @@ msgstr "Белгісіз аргументтер"
#: subprojects/extensions-tool/src/command-create.c:504
msgid "UUID, name and description are required"
msgstr "UUID, аты және сипаттамасы керек"
msgstr ""
#: subprojects/extensions-tool/src/command-disable.c:46
#: subprojects/extensions-tool/src/command-enable.c:46
#: subprojects/extensions-tool/src/command-info.c:50
#: subprojects/extensions-tool/src/command-list.c:64
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-enable.c:53
#, c-format
msgid "Extension “%s” does not exist\n"
msgstr "\"%s\" кеңейтуі жоқ\n"
msgstr ""
#: subprojects/extensions-tool/src/command-disable.c:101
msgid "Disable an extension"
@@ -2605,7 +2605,7 @@ msgstr "UUID көрсетілмеген"
#: subprojects/extensions-tool/src/command-reset.c:81
#: subprojects/extensions-tool/src/command-uninstall.c:109
msgid "More than one UUID given"
msgstr "Бірден көп UUID көрсетілген"
msgstr ""
#: subprojects/extensions-tool/src/command-enable.c:101
msgid "Enable an extension"
@@ -2615,7 +2615,7 @@ msgstr "Кеңейтуді іске қосу"
#: subprojects/extensions-tool/src/main.c:155
#, c-format
msgid "Extension “%s” doesn't exist\n"
msgstr "\"%s\" кеңейтуі жоқ\n"
msgstr ""
#: subprojects/extensions-tool/src/command-info.c:85
msgid "Show extensions info"
@@ -2623,51 +2623,60 @@ msgstr "Кеңейтулер ақпаратын көрсету"
#: subprojects/extensions-tool/src/command-install.c:173
msgid "Overwrite an existing extension"
msgstr "Бар болып тұрған кеңейтуді үстінен жазу"
msgstr ""
#: subprojects/extensions-tool/src/command-install.c:175
msgid "EXTENSION_BUNDLE"
msgstr "КЕҢЕЙТУЕСТЕСІ"
msgstr ""
#: subprojects/extensions-tool/src/command-install.c:184
#| msgid "UUIDs of extensions to enable"
msgid "Install an extension bundle"
msgstr "Кеңейту дестесін орнату"
msgstr ""
#: subprojects/extensions-tool/src/command-install.c:202
#| msgid "No extensions installed"
msgid "No extension bundle specified"
msgstr "Кеңейту дестесі көрсетілмеген"
msgstr ""
#: subprojects/extensions-tool/src/command-install.c:208
msgid "More than one extension bundle specified"
msgstr "Бірден көп кеңейту дестесі көрсетілген"
msgstr ""
#: subprojects/extensions-tool/src/command-list.c:128
#| msgid "Shell Extensions"
msgid "Show user-installed extensions"
msgstr "Пайдаланушы орнатқан кеңейтулерді көрсету"
msgstr ""
#: subprojects/extensions-tool/src/command-list.c:131
#| msgid "Shell Extensions"
msgid "Show system-installed extensions"
msgstr "Жүйелік деңгейде орнатылған кеңейтулерді көрсету"
msgstr ""
#: subprojects/extensions-tool/src/command-list.c:134
#| msgid "Shell Extensions"
msgid "Show enabled extensions"
msgstr "Іске қосылған кеңейтулерді көрсету"
msgstr ""
#: subprojects/extensions-tool/src/command-list.c:137
#| msgid "Disable user extensions"
msgid "Show disabled extensions"
msgstr "Сөндірілген кеңейтулерді көрсету"
msgstr ""
#: subprojects/extensions-tool/src/command-list.c:140
#| msgid "GNOME Shell Extension Preferences"
msgid "Show extensions with preferences"
msgstr "Баптаулары бар кеңейтулерді көрсету"
msgstr ""
#: subprojects/extensions-tool/src/command-list.c:143
#| msgid "No extensions installed"
msgid "Show extensions with updates"
msgstr "Жаңартулары бар кеңейтулерді көрсету"
msgstr ""
#: subprojects/extensions-tool/src/command-list.c:146
#| msgid "Visit extension homepage"
msgid "Print extension details"
msgstr "Кеңейту ақпаратын басып шығару"
msgstr ""
#: subprojects/extensions-tool/src/command-list.c:154
msgid "List installed extensions"
@@ -2679,7 +2688,7 @@ msgstr "ФАЙЛ"
#: subprojects/extensions-tool/src/command-pack.c:451
msgid "Additional source to include in the bundle"
msgstr "Дестеге қосылатын қосымша қайнар көз"
msgstr ""
#: subprojects/extensions-tool/src/command-pack.c:454
msgid "SCHEMA"
@@ -2687,7 +2696,7 @@ msgstr "СҰЛБА"
#: subprojects/extensions-tool/src/command-pack.c:455
msgid "A GSettings schema that should be included"
msgstr "Құрамына енуі тиіс GSettings сұлбасы"
msgstr ""
#: subprojects/extensions-tool/src/command-pack.c:457
#: subprojects/extensions-tool/src/command-pack.c:468
@@ -2696,7 +2705,7 @@ msgstr "БУМА"
#: subprojects/extensions-tool/src/command-pack.c:459
msgid "The directory where translations are found"
msgstr "Аудармалар орналасқан бума"
msgstr ""
#: subprojects/extensions-tool/src/command-pack.c:461
msgid "DOMAIN"
@@ -2704,37 +2713,37 @@ msgstr "ДОМЕН"
#: subprojects/extensions-tool/src/command-pack.c:463
msgid "The gettext domain to use for translations"
msgstr "Аудармалар үшін қолданылуы тиіс gettext домені"
msgstr ""
#: subprojects/extensions-tool/src/command-pack.c:466
msgid "Overwrite an existing pack"
msgstr "Бар болып тұрған пакетті үстінен жазу"
msgstr ""
#: subprojects/extensions-tool/src/command-pack.c:470
msgid "The directory where the pack should be created"
msgstr "Десте жасалуы тиіс бума"
msgstr ""
#: subprojects/extensions-tool/src/command-pack.c:472
msgid "SOURCE_DIRECTORY"
msgstr "ҚАЙНАР_КӨЗУМАСЫ"
msgstr ""
#: subprojects/extensions-tool/src/command-pack.c:481
msgid "Create an extension bundle"
msgstr "Кеңейту дестесін жасау"
msgstr ""
#: subprojects/extensions-tool/src/command-pack.c:501
msgid "More than one source directory specified"
msgstr "Бірден көп қайнар көз бумасы көрсетілген"
msgstr ""
#: subprojects/extensions-tool/src/command-prefs.c:47
#, c-format
#| msgid "Show extensions with preferences"
msgid "Extension “%s” doesn't have preferences\n"
msgstr "\"%s\" кеңейтудің баптаулары жоқ\n"
msgstr ""
#: subprojects/extensions-tool/src/command-prefs.c:79
#| msgid "GNOME Shell Extension Preferences"
msgid "Opens extension preferences"
msgstr "Кеңейту баптауларын ашады"
msgstr ""
#: subprojects/extensions-tool/src/command-reset.c:58
msgid "Reset an extension"
@@ -2755,11 +2764,11 @@ msgstr "Кеңейтуді өшіру"
#: subprojects/extensions-tool/src/main.c:72
msgid "Do not print error messages"
msgstr "Қате туралы хабарламаларды басып шығармау"
msgstr ""
#: subprojects/extensions-tool/src/main.c:146
msgid "Failed to connect to GNOME Shell"
msgstr "GNOME Shell-ға байланысты орнату сәтсіз аяқталды"
msgstr "GNOME Shell-ға байланысты орнату мүмкін емес"
#: subprojects/extensions-tool/src/main.c:244
msgid "Path"
@@ -2779,7 +2788,7 @@ msgstr "Қалып-күйі"
#: subprojects/extensions-tool/src/main.c:290
msgid "“version” takes no arguments"
msgstr "“version” аргументтерді қабылдамайды"
msgstr ""
#: subprojects/extensions-tool/src/main.c:292
#: subprojects/extensions-tool/src/main.c:312
@@ -2851,11 +2860,11 @@ msgstr "Кеңейту дестесін орнату"
#: subprojects/extensions-tool/src/main.c:330
#, c-format
msgid "Use “%s” to get detailed help.\n"
msgstr "Толық көмекті алу үшін \"%s\" пайдаланыңыз.\n"
msgstr ""
#: subprojects/extensions-tool/src/templates/00-plain.desktop.in:4
msgid "Plain"
msgstr "Қалыпты"
msgstr "Кәдімгі"
#: subprojects/extensions-tool/src/templates/00-plain.desktop.in:5
msgid "An empty extension"
@@ -2867,7 +2876,7 @@ msgstr "Индикатор"
#: subprojects/extensions-tool/src/templates/indicator.desktop.in:5
msgid "Add an icon to the top bar"
msgstr "Жоғарғы панельге таңбашаны қосу"
msgstr ""
#. translators:
#. * The number of sound outputs on a particular device
@@ -2889,33 +2898,6 @@ msgstr[0] "%u кірісі"
msgid "System Sounds"
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 ""
#~ "Keybinding that pauses and resumes all running tweens, for debugging "
#~ "purposes"
@@ -2945,6 +2927,21 @@ msgstr "Жүйелік дыбыстар"
#~ msgid "Sign In"
#~ 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:"
#~ msgstr "Пароль:"
@@ -2974,6 +2971,16 @@ msgstr "Жүйелік дыбыстар"
#~ msgid_plural "%d new notifications"
#~ msgstr[0] "%d жаңа ескерту"
#~ msgid "%d Connected"
#~ msgid_plural "%d Connected"
#~ msgstr[0] "%d байланысқан"
#~ msgid "Off"
#~ msgstr "Сөнд."
#~ msgid "On"
#~ msgstr "Іске қос."
#~ msgid "Account Settings"
#~ msgstr "Тіркелгі баптаулары"

882
po/lt.po

File diff suppressed because it is too large Load Diff

949
po/lv.po

File diff suppressed because it is too large Load Diff

View File

@@ -78,7 +78,6 @@ struct _ShellApp
* want (e.g. it will be of TYPE_NORMAL from
* the way shell-window-tracker.c works).
*/
GIcon *fallback_icon;
ShellAppRunningState *running_state;
@@ -181,47 +180,66 @@ window_backed_app_get_window (ShellApp *app)
return NULL;
}
/**
* shell_app_get_icon:
*
* Look up the icon for this application
*
* Return value: (transfer none): A #GIcon
*/
GIcon *
shell_app_get_icon (ShellApp *app)
static ClutterActor *
window_backed_app_get_icon (ShellApp *app,
int size)
{
MetaWindow *window = NULL;
StWidget *widget;
int scale, scaled_size;
ShellGlobal *global;
StThemeContext *context;
g_return_val_if_fail (SHELL_IS_APP (app), NULL);
global = shell_global_get ();
context = st_theme_context_get_for_stage (shell_global_get_stage (global));
g_object_get (context, "scale-factor", &scale, NULL);
if (app->info)
return g_app_info_get_icon (G_APP_INFO (app->info));
if (app->fallback_icon)
return app->fallback_icon;
scaled_size = size * scale;
/* During a state transition from running to not-running for
* window-backend apps, it's possible we get a request for the icon.
* Avoid asserting here and just return a fallback icon
* Avoid asserting here and just return an empty image.
*/
if (app->running_state != NULL)
window = window_backed_app_get_window (app);
if (window &&
meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
if (window == NULL)
{
app->fallback_icon =
ClutterActor *actor;
actor = clutter_actor_new ();
g_object_set (actor,
"opacity", 0,
"width", (float) scaled_size,
"height", (float) scaled_size,
NULL);
return actor;
}
if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
{
StWidget *texture_actor;
texture_actor =
st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
G_OBJECT (window),
"icon");
"icon",
scaled_size);
widget = g_object_new (ST_TYPE_BIN,
"child", texture_actor,
NULL);
}
else
{
app->fallback_icon = g_themed_icon_new ("application-x-executable");
widget = g_object_new (ST_TYPE_ICON,
"icon-size", size,
"icon-name", "application-x-executable",
NULL);
}
st_widget_add_style_class_name (widget, "fallback-app-icon");
return app->fallback_icon;
return CLUTTER_ACTOR (widget);
}
/**
@@ -239,16 +257,16 @@ shell_app_create_icon_texture (ShellApp *app,
GIcon *icon;
ClutterActor *ret;
if (app->info == NULL)
return window_backed_app_get_icon (app, size);
ret = st_icon_new ();
st_icon_set_icon_size (ST_ICON (ret), size);
st_icon_set_fallback_icon_name (ST_ICON (ret), "application-x-executable");
icon = shell_app_get_icon (app);
icon = g_app_info_get_icon (G_APP_INFO (app->info));
st_icon_set_gicon (ST_ICON (ret), icon);
if (shell_app_is_window_backed (app))
st_widget_add_style_class_name (ST_WIDGET (ret), "fallback-app-icon");
return ret;
}
@@ -1558,7 +1576,6 @@ shell_app_dispose (GObject *object)
ShellApp *app = SHELL_APP (object);
g_clear_object (&app->info);
g_clear_object (&app->fallback_icon);
while (app->running_state)
_shell_app_remove_window (app, app->running_state->windows->data);

View File

@@ -29,7 +29,6 @@ const char *shell_app_get_id (ShellApp *app);
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
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_description (ShellApp *app);
gboolean shell_app_is_window_backed (ShellApp *app);

View File

@@ -899,9 +899,8 @@ load_gl_symbol (const char *name,
}
static void
global_stage_after_paint (ClutterStage *stage,
ClutterStageView *stage_view,
ShellGlobal *global)
global_stage_after_paint (ClutterStage *stage,
ShellGlobal *global)
{
/* At this point, we've finished all layout and painting, but haven't
* actually flushed or swapped */

View File

@@ -508,7 +508,9 @@ recorder_update_size (ShellRecorder *recorder)
}
static void
recorder_on_stage_notify_size (ShellRecorder *recorder)
recorder_on_stage_notify_size (GObject *object,
GParamSpec *pspec,
ShellRecorder *recorder)
{
recorder_update_size (recorder);
@@ -612,15 +614,12 @@ recorder_connect_stage_callbacks (ShellRecorder *recorder)
G_CALLBACK (recorder_on_stage_destroy), recorder);
g_signal_connect_after (recorder->stage, "paint",
G_CALLBACK (recorder_on_stage_paint), recorder);
g_signal_connect_swapped (recorder->stage, "notify::width",
G_CALLBACK (recorder_on_stage_notify_size),
recorder);
g_signal_connect_swapped (recorder->stage, "notify::height",
G_CALLBACK (recorder_on_stage_notify_size),
recorder);
g_signal_connect_swapped (recorder->stage, "resource-scale-changed",
G_CALLBACK (recorder_on_stage_notify_size),
recorder);
g_signal_connect (recorder->stage, "notify::width",
G_CALLBACK (recorder_on_stage_notify_size), recorder);
g_signal_connect (recorder->stage, "notify::height",
G_CALLBACK (recorder_on_stage_notify_size), recorder);
g_signal_connect (recorder->stage, "notify::resource-scale",
G_CALLBACK (recorder_on_stage_notify_size), recorder);
}
static void

View File

@@ -393,7 +393,8 @@ grab_window_screenshot (ClutterActor *stage,
if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_WAYLAND)
{
float resource_scale;
resource_scale = clutter_actor_get_resource_scale (window_actor);
if (!clutter_actor_get_resource_scale (window_actor, &resource_scale))
resource_scale = 1.0f;
cairo_surface_set_device_scale (priv->image, resource_scale, resource_scale);
}

View File

@@ -119,16 +119,6 @@ shell_window_tracker_class_init (ShellWindowTrackerClass *klass)
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:
*
@@ -145,10 +135,8 @@ get_app_from_window_wmclass (MetaWindow *window)
ShellAppSystem *appsys;
const char *wm_class;
const char *wm_instance;
const char *sandbox_id;
appsys = shell_app_system_get_default ();
sandbox_id = meta_window_get_sandboxed_app_id (window);
/* Notes on the heuristics used here:
much of the complexity here comes from the desire to support
@@ -188,23 +176,23 @@ get_app_from_window_wmclass (MetaWindow *window)
/* first try a match from WM_CLASS (instance part) to StartupWMClass */
wm_instance = meta_window_get_wm_class_instance (window);
app = shell_app_system_lookup_startup_wmclass (appsys, wm_instance);
if (app != NULL && check_app_id_prefix (app, sandbox_id))
if (app != NULL)
return g_object_ref (app);
/* then try a match from WM_CLASS to StartupWMClass */
wm_class = meta_window_get_wm_class (window);
app = shell_app_system_lookup_startup_wmclass (appsys, wm_class);
if (app != NULL && check_app_id_prefix (app, sandbox_id))
if (app != NULL)
return g_object_ref (app);
/* then try a match from WM_CLASS (instance part) to .desktop */
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_instance);
if (app != NULL && check_app_id_prefix (app, sandbox_id))
if (app != NULL)
return g_object_ref (app);
/* finally, try a match from WM_CLASS to .desktop */
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_class);
if (app != NULL && check_app_id_prefix (app, sandbox_id))
if (app != NULL)
return g_object_ref (app);
return NULL;
@@ -226,7 +214,7 @@ get_app_from_id (MetaWindow *window,
{
ShellApp *app;
ShellAppSystem *appsys;
g_autofree char *desktop_file = NULL;
char *desktop_file;
g_return_val_if_fail (id != NULL, NULL);
@@ -235,9 +223,10 @@ get_app_from_id (MetaWindow *window,
desktop_file = g_strconcat (id, ".desktop", NULL);
app = shell_app_system_lookup_app (appsys, desktop_file);
if (app)
return g_object_ref (app);
g_object_ref (app);
return NULL;
g_free (desktop_file);
return app;
}
/*
@@ -402,13 +391,6 @@ get_app_for_window (ShellWindowTracker *tracker,
if (meta_window_is_remote (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
* is the case, a corresponding .desktop file is guaranteed to match;
*/
@@ -423,6 +405,13 @@ get_app_for_window (ShellWindowTracker *tracker,
if (result != NULL)
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);
if (result != NULL)
return result;

View File

@@ -41,8 +41,6 @@ typedef struct _StAdjustmentPrivate StAdjustmentPrivate;
struct _StAdjustmentPrivate
{
ClutterActor *actor;
/* Do not sanity-check values while constructing,
* not all properties may be set yet. */
guint is_constructing : 1;
@@ -68,7 +66,6 @@ enum
{
PROP_0,
PROP_ACTOR,
PROP_LOWER,
PROP_UPPER,
PROP_VALUE,
@@ -109,21 +106,9 @@ static gboolean st_adjustment_set_page_increment (StAdjustment *adjustment,
static gboolean st_adjustment_set_page_size (StAdjustment *adjustment,
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
animatable_iface_init (ClutterAnimatableInterface *iface)
{
iface->get_actor = st_adjustment_get_actor;
}
static void
@@ -156,10 +141,6 @@ st_adjustment_get_property (GObject *gobject,
switch (prop_id)
{
case PROP_ACTOR:
g_value_set_object (value, priv->actor);
break;
case PROP_LOWER:
g_value_set_double (value, priv->lower);
break;
@@ -190,18 +171,6 @@ st_adjustment_get_property (GObject *gobject,
}
}
static void
actor_destroyed (gpointer user_data,
GObject *where_the_object_was)
{
StAdjustment *adj = ST_ADJUSTMENT (user_data);
StAdjustmentPrivate *priv = st_adjustment_get_instance_private (adj);
priv->actor = NULL;
g_object_notify_by_pspec (G_OBJECT (adj), props[PROP_ACTOR]);
}
static void
st_adjustment_set_property (GObject *gobject,
guint prop_id,
@@ -209,20 +178,9 @@ st_adjustment_set_property (GObject *gobject,
GParamSpec *pspec)
{
StAdjustment *adj = ST_ADJUSTMENT (gobject);
StAdjustmentPrivate *priv;
priv = st_adjustment_get_instance_private (ST_ADJUSTMENT (gobject));
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:
st_adjustment_set_lower (adj, g_value_get_double (value));
break;
@@ -259,11 +217,6 @@ st_adjustment_dispose (GObject *object)
StAdjustmentPrivate *priv;
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_OBJECT_CLASS (st_adjustment_parent_class)->dispose (object);
@@ -279,11 +232,6 @@ st_adjustment_class_init (StAdjustmentClass *klass)
object_class->set_property = st_adjustment_set_property;
object_class->dispose = st_adjustment_dispose;
props[PROP_ACTOR] =
g_param_spec_object ("actor", "Actor", "Actor",
CLUTTER_TYPE_ACTOR,
ST_PARAM_READWRITE);
props[PROP_LOWER] =
g_param_spec_double ("lower", "Lower", "Lower bound",
-G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
@@ -351,8 +299,7 @@ st_adjustment_init (StAdjustment *self)
}
StAdjustment *
st_adjustment_new (ClutterActor *actor,
gdouble value,
st_adjustment_new (gdouble value,
gdouble lower,
gdouble upper,
gdouble step_increment,
@@ -360,7 +307,6 @@ st_adjustment_new (ClutterActor *actor,
gdouble page_size)
{
return g_object_new (ST_TYPE_ADJUSTMENT,
"actor", actor,
"value", value,
"lower", lower,
"upper", upper,

View File

@@ -48,8 +48,7 @@ struct _StAdjustmentClass
void (* changed) (StAdjustment *adjustment);
};
StAdjustment *st_adjustment_new (ClutterActor *actor,
gdouble value,
StAdjustment *st_adjustment_new (gdouble value,
gdouble lower,
gdouble upper,
gdouble step_increment,

View File

@@ -85,7 +85,12 @@ st_drawing_area_allocate (ClutterActor *self,
int width, height;
float resource_scale;
resource_scale = clutter_actor_get_resource_scale (self);
if (!st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
{
ClutterActorBox empty = CLUTTER_ACTOR_BOX_INIT_ZERO;
clutter_actor_set_allocation (self, &empty);
return;
}
clutter_actor_set_allocation (self, box);
st_theme_node_get_content_box (theme_node, box, &content_box);
@@ -106,16 +111,13 @@ st_drawing_area_style_changed (StWidget *self)
}
static void
st_drawing_area_resource_scale_changed (ClutterActor *self)
st_drawing_area_resource_scale_changed (StWidget *self)
{
float resource_scale;
ClutterContent *content = clutter_actor_get_content (self);
ClutterContent *content = clutter_actor_get_content (CLUTTER_ACTOR (self));
resource_scale = clutter_actor_get_resource_scale (self);
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);
if (st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
clutter_canvas_set_scale_factor (CLUTTER_CANVAS (content), resource_scale);
}
static void
@@ -126,7 +128,7 @@ st_drawing_area_class_init (StDrawingAreaClass *klass)
actor_class->allocate = st_drawing_area_allocate;
widget_class->style_changed = st_drawing_area_style_changed;
actor_class->resource_scale_changed = st_drawing_area_resource_scale_changed;
widget_class->resource_scale_changed = st_drawing_area_resource_scale_changed;
st_drawing_area_signals[REPAINT] =
g_signal_new ("repaint",
@@ -213,10 +215,15 @@ st_drawing_area_get_surface_size (StDrawingArea *area,
content = clutter_actor_get_content (CLUTTER_ACTOR (area));
clutter_content_get_preferred_size (content, &w, &h);
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (area));
w /= resource_scale;
h /= resource_scale;
if (st_widget_get_resource_scale (ST_WIDGET (area), &resource_scale))
{
w /= resource_scale;
h /= resource_scale;
}
else
{
w = h = 0.0f;
}
if (width)
*width = ceilf (w);

View File

@@ -231,12 +231,9 @@ st_icon_style_changed (StWidget *widget)
}
static void
st_icon_resource_scale_changed (ClutterActor *actor)
st_icon_resource_scale_changed (StWidget *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);
st_icon_update (ST_ICON (widget));
}
static void
@@ -253,7 +250,7 @@ st_icon_class_init (StIconClass *klass)
actor_class->paint = st_icon_paint;
widget_class->style_changed = st_icon_style_changed;
actor_class->resource_scale_changed = st_icon_resource_scale_changed;
widget_class->resource_scale_changed = st_icon_resource_scale_changed;
props[PROP_GICON] =
g_param_spec_object ("gicon",
@@ -428,7 +425,8 @@ st_icon_update (StIcon *icon)
return;
}
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (icon));
if (!st_widget_get_resource_scale (ST_WIDGET (icon), &resource_scale))
return;
theme_node = st_widget_peek_theme_node (ST_WIDGET (icon));
if (theme_node == NULL)

View File

@@ -42,17 +42,11 @@ enum
};
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_ADD_PRIVATE (StImageContent)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTENT,
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))
clutter_content_interface_init))
static void
st_image_content_init (StImageContent *self)
@@ -171,157 +165,12 @@ st_image_content_get_preferred_size (ClutterContent *content,
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
clutter_content_interface_init (ClutterContentInterface *iface)
{
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:
* @width: The preferred width to be used when drawing the content

View File

@@ -201,42 +201,44 @@ st_label_paint (ClutterActor *actor,
if (shadow_spec)
{
ClutterActorBox allocation;
float width, height;
float 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)
if (clutter_actor_get_resource_scale (priv->label, &resource_scale))
{
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
ClutterActorBox allocation;
float width, height;
priv->shadow_width = width;
priv->shadow_height = height;
priv->text_shadow_pipeline =
_st_create_shadow_pipeline_from_actor (shadow_spec,
priv->label);
}
clutter_actor_get_allocation_box (priv->label, &allocation);
clutter_actor_box_get_size (&allocation, &width, &height);
if (priv->text_shadow_pipeline != NULL)
{
CoglFramebuffer *framebuffer;
width *= resource_scale;
height *= resource_scale;
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));
if (priv->text_shadow_pipeline == NULL ||
width != priv->shadow_width ||
height != priv->shadow_height)
{
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
priv->shadow_width = width;
priv->shadow_height = height;
priv->text_shadow_pipeline =
_st_create_shadow_pipeline_from_actor (shadow_spec,
priv->label);
}
if (priv->text_shadow_pipeline != NULL)
{
CoglFramebuffer *framebuffer;
framebuffer =
clutter_paint_context_get_framebuffer (paint_context);
_st_paint_shadow_with_opacity (shadow_spec,
framebuffer,
priv->text_shadow_pipeline,
&allocation,
clutter_actor_get_paint_opacity (priv->label));
}
}
}
@@ -244,14 +246,11 @@ st_label_paint (ClutterActor *actor,
}
static void
st_label_resource_scale_changed (ClutterActor *actor)
st_label_resource_scale_changed (StWidget *widget)
{
StLabelPrivate *priv = ST_LABEL (actor)->priv;
StLabelPrivate *priv = ST_LABEL (widget)->priv;
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
if (CLUTTER_ACTOR_CLASS (st_label_parent_class)->resource_scale_changed)
CLUTTER_ACTOR_CLASS (st_label_parent_class)->resource_scale_changed (actor);
}
static void
@@ -269,9 +268,9 @@ st_label_class_init (StLabelClass *klass)
actor_class->allocate = st_label_allocate;
actor_class->get_preferred_width = st_label_get_preferred_width;
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->resource_scale_changed = st_label_resource_scale_changed;
widget_class->get_accessible_type = st_label_accessible_get_type;
props[PROP_CLUTTER_TEXT] =
@@ -294,7 +293,6 @@ st_label_class_init (StLabelClass *klass)
static void
st_label_init (StLabel *label)
{
ClutterActor *actor = CLUTTER_ACTOR (label);
StLabelPrivate *priv;
label->priv = priv = st_label_get_instance_private (label);
@@ -306,10 +304,7 @@ st_label_init (StLabel *label)
label->priv->shadow_width = -1.;
label->priv->shadow_height = -1.;
clutter_actor_add_child (actor, priv->label);
clutter_actor_set_offscreen_redirect (actor,
CLUTTER_OFFSCREEN_REDIRECT_ALWAYS);
clutter_actor_add_child (CLUTTER_ACTOR (label), priv->label);
}
/**

View File

@@ -461,7 +461,8 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
if (width == 0 || height == 0)
return NULL;
resource_scale = clutter_actor_get_resource_scale (actor);
if (!clutter_actor_get_resource_scale (actor, &resource_scale))
return NULL;
width = ceilf (width * resource_scale);
height = ceilf (height * resource_scale);

View File

@@ -899,17 +899,13 @@ st_scroll_view_init (StScrollView *self)
priv->hscrollbar_policy = ST_POLICY_AUTOMATIC;
priv->vscrollbar_policy = ST_POLICY_AUTOMATIC;
priv->hadjustment = g_object_new (ST_TYPE_ADJUSTMENT,
"actor", self,
NULL);
priv->hadjustment = g_object_new (ST_TYPE_ADJUSTMENT, NULL);
priv->hscroll = g_object_new (ST_TYPE_SCROLL_BAR,
"adjustment", priv->hadjustment,
"vertical", FALSE,
NULL);
priv->vadjustment = g_object_new (ST_TYPE_ADJUSTMENT,
"actor", self,
NULL);
priv->vadjustment = g_object_new (ST_TYPE_ADJUSTMENT, NULL);
priv->vscroll = g_object_new (ST_TYPE_SCROLL_BAR,
"adjustment", priv->vadjustment,
"vertical", TRUE,

View File

@@ -722,7 +722,8 @@ load_texture_async (StTextureCache *cache,
typedef struct {
StTextureCache *cache;
ClutterContent *image;
ClutterActor *actor;
gint size;
GObject *source;
gulong notify_signal_id;
gboolean weakref_active;
@@ -741,33 +742,37 @@ st_texture_cache_reset_texture (StTextureCachePropertyBind *bind,
(cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32 ||
cairo_image_surface_get_format (surface) == CAIRO_FORMAT_RGB24))
{
g_autoptr(ClutterContent) image = NULL;
g_autoptr(GError) error = NULL;
int width, height, size;
int size = bind->size;
width = cairo_image_surface_get_width (surface);
height = cairo_image_surface_get_width (surface);
size = MAX(width, height);
if (size < 0)
clutter_actor_get_preferred_width (bind->actor, -1, NULL, (float *)&size);
if (!bind->image)
bind->image = st_image_content_new_with_preferred_size (size, size);
image = clutter_actor_get_content (bind->actor);
if (!image || !CLUTTER_IS_IMAGE (image))
image = st_image_content_new_with_preferred_size (size, size);
else
g_object_ref (image);
clutter_image_set_data (CLUTTER_IMAGE (bind->image),
clutter_image_set_data (CLUTTER_IMAGE (image),
cairo_image_surface_get_data (surface),
cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32 ?
COGL_PIXEL_FORMAT_BGRA_8888 : COGL_PIXEL_FORMAT_BGR_888,
width,
height,
cairo_image_surface_get_width (surface),
cairo_image_surface_get_height (surface),
cairo_image_surface_get_stride (surface),
&error);
if (error)
if (image)
clutter_actor_set_content (bind->actor, image);
else if (error)
g_warning ("Failed to allocate texture: %s", error->message);
clutter_actor_set_opacity (bind->actor, 255);
}
else
bind->image = g_object_new (ST_TYPE_IMAGE_CONTENT,
"preferred-width", 0, /* tough luck */
"preferred-height", 0,
NULL);
clutter_actor_set_opacity (bind->actor, 0);
}
static void
@@ -793,48 +798,57 @@ st_texture_cache_free_bind (gpointer data)
{
StTextureCachePropertyBind *bind = data;
if (bind->weakref_active)
g_object_weak_unref (G_OBJECT (bind->image), st_texture_cache_bind_weak_notify, bind);
g_object_weak_unref (G_OBJECT (bind->actor), st_texture_cache_bind_weak_notify, bind);
g_slice_free (StTextureCachePropertyBind, bind);
}
/**
* st_texture_cache_bind_cairo_surface_property:
* @cache:
* @object: A #GObject with a property @property_name of type #cairo_surface_t
* @object: A #GObject with a property @property_name of type #GdkPixbuf
* @property_name: Name of a property
*
* Create a #GIcon which tracks the #cairo_surface_t value of a GObject property
* Create a #ClutterActor which tracks the #cairo_surface_t value of a GObject property
* named by @property_name. Unlike other methods in StTextureCache, the underlying
* #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
* value of the property.
*
* Return value: (transfer none): A new #GIcon
* Return value: (transfer none): A new #StWidget
*/
GIcon *
StWidget *
st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
GObject *object,
const char *property_name)
const char *property_name,
gint size)
{
StWidget *widget;
gchar *notify_key;
StTextureCachePropertyBind *bind;
widget = g_object_new (ST_TYPE_WIDGET,
"opacity", 0,
"width", (float)size,
"height", (float)size,
NULL);
bind = g_slice_new0 (StTextureCachePropertyBind);
bind->cache = cache;
bind->actor = CLUTTER_ACTOR (widget);
bind->size = size;
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);
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);
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);
g_free (notify_key);
return G_ICON (bind->image);
return widget;
}
/**
@@ -967,18 +981,6 @@ st_texture_cache_load_gicon (StTextureCache *cache,
StIconStyle icon_style = ST_ICON_STYLE_REQUESTED;
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)
{
colors = st_theme_node_get_icon_colors (theme_node);
@@ -1032,6 +1034,7 @@ st_texture_cache_load_gicon (StTextureCache *cache,
g_free (gicon_string);
actor = create_invisible_actor ();
actor_size = size * paint_scale;
clutter_actor_set_size (actor, actor_size, actor_size);
if (ensure_request (cache, key, policy, &request, actor))
{

View File

@@ -64,9 +64,10 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
GFunc load_callback,
gpointer user_data);
GIcon *st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
GObject *object,
const char *property_name);
StWidget *st_texture_cache_bind_cairo_surface_property (StTextureCache *cache,
GObject *object,
const char *property_name,
gint size);
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
StThemeNode *theme_node,

View File

@@ -84,11 +84,10 @@ on_timeline_new_frame (ClutterTimeline *timeline,
}
StThemeNodeTransition *
st_theme_node_transition_new (ClutterActor *actor,
StThemeNode *from_node,
StThemeNode *to_node,
st_theme_node_transition_new (StThemeNode *from_node,
StThemeNode *to_node,
StThemeNodePaintState *old_paint_state,
unsigned int duration)
guint duration)
{
StThemeNodeTransition *transition;
g_return_val_if_fail (ST_IS_THEME_NODE (from_node), NULL);
@@ -104,7 +103,7 @@ st_theme_node_transition_new (ClutterActor *actor,
st_theme_node_paint_state_copy (&transition->priv->old_paint_state,
old_paint_state);
transition->priv->timeline = clutter_timeline_new_for_actor (actor, duration);
transition->priv->timeline = clutter_timeline_new (duration);
transition->priv->timeline_completed_id =
g_signal_connect (transition->priv->timeline, "completed",

View File

@@ -32,11 +32,10 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (StThemeNodeTransition, st_theme_node_transition,
ST, THEME_NODE_TRANSITION, GObject)
StThemeNodeTransition *st_theme_node_transition_new (ClutterActor *actor,
StThemeNode *from_node,
StThemeNode *to_node,
StThemeNodeTransition *st_theme_node_transition_new (StThemeNode *from_node,
StThemeNode *to_node,
StThemeNodePaintState *old_paint_state,
guint duration);
guint duration);
void st_theme_node_transition_update (StThemeNodeTransition *transition,
StThemeNode *new_node);

View File

@@ -78,7 +78,6 @@ adjustment_value_notify_cb (StAdjustment *adjustment,
GParamSpec *pspec,
StViewport *viewport)
{
clutter_actor_invalidate_transform (CLUTTER_ACTOR (viewport));
clutter_actor_queue_relayout (CLUTTER_ACTOR (viewport));
}
@@ -262,10 +261,8 @@ st_viewport_allocate (ClutterActor *actor,
clutter_actor_set_allocation (actor, box);
content_box = viewport_box;
if (priv->hadjustment)
content_box.x2 += MAX (0, min_width - avail_width);
if (priv->vadjustment)
content_box.y2 += MAX (0, min_height - avail_height);
content_box.x2 += MAX (0, min_width - avail_width);
content_box.y2 += MAX (0, min_height - avail_height);
clutter_layout_manager_allocate (layout, CLUTTER_CONTAINER (actor),
&content_box);

View File

@@ -124,6 +124,7 @@ enum
{
STYLE_CHANGED,
POPUP_MENU,
RESOURCE_SCALE_CHANGED,
LAST_SIGNAL
};
@@ -411,7 +412,8 @@ st_widget_paint_background (StWidget *widget,
float resource_scale;
guint8 opacity;
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (widget));
if (!st_widget_get_resource_scale (widget, &resource_scale))
return;
framebuffer = clutter_paint_context_get_framebuffer (paint_context);
theme_node = st_widget_get_theme_node (widget);
@@ -818,20 +820,6 @@ st_widget_real_get_focus_chain (StWidget *widget)
return g_list_reverse (visible);
}
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
st_widget_class_init (StWidgetClass *klass)
{
@@ -861,8 +849,6 @@ st_widget_class_init (StWidgetClass *klass)
actor_class->get_accessible = st_widget_get_accessible;
actor_class->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->navigate_focus = st_widget_real_navigate_focus;
klass->get_accessible_type = st_widget_accessible_get_type;
@@ -1016,6 +1002,21 @@ st_widget_class_init (StWidgetClass *klass)
G_STRUCT_OFFSET (StWidgetClass, popup_menu),
NULL, NULL, NULL,
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 *
@@ -1399,6 +1400,23 @@ st_widget_get_style (StWidget *actor)
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
st_widget_set_first_visible_child (StWidget *widget,
ClutterActor *actor)
@@ -1465,6 +1483,23 @@ st_widget_name_notify (StWidget *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
st_widget_reactive_notify (StWidget *widget,
GParamSpec *pspec,
@@ -1616,6 +1651,7 @@ st_widget_init (StWidget *actor)
/* connect style changed */
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::visible", G_CALLBACK (st_widget_visible_notify), NULL);
@@ -1687,8 +1723,7 @@ st_widget_recompute_style (StWidget *widget,
*/
priv->transition_animation =
st_theme_node_transition_new (CLUTTER_ACTOR (widget),
old_theme_node,
st_theme_node_transition_new (old_theme_node,
new_theme_node,
current_paint_state (widget),
transition_duration);

View File

@@ -63,6 +63,7 @@ struct _StWidgetClass
/* signals */
void (* style_changed) (StWidget *self);
void (* popup_menu) (StWidget *self);
void (* resource_scale_changed) (StWidget *self);
/* vfuncs */
@@ -134,6 +135,8 @@ StThemeNode * st_widget_peek_theme_node (StWidget *widg
GList * st_widget_get_focus_chain (StWidget *widget);
void st_widget_paint_background (StWidget *widget,
ClutterPaintContext *paint_context);
gboolean st_widget_get_resource_scale (StWidget *widget,
float *resource_scale);
/* debug methods */
char *st_describe_actor (ClutterActor *actor);

View File

@@ -566,26 +566,26 @@ main (int argc, char **argv)
root = st_theme_context_get_root_node (context);
group1 = st_theme_node_new (context, root, NULL,
CLUTTER_TYPE_ACTOR, "group1", NULL, NULL, NULL);
CLUTTER_TYPE_GROUP, "group1", NULL, NULL, NULL);
text1 = st_theme_node_new (context, group1, NULL,
CLUTTER_TYPE_TEXT, "text1", "special-text", NULL, NULL);
text2 = st_theme_node_new (context, group1, NULL,
CLUTTER_TYPE_TEXT, "text2", NULL, NULL, NULL);
group2 = st_theme_node_new (context, root, NULL,
CLUTTER_TYPE_ACTOR, "group2", NULL, NULL, NULL);
CLUTTER_TYPE_GROUP, "group2", NULL, NULL, NULL);
group4 = st_theme_node_new (context, root, NULL,
CLUTTER_TYPE_ACTOR, "group4", NULL, NULL, NULL);
CLUTTER_TYPE_GROUP, "group4", NULL, NULL, NULL);
group5 = st_theme_node_new (context, root, NULL,
CLUTTER_TYPE_ACTOR, "group5", NULL, NULL, NULL);
CLUTTER_TYPE_GROUP, "group5", NULL, NULL, NULL);
group6 = st_theme_node_new (context, root, NULL,
CLUTTER_TYPE_ACTOR, "group6", NULL, NULL, NULL);
CLUTTER_TYPE_GROUP, "group6", NULL, NULL, NULL);
text3 = st_theme_node_new (context, group2, NULL,
CLUTTER_TYPE_TEXT, "text3", NULL, NULL,
"color: #0000ff; padding-bottom: 12px;");
text4 = st_theme_node_new (context, group2, NULL,
CLUTTER_TYPE_TEXT, "text4", NULL, "visited hover", NULL);
group3 = st_theme_node_new (context, group2, NULL,
CLUTTER_TYPE_ACTOR, "group3", NULL, "hover", NULL);
CLUTTER_TYPE_GROUP, "group3", NULL, "hover", NULL);
button = st_theme_node_new (context, root, NULL,
ST_TYPE_BUTTON, "button", NULL, NULL, NULL);

View File

@@ -39,7 +39,6 @@
</description>
<releases>
<release version="3.37.3" date="2020-07-07"/>
<release version="3.37.2" date="2020-06-02"/>
<release version="3.37.1" date="2020-04-29"/>
</releases>

View File

@@ -1,5 +1,5 @@
project('gnome-extensions-app',
version: '3.37.3',
version: '3.37.2',
meson_version: '>= 0.53.0',
license: 'GPLv2+'
)

View File

@@ -1,5 +1,5 @@
project('gnome-extensions-tool', 'c',
version: '3.37.3',
version: '3.37.2',
meson_version: '>= 0.53.0',
license: 'GPLv2+'
)

View File

@@ -1,5 +1,5 @@
project('shew', 'c',
version: '3.37.3',
version: '3.37.2',
meson_version: '>= 0.53.0',
license: 'LGPLv2+',
)