gnome-shell/caps-lock-warning.patch

489 lines
17 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 7b514e637837e00372e20fa52f841e993966b734 Mon Sep 17 00:00:00 2001
From: Umang Jain <mailumangjain@gmail.com>
Date: Fri, 13 Dec 2019 13:36:14 +0530
Subject: [PATCH 1/7] shellEntry: Add CapsLockWarning class
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/619
---
data/theme/gnome-shell-sass/_common.scss | 5 +++
js/ui/shellEntry.js | 39 +++++++++++++++++++++++-
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
index b1eeb0ce97..19a736ab7d 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -391,6 +391,11 @@ StScrollBar {
padding-bottom: 8px;
}
+ .prompt-dialog-caps-lock-warning {
+ @extend .prompt-dialog-error-label;
+ padding-left: 6.2em;
+ }
+
.prompt-dialog-info-label {
font-size: 10pt;
padding-bottom: 8px;
diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js
index 79f1aad3e7..c1738c4064 100644
--- a/js/ui/shellEntry.js
+++ b/js/ui/shellEntry.js
@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
-const { Clutter, Shell, St } = imports.gi;
+const { Clutter, GObject, Pango, Shell, St } = imports.gi;
const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main;
@@ -170,3 +170,40 @@ function addContextMenu(entry, params) {
entry._menuManager = null;
});
}
+
+var CapsLockWarning = GObject.registerClass(
+class CapsLockWarning extends St.Label {
+ _init(params) {
+ let defaultParams = { style_class: 'prompt-dialog-error-label' };
+ super._init(Object.assign(defaultParams, params));
+
+ this.text = _('Caps lock is on.');
+
+ this._keymap = Clutter.get_default_backend().get_keymap();
+
+ this.connect('notify::mapped', () => {
+ if (this.is_mapped()) {
+ this.stateChangedId = this._keymap.connect('state-changed',
+ this._updateCapsLockWarningOpacity.bind(this));
+ } else {
+ this._keymap.disconnect(this.stateChangedId);
+ this.stateChangedId = 0;
+ }
+
+ this._updateCapsLockWarningOpacity();
+ });
+
+ this.connect('destroy', () => {
+ if (this.stateChangedId > 0)
+ this._keymap.disconnect(this.stateChangedId);
+ });
+
+ this.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
+ this.clutter_text.line_wrap = true;
+ }
+
+ _updateCapsLockWarningOpacity() {
+ let capsLockOn = this._keymap.get_caps_lock_state();
+ this.opacity = capsLockOn ? 255 : 0;
+ }
+});
--
2.21.1
From aa4938f261454f85c782e59e40d4e5a9e1a01dbc Mon Sep 17 00:00:00 2001
From: Umang Jain <mailumangjain@gmail.com>
Date: Wed, 18 Dec 2019 01:33:45 +0530
Subject: [PATCH 2/7] js: Add caps-lock Warning to the dialogs
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/619
---
js/gdm/authPrompt.js | 4 ++++
js/ui/components/keyring.js | 6 ++++++
js/ui/components/networkAgent.js | 8 ++++++++
js/ui/components/polkitAgent.js | 2 ++
js/ui/shellMountOperation.js | 3 +++
5 files changed, 23 insertions(+)
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
index 71069e93b8..3ce9fd0d01 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -113,6 +113,9 @@ var AuthPrompt = class {
this._entry.grab_key_focus();
+ this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
+ this.actor.add_child(this._capsLockWarningLabel);
+
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
scale_x: 0 });
@@ -432,6 +435,7 @@ var AuthPrompt = class {
setPasswordChar(passwordChar) {
this._entry.clutter_text.set_password_char(passwordChar);
this._entry.menu.isPassword = passwordChar != '';
+ this._capsLockWarningLabel.visible = passwordChar !== '';
}
setQuestion(question) {
diff --git a/js/ui/components/keyring.js b/js/ui/components/keyring.js
index 0d9f1e4663..3512fb63b1 100644
--- a/js/ui/components/keyring.js
+++ b/js/ui/components/keyring.js
@@ -128,6 +128,12 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
this.prompt.set_password_actor(this._passwordEntry ? this._passwordEntry.clutter_text : null);
this.prompt.set_confirm_actor(this._confirmEntry ? this._confirmEntry.clutter_text : null);
+ if (this._passwordEntry || this._confirmEntry) {
+ this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
+ layout.attach(this._capsLockWarningLabel, 1, row, 1, 1);
+ row++;
+ }
+
if (this.prompt.choice_visible) {
let choice = new CheckBox.CheckBox();
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
diff --git a/js/ui/components/networkAgent.js b/js/ui/components/networkAgent.js
index f871c732d9..32d40fb2b9 100644
--- a/js/ui/components/networkAgent.js
+++ b/js/ui/components/networkAgent.js
@@ -95,6 +95,14 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
secret.entry.clutter_text.set_password_char('\u25cf');
}
+ if (this._content.secrets.some(s => s.password)) {
+ this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
+ if (rtl)
+ layout.attach(this._capsLockWarningLabel, 0, pos, 1, 1);
+ else
+ layout.attach(this._capsLockWarningLabel, 1, pos, 1, 1);
+ }
+
contentBox.messageBox.add(secretTable);
if (flags & NM.SecretAgentGetSecretsFlags.WPS_PBC_ACTIVE) {
diff --git a/js/ui/components/polkitAgent.js b/js/ui/components/polkitAgent.js
index 21feb40903..734a217335 100644
--- a/js/ui/components/polkitAgent.js
+++ b/js/ui/components/polkitAgent.js
@@ -108,6 +108,8 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
this.setInitialKeyFocus(this._passwordEntry);
this._passwordBox.hide();
+ this._capsLockWarningLabel = new ShellEntry.CapsLockWarning({ style_class: 'prompt-dialog-caps-lock-warning' });
+ content.messageBox.add(this._capsLockWarningLabel);
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
diff --git a/js/ui/shellMountOperation.js b/js/ui/shellMountOperation.js
index f976f400f4..3a2377ddaf 100644
--- a/js/ui/shellMountOperation.js
+++ b/js/ui/shellMountOperation.js
@@ -305,6 +305,9 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
this._passwordBox.add(this._passwordEntry, {expand: true });
this.setInitialKeyFocus(this._passwordEntry);
+ this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
+ content.messageBox.add(this._capsLockWarningLabel);
+
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
text: _("Sorry, that didnt work. Please try again.") });
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
--
2.21.1
From 016cbd971711665844d40ec678d2779c160f791b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Thu, 23 Jan 2020 22:37:06 +0100
Subject: [PATCH 3/7] shellEntry: Make signal id variable private
Signal connection IDs should be private variables, so make this one
private.
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/952
---
js/ui/shellEntry.js | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js
index c1738c4064..cd7c9a6c88 100644
--- a/js/ui/shellEntry.js
+++ b/js/ui/shellEntry.js
@@ -183,19 +183,19 @@ class CapsLockWarning extends St.Label {
this.connect('notify::mapped', () => {
if (this.is_mapped()) {
- this.stateChangedId = this._keymap.connect('state-changed',
+ this._stateChangedId = this._keymap.connect('state-changed',
this._updateCapsLockWarningOpacity.bind(this));
} else {
- this._keymap.disconnect(this.stateChangedId);
- this.stateChangedId = 0;
+ this._keymap.disconnect(this._stateChangedId);
+ this._stateChangedId = 0;
}
this._updateCapsLockWarningOpacity();
});
this.connect('destroy', () => {
- if (this.stateChangedId > 0)
- this._keymap.disconnect(this.stateChangedId);
+ if (this._stateChangedId > 0)
+ this._keymap.disconnect(this._stateChangedId);
});
this.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
--
2.21.1
From ba65f9066d72731e345a5aced61f35d39c1c1376 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Thu, 23 Jan 2020 23:26:45 +0100
Subject: [PATCH 4/7] theme: Move caps-lock warning to entry widget stylesheet
The caps-lock warning is more related to entries than dialogs and is
also used in gdm, which is not realated to dialogs at all. Rename the
css class to caps-lock-warning-label and move it to the entry
stylesheet.
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/952
---
data/theme/gnome-shell-sass/_common.scss | 12 +++++++-----
js/ui/shellEntry.js | 2 +-
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
index 19a736ab7d..4661533de2 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -94,6 +94,13 @@ StEntry {
}
}
+.caps-lock-warning-label {
+ padding-left: 6.2em;
+ @include fontsize($font-size - 1);
+ color: $warning_color;
+}
+
+
/* Scrollbars */
@@ -391,11 +398,6 @@ StScrollBar {
padding-bottom: 8px;
}
- .prompt-dialog-caps-lock-warning {
- @extend .prompt-dialog-error-label;
- padding-left: 6.2em;
- }
-
.prompt-dialog-info-label {
font-size: 10pt;
padding-bottom: 8px;
diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js
index cd7c9a6c88..46eba88d54 100644
--- a/js/ui/shellEntry.js
+++ b/js/ui/shellEntry.js
@@ -174,7 +174,7 @@ function addContextMenu(entry, params) {
var CapsLockWarning = GObject.registerClass(
class CapsLockWarning extends St.Label {
_init(params) {
- let defaultParams = { style_class: 'prompt-dialog-error-label' };
+ let defaultParams = { style_class: 'caps-lock-warning-label' };
super._init(Object.assign(defaultParams, params));
this.text = _('Caps lock is on.');
--
2.21.1
From afd764c82febe21aec70bdfc19d256f3401530e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Thu, 23 Jan 2020 22:36:09 +0100
Subject: [PATCH 5/7] shellEntry: Hide caps lock warning and use animation to
show it
Since the caps-lock warning adds a lot of spacing to dialogs and the
lock screen, hide it by default and only show it when necessary. To make
the transition smooth instead of just showing the label, animate it in
using the height and opacity.
Also add some bottom padding to the label so we can show or hide that
padding, too.
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/952
---
data/theme/gnome-shell-sass/_common.scss | 1 +
js/ui/shellEntry.js | 33 ++++++++++++++++++------
2 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
index 4661533de2..9e0751c8c5 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -95,6 +95,7 @@ StEntry {
}
.caps-lock-warning-label {
+ padding-bottom: 8px;
padding-left: 6.2em;
@include fontsize($font-size - 1);
color: $warning_color;
diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js
index 46eba88d54..fc8ee37a9a 100644
--- a/js/ui/shellEntry.js
+++ b/js/ui/shellEntry.js
@@ -6,6 +6,7 @@ const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main;
const Params = imports.misc.params;
const PopupMenu = imports.ui.popupMenu;
+const Tweener = imports.ui.tweener;
var EntryMenu = class extends PopupMenu.PopupMenu {
constructor(entry) {
@@ -179,31 +180,47 @@ class CapsLockWarning extends St.Label {
this.text = _('Caps lock is on.');
+ this.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
+ this.clutter_text.line_wrap = true;
+
this._keymap = Clutter.get_default_backend().get_keymap();
this.connect('notify::mapped', () => {
if (this.is_mapped()) {
this._stateChangedId = this._keymap.connect('state-changed',
- this._updateCapsLockWarningOpacity.bind(this));
+ () => this._sync(true));
} else {
this._keymap.disconnect(this._stateChangedId);
this._stateChangedId = 0;
}
- this._updateCapsLockWarningOpacity();
+ this._sync(false);
});
this.connect('destroy', () => {
- if (this._stateChangedId > 0)
+ if (this._stateChangedId)
this._keymap.disconnect(this._stateChangedId);
});
-
- this.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
- this.clutter_text.line_wrap = true;
}
- _updateCapsLockWarningOpacity() {
+ _sync(animate) {
let capsLockOn = this._keymap.get_caps_lock_state();
- this.opacity = capsLockOn ? 255 : 0;
+
+ Tweener.removeTweens(this);
+
+ this.natural_height_set = false;
+ let [, height] = this.get_preferred_height(-1);
+ this.natural_height_set = true;
+
+ Tweener.addTween(this, {
+ height: capsLockOn ? height : 0,
+ opacity: capsLockOn ? 255 : 0,
+ time: animate ? 0.2 : 0,
+ transition: 'easeOutQuad',
+ onComplete: () => {
+ if (capsLockOn)
+ this.height = -1;
+ },
+ });
}
});
--
2.21.1
From 1ef3dafb51da380c54635d0565dc098e40bbb3e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 29 Jan 2020 17:48:57 +0100
Subject: [PATCH 6/7] js: Initialize some properties
Otherwise those can result in the (harmless) "reference to undefined
property" warnings.
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/970
---
js/ui/overview.js | 1 +
js/ui/shellEntry.js | 1 +
2 files changed, 2 insertions(+)
diff --git a/js/ui/overview.js b/js/ui/overview.js
index dc6ad1821b..5bad4cbd62 100644
--- a/js/ui/overview.js
+++ b/js/ui/overview.js
@@ -80,6 +80,7 @@ var Overview = class {
constructor() {
this._overviewCreated = false;
this._initCalled = false;
+ this._visible = false;
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
this._sessionUpdated();
diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js
index fc8ee37a9a..55267e7c87 100644
--- a/js/ui/shellEntry.js
+++ b/js/ui/shellEntry.js
@@ -184,6 +184,7 @@ class CapsLockWarning extends St.Label {
this.clutter_text.line_wrap = true;
this._keymap = Clutter.get_default_backend().get_keymap();
+ this._stateChangedId = 0;
this.connect('notify::mapped', () => {
if (this.is_mapped()) {
--
2.21.1
From 273f7adb43cfee907342d017e1454ea90d42d262 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Fri, 21 Feb 2020 19:38:53 +0100
Subject: [PATCH 7/7] shellEntry: Restore natural-height-set instead of forcing
it
If we are transitioning the label from 0 to its natural height, we
must set natural-height-set again after querying the preferred height,
otherwise Clutter would skip the transition.
However when transitioning in the opposite direction, setting the
property to true can go horribly wrong:
If the actor hasn't been allocated before, it will store a fixed
natural height of 0. But as there is no fixed min-height, we can
end up with min-height > natural-height, which is a fatal error.
(This isn't an issue when *actually* setting a fixed height, as
that will set both natural and minimum height)
So instead of always setting natural-height-set to true, restore
its previous value to fix the issue.
https://gitlab.gnome.org/GNOME/gnome-shell/issues/2255
---
js/ui/shellEntry.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/js/ui/shellEntry.js b/js/ui/shellEntry.js
index 55267e7c87..4a30b22f7a 100644
--- a/js/ui/shellEntry.js
+++ b/js/ui/shellEntry.js
@@ -209,9 +209,10 @@ class CapsLockWarning extends St.Label {
Tweener.removeTweens(this);
+ const naturalHeightSet = this.natural_height_set;
this.natural_height_set = false;
let [, height] = this.get_preferred_height(-1);
- this.natural_height_set = true;
+ this.natural_height_set = naturalHeightSet;
Tweener.addTween(this, {
height: capsLockOn ? height : 0,
--
2.21.1