Compare commits
39 Commits
wip/carlos
...
3.33.2
Author | SHA1 | Date | |
---|---|---|---|
0ada312748 | |||
88697add1b | |||
4730b7a094 | |||
aa3e64aec3 | |||
af26e2b212 | |||
8167f20972 | |||
bd4aac8f49 | |||
785dd5c5f7 | |||
71e469a59c | |||
6d4b9d29b8 | |||
33f5bb39cd | |||
a1c3900630 | |||
cdaf164c01 | |||
2bd80579ed | |||
54039c3552 | |||
b197a1affb | |||
51655be6a3 | |||
9697c209c0 | |||
6ecb0a4546 | |||
30861d4800 | |||
a23391ea28 | |||
58e0b80cac | |||
41dd744b74 | |||
bdf66d7b62 | |||
4258ae3ec2 | |||
9b379c49ba | |||
7e70dd8453 | |||
2e209a82f9 | |||
ab0ecc469f | |||
7d75ddf635 | |||
271e43a1ed | |||
2702a82896 | |||
8ad33d8752 | |||
d84bbb8770 | |||
c0c2edf2e1 | |||
de0c3251dd | |||
0afd600ea4 | |||
598407b14a | |||
d9bfa16f05 |
@ -15,7 +15,7 @@ variables:
|
||||
- merge_requests
|
||||
|
||||
check_commit_log:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v1
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
stage: review
|
||||
variables:
|
||||
GIT_DEPTH: "100"
|
||||
@ -40,7 +40,7 @@ js_check:
|
||||
when: on_failure
|
||||
|
||||
build:
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
stage: build
|
||||
before_script:
|
||||
- .gitlab-ci/checkout-mutter.sh
|
||||
@ -58,7 +58,7 @@ build:
|
||||
- build
|
||||
|
||||
test:
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
stage: test
|
||||
before_script:
|
||||
- ninja -C mutter/build install
|
||||
@ -72,7 +72,7 @@ test:
|
||||
when: on_failure
|
||||
|
||||
test-pot:
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
stage: test
|
||||
before_script:
|
||||
- ninja -C mutter/build install
|
||||
|
@ -1,19 +0,0 @@
|
||||
FROM registry.gitlab.gnome.org/gnome/mutter/master:v1
|
||||
|
||||
RUN dnf -y update && dnf -y upgrade && \
|
||||
dnf install -y 'dnf-command(copr)' && \
|
||||
dnf copr enable -y fmuellner/gnome-shell-ci && \
|
||||
dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
|
||||
|
||||
# bt only exports HAVE_BLUETOOTH to js, rest are outdated build-requires
|
||||
dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel \
|
||||
upower-devel python3-devel && \
|
||||
|
||||
# We'll build mutter ourselves
|
||||
dnf remove -y --noautoremove mutter mutter-devel && \
|
||||
|
||||
# Needed for tests
|
||||
dnf install -y '*/xvfb-run' gdm-lib accountsservice-libs && \
|
||||
|
||||
dnf clean all && \
|
||||
rm -rf /var/cache/dnf
|
46
NEWS
46
NEWS
@ -1,3 +1,49 @@
|
||||
3.33.2
|
||||
======
|
||||
* Fix keeping actors visible in scrollviews [Marco; #1061]
|
||||
* Move some chrome above popup windows [Jonas D.; !358]
|
||||
* Include 'sandboxed-app-id' in winodw introspection info [Florian; #1289]
|
||||
* Port to libecal-2.0 [Milan; !501]
|
||||
* Support TCRYPT in mount password dialog [segfault; !126]
|
||||
* Misc. bug fixes and cleanups [Florian, Marco, Veerasamy; !517, #745, !499,
|
||||
!510, !515, !546, !549]
|
||||
|
||||
Contributors:
|
||||
Cosimo Cecchi, Milan Crha, Jonas Dreßler, Florian Müllner, segfault,
|
||||
Veerasamy Sevagen, Marco Trevisan (Treviño)
|
||||
|
||||
Translators:
|
||||
Daniel Mustieles [es]
|
||||
|
||||
3.33.1
|
||||
======
|
||||
* Refine the app menu [Florian; #968]
|
||||
* Refine window preview style [Feichtmeier; !461]
|
||||
* Only emit ::style-changed on actual changes [Carlos; #1153]
|
||||
* Disable emoji on-screen keyboard support on X11 [Florian; #1172]
|
||||
* Fix tablet button mapping overlay [Carlos; #1220]
|
||||
* Don't crash for world clock locations with no timezone [Florian; #1062]
|
||||
* Don't leak old on-screen keyboard layout groups [Carlos; mutter#556]
|
||||
* Fix ellipsization in dialog subtitles/bodies [Marco; !531]
|
||||
* Fix glitch of fullscreen window in workspace switch animation [Jonas D.; !322]
|
||||
* Fix distortion of some image contents [Florian; !525]
|
||||
* Allow dragging unfocused tiled/maximized windows from top bar [Dylan; #679290]
|
||||
* Handle network interface name changes [Fabrice; !534]
|
||||
* Avoid unnecessary style changes when computing :first/:last-child
|
||||
[Florian; !529]
|
||||
* Misc. bug fixes and cleanups [Florian, Marco, Robert, Georges, Carlos, Simon,
|
||||
Jonas D.; !487, !441, !502, !503, !504, !506, #822, !551, !512, !509, !511,
|
||||
#1054, !524, #1065, !331, !540]
|
||||
|
||||
Contributors:
|
||||
Fabrice Bellet, Jonas Dreßler, Feichtmeier, Carlos Garnacho, Robert Mader,
|
||||
Dylan McCall, Simon McVittie, Florian Müllner, Georges Basile Stavracas Neto,
|
||||
Marco Trevisan (Treviño)
|
||||
|
||||
Translators:
|
||||
Daniel Mustieles [es], Kukuh Syafaat [id], Fabio Tomat [fur],
|
||||
Carmen Bianca BAKKER [eo], Dingzhong Chen [zh_CN], Tim Sabsch [de]
|
||||
|
||||
3.32.1
|
||||
======
|
||||
* Fix avatar scaling on login screen [Florian; #1024]
|
||||
|
@ -382,7 +382,6 @@ StScrollBar {
|
||||
|
||||
.prompt-dialog-password-box {
|
||||
spacing: 1em;
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-error-label {
|
||||
@ -405,6 +404,23 @@ StScrollBar {
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.prompt-dialog-pim-box {
|
||||
spacing: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-grid {
|
||||
spacing-rows: 15px;
|
||||
spacing-columns: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-keyfiles-box {
|
||||
spacing: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-button.button {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
|
||||
/* Polkit Dialog */
|
||||
|
||||
|
@ -124,7 +124,7 @@ var Batch = class extends Task {
|
||||
}
|
||||
|
||||
process() {
|
||||
throw new Error('Not implemented');
|
||||
throw new GObject.NotImplementedError(`process in ${this.constructor.name}`);
|
||||
}
|
||||
|
||||
runTask() {
|
||||
|
@ -652,7 +652,7 @@ var LoginDialog = GObject.registerClass({
|
||||
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
|
||||
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
|
||||
|
||||
// figure out how tall it would like to be and try to accomodate
|
||||
// figure out how tall it would like to be and try to accommodate
|
||||
// but don't let it get too close to the logo
|
||||
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
|
||||
|
||||
|
@ -42,8 +42,6 @@ var IntrospectService = class {
|
||||
}
|
||||
|
||||
_isStandaloneApp(app) {
|
||||
let windows = app.get_windows();
|
||||
|
||||
return app.get_windows().some(w => w.transient_for == null);
|
||||
}
|
||||
|
||||
@ -55,6 +53,11 @@ var IntrospectService = class {
|
||||
return APP_WHITELIST.includes(sender);
|
||||
}
|
||||
|
||||
_getSandboxedAppId(app) {
|
||||
let ids = app.get_windows().map(w => w.get_sandboxed_app_id());
|
||||
return ids.find(id => id != null);
|
||||
}
|
||||
|
||||
_syncRunningApplications() {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
let apps = this._appSystem.get_running();
|
||||
@ -76,6 +79,10 @@ var IntrospectService = class {
|
||||
newActiveApplication = app.get_id();
|
||||
}
|
||||
|
||||
let sandboxedAppId = this._getSandboxedAppId(app);
|
||||
if (sandboxedAppId)
|
||||
appInfo['sandboxed-app-id'] = new GLib.Variant('s', sandboxedAppId);
|
||||
|
||||
newRunningApplications[app.get_id()] = appInfo;
|
||||
}
|
||||
|
||||
@ -137,6 +144,7 @@ var IntrospectService = class {
|
||||
let frameRect = window.get_frame_rect();
|
||||
let title = window.get_title();
|
||||
let wmClass = window.get_wm_class();
|
||||
let sandboxedAppId = window.get_sandboxed_app_id();
|
||||
|
||||
windowsList[windowId] = {
|
||||
'app-id': GLib.Variant.new('s', app.get_id()),
|
||||
@ -153,6 +161,10 @@ var IntrospectService = class {
|
||||
|
||||
if (wmClass != null)
|
||||
windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
|
||||
|
||||
if (sandboxedAppId != null)
|
||||
windowsList[windowId]['sandboxed-app-id'] =
|
||||
GLib.Variant.new('s', sandboxedAppId);
|
||||
}
|
||||
}
|
||||
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
|
||||
|
@ -88,42 +88,42 @@ const SystemActions = GObject.registerClass({
|
||||
name: C_("search-result", "Power Off"),
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||
keywords: _("power off;shutdown;reboot;restart").split(';'),
|
||||
keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(LOCK_SCREEN_ACTION_ID,
|
||||
{ // Translators: The name of the lock screen action in search
|
||||
name: C_("search-result", "Lock Screen"),
|
||||
iconName: 'system-lock-screen-symbolic',
|
||||
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
||||
keywords: _("lock screen").split(';'),
|
||||
keywords: _("lock screen").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(LOGOUT_ACTION_ID,
|
||||
{ // Translators: The name of the logout action in search
|
||||
name: C_("search-result", "Log Out"),
|
||||
iconName: 'application-exit-symbolic',
|
||||
// Translators: A list of keywords that match the logout action, separated by semicolons
|
||||
keywords: _("logout;sign off").split(';'),
|
||||
keywords: _("logout;log out;sign off").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(SUSPEND_ACTION_ID,
|
||||
{ // Translators: The name of the suspend action in search
|
||||
name: C_("search-result", "Suspend"),
|
||||
iconName: 'media-playback-pause-symbolic',
|
||||
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||
keywords: _("suspend;sleep").split(';'),
|
||||
keywords: _("suspend;sleep").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(SWITCH_USER_ACTION_ID,
|
||||
{ // Translators: The name of the switch user action in search
|
||||
name: C_("search-result", "Switch User"),
|
||||
iconName: 'system-switch-user-symbolic',
|
||||
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
||||
keywords: _("switch user").split(';'),
|
||||
keywords: _("switch user").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(LOCK_ORIENTATION_ACTION_ID,
|
||||
{ // Translators: The name of the lock orientation action in search
|
||||
name: C_("search-result", "Lock Orientation"),
|
||||
iconName: '',
|
||||
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
||||
keywords: _("lock orientation;screen;rotation").split(';'),
|
||||
keywords: _("lock orientation;screen;rotation").split(/[; ]/),
|
||||
available: false });
|
||||
|
||||
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||
@ -262,7 +262,7 @@ const SystemActions = GObject.registerClass({
|
||||
let results = [];
|
||||
|
||||
for (let [key, {available, keywords}] of this._actions)
|
||||
if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
|
||||
if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
|
||||
results.push(key);
|
||||
|
||||
return results;
|
||||
|
@ -474,12 +474,10 @@ var CyclerList = GObject.registerClass({
|
||||
}
|
||||
});
|
||||
|
||||
var CyclerPopup = GObject.registerClass(
|
||||
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
||||
var CyclerPopup = GObject.registerClass({
|
||||
GTypeFlags: GObject.TypeFlags.ABSTRACT
|
||||
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
||||
_init() {
|
||||
if (this.constructor.name === CyclerPopup.prototype.constructor.name)
|
||||
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||
|
||||
super._init();
|
||||
|
||||
this._items = this._getWindows();
|
||||
|
@ -414,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
|
||||
this._refilterApps();
|
||||
}
|
||||
|
||||
// Overriden from BaseAppView
|
||||
// Overridden from BaseAppView
|
||||
animate(animationDirection, onComplete) {
|
||||
this._scrollView.reactive = false;
|
||||
let completionFunc = () => {
|
||||
@ -1017,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView {
|
||||
Util.ensureActorVisibleInScrollView(this.actor, actor);
|
||||
}
|
||||
|
||||
// Overriden from BaseAppView
|
||||
// Overridden from BaseAppView
|
||||
animate(animationDirection) {
|
||||
this._grid.animatePulse(animationDirection);
|
||||
}
|
||||
@ -1081,7 +1081,7 @@ var FolderView = class FolderView extends BaseAppView {
|
||||
|
||||
let contentBox = this.actor.get_theme_node().get_content_box(pageBox);
|
||||
// We only can show icons inside the collection view boxPointer
|
||||
// so we have to substract the required padding etc of the boxpointer
|
||||
// so we have to subtract the required padding etc of the boxpointer
|
||||
return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide];
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@ const Mainloop = imports.mainloop;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
const GnomeSession = imports.misc.gnomeSession;
|
||||
const Main = imports.ui.main;
|
||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||
|
||||
var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
||||
@ -199,12 +200,20 @@ var AutomountManager = class {
|
||||
// error strings are not unique for the cases in the comments below.
|
||||
if (e.message.includes('No key available with this passphrase') || // cryptsetup
|
||||
e.message.includes('No key available to unlock device') || // udisks (no password)
|
||||
e.message.includes('Error unlocking')) { // udisks (wrong password)
|
||||
// libblockdev wrong password opening LUKS device
|
||||
e.message.includes('Failed to activate device: Incorrect passphrase') ||
|
||||
// cryptsetup returns EINVAL in many cases, including wrong TCRYPT password/parameters
|
||||
e.message.includes('Failed to load device\'s parameters: Invalid argument')) {
|
||||
|
||||
this._reaskPassword(volume);
|
||||
} else {
|
||||
if (e.message.includes('Compiled against a version of libcryptsetup that does not support the VeraCrypt PIM setting')) {
|
||||
Main.notifyError(_("Unable to unlock volume"),
|
||||
_("The installed udisks version does not support the PIM setting"));
|
||||
}
|
||||
|
||||
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
|
||||
log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
|
||||
|
||||
this._closeOperation(volume);
|
||||
}
|
||||
}
|
||||
|
@ -23,20 +23,8 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
|
||||
this._content = new Dialog.MessageDialogContent({ icon });
|
||||
this.contentLayout.add(this._content);
|
||||
|
||||
// FIXME: Why does this break now?
|
||||
/*
|
||||
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
|
||||
this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
|
||||
*/
|
||||
this.prompt.connect('notify::message', () => {
|
||||
this._content.title = this.prompt.message;
|
||||
});
|
||||
this._content.title = this.prompt.message;
|
||||
|
||||
this.prompt.connect('notify::description', () => {
|
||||
this._content.body = this.prompt.description;
|
||||
});
|
||||
this._content.body = this.prompt.description;
|
||||
|
||||
this._workSpinner = null;
|
||||
this._controlTable = null;
|
||||
|
@ -401,7 +401,7 @@ var ChatSource = class extends MessageTray.Source {
|
||||
if (this._client.is_handling_channel(this._channel)) {
|
||||
// We are handling the channel, try to pass it to Empathy or Polari
|
||||
// (depending on the channel type)
|
||||
// We don't check if either app is availble - mission control will
|
||||
// We don't check if either app is available - mission control will
|
||||
// fallback to something else if activation fails
|
||||
|
||||
let target;
|
||||
|
@ -899,7 +899,7 @@ var Dash = class Dash {
|
||||
favPos++;
|
||||
}
|
||||
|
||||
// No drag placeholder means we don't wan't to favorite the app
|
||||
// No drag placeholder means we don't want to favorite the app
|
||||
// and we are dragging it to its original position
|
||||
if (!this._dragPlaceholder)
|
||||
return true;
|
||||
|
@ -79,7 +79,7 @@ class BaseIcon extends St.Bin {
|
||||
// This can be overridden by a subclass, or by the createIcon
|
||||
// parameter to _init()
|
||||
createIcon(size) {
|
||||
throw new Error('no implementation of createIcon in ' + this);
|
||||
throw new GObject.NotImplementedError(`createIcon in ${this.constructor.name}`);
|
||||
}
|
||||
|
||||
setIconSize(size) {
|
||||
@ -416,7 +416,8 @@ var IconGrid = GObject.registerClass({
|
||||
|
||||
animatePulse(animationDirection) {
|
||||
if (animationDirection != AnimationDirection.IN)
|
||||
throw new Error("Pulse animation only implements 'in' animation direction");
|
||||
throw new GObject.NotImplementedError("Pulse animation only implements " +
|
||||
"'in' animation direction");
|
||||
|
||||
this._cancelAnimation();
|
||||
|
||||
@ -840,7 +841,7 @@ var PaginatedIconGrid = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
// Overriden from IconGrid
|
||||
// Overridden from IconGrid
|
||||
_getChildrenToAnimate() {
|
||||
let children = this._getVisibleChildren();
|
||||
let firstIndex = this._childrenPerPage * this.currentPage;
|
||||
|
@ -1144,6 +1144,7 @@ var Keyboard = class Keyboard {
|
||||
this._keyboardController.disconnect(this._keypadVisibleId);
|
||||
if (this._focusNotifyId)
|
||||
global.stage.disconnect(this._focusNotifyId);
|
||||
this._clearShowIdle();
|
||||
this._keyboard = null;
|
||||
this.actor.destroy();
|
||||
this.actor = null;
|
||||
@ -1162,7 +1163,7 @@ var Keyboard = class Keyboard {
|
||||
this._keyboardController = new KeyboardController();
|
||||
|
||||
this._groups = {};
|
||||
this._current_page = null;
|
||||
this._currentPage = null;
|
||||
|
||||
this._suggestions = new Suggestions();
|
||||
this.actor.add(this._suggestions.actor,
|
||||
@ -1229,6 +1230,7 @@ var Keyboard = class Keyboard {
|
||||
if (!this._showIdleId) {
|
||||
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
|
||||
this.show(Main.layoutManager.focusIndex);
|
||||
this._showIdleId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
|
||||
@ -1355,7 +1357,7 @@ var Keyboard = class Keyboard {
|
||||
} else if (switchToLevel == 1) {
|
||||
extraButton.connect('long-press', () => {
|
||||
this._latched = true;
|
||||
this._setCurrentLevelLatched(this._current_page, this._latched);
|
||||
this._setCurrentLevelLatched(this._currentPage, this._latched);
|
||||
});
|
||||
}
|
||||
|
||||
@ -1382,8 +1384,8 @@ var Keyboard = class Keyboard {
|
||||
}
|
||||
|
||||
_updateCurrentPageVisible() {
|
||||
if (this._current_page)
|
||||
this._current_page.visible = !this._emojiActive && !this._keypadVisible;
|
||||
if (this._currentPage)
|
||||
this._currentPage.visible = !this._emojiActive && !this._keypadVisible;
|
||||
}
|
||||
|
||||
_setEmojiActive(active) {
|
||||
@ -1442,7 +1444,7 @@ var Keyboard = class Keyboard {
|
||||
|
||||
_getGridSlots() {
|
||||
let numOfHorizSlots = 0, numOfVertSlots;
|
||||
let rows = this._current_page.get_children();
|
||||
let rows = this._currentPage.get_children();
|
||||
numOfVertSlots = rows.length;
|
||||
|
||||
for (let i = 0; i < rows.length; ++i) {
|
||||
@ -1519,13 +1521,24 @@ var Keyboard = class Keyboard {
|
||||
_setActiveLayer(activeLevel) {
|
||||
let activeGroupName = this._keyboardController.getCurrentGroup();
|
||||
let layers = this._groups[activeGroupName];
|
||||
let currentPage = layers[activeLevel];
|
||||
|
||||
if (this._current_page != null) {
|
||||
this._setCurrentLevelLatched(this._current_page, false);
|
||||
this._current_page.hide();
|
||||
if (this._currentPage == currentPage) {
|
||||
this._updateCurrentPageVisible();
|
||||
return;
|
||||
}
|
||||
|
||||
this._current_page = layers[activeLevel];
|
||||
if (this._currentPage != null) {
|
||||
this._setCurrentLevelLatched(this._currentPage, false);
|
||||
this._currentPage.disconnect(this._currentPage._destroyID);
|
||||
this._currentPage.hide();
|
||||
delete this._currentPage._destroyID;
|
||||
}
|
||||
|
||||
this._currentPage = currentPage;
|
||||
this._currentPage._destroyID = this._currentPage.connect('destroy', () => {
|
||||
this._currentPage = null;
|
||||
});
|
||||
this._updateCurrentPageVisible();
|
||||
}
|
||||
|
||||
@ -1613,18 +1626,6 @@ var Keyboard = class Keyboard {
|
||||
this.setCursorLocation(null);
|
||||
}
|
||||
|
||||
_hideSubkeys() {
|
||||
if (this._subkeysBoxPointer) {
|
||||
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
|
||||
this._subkeysBoxPointer = null;
|
||||
}
|
||||
if (this._capturedEventId) {
|
||||
this.actor.disconnect(this._capturedEventId);
|
||||
this._capturedEventId = 0;
|
||||
}
|
||||
this._capturedPress = false;
|
||||
}
|
||||
|
||||
resetSuggestions() {
|
||||
if (this._suggestions)
|
||||
this._suggestions.clear();
|
||||
|
@ -216,10 +216,17 @@ var LayoutManager = GObject.registerClass({
|
||||
this.uiGroup = new UiActor({ name: 'uiGroup' });
|
||||
this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
|
||||
|
||||
global.stage.add_child(this.uiGroup);
|
||||
|
||||
global.stage.remove_actor(global.window_group);
|
||||
this.uiGroup.add_actor(global.window_group);
|
||||
|
||||
global.stage.add_child(this.uiGroup);
|
||||
// Using addChrome() to add actors to uiGroup will position actors
|
||||
// underneath the top_window_group.
|
||||
// To insert actors at the top of uiGroup, we use addTopChrome() or
|
||||
// add the actor directly using uiGroup.add_actor().
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
|
||||
this.overviewGroup = new St.Widget({ name: 'overviewGroup',
|
||||
visible: false,
|
||||
@ -231,7 +238,7 @@ var LayoutManager = GObject.registerClass({
|
||||
clip_to_allocation: true,
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
});
|
||||
this.addChrome(this.screenShieldGroup);
|
||||
this.addTopChrome(this.screenShieldGroup);
|
||||
|
||||
this.panelBox = new St.BoxLayout({ name: 'panelBox',
|
||||
vertical: true });
|
||||
@ -247,7 +254,7 @@ var LayoutManager = GObject.registerClass({
|
||||
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
||||
reactive: true,
|
||||
track_hover: true });
|
||||
this.addChrome(this.keyboardBox);
|
||||
this.addTopChrome(this.keyboardBox);
|
||||
this._keyboardHeightNotifyId = 0;
|
||||
|
||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||
@ -255,9 +262,6 @@ var LayoutManager = GObject.registerClass({
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
|
||||
this.uiGroup.add_actor(this.dummyCursor);
|
||||
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
|
||||
let feedbackGroup = Meta.get_feedback_group_for_display(global.display);
|
||||
global.stage.remove_actor(feedbackGroup);
|
||||
this.uiGroup.add_actor(feedbackGroup);
|
||||
@ -802,6 +806,16 @@ var LayoutManager = GObject.registerClass({
|
||||
this._trackActor(actor, params);
|
||||
}
|
||||
|
||||
// addTopChrome:
|
||||
// @actor: an actor to add to the chrome
|
||||
// @params: (optional) additional params
|
||||
//
|
||||
// Like addChrome(), but adds @actor above all windows, including popups.
|
||||
addTopChrome(actor, params) {
|
||||
this.uiGroup.add_actor(actor);
|
||||
this._trackActor(actor, params);
|
||||
}
|
||||
|
||||
// trackChrome:
|
||||
// @actor: a descendant of the chrome to begin tracking
|
||||
// @params: parameters describing how to track @actor
|
||||
|
@ -1272,7 +1272,7 @@ var ZoomRegion = class ZoomRegion {
|
||||
|
||||
/**
|
||||
* getContrast:
|
||||
* Retreive the contrast of the magnified view.
|
||||
* Retrieve the contrast of the magnified view.
|
||||
* @return Object containing the contrast for the red, green,
|
||||
* and blue channels.
|
||||
*/
|
||||
|
@ -636,7 +636,7 @@ function _queueBeforeRedraw(workId) {
|
||||
* initialization as well, under the assumption that new actors
|
||||
* will need it.
|
||||
*
|
||||
* Returns: A string work identifer
|
||||
* Returns: A string work identifier
|
||||
*/
|
||||
function initializeDeferredWork(actor, callback, props) {
|
||||
// Turn into a string so we can use as an object property
|
||||
|
@ -224,10 +224,10 @@ var ModalDialog = class {
|
||||
// can be dismissed by a close call.
|
||||
//
|
||||
// The main point of this method is to give some indication to the user
|
||||
// that the dialog reponse has been acknowledged but will take a few
|
||||
// that the dialog response has been acknowledged but will take a few
|
||||
// moments before being processed.
|
||||
// e.g., if a user clicked "Log Out" then the dialog should go away
|
||||
// imediately, but the lightbox should remain until the logout is
|
||||
// immediately, but the lightbox should remain until the logout is
|
||||
// complete.
|
||||
_fadeOutDialog(timestamp) {
|
||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||
|
@ -122,7 +122,7 @@ var SlidingControl = class {
|
||||
}
|
||||
|
||||
_getSlide() {
|
||||
throw new Error('getSlide() must be overridden');
|
||||
throw new GObject.NotImplementedError(`_getSlide in ${this.constructor.name}`);
|
||||
}
|
||||
|
||||
_updateSlide() {
|
||||
|
@ -122,7 +122,7 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
|
||||
_updateDetailsVisibility() {
|
||||
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
||||
this._detailsItem.actor.visible = (sw != null);
|
||||
this._detailsItem.visible = (sw != null);
|
||||
}
|
||||
|
||||
isEmpty() {
|
||||
@ -160,7 +160,7 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
});
|
||||
});
|
||||
|
||||
this._newWindowItem.actor.visible =
|
||||
this._newWindowItem.visible =
|
||||
app && app.can_open_new_window() && !actions.includes('new-window');
|
||||
}
|
||||
|
||||
|
@ -51,49 +51,64 @@ function arrowIcon(side) {
|
||||
return arrow;
|
||||
}
|
||||
|
||||
var PopupBaseMenuItem = class {
|
||||
constructor(params) {
|
||||
var PopupBaseMenuItem = GObject.registerClass({
|
||||
Properties: {
|
||||
'active': GObject.ParamSpec.boolean('active', 'active', 'active',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
GObject.TYPE_BOOLEAN,
|
||||
false),
|
||||
'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
GObject.TYPE_BOOLEAN,
|
||||
true),
|
||||
},
|
||||
Signals: {
|
||||
'activate': { param_types: [Clutter.Event.$gtype] },
|
||||
}
|
||||
}, class PopupBaseMenuItem extends St.BoxLayout {
|
||||
_init(params) {
|
||||
params = Params.parse (params, { reactive: true,
|
||||
activate: true,
|
||||
hover: true,
|
||||
style_class: null,
|
||||
can_focus: true
|
||||
});
|
||||
|
||||
this.actor = new St.BoxLayout({ style_class: 'popup-menu-item',
|
||||
reactive: params.reactive,
|
||||
track_hover: params.reactive,
|
||||
can_focus: params.can_focus,
|
||||
accessible_role: Atk.Role.MENU_ITEM });
|
||||
this.actor._delegate = this;
|
||||
super._init({ style_class: 'popup-menu-item',
|
||||
reactive: params.reactive,
|
||||
track_hover: params.reactive,
|
||||
can_focus: params.can_focus,
|
||||
accessible_role: Atk.Role.MENU_ITEM });
|
||||
this._delegate = this;
|
||||
|
||||
this._ornament = Ornament.NONE;
|
||||
this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' });
|
||||
this.actor.add(this._ornamentLabel);
|
||||
this.add(this._ornamentLabel);
|
||||
|
||||
this._parent = null;
|
||||
this.active = false;
|
||||
this._active = false;
|
||||
this._activatable = params.reactive && params.activate;
|
||||
this._sensitive = true;
|
||||
|
||||
if (!this._activatable)
|
||||
this.actor.add_style_class_name('popup-inactive-menu-item');
|
||||
this.add_style_class_name('popup-inactive-menu-item');
|
||||
|
||||
if (params.style_class)
|
||||
this.actor.add_style_class_name(params.style_class);
|
||||
this.add_style_class_name(params.style_class);
|
||||
|
||||
if (this._activatable) {
|
||||
this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this));
|
||||
this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
|
||||
this.actor.connect('touch-event', this._onTouchEvent.bind(this));
|
||||
this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this));
|
||||
this.connect('button-press-event', this._onButtonPressEvent.bind(this));
|
||||
this.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
|
||||
this.connect('touch-event', this._onTouchEvent.bind(this));
|
||||
this.connect('key-press-event', this._onKeyPressEvent.bind(this));
|
||||
}
|
||||
if (params.reactive && params.hover)
|
||||
this.actor.connect('notify::hover', this._onHoverChanged.bind(this));
|
||||
this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE);
|
||||
}
|
||||
|
||||
this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this));
|
||||
this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this));
|
||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||
get actor() {
|
||||
/* This is kept for compatibility with current implementation, and we
|
||||
don't want to warn here yet since PopupMenu depends on this */
|
||||
return this;
|
||||
}
|
||||
|
||||
_getTopMenu() {
|
||||
@ -109,24 +124,24 @@ var PopupBaseMenuItem = class {
|
||||
|
||||
_onButtonPressEvent(actor, event) {
|
||||
// This is the CSS active state
|
||||
this.actor.add_style_pseudo_class ('active');
|
||||
this.add_style_pseudo_class('active');
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
_onButtonReleaseEvent(actor, event) {
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.activate(event);
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
_onTouchEvent(actor, event) {
|
||||
if (event.type() == Clutter.EventType.TOUCH_END) {
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.activate(event);
|
||||
return Clutter.EVENT_STOP;
|
||||
} else if (event.type() == Clutter.EventType.TOUCH_BEGIN) {
|
||||
// This is the CSS active state
|
||||
this.actor.add_style_pseudo_class ('active');
|
||||
this.add_style_pseudo_class('active');
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
@ -151,54 +166,56 @@ var PopupBaseMenuItem = class {
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
_onKeyFocusIn(actor) {
|
||||
this.setActive(true);
|
||||
vfunc_key_focus_in() {
|
||||
super.vfunc_key_focus_in();
|
||||
this.active = true;
|
||||
}
|
||||
|
||||
_onKeyFocusOut(actor) {
|
||||
this.setActive(false);
|
||||
}
|
||||
|
||||
_onHoverChanged(actor) {
|
||||
this.setActive(actor.hover);
|
||||
vfunc_key_focus_out() {
|
||||
super.vfunc_key_focus_out();
|
||||
this.active = false;
|
||||
}
|
||||
|
||||
activate(event) {
|
||||
this.emit('activate', event);
|
||||
}
|
||||
|
||||
setActive(active) {
|
||||
get active() {
|
||||
return this._active;
|
||||
}
|
||||
|
||||
set active(active) {
|
||||
let activeChanged = active != this.active;
|
||||
if (activeChanged) {
|
||||
this.active = active;
|
||||
this._active = active;
|
||||
if (active) {
|
||||
this.actor.add_style_class_name('selected');
|
||||
if (this.actor.can_focus)
|
||||
this.actor.grab_key_focus();
|
||||
this.add_style_class_name('selected');
|
||||
if (this.can_focus)
|
||||
this.grab_key_focus();
|
||||
} else {
|
||||
this.actor.remove_style_class_name('selected');
|
||||
this.remove_style_class_name('selected');
|
||||
// Remove the CSS active state if the user press the button and
|
||||
// while holding moves to another menu item, so we don't paint all items.
|
||||
// The correct behaviour would be to set the new item with the CSS
|
||||
// active state as well, but button-press-event is not trigered,
|
||||
// so we should track it in our own, which would involve some work
|
||||
// in the container
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
}
|
||||
this.emit('active-changed', active);
|
||||
this.notify('active');
|
||||
}
|
||||
}
|
||||
|
||||
syncSensitive() {
|
||||
let sensitive = this.getSensitive();
|
||||
this.actor.reactive = sensitive;
|
||||
this.actor.can_focus = sensitive;
|
||||
this.emit('sensitive-changed');
|
||||
let sensitive = this.sensitive;
|
||||
this.reactive = sensitive;
|
||||
this.can_focus = sensitive;
|
||||
this.notify('sensitive');
|
||||
return sensitive;
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
let parentSensitive = this._parent ? this._parent.getSensitive() : true;
|
||||
let parentSensitive = this._parent ? this._parent.sensitive : true;
|
||||
return this._activatable && this._sensitive && parentSensitive;
|
||||
}
|
||||
|
||||
@ -210,12 +227,12 @@ var PopupBaseMenuItem = class {
|
||||
this.syncSensitive();
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.actor.destroy();
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this.emit('destroy');
|
||||
set sensitive(sensitive) {
|
||||
this.setSensitive(sensitive);
|
||||
}
|
||||
|
||||
setOrnament(ornament) {
|
||||
@ -226,36 +243,38 @@ var PopupBaseMenuItem = class {
|
||||
|
||||
if (ornament == Ornament.DOT) {
|
||||
this._ornamentLabel.text = '\u2022';
|
||||
this.actor.add_accessible_state(Atk.StateType.CHECKED);
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
} else if (ornament == Ornament.CHECK) {
|
||||
this._ornamentLabel.text = '\u2713';
|
||||
this.actor.add_accessible_state(Atk.StateType.CHECKED);
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
} else if (ornament == Ornament.NONE) {
|
||||
this._ornamentLabel.text = '';
|
||||
this.actor.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
|
||||
});
|
||||
|
||||
var PopupMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, params) {
|
||||
super(params);
|
||||
var PopupMenuItem = GObject.registerClass(
|
||||
class PopupMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, params) {
|
||||
super._init(params);
|
||||
|
||||
this.label = new St.Label({ text: text });
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text) {
|
||||
super({ reactive: false,
|
||||
can_focus: false});
|
||||
|
||||
var PopupSeparatorMenuItem = GObject.registerClass(
|
||||
class PopupSeparatorMenuItem extends PopupBaseMenuItem {
|
||||
_init(text) {
|
||||
super._init({ reactive: false,
|
||||
can_focus: false });
|
||||
|
||||
this.label = new St.Label({ text: text || '' });
|
||||
this.actor.add(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
this.add(this.label);
|
||||
this.label_actor = this.label;
|
||||
|
||||
this.label.connect('notify::text',
|
||||
this._syncVisibility.bind(this));
|
||||
@ -264,75 +283,78 @@ var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
|
||||
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item',
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.actor.add(this._separator, { expand: true });
|
||||
this.add(this._separator, { expand: true });
|
||||
}
|
||||
|
||||
_syncVisibility() {
|
||||
this.label.visible = this.label.text != '';
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var Switch = class {
|
||||
constructor(state) {
|
||||
this.actor = new St.Bin({ style_class: 'toggle-switch',
|
||||
accessible_role: Atk.Role.CHECK_BOX,
|
||||
can_focus: true });
|
||||
var Switch = GObject.registerClass(
|
||||
class Switch extends St.Bin {
|
||||
_init(state) {
|
||||
super._init({ style_class: 'toggle-switch',
|
||||
accessible_role: Atk.Role.CHECK_BOX,
|
||||
can_focus: true });
|
||||
this.setToggleState(state);
|
||||
}
|
||||
|
||||
setToggleState(state) {
|
||||
if (state)
|
||||
this.actor.add_style_pseudo_class('checked');
|
||||
this.add_style_pseudo_class('checked');
|
||||
else
|
||||
this.actor.remove_style_pseudo_class('checked');
|
||||
this.remove_style_pseudo_class('checked');
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
toggle() {
|
||||
this.setToggleState(!this.state);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, active, params) {
|
||||
super(params);
|
||||
var PopupSwitchMenuItem = GObject.registerClass({
|
||||
Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, },
|
||||
},
|
||||
class PopupSwitchMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, active, params) {
|
||||
super._init(params);
|
||||
|
||||
this.label = new St.Label({ text: text });
|
||||
this._switch = new Switch(active);
|
||||
|
||||
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this.checkAccessibleState();
|
||||
this.actor.label_actor = this.label;
|
||||
this.label_actor = this.label;
|
||||
|
||||
this.actor.add_child(this.label);
|
||||
this.add_child(this.label);
|
||||
|
||||
this._statusBin = new St.Bin({ x_align: St.Align.END });
|
||||
this.actor.add(this._statusBin, { expand: true, x_align: St.Align.END });
|
||||
this.add(this._statusBin, { expand: true, x_align: St.Align.END });
|
||||
|
||||
this._statusLabel = new St.Label({ text: '',
|
||||
style_class: 'popup-status-menu-item'
|
||||
});
|
||||
this._statusBin.child = this._switch.actor;
|
||||
this._statusBin.child = this._switch;
|
||||
}
|
||||
|
||||
setStatus(text) {
|
||||
if (text != null) {
|
||||
this._statusLabel.text = text;
|
||||
this._statusBin.child = this._statusLabel;
|
||||
this.actor.reactive = false;
|
||||
this.actor.accessible_role = Atk.Role.MENU_ITEM;
|
||||
this.reactive = false;
|
||||
this.accessible_role = Atk.Role.MENU_ITEM;
|
||||
} else {
|
||||
this._statusBin.child = this._switch.actor;
|
||||
this.actor.reactive = true;
|
||||
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this._statusBin.child = this._switch;
|
||||
this.reactive = true;
|
||||
this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
}
|
||||
this.checkAccessibleState();
|
||||
}
|
||||
|
||||
activate(event) {
|
||||
if (this._switch.actor.mapped) {
|
||||
if (this._switch.mapped)
|
||||
this.toggle();
|
||||
}
|
||||
|
||||
// we allow pressing space to toggle the switch
|
||||
// without closing the menu
|
||||
@ -359,29 +381,30 @@ var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
|
||||
}
|
||||
|
||||
checkAccessibleState() {
|
||||
switch (this.actor.accessible_role) {
|
||||
switch (this.accessible_role) {
|
||||
case Atk.Role.CHECK_MENU_ITEM:
|
||||
if (this._switch.state)
|
||||
this.actor.add_accessible_state (Atk.StateType.CHECKED);
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
else
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
break;
|
||||
default:
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var PopupImageMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, icon, params) {
|
||||
super(params);
|
||||
var PopupImageMenuItem = GObject.registerClass(
|
||||
class PopupImageMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, icon, params) {
|
||||
super._init(params);
|
||||
|
||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon',
|
||||
x_align: Clutter.ActorAlign.END });
|
||||
this.actor.add_child(this._icon);
|
||||
this.add_child(this._icon);
|
||||
this.label = new St.Label({ text: text });
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label;
|
||||
|
||||
this.setIcon(icon);
|
||||
}
|
||||
@ -393,7 +416,7 @@ var PopupImageMenuItem = class extends PopupBaseMenuItem {
|
||||
else
|
||||
this._icon.icon_name = icon;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var PopupMenuBase = class {
|
||||
constructor(sourceActor, styleClass) {
|
||||
@ -437,13 +460,21 @@ var PopupMenuBase = class {
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
let parentSensitive = this._parent ? this._parent.getSensitive() : true;
|
||||
let parentSensitive = this._parent ? this._parent.sensitive : true;
|
||||
return this._sensitive && parentSensitive;
|
||||
}
|
||||
|
||||
setSensitive(sensitive) {
|
||||
this._sensitive = sensitive;
|
||||
this.emit('sensitive-changed');
|
||||
this.emit('notify::sensitive');
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
set sensitive(sensitive) {
|
||||
this.setSensitive(sensitive);
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
@ -479,7 +510,7 @@ var PopupMenuBase = class {
|
||||
app.activate();
|
||||
});
|
||||
|
||||
menuItem.actor.visible = Main.sessionMode.allowSettings;
|
||||
menuItem.visible = Main.sessionMode.allowSettings;
|
||||
this._settingsActions[desktopFile] = menuItem;
|
||||
|
||||
return menuItem;
|
||||
@ -488,7 +519,7 @@ var PopupMenuBase = class {
|
||||
_setSettingsVisibility(visible) {
|
||||
for (let id in this._settingsActions) {
|
||||
let item = this._settingsActions[id];
|
||||
item.actor.visible = visible;
|
||||
item.visible = visible;
|
||||
}
|
||||
}
|
||||
|
||||
@ -511,16 +542,17 @@ var PopupMenuBase = class {
|
||||
|
||||
_subMenuActiveChanged(submenu, submenuItem) {
|
||||
if (this._activeMenuItem && this._activeMenuItem != submenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem.active = false;
|
||||
this._activeMenuItem = submenuItem;
|
||||
this.emit('active-changed', submenuItem);
|
||||
}
|
||||
|
||||
_connectItemSignals(menuItem) {
|
||||
menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
|
||||
menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => {
|
||||
let active = menuItem.active;
|
||||
if (active && this._activeMenuItem != menuItem) {
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem.active = false;
|
||||
this._activeMenuItem = menuItem;
|
||||
this.emit('active-changed', menuItem);
|
||||
} else if (!active && this._activeMenuItem == menuItem) {
|
||||
@ -528,8 +560,8 @@ var PopupMenuBase = class {
|
||||
this.emit('active-changed', null);
|
||||
}
|
||||
});
|
||||
menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => {
|
||||
let sensitive = menuItem.getSensitive();
|
||||
menuItem._sensitiveChangeId = menuItem.connect('notify::sensitive', () => {
|
||||
let sensitive = menuItem.sensitive;
|
||||
if (!sensitive && this._activeMenuItem == menuItem) {
|
||||
if (!this.actor.navigate_focus(menuItem.actor,
|
||||
St.DirectionType.TAB_FORWARD,
|
||||
@ -545,7 +577,7 @@ var PopupMenuBase = class {
|
||||
this.itemActivated(BoxPointer.PopupAnimation.FULL);
|
||||
});
|
||||
|
||||
menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', () => {
|
||||
menuItem._parentSensitiveChangeId = this.connect('notify::sensitive', () => {
|
||||
menuItem.syncSensitive();
|
||||
});
|
||||
|
||||
@ -597,7 +629,7 @@ var PopupMenuBase = class {
|
||||
return;
|
||||
}
|
||||
|
||||
menuItem.actor.show();
|
||||
menuItem.show();
|
||||
}
|
||||
|
||||
moveMenuItem(menuItem, position) {
|
||||
@ -644,8 +676,8 @@ var PopupMenuBase = class {
|
||||
let parentClosingId = this.connect('menu-closed', () => {
|
||||
menuItem.emit('menu-closed');
|
||||
});
|
||||
let subMenuSensitiveChangedId = this.connect('sensitive-changed', () => {
|
||||
menuItem.emit('sensitive-changed');
|
||||
let subMenuSensitiveChangedId = this.connect('notify::sensitive', () => {
|
||||
menuItem.emit('notify::sensitive');
|
||||
});
|
||||
|
||||
menuItem.connect('destroy', () => {
|
||||
@ -851,7 +883,7 @@ var PopupMenu = class extends PopupMenuBase {
|
||||
|
||||
close(animate) {
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem.active = false;
|
||||
|
||||
if (this._boxPointer.visible) {
|
||||
this._boxPointer.close(animate, () => {
|
||||
@ -884,6 +916,10 @@ var PopupDummyMenu = class {
|
||||
return true;
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
open() { this.emit('open-state-changed', true); }
|
||||
close() { this.emit('open-state-changed', false); }
|
||||
toggle() {}
|
||||
@ -923,7 +959,11 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
return this._sensitive && this.sourceActor._delegate.getSensitive();
|
||||
return this._sensitive && this.sourceActor.sensitive;
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
open(animate) {
|
||||
@ -990,7 +1030,7 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
this.emit('open-state-changed', false);
|
||||
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem.active = false;
|
||||
|
||||
if (animate && this._needsScrollbar())
|
||||
animate = false;
|
||||
@ -1022,7 +1062,7 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
|
||||
if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
|
||||
this.close(BoxPointer.PopupAnimation.FULL);
|
||||
this.sourceActor._delegate.setActive(true);
|
||||
this.sourceActor._delegate.active = true;
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
@ -1053,25 +1093,26 @@ var PopupMenuSection = class extends PopupMenuBase {
|
||||
close() { this.emit('open-state-changed', false); }
|
||||
};
|
||||
|
||||
var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, wantIcon) {
|
||||
super();
|
||||
var PopupSubMenuMenuItem = GObject.registerClass(
|
||||
class PopupSubMenuMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, wantIcon) {
|
||||
super._init();
|
||||
|
||||
this.actor.add_style_class_name('popup-submenu-menu-item');
|
||||
this.add_style_class_name('popup-submenu-menu-item');
|
||||
|
||||
if (wantIcon) {
|
||||
this.icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
this.actor.add_child(this.icon);
|
||||
this.add_child(this.icon);
|
||||
}
|
||||
|
||||
this.label = new St.Label({ text: text,
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label;
|
||||
|
||||
let expander = new St.Bin({ style_class: 'popup-menu-item-expander' });
|
||||
this.actor.add(expander, { expand: true });
|
||||
this.add(expander, { expand: true });
|
||||
|
||||
this._triangle = arrowIcon(St.Side.RIGHT);
|
||||
this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 });
|
||||
@ -1080,11 +1121,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this._triangleBin.add_child(this._triangle);
|
||||
|
||||
this.actor.add_child(this._triangleBin);
|
||||
this.actor.add_accessible_state (Atk.StateType.EXPANDABLE);
|
||||
this.add_child(this._triangleBin);
|
||||
this.add_accessible_state(Atk.StateType.EXPANDABLE);
|
||||
|
||||
this.menu = new PopupSubMenu(this.actor, this._triangle);
|
||||
this.menu = new PopupSubMenu(this, this._triangle);
|
||||
this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
|
||||
this.connect('destroy', () => { this.menu.destroy(); });
|
||||
}
|
||||
|
||||
_setParent(parent) {
|
||||
@ -1101,24 +1143,18 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
|
||||
_subMenuOpenStateChanged(menu, open) {
|
||||
if (open) {
|
||||
this.actor.add_style_pseudo_class('open');
|
||||
this.add_style_pseudo_class('open');
|
||||
this._getTopMenu()._setOpenedSubMenu(this.menu);
|
||||
this.actor.add_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.actor.add_style_pseudo_class('checked');
|
||||
this.add_accessible_state(Atk.StateType.EXPANDED);
|
||||
this.add_style_pseudo_class('checked');
|
||||
} else {
|
||||
this.actor.remove_style_pseudo_class('open');
|
||||
this.remove_style_pseudo_class('open');
|
||||
this._getTopMenu()._setOpenedSubMenu(null);
|
||||
this.actor.remove_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.actor.remove_style_pseudo_class('checked');
|
||||
this.remove_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.remove_style_pseudo_class('checked');
|
||||
}
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.menu.destroy();
|
||||
|
||||
super.destroy();
|
||||
}
|
||||
|
||||
setSubmenuShown(open) {
|
||||
if (open)
|
||||
this.menu.open(BoxPointer.PopupAnimation.FULL);
|
||||
@ -1156,7 +1192,7 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
_onButtonReleaseEvent(actor) {
|
||||
// Since we override the parent, we need to manage what the parent does
|
||||
// with the active style class
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
this._setOpenState(!this._getOpenState());
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
@ -1165,12 +1201,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
if (event.type() == Clutter.EventType.TOUCH_END) {
|
||||
// Since we override the parent, we need to manage what the parent does
|
||||
// with the active style class
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
this._setOpenState(!this._getOpenState());
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
/* Basic implementation of a menu manager.
|
||||
* Call addMenu to add menus
|
||||
|
@ -3,6 +3,7 @@
|
||||
const { Clutter, Gio, GLib, Pango, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
const CheckBox = imports.ui.checkBox;
|
||||
const Dialog = imports.ui.dialog;
|
||||
const Main = imports.ui.main;
|
||||
@ -14,6 +15,7 @@ const ShellEntry = imports.ui.shellEntry;
|
||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||
|
||||
var LIST_ITEM_ICON_SIZE = 48;
|
||||
var WORK_SPINNER_ICON_SIZE = 16;
|
||||
|
||||
const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password';
|
||||
|
||||
@ -148,7 +150,7 @@ var ShellMountOperation = class {
|
||||
}
|
||||
|
||||
this._dialogId = this._dialog.connect('response',
|
||||
(object, choice, password, remember) => {
|
||||
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
|
||||
if (choice == -1) {
|
||||
this.mountOp.reply(Gio.MountOperationResult.ABORTED);
|
||||
} else {
|
||||
@ -158,6 +160,9 @@ var ShellMountOperation = class {
|
||||
this.mountOp.set_password_save(Gio.PasswordSave.NEVER);
|
||||
|
||||
this.mountOp.set_password(password);
|
||||
this.mountOp.set_is_tcrypt_hidden_volume(hiddenVolume);
|
||||
this.mountOp.set_is_tcrypt_system_volume(systemVolume);
|
||||
this.mountOp.set_pim(pim);
|
||||
this.mountOp.reply(Gio.MountOperationResult.HANDLED);
|
||||
}
|
||||
});
|
||||
@ -286,24 +291,91 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
|
||||
let body = strings.shift() || null;
|
||||
super({ styleClass: 'prompt-dialog' });
|
||||
|
||||
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
|
||||
|
||||
let content = new Dialog.MessageDialogContent({ icon, title, body });
|
||||
this.contentLayout.add_actor(content);
|
||||
content._body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
|
||||
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
||||
content.messageBox.add(this._passwordBox);
|
||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||
let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
|
||||
layout_manager: layout });
|
||||
layout.hookup_style(grid);
|
||||
let rtl = grid.get_text_direction() === Clutter.TextDirection.RTL;
|
||||
|
||||
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label',
|
||||
text: _("Password") }));
|
||||
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
|
||||
if (flags & Gio.AskPasswordFlags.TCRYPT) {
|
||||
this._keyfilesLabel = new St.Label(({ style_class: 'prompt-dialog-keyfiles-label',
|
||||
visible: false }));
|
||||
|
||||
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
|
||||
content.messageBox.add(this._hiddenVolume.actor);
|
||||
|
||||
this._systemVolume = new CheckBox.CheckBox(_("Windows System Volume"));
|
||||
content.messageBox.add(this._systemVolume.actor);
|
||||
|
||||
this._keyfilesCheckbox = new CheckBox.CheckBox(_("Uses Keyfiles"));
|
||||
this._keyfilesCheckbox.actor.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
|
||||
content.messageBox.add(this._keyfilesCheckbox.actor);
|
||||
|
||||
this._keyfilesLabel.clutter_text.set_markup(
|
||||
/* Translators: %s is the Disks application */
|
||||
_("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
|
||||
);
|
||||
this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
this._keyfilesLabel.clutter_text.line_wrap = true;
|
||||
content.messageBox.add(this._keyfilesLabel, { y_fill: false, y_align: St.Align.MIDDLE, expand: true });
|
||||
|
||||
this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
||||
text: _("PIM Number"),
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this._pimEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||
can_focus: true,
|
||||
x_expand: true });
|
||||
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||
this._pimEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
||||
ShellEntry.addContextMenu(this._pimEntry, { isPassword: true });
|
||||
|
||||
if (rtl) {
|
||||
layout.attach(this._pimEntry, 0, 0, 1, 1);
|
||||
layout.attach(this._pimLabel, 1, 0, 1, 1);
|
||||
} else {
|
||||
layout.attach(this._pimLabel, 0, 0, 1, 1);
|
||||
layout.attach(this._pimEntry, 1, 0, 1, 1);
|
||||
}
|
||||
|
||||
this._pimErrorMessageLabel = new St.Label({ style_class: 'prompt-dialog-password-entry',
|
||||
text: _("The PIM must be a number or empty."),
|
||||
visible: false });
|
||||
layout.attach(this._pimErrorMessageLabel, 0, 2, 2, 1);
|
||||
} else {
|
||||
this._hiddenVolume = null;
|
||||
this._systemVolume = null;
|
||||
this._pimEntry = null;
|
||||
this._pimErrorMessageLabel = null;
|
||||
}
|
||||
|
||||
this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
||||
text: _("Password"),
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||
text: "",
|
||||
can_focus: true});
|
||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
||||
can_focus: true,
|
||||
x_expand: true });
|
||||
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
||||
this._passwordBox.add(this._passwordEntry, {expand: true });
|
||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
||||
this.setInitialKeyFocus(this._passwordEntry);
|
||||
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true);
|
||||
this._passwordEntry.secondary_icon = this._workSpinner.actor;
|
||||
|
||||
if (rtl) {
|
||||
layout.attach(this._passwordEntry, 0, 1, 1, 1);
|
||||
layout.attach(this._passwordLabel, 1, 1, 1, 1);
|
||||
} else {
|
||||
layout.attach(this._passwordLabel, 0, 1, 1, 1);
|
||||
layout.attach(this._passwordEntry, 1, 1, 1, 1);
|
||||
}
|
||||
|
||||
content.messageBox.add(grid);
|
||||
|
||||
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
|
||||
text: _("Sorry, that didn’t work. Please try again.") });
|
||||
@ -313,8 +385,7 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
|
||||
content.messageBox.add(this._errorMessageLabel);
|
||||
|
||||
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
|
||||
this._rememberChoice = new CheckBox.CheckBox();
|
||||
this._rememberChoice.getLabelActor().text = _("Remember Password");
|
||||
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
|
||||
this._rememberChoice.actor.checked =
|
||||
global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY);
|
||||
content.messageBox.add(this._rememberChoice.actor);
|
||||
@ -322,21 +393,32 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
|
||||
this._rememberChoice = null;
|
||||
}
|
||||
|
||||
let buttons = [{ label: _("Cancel"),
|
||||
action: this._onCancelButton.bind(this),
|
||||
key: Clutter.Escape
|
||||
},
|
||||
{ label: _("Unlock"),
|
||||
action: this._onUnlockButton.bind(this),
|
||||
default: true
|
||||
}];
|
||||
this._defaultButtons = [{ label: _("Cancel"),
|
||||
action: this._onCancelButton.bind(this),
|
||||
key: Clutter.Escape
|
||||
},
|
||||
{ label: _("Unlock"),
|
||||
action: this._onUnlockButton.bind(this),
|
||||
default: true
|
||||
}];
|
||||
|
||||
this.setButtons(buttons);
|
||||
this._usesKeyfilesButtons = [{ label: _("Cancel"),
|
||||
action: this._onCancelButton.bind(this),
|
||||
key: Clutter.Escape
|
||||
},
|
||||
{ /* Translators: %s is the Disks application */
|
||||
label: _("Open %s").format(disksApp.get_name()),
|
||||
action: this._onOpenDisksButton.bind(this),
|
||||
default: true
|
||||
}];
|
||||
|
||||
this.setButtons(this._defaultButtons);
|
||||
}
|
||||
|
||||
reaskPassword() {
|
||||
this._passwordEntry.set_text('');
|
||||
this._errorMessageLabel.show();
|
||||
this._workSpinner.stop();
|
||||
}
|
||||
|
||||
_onCancelButton() {
|
||||
@ -348,12 +430,60 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
|
||||
}
|
||||
|
||||
_onEntryActivate() {
|
||||
let pim = 0;
|
||||
if (this._pimEntry !== null)
|
||||
pim = this._pimEntry.get_text();
|
||||
if (isNaN(pim)) {
|
||||
this._pimEntry.set_text('');
|
||||
this._pimErrorMessageLabel.show();
|
||||
return;
|
||||
} else if (this._pimErrorMessageLabel !== null) {
|
||||
this._pimErrorMessageLabel.hide();
|
||||
}
|
||||
|
||||
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
|
||||
this._rememberChoice && this._rememberChoice.actor.checked);
|
||||
|
||||
this._workSpinner.play();
|
||||
this.emit('response', 1,
|
||||
this._passwordEntry.get_text(),
|
||||
this._rememberChoice &&
|
||||
this._rememberChoice.actor.checked);
|
||||
this._rememberChoice.actor.checked,
|
||||
this._hiddenVolume &&
|
||||
this._hiddenVolume.actor.checked,
|
||||
this._systemVolume &&
|
||||
this._systemVolume.actor.checked,
|
||||
pim);
|
||||
}
|
||||
|
||||
_onKeyfilesCheckboxClicked() {
|
||||
let useKeyfiles = this._keyfilesCheckbox.actor.checked;
|
||||
this._passwordEntry.reactive = !useKeyfiles;
|
||||
this._passwordEntry.can_focus = !useKeyfiles;
|
||||
this._passwordEntry.clutter_text.editable = !useKeyfiles;
|
||||
this._passwordEntry.clutter_text.selectable = !useKeyfiles;
|
||||
this._pimEntry.reactive = !useKeyfiles;
|
||||
this._pimEntry.can_focus = !useKeyfiles;
|
||||
this._pimEntry.clutter_text.editable = !useKeyfiles;
|
||||
this._pimEntry.clutter_text.selectable = !useKeyfiles;
|
||||
this._rememberChoice.actor.reactive = !useKeyfiles;
|
||||
this._rememberChoice.actor.can_focus = !useKeyfiles;
|
||||
this._keyfilesLabel.visible = useKeyfiles;
|
||||
this.setButtons(useKeyfiles ? this._usesKeyfilesButtons : this._defaultButtons);
|
||||
}
|
||||
|
||||
_onOpenDisksButton() {
|
||||
let app = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
|
||||
if (app)
|
||||
app.activate();
|
||||
else
|
||||
Main.notifyError(
|
||||
/* Translators: %s is the Disks application */
|
||||
_("Unable to start %s").format(app.get_name()),
|
||||
/* Translators: %s is the Disks application */
|
||||
_("Couldn't find the %s application").format(app.get_name())
|
||||
);
|
||||
this._onCancelButton();
|
||||
}
|
||||
};
|
||||
|
||||
@ -515,7 +645,7 @@ var GnomeShellMountOpHandler = class {
|
||||
|
||||
this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags);
|
||||
this._dialog.connect('response',
|
||||
(object, choice, password, remember) => {
|
||||
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
|
||||
let details = {};
|
||||
let response;
|
||||
|
||||
@ -527,6 +657,9 @@ var GnomeShellMountOpHandler = class {
|
||||
let passSave = remember ? Gio.PasswordSave.PERMANENTLY : Gio.PasswordSave.NEVER;
|
||||
details['password_save'] = GLib.Variant.new('u', passSave);
|
||||
details['password'] = GLib.Variant.new('s', password);
|
||||
details['hidden_volume'] = GLib.Variant.new('b', hiddenVolume);
|
||||
details['system_volume'] = GLib.Variant.new('b', systemVolume);
|
||||
details['pim'] = GLib.Variant.new('u', parseInt(pim));
|
||||
}
|
||||
|
||||
this._clearCurrentRequest(response, details);
|
||||
|
@ -118,9 +118,9 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
// Remember if there were setup devices and show the menu
|
||||
// if we've seen setup devices and we're not hard blocked
|
||||
if (nDevices > 0)
|
||||
this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode;
|
||||
this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode;
|
||||
else
|
||||
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
|
||||
if (nConnectedDevices > 0)
|
||||
/* Translators: this is the number of connected bluetooth devices */
|
||||
|
@ -37,12 +37,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
let icon = new St.Icon({ icon_name: 'display-brightness-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._item.actor.add(icon);
|
||||
this._item.actor.add(this._slider.actor, { expand: true });
|
||||
this._item.actor.connect('button-press-event', (actor, event) => {
|
||||
this._item.add(icon);
|
||||
this._item.add(this._slider.actor, { expand: true });
|
||||
this._item.connect('button-press-event', (actor, event) => {
|
||||
return this._slider.startDragging(event);
|
||||
});
|
||||
this._item.actor.connect('key-press-event', (actor, event) => {
|
||||
this._item.connect('key-press-event', (actor, event) => {
|
||||
return this._slider.onKeyPressEvent(actor, event);
|
||||
});
|
||||
|
||||
@ -55,7 +55,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
_sync() {
|
||||
let visible = this._proxy.Brightness >= 0;
|
||||
this._item.actor.visible = visible;
|
||||
this._item.visible = visible;
|
||||
if (visible)
|
||||
this._slider.setValue(this._proxy.Brightness / 100.0);
|
||||
}
|
||||
|
@ -15,17 +15,18 @@ const Util = imports.misc.util;
|
||||
const INPUT_SOURCE_TYPE_XKB = 'xkb';
|
||||
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
|
||||
|
||||
var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem {
|
||||
constructor(displayName, shortName) {
|
||||
super();
|
||||
var LayoutMenuItem = GObject.registerClass(
|
||||
class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
_init(displayName, shortName) {
|
||||
super._init();
|
||||
|
||||
this.label = new St.Label({ text: displayName });
|
||||
this.indicator = new St.Label({ text: shortName });
|
||||
this.actor.add(this.label, { expand: true });
|
||||
this.actor.add(this.indicator);
|
||||
this.actor.label_actor = this.label;
|
||||
this.add(this.label, { expand: true });
|
||||
this.add(this.indicator);
|
||||
this.label_actor = this.label;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var InputSource = class {
|
||||
constructor(type, id, displayName, shortName, index) {
|
||||
@ -857,7 +858,7 @@ class InputSourceIndicator extends PanelMenu.Button {
|
||||
// but at least for now it is used as "allow popping up windows
|
||||
// from shell menus"; we can always add a separate sessionMode
|
||||
// option if need arises.
|
||||
this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings;
|
||||
this._showLayoutItem.visible = Main.sessionMode.allowSettings;
|
||||
}
|
||||
|
||||
_sourcesChanged() {
|
||||
|
@ -101,12 +101,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
_syncIndicator() {
|
||||
if (this._managerProxy == null) {
|
||||
this._indicator.visible = false;
|
||||
this._item.actor.visible = false;
|
||||
this._item.visible = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._indicator.visible = this._managerProxy.InUse;
|
||||
this._item.actor.visible = this._indicator.visible;
|
||||
this._item.visible = this._indicator.visible;
|
||||
this._updateMenuLabels();
|
||||
}
|
||||
|
||||
|
@ -235,14 +235,14 @@ var NMConnectionSection = class NMConnectionSection {
|
||||
if (!this._connectionValid(connection))
|
||||
return;
|
||||
|
||||
// This function is called everytime connection is added or updated
|
||||
// This function is called every time the connection is added or updated.
|
||||
// In the usual case, we already added this connection and UUID
|
||||
// didn't change. So we need to check if we already have an item,
|
||||
// and update it for properties in the connection that changed
|
||||
// (the only one we care about is the name)
|
||||
// But it's also possible we didn't know about this connection
|
||||
// (eg, during coldplug, or because it was updated and suddenly
|
||||
// it's valid for this device), in which case we add a new item
|
||||
// it's valid for this device), in which case we add a new item.
|
||||
|
||||
let item = this._connectionItems.get(connection.get_uuid());
|
||||
if (item)
|
||||
@ -389,8 +389,8 @@ var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection {
|
||||
|
||||
_sync() {
|
||||
let nItems = this._connectionItems.size;
|
||||
this._autoConnectItem.actor.visible = (nItems == 0);
|
||||
this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
|
||||
this._autoConnectItem.visible = (nItems == 0);
|
||||
this._deactivateItem.visible = this._device.state > NM.DeviceState.DISCONNECTED;
|
||||
|
||||
if (this._activeConnection == null) {
|
||||
let activeConnection = this._device.active_connection;
|
||||
@ -477,7 +477,7 @@ var NMDeviceWired = class extends NMConnectionDevice {
|
||||
}
|
||||
|
||||
_sync() {
|
||||
this.item.actor.visible = this._hasCarrier();
|
||||
this.item.visible = this._hasCarrier();
|
||||
super._sync();
|
||||
}
|
||||
|
||||
@ -1076,7 +1076,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction);
|
||||
this._createNetworkItem(network);
|
||||
this._itemBox.insert_child_at_index(network.item.actor, newPos);
|
||||
this._itemBox.insert_child_at_index(network.item, newPos);
|
||||
}
|
||||
|
||||
this._syncView();
|
||||
@ -1094,7 +1094,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
network.accessPoints.splice(res.ap, 1);
|
||||
|
||||
if (network.accessPoints.length == 0) {
|
||||
network.item.actor.destroy();
|
||||
network.item.destroy();
|
||||
this._networks.splice(res.network, 1);
|
||||
} else {
|
||||
network.item.updateBestAP(network.accessPoints[0]);
|
||||
@ -1110,7 +1110,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
this._itemBox.remove_all_children();
|
||||
this._networks.forEach(network => {
|
||||
this._itemBox.add_child(network.item.actor);
|
||||
this._itemBox.add_child(network.item);
|
||||
});
|
||||
|
||||
adjustment.value = scrollValue;
|
||||
@ -1118,25 +1118,25 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
_selectNetwork(network) {
|
||||
if (this._selectedNetwork)
|
||||
this._selectedNetwork.item.actor.remove_style_pseudo_class('selected');
|
||||
this._selectedNetwork.item.remove_style_pseudo_class('selected');
|
||||
|
||||
this._selectedNetwork = network;
|
||||
this._updateSensitivity();
|
||||
|
||||
if (this._selectedNetwork)
|
||||
this._selectedNetwork.item.actor.add_style_pseudo_class('selected');
|
||||
this._selectedNetwork.item.add_style_pseudo_class('selected');
|
||||
}
|
||||
|
||||
_createNetworkItem(network) {
|
||||
network.item = new NMWirelessDialogItem(network);
|
||||
network.item.setActive(network == this._selectedNetwork);
|
||||
network.item.connect('selected', () => {
|
||||
Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor);
|
||||
Util.ensureActorVisibleInScrollView(this._scrollView, network.item);
|
||||
this._selectNetwork(network);
|
||||
});
|
||||
network.item.actor.connect('destroy', () => {
|
||||
network.item.connect('destroy', () => {
|
||||
let keyFocus = global.stage.key_focus;
|
||||
if (keyFocus && keyFocus.contains(network.item.actor))
|
||||
if (keyFocus && keyFocus.contains(network.item))
|
||||
this._itemBox.grab_key_focus();
|
||||
});
|
||||
}
|
||||
@ -1262,7 +1262,7 @@ var NMDeviceWireless = class {
|
||||
|
||||
_sync() {
|
||||
this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On");
|
||||
this._toggleItem.actor.visible = this._client.wireless_hardware_enabled;
|
||||
this._toggleItem.visible = this._client.wireless_hardware_enabled;
|
||||
|
||||
this.item.icon.icon_name = this._getMenuIcon();
|
||||
this.item.label.text = this._getStatus();
|
||||
@ -1452,7 +1452,7 @@ var NMVpnSection = class extends NMConnectionSection {
|
||||
|
||||
_sync() {
|
||||
let nItems = this._connectionItems.size;
|
||||
this.item.actor.visible = (nItems > 0);
|
||||
this.item.visible = (nItems > 0);
|
||||
|
||||
super._sync();
|
||||
}
|
||||
@ -1535,7 +1535,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
|
||||
|
||||
this._summaryItem.menu.addSettingsAction(_('Network Settings'),
|
||||
'gnome-network-panel.desktop');
|
||||
this._summaryItem.actor.hide();
|
||||
this._summaryItem.hide();
|
||||
|
||||
}
|
||||
|
||||
@ -1544,7 +1544,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
|
||||
(prev, child) => prev + (child.visible ? 1 : 0), 0);
|
||||
this._summaryItem.label.text = this._getSummaryLabel(nDevices);
|
||||
let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
|
||||
this._summaryItem.actor.visible = shouldSummarize;
|
||||
this._summaryItem.visible = shouldSummarize;
|
||||
this.section.actor.visible = !shouldSummarize;
|
||||
}
|
||||
|
||||
@ -1731,14 +1731,24 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
|
||||
this._addDeviceWrapper(wrapper);
|
||||
|
||||
this._nmDevices.push(device);
|
||||
if (!skipSyncDeviceNames)
|
||||
this._syncDeviceNames();
|
||||
this._deviceChanged(device, skipSyncDeviceNames);
|
||||
|
||||
if (wrapper instanceof NMConnectionSection) {
|
||||
this._connections.forEach(connection => {
|
||||
wrapper.checkConnection(connection);
|
||||
});
|
||||
}
|
||||
device.connect('notify::interface', () => {
|
||||
this._deviceChanged(device, false);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_deviceChanged(device, skipSyncDeviceNames) {
|
||||
let wrapper = device._delegate;
|
||||
|
||||
if (!skipSyncDeviceNames)
|
||||
this._syncDeviceNames();
|
||||
|
||||
if (wrapper instanceof NMConnectionSection) {
|
||||
this._connections.forEach(connection => {
|
||||
wrapper.checkConnection(connection);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -61,6 +61,6 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
: _("Night Light On");
|
||||
this._disableItem.label.text = disabled ? _("Resume")
|
||||
: _("Disable Until Tomorrow");
|
||||
this._item.actor.visible = this._indicator.visible = visible;
|
||||
this._item.visible = this._indicator.visible = visible;
|
||||
}
|
||||
};
|
||||
|
@ -96,11 +96,11 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
// Do we have batteries or a UPS?
|
||||
let visible = this._proxy.IsPresent;
|
||||
if (visible) {
|
||||
this._item.actor.show();
|
||||
this._item.show();
|
||||
this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE);
|
||||
} else {
|
||||
// If there's no battery, then we use the power icon.
|
||||
this._item.actor.hide();
|
||||
this._item.hide();
|
||||
this._indicator.icon_name = 'system-shutdown-symbolic';
|
||||
this._percentageLabel.hide();
|
||||
return;
|
||||
|
@ -53,10 +53,10 @@ var RemoteAccessApplet = class extends PanelMenu.SystemIndicator {
|
||||
_sync() {
|
||||
if (this._handles.size == 0) {
|
||||
this._indicator.visible = false;
|
||||
this._item.actor.visible = false;
|
||||
this._item.visible = false;
|
||||
} else {
|
||||
this._indicator.visible = true;
|
||||
this._item.actor.visible = true;
|
||||
this._item.visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -97,7 +97,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
let showAirplaneMode = this._manager.shouldShowAirplaneMode;
|
||||
|
||||
this._indicator.visible = (airplaneMode && showAirplaneMode);
|
||||
this._item.actor.visible = (airplaneMode && showAirplaneMode);
|
||||
this._item.visible = (airplaneMode && showAirplaneMode);
|
||||
this._offItem.setSensitive(!hwAirplaneMode);
|
||||
|
||||
if (hwAirplaneMode)
|
||||
|
@ -116,10 +116,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
this._createSubMenu();
|
||||
|
||||
this._loginScreenItem.actor.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._logoutItem.actor.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._loginScreenItem.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._logoutItem.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
// Whether shutdown is available or not depends on both lockdown
|
||||
// settings (disable-log-out) and Polkit policy - the latter doesn't
|
||||
// notify, so we update the menu item each time the menu opens or
|
||||
@ -142,7 +142,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._lockScreenAction.visible ||
|
||||
this._altSwitcher.actor.visible);
|
||||
|
||||
this._actionsItem.actor.visible = visible;
|
||||
this.buttonGroup.visible = visible;
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
@ -150,10 +150,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
}
|
||||
|
||||
_updateMultiUser() {
|
||||
let hasSwitchUser = this._loginScreenItem.actor.visible;
|
||||
let hasLogout = this._logoutItem.actor.visible;
|
||||
let hasSwitchUser = this._loginScreenItem.visible;
|
||||
let hasLogout = this._logoutItem.visible;
|
||||
|
||||
this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout;
|
||||
this._switchUserSubMenu.visible = hasSwitchUser || hasLogout;
|
||||
}
|
||||
|
||||
_updateSwitchUserSubMenu() {
|
||||
@ -208,7 +208,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._switchUserSubMenu.menu.addMenuItem(item);
|
||||
this._loginScreenItem = item;
|
||||
this._systemActions.bind_property('can-switch-user',
|
||||
this._loginScreenItem.actor,
|
||||
this._loginScreenItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
@ -220,7 +220,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._switchUserSubMenu.menu.addMenuItem(item);
|
||||
this._logoutItem = item;
|
||||
this._systemActions.bind_property('can-logout',
|
||||
this._logoutItem.actor,
|
||||
this._logoutItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
@ -236,7 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
|
||||
can_focus: false });
|
||||
this.buttonGroup = item.actor;
|
||||
this.buttonGroup = item;
|
||||
|
||||
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
|
||||
'gnome-control-center.desktop'
|
||||
@ -251,14 +251,14 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
log('Missing required core component Settings, expect trouble…');
|
||||
this._settingsAction = new St.Widget();
|
||||
}
|
||||
item.actor.add(this._settingsAction, { expand: true, x_fill: false });
|
||||
item.add(this._settingsAction, { expand: true, x_fill: false });
|
||||
|
||||
this._orientationLockAction = this._createActionButton('', _("Orientation Lock"));
|
||||
this._orientationLockAction.connect('clicked', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE),
|
||||
this._systemActions.activateLockOrientation();
|
||||
});
|
||||
item.actor.add(this._orientationLockAction, { expand: true, x_fill: false });
|
||||
item.add(this._orientationLockAction, { expand: true, x_fill: false });
|
||||
this._systemActions.bind_property('can-lock-orientation',
|
||||
this._orientationLockAction,
|
||||
'visible',
|
||||
@ -273,7 +273,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activateLockScreen();
|
||||
});
|
||||
item.actor.add(this._lockScreenAction, { expand: true, x_fill: false });
|
||||
item.add(this._lockScreenAction, { expand: true, x_fill: false });
|
||||
this._systemActions.bind_property('can-lock-screen',
|
||||
this._lockScreenAction,
|
||||
'visible',
|
||||
@ -300,9 +300,8 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
bindFlags);
|
||||
|
||||
this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction);
|
||||
item.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false });
|
||||
item.add(this._altSwitcher.actor, { expand: true, x_fill: false });
|
||||
|
||||
this._actionsItem = item;
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
|
||||
|
@ -41,12 +41,12 @@ var StreamSlider = class {
|
||||
this._slider.connect('drag-end', this._notifyVolumeChange.bind(this));
|
||||
|
||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
this.item.actor.add(this._icon);
|
||||
this.item.actor.add(this._slider.actor, { expand: true });
|
||||
this.item.actor.connect('button-press-event', (actor, event) => {
|
||||
this.item.add(this._icon);
|
||||
this.item.add(this._slider.actor, { expand: true });
|
||||
this.item.connect('button-press-event', (actor, event) => {
|
||||
return this._slider.startDragging(event);
|
||||
});
|
||||
this.item.actor.connect('key-press-event', (actor, event) => {
|
||||
this.item.connect('key-press-event', (actor, event) => {
|
||||
return this._slider.onKeyPressEvent(actor, event);
|
||||
});
|
||||
|
||||
@ -93,7 +93,7 @@ var StreamSlider = class {
|
||||
|
||||
_updateVisibility() {
|
||||
let visible = this._shouldBeVisible();
|
||||
this.item.actor.visible = visible;
|
||||
this.item.visible = visible;
|
||||
}
|
||||
|
||||
scroll(event) {
|
||||
|
@ -30,12 +30,10 @@ function primaryModifier(mask) {
|
||||
return primary;
|
||||
}
|
||||
|
||||
var SwitcherPopup = GObject.registerClass(
|
||||
class SwitcherPopup extends St.Widget {
|
||||
var SwitcherPopup = GObject.registerClass({
|
||||
GTypeFlags: GObject.TypeFlags.ABSTRACT
|
||||
}, class SwitcherPopup extends St.Widget {
|
||||
_init(items) {
|
||||
if (this.constructor.name === SwitcherPopup.prototype.constructor.name)
|
||||
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||
|
||||
super._init({ style_class: 'switcher-popup',
|
||||
reactive: true,
|
||||
visible: false });
|
||||
@ -164,7 +162,7 @@ class SwitcherPopup extends St.Widget {
|
||||
}
|
||||
|
||||
_keyPressHandler(keysym, action) {
|
||||
throw new Error('Not implemented');
|
||||
throw new GObject.NotImplementedError(`_keyPressHandler in ${this.constructor.name}`);
|
||||
}
|
||||
|
||||
_keyPressEvent(actor, event) {
|
||||
|
@ -152,7 +152,7 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) {
|
||||
// Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a
|
||||
// whole lot more sophisticated than a simple timeout at a fixed frame
|
||||
// rate, but at least it knows how to drop frames. (See
|
||||
// HippoAnimationManager for a more sophisticated view of continous
|
||||
// HippoAnimationManager for a more sophisticated view of continuous
|
||||
// time updates; even better is to pay attention to the vertical
|
||||
// vblank and sync to that when possible.)
|
||||
//
|
||||
|
@ -59,7 +59,7 @@ var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
|
||||
{ x_fill: true,
|
||||
y_fill: true });
|
||||
|
||||
/* Translators: this and the following message should be limited in lenght,
|
||||
/* Translators: this and the following message should be limited in length,
|
||||
to avoid ellipsizing the labels.
|
||||
*/
|
||||
this._cancelButton = this.addButton({ label: _("Revert Settings"),
|
||||
|
@ -813,7 +813,7 @@ var LayoutStrategy = class {
|
||||
}
|
||||
|
||||
// Computes and returns an individual scaling factor for @window,
|
||||
// to be applied in addition to the overal layout scale.
|
||||
// to be applied in addition to the overall layout scale.
|
||||
_computeWindowScale(window) {
|
||||
// Since we align windows next to each other, the height of the
|
||||
// thumbnails is much more important to preserve than the width of
|
||||
@ -835,7 +835,7 @@ var LayoutStrategy = class {
|
||||
// (optionally) for each row in @layout.rows. This method is
|
||||
// intended to be called by subclasses.
|
||||
_computeRowSizes(layout) {
|
||||
throw new Error('_computeRowSizes not implemented');
|
||||
throw new GObject.NotImplementedError(`_computeRowSizes in ${this.constructor.name}`);
|
||||
}
|
||||
|
||||
// Compute strategy-specific window slots for each window in
|
||||
@ -848,7 +848,7 @@ var LayoutStrategy = class {
|
||||
// * gridHeight - The totial height used by the grid, unscaled, unspaced.
|
||||
// * rows - A list of rows, which should be instantiated by _newRow.
|
||||
computeLayout(windows, layout) {
|
||||
throw new Error('computeLayout not implemented');
|
||||
throw new GObject.NotImplementedError(`computeLayout in ${this.constructor.name}`);
|
||||
}
|
||||
|
||||
// Given @layout, compute the overall scale and space of the layout.
|
||||
@ -1266,7 +1266,7 @@ var Workspace = class {
|
||||
}
|
||||
|
||||
// We will reposition windows anyway when enter again overview or when ending the windows
|
||||
// animations whith fade animation.
|
||||
// animations with fade animation.
|
||||
// In this way we avoid unwanted animations of windows repositioning while
|
||||
// animating overview.
|
||||
if (this.leavingOverview || this._animatingWindowsFade)
|
||||
@ -1886,10 +1886,10 @@ var Workspace = class {
|
||||
// Win win -- better scale and better space
|
||||
return true;
|
||||
} else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) {
|
||||
// Keep new layout only if scale gain outweights aspect space loss
|
||||
// Keep new layout only if scale gain outweighs aspect space loss
|
||||
return scalePower > spacePower;
|
||||
} else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) {
|
||||
// Keep new layout only if aspect space gain outweights scale loss
|
||||
// Keep new layout only if aspect space gain outweighs scale loss
|
||||
return spacePower > scalePower;
|
||||
} else {
|
||||
// Lose -- worse scale and space
|
||||
|
@ -84,7 +84,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
this._animating = false; // tweening
|
||||
this._scrolling = false; // swipe-scrolling
|
||||
this._gestureActive = false; // touch(pad) gestures
|
||||
this._animatingScroll = false; // programatically updating the adjustment
|
||||
this._animatingScroll = false; // programmatically updating the adjustment
|
||||
|
||||
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
|
||||
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
||||
@ -483,7 +483,6 @@ var WorkspacesDisplay = class {
|
||||
this._primaryIndex = Main.layoutManager.primaryIndex;
|
||||
|
||||
this._workspacesViews = [];
|
||||
this._primaryScrollAdjustment = null;
|
||||
switchGesture.enabled = this.actor.mapped;
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
|
||||
@ -491,8 +490,6 @@ var WorkspacesDisplay = class {
|
||||
this._workspacesOnlyOnPrimaryChanged.bind(this));
|
||||
this._workspacesOnlyOnPrimaryChanged();
|
||||
|
||||
this._switchWorkspaceNotifyId = 0;
|
||||
|
||||
this._notifyOpacityId = 0;
|
||||
this._restackedNotifyId = 0;
|
||||
this._scrollEventId = 0;
|
||||
|
10
meson.build
10
meson.build
@ -1,5 +1,5 @@
|
||||
project('gnome-shell', 'c',
|
||||
version: '3.32.1',
|
||||
version: '3.33.2',
|
||||
meson_version: '>= 0.47.0',
|
||||
license: 'GPLv2+'
|
||||
)
|
||||
@ -14,16 +14,16 @@ cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version
|
||||
libmutter_pc = 'libmutter-' + mutter_api_version
|
||||
|
||||
croco_req = '>= 0.6.8'
|
||||
ecal_req = '>= 3.5.3'
|
||||
ecal_req = '>= 3.33.1'
|
||||
eds_req = '>= 3.17.2'
|
||||
gcr_req = '>= 3.7.5'
|
||||
gdesktop_req = '>= 3.7.90'
|
||||
gio_req = '>= 2.56.0'
|
||||
gi_req = '>= 1.49.1'
|
||||
gjs_req = '>= 1.54.0'
|
||||
gjs_req = '>= 1.57.2'
|
||||
gtk_req = '>= 3.15.0'
|
||||
json_glib_req = '>= 0.13.2'
|
||||
mutter_req = '>= 3.32.0'
|
||||
mutter_req = '>= 3.33.2'
|
||||
polkit_req = '>= 0.100'
|
||||
schemas_req = '>= 3.27.90'
|
||||
startup_req = '>= 0.11'
|
||||
@ -73,7 +73,7 @@ else
|
||||
endif
|
||||
|
||||
atk_bridge_dep = dependency('atk-bridge-2.0')
|
||||
ecal_dep = dependency('libecal-1.2', version: ecal_req)
|
||||
ecal_dep = dependency('libecal-2.0', version: ecal_req)
|
||||
eds_dep = dependency('libedataserver-1.2', version: eds_req)
|
||||
gcr_dep = dependency('gcr-base-3', version: gcr_req)
|
||||
gdk_x11_dep = dependency('gdk-x11-3.0')
|
||||
|
128
po/de.po
128
po/de.po
@ -16,14 +16,14 @@
|
||||
# Benjamin Steinwender <b@stbe.at>, 2013-2014.
|
||||
# Bernd Homuth <dev@hmt.im>, 2014-2015, 2016, 2019.
|
||||
# Franco Della-Monica <franco.della.monica@gmail.com>, 2016.
|
||||
# Tim Sabsch <tim@sabsch.com>, 2018.
|
||||
# Tim Sabsch <tim@sabsch.com>, 2018-2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2019-03-02 19:56+0000\n"
|
||||
"PO-Revision-Date: 2019-03-02 21:13+0100\n"
|
||||
"POT-Creation-Date: 2019-05-08 10:16+0000\n"
|
||||
"PO-Revision-Date: 2019-05-12 12:36+0200\n"
|
||||
"Last-Translator: Tim Sabsch <tim@sabsch.com>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
|
||||
"Language: de\n"
|
||||
@ -390,11 +390,6 @@ msgstr ""
|
||||
msgid "Network Login"
|
||||
msgstr "Netzwerkanmeldung"
|
||||
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
|
||||
msgid "network-workgroup"
|
||||
msgstr "network-workgroup"
|
||||
|
||||
#: js/extensionPrefs/main.js:116
|
||||
msgid "Something’s gone wrong"
|
||||
msgstr "Etwas ist schiefgelaufen"
|
||||
@ -542,7 +537,7 @@ msgstr "abmelden;verlassen"
|
||||
#: js/misc/systemActions.js:109
|
||||
msgctxt "search-result"
|
||||
msgid "Suspend"
|
||||
msgstr "In Bereitschaft versetzen"
|
||||
msgstr "Bereitschaft"
|
||||
|
||||
#. Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||
#: js/misc/systemActions.js:112
|
||||
@ -762,12 +757,12 @@ msgstr "Zu Favoriten hinzufügen"
|
||||
msgid "Show Details"
|
||||
msgstr "Details anzeigen"
|
||||
|
||||
#: js/ui/appFavorites.js:141
|
||||
#: js/ui/appFavorites.js:149
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
|
||||
|
||||
#: js/ui/appFavorites.js:175
|
||||
#: js/ui/appFavorites.js:183
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s wurde aus Ihren Favoriten entfernt"
|
||||
@ -1053,7 +1048,7 @@ msgstr "Passwort der mobilen Breitbandverbindung"
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden."
|
||||
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
|
||||
msgid "Network Manager"
|
||||
msgstr "Netzwerk-Verwaltung"
|
||||
|
||||
@ -1125,23 +1120,23 @@ msgstr "Weltuhren hinzufügen …"
|
||||
msgid "World Clocks"
|
||||
msgstr "Weltuhren"
|
||||
|
||||
#: js/ui/dateMenu.js:222
|
||||
#: js/ui/dateMenu.js:228
|
||||
msgid "Weather"
|
||||
msgstr "Wetter"
|
||||
|
||||
#: js/ui/dateMenu.js:305
|
||||
#: js/ui/dateMenu.js:311
|
||||
msgid "Select a location…"
|
||||
msgstr "Ort auswählen …"
|
||||
|
||||
#: js/ui/dateMenu.js:313
|
||||
#: js/ui/dateMenu.js:319
|
||||
msgid "Loading…"
|
||||
msgstr "Wird geladen …"
|
||||
|
||||
#: js/ui/dateMenu.js:323
|
||||
#: js/ui/dateMenu.js:329
|
||||
msgid "Go online for weather information"
|
||||
msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können"
|
||||
|
||||
#: js/ui/dateMenu.js:325
|
||||
#: js/ui/dateMenu.js:331
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "Wetterinformationen sind momentan nicht verfügbar"
|
||||
|
||||
@ -1304,26 +1299,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
|
||||
|
||||
#. Translators: %s is an application name like "Settings"
|
||||
#: js/ui/inhibitShortcutsDialog.js:50
|
||||
#: js/ui/inhibitShortcutsDialog.js:78
|
||||
#, javascript-format
|
||||
msgid "%s wants to inhibit shortcuts"
|
||||
msgstr "%s möchte Tastenkombinationen sperren"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:51
|
||||
#: js/ui/inhibitShortcutsDialog.js:79
|
||||
msgid "Application wants to inhibit shortcuts"
|
||||
msgstr "Die Anwendung möchte Tastenkombinationen sperren"
|
||||
|
||||
#. Translators: %s is a keyboard shortcut like "Super+x"
|
||||
#: js/ui/inhibitShortcutsDialog.js:60
|
||||
#: js/ui/inhibitShortcutsDialog.js:88
|
||||
#, javascript-format
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "Sie können Tastenkombinationen durch Drücken von %s wiederherstellen."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:65
|
||||
#: js/ui/inhibitShortcutsDialog.js:93
|
||||
msgid "Deny"
|
||||
msgstr "Ablehnen"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:71
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
msgid "Allow"
|
||||
msgstr "Zulassen"
|
||||
|
||||
@ -1376,13 +1371,13 @@ msgid "Leave On"
|
||||
msgstr "Eingeschaltet lassen"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:1264
|
||||
#: js/ui/status/network.js:1263
|
||||
msgid "Turn On"
|
||||
msgstr "Einschalten"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
|
||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
|
||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
|
||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
|
||||
#: js/ui/status/rfkill.js:106
|
||||
msgid "Turn Off"
|
||||
@ -1392,7 +1387,7 @@ msgstr "Ausschalten"
|
||||
msgid "Leave Off"
|
||||
msgstr "Ausgeschaltet lassen"
|
||||
|
||||
#: js/ui/keyboard.js:203
|
||||
#: js/ui/keyboard.js:200
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Regions- und Spracheinstellungen"
|
||||
|
||||
@ -1444,7 +1439,7 @@ msgstr "Quelle zeigen"
|
||||
msgid "Web Page"
|
||||
msgstr "Webseite"
|
||||
|
||||
#: js/ui/messageTray.js:1474
|
||||
#: js/ui/messageTray.js:1480
|
||||
msgid "System Information"
|
||||
msgstr "Systeminformationen"
|
||||
|
||||
@ -1528,11 +1523,11 @@ msgstr "Beenden"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: js/ui/panel.js:471
|
||||
#: js/ui/panel.js:470
|
||||
msgid "Activities"
|
||||
msgstr "Aktivitäten"
|
||||
|
||||
#: js/ui/panel.js:746
|
||||
#: js/ui/panel.js:745
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
@ -1541,15 +1536,6 @@ msgstr "System"
|
||||
msgid "Top Bar"
|
||||
msgstr "Oberes Panel"
|
||||
|
||||
#. Translators: this MUST be either "toggle-switch-us"
|
||||
#. (for toggle switches containing the English words
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: js/ui/popupMenu.js:285
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: js/ui/runDialog.js:64
|
||||
msgid "Enter a Command"
|
||||
msgstr "Bitte geben Sie einen Befehl ein"
|
||||
@ -1589,7 +1575,7 @@ msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d neue Benachrichtigung"
|
||||
msgstr[1] "%d neue Benachrichtigungen"
|
||||
|
||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
|
||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
|
||||
msgid "Lock"
|
||||
msgstr "Sperren"
|
||||
|
||||
@ -1604,11 +1590,11 @@ msgstr "GNOME muss den Bildschirm sperren"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
|
||||
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
|
||||
msgid "Unable to lock"
|
||||
msgstr "Sperrung fehlgeschlagen"
|
||||
|
||||
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
|
||||
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Sperrung wurde von einer Anwendung blockiert"
|
||||
|
||||
@ -1772,7 +1758,7 @@ msgid "<unknown>"
|
||||
msgstr "<Unbekannt>"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
|
||||
#, javascript-format
|
||||
msgid "%s Off"
|
||||
msgstr "%s ausgeschaltet"
|
||||
@ -1798,7 +1784,7 @@ msgid "%s Disconnecting"
|
||||
msgstr "%s wird getrennt"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
|
||||
#, javascript-format
|
||||
msgid "%s Connecting"
|
||||
msgstr "%s wird verbunden"
|
||||
@ -1838,7 +1824,7 @@ msgid "Mobile Broadband Settings"
|
||||
msgstr "Einstellungen der mobilen Breitbandverbindung"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
|
||||
#, javascript-format
|
||||
msgid "%s Hardware Disabled"
|
||||
msgstr "%s-Hardware ausgeschaltet"
|
||||
@ -1910,72 +1896,72 @@ msgid "Wi-Fi Settings"
|
||||
msgstr "Drahtlosnetzwerk-Einstellungen"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1281
|
||||
#: js/ui/status/network.js:1280
|
||||
#, javascript-format
|
||||
msgid "%s Hotspot Active"
|
||||
msgstr "Hotspot %s eingeschaltet"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1296
|
||||
#: js/ui/status/network.js:1295
|
||||
#, javascript-format
|
||||
msgid "%s Not Connected"
|
||||
msgstr "%s nicht verbunden"
|
||||
|
||||
#: js/ui/status/network.js:1393
|
||||
#: js/ui/status/network.js:1392
|
||||
msgid "connecting…"
|
||||
msgstr "Verbindungsaufbau …"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: js/ui/status/network.js:1396
|
||||
#: js/ui/status/network.js:1395
|
||||
msgid "authentication required"
|
||||
msgstr "Anmeldung erforderlich"
|
||||
|
||||
#: js/ui/status/network.js:1398
|
||||
#: js/ui/status/network.js:1397
|
||||
msgid "connection failed"
|
||||
msgstr "Verbindung gescheitert"
|
||||
|
||||
#: js/ui/status/network.js:1448
|
||||
#: js/ui/status/network.js:1447
|
||||
msgid "VPN Settings"
|
||||
msgstr "VPN-Einstellungen"
|
||||
|
||||
#: js/ui/status/network.js:1465
|
||||
#: js/ui/status/network.js:1464
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: js/ui/status/network.js:1475
|
||||
#: js/ui/status/network.js:1474
|
||||
msgid "VPN Off"
|
||||
msgstr "VPN ausgeschaltet"
|
||||
|
||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
|
||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
|
||||
msgid "Network Settings"
|
||||
msgstr "Netzwerkeinstellungen"
|
||||
|
||||
#: js/ui/status/network.js:1565
|
||||
#: js/ui/status/network.js:1564
|
||||
#, javascript-format
|
||||
msgid "%s Wired Connection"
|
||||
msgid_plural "%s Wired Connections"
|
||||
msgstr[0] "%s Kabelverbindung"
|
||||
msgstr[1] "%s Kabelverbindungen"
|
||||
|
||||
#: js/ui/status/network.js:1569
|
||||
#: js/ui/status/network.js:1568
|
||||
#, javascript-format
|
||||
msgid "%s Wi-Fi Connection"
|
||||
msgid_plural "%s Wi-Fi Connections"
|
||||
msgstr[0] "%s Funknetzwerkverbindung"
|
||||
msgstr[1] "%s Funknetzwerkverbindungen"
|
||||
|
||||
#: js/ui/status/network.js:1573
|
||||
#: js/ui/status/network.js:1572
|
||||
#, javascript-format
|
||||
msgid "%s Modem Connection"
|
||||
msgid_plural "%s Modem Connections"
|
||||
msgstr[0] "%s Modem-Verbindung"
|
||||
msgstr[1] "%s Modem-Verbindungen"
|
||||
|
||||
#: js/ui/status/network.js:1702
|
||||
#: js/ui/status/network.js:1705
|
||||
msgid "Connection failed"
|
||||
msgstr "Verbindung gescheitert"
|
||||
|
||||
#: js/ui/status/network.js:1703
|
||||
#: js/ui/status/network.js:1706
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
|
||||
|
||||
@ -2057,15 +2043,15 @@ msgstr "Abmelden"
|
||||
msgid "Account Settings"
|
||||
msgstr "Kontoeinstellungen"
|
||||
|
||||
#: js/ui/status/system.js:255
|
||||
#: js/ui/status/system.js:256
|
||||
msgid "Orientation Lock"
|
||||
msgstr "Hoch-/Querformats-Fixierung"
|
||||
|
||||
#: js/ui/status/system.js:281
|
||||
#: js/ui/status/system.js:282
|
||||
msgid "Suspend"
|
||||
msgstr "In Bereitschaft versetzen"
|
||||
msgstr "Bereitschaft"
|
||||
|
||||
#: js/ui/status/system.js:291
|
||||
#: js/ui/status/system.js:292
|
||||
msgid "Power Off"
|
||||
msgstr "Ausschalten"
|
||||
|
||||
@ -2183,7 +2169,7 @@ msgstr[1] ""
|
||||
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#: js/ui/windowManager.js:662
|
||||
#: js/ui/windowManager.js:677
|
||||
#, javascript-format
|
||||
msgid "%d × %d"
|
||||
msgstr "%d × %d"
|
||||
@ -2256,11 +2242,6 @@ msgstr "Auf den Bildschirm nach rechts verschieben"
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Evolution-Kalender"
|
||||
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: src/calendar-server/evolution-calendar.desktop.in:6
|
||||
msgid "evolution"
|
||||
msgstr "evolution"
|
||||
|
||||
#: src/main.c:408
|
||||
msgid "Print version"
|
||||
msgstr "Version ausgeben"
|
||||
@ -2279,12 +2260,12 @@ msgstr ""
|
||||
msgid "List possible modes"
|
||||
msgstr "Die möglichen Modi auflisten"
|
||||
|
||||
#: src/shell-app.c:260
|
||||
#: src/shell-app.c:264
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
#: src/shell-app.c:511
|
||||
#: src/shell-app.c:515
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "»%s« konnte nicht gestartet werden"
|
||||
@ -2323,6 +2304,15 @@ msgstr[1] "%u Eingänge"
|
||||
msgid "System Sounds"
|
||||
msgstr "Systemklänge"
|
||||
|
||||
#~ msgid "network-workgroup"
|
||||
#~ msgstr "network-workgroup"
|
||||
|
||||
#~ msgid "toggle-switch-us"
|
||||
#~ msgstr "toggle-switch-intl"
|
||||
|
||||
#~ msgid "evolution"
|
||||
#~ msgstr "evolution"
|
||||
|
||||
#~ msgid "There was an error loading the preferences dialog for %s:"
|
||||
#~ msgstr ""
|
||||
#~ "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:"
|
||||
|
113
po/eo.po
113
po/eo.po
@ -12,8 +12,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2019-04-17 19:29+0000\n"
|
||||
"PO-Revision-Date: 2019-05-01 16:29+0200\n"
|
||||
"POT-Creation-Date: 2019-05-08 17:45+0000\n"
|
||||
"PO-Revision-Date: 2019-05-09 20:12+0200\n"
|
||||
"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n"
|
||||
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
|
||||
"Language: eo\n"
|
||||
@ -383,7 +383,7 @@ msgstr "Foliumi en Programaro"
|
||||
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
|
||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
|
||||
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
|
||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
|
||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889
|
||||
msgid "Cancel"
|
||||
msgstr "Nuligi"
|
||||
|
||||
@ -683,7 +683,6 @@ msgstr "Ĉiuj"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
|
||||
#| msgid "Windows"
|
||||
msgid "Open Windows"
|
||||
msgstr "Malfermaj fenestroj"
|
||||
|
||||
@ -920,7 +919,7 @@ msgstr ""
|
||||
"Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo."
|
||||
|
||||
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
|
||||
#: js/ui/status/network.js:309 js/ui/status/network.js:891
|
||||
#: js/ui/status/network.js:310 js/ui/status/network.js:892
|
||||
msgid "Connect"
|
||||
msgstr "Konekti"
|
||||
|
||||
@ -950,7 +949,7 @@ msgstr "Servo: "
|
||||
|
||||
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
|
||||
msgid "Authentication required by wireless network"
|
||||
msgstr "Aŭtentigo estas bezonata de sendrata reto"
|
||||
msgstr "Sendrata reto bezonas aŭtentigon"
|
||||
|
||||
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
|
||||
#, javascript-format
|
||||
@ -978,7 +977,7 @@ msgstr "PIN-kodo bezonata"
|
||||
|
||||
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
|
||||
msgid "PIN code is needed for the mobile broadband device"
|
||||
msgstr "PIN-kodo estas bezonata por la portebla larĝkapacita aparato"
|
||||
msgstr "PIN-kodo necesas por la portebla larĝkapacita aparato"
|
||||
|
||||
#: js/ui/components/networkAgent.js:333
|
||||
msgid "PIN: "
|
||||
@ -992,9 +991,9 @@ msgstr "Portebla larĝkapacita retopasvorto"
|
||||
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707
|
||||
#, javascript-format
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Pasvorto estas bezonata por konekti al “%s”."
|
||||
msgstr "Pasvorto necesas por konekti al “%s”."
|
||||
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
|
||||
msgid "Network Manager"
|
||||
msgstr "Retadministrilo"
|
||||
|
||||
@ -1311,13 +1310,13 @@ msgid "Leave On"
|
||||
msgstr "Lasi ŝaltita"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:1263
|
||||
#: js/ui/status/network.js:1264
|
||||
msgid "Turn On"
|
||||
msgstr "Ŝalti"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
|
||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:311
|
||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
|
||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
|
||||
#: js/ui/status/rfkill.js:106
|
||||
msgid "Turn Off"
|
||||
@ -1379,7 +1378,7 @@ msgstr "Montri fonton"
|
||||
msgid "Web Page"
|
||||
msgstr "Retpaĝo"
|
||||
|
||||
#: js/ui/messageTray.js:1480
|
||||
#: js/ui/messageTray.js:1479
|
||||
msgid "System Information"
|
||||
msgstr "Sisteminformoj"
|
||||
|
||||
@ -1473,7 +1472,7 @@ msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Sistemo"
|
||||
|
||||
#: js/ui/panel.js:864
|
||||
#: js/ui/panel.js:861
|
||||
msgid "Top Bar"
|
||||
msgstr "Supra breto"
|
||||
|
||||
@ -1611,11 +1610,11 @@ msgstr "Saltaj klavoj"
|
||||
msgid "Mouse Keys"
|
||||
msgstr "Musklavoj"
|
||||
|
||||
#: js/ui/status/accessibility.js:151
|
||||
#: js/ui/status/accessibility.js:135
|
||||
msgid "High Contrast"
|
||||
msgstr "Alta kontrasto"
|
||||
|
||||
#: js/ui/status/accessibility.js:182
|
||||
#: js/ui/status/accessibility.js:177
|
||||
msgid "Large Text"
|
||||
msgstr "Granda teksto"
|
||||
|
||||
@ -1623,7 +1622,7 @@ msgstr "Granda teksto"
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bludento"
|
||||
|
||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
|
||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Bludento-agordoj"
|
||||
|
||||
@ -1694,13 +1693,13 @@ msgid "<unknown>"
|
||||
msgstr "<nekonata>"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
|
||||
#: js/ui/status/network.js:417 js/ui/status/network.js:1293
|
||||
#, javascript-format
|
||||
msgid "%s Off"
|
||||
msgstr "%s malŝaltita"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:419
|
||||
#: js/ui/status/network.js:420
|
||||
#, javascript-format
|
||||
msgid "%s Connected"
|
||||
msgstr "%s konektita"
|
||||
@ -1708,189 +1707,189 @@ msgstr "%s konektita"
|
||||
#. Translators: this is for network devices that are physically present but are not
|
||||
#. under NetworkManager's control (and thus cannot be used in the menu);
|
||||
#. %s is a network identifier
|
||||
#: js/ui/status/network.js:424
|
||||
#: js/ui/status/network.js:425
|
||||
#, javascript-format
|
||||
msgid "%s Unmanaged"
|
||||
msgstr "%s nemastrumita"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:427
|
||||
#: js/ui/status/network.js:428
|
||||
#, javascript-format
|
||||
msgid "%s Disconnecting"
|
||||
msgstr "%s malkonektante"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
|
||||
#: js/ui/status/network.js:435 js/ui/status/network.js:1285
|
||||
#, javascript-format
|
||||
msgid "%s Connecting"
|
||||
msgstr "%s konektante"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
|
||||
#: js/ui/status/network.js:437
|
||||
#: js/ui/status/network.js:438
|
||||
#, javascript-format
|
||||
msgid "%s Requires Authentication"
|
||||
msgstr "%s postulas aŭtentigon"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing; %s is a network identifier
|
||||
#: js/ui/status/network.js:445
|
||||
#: js/ui/status/network.js:446
|
||||
#, javascript-format
|
||||
msgid "Firmware Missing For %s"
|
||||
msgstr "Mikroprogramo mankas por %s"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated (for example it
|
||||
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
|
||||
#: js/ui/status/network.js:449
|
||||
#: js/ui/status/network.js:450
|
||||
#, javascript-format
|
||||
msgid "%s Unavailable"
|
||||
msgstr "%s nedisponebla"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:452
|
||||
#: js/ui/status/network.js:453
|
||||
#, javascript-format
|
||||
msgid "%s Connection Failed"
|
||||
msgstr "%s konekto malsukcesis"
|
||||
|
||||
#: js/ui/status/network.js:464
|
||||
#: js/ui/status/network.js:465
|
||||
msgid "Wired Settings"
|
||||
msgstr "Drataj agordoj"
|
||||
|
||||
#: js/ui/status/network.js:506
|
||||
#: js/ui/status/network.js:507
|
||||
msgid "Mobile Broadband Settings"
|
||||
msgstr "Porteblaj larĝkapacitaj agordoj"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
|
||||
#: js/ui/status/network.js:554 js/ui/status/network.js:1290
|
||||
#, javascript-format
|
||||
msgid "%s Hardware Disabled"
|
||||
msgstr "%s aparataro malŝaltita"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated
|
||||
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
|
||||
#: js/ui/status/network.js:557
|
||||
#: js/ui/status/network.js:558
|
||||
#, javascript-format
|
||||
msgid "%s Disabled"
|
||||
msgstr "%s malŝaltita"
|
||||
|
||||
#: js/ui/status/network.js:597
|
||||
#: js/ui/status/network.js:598
|
||||
msgid "Connect to Internet"
|
||||
msgstr "Konekti al interreto"
|
||||
|
||||
#: js/ui/status/network.js:786
|
||||
#: js/ui/status/network.js:787
|
||||
msgid "Airplane Mode is On"
|
||||
msgstr "Aviadila reĝimo ŝaltita"
|
||||
|
||||
#: js/ui/status/network.js:787
|
||||
#: js/ui/status/network.js:788
|
||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||
msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita."
|
||||
|
||||
#: js/ui/status/network.js:788
|
||||
#: js/ui/status/network.js:789
|
||||
msgid "Turn Off Airplane Mode"
|
||||
msgstr "Malŝalti aviadilan reĝimon"
|
||||
|
||||
#: js/ui/status/network.js:797
|
||||
#: js/ui/status/network.js:798
|
||||
msgid "Wi-Fi is Off"
|
||||
msgstr "Vifio malŝaltita"
|
||||
|
||||
#: js/ui/status/network.js:798
|
||||
#: js/ui/status/network.js:799
|
||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||
msgstr "Necesas ŝalti vifion por konekti al reto."
|
||||
|
||||
#: js/ui/status/network.js:799
|
||||
#: js/ui/status/network.js:800
|
||||
msgid "Turn On Wi-Fi"
|
||||
msgstr "Ŝalti vifion"
|
||||
|
||||
#: js/ui/status/network.js:824
|
||||
#: js/ui/status/network.js:825
|
||||
msgid "Wi-Fi Networks"
|
||||
msgstr "Vifiaj retoj"
|
||||
|
||||
#: js/ui/status/network.js:826
|
||||
#: js/ui/status/network.js:827
|
||||
msgid "Select a network"
|
||||
msgstr "Elekti reton"
|
||||
|
||||
#: js/ui/status/network.js:855
|
||||
#: js/ui/status/network.js:856
|
||||
msgid "No Networks"
|
||||
msgstr "Neniu reto"
|
||||
|
||||
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
|
||||
#: js/ui/status/network.js:877 js/ui/status/rfkill.js:104
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr "Uzi aparataran ŝaltilon por malŝalti"
|
||||
|
||||
#: js/ui/status/network.js:1152
|
||||
#: js/ui/status/network.js:1153
|
||||
msgid "Select Network"
|
||||
msgstr "Elekti reton"
|
||||
|
||||
#: js/ui/status/network.js:1158
|
||||
#: js/ui/status/network.js:1159
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Vifio-agordoj"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1280
|
||||
#: js/ui/status/network.js:1281
|
||||
#, javascript-format
|
||||
msgid "%s Hotspot Active"
|
||||
msgstr "%s retkaptejo aktiva"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1295
|
||||
#: js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
msgid "%s Not Connected"
|
||||
msgstr "%s ne konektita"
|
||||
|
||||
#: js/ui/status/network.js:1392
|
||||
#: js/ui/status/network.js:1393
|
||||
msgid "connecting…"
|
||||
msgstr "konektante…"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: js/ui/status/network.js:1395
|
||||
#: js/ui/status/network.js:1396
|
||||
msgid "authentication required"
|
||||
msgstr "aŭtentigo necesas"
|
||||
|
||||
#: js/ui/status/network.js:1397
|
||||
#: js/ui/status/network.js:1398
|
||||
msgid "connection failed"
|
||||
msgstr "konekto malsukcesis"
|
||||
|
||||
#: js/ui/status/network.js:1447
|
||||
#: js/ui/status/network.js:1448
|
||||
msgid "VPN Settings"
|
||||
msgstr "VPR-agordoj"
|
||||
|
||||
#: js/ui/status/network.js:1464
|
||||
#: js/ui/status/network.js:1465
|
||||
msgid "VPN"
|
||||
msgstr "VPR"
|
||||
|
||||
#: js/ui/status/network.js:1474
|
||||
#: js/ui/status/network.js:1475
|
||||
msgid "VPN Off"
|
||||
msgstr "VPR malŝaltita"
|
||||
|
||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
|
||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
|
||||
msgid "Network Settings"
|
||||
msgstr "Ret-agordoj"
|
||||
|
||||
#: js/ui/status/network.js:1564
|
||||
#: js/ui/status/network.js:1565
|
||||
#, javascript-format
|
||||
msgid "%s Wired Connection"
|
||||
msgid_plural "%s Wired Connections"
|
||||
msgstr[0] "%s drata konekto"
|
||||
msgstr[1] "%s drataj konektoj"
|
||||
|
||||
#: js/ui/status/network.js:1568
|
||||
#: js/ui/status/network.js:1569
|
||||
#, javascript-format
|
||||
msgid "%s Wi-Fi Connection"
|
||||
msgid_plural "%s Wi-Fi Connections"
|
||||
msgstr[0] "%s vifia konekto"
|
||||
msgstr[1] "%s vifiaj konektoj"
|
||||
|
||||
#: js/ui/status/network.js:1572
|
||||
#: js/ui/status/network.js:1573
|
||||
#, javascript-format
|
||||
msgid "%s Modem Connection"
|
||||
msgid_plural "%s Modem Connections"
|
||||
msgstr[0] "%s modema konekto"
|
||||
msgstr[1] "%s modemaj konektoj"
|
||||
|
||||
#: js/ui/status/network.js:1705
|
||||
#: js/ui/status/network.js:1706
|
||||
msgid "Connection failed"
|
||||
msgstr "Konekto malsukcesis"
|
||||
|
||||
#: js/ui/status/network.js:1706
|
||||
#: js/ui/status/network.js:1707
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivigo de reto-konekto malsukcesis"
|
||||
|
||||
|
110
po/es.po
110
po/es.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell.master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2019-04-17 19:29+0000\n"
|
||||
"PO-Revision-Date: 2019-04-23 10:15+0200\n"
|
||||
"POT-Creation-Date: 2019-05-15 17:25+0000\n"
|
||||
"PO-Revision-Date: 2019-05-16 12:35+0200\n"
|
||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||
"Language-Team: es <gnome-es-list@gnome.org>\n"
|
||||
"Language: es\n"
|
||||
@ -431,7 +431,7 @@ msgstr "Buscar en Software"
|
||||
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
|
||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
|
||||
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
|
||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
|
||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
@ -522,7 +522,8 @@ msgstr "Cerrar la sesión"
|
||||
|
||||
#. Translators: A list of keywords that match the logout action, separated by semicolons
|
||||
#: js/misc/systemActions.js:105
|
||||
msgid "logout;sign off"
|
||||
#| msgid "logout;sign off"
|
||||
msgid "logout;log out;sign off"
|
||||
msgstr "cerrar;sesión;salir"
|
||||
|
||||
#. Translators: The name of the suspend action in search
|
||||
@ -730,7 +731,6 @@ msgstr "Todas"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
|
||||
#| msgid "Windows"
|
||||
msgid "Open Windows"
|
||||
msgstr "Ventanas abiertas"
|
||||
|
||||
@ -969,7 +969,7 @@ msgstr ""
|
||||
"Alternativamente puede conectarse pulsando el botón «WPS» de su router."
|
||||
|
||||
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
|
||||
#: js/ui/status/network.js:309 js/ui/status/network.js:891
|
||||
#: js/ui/status/network.js:310 js/ui/status/network.js:892
|
||||
msgid "Connect"
|
||||
msgstr "Conectar"
|
||||
|
||||
@ -1044,7 +1044,7 @@ msgstr "Contraseña de la red de banda ancha móvil"
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Se requiere una contraseña para conectarse a «%s»."
|
||||
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
|
||||
msgid "Network Manager"
|
||||
msgstr "Gestor de la red"
|
||||
|
||||
@ -1365,13 +1365,13 @@ msgid "Leave On"
|
||||
msgstr "Dejar activada"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:1263
|
||||
#: js/ui/status/network.js:1264
|
||||
msgid "Turn On"
|
||||
msgstr "Encender"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
|
||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:311
|
||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
|
||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
|
||||
#: js/ui/status/rfkill.js:106
|
||||
msgid "Turn Off"
|
||||
@ -1433,7 +1433,7 @@ msgstr "Ver fuente"
|
||||
msgid "Web Page"
|
||||
msgstr "Página web"
|
||||
|
||||
#: js/ui/messageTray.js:1480
|
||||
#: js/ui/messageTray.js:1479
|
||||
msgid "System Information"
|
||||
msgstr "Información del sistema"
|
||||
|
||||
@ -1526,7 +1526,7 @@ msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
#: js/ui/panel.js:864
|
||||
#: js/ui/panel.js:861
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superior"
|
||||
|
||||
@ -1664,11 +1664,11 @@ msgstr "Rechazo de teclas"
|
||||
msgid "Mouse Keys"
|
||||
msgstr "Teclas del ratón"
|
||||
|
||||
#: js/ui/status/accessibility.js:151
|
||||
#: js/ui/status/accessibility.js:135
|
||||
msgid "High Contrast"
|
||||
msgstr "Contraste alto"
|
||||
|
||||
#: js/ui/status/accessibility.js:182
|
||||
#: js/ui/status/accessibility.js:177
|
||||
msgid "Large Text"
|
||||
msgstr "Texto grande"
|
||||
|
||||
@ -1676,7 +1676,7 @@ msgstr "Texto grande"
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
|
||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Configuración de Bluetooth"
|
||||
|
||||
@ -1749,13 +1749,13 @@ msgid "<unknown>"
|
||||
msgstr "<desconocido>"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
|
||||
#: js/ui/status/network.js:417 js/ui/status/network.js:1293
|
||||
#, javascript-format
|
||||
msgid "%s Off"
|
||||
msgstr "%s apagada"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:419
|
||||
#: js/ui/status/network.js:420
|
||||
#, javascript-format
|
||||
msgid "%s Connected"
|
||||
msgstr "%s conectada"
|
||||
@ -1763,189 +1763,189 @@ msgstr "%s conectada"
|
||||
#. Translators: this is for network devices that are physically present but are not
|
||||
#. under NetworkManager's control (and thus cannot be used in the menu);
|
||||
#. %s is a network identifier
|
||||
#: js/ui/status/network.js:424
|
||||
#: js/ui/status/network.js:425
|
||||
#, javascript-format
|
||||
msgid "%s Unmanaged"
|
||||
msgstr "%s sin gestionar"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:427
|
||||
#: js/ui/status/network.js:428
|
||||
#, javascript-format
|
||||
msgid "%s Disconnecting"
|
||||
msgstr "Desconectando %s"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
|
||||
#: js/ui/status/network.js:435 js/ui/status/network.js:1285
|
||||
#, javascript-format
|
||||
msgid "%s Connecting"
|
||||
msgstr "Conectando %s"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
|
||||
#: js/ui/status/network.js:437
|
||||
#: js/ui/status/network.js:438
|
||||
#, javascript-format
|
||||
msgid "%s Requires Authentication"
|
||||
msgstr "%s requiere autenticación"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing; %s is a network identifier
|
||||
#: js/ui/status/network.js:445
|
||||
#: js/ui/status/network.js:446
|
||||
#, javascript-format
|
||||
msgid "Firmware Missing For %s"
|
||||
msgstr "Falta el «firmware» para %s"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated (for example it
|
||||
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
|
||||
#: js/ui/status/network.js:449
|
||||
#: js/ui/status/network.js:450
|
||||
#, javascript-format
|
||||
msgid "%s Unavailable"
|
||||
msgstr "%s no disponible"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:452
|
||||
#: js/ui/status/network.js:453
|
||||
#, javascript-format
|
||||
msgid "%s Connection Failed"
|
||||
msgstr "Falló la conexión %s"
|
||||
|
||||
#: js/ui/status/network.js:464
|
||||
#: js/ui/status/network.js:465
|
||||
msgid "Wired Settings"
|
||||
msgstr "Configuración de red cableada"
|
||||
|
||||
#: js/ui/status/network.js:506
|
||||
#: js/ui/status/network.js:507
|
||||
msgid "Mobile Broadband Settings"
|
||||
msgstr "Configuración de banda ancha móvil"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
|
||||
#: js/ui/status/network.js:554 js/ui/status/network.js:1290
|
||||
#, javascript-format
|
||||
msgid "%s Hardware Disabled"
|
||||
msgstr "Hardware %s desactivado"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated
|
||||
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
|
||||
#: js/ui/status/network.js:557
|
||||
#: js/ui/status/network.js:558
|
||||
#, javascript-format
|
||||
msgid "%s Disabled"
|
||||
msgstr "%s desactivado"
|
||||
|
||||
#: js/ui/status/network.js:597
|
||||
#: js/ui/status/network.js:598
|
||||
msgid "Connect to Internet"
|
||||
msgstr "Conectar a Internet"
|
||||
|
||||
#: js/ui/status/network.js:786
|
||||
#: js/ui/status/network.js:787
|
||||
msgid "Airplane Mode is On"
|
||||
msgstr "El modo avión está activado"
|
||||
|
||||
#: js/ui/status/network.js:787
|
||||
#: js/ui/status/network.js:788
|
||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||
msgstr "La Wi-Fi se desactiva cuando se activa el modo avión."
|
||||
|
||||
#: js/ui/status/network.js:788
|
||||
#: js/ui/status/network.js:789
|
||||
msgid "Turn Off Airplane Mode"
|
||||
msgstr "Apagar el modo avión"
|
||||
|
||||
#: js/ui/status/network.js:797
|
||||
#: js/ui/status/network.js:798
|
||||
msgid "Wi-Fi is Off"
|
||||
msgstr "La Wi-Fi está desactivada"
|
||||
|
||||
#: js/ui/status/network.js:798
|
||||
#: js/ui/status/network.js:799
|
||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||
msgstr "Se debe activar la Wi-Fi para poder conectarse a la red."
|
||||
|
||||
#: js/ui/status/network.js:799
|
||||
#: js/ui/status/network.js:800
|
||||
msgid "Turn On Wi-Fi"
|
||||
msgstr "Activar la Wi-Fi"
|
||||
|
||||
#: js/ui/status/network.js:824
|
||||
#: js/ui/status/network.js:825
|
||||
msgid "Wi-Fi Networks"
|
||||
msgstr "Redes Wi-Fi"
|
||||
|
||||
#: js/ui/status/network.js:826
|
||||
#: js/ui/status/network.js:827
|
||||
msgid "Select a network"
|
||||
msgstr "Seleccionar una red"
|
||||
|
||||
#: js/ui/status/network.js:855
|
||||
#: js/ui/status/network.js:856
|
||||
msgid "No Networks"
|
||||
msgstr "No hay redes"
|
||||
|
||||
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
|
||||
#: js/ui/status/network.js:877 js/ui/status/rfkill.js:104
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr "Usar el interruptor hardware para apagar"
|
||||
|
||||
#: js/ui/status/network.js:1152
|
||||
#: js/ui/status/network.js:1153
|
||||
msgid "Select Network"
|
||||
msgstr "Seleccionar red"
|
||||
|
||||
#: js/ui/status/network.js:1158
|
||||
#: js/ui/status/network.js:1159
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Configuración de Wi-Fi"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1280
|
||||
#: js/ui/status/network.js:1281
|
||||
#, javascript-format
|
||||
msgid "%s Hotspot Active"
|
||||
msgstr "Punto de acceso %s activo"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1295
|
||||
#: js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
msgid "%s Not Connected"
|
||||
msgstr "%s no conectado"
|
||||
|
||||
#: js/ui/status/network.js:1392
|
||||
#: js/ui/status/network.js:1393
|
||||
msgid "connecting…"
|
||||
msgstr "conectando…"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: js/ui/status/network.js:1395
|
||||
#: js/ui/status/network.js:1396
|
||||
msgid "authentication required"
|
||||
msgstr "se necesita autenticación"
|
||||
|
||||
#: js/ui/status/network.js:1397
|
||||
#: js/ui/status/network.js:1398
|
||||
msgid "connection failed"
|
||||
msgstr "falló la conexión"
|
||||
|
||||
#: js/ui/status/network.js:1447
|
||||
#: js/ui/status/network.js:1448
|
||||
msgid "VPN Settings"
|
||||
msgstr "Configuración de VPN"
|
||||
|
||||
#: js/ui/status/network.js:1464
|
||||
#: js/ui/status/network.js:1465
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: js/ui/status/network.js:1474
|
||||
#: js/ui/status/network.js:1475
|
||||
msgid "VPN Off"
|
||||
msgstr "VPN apagada"
|
||||
|
||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
|
||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
|
||||
msgid "Network Settings"
|
||||
msgstr "Configuración de la red"
|
||||
|
||||
#: js/ui/status/network.js:1564
|
||||
#: js/ui/status/network.js:1565
|
||||
#, javascript-format
|
||||
msgid "%s Wired Connection"
|
||||
msgid_plural "%s Wired Connections"
|
||||
msgstr[0] "%s conexión cableada"
|
||||
msgstr[1] "%s conexiones cableadas"
|
||||
|
||||
#: js/ui/status/network.js:1568
|
||||
#: js/ui/status/network.js:1569
|
||||
#, javascript-format
|
||||
msgid "%s Wi-Fi Connection"
|
||||
msgid_plural "%s Wi-Fi Connections"
|
||||
msgstr[0] "%s conexión inalámbrica"
|
||||
msgstr[1] "%s conexiones inalámbricas"
|
||||
|
||||
#: js/ui/status/network.js:1572
|
||||
#: js/ui/status/network.js:1573
|
||||
#, javascript-format
|
||||
msgid "%s Modem Connection"
|
||||
msgid_plural "%s Modem Connections"
|
||||
msgstr[0] "%s conexión por módem"
|
||||
msgstr[1] "%s conexiones por módem"
|
||||
|
||||
#: js/ui/status/network.js:1705
|
||||
#: js/ui/status/network.js:1706
|
||||
msgid "Connection failed"
|
||||
msgstr "Falló la conexión"
|
||||
|
||||
#: js/ui/status/network.js:1706
|
||||
#: js/ui/status/network.js:1707
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Falló la activación de la conexión de red"
|
||||
|
||||
|
1083
po/zh_CN.po
1083
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
@ -295,13 +295,13 @@ create_client_for_source (ESource *source,
|
||||
CalendarSourceData *source_data)
|
||||
{
|
||||
ClientData *data;
|
||||
ECalClient *client;
|
||||
EClient *client;
|
||||
GError *error = NULL;
|
||||
|
||||
client = g_hash_table_lookup (source_data->clients, source);
|
||||
g_return_if_fail (client == NULL);
|
||||
|
||||
client = e_cal_client_new (source, source_type, &error);
|
||||
client = e_cal_client_connect_sync (source, source_type, -1, NULL, &error);
|
||||
if (!client)
|
||||
{
|
||||
g_warning ("Could not load source '%s': %s",
|
||||
@ -312,7 +312,7 @@ create_client_for_source (ESource *source,
|
||||
}
|
||||
|
||||
data = g_slice_new0 (ClientData);
|
||||
data->client = client; /* takes ownership */
|
||||
data->client = E_CAL_CLIENT (client); /* takes ownership */
|
||||
data->backend_died_id = g_signal_connect (client,
|
||||
"backend-died",
|
||||
G_CALLBACK (backend_died_cb),
|
||||
|
@ -102,97 +102,120 @@ typedef struct
|
||||
} CollectAppointmentsData;
|
||||
|
||||
static time_t
|
||||
get_time_from_property (icalcomponent *ical,
|
||||
icalproperty_kind prop_kind,
|
||||
struct icaltimetype (* get_prop_func) (const icalproperty *prop),
|
||||
icaltimezone *default_zone)
|
||||
get_time_from_property (ICalComponent *icomp,
|
||||
ICalPropertyKind prop_kind,
|
||||
ICalTime * (* get_prop_func) (ICalProperty *prop),
|
||||
ICalTimezone *default_zone)
|
||||
{
|
||||
icalproperty *prop;
|
||||
struct icaltimetype ical_time;
|
||||
icalparameter *param;
|
||||
icaltimezone *timezone = NULL;
|
||||
ICalProperty *prop;
|
||||
ICalTime *itt;
|
||||
ICalParameter *param;
|
||||
ICalTimezone *timezone = NULL;
|
||||
time_t retval;
|
||||
|
||||
prop = icalcomponent_get_first_property (ical, prop_kind);
|
||||
prop = i_cal_component_get_first_property (icomp, prop_kind);
|
||||
if (!prop)
|
||||
return 0;
|
||||
|
||||
ical_time = get_prop_func (prop);
|
||||
itt = get_prop_func (prop);
|
||||
|
||||
param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
|
||||
param = i_cal_property_get_first_parameter (prop, I_CAL_TZID_PARAMETER);
|
||||
if (param)
|
||||
timezone = icaltimezone_get_builtin_timezone_from_tzid (icalparameter_get_tzid (param));
|
||||
else if (icaltime_is_utc (ical_time))
|
||||
timezone = icaltimezone_get_utc_timezone ();
|
||||
timezone = i_cal_timezone_get_builtin_timezone_from_tzid (i_cal_parameter_get_tzid (param));
|
||||
else if (i_cal_time_is_utc (itt))
|
||||
timezone = i_cal_timezone_get_utc_timezone ();
|
||||
else
|
||||
timezone = default_zone;
|
||||
|
||||
return icaltime_as_timet_with_zone (ical_time, timezone);
|
||||
retval = i_cal_time_as_timet_with_zone (itt, timezone);
|
||||
|
||||
g_clear_object (¶m);
|
||||
g_clear_object (&prop);
|
||||
g_clear_object (&itt);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_ical_uid (icalcomponent *ical)
|
||||
get_ical_uid (ICalComponent *icomp)
|
||||
{
|
||||
return g_strdup (icalcomponent_get_uid (ical));
|
||||
return g_strdup (i_cal_component_get_uid (icomp));
|
||||
}
|
||||
|
||||
static char *
|
||||
get_ical_summary (icalcomponent *ical)
|
||||
get_ical_summary (ICalComponent *icomp)
|
||||
{
|
||||
icalproperty *prop;
|
||||
ICalProperty *prop;
|
||||
char *retval;
|
||||
|
||||
prop = icalcomponent_get_first_property (ical, ICAL_SUMMARY_PROPERTY);
|
||||
prop = i_cal_component_get_first_property (icomp, I_CAL_SUMMARY_PROPERTY);
|
||||
if (!prop)
|
||||
return NULL;
|
||||
|
||||
return g_strdup (icalproperty_get_summary (prop));
|
||||
retval = g_strdup (i_cal_property_get_summary (prop));
|
||||
|
||||
g_object_unref (prop);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_ical_description (icalcomponent *ical)
|
||||
get_ical_description (ICalComponent *icomp)
|
||||
{
|
||||
icalproperty *prop;
|
||||
ICalProperty *prop;
|
||||
char *retval;
|
||||
|
||||
prop = icalcomponent_get_first_property (ical, ICAL_DESCRIPTION_PROPERTY);
|
||||
prop = i_cal_component_get_first_property (icomp, I_CAL_DESCRIPTION_PROPERTY);
|
||||
if (!prop)
|
||||
return NULL;
|
||||
|
||||
return g_strdup (icalproperty_get_description (prop));
|
||||
retval = g_strdup (i_cal_property_get_description (prop));
|
||||
|
||||
g_object_unref (prop);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static inline time_t
|
||||
get_ical_start_time (icalcomponent *ical,
|
||||
icaltimezone *default_zone)
|
||||
get_ical_start_time (ICalComponent *icomp,
|
||||
ICalTimezone *default_zone)
|
||||
{
|
||||
return get_time_from_property (ical,
|
||||
ICAL_DTSTART_PROPERTY,
|
||||
icalproperty_get_dtstart,
|
||||
return get_time_from_property (icomp,
|
||||
I_CAL_DTSTART_PROPERTY,
|
||||
i_cal_property_get_dtstart,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
static inline time_t
|
||||
get_ical_end_time (icalcomponent *ical,
|
||||
icaltimezone *default_zone)
|
||||
get_ical_end_time (ICalComponent *icomp,
|
||||
ICalTimezone *default_zone)
|
||||
{
|
||||
return get_time_from_property (ical,
|
||||
ICAL_DTEND_PROPERTY,
|
||||
icalproperty_get_dtend,
|
||||
return get_time_from_property (icomp,
|
||||
I_CAL_DTEND_PROPERTY,
|
||||
i_cal_property_get_dtend,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_ical_is_all_day (icalcomponent *ical,
|
||||
get_ical_is_all_day (ICalComponent *icomp,
|
||||
time_t start_time,
|
||||
icaltimezone *default_zone)
|
||||
ICalTimezone *default_zone)
|
||||
{
|
||||
icalproperty *prop;
|
||||
struct tm *start_tm;
|
||||
time_t end_time;
|
||||
struct icaldurationtype duration;
|
||||
struct icaltimetype start_icaltime;
|
||||
ICalProperty *prop;
|
||||
ICalDuration *duration;
|
||||
ICalTime *dtstart;
|
||||
struct tm *start_tm;
|
||||
time_t end_time;
|
||||
gboolean retval;
|
||||
|
||||
start_icaltime = icalcomponent_get_dtstart (ical);
|
||||
if (start_icaltime.is_date)
|
||||
return TRUE;
|
||||
dtstart = i_cal_component_get_dtstart (icomp);
|
||||
if (dtstart && i_cal_time_is_date (dtstart))
|
||||
{
|
||||
g_clear_object (&dtstart);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
g_clear_object (&dtstart);
|
||||
|
||||
start_tm = gmtime (&start_time);
|
||||
if (start_tm->tm_sec != 0 ||
|
||||
@ -200,35 +223,40 @@ get_ical_is_all_day (icalcomponent *ical,
|
||||
start_tm->tm_hour != 0)
|
||||
return FALSE;
|
||||
|
||||
if ((end_time = get_ical_end_time (ical, default_zone)))
|
||||
if ((end_time = get_ical_end_time (icomp, default_zone)))
|
||||
return (end_time - start_time) % 86400 == 0;
|
||||
|
||||
prop = icalcomponent_get_first_property (ical, ICAL_DURATION_PROPERTY);
|
||||
prop = i_cal_component_get_first_property (icomp, I_CAL_DURATION_PROPERTY);
|
||||
if (!prop)
|
||||
return FALSE;
|
||||
|
||||
duration = icalproperty_get_duration (prop);
|
||||
duration = i_cal_property_get_duration (prop);
|
||||
|
||||
return icaldurationtype_as_int (duration) % 86400 == 0;
|
||||
retval = duration && (i_cal_duration_as_int (duration) % 86400) == 0;
|
||||
|
||||
g_clear_object (&duration);
|
||||
g_clear_object (&prop);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static inline time_t
|
||||
get_ical_due_time (icalcomponent *ical,
|
||||
icaltimezone *default_zone)
|
||||
get_ical_due_time (ICalComponent *icomp,
|
||||
ICalTimezone *default_zone)
|
||||
{
|
||||
return get_time_from_property (ical,
|
||||
ICAL_DUE_PROPERTY,
|
||||
icalproperty_get_due,
|
||||
return get_time_from_property (icomp,
|
||||
I_CAL_DUE_PROPERTY,
|
||||
i_cal_property_get_due,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
static inline time_t
|
||||
get_ical_completed_time (icalcomponent *ical,
|
||||
icaltimezone *default_zone)
|
||||
get_ical_completed_time (ICalComponent *icomp,
|
||||
ICalTimezone *default_zone)
|
||||
{
|
||||
return get_time_from_property (ical,
|
||||
ICAL_COMPLETED_PROPERTY,
|
||||
icalproperty_get_completed,
|
||||
return get_time_from_property (icomp,
|
||||
I_CAL_COMPLETED_PROPERTY,
|
||||
i_cal_property_get_completed,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
@ -365,67 +393,69 @@ calendar_appointment_free (CalendarAppointment *appointment)
|
||||
|
||||
static void
|
||||
calendar_appointment_init (CalendarAppointment *appointment,
|
||||
icalcomponent *ical,
|
||||
ICalComponent *icomp,
|
||||
ECalClient *cal)
|
||||
{
|
||||
icaltimezone *default_zone;
|
||||
ICalTimezone *default_zone;
|
||||
const char *source_id;
|
||||
|
||||
source_id = e_source_get_uid (e_client_get_source (E_CLIENT (cal)));
|
||||
default_zone = e_cal_client_get_default_timezone (cal);
|
||||
|
||||
appointment->uid = get_ical_uid (ical);
|
||||
appointment->uid = get_ical_uid (icomp);
|
||||
appointment->source_id = g_strdup (source_id);
|
||||
appointment->backend_name = get_source_backend_name (cal);
|
||||
appointment->summary = get_ical_summary (ical);
|
||||
appointment->description = get_ical_description (ical);
|
||||
appointment->summary = get_ical_summary (icomp);
|
||||
appointment->description = get_ical_description (icomp);
|
||||
appointment->color_string = get_source_color (cal);
|
||||
appointment->start_time = get_ical_start_time (ical, default_zone);
|
||||
appointment->end_time = get_ical_end_time (ical, default_zone);
|
||||
appointment->is_all_day = get_ical_is_all_day (ical,
|
||||
appointment->start_time = get_ical_start_time (icomp, default_zone);
|
||||
appointment->end_time = get_ical_end_time (icomp, default_zone);
|
||||
appointment->is_all_day = get_ical_is_all_day (icomp,
|
||||
appointment->start_time,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
static CalendarAppointment *
|
||||
calendar_appointment_new (icalcomponent *ical,
|
||||
calendar_appointment_new (ICalComponent *icomp,
|
||||
ECalClient *cal)
|
||||
{
|
||||
CalendarAppointment *appointment;
|
||||
|
||||
appointment = g_new0 (CalendarAppointment, 1);
|
||||
|
||||
calendar_appointment_init (appointment, ical, cal);
|
||||
calendar_appointment_init (appointment, icomp, cal);
|
||||
return appointment;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
generate_instances_cb (ECalComponent *comp,
|
||||
time_t start,
|
||||
time_t end,
|
||||
gpointer data)
|
||||
generate_instances_cb (ICalComponent *icomp,
|
||||
ICalTime *instance_start,
|
||||
ICalTime *instance_end,
|
||||
gpointer user_data,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
ECalClient *cal = ((CollectAppointmentsData *)data)->client;
|
||||
GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments;
|
||||
ECalClient *cal = ((CollectAppointmentsData *)user_data)->client;
|
||||
GHashTable *appointments = ((CollectAppointmentsData *)user_data)->appointments;
|
||||
CalendarAppointment *appointment;
|
||||
CalendarOccurrence *occurrence;
|
||||
const char *uid;
|
||||
ICalTimezone *default_zone;
|
||||
const gchar *uid;
|
||||
|
||||
e_cal_component_get_uid (comp, &uid);
|
||||
default_zone = e_cal_client_get_default_timezone (cal);
|
||||
uid = i_cal_component_get_uid (icomp);
|
||||
appointment = g_hash_table_lookup (appointments, uid);
|
||||
|
||||
if (appointment == NULL)
|
||||
{
|
||||
icalcomponent *ical = e_cal_component_get_icalcomponent (comp);
|
||||
|
||||
appointment = calendar_appointment_new (ical, cal);
|
||||
appointment = calendar_appointment_new (icomp, cal);
|
||||
g_hash_table_insert (appointments, g_strdup (uid), appointment);
|
||||
}
|
||||
|
||||
occurrence = g_new0 (CalendarOccurrence, 1);
|
||||
occurrence->start_time = start;
|
||||
occurrence->end_time = end;
|
||||
occurrence->rid = e_cal_component_get_recurid_as_string (comp);
|
||||
occurrence->start_time = i_cal_time_as_timet_with_zone (instance_start, default_zone);
|
||||
occurrence->end_time = i_cal_time_as_timet_with_zone (instance_end, default_zone);
|
||||
occurrence->rid = e_cal_util_component_get_recurid_as_string (icomp);
|
||||
|
||||
appointment->occurrences = g_slist_append (appointment->occurrences, occurrence);
|
||||
|
||||
@ -442,7 +472,7 @@ struct _App
|
||||
time_t since;
|
||||
time_t until;
|
||||
|
||||
icaltimezone *zone;
|
||||
ICalTimezone *zone;
|
||||
|
||||
CalendarSources *sources;
|
||||
gulong sources_signal_id;
|
||||
@ -468,9 +498,9 @@ app_update_timezone (App *app)
|
||||
if (g_strcmp0 (location, app->timezone_location) != 0)
|
||||
{
|
||||
if (location == NULL)
|
||||
app->zone = icaltimezone_get_utc_timezone ();
|
||||
app->zone = i_cal_timezone_get_utc_timezone ();
|
||||
else
|
||||
app->zone = icaltimezone_get_builtin_timezone (location);
|
||||
app->zone = i_cal_timezone_get_builtin_timezone (location);
|
||||
g_free (app->timezone_location);
|
||||
app->timezone_location = location;
|
||||
print_debug ("Using timezone %s", app->timezone_location);
|
||||
@ -528,10 +558,10 @@ on_objects_added (ECalClientView *view,
|
||||
|
||||
for (l = objects; l != NULL; l = l->next)
|
||||
{
|
||||
icalcomponent *ical = l->data;
|
||||
ICalComponent *icomp = l->data;
|
||||
const char *uid;
|
||||
|
||||
uid = icalcomponent_get_uid (ical);
|
||||
uid = i_cal_component_get_uid (icomp);
|
||||
|
||||
if (g_hash_table_lookup (app->appointments, uid) == NULL)
|
||||
{
|
||||
@ -600,7 +630,7 @@ app_load_events (App *app)
|
||||
|
||||
since_iso8601 = isodate_from_time_t (app->since);
|
||||
until_iso8601 = isodate_from_time_t (app->until);
|
||||
tz_location = icaltimezone_get_location (app->zone);
|
||||
tz_location = i_cal_timezone_get_location (app->zone);
|
||||
|
||||
print_debug ("Loading events since %s until %s",
|
||||
since_iso8601,
|
||||
@ -622,21 +652,12 @@ app_load_events (App *app)
|
||||
|
||||
e_cal_client_set_default_timezone (cal, app->zone);
|
||||
|
||||
error = NULL;
|
||||
if (!e_client_open_sync (E_CLIENT (cal), TRUE, NULL, &error))
|
||||
{
|
||||
ESource *source = e_client_get_source (E_CLIENT (cal));
|
||||
g_warning ("Error opening calendar %s: %s\n",
|
||||
e_source_get_uid (source), error->message);
|
||||
g_error_free (error);
|
||||
continue;
|
||||
}
|
||||
|
||||
data.client = cal;
|
||||
data.appointments = app->appointments;
|
||||
e_cal_client_generate_instances_sync (cal,
|
||||
app->since,
|
||||
app->until,
|
||||
NULL,
|
||||
generate_instances_cb,
|
||||
&data);
|
||||
|
||||
|
@ -117,7 +117,7 @@ remove_mnemonics (const GValue *value)
|
||||
label = g_value_get_string (value);
|
||||
g_return_val_if_fail (label != NULL, NULL);
|
||||
|
||||
/* Stripped label will have the original label lenght at most */
|
||||
/* Stripped label will have the original label length at most */
|
||||
stripped_label = temp = g_new (gchar, strlen(label) + 1);
|
||||
g_assert (stripped_label != NULL);
|
||||
|
||||
|
@ -18,6 +18,7 @@ st_headers = [
|
||||
'st-scrollable.h',
|
||||
'st-scroll-bar.h',
|
||||
'st-scroll-view.h',
|
||||
'st-scroll-view-fade.h',
|
||||
'st-settings.h',
|
||||
'st-shadow.h',
|
||||
'st-texture-cache.h',
|
||||
@ -73,6 +74,7 @@ st_sources = [
|
||||
'st-scrollable.c',
|
||||
'st-scroll-bar.c',
|
||||
'st-scroll-view.c',
|
||||
'st-scroll-view-fade.c',
|
||||
'st-settings.c',
|
||||
'st-shadow.c',
|
||||
'st-texture-cache.c',
|
||||
@ -94,11 +96,6 @@ st_enums = gnome.mkenums_simple('st-enum-types',
|
||||
|
||||
st_gir_sources = st_sources + st_private_headers + st_headers + st_enums
|
||||
|
||||
st_non_gir_sources = [
|
||||
'st-scroll-view-fade.c',
|
||||
'st-scroll-view-fade.h'
|
||||
]
|
||||
|
||||
data_to_c = find_program(meson.source_root() + '/src/data-to-c.pl')
|
||||
|
||||
custom_target('scroll-view-fade-glsl',
|
||||
@ -123,7 +120,7 @@ st_cflags = [
|
||||
|
||||
# Currently meson requires a shared library for building girs
|
||||
libst = shared_library('st-1.0',
|
||||
sources: st_gir_sources + st_non_gir_sources,
|
||||
sources: st_gir_sources,
|
||||
c_args: st_cflags,
|
||||
dependencies: [clutter_dep, gtk_dep, croco_dep, mutter_dep, m_dep],
|
||||
build_rpath: mutter_typelibdir,
|
||||
|
@ -206,8 +206,8 @@ st_icon_style_changed (StWidget *widget)
|
||||
}
|
||||
|
||||
priv->theme_icon_size = (int)(0.5 + st_theme_node_get_length (theme_node, "icon-size"));
|
||||
if (st_icon_update_icon_size (self))
|
||||
st_icon_update (self);
|
||||
st_icon_update_icon_size (self);
|
||||
st_icon_update (self);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -65,6 +65,8 @@ struct _StWidgetPrivate
|
||||
StThemeNodeTransition *transition_animation;
|
||||
|
||||
guint is_style_dirty : 1;
|
||||
guint first_child_dirty : 1;
|
||||
guint last_child_dirty : 1;
|
||||
guint draw_bg_color : 1;
|
||||
guint draw_border_internal : 1;
|
||||
guint track_hover : 1;
|
||||
@ -72,6 +74,7 @@ struct _StWidgetPrivate
|
||||
guint can_focus : 1;
|
||||
|
||||
gulong texture_file_changed_id;
|
||||
guint update_child_styles_id;
|
||||
|
||||
AtkObject *accessible;
|
||||
AtkRole accessible_role;
|
||||
@ -323,6 +326,8 @@ st_widget_dispose (GObject *gobject)
|
||||
g_clear_object (&priv->last_visible_child);
|
||||
|
||||
G_OBJECT_CLASS (st_widget_parent_class)->dispose (gobject);
|
||||
|
||||
g_clear_handle_id (&priv->update_child_styles_id, g_source_remove);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1608,47 +1613,85 @@ find_nearest_visible_forward (ClutterActor *actor)
|
||||
return next;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
st_widget_update_child_styles (StWidget *widget)
|
||||
{
|
||||
StWidgetPrivate *priv = st_widget_get_instance_private (widget);
|
||||
|
||||
if (priv->first_child_dirty)
|
||||
{
|
||||
ClutterActor *first_child;
|
||||
|
||||
priv->first_child_dirty = FALSE;
|
||||
|
||||
first_child = clutter_actor_get_first_child (CLUTTER_ACTOR (widget));
|
||||
st_widget_set_first_visible_child (widget,
|
||||
find_nearest_visible_forward (first_child));
|
||||
}
|
||||
|
||||
if (priv->last_child_dirty)
|
||||
{
|
||||
ClutterActor *last_child;
|
||||
|
||||
priv->last_child_dirty = FALSE;
|
||||
|
||||
last_child = clutter_actor_get_last_child (CLUTTER_ACTOR (widget));
|
||||
st_widget_set_last_visible_child (widget,
|
||||
find_nearest_visible_backwards (last_child));
|
||||
}
|
||||
|
||||
priv->update_child_styles_id = 0;
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
st_widget_queue_child_styles_update (StWidget *widget)
|
||||
{
|
||||
StWidgetPrivate *priv = st_widget_get_instance_private (widget);
|
||||
|
||||
if (priv->update_child_styles_id != 0)
|
||||
return;
|
||||
|
||||
priv->update_child_styles_id = g_idle_add ((GSourceFunc) st_widget_update_child_styles, widget);
|
||||
}
|
||||
|
||||
static void
|
||||
st_widget_visible_notify (StWidget *widget,
|
||||
GParamSpec *pspec,
|
||||
gpointer data)
|
||||
{
|
||||
StWidgetPrivate *parent_priv;
|
||||
ClutterActor *actor = CLUTTER_ACTOR (widget);
|
||||
ClutterActor *parent = clutter_actor_get_parent (actor);
|
||||
|
||||
if (parent == NULL || !ST_IS_WIDGET (parent))
|
||||
return;
|
||||
|
||||
parent_priv = st_widget_get_instance_private (ST_WIDGET (parent));
|
||||
|
||||
if (clutter_actor_is_visible (actor))
|
||||
{
|
||||
ClutterActor *before, *after;
|
||||
|
||||
before = clutter_actor_get_previous_sibling (actor);
|
||||
if (find_nearest_visible_backwards (before) == NULL)
|
||||
st_widget_set_first_visible_child (ST_WIDGET (parent), actor);
|
||||
parent_priv->first_child_dirty = TRUE;
|
||||
|
||||
after = clutter_actor_get_next_sibling (actor);
|
||||
if (find_nearest_visible_forward (after) == NULL)
|
||||
st_widget_set_last_visible_child (ST_WIDGET (parent), actor);
|
||||
parent_priv->last_child_dirty = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (st_widget_has_style_pseudo_class (widget, "first-child"))
|
||||
{
|
||||
ClutterActor *new_first;
|
||||
|
||||
new_first = find_nearest_visible_forward (CLUTTER_ACTOR (widget));
|
||||
st_widget_set_first_visible_child (ST_WIDGET (parent), new_first);
|
||||
}
|
||||
parent_priv->first_child_dirty = TRUE;
|
||||
|
||||
if (st_widget_has_style_pseudo_class (widget, "last-child"))
|
||||
{
|
||||
ClutterActor *new_last;
|
||||
|
||||
new_last = find_nearest_visible_backwards (CLUTTER_ACTOR (widget));
|
||||
st_widget_set_last_visible_child (ST_WIDGET (parent), new_last);
|
||||
}
|
||||
parent_priv->last_child_dirty = TRUE;
|
||||
}
|
||||
|
||||
if (parent_priv->first_child_dirty || parent_priv->last_child_dirty)
|
||||
st_widget_queue_child_styles_update (ST_WIDGET (parent));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1656,10 +1699,10 @@ st_widget_first_child_notify (StWidget *widget,
|
||||
GParamSpec *pspec,
|
||||
gpointer data)
|
||||
{
|
||||
ClutterActor *first_child;
|
||||
StWidgetPrivate *priv = st_widget_get_instance_private (widget);
|
||||
|
||||
first_child = clutter_actor_get_first_child (CLUTTER_ACTOR (widget));
|
||||
st_widget_set_first_visible_child (widget, find_nearest_visible_forward (first_child));
|
||||
priv->first_child_dirty = TRUE;
|
||||
st_widget_queue_child_styles_update (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1667,10 +1710,10 @@ st_widget_last_child_notify (StWidget *widget,
|
||||
GParamSpec *pspec,
|
||||
gpointer data)
|
||||
{
|
||||
ClutterActor *last_child;
|
||||
StWidgetPrivate *priv = st_widget_get_instance_private (widget);
|
||||
|
||||
last_child = clutter_actor_get_last_child (CLUTTER_ACTOR (widget));
|
||||
st_widget_set_last_visible_child (widget, find_nearest_visible_backwards (last_child));
|
||||
priv->last_child_dirty = TRUE;
|
||||
st_widget_queue_child_styles_update (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Reference in New Issue
Block a user