Compare commits

..

11 Commits

Author SHA1 Message Date
Mario Sanchez Prada
be76b19300 st-entry: Set text-related CSS properties on the internal ClutterText
Call _st_set_text_from_style() when updating the entry's style, so
that CSS style properties such as text-decoration or letter-spacing
are applied over the internal ClutterText instance.
2018-04-18 00:14:05 +00:00
Mario Sanchez Prada
376d696b8b st-private: Add support for letter-spacing in ClutterText based StWidgets
Add support in _st_set_text_from_style(), so that this CSS property can
be used from any StWidget holding an internal ClutterText.
2018-04-18 00:14:05 +00:00
Mario Sanchez Prada
695d61968d st-theme-node: Add new getter st_theme_node_get_letter_spacing
This will be used by ClutterText-backed StWidgets to update their
list of PangoAttributes according to the letter-spacing property.
2018-04-18 00:14:04 +00:00
Didier Roche
d6d09fd3c8 ui: Theme lookup should respect XDG_DATA_DIRS
Modes, extensions and other GNOME Shell assets are searched in appropriate
subdirectories of each directory in XDG_DATA_DIRS, falling back
to global.datadir.
However, this isn't the case for themes, which are currently always expected
in global.datadir, even when referenced by a mode in a different XDG_DATA_DIR.

The fix is to have the theme finding pattern follow the same logic as other
elements.
Fixes #167.
2018-04-16 19:09:14 +02:00
gogo
f1b1501f9b Update Croatian translation 2018-04-16 12:31:09 +00:00
Mario Sanchez Prada
cdbc99e992 popupMenu: Fix wrong call to clutter_actor_add_child()
Specify the horizontal alignment via the x_align property when creating
the StIcon, since this function expects one argument, not two.
2018-04-16 11:40:04 +00:00
Florian Müllner
69afe7785d remoteMenu: Support icons in app-menu
The HIG discourages the use of icons in menus except for "noun" items
(files, bookmarks, ...). While those should be rarely used in the
application menu, it still makes sense to support them in the few
cases where they are used.

https://bugzilla.gnome.org/show_bug.cgi?id=760985
2018-04-14 09:02:20 +00:00
Marco Trevisan (Treviño)
b99e304f1e workspaceThumbnail: initialize porthole based on workArea
https://bugzilla.gnome.org/show_bug.cgi?id=792687
2018-04-13 16:59:51 -05:00
Marco Trevisan (Treviño)
c29bd46e7a workspaceThumbnail: rebuild thumbnails if workareas size changed
https://bugzilla.gnome.org/show_bug.cgi?id=792687
2018-04-13 16:58:28 -05:00
Marco Trevisan (Treviño)
5fcf40b973 workspaceThumbnail: only update _porthole if the overview is visible
Otherwise it happens that porthole is computed again after that the
overlay is hidden (triggered by a layout reallocation) and thus not
regenerated again afterwards.

https://bugzilla.gnome.org/show_bug.cgi?id=792687
2018-04-13 16:53:18 -05:00
Piotr Drąg
a198dfe3d8 thunderbolt: capitalize Thunderbolt in a translatable string 2018-04-13 21:52:32 +02:00
29 changed files with 1235 additions and 1660 deletions

28
NEWS
View File

@@ -1,31 +1,3 @@
3.28.3
======
* Fix lagging pointer when zoomed [Daniel; #682013]
* Fix "Clear All" for calendar events [Florian; #325]
* Misc. bug fixes [Florian, Mario, Marco; #136, #214, #788931, #791233]
Contributors:
Carlos Garnacho, Florian Müllner, Mario Sanchez Prada, Joe Rabinoff,
Didier Roche, Marco Trevisan (Treviño), Daniel van Vugt
Translators:
Pieter Schalk Schoeman [af], Gun Chleoc [gd]
3.28.2
======
* Fix lock-up on cancelling polkit dialog [Florian; #221]
* Guard against untimely keyboard map changes [Carlos; #240]
* Fix blurriness of OSD under some resolutions [Silvère; #782011]
* Fix icons in search provider results [Florian; #249]
* Misc. bug fixes [Marco, Florian; #792687, #781471]
Contributors:
Carlos Garnacho, Silvère Latchurié, Florian Müllner, Mario Sanchez Prada,
Ray Strode, Marco Trevisan (Treviño)
Translators:
Stas Solovey [ru], Rafael Fontenelle [pt_BR]
3.28.1 3.28.1
====== ======
* Fix compose characters in shell entries [Carlos; #115] * Fix compose characters in shell entries [Carlos; #115]

View File

@@ -115,11 +115,6 @@ var IBusManager = new Lang.Class({
object_path: IBus.PATH_PANEL }); object_path: IBus.PATH_PANEL });
this._candidatePopup.setPanelService(this._panelService); this._candidatePopup.setPanelService(this._panelService);
this._panelService.connect('update-property', this._updateProperty.bind(this)); this._panelService.connect('update-property', this._updateProperty.bind(this));
this._panelService.connect('set-cursor-location', (ps, x, y, w, h) => {
let cursorLocation = { x, y, width: w, height: h };
this.emit('set-cursor-location', cursorLocation);
});
try { try {
// IBus versions older than 1.5.10 have a bug which // IBus versions older than 1.5.10 have a bug which
// causes spurious set-content-type emissions when // causes spurious set-content-type emissions when

View File

@@ -89,8 +89,6 @@ var KeyboardManager = new Lang.Class({
}, },
setUserLayouts(ids) { setUserLayouts(ids) {
let currentId = this._current ? this._current.id : null;
let currentGroupIndex = this._current ? this._current.groupIndex : null;
this._current = null; this._current = null;
this._layoutInfos = {}; this._layoutInfos = {};
@@ -117,9 +115,6 @@ var KeyboardManager = new Lang.Class({
info.group = group; info.group = group;
info.groupIndex = groupIndex; info.groupIndex = groupIndex;
if (currentId == id && currentGroupIndex == groupIndex)
this._current = info;
i += 1; i += 1;
} }
}, },

View File

@@ -821,8 +821,6 @@ var EventsSection = new Lang.Class({
this._desktopSettings.connect('changed', this._reloadEvents.bind(this)); this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
this._eventSource = new EmptyEventSource(); this._eventSource = new EmptyEventSource();
this._messageById = new Map();
this.parent(); this.parent();
this._title = new St.Button({ style_class: 'events-section-title', this._title = new St.Button({ style_class: 'events-section-title',
@@ -877,32 +875,20 @@ var EventsSection = new Lang.Class({
this._reloading = true; this._reloading = true;
this._list.destroy_all_children();
let periodBegin = _getBeginningOfDay(this._date); let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date); let periodEnd = _getEndOfDay(this._date);
let events = this._eventSource.getEvents(periodBegin, periodEnd); let events = this._eventSource.getEvents(periodBegin, periodEnd);
let ids = events.map(e => e.id);
this._messageById.forEach((message, id) => {
if (ids.includes(id))
return;
this._messageById.delete(id);
this.removeMessage(message);
});
for (let i = 0; i < events.length; i++) { for (let i = 0; i < events.length; i++) {
let event = events[i]; let event = events[i];
let message = this._messageById.get(event.id); let message = new EventMessage(event, this._date);
if (!message) { message.connect('close', () => {
message = new EventMessage(event, this._date); this._ignoreEvent(event);
message.connect('close', () => { });
this._ignoreEvent(event); this.addMessage(message, false);
});
this._messageById.set(event.id, message);
this.addMessage(message, false);
} else {
this.moveMessage(message, i, false);
}
} }
this._reloading = false; this._reloading = false;

View File

@@ -655,7 +655,7 @@ var NetworkAgent = new Lang.Class({
switch (connectionType) { switch (connectionType) {
case '802-11-wireless': case '802-11-wireless':
let wirelessSetting = connection.get_setting_wireless(); let wirelessSetting = connection.get_setting_wireless();
let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data()); let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid());
title = _("Authentication required by wireless network"); title = _("Authentication required by wireless network");
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid); body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
break; break;

View File

@@ -201,9 +201,7 @@ var AuthenticationDialog = new Lang.Class({
close(timestamp) { close(timestamp) {
this.parent(timestamp); this.parent(timestamp);
if (this._sessionUpdatedId) Main.sessionMode.disconnect(this._sessionUpdatedId);
Main.sessionMode.disconnect(this._sessionUpdatedId);
this._sessionUpdatedId = 0;
}, },
_ensureOpen() { _ensureOpen() {

View File

@@ -1,5 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const FocusCaretTracker = imports.ui.focusCaretTracker;
const Atspi = imports.gi.Atspi; const Atspi = imports.gi.Atspi;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
@@ -12,7 +13,6 @@ const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const InputSourceManager = imports.ui.status.keyboard; const InputSourceManager = imports.ui.status.keyboard;
const IBusManager = imports.misc.ibusManager;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -261,7 +261,6 @@ var Key = new Lang.Class({
this._extended_keyboard = null; this._extended_keyboard = null;
this._pressTimeoutId = 0; this._pressTimeoutId = 0;
this._capturedPress = false; this._capturedPress = false;
this._capturedEventId = 0; this._capturedEventId = 0;
this._unmapId = 0; this._unmapId = 0;
this._longPress = false; this._longPress = false;
@@ -485,71 +484,6 @@ var KeyboardModel = new Lang.Class({
} }
}); });
var FocusTracker = new Lang.Class({
Name: 'FocusTracker',
_init() {
this._currentWindow = null;
this._currentWindowPositionId = 0;
global.screen.get_display().connect('notify::focus-window', () => {
this._setCurrentWindow(global.screen.get_display().focus_window);
this.emit('window-changed', this._currentWindow);
});
/* Valid for wayland clients */
Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() };
this._setCurrentRect(newRect);
});
this._ibusManager = IBusManager.getIBusManager();
this._ibusManager.connect('set-cursor-location', (manager, rect) => {
/* Valid for X11 clients only */
if (Main.inputMethod.currentFocus)
return;
this._setCurrentRect(rect);
});
},
get currentWindow() {
return this._currentWindow;
},
_setCurrentWindow(window) {
if (this._currentWindow)
this._currentWindow.disconnect(this._currentWindowPositionId);
this._currentWindow = window;
if (window) {
this._currentWindowPositionId = this._currentWindow.connect('position-changed', () => {
if (global.display.get_grab_op() == Meta.GrabOp.NONE)
this.emit('position-changed');
else
this.emit('reset');
});
}
},
_setCurrentRect(rect) {
let frameRect = this._currentWindow.get_frame_rect();
rect.x -= frameRect.x;
rect.y -= frameRect.y;
this._rect = rect;
this.emit('position-changed');
},
getCurrentRect() {
let frameRect = this._currentWindow.get_frame_rect();
let rect = { x: this._rect.x + frameRect.x, y: this._rect.y + frameRect.y, width: this._rect.width, height: this._rect.height };
return rect;
}
});
Signals.addSignalMethods(FocusTracker.prototype);
var Keyboard = new Lang.Class({ var Keyboard = new Lang.Class({
Name: 'Keyboard', Name: 'Keyboard',
@@ -557,10 +491,15 @@ var Keyboard = new Lang.Class({
this.actor = null; this.actor = null;
this._focusInExtendedKeys = false; this._focusInExtendedKeys = false;
this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
this._focusCaretTracker.connect('focus-changed', this._onFocusChanged.bind(this));
this._focusCaretTracker.connect('caret-moved', this._onCaretMoved.bind(this));
this._languagePopup = null; this._languagePopup = null;
this._currentAccessible = null;
this._caretTrackingEnabled = false;
this._updateCaretPositionId = 0;
this._currentFocusWindow = null; this._currentFocusWindow = null;
this._animFocusedWindow = null; this._originalWindowY = null;
this._delayedAnimFocusWindow = null;
this._enableKeyboard = false; // a11y settings value this._enableKeyboard = false; // a11y settings value
this._enabled = false; // enabled state (by setting or device type) this._enabled = false; // enabled state (by setting or device type)
@@ -571,14 +510,6 @@ var Keyboard = new Lang.Class({
this._lastDeviceId = null; this._lastDeviceId = null;
this._suggestions = null; this._suggestions = null;
this._focusTracker = new FocusTracker();
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
this._focusTracker.connect('reset', () => {
this._delayedAnimFocusWindow = null;
this._animFocusedWindow = null;
this._oskFocusWindow = null;
});
Meta.get_backend().connect('last-device-changed', Meta.get_backend().connect('last-device-changed',
(backend, deviceId) => { (backend, deviceId) => {
let manager = Clutter.DeviceManager.get_default(); let manager = Clutter.DeviceManager.get_default();
@@ -601,15 +532,102 @@ var Keyboard = new Lang.Class({
this._keyboardRestingId = 0; this._keyboardRestingId = 0;
Main.layoutManager.connect('monitors-changed', this._relayout.bind(this)); Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
//Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
// if (this._keyboardVisible) {
// let currentWindow = global.screen.get_display().focus_window;
// this.setCursorLocation(currentWindow, rect.get_x(), rect.get_y(),
// rect.get_width(), rect.get_height());
// }
//});
}, },
get visible() { get visible() {
return this._keyboardVisible; return this._keyboardVisible;
}, },
_onFocusPositionChanged(focusTracker) { _setCaretTrackerEnabled(enabled) {
let rect = focusTracker.getCurrentRect(); if (this._caretTrackingEnabled == enabled)
this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height); return;
this._caretTrackingEnabled = enabled;
if (enabled) {
this._focusCaretTracker.registerFocusListener();
this._focusCaretTracker.registerCaretListener();
} else {
this._focusCaretTracker.deregisterFocusListener();
this._focusCaretTracker.deregisterCaretListener();
}
},
_updateCaretPosition(accessible) {
if (this._updateCaretPositionId)
GLib.source_remove(this._updateCaretPositionId);
if (!this._keyboardRequested)
return;
this._updateCaretPositionId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
this._updateCaretPositionId = 0;
let currentWindow = global.screen.get_display().focus_window;
if (!currentWindow) {
this.setCursorLocation(null);
return GLib.SOURCE_REMOVE;
}
let windowRect = currentWindow.get_frame_rect();
let text = accessible.get_text_iface();
let component = accessible.get_component_iface();
try {
let caretOffset = text.get_caret_offset();
let caretRect = text.get_character_extents(caretOffset, Atspi.CoordType.WINDOW);
let focusRect = component.get_extents(Atspi.CoordType.WINDOW);
if (caretRect.width == 0 && caretRect.height == 0)
caretRect = focusRect;
this.setCursorLocation(currentWindow, caretRect.x, caretRect.y, caretRect.width, caretRect.height);
} catch (e) {
log('Error updating caret position for OSK: ' + e.message);
}
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(this._updateCaretPositionId, '[gnome-shell] this._updateCaretPosition');
},
_focusIsTextEntry(accessible) {
try {
let role = accessible.get_role();
let stateSet = accessible.get_state_set();
return stateSet.contains(Atspi.StateType.EDITABLE) || role == Atspi.Role.TERMINAL;
} catch (e) {
log('Error determining accessible role: ' + e.message);
return false;
}
},
_onFocusChanged(caretTracker, event) {
let accessible = event.source;
if (!this._focusIsTextEntry(accessible))
return;
let focused = event.detail1 != 0;
if (focused) {
this._currentAccessible = accessible;
this._updateCaretPosition(accessible);
this.show(Main.layoutManager.focusIndex);
} else if (this._currentAccessible == accessible) {
this._currentAccessible = null;
this.hide();
}
},
_onCaretMoved(caretTracker, event) {
let accessible = event.source;
if (this._currentAccessible == accessible)
this._updateCaretPosition(accessible);
}, },
_lastDeviceIsTouchscreen() { _lastDeviceIsTouchscreen() {
@@ -632,6 +650,8 @@ var Keyboard = new Lang.Class({
if (!this._enabled && !this._keyboardController) if (!this._enabled && !this._keyboardController)
return; return;
this._setCaretTrackerEnabled(this._enabled);
if (this._enabled && !this._keyboardController) if (this._enabled && !this._keyboardController)
this._setupKeyboard(); this._setupKeyboard();
else if (!this._enabled) else if (!this._enabled)
@@ -1007,14 +1027,11 @@ var Keyboard = new Lang.Class({
if (!this._keyboardRequested) if (!this._keyboardRequested)
return; return;
if (this._currentAccessible)
this._updateCaretPosition(this._currentAccessible);
Main.layoutManager.keyboardIndex = monitor; Main.layoutManager.keyboardIndex = monitor;
this._relayout(); this._relayout();
Main.layoutManager.showKeyboard(); Main.layoutManager.showKeyboard();
if (this._delayedAnimFocusWindow) {
this._setAnimationWindow(this._delayedAnimFocusWindow);
this._delayedAnimFocusWindow = null;
}
}, },
hide() { hide() {
@@ -1085,9 +1102,8 @@ var Keyboard = new Lang.Class({
window.move_frame(true, frameRect.x, frameRect.y); window.move_frame(true, frameRect.x, frameRect.y);
}, },
_animateWindow(window, show) { _animateWindow(window, show, deltaY) {
let windowActor = window.get_compositor_private(); let windowActor = window.get_compositor_private();
let deltaY = Main.layoutManager.keyboardBox.height;
if (!windowActor) if (!windowActor)
return; return;
@@ -1108,39 +1124,35 @@ var Keyboard = new Lang.Class({
} }
}, },
_setAnimationWindow(window) { setCursorLocation(window, x, y , w, h) {
if (this._animFocusedWindow == window) if (window == this._oskFocusWindow)
return; return;
if (this._animFocusedWindow) if (this._oskFocusWindow) {
this._animateWindow(this._animFocusedWindow, false); let display = global.screen.get_display();
if (window)
this._animateWindow(window, true);
this._animFocusedWindow = window; if (display.get_grab_op() == Meta.GrabOp.NONE ||
}, display.get_focus_window() != this._oskFocusWindow)
this._animateWindow(this._oskFocusWindow, false, this._oskFocusWindowDelta);
setCursorLocation(window, x, y , w, h) { this._oskFocusWindow = null;
let monitor = Main.layoutManager.keyboardMonitor; this._oskFocusWindowDelta = null;
if (window && monitor) {
let keyboardHeight = Main.layoutManager.keyboardBox.height;
let focusObscured = false;
if (y + h >= monitor.y + monitor.height - keyboardHeight) {
if (this._keyboardVisible)
this._setAnimationWindow(window);
else
this._delayedAnimFocusWindow = window;
} else if (y < keyboardHeight) {
this._delayedAnimFocusWindow = null;
this._setAnimationWindow(null);
}
} else {
this._setAnimationWindow(null);
} }
this._oskFocusWindow = window; if (window) {
let monitor = Main.layoutManager.keyboardMonitor;
let keyboardHeight = Main.layoutManager.keyboardBox.height;
let frameRect = window.get_frame_rect();
let windowActor = window.get_compositor_private();
let delta = 0;
if (frameRect.y + y + h >= monitor.height - keyboardHeight)
delta = keyboardHeight;
this._animateWindow(window, true, delta);
this._oskFocusWindow = window;
this._oskFocusWindowDelta = delta;
}
}, },
}); });

View File

@@ -19,6 +19,7 @@ const MagnifierDBus = imports.ui.magnifierDBus;
const Params = imports.misc.params; const Params = imports.misc.params;
const PointerWatcher = imports.ui.pointerWatcher; const PointerWatcher = imports.ui.pointerWatcher;
var MOUSE_POLL_FREQUENCY = 50;
var CROSSHAIRS_CLIP_SIZE = [100, 100]; var CROSSHAIRS_CLIP_SIZE = [100, 100];
var NO_CHANGE = 0.0; var NO_CHANGE = 0.0;
@@ -151,10 +152,8 @@ var Magnifier = new Lang.Class({
* Turn on mouse tracking, if not already doing so. * Turn on mouse tracking, if not already doing so.
*/ */
startTrackingMouse() { startTrackingMouse() {
if (!this._pointerWatch) { if (!this._pointerWatch)
let interval = 1000 / Clutter.get_default_frame_rate(); this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(MOUSE_POLL_FREQUENCY, this.scrollToMousePos.bind(this));
this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(interval, this.scrollToMousePos.bind(this));
}
}, },
/** /**

View File

@@ -204,7 +204,7 @@ var OsdWindow = new Lang.Class({
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._icon.icon_size = popupSize / (2 * scaleFactor); this._icon.icon_size = popupSize / (2 * scaleFactor);
this._box.translation_y = Math.round(monitor.height / 4); this._box.translation_y = monitor.height / 4;
this._boxConstraint.minSize = popupSize; this._boxConstraint.minSize = popupSize;
} }
}); });

View File

@@ -119,6 +119,9 @@ var RemoteMenuItemMapper = new Lang.Class({
this._trackerItem = trackerItem; this._trackerItem = trackerItem;
this.menuItem = new PopupMenu.PopupBaseMenuItem(); this.menuItem = new PopupMenu.PopupBaseMenuItem();
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.menuItem.actor.add_child(this._icon);
this._label = new St.Label(); this._label = new St.Label();
this.menuItem.actor.add_child(this._label); this.menuItem.actor.add_child(this._label);
this.menuItem.actor.label_actor = this._label; this.menuItem.actor.label_actor = this._label;
@@ -129,11 +132,13 @@ var RemoteMenuItemMapper = new Lang.Class({
this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE); this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
this._trackerItem.connect('notify::icon', this._updateIcon.bind(this));
this._trackerItem.connect('notify::label', this._updateLabel.bind(this)); this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this)); this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this));
this._trackerItem.connect('notify::role', this._updateRole.bind(this)); this._trackerItem.connect('notify::role', this._updateRole.bind(this));
this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this)); this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this));
this._updateIcon();
this._updateLabel(); this._updateLabel();
this._updateSensitivity(); this._updateSensitivity();
this._updateRole(); this._updateRole();
@@ -143,6 +148,11 @@ var RemoteMenuItemMapper = new Lang.Class({
}); });
}, },
_updateIcon() {
this._icon.gicon = this._trackerItem.icon;
this._icon.visible = (this._icon.gicon != null);
},
_updateLabel() { _updateLabel() {
this._label.text = stripMnemonics(this._trackerItem.label); this._label.text = stripMnemonics(this._trackerItem.label);
}, },

View File

@@ -295,7 +295,7 @@ var RemoteSearchProvider = new Lang.Class({
name: metas[i]['name'], name: metas[i]['name'],
description: metas[i]['description'], description: metas[i]['description'],
createIcon: size => { createIcon: size => {
return this.createIcon(size, metas[i]); this.createIcon(size, metas[i]);
}, },
clipboardText: metas[i]['clipboardText'] }); clipboardText: metas[i]['clipboardText'] });
} }

View File

@@ -1944,7 +1944,6 @@ var NMApplet = new Lang.Class({
this.indicators.visible = this._client.nm_running; this.indicators.visible = this._client.nm_running;
this.menu.actor.visible = this._client.networking_enabled; this.menu.actor.visible = this._client.networking_enabled;
this._updateIcon();
this._syncConnectivity(); this._syncConnectivity();
}, },

View File

@@ -354,7 +354,7 @@ var Indicator = new Lang.Class({
_onEnrollFailed(obj, device, error) { _onEnrollFailed(obj, device, error) {
const title = _('Thunderbolt authorization error'); const title = _('Thunderbolt authorization error');
const body = _('Could not authorize the thunderbolt device: %s'.format(error.message)); const body = _('Could not authorize the Thunderbolt device: %s'.format(error.message));
this._notify(title, body); this._notify(title, body);
} }

View File

@@ -24,7 +24,7 @@ const EdgeDragAction = imports.ui.edgeDragAction;
const CloseDialog = imports.ui.closeDialog; const CloseDialog = imports.ui.closeDialog;
const SwitchMonitor = imports.ui.switchMonitor; const SwitchMonitor = imports.ui.switchMonitor;
var SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2; var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
var SHOW_WINDOW_ANIMATION_TIME = 0.15; var SHOW_WINDOW_ANIMATION_TIME = 0.15;
var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1; var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1;

View File

@@ -1431,26 +1431,34 @@ var Workspace = new Lang.Class({
_doRemoveWindow(metaWin) { _doRemoveWindow(metaWin) {
let win = metaWin.get_compositor_private(); let win = metaWin.get_compositor_private();
let clone = this._removeWindowClone(metaWin); // find the position of the window in our list
let index = this._lookupIndex (metaWin);
if (clone) { if (index == -1)
// If metaWin.get_compositor_private() returned non-NULL, that return;
// means the window still exists (and is just being moved to
// another workspace or something), so set its overviewHint let clone = this._windows[index];
// accordingly. (If it returned NULL, then the window is being
// destroyed; we'd like to animate this, but it's too late at this._windows.splice(index, 1);
// this point.) this._windowOverlays.splice(index, 1);
if (win) {
let [stageX, stageY] = clone.actor.get_transformed_position(); // If metaWin.get_compositor_private() returned non-NULL, that
let [stageWidth, stageHeight] = clone.actor.get_transformed_size(); // means the window still exists (and is just being moved to
win._overviewHint = { // another workspace or something), so set its overviewHint
x: stageX, // accordingly. (If it returned NULL, then the window is being
y: stageY, // destroyed; we'd like to animate this, but it's too late at
scale: stageWidth / clone.actor.width // this point.)
}; if (win) {
} let [stageX, stageY] = clone.actor.get_transformed_position();
clone.destroy(); let [stageWidth, stageHeight] = clone.actor.get_transformed_size();
win._overviewHint = {
x: stageX,
y: stageY,
scale: stageWidth / clone.actor.width
};
} }
clone.destroy();
// We need to reposition the windows; to avoid shuffling windows // We need to reposition the windows; to avoid shuffling windows
// around while the user is interacting with the workspace, we delay // around while the user is interacting with the workspace, we delay
@@ -1840,9 +1848,6 @@ var Workspace = new Lang.Class({
clone.connect('size-changed', () => { clone.connect('size-changed', () => {
this._recalculateWindowPositions(WindowPositionFlags.NONE); this._recalculateWindowPositions(WindowPositionFlags.NONE);
}); });
clone.actor.connect('destroy', () => {
this._removeWindowClone(clone.metaWindow);
});
this.actor.add_actor(clone.actor); this.actor.add_actor(clone.actor);
@@ -1864,17 +1869,6 @@ var Workspace = new Lang.Class({
return [clone, overlay]; return [clone, overlay];
}, },
_removeWindowClone(metaWin) {
// find the position of the window in our list
let index = this._lookupIndex (metaWin);
if (index == -1)
return null;
this._windowOverlays.splice(index, 1);
return this._windows.splice(index, 1).pop();
},
_onShowOverlayClose(windowOverlay) { _onShowOverlayClose(windowOverlay) {
for (let i = 0; i < this._windowOverlays.length; i++) { for (let i = 0; i < this._windowOverlays.length; i++) {
let overlay = this._windowOverlays[i]; let overlay = this._windowOverlays[i];

View File

@@ -31,7 +31,7 @@ var WORKSPACE_CUT_SIZE = 10;
var WORKSPACE_KEEP_ALIVE_TIME = 100; var WORKSPACE_KEEP_ALIVE_TIME = 100;
var OVERRIDE_SCHEMA = 'org.gnome.shell.overrides'; const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
/* A layout manager that requests size only for primary_actor, but then allocates /* A layout manager that requests size only for primary_actor, but then allocates
all using a fixed layout */ all using a fixed layout */
@@ -241,7 +241,7 @@ var WindowClone = new Lang.Class({
Signals.addSignalMethods(WindowClone.prototype); Signals.addSignalMethods(WindowClone.prototype);
var ThumbnailState = { const ThumbnailState = {
NEW : 0, NEW : 0,
ANIMATING_IN : 1, ANIMATING_IN : 1,
NORMAL: 2, NORMAL: 2,
@@ -372,9 +372,18 @@ var WorkspaceThumbnail = new Lang.Class({
}, },
_doRemoveWindow(metaWin) { _doRemoveWindow(metaWin) {
let clone = this._removeWindowClone(metaWin); let win = metaWin.get_compositor_private();
if (clone)
clone.destroy(); // find the position of the window in our list
let index = this._lookupIndex (metaWin);
if (index == -1)
return;
let clone = this._windows[index];
this._windows.splice(index, 1);
clone.destroy();
}, },
_doAddWindow(metaWin) { _doAddWindow(metaWin) {
@@ -526,9 +535,6 @@ var WorkspaceThumbnail = new Lang.Class({
clone.connect('drag-end', () => { clone.connect('drag-end', () => {
Main.overview.endWindowDrag(clone.metaWindow); Main.overview.endWindowDrag(clone.metaWindow);
}); });
clone.actor.connect('destroy', () => {
this._removeWindowClone(clone.metaWindow);
});
this._contents.add_actor(clone.actor); this._contents.add_actor(clone.actor);
if (this._windows.length == 0) if (this._windows.length == 0)
@@ -541,16 +547,6 @@ var WorkspaceThumbnail = new Lang.Class({
return clone; return clone;
}, },
_removeWindowClone(metaWin) {
// find the position of the window in our list
let index = this._lookupIndex (metaWin);
if (index == -1)
return null;
return this._windows.splice(index, 1).pop();
},
activate(time) { activate(time) {
if (this.state > ThumbnailState.NORMAL) if (this.state > ThumbnailState.NORMAL)
return; return;

View File

@@ -1,5 +1,5 @@
project('gnome-shell', 'c', project('gnome-shell', 'c',
version: '3.28.3', version: '3.28.1',
meson_version: '>= 0.42.0', meson_version: '>= 0.42.0',
license: 'GPLv2+' license: 'GPLv2+'
) )

1506
po/af.po

File diff suppressed because it is too large Load Diff

757
po/gd.po

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-02-26 17:00+0000\n" "POT-Creation-Date: 2018-04-13 19:54+0000\n"
"PO-Revision-Date: 2018-03-07 22:46+0100\n" "PO-Revision-Date: 2018-04-16 14:30+0200\n"
"Last-Translator: gogo <trebelnik2@gmail.com>\n" "Last-Translator: gogo <trebelnik2@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\n" "Language-Team: Croatian <hr@li.org>\n"
"Language: hr\n" "Language: hr\n"
@@ -337,7 +337,7 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "Dogodila se greška učitavanja dijaloga osobitosti za %s:" msgstr "Dogodila se greška učitavanja dijaloga osobitosti za %s:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -663,12 +663,12 @@ msgstr "Dodaj u omiljene"
msgid "Show Details" msgid "Show Details"
msgstr "Prikaži pojedinosti" msgstr "Prikaži pojedinosti"
#: js/ui/appFavorites.js:138 #: js/ui/appFavorites.js:140
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s je dodan u omiljene." msgstr "%s je dodan u omiljene."
#: js/ui/appFavorites.js:172 #: js/ui/appFavorites.js:174
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s je uklonjen iz omiljenih." msgstr "%s je uklonjen iz omiljenih."
@@ -863,7 +863,7 @@ msgstr "Vanjski uređaj odspojen"
msgid "Open with %s" msgid "Open with %s"
msgstr "Otvori s(a) %s" msgstr "Otvori s(a) %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
msgid "Password:" msgid "Password:"
msgstr "Lozinka:" msgstr "Lozinka:"
@@ -950,15 +950,15 @@ msgstr "Potrebna je lozinka za povezivanje s “%s”."
msgid "Network Manager" msgid "Network Manager"
msgstr "Mrežni upravitelj" msgstr "Mrežni upravitelj"
#: js/ui/components/polkitAgent.js:43 #: js/ui/components/polkitAgent.js:48
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Potrebna je ovjera" msgstr "Potrebna je ovjera"
#: js/ui/components/polkitAgent.js:71 #: js/ui/components/polkitAgent.js:76
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: js/ui/components/polkitAgent.js:151 #: js/ui/components/polkitAgent.js:156
msgid "Authenticate" msgid "Authenticate"
msgstr "Ovjeri" msgstr "Ovjeri"
@@ -966,7 +966,7 @@ msgstr "Ovjeri"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Nažalost, to ne radi. Pokušajte ponovno." msgstr "Nažalost, to ne radi. Pokušajte ponovno."
@@ -1014,7 +1014,7 @@ msgstr "Dodaj satove iz svijeta…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Svjetski satovi" msgstr "Svjetski satovi"
#: js/ui/dateMenu.js:225 #: js/ui/dateMenu.js:227
msgid "Weather" msgid "Weather"
msgstr "Vrijeme" msgstr "Vrijeme"
@@ -1022,7 +1022,7 @@ msgstr "Vrijeme"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:289 #: js/ui/dateMenu.js:291
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s cijeli dan." msgstr "%s cijeli dan."
@@ -1031,7 +1031,7 @@ msgstr "%s cijeli dan."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:295 #: js/ui/dateMenu.js:297
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, zatim %s kasnije." msgstr "%s, zatim %s kasnije."
@@ -1040,30 +1040,30 @@ msgstr "%s, zatim %s kasnije."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:301 #: js/ui/dateMenu.js:303
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, zatim %s, praćena s %s kasnije." msgstr "%s, zatim %s, praćena s %s kasnije."
#: js/ui/dateMenu.js:312 #: js/ui/dateMenu.js:314
msgid "Select a location…" msgid "Select a location…"
msgstr "Odaberi lokaciju…" msgstr "Odaberi lokaciju…"
#: js/ui/dateMenu.js:315 #: js/ui/dateMenu.js:317
msgid "Loading…" msgid "Loading…"
msgstr "Pretraživanje…" msgstr "Pretraživanje…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:321 #: js/ui/dateMenu.js:323
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Kao da je %s." msgstr "Kao da je %s."
#: js/ui/dateMenu.js:324 #: js/ui/dateMenu.js:326
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Posjetite za opširnije vremenske informacije" msgstr "Posjetite za opširnije vremenske informacije"
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:328
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Vremenske informacije su trenutno nedostupne" msgstr "Vremenske informacije su trenutno nedostupne"
@@ -1977,16 +1977,16 @@ msgstr "Suspendiraj"
msgid "Power Off" msgid "Power Off"
msgstr "Isključivanje" msgstr "Isključivanje"
#: js/ui/status/thunderbolt.js:272 #: js/ui/status/thunderbolt.js:294
msgid "Thunderbolt" msgid "Thunderbolt"
msgstr "Thunderbolt" msgstr "Thunderbolt"
#. we are done #. we are done
#: js/ui/status/thunderbolt.js:328 #: js/ui/status/thunderbolt.js:350
msgid "Unknown Thunderbolt device" msgid "Unknown Thunderbolt device"
msgstr "Nepoznati Thunderbolt uređaj" msgstr "Nepoznati Thunderbolt uređaj"
#: js/ui/status/thunderbolt.js:329 #: js/ui/status/thunderbolt.js:351
msgid "" msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "reconnect the device to start using it."
@@ -1994,14 +1994,14 @@ msgstr ""
"Otkriven je novi uređaj dok ste bili odsutni. Odspojite i ponovno spojite " "Otkriven je novi uređaj dok ste bili odsutni. Odspojite i ponovno spojite "
"uređaj kako bi ga mogli koristiti." "uređaj kako bi ga mogli koristiti."
#: js/ui/status/thunderbolt.js:334 #: js/ui/status/thunderbolt.js:356
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "Greška Thunderbolt ovjere" msgstr "Greška Thunderbolt odobravanja"
#: js/ui/status/thunderbolt.js:335 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
msgid "Could not authorize the thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Nemoguća ovjera Thunderbolt uređaja: %s" msgstr "Nemoguće odobravanje Thunderbolt uređaja: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128
msgid "Volume changed" msgid "Volume changed"

View File

@@ -15,22 +15,22 @@
# Georges Basile Stavracas Neto <georges.stavracas@gmail.com>, 2014. # Georges Basile Stavracas Neto <georges.stavracas@gmail.com>, 2014.
# Felipe Braga <fbobraga@gmail.com>, 2015. # Felipe Braga <fbobraga@gmail.com>, 2015.
# Artur de Aquino Morais <artur.morais93@outlook.com>, 2016. # Artur de Aquino Morais <artur.morais93@outlook.com>, 2016.
# Rafael Fontenelle <rafaelff@gnome.org>, 2013-2018. # Rafael Fontenelle <rafaelff@gnome.org>, 2013-2017.
# Enrico Nicoletto <liverig@gmail.com>, 2013-2018. # Enrico Nicoletto <liverig@gmail.com>, 2013-2018.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 18:31+0000\n" "POT-Creation-Date: 2018-03-16 21:34+0000\n"
"PO-Revision-Date: 2018-05-02 15:45-0200\n" "PO-Revision-Date: 2018-02-09 21:52-0200\n"
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n" "Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n" "Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n" "Language: pt_BR\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Virtaal 1.0.0-beta1\n" "X-Generator: Poedit 2.0.6\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
@@ -356,7 +356,7 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "Ocorreu um erro ao carregar o dialogo de preferências para %s:" msgstr "Ocorreu um erro ao carregar o dialogo de preferências para %s:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -642,7 +642,7 @@ msgstr "Negar acesso"
#: js/ui/accessDialog.js:64 js/ui/status/location.js:396 #: js/ui/accessDialog.js:64 js/ui/status/location.js:396
msgid "Grant Access" msgid "Grant Access"
msgstr "Conceder acesso" msgstr "Garantir acesso"
#: js/ui/appDisplay.js:793 #: js/ui/appDisplay.js:793
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
@@ -676,12 +676,12 @@ msgstr "Adicionar aos favoritos"
msgid "Show Details" msgid "Show Details"
msgstr "Mostrar detalhes" msgstr "Mostrar detalhes"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s foi adicionado aos seus favoritos." msgstr "%s foi adicionado aos seus favoritos."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s foi removido dos seus favoritos." msgstr "%s foi removido dos seus favoritos."
@@ -876,7 +876,7 @@ msgstr "Unidade externa desconectada"
msgid "Open with %s" msgid "Open with %s"
msgstr "Abrir com %s" msgstr "Abrir com %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Senha:" msgstr "Senha:"
@@ -964,15 +964,15 @@ msgstr "Uma senha é necessária para se conectar a “%s”."
msgid "Network Manager" msgid "Network Manager"
msgstr "Gerenciador de rede" msgstr "Gerenciador de rede"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Autenticação necessária" msgstr "Autenticação necessária"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Autenticação" msgstr "Autenticação"
@@ -980,7 +980,7 @@ msgstr "Autenticação"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Desculpe, isto não funcionou. Por favor, tente novamente." msgstr "Desculpe, isto não funcionou. Por favor, tente novamente."
@@ -1028,7 +1028,7 @@ msgstr "Adicionar relógios mundiais…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Relógios mundiais" msgstr "Relógios mundiais"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "Meteorologia" msgstr "Meteorologia"
@@ -1036,7 +1036,7 @@ msgstr "Meteorologia"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s por todo o dia." msgstr "%s por todo o dia."
@@ -1045,7 +1045,7 @@ msgstr "%s por todo o dia."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, depois %s mais tarde." msgstr "%s, depois %s mais tarde."
@@ -1054,30 +1054,30 @@ msgstr "%s, depois %s mais tarde."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, depois %s, seguido de %s mais tarde." msgstr "%s, depois %s, seguido de %s mais tarde."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Selecione uma localização…" msgstr "Selecione uma localização…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "Carregando…" msgstr "Carregando…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Sensação térmica de %s." msgstr "Sensação térmica de %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Conecte-se à internet para obter as informações meteorológicas" msgstr "Conecte-se à internet para obter as informações meteorológicas"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "No momento as informações meteorológicas não estão disponíveis" msgstr "No momento as informações meteorológicas não estão disponíveis"

View File

@@ -18,8 +18,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 18:31+0000\n" "POT-Creation-Date: 2018-04-12 11:47+0000\n"
"PO-Revision-Date: 2018-04-19 23:31+0300\n" "PO-Revision-Date: 2018-04-12 16:48+0300\n"
"Last-Translator: Stas Solovey <whats_up@tut.by>\n" "Last-Translator: Stas Solovey <whats_up@tut.by>\n"
"Language-Team: Русский <gnome-cyr@gnome.org>\n" "Language-Team: Русский <gnome-cyr@gnome.org>\n"
"Language: ru\n" "Language: ru\n"
@@ -344,7 +344,7 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "Возникла ошибка загрузки диалогового окна параметров для %s:" msgstr "Возникла ошибка загрузки диалогового окна параметров для %s:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:149
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -563,6 +563,7 @@ msgstr "Вчера, %H%M"
msgid "%A, %H%M" msgid "%A, %H%M"
msgstr "%A, %H%M" msgstr "%A, %H%M"
# fix даты "11 мар., 20:35"
#. Translators: this is the month name and day number #. Translators: this is the month name and day number
#. followed by a time string in 24h format. #. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" #. i.e. "May 25, 14:30"
@@ -571,6 +572,7 @@ msgstr "%A, %H%M"
msgid "%B %d, %H%M" msgid "%B %d, %H%M"
msgstr "%-d %B, %H%M" msgstr "%-d %B, %H%M"
# fix даты
#. Translators: this is the month name, day number, year #. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format. #. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" #. i.e. "May 25 2012, 14:30"
@@ -579,6 +581,7 @@ msgstr "%-d %B, %H%M"
msgid "%B %d %Y, %H%M" msgid "%B %d %Y, %H%M"
msgstr "%-d %B %Y, %H%M" msgstr "%-d %B %Y, %H%M"
# по всей видимости разрабы коммент перепутали c "Translators: Time in 12h format"
#. Translators: Time in 12h format #. Translators: Time in 12h format
#: js/misc/util.js:257 #: js/misc/util.js:257
msgid "%l%M %p" msgid "%l%M %p"
@@ -820,6 +823,7 @@ msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %-d %B" msgstr "%A, %-d %B"
# fix для даты в календаре и на экране блокировки
#: js/ui/calendar.js:868 #: js/ui/calendar.js:868
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
@@ -872,7 +876,7 @@ msgstr "Внешний диск отключён"
msgid "Open with %s" msgid "Open with %s"
msgstr "Открыть с помощью %s" msgstr "Открыть с помощью %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:285
msgid "Password:" msgid "Password:"
msgstr "Пароль:" msgstr "Пароль:"
@@ -959,15 +963,15 @@ msgstr "Для подключения к «%s» требуется пароль.
msgid "Network Manager" msgid "Network Manager"
msgstr "Диспетчер сети" msgstr "Диспетчер сети"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:44
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Требуется подтверждение подлинности" msgstr "Требуется подтверждение подлинности"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:72
msgid "Administrator" msgid "Administrator"
msgstr "Администратор" msgstr "Администратор"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:152
msgid "Authenticate" msgid "Authenticate"
msgstr "Подтвердить" msgstr "Подтвердить"
@@ -975,7 +979,7 @@ msgstr "Подтвердить"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:271 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Не удалось подтвердить подлинность. Попробуйте снова." msgstr "Не удалось подтвердить подлинность. Попробуйте снова."
@@ -1000,6 +1004,7 @@ msgstr "Показать приложения"
msgid "Dash" msgid "Dash"
msgstr "Панель приложений" msgstr "Панель приложений"
# fix для даты в календаре и на экране блокировки
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
@@ -1007,6 +1012,7 @@ msgstr "Панель приложений"
msgid "%B %e %Y" msgid "%B %e %Y"
msgstr "%-d %B %Y" msgstr "%-d %B %Y"
# fix для даты в календаре и на экране блокировки
#. Translators: This is the accessible name of the date button shown #. Translators: This is the accessible name of the date button shown
#. * below the time in the shell; it should combine the weekday and the #. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015". #. * date, e.g. "Tuesday February 17 2015".
@@ -1023,7 +1029,7 @@ msgstr "Добавить мировые часы…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Мировые часы" msgstr "Мировые часы"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "Погода" msgstr "Погода"
@@ -1031,7 +1037,7 @@ msgstr "Погода"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s весь день." msgstr "%s весь день."
@@ -1040,7 +1046,7 @@ msgstr "%s весь день."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, затем позднее %s." msgstr "%s, затем позднее %s."
@@ -1049,30 +1055,30 @@ msgstr "%s, затем позднее %s."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, затем %s, позже %s." msgstr "%s, затем %s, позже %s."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Выберите местоположение…" msgstr "Выберите местоположение…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "Загрузка…" msgstr "Загрузка…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Ощущается как %s." msgstr "Ощущается как %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Подключите интернет для получения информации о погоде" msgstr "Подключите интернет для получения информации о погоде"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Информация о погоде сейчас недоступна" msgstr "Информация о погоде сейчас недоступна"

View File

@@ -142,7 +142,7 @@ libst_gir = gnome.generate_gir(libst,
sources: st_gir_sources, sources: st_gir_sources,
nsversion: '1.0', nsversion: '1.0',
namespace: 'St', namespace: 'St',
includes: ['Clutter-' + mutter_api_version, 'Cally-' + mutter_api_version, 'Gtk-3.0'], includes: ['Clutter-' + mutter_api_version, 'Gtk-3.0'],
dependencies: [mutter_dep], dependencies: [mutter_dep],
include_directories: include_directories('..'), include_directories: include_directories('..'),
extra_args: ['-DST_COMPILATION', '--quiet'], extra_args: ['-DST_COMPILATION', '--quiet'],

View File

@@ -309,8 +309,7 @@ st_entry_style_changed (StWidget *self)
theme_node = st_widget_get_theme_node (self); theme_node = st_widget_get_theme_node (self);
st_theme_node_get_foreground_color (theme_node, &color); _st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node);
clutter_text_set_color (CLUTTER_TEXT (priv->entry), &color);
if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size)) if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size))
clutter_text_set_cursor_size (CLUTTER_TEXT (priv->entry), (int)(.5 + size)); clutter_text_set_cursor_size (CLUTTER_TEXT (priv->entry), (int)(.5 + size));

View File

@@ -180,7 +180,6 @@ st_label_dispose (GObject *object)
{ {
StLabelPrivate *priv = ST_LABEL (object)->priv; StLabelPrivate *priv = ST_LABEL (object)->priv;
priv->label = NULL;
g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref); g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
G_OBJECT_CLASS (st_label_parent_class)->dispose (object); G_OBJECT_CLASS (st_label_parent_class)->dispose (object);

View File

@@ -116,6 +116,7 @@ _st_set_text_from_style (ClutterText *text,
PangoAttrList *attribs = NULL; PangoAttrList *attribs = NULL;
const PangoFontDescription *font; const PangoFontDescription *font;
StTextAlign align; StTextAlign align;
gdouble spacing;
st_theme_node_get_foreground_color (theme_node, &color); st_theme_node_get_foreground_color (theme_node, &color);
clutter_text_set_color (text, &color); clutter_text_set_color (text, &color);
@@ -123,11 +124,11 @@ _st_set_text_from_style (ClutterText *text,
font = st_theme_node_get_font (theme_node); font = st_theme_node_get_font (theme_node);
clutter_text_set_font_description (text, (PangoFontDescription *) font); clutter_text_set_font_description (text, (PangoFontDescription *) font);
attribs = pango_attr_list_new ();
decoration = st_theme_node_get_text_decoration (theme_node); decoration = st_theme_node_get_text_decoration (theme_node);
if (decoration) if (decoration)
{ {
attribs = pango_attr_list_new ();
if (decoration & ST_TEXT_DECORATION_UNDERLINE) if (decoration & ST_TEXT_DECORATION_UNDERLINE)
{ {
PangoAttribute *underline = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); PangoAttribute *underline = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
@@ -143,6 +144,13 @@ _st_set_text_from_style (ClutterText *text,
*/ */
} }
spacing = st_theme_node_get_letter_spacing (theme_node);
if (spacing)
{
PangoAttribute *letter_spacing = pango_attr_letter_spacing_new ((int)(.5 + spacing) * PANGO_SCALE);
pango_attr_list_insert (attribs, letter_spacing);
}
clutter_text_set_attributes (text, attribs); clutter_text_set_attributes (text, attribs);
if (attribs) if (attribs)

View File

@@ -37,7 +37,6 @@ struct _StTextureCachePrivate
/* Things that were loaded with a cache policy != NONE */ /* Things that were loaded with a cache policy != NONE */
GHashTable *keyed_cache; /* char * -> CoglTexture* */ GHashTable *keyed_cache; /* char * -> CoglTexture* */
GHashTable *keyed_surface_cache; /* char * -> cairo_surface_t* */
/* Presently this is used to de-duplicate requests for GIcons and async URIs. */ /* Presently this is used to de-duplicate requests for GIcons and async URIs. */
GHashTable *outstanding_requests; /* char * -> AsyncTextureLoadData * */ GHashTable *outstanding_requests; /* char * -> AsyncTextureLoadData * */
@@ -146,10 +145,6 @@ st_texture_cache_init (StTextureCache *self)
self->priv->keyed_cache = g_hash_table_new_full (g_str_hash, g_str_equal, self->priv->keyed_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, cogl_object_unref); g_free, cogl_object_unref);
self->priv->keyed_surface_cache = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
(GDestroyNotify) cairo_surface_destroy);
self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal, self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL); g_free, NULL);
self->priv->file_monitors = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, self->priv->file_monitors = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal,
@@ -171,7 +166,6 @@ st_texture_cache_dispose (GObject *object)
} }
g_clear_pointer (&self->priv->keyed_cache, g_hash_table_destroy); g_clear_pointer (&self->priv->keyed_cache, g_hash_table_destroy);
g_clear_pointer (&self->priv->keyed_surface_cache, g_hash_table_destroy);
g_clear_pointer (&self->priv->outstanding_requests, g_hash_table_destroy); g_clear_pointer (&self->priv->outstanding_requests, g_hash_table_destroy);
g_clear_pointer (&self->priv->file_monitors, g_hash_table_destroy); g_clear_pointer (&self->priv->file_monitors, g_hash_table_destroy);
@@ -526,8 +520,6 @@ finish_texture_load (AsyncTextureLoadData *data,
goto out; goto out;
texdata = pixbuf_to_cogl_texture (pixbuf); texdata = pixbuf_to_cogl_texture (pixbuf);
if (!texdata)
goto out;
if (data->policy != ST_TEXTURE_CACHE_POLICY_NONE) if (data->policy != ST_TEXTURE_CACHE_POLICY_NONE)
{ {
@@ -994,7 +986,7 @@ file_changed_cb (GFileMonitor *monitor,
g_free (key); g_free (key);
key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", file_hash); key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", file_hash);
g_hash_table_remove (cache->priv->keyed_surface_cache, key); g_hash_table_remove (cache->priv->keyed_cache, key);
g_free (key); g_free (key);
g_signal_emit (cache, signals[TEXTURE_FILE_CHANGED], 0, file); g_signal_emit (cache, signals[TEXTURE_FILE_CHANGED], 0, file);
@@ -1281,9 +1273,6 @@ st_texture_cache_load_file_sync_to_cogl_texture (StTextureCache *cache,
texdata = pixbuf_to_cogl_texture (pixbuf); texdata = pixbuf_to_cogl_texture (pixbuf);
g_object_unref (pixbuf); g_object_unref (pixbuf);
if (!texdata)
goto out;
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER) if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
{ {
cogl_object_ref (texdata); cogl_object_ref (texdata);
@@ -1315,7 +1304,7 @@ st_texture_cache_load_file_sync_to_cairo_surface (StTextureCache *cache,
key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", g_file_hash (file)); key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", g_file_hash (file));
surface = g_hash_table_lookup (cache->priv->keyed_surface_cache, key); surface = g_hash_table_lookup (cache->priv->keyed_cache, key);
if (surface == NULL) if (surface == NULL)
{ {
@@ -1329,8 +1318,7 @@ st_texture_cache_load_file_sync_to_cairo_surface (StTextureCache *cache,
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER) if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
{ {
cairo_surface_reference (surface); cairo_surface_reference (surface);
g_hash_table_insert (cache->priv->keyed_surface_cache, g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), surface);
g_strdup (key), surface);
} }
} }
else else

View File

@@ -2545,6 +2545,28 @@ st_theme_node_get_text_align(StThemeNode *node)
return ST_TEXT_ALIGN_LEFT; return ST_TEXT_ALIGN_LEFT;
} }
/**
* st_theme_node_get_letter_spacing:
* @node: a #StThemeNode
*
* Gets the value for the letter-spacing style property, in pixels.
*
* Return value: the value of the letter-spacing property, if
* found, or zero if such property has not been found.
*/
gdouble
st_theme_node_get_letter_spacing (StThemeNode *node)
{
gdouble spacing = 0.;
g_return_val_if_fail (ST_IS_THEME_NODE (node), spacing);
ensure_properties (node);
st_theme_node_lookup_length (node, "letter-spacing", FALSE, &spacing);
return spacing;
}
static gboolean static gboolean
font_family_from_terms (CRTerm *term, font_family_from_terms (CRTerm *term,
char **family) char **family)

View File

@@ -223,6 +223,8 @@ StTextDecoration st_theme_node_get_text_decoration (StThemeNode *node);
StTextAlign st_theme_node_get_text_align (StThemeNode *node); StTextAlign st_theme_node_get_text_align (StThemeNode *node);
double st_theme_node_get_letter_spacing (StThemeNode *node);
/* Font rule processing is pretty complicated, so we just hardcode it /* Font rule processing is pretty complicated, so we just hardcode it
* under the standard font/font-family/font-size/etc names. This means * under the standard font/font-family/font-size/etc names. This means
* you can't have multiple separate styled fonts for a single item, * you can't have multiple separate styled fonts for a single item,