commit
1e71479929
@ -0,0 +1 @@
|
||||
SOURCES/gnome-shell-40.10.tar.xz
|
@ -0,0 +1 @@
|
||||
c955a004fb650a83863d1151e3adbbd6758b1c2e SOURCES/gnome-shell-40.10.tar.xz
|
@ -0,0 +1,25 @@
|
||||
From a8c8b7ef31f7219157b94148b771f6f663928dea Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 19 Apr 2022 19:17:48 +0200
|
||||
Subject: [PATCH] Revert "dash: Subtract vertical margins from availHeight"
|
||||
|
||||
This reverts commit 0de0a1f5940784eb4a7ca9ecf5e92f5277ceb0d8.
|
||||
---
|
||||
js/ui/dash.js | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/dash.js b/js/ui/dash.js
|
||||
index f35cc2e25..0f1ca2c4c 100644
|
||||
--- a/js/ui/dash.js
|
||||
+++ b/js/ui/dash.js
|
||||
@@ -610,7 +610,6 @@ var Dash = GObject.registerClass({
|
||||
(iconChildren.length - 1) * spacing;
|
||||
|
||||
let availHeight = this._maxHeight;
|
||||
- availHeight -= this.margin_top + this.margin_bottom;
|
||||
availHeight -= this._background.get_theme_node().get_vertical_padding();
|
||||
availHeight -= themeNode.get_vertical_padding();
|
||||
availHeight -= buttonHeight - iconHeight;
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,364 @@
|
||||
From 678cdd9e0da851da78527fa827d71a80273510b0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@redhat.com>
|
||||
Date: Tue, 8 Feb 2022 14:18:04 -0500
|
||||
|
||||
---
|
||||
data/theme/gnome-shell-high-contrast.css | 36 ++++++++++++++++++++++++
|
||||
data/theme/gnome-shell.css | 36 ++++++++++++++++++++++++
|
||||
2 files changed, 72 insertions(+)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-high-contrast.css b/data/theme/gnome-shell-high-contrast.css
|
||||
index b73f407..90f363c 100644
|
||||
--- a/data/theme/gnome-shell-high-contrast.css
|
||||
+++ b/data/theme/gnome-shell-high-contrast.css
|
||||
@@ -1223,60 +1223,63 @@ StScrollBar {
|
||||
-panel-corner-border-color: transparent;
|
||||
-panel-corner-opacity: 1;
|
||||
transition-duration: 250ms; }
|
||||
#panel .panel-button {
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
-natural-hpadding: 12px;
|
||||
-minimum-hpadding: 6px;
|
||||
transition-duration: 150ms;
|
||||
border: 3px solid transparent;
|
||||
border-radius: 99px; }
|
||||
#panel .panel-button.clock-display .clock {
|
||||
transition-duration: 150ms;
|
||||
border: 3px solid transparent;
|
||||
border-radius: 99px; }
|
||||
#panel .panel-button:hover, #panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.2); }
|
||||
#panel .panel-button.clock-display:hover, #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:overview, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
|
||||
box-shadow: none; }
|
||||
#panel .panel-button.clock-display:hover .clock, #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:overview .clock, #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:checked .clock {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.2); }
|
||||
#panel .panel-button .system-status-icon {
|
||||
icon-size: 1.09em;
|
||||
padding: 5px;
|
||||
margin: 0 4px; }
|
||||
#panel .panel-button .panel-status-indicators-box .system-status-icon,
|
||||
#panel .panel-button .panel-status-menu-box .system-status-icon {
|
||||
margin: 0; }
|
||||
#panel .panel-button .app-menu-icon {
|
||||
-st-icon-style: symbolic; }
|
||||
+ #panel .panel-button .panel-logo-icon {
|
||||
+ padding-right: .4em;
|
||||
+ icon-size: 1em; }
|
||||
#panel #panelActivities.panel-button {
|
||||
-natural-hpadding: 18px; }
|
||||
#panel.unlock-screen .panel-button:hover, #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:overview, #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:hover, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:overview, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:checked, #panel:overview .panel-button:hover, #panel:overview .panel-button:active, #panel:overview .panel-button:overview, #panel:overview .panel-button:focus, #panel:overview .panel-button:checked {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.15); }
|
||||
#panel.unlock-screen .panel-button.clock-display:hover, #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:overview, #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:overview, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:checked, #panel:overview .panel-button.clock-display:hover, #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:overview, #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:checked {
|
||||
box-shadow: none; }
|
||||
#panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:overview .clock, #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:overview .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:checked .clock, #panel:overview .panel-button.clock-display:hover .clock, #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:overview .clock, #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:checked .clock {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.15); }
|
||||
#panel .panel-status-indicators-box,
|
||||
#panel .panel-status-menu-box {
|
||||
spacing: 2px; }
|
||||
#panel .power-status.panel-status-indicators-box {
|
||||
spacing: 0; }
|
||||
#panel .screencast-indicator,
|
||||
#panel .remote-access-indicator {
|
||||
color: #f57900; }
|
||||
|
||||
#appMenu {
|
||||
spacing: 6px; }
|
||||
#appMenu .label-shadow {
|
||||
color: transparent; }
|
||||
|
||||
#appMenu .panel-status-menu-box {
|
||||
padding: 0 6px;
|
||||
spacing: 6px; }
|
||||
|
||||
/* Activities Ripple */
|
||||
.ripple-box {
|
||||
background-color: rgba(158, 196, 235, 0.3);
|
||||
box-shadow: 0 0 2px 2px #4a90d9;
|
||||
@@ -2039,74 +2042,107 @@ StScrollBar {
|
||||
width: 2.18em;
|
||||
height: 2.18em;
|
||||
border-color: #202020;
|
||||
background-color: #202020; }
|
||||
.login-dialog .cancel-button StIcon,
|
||||
.login-dialog .switch-user-button StIcon,
|
||||
.login-dialog .login-dialog-session-list-button StIcon,
|
||||
.unlock-dialog .cancel-button StIcon,
|
||||
.unlock-dialog .switch-user-button StIcon,
|
||||
.unlock-dialog .login-dialog-session-list-button StIcon {
|
||||
icon-size: 1.09em; }
|
||||
.login-dialog .caps-lock-warning-label,
|
||||
.login-dialog .login-dialog-message-warning,
|
||||
.unlock-dialog .caps-lock-warning-label,
|
||||
.unlock-dialog .login-dialog-message-warning {
|
||||
color: #eeeeec; }
|
||||
|
||||
.login-dialog-logo-bin {
|
||||
padding: 24px 0px; }
|
||||
|
||||
.login-dialog-banner {
|
||||
color: #d6d6d1; }
|
||||
|
||||
.login-dialog-button-box {
|
||||
width: 23em;
|
||||
spacing: 5px; }
|
||||
|
||||
.login-dialog-message {
|
||||
text-align: center; }
|
||||
|
||||
+.login-dialog-message-hint, .login-dialog-message {
|
||||
+ color: #bebeb6;
|
||||
+ min-height: 2.75em; }
|
||||
+
|
||||
.login-dialog-user-selection-box {
|
||||
padding: 100px 0px; }
|
||||
|
||||
.login-dialog-not-listed-label {
|
||||
padding-left: 2px; }
|
||||
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
|
||||
color: #eeeeec; }
|
||||
|
||||
.login-dialog-not-listed-label {
|
||||
font-size: 10pt;
|
||||
font-weight: bold;
|
||||
color: #a6a69b;
|
||||
padding-top: 1em; }
|
||||
|
||||
+.login-dialog-auth-list-view {
|
||||
+ -st-vfade-offset: 1em; }
|
||||
+
|
||||
+.login-dialog-auth-list {
|
||||
+ spacing: 6px;
|
||||
+ margin-left: 2em; }
|
||||
+
|
||||
+.login-dialog-auth-list-title {
|
||||
+ margin-left: 2em; }
|
||||
+
|
||||
+.login-dialog-auth-list-item {
|
||||
+ border-radius: 12px;
|
||||
+ padding: 6px;
|
||||
+ color: #a6a69b; }
|
||||
+ .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
|
||||
+ background-color: #215d9c;
|
||||
+ color: #ffffff; }
|
||||
+
|
||||
+.login-dialog-auth-list-label {
|
||||
+ font-size: 13pt;
|
||||
+ font-weight: bold;
|
||||
+ padding-left: 15px; }
|
||||
+ .login-dialog-auth-list-label:ltr {
|
||||
+ padding-left: 14px;
|
||||
+ text-align: left; }
|
||||
+ .login-dialog-auth-list-label:rtl {
|
||||
+ padding-right: 14px;
|
||||
+ text-align: right; }
|
||||
+
|
||||
.login-dialog-user-list-view {
|
||||
-st-vfade-offset: 1em; }
|
||||
|
||||
.login-dialog-user-list {
|
||||
spacing: 12px;
|
||||
width: 23em; }
|
||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
|
||||
background-color: #215d9c;
|
||||
color: #ffffff; }
|
||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
|
||||
border-right: 2px solid #215d9c; }
|
||||
|
||||
.login-dialog-user-list-item {
|
||||
border-radius: 12px;
|
||||
padding: 6px;
|
||||
color: #a6a69b; }
|
||||
.login-dialog-user-list-item:ltr .user-widget {
|
||||
padding-right: 1em; }
|
||||
.login-dialog-user-list-item:rtl .user-widget {
|
||||
padding-left: 1em; }
|
||||
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
||||
height: 2px;
|
||||
margin-top: 6px;
|
||||
background-color: #eeeeec; }
|
||||
.login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
|
||||
background-color: #ffffff; }
|
||||
|
||||
.user-widget-label {
|
||||
color: #eeeeec; }
|
||||
|
||||
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
|
||||
index f93819b..d3d7fc8 100644
|
||||
--- a/data/theme/gnome-shell.css
|
||||
+++ b/data/theme/gnome-shell.css
|
||||
@@ -1223,60 +1223,63 @@ StScrollBar {
|
||||
-panel-corner-border-color: transparent;
|
||||
-panel-corner-opacity: 1;
|
||||
transition-duration: 250ms; }
|
||||
#panel .panel-button {
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
-natural-hpadding: 12px;
|
||||
-minimum-hpadding: 6px;
|
||||
transition-duration: 150ms;
|
||||
border: 3px solid transparent;
|
||||
border-radius: 99px; }
|
||||
#panel .panel-button.clock-display .clock {
|
||||
transition-duration: 150ms;
|
||||
border: 3px solid transparent;
|
||||
border-radius: 99px; }
|
||||
#panel .panel-button:hover, #panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.2); }
|
||||
#panel .panel-button.clock-display:hover, #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:overview, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
|
||||
box-shadow: none; }
|
||||
#panel .panel-button.clock-display:hover .clock, #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:overview .clock, #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:checked .clock {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.2); }
|
||||
#panel .panel-button .system-status-icon {
|
||||
icon-size: 1.09em;
|
||||
padding: 5px;
|
||||
margin: 0 4px; }
|
||||
#panel .panel-button .panel-status-indicators-box .system-status-icon,
|
||||
#panel .panel-button .panel-status-menu-box .system-status-icon {
|
||||
margin: 0; }
|
||||
#panel .panel-button .app-menu-icon {
|
||||
-st-icon-style: symbolic; }
|
||||
+ #panel .panel-button .panel-logo-icon {
|
||||
+ padding-right: .4em;
|
||||
+ icon-size: 1em; }
|
||||
#panel #panelActivities.panel-button {
|
||||
-natural-hpadding: 18px; }
|
||||
#panel.unlock-screen .panel-button:hover, #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:overview, #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:hover, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:overview, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:checked, #panel:overview .panel-button:hover, #panel:overview .panel-button:active, #panel:overview .panel-button:overview, #panel:overview .panel-button:focus, #panel:overview .panel-button:checked {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.15); }
|
||||
#panel.unlock-screen .panel-button.clock-display:hover, #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:overview, #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:overview, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:checked, #panel:overview .panel-button.clock-display:hover, #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:overview, #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:checked {
|
||||
box-shadow: none; }
|
||||
#panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:overview .clock, #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:overview .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:checked .clock, #panel:overview .panel-button.clock-display:hover .clock, #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:overview .clock, #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:checked .clock {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.15); }
|
||||
#panel .panel-status-indicators-box,
|
||||
#panel .panel-status-menu-box {
|
||||
spacing: 2px; }
|
||||
#panel .power-status.panel-status-indicators-box {
|
||||
spacing: 0; }
|
||||
#panel .screencast-indicator,
|
||||
#panel .remote-access-indicator {
|
||||
color: #f57900; }
|
||||
|
||||
#appMenu {
|
||||
spacing: 6px; }
|
||||
#appMenu .label-shadow {
|
||||
color: transparent; }
|
||||
|
||||
#appMenu .panel-status-menu-box {
|
||||
padding: 0 6px;
|
||||
spacing: 6px; }
|
||||
|
||||
/* Activities Ripple */
|
||||
.ripple-box {
|
||||
background-color: rgba(188, 214, 246, 0.3);
|
||||
box-shadow: 0 0 2px 2px #629fea;
|
||||
@@ -2039,74 +2042,107 @@ StScrollBar {
|
||||
width: 2.18em;
|
||||
height: 2.18em;
|
||||
border-color: #202020;
|
||||
background-color: #202020; }
|
||||
.login-dialog .cancel-button StIcon,
|
||||
.login-dialog .switch-user-button StIcon,
|
||||
.login-dialog .login-dialog-session-list-button StIcon,
|
||||
.unlock-dialog .cancel-button StIcon,
|
||||
.unlock-dialog .switch-user-button StIcon,
|
||||
.unlock-dialog .login-dialog-session-list-button StIcon {
|
||||
icon-size: 1.09em; }
|
||||
.login-dialog .caps-lock-warning-label,
|
||||
.login-dialog .login-dialog-message-warning,
|
||||
.unlock-dialog .caps-lock-warning-label,
|
||||
.unlock-dialog .login-dialog-message-warning {
|
||||
color: #eeeeec; }
|
||||
|
||||
.login-dialog-logo-bin {
|
||||
padding: 24px 0px; }
|
||||
|
||||
.login-dialog-banner {
|
||||
color: #d6d6d1; }
|
||||
|
||||
.login-dialog-button-box {
|
||||
width: 23em;
|
||||
spacing: 5px; }
|
||||
|
||||
.login-dialog-message {
|
||||
text-align: center; }
|
||||
|
||||
+.login-dialog-message-hint, .login-dialog-message {
|
||||
+ color: #bebeb6;
|
||||
+ min-height: 2.75em; }
|
||||
+
|
||||
.login-dialog-user-selection-box {
|
||||
padding: 100px 0px; }
|
||||
|
||||
.login-dialog-not-listed-label {
|
||||
padding-left: 2px; }
|
||||
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
|
||||
color: #eeeeec; }
|
||||
|
||||
.login-dialog-not-listed-label {
|
||||
font-size: 10pt;
|
||||
font-weight: bold;
|
||||
color: #a6a69b;
|
||||
padding-top: 1em; }
|
||||
|
||||
+.login-dialog-auth-list-view {
|
||||
+ -st-vfade-offset: 1em; }
|
||||
+
|
||||
+.login-dialog-auth-list {
|
||||
+ spacing: 6px;
|
||||
+ margin-left: 2em; }
|
||||
+
|
||||
+.login-dialog-auth-list-title {
|
||||
+ margin-left: 2em; }
|
||||
+
|
||||
+.login-dialog-auth-list-item {
|
||||
+ border-radius: 12px;
|
||||
+ padding: 6px;
|
||||
+ color: #a6a69b; }
|
||||
+ .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
|
||||
+ background-color: #1b6acb;
|
||||
+ color: #fff; }
|
||||
+
|
||||
+.login-dialog-auth-list-label {
|
||||
+ font-size: 13pt;
|
||||
+ font-weight: bold;
|
||||
+ padding-left: 15px; }
|
||||
+ .login-dialog-auth-list-label:ltr {
|
||||
+ padding-left: 14px;
|
||||
+ text-align: left; }
|
||||
+ .login-dialog-auth-list-label:rtl {
|
||||
+ padding-right: 14px;
|
||||
+ text-align: right; }
|
||||
+
|
||||
.login-dialog-user-list-view {
|
||||
-st-vfade-offset: 1em; }
|
||||
|
||||
.login-dialog-user-list {
|
||||
spacing: 12px;
|
||||
width: 23em; }
|
||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
|
||||
background-color: #1b6acb;
|
||||
color: #fff; }
|
||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
|
||||
border-right: 2px solid #1b6acb; }
|
||||
|
||||
.login-dialog-user-list-item {
|
||||
border-radius: 12px;
|
||||
padding: 6px;
|
||||
color: #a6a69b; }
|
||||
.login-dialog-user-list-item:ltr .user-widget {
|
||||
padding-right: 1em; }
|
||||
.login-dialog-user-list-item:rtl .user-widget {
|
||||
padding-left: 1em; }
|
||||
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
||||
height: 2px;
|
||||
margin-top: 6px;
|
||||
background-color: #eeeeec; }
|
||||
.login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
|
||||
background-color: #fff; }
|
||||
|
||||
.user-widget-label {
|
||||
color: #eeeeec; }
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,28 @@
|
||||
From afa3fc7be62cf70c9f6c6954e9cf5b49581269fb Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 20 May 2015 16:44:00 +0200
|
||||
Subject: [PATCH] app: Fall back to window title instead of WM_CLASS
|
||||
|
||||
It's a bad fallback as it's clearly window-specific (rather than
|
||||
app-specific), but it likely looks prettier when we fail to associate
|
||||
a .desktop file ...
|
||||
---
|
||||
src/shell-app.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shell-app.c b/src/shell-app.c
|
||||
index 62ba2ec73..dc0e1c732 100644
|
||||
--- a/src/shell-app.c
|
||||
+++ b/src/shell-app.c
|
||||
@@ -293,7 +293,7 @@ shell_app_get_name (ShellApp *app)
|
||||
const char *name = NULL;
|
||||
|
||||
if (window)
|
||||
- name = meta_window_get_wm_class (window);
|
||||
+ name = meta_window_get_title (window);
|
||||
if (!name)
|
||||
name = C_("program", "Unknown");
|
||||
return name;
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,36 @@
|
||||
From c18b7b7819f17f5d14be1ba2760653f3d93b81b1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 1 Feb 2021 18:26:00 +0100
|
||||
Subject: [PATCH] extensionDownloader: Refuse to override system extensions
|
||||
|
||||
The website allows to "update" system extensions by installing the
|
||||
upstream version into the user's home directory.
|
||||
|
||||
Prevent that by refusing to download and install extensions that are
|
||||
already installed system-wide.
|
||||
---
|
||||
js/ui/extensionDownloader.js | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/js/ui/extensionDownloader.js b/js/ui/extensionDownloader.js
|
||||
index 6a3b2b488..471ddab14 100644
|
||||
--- a/js/ui/extensionDownloader.js
|
||||
+++ b/js/ui/extensionDownloader.js
|
||||
@@ -17,6 +17,14 @@ var REPOSITORY_URL_UPDATE = 'https://extensions.gnome.org/update-info/';
|
||||
let _httpSession;
|
||||
|
||||
function installExtension(uuid, invocation) {
|
||||
+ const oldExt = Main.extensionManager.lookup(uuid);
|
||||
+ if (oldExt && oldExt.type === ExtensionUtils.ExtensionType.SYSTEM) {
|
||||
+ log('extensionDownloader: Trying to replace system extension %s'.format(uuid));
|
||||
+ invocation.return_dbus_error('org.gnome.Shell.InstallError',
|
||||
+ 'System extensions cannot be replaced');
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
let params = { uuid,
|
||||
shell_version: Config.PACKAGE_VERSION };
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,51 @@
|
||||
From eea9b9a0dac494698a64892bab8d042e7d623c9f Mon Sep 17 00:00:00 2001
|
||||
From: Cenk Uluisik <cenk.uluisik@googlemail.com>
|
||||
Date: Sun, 6 Mar 2022 19:32:48 +0100
|
||||
Subject: [PATCH] introspect: Add WindowsChanged signal
|
||||
|
||||
The screencast portal supports recording a single window,
|
||||
and presents a list of open windows when that option is
|
||||
selected. To allow updating that list when windows are
|
||||
opened or closed, add a new "WindowsChanged" signal that
|
||||
the portal can listen to.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2229>
|
||||
---
|
||||
data/dbus-interfaces/org.gnome.Shell.Introspect.xml | 6 ++++++
|
||||
js/misc/introspect.js | 3 +++
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/data/dbus-interfaces/org.gnome.Shell.Introspect.xml b/data/dbus-interfaces/org.gnome.Shell.Introspect.xml
|
||||
index 47fd7efdc2..cb19cfec56 100644
|
||||
--- a/data/dbus-interfaces/org.gnome.Shell.Introspect.xml
|
||||
+++ b/data/dbus-interfaces/org.gnome.Shell.Introspect.xml
|
||||
@@ -18,6 +18,12 @@
|
||||
-->
|
||||
<signal name="RunningApplicationsChanged" />
|
||||
|
||||
+ <!--
|
||||
+ WindowsChanged:
|
||||
+ @short_description: Notifies when any window opens or closes
|
||||
+ -->
|
||||
+ <signal name="WindowsChanged" />
|
||||
+
|
||||
<!--
|
||||
GetRunningApplications:
|
||||
@short_description: Retrieves the description of all running applications
|
||||
diff --git a/js/misc/introspect.js b/js/misc/introspect.js
|
||||
index 45eee81ce3..8916804e7f 100644
|
||||
--- a/js/misc/introspect.js
|
||||
+++ b/js/misc/introspect.js
|
||||
@@ -42,6 +42,9 @@ var IntrospectService = class {
|
||||
this._syncRunningApplications();
|
||||
});
|
||||
|
||||
+ tracker.connect('tracked-windows-changed',
|
||||
+ () => this._dbusImpl.emit_signal('WindowsChanged', null));
|
||||
+
|
||||
this._syncRunningApplications();
|
||||
|
||||
this._senderChecker = new DBusSenderChecker(APP_ALLOWLIST);
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,33 @@
|
||||
From b73a07c20a522b3be0e096625c21d5606bcb7d82 Mon Sep 17 00:00:00 2001
|
||||
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
Date: Mon, 21 Jun 2021 16:32:50 -0300
|
||||
Subject: [PATCH] introspect: Allowlist GNOME portal
|
||||
|
||||
It too implements app listing and introspection, so list it in the
|
||||
allowlist.
|
||||
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1894>
|
||||
---
|
||||
js/misc/introspect.js | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/misc/introspect.js b/js/misc/introspect.js
|
||||
index f3c938af9..45eee81ce 100644
|
||||
--- a/js/misc/introspect.js
|
||||
+++ b/js/misc/introspect.js
|
||||
@@ -1,7 +1,10 @@
|
||||
/* exported IntrospectService */
|
||||
const { Gio, GLib, Meta, Shell, St } = imports.gi;
|
||||
|
||||
-const APP_ALLOWLIST = ['org.freedesktop.impl.portal.desktop.gtk'];
|
||||
+const APP_ALLOWLIST = [
|
||||
+ 'org.freedesktop.impl.portal.desktop.gtk',
|
||||
+ 'org.freedesktop.impl.portal.desktop.gnome',
|
||||
+];
|
||||
|
||||
const INTROSPECT_DBUS_API_VERSION = 3;
|
||||
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,51 @@
|
||||
From bd4fef8354ff0730c1e96a47d77adbb4a4d7beaa Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Tue, 14 Jun 2022 16:38:27 +0200
|
||||
Subject: [PATCH] kbdA11yDialog: Use MetaKeyboardA11yFlags
|
||||
|
||||
The change in mutter to move keyboard accessibility into backends needs
|
||||
to be applied in gnome-shell as well, otherwise the keyboard
|
||||
accessibility dialog cannot work.
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2306
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2334>
|
||||
---
|
||||
js/ui/kbdA11yDialog.js | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/js/ui/kbdA11yDialog.js b/js/ui/kbdA11yDialog.js
|
||||
index a45e02443..60ec161a6 100644
|
||||
--- a/js/ui/kbdA11yDialog.js
|
||||
+++ b/js/ui/kbdA11yDialog.js
|
||||
@@ -1,5 +1,5 @@
|
||||
/* exported KbdA11yDialog */
|
||||
-const { Clutter, Gio, GObject } = imports.gi;
|
||||
+const { Clutter, Gio, GObject, Meta } = imports.gi;
|
||||
|
||||
const Dialog = imports.ui.dialog;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
@@ -25,17 +25,17 @@ class KbdA11yDialog extends GObject.Object {
|
||||
let title, description;
|
||||
let key, enabled;
|
||||
|
||||
- if (whatChanged & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) {
|
||||
+ if (whatChanged & Meta.KeyboardA11yFlags.SLOW_KEYS_ENABLED) {
|
||||
key = KEY_SLOW_KEYS_ENABLED;
|
||||
- enabled = (newFlags & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) > 0;
|
||||
+ enabled = (newFlags & Meta.KeyboardA11yFlags.SLOW_KEYS_ENABLED) > 0;
|
||||
title = enabled
|
||||
? _("Slow Keys Turned On")
|
||||
: _("Slow Keys Turned Off");
|
||||
description = _('You just held down the Shift key for 8 seconds. This is the shortcut ' +
|
||||
'for the Slow Keys feature, which affects the way your keyboard works.');
|
||||
- } else if (whatChanged & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) {
|
||||
+ } else if (whatChanged & Meta.KeyboardA11yFlags.STICKY_KEYS_ENABLED) {
|
||||
key = KEY_STICKY_KEYS_ENABLED;
|
||||
- enabled = (newFlags & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) > 0;
|
||||
+ enabled = (newFlags & Meta.KeyboardA11yFlags.STICKY_KEYS_ENABLED) > 0;
|
||||
title = enabled
|
||||
? _("Sticky Keys Turned On")
|
||||
: _("Sticky Keys Turned Off");
|
||||
--
|
||||
2.36.1
|
||||
|
@ -0,0 +1,48 @@
|
||||
From 5aeb97faee1aba8f6d4cc2c613691a7e2c880ccc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 17 Nov 2022 15:21:42 +0100
|
||||
Subject: [PATCH] layout: Initialize regions unconditionally
|
||||
|
||||
We currently initialize regions in all code paths except for the
|
||||
greeter. But while there are no windows on the login screen, the
|
||||
work area can still be used for positioning, for example for
|
||||
notifications.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2546>
|
||||
---
|
||||
js/ui/layout.js | 15 +++++++--------
|
||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/js/ui/layout.js b/js/ui/layout.js
|
||||
index 70ece6cab..c6712459a 100644
|
||||
--- a/js/ui/layout.js
|
||||
+++ b/js/ui/layout.js
|
||||
@@ -649,18 +649,17 @@ var LayoutManager = GObject.registerClass({
|
||||
reactive: true });
|
||||
this.addChrome(this._coverPane);
|
||||
|
||||
+ // Force an update of the regions before we scale the UI group to
|
||||
+ // get the correct allocation for the struts.
|
||||
+ // Do this even when we don't animate on restart, so that maximized
|
||||
+ // windows restore to the right size.
|
||||
+ this._updateRegions();
|
||||
+
|
||||
if (Meta.is_restart()) {
|
||||
- // On restart, we don't do an animation. Force an update of the
|
||||
- // regions immediately so that maximized windows restore to the
|
||||
- // right size taking struts into account.
|
||||
- this._updateRegions();
|
||||
+ // On restart, we don't do an animation.
|
||||
} else if (Main.sessionMode.isGreeter) {
|
||||
this.panelBox.translation_y = -this.panelBox.height;
|
||||
} else {
|
||||
- // We need to force an update of the regions now before we scale
|
||||
- // the UI group to get the correct allocation for the struts.
|
||||
- this._updateRegions();
|
||||
-
|
||||
this.keyboardBox.hide();
|
||||
|
||||
let monitor = this.primaryMonitor;
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,83 @@
|
||||
From 4ad30b5c506ab043c2091441021b6cf334e2412f Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 26 Jun 2017 14:35:05 -0400
|
||||
Subject: [PATCH] loginDialog: make info messages themed
|
||||
|
||||
They were lacking a definition before leading them to
|
||||
show up invisible.
|
||||
---
|
||||
data/theme/gnome-shell-sass/widgets/_login-dialog.scss | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
|
||||
index 1789beca9..84539342d 100644
|
||||
--- a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
|
||||
+++ b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
|
||||
@@ -66,60 +66,64 @@
|
||||
border-color: darken($selected_bg_color, 10%);
|
||||
background-color: darken($selected_bg_color, 10%);
|
||||
color: transparentize($selected_fg_color, 0.3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.cancel-button,
|
||||
.switch-user-button,
|
||||
.login-dialog-session-list-button {
|
||||
padding: 0;
|
||||
border-radius: 99px;
|
||||
width: $base_icon_size * 2;
|
||||
height: $base_icon_size * 2;
|
||||
border-color: darken($system_bg_color, 3%);
|
||||
background-color: darken($system_bg_color, 3%);
|
||||
|
||||
StIcon { icon-size: $base_icon_size; }
|
||||
}
|
||||
|
||||
.caps-lock-warning-label,
|
||||
.login-dialog-message-warning {
|
||||
color: $osd_fg_color;
|
||||
}
|
||||
}
|
||||
|
||||
.login-dialog-logo-bin { padding: 24px 0px; }
|
||||
.login-dialog-banner { color: darken($osd_fg_color,10%); }
|
||||
.login-dialog-button-box { width: 23em; spacing: 5px; }
|
||||
.login-dialog-message { text-align: center; }
|
||||
+.login-dialog-message-hint, .login-dialog-message {
|
||||
+ color: darken($osd_fg_color, 20%);
|
||||
+ min-height: 2.75em;
|
||||
+}
|
||||
.login-dialog-user-selection-box { padding: 100px 0px; }
|
||||
.login-dialog-not-listed-label {
|
||||
padding-left: 2px;
|
||||
.login-dialog-not-listed-button:focus &,
|
||||
.login-dialog-not-listed-button:hover & {
|
||||
color: $osd_fg_color;
|
||||
}
|
||||
}
|
||||
|
||||
.login-dialog-not-listed-label {
|
||||
@include fontsize($base_font_size - 1);
|
||||
font-weight: bold;
|
||||
color: darken($osd_fg_color,30%);
|
||||
padding-top: 1em;
|
||||
}
|
||||
|
||||
.login-dialog-user-list-view { -st-vfade-offset: 1em; }
|
||||
.login-dialog-user-list {
|
||||
spacing: 12px;
|
||||
width: 23em;
|
||||
&:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
|
||||
&:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
|
||||
}
|
||||
|
||||
.login-dialog-user-list-item {
|
||||
border-radius: $base_border_radius + 4px;
|
||||
padding: 6px;
|
||||
color: darken($osd_fg_color,30%);
|
||||
&:ltr .user-widget { padding-right: 1em; }
|
||||
&:rtl .user-widget { padding-left: 1em; }
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,148 @@
|
||||
From ea7e7acd45e428cc17306de2bf65730c90d7e118 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Keller <skeller@gnome.org>
|
||||
Date: Mon, 23 May 2022 23:01:23 +0200
|
||||
Subject: [PATCH] magnifier: Request window-relative coordinates for
|
||||
focus/caret events
|
||||
|
||||
Absolute screen coordinates are impossible for Wayland clients to
|
||||
provide, because the clients don't know where the window is positioned.
|
||||
Some clients, such as the ones using GTK 3 were providing window
|
||||
relative coordinates even when screen coordinates were requested,
|
||||
while others, such as GTK 4 clients, were just returning an error for
|
||||
caret events or also window-relative coordinates for focus events.
|
||||
|
||||
So for this to work on Wayland we have to request window-relative
|
||||
coordinates and translate them to the current focus window.
|
||||
|
||||
To ensure the correct coordinates, we have to only consider events
|
||||
coming from the current focus window. All other events are filtered out
|
||||
now. As a side effect this also fixes the magnifier always jumping
|
||||
to a terminal cursor whenever there was some output, even if the window
|
||||
was not focused.
|
||||
|
||||
This also needs some special handling for events coming from the shell
|
||||
itself, which should not be translated to the focus window either. As
|
||||
another side effect this fixes another bug that was caused by these
|
||||
events already including scaling and getting scaled again.
|
||||
|
||||
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5509
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2301>
|
||||
---
|
||||
js/ui/magnifier.js | 77 +++++++++++++++++++++++++++++++++++++++++-----
|
||||
1 file changed, 70 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js
|
||||
index 4c2e88f1a..9813664be 100644
|
||||
--- a/js/ui/magnifier.js
|
||||
+++ b/js/ui/magnifier.js
|
||||
@@ -789,21 +789,81 @@ var ZoomRegion = class ZoomRegion {
|
||||
}
|
||||
}
|
||||
|
||||
+ _convertExtentsToScreenSpace(accessible, extents) {
|
||||
+ const toplevelWindowTypes = new Set([
|
||||
+ Atspi.Role.FRAME,
|
||||
+ Atspi.Role.DIALOG,
|
||||
+ Atspi.Role.WINDOW,
|
||||
+ ]);
|
||||
+
|
||||
+ try {
|
||||
+ let app = null;
|
||||
+ let parentWindow = null;
|
||||
+ let iter = accessible;
|
||||
+ while (iter) {
|
||||
+ if (iter.get_role() === Atspi.Role.APPLICATION) {
|
||||
+ app = iter;
|
||||
+ /* This is the last Accessible we are interested in */
|
||||
+ break;
|
||||
+ } else if (toplevelWindowTypes.has(iter.get_role())) {
|
||||
+ parentWindow = iter;
|
||||
+ }
|
||||
+ iter = iter.get_parent();
|
||||
+ }
|
||||
+
|
||||
+ /* We don't want to translate our own events to the focus window.
|
||||
+ * They are also already scaled by clutter before being sent, so
|
||||
+ * we don't need to do that here either. */
|
||||
+ if (app && app.get_name() === 'gnome-shell')
|
||||
+ return extents;
|
||||
+
|
||||
+ /* Only events from the focused widget of the focused window. Some
|
||||
+ * widgets seem to claim to have focus when the window does not so
|
||||
+ * check both. */
|
||||
+ const windowActive = parentWindow &&
|
||||
+ parentWindow.get_state_set().contains(Atspi.StateType.ACTIVE);
|
||||
+ const accessibleFocused =
|
||||
+ accessible.get_state_set().contains(Atspi.StateType.FOCUSED);
|
||||
+ if (!windowActive || !accessibleFocused)
|
||||
+ return null;
|
||||
+ } catch (e) {
|
||||
+ throw new Error(`Failed to validate parent window: ${e}`);
|
||||
+ }
|
||||
+
|
||||
+ const focusWindowRect = global.display.focus_window?.get_frame_rect();
|
||||
+ if (!focusWindowRect)
|
||||
+ return null;
|
||||
+
|
||||
+ const scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
+ const screenSpaceExtents = new Atspi.Rect({
|
||||
+ x: focusWindowRect.x + (scaleFactor * extents.x),
|
||||
+ y: focusWindowRect.y + (scaleFactor * extents.y),
|
||||
+ width: scaleFactor * extents.width,
|
||||
+ height: scaleFactor * extents.height,
|
||||
+ });
|
||||
+
|
||||
+ return screenSpaceExtents;
|
||||
+ }
|
||||
+
|
||||
_updateFocus(caller, event) {
|
||||
let component = event.source.get_component_iface();
|
||||
if (!component || event.detail1 != 1)
|
||||
return;
|
||||
let extents;
|
||||
try {
|
||||
- extents = component.get_extents(Atspi.CoordType.SCREEN);
|
||||
+ extents = component.get_extents(Atspi.CoordType.WINDOW);
|
||||
+ extents = this._convertExtentsToScreenSpace(event.source, extents);
|
||||
+ if (!extents)
|
||||
+ return;
|
||||
} catch (e) {
|
||||
log(`Failed to read extents of focused component: ${e.message}`);
|
||||
return;
|
||||
}
|
||||
|
||||
- let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
- let [xFocus, yFocus] = [(extents.x + (extents.width / 2)) * scaleFactor,
|
||||
- (extents.y + (extents.height / 2)) * scaleFactor];
|
||||
+ const [xFocus, yFocus] = [
|
||||
+ extents.x + (extents.width / 2),
|
||||
+ extents.y + (extents.height / 2),
|
||||
+ ];
|
||||
|
||||
if (this._xFocus !== xFocus || this._yFocus !== yFocus) {
|
||||
[this._xFocus, this._yFocus] = [xFocus, yFocus];
|
||||
@@ -817,14 +877,17 @@ var ZoomRegion = class ZoomRegion {
|
||||
return;
|
||||
let extents;
|
||||
try {
|
||||
- extents = text.get_character_extents(text.get_caret_offset(), 0);
|
||||
+ extents = text.get_character_extents(text.get_caret_offset(),
|
||||
+ Atspi.CoordType.WINDOW);
|
||||
+ extents = this._convertExtentsToScreenSpace(text, extents);
|
||||
+ if (!extents)
|
||||
+ return;
|
||||
} catch (e) {
|
||||
log(`Failed to read extents of text caret: ${e.message}`);
|
||||
return;
|
||||
}
|
||||
|
||||
- let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
- let [xCaret, yCaret] = [extents.x * scaleFactor, extents.y * scaleFactor];
|
||||
+ const [xCaret, yCaret] = [extents.x, extents.y];
|
||||
|
||||
// Ignore event(s) if the caret size is none (0x0). This happens a lot if
|
||||
// the cursor offset can't be translated into a location. This is a work
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From f54c3f9f66001c210e10fda6aa17b9218fb67dc1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 29 Oct 2020 18:21:06 +0100
|
||||
Subject: [PATCH] main: Dump stack on segfaults by default
|
||||
|
||||
---
|
||||
src/main.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/main.c b/src/main.c
|
||||
index 5d07a4301..ed0b78dcc 100644
|
||||
--- a/src/main.c
|
||||
+++ b/src/main.c
|
||||
@@ -38,6 +38,7 @@ static int caught_signal = 0;
|
||||
#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
|
||||
#define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4
|
||||
|
||||
+#define DEFAULT_SHELL_DEBUG SHELL_DEBUG_BACKTRACE_SEGFAULTS
|
||||
enum {
|
||||
SHELL_DEBUG_BACKTRACE_WARNINGS = 1,
|
||||
SHELL_DEBUG_BACKTRACE_SEGFAULTS = 2,
|
||||
@@ -279,8 +280,11 @@ shell_init_debug (const char *debug_env)
|
||||
{ "backtrace-segfaults", SHELL_DEBUG_BACKTRACE_SEGFAULTS },
|
||||
};
|
||||
|
||||
- _shell_debug = g_parse_debug_string (debug_env, keys,
|
||||
- G_N_ELEMENTS (keys));
|
||||
+ if (debug_env)
|
||||
+ _shell_debug = g_parse_debug_string (debug_env, keys,
|
||||
+ G_N_ELEMENTS (keys));
|
||||
+ else
|
||||
+ _shell_debug = DEFAULT_SHELL_DEBUG;
|
||||
}
|
||||
|
||||
static void
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,31 @@
|
||||
From a9e79b1657dc7c1b702d7acc4d322539d2b8b6aa Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Wed, 6 Oct 2021 10:00:43 +0200
|
||||
Subject: [PATCH] main: Leak the GJS context and ShellGlobal
|
||||
|
||||
There are many crash-on-exit happening as a side effect of destroying
|
||||
the GJS context. Work around these until we have a better solution by
|
||||
leaking them.
|
||||
---
|
||||
src/main.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/main.c b/src/main.c
|
||||
index 91e5493fd1..d62dda9627 100644
|
||||
--- a/src/main.c
|
||||
+++ b/src/main.c
|
||||
@@ -508,9 +508,11 @@ main (int argc, char **argv)
|
||||
ecode = meta_run ();
|
||||
shell_profiler_shutdown ();
|
||||
|
||||
+#if 0
|
||||
g_debug ("Doing final cleanup");
|
||||
_shell_global_destroy_gjs_context (shell_global_get ());
|
||||
g_object_unref (shell_global_get ());
|
||||
+#endif
|
||||
|
||||
return ecode;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,281 @@
|
||||
From be3a2303cf9ed4077955aaa9fae1fc4cbe2da277 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 24 Jan 2023 17:49:24 +0100
|
||||
Subject: [PATCH] =?UTF-8?q?osk-layouts:=20Replace=20"SS"=20extra=20key=20w?=
|
||||
=?UTF-8?q?ith=20"=E1=BA=9E"?=
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The on-screen keyboard only handles a single keyval per key, so the
|
||||
current upper-case version of the German "ß" ends up as "S" instead
|
||||
of the expected "SS".
|
||||
|
||||
It is possible to change the keyboard code to emulate multiple key
|
||||
presses/releases for that particular case, but then luckily a proper
|
||||
upper-case form exists nowadays: "ẞ".
|
||||
|
||||
That seems more appropriate for a single key than a dedicated "SS"
|
||||
key, so replace it in all layouts that include it. Anybody who prefers
|
||||
the traditional "SS" can easily tap "S" twice.
|
||||
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2612>
|
||||
---
|
||||
data/osk-layouts/cz.json | 2 +-
|
||||
data/osk-layouts/de.json | 2 +-
|
||||
data/osk-layouts/dk.json | 2 +-
|
||||
data/osk-layouts/ee.json | 2 +-
|
||||
data/osk-layouts/epo.json | 2 +-
|
||||
data/osk-layouts/fi.json | 2 +-
|
||||
data/osk-layouts/hr.json | 2 +-
|
||||
data/osk-layouts/ke.json | 2 +-
|
||||
data/osk-layouts/lt.json | 2 +-
|
||||
data/osk-layouts/lv.json | 2 +-
|
||||
data/osk-layouts/no.json | 2 +-
|
||||
data/osk-layouts/pl.json | 2 +-
|
||||
data/osk-layouts/ro.json | 2 +-
|
||||
data/osk-layouts/se.json | 2 +-
|
||||
data/osk-layouts/sk.json | 2 +-
|
||||
data/osk-layouts/tr.json | 2 +-
|
||||
data/osk-layouts/uk.json | 2 +-
|
||||
data/osk-layouts/us.json | 2 +-
|
||||
18 files changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/data/osk-layouts/cz.json b/data/osk-layouts/cz.json
|
||||
index 9bad07402..526cb9cb6 100644
|
||||
--- a/data/osk-layouts/cz.json
|
||||
+++ b/data/osk-layouts/cz.json
|
||||
@@ -246,7 +246,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś"
|
||||
],
|
||||
[
|
||||
diff --git a/data/osk-layouts/de.json b/data/osk-layouts/de.json
|
||||
index 751a85603..3b1cb34b2 100644
|
||||
--- a/data/osk-layouts/de.json
|
||||
+++ b/data/osk-layouts/de.json
|
||||
@@ -208,7 +208,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/dk.json b/data/osk-layouts/dk.json
|
||||
index 80df9ae65..7bc6feaf3 100644
|
||||
--- a/data/osk-layouts/dk.json
|
||||
+++ b/data/osk-layouts/dk.json
|
||||
@@ -218,7 +218,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/ee.json b/data/osk-layouts/ee.json
|
||||
index 5fd2f11fa..b42b0afc9 100644
|
||||
--- a/data/osk-layouts/ee.json
|
||||
+++ b/data/osk-layouts/ee.json
|
||||
@@ -281,7 +281,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Ş"
|
||||
],
|
||||
diff --git a/data/osk-layouts/epo.json b/data/osk-layouts/epo.json
|
||||
index 71f9ef8d9..d7257625f 100644
|
||||
--- a/data/osk-layouts/epo.json
|
||||
+++ b/data/osk-layouts/epo.json
|
||||
@@ -316,7 +316,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Š",
|
||||
"Ś",
|
||||
"Ș",
|
||||
diff --git a/data/osk-layouts/fi.json b/data/osk-layouts/fi.json
|
||||
index 3ba5b567c..d664b0ec5 100644
|
||||
--- a/data/osk-layouts/fi.json
|
||||
+++ b/data/osk-layouts/fi.json
|
||||
@@ -200,7 +200,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś"
|
||||
],
|
||||
[
|
||||
diff --git a/data/osk-layouts/hr.json b/data/osk-layouts/hr.json
|
||||
index ff0d1d09a..e4977796a 100644
|
||||
--- a/data/osk-layouts/hr.json
|
||||
+++ b/data/osk-layouts/hr.json
|
||||
@@ -168,7 +168,7 @@
|
||||
"S",
|
||||
"Š",
|
||||
"Ś",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D",
|
||||
diff --git a/data/osk-layouts/ke.json b/data/osk-layouts/ke.json
|
||||
index 9c3e93565..2bd5b09d0 100644
|
||||
--- a/data/osk-layouts/ke.json
|
||||
+++ b/data/osk-layouts/ke.json
|
||||
@@ -217,7 +217,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D"
|
||||
diff --git a/data/osk-layouts/lt.json b/data/osk-layouts/lt.json
|
||||
index 7cd5352a8..a43ff9146 100644
|
||||
--- a/data/osk-layouts/lt.json
|
||||
+++ b/data/osk-layouts/lt.json
|
||||
@@ -270,7 +270,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Ş"
|
||||
],
|
||||
diff --git a/data/osk-layouts/lv.json b/data/osk-layouts/lv.json
|
||||
index bab6ae3d7..d72c93c25 100644
|
||||
--- a/data/osk-layouts/lv.json
|
||||
+++ b/data/osk-layouts/lv.json
|
||||
@@ -268,7 +268,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Ş"
|
||||
],
|
||||
diff --git a/data/osk-layouts/no.json b/data/osk-layouts/no.json
|
||||
index a70be9ca0..0df786853 100644
|
||||
--- a/data/osk-layouts/no.json
|
||||
+++ b/data/osk-layouts/no.json
|
||||
@@ -218,7 +218,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/pl.json b/data/osk-layouts/pl.json
|
||||
index 4b08cd5d3..8583bd64c 100644
|
||||
--- a/data/osk-layouts/pl.json
|
||||
+++ b/data/osk-layouts/pl.json
|
||||
@@ -212,7 +212,7 @@
|
||||
[
|
||||
"S",
|
||||
"Ś",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Š"
|
||||
],
|
||||
[
|
||||
diff --git a/data/osk-layouts/ro.json b/data/osk-layouts/ro.json
|
||||
index c690f4ecd..8d4676126 100644
|
||||
--- a/data/osk-layouts/ro.json
|
||||
+++ b/data/osk-layouts/ro.json
|
||||
@@ -188,7 +188,7 @@
|
||||
[
|
||||
"S",
|
||||
"Ș",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/se.json b/data/osk-layouts/se.json
|
||||
index 513a0b897..0ebb756e7 100644
|
||||
--- a/data/osk-layouts/se.json
|
||||
+++ b/data/osk-layouts/se.json
|
||||
@@ -245,7 +245,7 @@
|
||||
"Ś",
|
||||
"Š",
|
||||
"Ş",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D",
|
||||
diff --git a/data/osk-layouts/sk.json b/data/osk-layouts/sk.json
|
||||
index 678232b82..a74ad0b61 100644
|
||||
--- a/data/osk-layouts/sk.json
|
||||
+++ b/data/osk-layouts/sk.json
|
||||
@@ -269,7 +269,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Ş"
|
||||
],
|
||||
diff --git a/data/osk-layouts/tr.json b/data/osk-layouts/tr.json
|
||||
index b3786cc88..8243aafad 100644
|
||||
--- a/data/osk-layouts/tr.json
|
||||
+++ b/data/osk-layouts/tr.json
|
||||
@@ -202,7 +202,7 @@
|
||||
[
|
||||
"S",
|
||||
"Ş",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/uk.json b/data/osk-layouts/uk.json
|
||||
index c36a723a0..19f5aa6d9 100644
|
||||
--- a/data/osk-layouts/uk.json
|
||||
+++ b/data/osk-layouts/uk.json
|
||||
@@ -216,7 +216,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D"
|
||||
diff --git a/data/osk-layouts/us.json b/data/osk-layouts/us.json
|
||||
index 94dd6d3ad..dd0cd368f 100644
|
||||
--- a/data/osk-layouts/us.json
|
||||
+++ b/data/osk-layouts/us.json
|
||||
@@ -216,7 +216,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D"
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,56 @@
|
||||
From b5db4d318546654f4e9c1e4999fa00456441f105 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 15 Jan 2014 16:45:34 -0500
|
||||
Subject: [PATCH] panel: add an icon to the ActivitiesButton
|
||||
|
||||
Requested by brand
|
||||
---
|
||||
data/theme/gnome-shell-sass/widgets/_panel.scss | 5 +++++
|
||||
js/ui/panel.js | 11 ++++++++++-
|
||||
2 files changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/widgets/_panel.scss b/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
index 1f4650773..5f323cbc8 100644
|
||||
--- a/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
+++ b/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
@@ -85,6 +85,11 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
|
||||
// dimensions of the icon are hardcoded
|
||||
}
|
||||
|
||||
+ .panel-logo-icon {
|
||||
+ padding-right: .4em;
|
||||
+ icon-size: 1em;
|
||||
+ }
|
||||
+
|
||||
&#panelActivities {
|
||||
-natural-hpadding: $base_padding * 3;
|
||||
}
|
||||
diff --git a/js/ui/panel.js b/js/ui/panel.js
|
||||
index 1474886ef..ad11f4ba2 100644
|
||||
--- a/js/ui/panel.js
|
||||
+++ b/js/ui/panel.js
|
||||
@@ -390,11 +390,20 @@ class ActivitiesButton extends PanelMenu.Button {
|
||||
|
||||
this.name = 'panelActivities';
|
||||
|
||||
+ const box = new St.BoxLayout();
|
||||
+ this.add_child(box);
|
||||
+ const iconFile = Gio.File.new_for_path('/usr/share/icons/hicolor/scalable/apps/start-here.svg');
|
||||
+ this._icon = new St.Icon({
|
||||
+ gicon: new Gio.FileIcon({ file: iconFile }),
|
||||
+ style_class: 'panel-logo-icon',
|
||||
+ });
|
||||
+ box.add_child(this._icon);
|
||||
+
|
||||
/* Translators: If there is no suitable word for "Activities"
|
||||
in your language, you can use the word for "Overview". */
|
||||
this._label = new St.Label({ text: _("Activities"),
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
- this.add_actor(this._label);
|
||||
+ box.add_child(this._label);
|
||||
|
||||
this.label_actor = this._label;
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,33 @@
|
||||
From 1e4e9248ef6bcdd95ec3b91c8c8e94c4587a876b Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Fri, 3 Jul 2015 13:54:36 -0400
|
||||
Subject: [PATCH] screenShield: unblank when inserting smartcard
|
||||
|
||||
If a user inserts the smartcard when the screen is locked/blanked
|
||||
we should ask them their pin right away.
|
||||
|
||||
At the moment they have to wiggle the mouse or do some other
|
||||
action to get the screen to unblank.
|
||||
---
|
||||
js/ui/screenShield.js | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
|
||||
index 9a64fc32c..bc1a0fba7 100644
|
||||
--- a/js/ui/screenShield.js
|
||||
+++ b/js/ui/screenShield.js
|
||||
@@ -85,8 +85,10 @@ var ScreenShield = class {
|
||||
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
||||
this._smartcardManager.connect('smartcard-inserted',
|
||||
(manager, token) => {
|
||||
- if (this._isLocked && token.UsedToLogin)
|
||||
+ if (this._isLocked && token.UsedToLogin) {
|
||||
+ this._wakeUpScreen();
|
||||
this._activateDialog();
|
||||
+ }
|
||||
});
|
||||
|
||||
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 187b851530f5e76786784ec9df235304c8ddede8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 4 Aug 2021 19:46:34 +0200
|
||||
Subject: [PATCH] st/icon: Only get resource-scale after peeking theme node
|
||||
|
||||
If an actor is not on any stage view, then it doesn't have a valid
|
||||
resource scale, which will hit an assert later.
|
||||
|
||||
When that is the case (for example when running headless), we expect
|
||||
that there is no valid theme node (yet) either, so simply moving
|
||||
the clutter_actor_get_resource_scale() call after peeking at the
|
||||
theme node is enough to avoid the crash.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4522
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1935>
|
||||
---
|
||||
src/st/st-icon.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/st/st-icon.c b/src/st/st-icon.c
|
||||
index 0405d85259..e4d6e05f94 100644
|
||||
--- a/src/st/st-icon.c
|
||||
+++ b/src/st/st-icon.c
|
||||
@@ -462,6 +462,8 @@ st_icon_update (StIcon *icon)
|
||||
|
||||
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (icon));
|
||||
|
||||
+ resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (icon));
|
||||
+
|
||||
stage = clutter_actor_get_stage (CLUTTER_ACTOR (icon));
|
||||
context = st_theme_context_get_for_stage (CLUTTER_STAGE (stage));
|
||||
g_object_get (context, "scale-factor", &paint_scale, NULL);
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,66 @@
|
||||
From 483f0340bb64767bd8d6d95788058270dfdb5def Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 15 Jan 2019 12:54:32 -0500
|
||||
Subject: [PATCH] st-texture-cache: purge on resume
|
||||
|
||||
With the proprietary nvidia driver, textures get garbled on suspend,
|
||||
so the texture cache needs to evict all textures in that situation.
|
||||
---
|
||||
js/ui/main.js | 6 +++++-
|
||||
src/st/st-texture-cache.c | 10 ++++++++++
|
||||
src/st/st-texture-cache.h | 1 +
|
||||
3 files changed, 16 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/main.js b/js/ui/main.js
|
||||
index 979fcefa5..dbf3a32d3 100644
|
||||
--- a/js/ui/main.js
|
||||
+++ b/js/ui/main.js
|
||||
@@ -249,7 +249,11 @@ function _initializeUI() {
|
||||
return true;
|
||||
});
|
||||
|
||||
- global.display.connect('gl-video-memory-purged', loadTheme);
|
||||
+ global.display.connect('gl-video-memory-purged', () => {
|
||||
+ let cache = St.TextureCache.get_default();
|
||||
+ cache.clear();
|
||||
+ loadTheme();
|
||||
+ });
|
||||
|
||||
// Provide the bus object for gnome-session to
|
||||
// initiate logouts.
|
||||
diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c
|
||||
index b7b547a78..583c3f7d2 100644
|
||||
--- a/src/st/st-texture-cache.c
|
||||
+++ b/src/st/st-texture-cache.c
|
||||
@@ -130,6 +130,16 @@ st_texture_cache_class_init (StTextureCacheClass *klass)
|
||||
G_TYPE_NONE, 1, G_TYPE_FILE);
|
||||
}
|
||||
|
||||
+/* Evicts all cached textures */
|
||||
+void
|
||||
+st_texture_cache_clear (StTextureCache *cache)
|
||||
+{
|
||||
+ g_return_if_fail (ST_IS_TEXTURE_CACHE (cache));
|
||||
+
|
||||
+ g_hash_table_remove_all (cache->priv->keyed_cache);
|
||||
+ g_signal_emit (cache, signals[ICON_THEME_CHANGED], 0);
|
||||
+}
|
||||
+
|
||||
/* Evicts all cached textures for named icons */
|
||||
static void
|
||||
st_texture_cache_evict_icons (StTextureCache *cache)
|
||||
diff --git a/src/st/st-texture-cache.h b/src/st/st-texture-cache.h
|
||||
index 55d84952d..948915c30 100644
|
||||
--- a/src/st/st-texture-cache.h
|
||||
+++ b/src/st/st-texture-cache.h
|
||||
@@ -53,6 +53,7 @@ typedef enum {
|
||||
} StTextureCachePolicy;
|
||||
|
||||
StTextureCache* st_texture_cache_get_default (void);
|
||||
+void st_texture_cache_clear (StTextureCache *cache);
|
||||
|
||||
ClutterActor *
|
||||
st_texture_cache_load_sliced_image (StTextureCache *cache,
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,58 @@
|
||||
From 7e94d682985ac4ff422da73b5878f4f005eff67b Mon Sep 17 00:00:00 2001
|
||||
From: Mohammed Sadiq <sadiq@sadiqpk.org>
|
||||
Date: Tue, 10 Aug 2021 15:22:30 +0530
|
||||
Subject: [PATCH] status/network: Use wwan settings panel for GSM/LTE Modems
|
||||
|
||||
GSM/UMTS/LTE modems now have better support with wwan panel in GNOME
|
||||
Settings. So, if the modem supports, open wwan panel, otherwise
|
||||
fallback to opening network panel when "Mobile Broadband Settings"
|
||||
item is clicked.
|
||||
|
||||
See https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/583
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1942>
|
||||
---
|
||||
js/ui/status/network.js | 19 +++++++++++++++++--
|
||||
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
|
||||
index f510f90ae..fe82fcb08 100644
|
||||
--- a/js/ui/status/network.js
|
||||
+++ b/js/ui/status/network.js
|
||||
@@ -543,7 +543,11 @@ var NMDeviceModem = class extends NMConnectionDevice {
|
||||
constructor(client, device) {
|
||||
super(client, device);
|
||||
|
||||
- this.item.menu.addSettingsAction(_("Mobile Broadband Settings"), 'gnome-network-panel.desktop');
|
||||
+ const settingsPanel = this._useWwanPanel()
|
||||
+ ? 'gnome-wwan-panel.desktop'
|
||||
+ : 'gnome-network-panel.desktop';
|
||||
+
|
||||
+ this.item.menu.addSettingsAction(_('Mobile Broadband Settings'), settingsPanel);
|
||||
|
||||
this._mobileDevice = null;
|
||||
|
||||
@@ -573,8 +577,19 @@ var NMDeviceModem = class extends NMConnectionDevice {
|
||||
return NMConnectionCategory.WWAN;
|
||||
}
|
||||
|
||||
+ _useWwanPanel() {
|
||||
+ // Currently, wwan panel doesn't support CDMA_EVDO modems
|
||||
+ const supportedCaps =
|
||||
+ NM.DeviceModemCapabilities.GSM_UMTS |
|
||||
+ NM.DeviceModemCapabilities.LTE;
|
||||
+ return this._device.current_capabilities & supportedCaps;
|
||||
+ }
|
||||
+
|
||||
_autoConnect() {
|
||||
- launchSettingsPanel('network', 'connect-3g', this._device.get_path());
|
||||
+ if (this._useWwanPanel())
|
||||
+ launchSettingsPanel('wwan', 'show-device', this._device.udi);
|
||||
+ else
|
||||
+ launchSettingsPanel('network', 'connect-3g', this._device.get_path());
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,30 @@
|
||||
From b212b973175be1cbefa1da2c5ed4f58fae032c73 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 11 May 2022 02:34:21 +0200
|
||||
Subject: [PATCH] status/volume: Hide sliders initially
|
||||
|
||||
We update the visibility on state or stream changes, but those
|
||||
changes may never happen if pipewire-pulse/pulseaudio isn't
|
||||
available (for example when running as root).
|
||||
|
||||
Hiding the sliders is preferable in that case to showing non-working
|
||||
controls.
|
||||
---
|
||||
js/ui/status/volume.js | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/js/ui/status/volume.js b/js/ui/status/volume.js
|
||||
index 7164e1054..f623ee680 100644
|
||||
--- a/js/ui/status/volume.js
|
||||
+++ b/js/ui/status/volume.js
|
||||
@@ -34,6 +34,7 @@ var StreamSlider = class {
|
||||
this._control = control;
|
||||
|
||||
this.item = new PopupMenu.PopupBaseMenuItem({ activate: false });
|
||||
+ this.item.hide();
|
||||
|
||||
this._inDrag = false;
|
||||
this._notifyVolumeChangeId = 0;
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 79049292451b9bb23ad92c572a438585ca37246b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 27 Oct 2021 15:18:20 +0200
|
||||
Subject: [PATCH] welcomeDialog: Adapt dialog title
|
||||
|
||||
Use RHEL branding instead of the upstream GNOME XX one.
|
||||
---
|
||||
js/ui/welcomeDialog.js | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/js/ui/welcomeDialog.js b/js/ui/welcomeDialog.js
|
||||
index 9d99f0035..783fd1108 100644
|
||||
--- a/js/ui/welcomeDialog.js
|
||||
+++ b/js/ui/welcomeDialog.js
|
||||
@@ -1,9 +1,8 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported WelcomeDialog */
|
||||
|
||||
-const { Clutter, GObject, Shell, St } = imports.gi;
|
||||
+const { Clutter, GLib, GObject, Shell, St } = imports.gi;
|
||||
|
||||
-const Config = imports.misc.config;
|
||||
const Dialog = imports.ui.dialog;
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
@@ -32,8 +31,7 @@ class WelcomeDialog extends ModalDialog.ModalDialog {
|
||||
}
|
||||
|
||||
_buildLayout() {
|
||||
- const [majorVersion] = Config.PACKAGE_VERSION.split('.');
|
||||
- const title = _('Welcome to GNOME %s').format(majorVersion);
|
||||
+ const title = _('Welcome to %s').format(GLib.get_os_info('NAME'));
|
||||
const description = _('If you want to learn your way around, check out the tour.');
|
||||
const content = new Dialog.MessageDialogContent({ title, description });
|
||||
|
||||
--
|
||||
2.33.1
|
||||
|
@ -0,0 +1,64 @@
|
||||
From a1d650ce2722fd154b047ce73fa23db205d823d2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Mon, 12 Dec 2022 13:04:11 +0100
|
||||
Subject: [PATCH] window-tracker: Emit 'tracked-windows-changed' on title
|
||||
changes
|
||||
|
||||
This means the screen share window view gets updated also when the title
|
||||
of a window changes. This is important since it often changes shortly
|
||||
after mapping, which would otherwise go unnoticed by
|
||||
xdg-desktop-portal-gnome.
|
||||
|
||||
An example is launching Files and it showing up as 'Loading..', or
|
||||
launching a terminal, and it not showing the proper title (current
|
||||
directory), but some place holder that is never visible on the
|
||||
application window.
|
||||
|
||||
Adding it to the window tracker instead of in introspect.js itself is
|
||||
for convenience - there is no per window signal tracking there, and it
|
||||
already listens to the signal emissions about changed windows.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2578>
|
||||
---
|
||||
src/shell-window-tracker.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c
|
||||
index 991613ea3f..df357f81b7 100644
|
||||
--- a/src/shell-window-tracker.c
|
||||
+++ b/src/shell-window-tracker.c
|
||||
@@ -524,6 +524,15 @@ on_wm_class_changed (MetaWindow *window,
|
||||
tracked_window_changed (self, window);
|
||||
}
|
||||
|
||||
+static void
|
||||
+on_title_changed (MetaWindow *window,
|
||||
+ GParamSpec *pspec,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data);
|
||||
+ tracked_window_changed (self, window);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
on_gtk_application_id_changed (MetaWindow *window,
|
||||
GParamSpec *pspec,
|
||||
@@ -554,6 +563,7 @@ track_window (ShellWindowTracker *self,
|
||||
g_hash_table_insert (self->window_to_app, window, app);
|
||||
|
||||
g_signal_connect (window, "notify::wm-class", G_CALLBACK (on_wm_class_changed), self);
|
||||
+ g_signal_connect (window, "notify::title", G_CALLBACK (on_title_changed), self);
|
||||
g_signal_connect (window, "notify::gtk-application-id", G_CALLBACK (on_gtk_application_id_changed), self);
|
||||
g_signal_connect (window, "unmanaged", G_CALLBACK (on_window_unmanaged), self);
|
||||
|
||||
@@ -586,6 +596,7 @@ disassociate_window (ShellWindowTracker *self,
|
||||
|
||||
_shell_app_remove_window (app, window);
|
||||
g_signal_handlers_disconnect_by_func (window, G_CALLBACK (on_wm_class_changed), self);
|
||||
+ g_signal_handlers_disconnect_by_func (window, G_CALLBACK (on_title_changed), self);
|
||||
g_signal_handlers_disconnect_by_func (window, G_CALLBACK (on_gtk_application_id_changed), self);
|
||||
g_signal_handlers_disconnect_by_func (window, G_CALLBACK (on_window_unmanaged), self);
|
||||
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,44 @@
|
||||
From e3823964957ba4dcc86b21db09b280b9299bc8cc Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Fri, 10 Feb 2023 15:07:50 +0100
|
||||
Subject: [PATCH] window-tracker: Only emit ::tracked-windows-changed on title
|
||||
changes
|
||||
|
||||
Since commit a1d650ce27, window title changes are listened for in the
|
||||
ShellWindowTracker in order to emit ::tracked-windows-changed when
|
||||
there are window title changes.
|
||||
|
||||
The rest of the things that happen in between (removing the window
|
||||
from a ShellApp, possibly have it destroyed, and possibly creating a
|
||||
new ShellApp to re-insert the window) are superfluous and even result
|
||||
in the altTab switcher popup ending up confused about the applications
|
||||
available.
|
||||
|
||||
Only emit the signal so changes can be followed on D-Bus, but avoid
|
||||
the ShellApp fiddling otherwise.
|
||||
|
||||
Fixes: a1d650ce27 - window-tracker: Emit 'tracked-windows-changed' on title changes
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6385
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2634>
|
||||
(cherry picked from commit 41c91c7a3b7f186720a0a518ef2211cb744421f3)
|
||||
---
|
||||
src/shell-window-tracker.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c
|
||||
index bc14040d9b..01143dfd7f 100644
|
||||
--- a/src/shell-window-tracker.c
|
||||
+++ b/src/shell-window-tracker.c
|
||||
@@ -524,7 +524,7 @@ on_title_changed (MetaWindow *window,
|
||||
gpointer user_data)
|
||||
{
|
||||
ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data);
|
||||
- tracked_window_changed (self, window);
|
||||
+ g_signal_emit (self, signals[TRACKED_WINDOWS_CHANGED], 0);
|
||||
}
|
||||
|
||||
static void
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,45 @@
|
||||
From 34a7bfdade939e39c2a01cc1b0737a7bdccddd5b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 14 Mar 2017 17:04:36 +0100
|
||||
Subject: [PATCH] windowMenu: Bring back workspaces submenu for static
|
||||
workspaces
|
||||
|
||||
When the titlebar context menu was moved to the shell, the submenu for
|
||||
moving to a specific workspace was intentionally left out; some people
|
||||
are quite attached to it though, so bring it back when static workspaces
|
||||
are used.
|
||||
---
|
||||
js/ui/windowMenu.js | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js
|
||||
index bb6a8df7b..3449f759d 100644
|
||||
--- a/js/ui/windowMenu.js
|
||||
+++ b/js/ui/windowMenu.js
|
||||
@@ -116,6 +116,23 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
|
||||
window.change_workspace(workspace.get_neighbor(dir));
|
||||
});
|
||||
}
|
||||
+
|
||||
+ let { workspaceManager } = global;
|
||||
+ let nWorkspaces = workspaceManager.n_workspaces;
|
||||
+ if (nWorkspaces > 1 && !Meta.prefs_get_dynamic_workspaces()) {
|
||||
+ item = new PopupMenu.PopupSubMenuMenuItem(_("Move to another workspace"));
|
||||
+ this.addMenuItem(item);
|
||||
+
|
||||
+ let currentIndex = workspaceManager.get_active_workspace_index();
|
||||
+ for (let i = 0; i < nWorkspaces; i++) {
|
||||
+ let index = i;
|
||||
+ let name = Meta.prefs_get_workspace_name(i);
|
||||
+ let subitem = item.menu.addAction(name, () => {
|
||||
+ window.change_workspace_by_index(index, false);
|
||||
+ });
|
||||
+ subitem.setSensitive(currentIndex != i);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,333 @@
|
||||
From 2103c5fcf994bb6aebd978553b338436e85fa7ed Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 7 Jul 2021 22:05:25 +0200
|
||||
Subject: [PATCH 1/2] status/powerProfiles: Add power mode selection
|
||||
|
||||
Settings' power panel gained support for switchable power profiles
|
||||
in GNOME 40. It's useful to have that functionality more readily
|
||||
available, so expose it in the system status menu as well.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3944
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1907>
|
||||
---
|
||||
.../net.hadess.PowerProfiles.xml | 76 ++++++++++++
|
||||
.../gnome-shell-dbus-interfaces.gresource.xml | 1 +
|
||||
js/js-resources.gresource.xml | 1 +
|
||||
js/ui/panel.js | 4 +
|
||||
js/ui/status/powerProfiles.js | 111 ++++++++++++++++++
|
||||
po/POTFILES.in | 1 +
|
||||
6 files changed, 194 insertions(+)
|
||||
create mode 100644 data/dbus-interfaces/net.hadess.PowerProfiles.xml
|
||||
create mode 100644 js/ui/status/powerProfiles.js
|
||||
|
||||
diff --git a/data/dbus-interfaces/net.hadess.PowerProfiles.xml b/data/dbus-interfaces/net.hadess.PowerProfiles.xml
|
||||
new file mode 100644
|
||||
index 000000000..fce04a86d
|
||||
--- /dev/null
|
||||
+++ b/data/dbus-interfaces/net.hadess.PowerProfiles.xml
|
||||
@@ -0,0 +1,76 @@
|
||||
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
+
|
||||
+<node>
|
||||
+
|
||||
+ <!--
|
||||
+ net.hadess.PowerProfiles:
|
||||
+ @short_description: Power Profiles daemon
|
||||
+
|
||||
+ The power-profiles-daemon API is meant to be used by parts of the OS or
|
||||
+ desktop environment to switch system power profiles based on user choice,
|
||||
+ or user intent.
|
||||
+
|
||||
+ OS components would typically use the "Profiles" property to construct
|
||||
+ their UI (2 or 3 profiles available), and monitor the "ActiveProfile"
|
||||
+ and the "PerformanceInhibited" properties to update that UI. The UI
|
||||
+ would try to set the "ActiveProfile" property if the user selected
|
||||
+ a different one.
|
||||
+
|
||||
+ Note that the reason why the project exists and how it is different from
|
||||
+ existing projects is explained <ulink href=" https://gitlab.freedesktop.org/hadess/power-profiles-daemon/-/blob/master/README.md">
|
||||
+ in the project's README file</ulink>.
|
||||
+
|
||||
+ The object path will be "/net/hadess/PowerProfiles".
|
||||
+ -->
|
||||
+ <interface name="net.hadess.PowerProfiles">
|
||||
+ <!--
|
||||
+ ActiveProfile:
|
||||
+
|
||||
+ The type of the currently active profile. It might change automatically
|
||||
+ if the "performance" profile was selected but it got inhibited, in which
|
||||
+ case the "PerformanceInhibited" property will reflect the reason.
|
||||
+ -->
|
||||
+ <property name="ActiveProfile" type="s" access="readwrite"/>
|
||||
+
|
||||
+ <!--
|
||||
+ PerformanceInhibited:
|
||||
+
|
||||
+ This will be set if the performance power profile is unavailable, with
|
||||
+ the value being used to identify the reason for unavailability. As new
|
||||
+ reasons can be added, it is recommended that front-ends show a generic
|
||||
+ reason if they do not recognise the value. Possible values are:
|
||||
+ - "lap-detected" (the computer is sitting on the user's lap)
|
||||
+ - "high-operating-temperature" (the computer is close to overheating)
|
||||
+ - "" (the empty string, if not inhibited)
|
||||
+ -->
|
||||
+ <property name="PerformanceInhibited" type="s" access="read"/>
|
||||
+
|
||||
+ <!--
|
||||
+ Profiles:
|
||||
+
|
||||
+ An array of key-pair values representing each profile. The key named
|
||||
+ "Driver" (s) identifies the power-profiles-daemon backend code used to
|
||||
+ implement the profile.
|
||||
+
|
||||
+ The key named "Profile" (s) will be one of:
|
||||
+ - "power-saver" (battery saving profile)
|
||||
+ - "balanced" (the default profile)
|
||||
+ - "performance" (a profile that does not care about noise or battery consumption)
|
||||
+
|
||||
+ Only one of each type of profile will be listed, with the daemon choosing the
|
||||
+ more appropriate "driver" for each profile type.
|
||||
+ -->
|
||||
+ <property name="Profiles" type="aa{sv}" access="read"/>
|
||||
+
|
||||
+ <!--
|
||||
+ Actions:
|
||||
+
|
||||
+ An array of strings listing each one of the "actions" implemented in
|
||||
+ the running daemon. This is used by API users to figure out whether
|
||||
+ particular functionality is available in a version of the daemon.
|
||||
+ -->
|
||||
+ <property name="Actions" type="as" access="read"/>
|
||||
+
|
||||
+ </interface>
|
||||
+</node>
|
||||
diff --git a/data/gnome-shell-dbus-interfaces.gresource.xml b/data/gnome-shell-dbus-interfaces.gresource.xml
|
||||
index e7972f6cb..6682c462d 100644
|
||||
--- a/data/gnome-shell-dbus-interfaces.gresource.xml
|
||||
+++ b/data/gnome-shell-dbus-interfaces.gresource.xml
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<gresources>
|
||||
<gresource prefix="/org/gnome/shell/dbus-interfaces">
|
||||
+ <file preprocess="xml-stripblanks">net.hadess.PowerProfiles.xml</file>
|
||||
<file preprocess="xml-stripblanks">net.hadess.SensorProxy.xml</file>
|
||||
<file preprocess="xml-stripblanks">net.reactivated.Fprint.Device.xml</file>
|
||||
<file preprocess="xml-stripblanks">net.reactivated.Fprint.Manager.xml</file>
|
||||
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
|
||||
index b2c603a55..7a94e2ff1 100644
|
||||
--- a/js/js-resources.gresource.xml
|
||||
+++ b/js/js-resources.gresource.xml
|
||||
@@ -134,6 +134,7 @@
|
||||
<file>ui/status/nightLight.js</file>
|
||||
<file>ui/status/network.js</file>
|
||||
<file>ui/status/power.js</file>
|
||||
+ <file>ui/status/powerProfiles.js</file>
|
||||
<file>ui/status/rfkill.js</file>
|
||||
<file>ui/status/volume.js</file>
|
||||
<file>ui/status/bluetooth.js</file>
|
||||
diff --git a/js/ui/panel.js b/js/ui/panel.js
|
||||
index ad11f4ba2..84668e96e 100644
|
||||
--- a/js/ui/panel.js
|
||||
+++ b/js/ui/panel.js
|
||||
@@ -693,6 +693,7 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
|
||||
this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet();
|
||||
this._power = new imports.ui.status.power.Indicator();
|
||||
+ this._powerProfiles = new imports.ui.status.powerProfiles.Indicator();
|
||||
this._rfkill = new imports.ui.status.rfkill.Indicator();
|
||||
this._volume = new imports.ui.status.volume.Indicator();
|
||||
this._brightness = new imports.ui.status.brightness.Indicator();
|
||||
@@ -712,6 +713,7 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
this._indicators.add_child(this._rfkill);
|
||||
this._indicators.add_child(this._volume);
|
||||
this._indicators.add_child(this._power);
|
||||
+ this._indicators.add_child(this._powerProfiles);
|
||||
|
||||
this.menu.addMenuItem(this._volume.menu);
|
||||
this.menu.addMenuItem(this._brightness.menu);
|
||||
@@ -726,6 +728,7 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
this.menu.addMenuItem(this._location.menu);
|
||||
this.menu.addMenuItem(this._rfkill.menu);
|
||||
this.menu.addMenuItem(this._power.menu);
|
||||
+ this.menu.addMenuItem(this._powerProfiles.menu);
|
||||
this.menu.addMenuItem(this._nightLight.menu);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addMenuItem(this._system.menu);
|
||||
@@ -733,6 +736,7 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
menuLayout.addSizeChild(this._location.menu.actor);
|
||||
menuLayout.addSizeChild(this._rfkill.menu.actor);
|
||||
menuLayout.addSizeChild(this._power.menu.actor);
|
||||
+ menuLayout.addSizeChild(this._powerProfiles.menu.actor);
|
||||
menuLayout.addSizeChild(this._system.menu.actor);
|
||||
}
|
||||
});
|
||||
diff --git a/js/ui/status/powerProfiles.js b/js/ui/status/powerProfiles.js
|
||||
new file mode 100644
|
||||
index 000000000..f6bc5835b
|
||||
--- /dev/null
|
||||
+++ b/js/ui/status/powerProfiles.js
|
||||
@@ -0,0 +1,111 @@
|
||||
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
+/* exported Indicator */
|
||||
+
|
||||
+const { Gio, GObject } = imports.gi;
|
||||
+
|
||||
+const Main = imports.ui.main;
|
||||
+const PanelMenu = imports.ui.panelMenu;
|
||||
+const PopupMenu = imports.ui.popupMenu;
|
||||
+
|
||||
+const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||
+
|
||||
+const BUS_NAME = 'net.hadess.PowerProfiles';
|
||||
+const OBJECT_PATH = '/net/hadess/PowerProfiles';
|
||||
+
|
||||
+const PowerProfilesIface = loadInterfaceXML('net.hadess.PowerProfiles');
|
||||
+const PowerProfilesProxy = Gio.DBusProxy.makeProxyWrapper(PowerProfilesIface);
|
||||
+
|
||||
+const PROFILE_LABELS = {
|
||||
+ 'performance': _('Performance Mode'),
|
||||
+ 'balanced': _('Balanced Power'),
|
||||
+ 'power-saver': _('Power Saver'),
|
||||
+};
|
||||
+const PROFILE_ICONS = {
|
||||
+ 'performance': 'power-profile-performance-symbolic',
|
||||
+ 'balanced': 'power-profile-balanced-symbolic',
|
||||
+ 'power-saver': 'power-profile-power-saver-symbolic',
|
||||
+};
|
||||
+
|
||||
+var Indicator = GObject.registerClass(
|
||||
+class Indicator extends PanelMenu.SystemIndicator {
|
||||
+ _init() {
|
||||
+ super._init();
|
||||
+
|
||||
+ this._profileItems = new Map();
|
||||
+ this._updateProfiles = true;
|
||||
+
|
||||
+ this._proxy = new PowerProfilesProxy(Gio.DBus.system, BUS_NAME, OBJECT_PATH,
|
||||
+ (proxy, error) => {
|
||||
+ if (error) {
|
||||
+ log(error.message);
|
||||
+ } else {
|
||||
+ this._proxy.connect('g-properties-changed',
|
||||
+ (p, properties) => {
|
||||
+ const propertyNames = properties.deep_unpack();
|
||||
+ this._updateProfiles = 'Profiles' in propertyNames;
|
||||
+ this._sync();
|
||||
+ });
|
||||
+ }
|
||||
+ this._sync();
|
||||
+ });
|
||||
+
|
||||
+ this._item = new PopupMenu.PopupSubMenuMenuItem('', true);
|
||||
+
|
||||
+ this._profileSection = new PopupMenu.PopupMenuSection();
|
||||
+ this._item.menu.addMenuItem(this._profileSection);
|
||||
+ this._item.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
+ this._item.menu.addSettingsAction(_('Power Settings'),
|
||||
+ 'gnome-power-panel.desktop');
|
||||
+ this.menu.addMenuItem(this._item);
|
||||
+
|
||||
+ Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
|
||||
+ this._sessionUpdated();
|
||||
+ this._sync();
|
||||
+ }
|
||||
+
|
||||
+ _sessionUpdated() {
|
||||
+ const sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||
+ this.menu.setSensitive(sensitive);
|
||||
+ }
|
||||
+
|
||||
+ _sync() {
|
||||
+ this._item.visible = this._proxy.g_name_owner !== null;
|
||||
+
|
||||
+ if (!this._item.visible)
|
||||
+ return;
|
||||
+
|
||||
+ if (this._updateProfiles) {
|
||||
+ this._profileSection.removeAll();
|
||||
+ this._profileItems.clear();
|
||||
+
|
||||
+ const profiles = this._proxy.Profiles
|
||||
+ .map(p => p.Profile.unpack())
|
||||
+ .reverse();
|
||||
+ for (const profile of profiles) {
|
||||
+ const label = PROFILE_LABELS[profile];
|
||||
+ if (!label)
|
||||
+ continue;
|
||||
+
|
||||
+ const item = new PopupMenu.PopupMenuItem(label);
|
||||
+ item.connect('activate',
|
||||
+ () => (this._proxy.ActiveProfile = profile));
|
||||
+ this._profileItems.set(profile, item);
|
||||
+ this._profileSection.addMenuItem(item);
|
||||
+ }
|
||||
+ this._updateProfiles = false;
|
||||
+ }
|
||||
+
|
||||
+ for (const [profile, item] of this._profileItems) {
|
||||
+ item.setOrnament(profile === this._proxy.ActiveProfile
|
||||
+ ? PopupMenu.Ornament.DOT
|
||||
+ : PopupMenu.Ornament.NONE);
|
||||
+ }
|
||||
+
|
||||
+ const perfItem = this._profileItems.get('performance');
|
||||
+ if (perfItem)
|
||||
+ perfItem.sensitive = this._proxy.PerformanceInhibited === '';
|
||||
+
|
||||
+ this._item.label.text = PROFILE_LABELS[this._proxy.ActiveProfile];
|
||||
+ this._item.icon.icon_name = PROFILE_ICONS[this._proxy.ActiveProfile];
|
||||
+ }
|
||||
+});
|
||||
diff --git a/po/POTFILES.in b/po/POTFILES.in
|
||||
index cb279c1ee..727cb01a8 100644
|
||||
--- a/po/POTFILES.in
|
||||
+++ b/po/POTFILES.in
|
||||
@@ -61,6 +61,7 @@ js/ui/status/location.js
|
||||
js/ui/status/network.js
|
||||
js/ui/status/nightLight.js
|
||||
js/ui/status/power.js
|
||||
+js/ui/status/powerProfiles.js
|
||||
js/ui/status/remoteAccess.js
|
||||
js/ui/status/rfkill.js
|
||||
js/ui/status/system.js
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 0f8a2e2c6c3119492670efce5aff1224f2c3c47f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Fri, 6 Aug 2021 21:04:24 +0200
|
||||
Subject: [PATCH 2/2] powerProfiles: Tweak profile names
|
||||
|
||||
After some more discussion, we settled on slightly different
|
||||
profile names.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4530
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1939>
|
||||
---
|
||||
js/ui/status/powerProfiles.js | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/js/ui/status/powerProfiles.js b/js/ui/status/powerProfiles.js
|
||||
index f6bc5835b..61205bbc6 100644
|
||||
--- a/js/ui/status/powerProfiles.js
|
||||
+++ b/js/ui/status/powerProfiles.js
|
||||
@@ -16,9 +16,9 @@ const PowerProfilesIface = loadInterfaceXML('net.hadess.PowerProfiles');
|
||||
const PowerProfilesProxy = Gio.DBusProxy.makeProxyWrapper(PowerProfilesIface);
|
||||
|
||||
const PROFILE_LABELS = {
|
||||
- 'performance': _('Performance Mode'),
|
||||
- 'balanced': _('Balanced Power'),
|
||||
- 'power-saver': _('Power Saver'),
|
||||
+ 'performance': C_('Power profile', 'Performance'),
|
||||
+ 'balanced': C_('Power profile', 'Balanced'),
|
||||
+ 'power-saver': C_('Power profile', 'Power Saver'),
|
||||
};
|
||||
const PROFILE_ICONS = {
|
||||
'performance': 'power-profile-performance-symbolic',
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,176 @@
|
||||
From 6739f213965c2b6a41c21b446095f393f9d86e43 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 30 Sep 2015 12:51:24 -0400
|
||||
Subject: [PATCH 1/3] authPrompt: don't fade out auth messages if user types
|
||||
password up front
|
||||
|
||||
Right now we fade out any stale auth messages as soon as the user starts
|
||||
typing. This behavior doesn't really make sense if the user is typing up
|
||||
front, before a password is asked.
|
||||
---
|
||||
js/gdm/authPrompt.js | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index 4844b9ee0..149e5ad4a 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -179,7 +179,7 @@ var AuthPrompt = GObject.registerClass({
|
||||
|
||||
[this._textEntry, this._passwordEntry].forEach(entry => {
|
||||
entry.clutter_text.connect('text-changed', () => {
|
||||
- if (!this._userVerifier.hasPendingMessages)
|
||||
+ if (!this._userVerifier.hasPendingMessages && this._queryingService && !this._preemptiveAnswer)
|
||||
this._fadeOutMessage();
|
||||
});
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 2b84c3d611120ae2f60386d5c637b84d1958398d Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 30 Sep 2015 14:36:33 -0400
|
||||
Subject: [PATCH 2/3] authPrompt: don't spin unless answering question
|
||||
|
||||
---
|
||||
js/gdm/authPrompt.js | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index 149e5ad4a..c5643d046 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -243,13 +243,14 @@ var AuthPrompt = GObject.registerClass({
|
||||
this.verificationStatus = AuthPromptStatus.VERIFICATION_IN_PROGRESS;
|
||||
this.updateSensitivity(false);
|
||||
|
||||
- if (shouldSpin)
|
||||
- this.startSpinning();
|
||||
+ if (this._queryingService) {
|
||||
+ if (shouldSpin)
|
||||
+ this.startSpinning();
|
||||
|
||||
- if (this._queryingService)
|
||||
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
|
||||
- else
|
||||
+ } else {
|
||||
this._preemptiveAnswer = this._entry.text;
|
||||
+ }
|
||||
|
||||
this.emit('next');
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 56360c872e01b0554b4d8b53dddba5407d4e889b Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 5 Oct 2015 15:26:18 -0400
|
||||
Subject: [PATCH 3/3] authPrompt: stop accepting preemptive answer if user
|
||||
stops typing
|
||||
|
||||
We only want to allow the user to type the preemptive password in
|
||||
one smooth motion. If they start to type, and then stop typing,
|
||||
we should discard their preemptive password as expired.
|
||||
|
||||
Typing ahead the password is just a convenience for users who don't
|
||||
want to manually lift the shift before typing their passwords, after
|
||||
all.
|
||||
---
|
||||
js/gdm/authPrompt.js | 37 ++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 36 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index c5643d046..84c608b2f 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -1,7 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported AuthPrompt */
|
||||
|
||||
-const { Clutter, GLib, GObject, Pango, Shell, St } = imports.gi;
|
||||
+const { Clutter, GLib, GObject, Meta, Pango, Shell, St } = imports.gi;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
const Batch = imports.gdm.batch;
|
||||
@@ -63,6 +63,8 @@ var AuthPrompt = GObject.registerClass({
|
||||
this._defaultButtonWellActor = null;
|
||||
this._cancelledRetries = 0;
|
||||
|
||||
+ this._idleMonitor = Meta.IdleMonitor.get_core();
|
||||
+
|
||||
let reauthenticationOnly;
|
||||
if (this._mode == AuthPromptMode.UNLOCK_ONLY)
|
||||
reauthenticationOnly = true;
|
||||
@@ -119,6 +121,11 @@ var AuthPrompt = GObject.registerClass({
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
+ if (this._preemptiveAnswerWatchId) {
|
||||
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
|
||||
+ this._preemptiveAnswerWatchId = 0;
|
||||
+ }
|
||||
+
|
||||
this._userVerifier.destroy();
|
||||
this._userVerifier = null;
|
||||
}
|
||||
@@ -250,6 +257,11 @@ var AuthPrompt = GObject.registerClass({
|
||||
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
|
||||
} else {
|
||||
this._preemptiveAnswer = this._entry.text;
|
||||
+
|
||||
+ if (this._preemptiveAnswerWatchId) {
|
||||
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
|
||||
+ this._preemptiveAnswerWatchId = 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
this.emit('next');
|
||||
@@ -429,6 +441,11 @@ var AuthPrompt = GObject.registerClass({
|
||||
}
|
||||
|
||||
setQuestion(question) {
|
||||
+ if (this._preemptiveAnswerWatchId) {
|
||||
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
|
||||
+ this._preemptiveAnswerWatchId = 0;
|
||||
+ }
|
||||
+
|
||||
this._entry.hint_text = question;
|
||||
|
||||
this._entry.show();
|
||||
@@ -530,6 +547,19 @@ var AuthPrompt = GObject.registerClass({
|
||||
this._updateEntry(false);
|
||||
}
|
||||
|
||||
+ _onUserStoppedTypePreemptiveAnswer() {
|
||||
+ if (!this._preemptiveAnswerWatchId ||
|
||||
+ this._preemptiveAnswer ||
|
||||
+ this._queryingService)
|
||||
+ return;
|
||||
+
|
||||
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
|
||||
+ this._preemptiveAnswerWatchId = 0;
|
||||
+
|
||||
+ this._entry.text = '';
|
||||
+ this.updateSensitivity(false);
|
||||
+ }
|
||||
+
|
||||
reset() {
|
||||
let oldStatus = this.verificationStatus;
|
||||
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
|
||||
@@ -537,6 +567,11 @@ var AuthPrompt = GObject.registerClass({
|
||||
this.cancelButton.can_focus = this._hasCancelButton;
|
||||
this._preemptiveAnswer = null;
|
||||
|
||||
+ if (this._preemptiveAnswerWatchId)
|
||||
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
|
||||
+ this._preemptiveAnswerWatchId = this._idleMonitor.add_idle_watch(500,
|
||||
+ this._onUserStoppedTypePreemptiveAnswer.bind(this));
|
||||
+
|
||||
if (this._userVerifier)
|
||||
this._userVerifier.cancel();
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,114 @@
|
||||
From d2c12a372ea0ccbe6ba682c553d8b83b3253169f Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 28 Sep 2015 10:57:02 -0400
|
||||
Subject: [PATCH 1/3] smartcardManager: add way to detect if user logged using
|
||||
(any) token
|
||||
|
||||
If a user uses a token at login time, we need to make sure they continue
|
||||
to use the token at unlock time.
|
||||
|
||||
As a prerequisite for addressing that problem we need to know up front
|
||||
if a user logged in with a token at all.
|
||||
|
||||
This commit adds the necessary api to detect that case.
|
||||
---
|
||||
js/misc/smartcardManager.js | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js
|
||||
index d9b6ff474..26f9f5aaa 100644
|
||||
--- a/js/misc/smartcardManager.js
|
||||
+++ b/js/misc/smartcardManager.js
|
||||
@@ -111,5 +111,12 @@ var SmartcardManager = class {
|
||||
|
||||
return true;
|
||||
}
|
||||
+
|
||||
+ loggedInWithToken() {
|
||||
+ if (this._loginToken)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+ }
|
||||
};
|
||||
Signals.addSignalMethods(SmartcardManager.prototype);
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 98393eef884edc9e685b712c71356751acdd552f Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 28 Sep 2015 19:56:53 -0400
|
||||
Subject: [PATCH 2/3] gdm: only unlock with smartcard, if smartcard used for
|
||||
login
|
||||
|
||||
If a smartcard is used for login, we need to make sure the smartcard
|
||||
gets used for unlock, too.
|
||||
---
|
||||
js/gdm/util.js | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/gdm/util.js b/js/gdm/util.js
|
||||
index 72561daab..6b92e3564 100644
|
||||
--- a/js/gdm/util.js
|
||||
+++ b/js/gdm/util.js
|
||||
@@ -149,7 +149,6 @@ var ShellUserVerifier = class {
|
||||
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||
this._settings.connect('changed',
|
||||
this._updateDefaultService.bind(this));
|
||||
- this._updateDefaultService();
|
||||
|
||||
this._fprintManager = new FprintManagerProxy(Gio.DBus.system,
|
||||
'net.reactivated.Fprint',
|
||||
@@ -166,6 +165,8 @@ var ShellUserVerifier = class {
|
||||
this.smartcardDetected = false;
|
||||
this._checkForSmartcard();
|
||||
|
||||
+ this._updateDefaultService();
|
||||
+
|
||||
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
|
||||
this._checkForSmartcard.bind(this));
|
||||
this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed',
|
||||
@@ -527,7 +528,9 @@ var ShellUserVerifier = class {
|
||||
}
|
||||
|
||||
_updateDefaultService() {
|
||||
- if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
|
||||
+ if (this._smartcardManager.loggedInWithToken())
|
||||
+ this._defaultService = SMARTCARD_SERVICE_NAME;
|
||||
+ else if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
|
||||
this._defaultService = PASSWORD_SERVICE_NAME;
|
||||
else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
|
||||
this._defaultService = SMARTCARD_SERVICE_NAME;
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 57ca969a0af6f65e71dc1158163b9c826bdb7079 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 28 Sep 2015 19:57:36 -0400
|
||||
Subject: [PATCH 3/3] gdm: update default service when smartcard inserted
|
||||
|
||||
Early on at start up we may not know if a smartcard is
|
||||
available. Make sure we reupdate the default service
|
||||
after we get a smartcard insertion event.
|
||||
---
|
||||
js/gdm/util.js | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/js/gdm/util.js b/js/gdm/util.js
|
||||
index 6b92e3564..e62114cb1 100644
|
||||
--- a/js/gdm/util.js
|
||||
+++ b/js/gdm/util.js
|
||||
@@ -420,6 +420,8 @@ var ShellUserVerifier = class {
|
||||
else if (this._preemptingService == SMARTCARD_SERVICE_NAME)
|
||||
this._preemptingService = null;
|
||||
|
||||
+ this._updateDefaultService();
|
||||
+
|
||||
this.emit('smartcard-status-changed');
|
||||
}
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,334 @@
|
||||
From 49a950b9e0dc262fd20c28e21ee4815ea8efe758 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Keller <skeller@gnome.org>
|
||||
Date: Tue, 16 Nov 2021 18:57:26 +0100
|
||||
Subject: [PATCH 1/3] search: Split out the description highlighter into its
|
||||
own class
|
||||
|
||||
No functional change yet, only preparation to allow adding a unit test
|
||||
later on.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2033>
|
||||
---
|
||||
js/misc/util.js | 38 +++++++++++++++++++++++++++++++++++++-
|
||||
js/ui/search.js | 12 +++++-------
|
||||
2 files changed, 42 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/js/misc/util.js b/js/misc/util.js
|
||||
index 8139d3f47..d1a702960 100644
|
||||
--- a/js/misc/util.js
|
||||
+++ b/js/misc/util.js
|
||||
@@ -1,7 +1,8 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnCommandLine,
|
||||
formatTime, formatTimeSpan, createTimeLabel, insertSorted,
|
||||
- ensureActorVisibleInScrollView, wiggle, lerp, GNOMEversionCompare */
|
||||
+ ensureActorVisibleInScrollView, wiggle, lerp, GNOMEversionCompare,
|
||||
+ Highlighter */
|
||||
|
||||
const { Clutter, Gio, GLib, Shell, St, GnomeDesktop } = imports.gi;
|
||||
const Gettext = imports.gettext;
|
||||
@@ -477,3 +478,38 @@ function GNOMEversionCompare(version1, version2) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+/* @class Highlighter Highlight given terms in text using markup. */
|
||||
+var Highlighter = class {
|
||||
+ /**
|
||||
+ * @param {?string[]} terms - list of terms to highlight
|
||||
+ */
|
||||
+ constructor(terms) {
|
||||
+ if (!terms)
|
||||
+ return;
|
||||
+
|
||||
+ const escapedTerms = terms
|
||||
+ .map(term => Shell.util_regex_escape(term))
|
||||
+ .filter(term => term.length > 0);
|
||||
+
|
||||
+ if (escapedTerms.length === 0)
|
||||
+ return;
|
||||
+
|
||||
+ this._highlightRegex = new RegExp('(%s)'.format(
|
||||
+ escapedTerms.join('|')), 'gi');
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Highlight all occurences of the terms defined for this
|
||||
+ * highlighter in the provided text using markup.
|
||||
+ *
|
||||
+ * @param {string} text - text to highlight the defined terms in
|
||||
+ * @returns {string}
|
||||
+ */
|
||||
+ highlight(text) {
|
||||
+ if (!this._highlightRegex)
|
||||
+ return text;
|
||||
+
|
||||
+ return text.replace(this._highlightRegex, '<b>$1</b>');
|
||||
+ }
|
||||
+};
|
||||
diff --git a/js/ui/search.js b/js/ui/search.js
|
||||
index 7300b053e..b1e76c46d 100644
|
||||
--- a/js/ui/search.js
|
||||
+++ b/js/ui/search.js
|
||||
@@ -10,6 +10,8 @@ const ParentalControlsManager = imports.misc.parentalControlsManager;
|
||||
const RemoteSearch = imports.ui.remoteSearch;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
+const { Highlighter } = imports.misc.util;
|
||||
+
|
||||
const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
|
||||
|
||||
var MAX_LIST_SEARCH_RESULTS_ROWS = 5;
|
||||
@@ -596,7 +598,7 @@ var SearchResultsView = GObject.registerClass({
|
||||
|
||||
this._providers = [];
|
||||
|
||||
- this._highlightRegex = null;
|
||||
+ this._highlighter = new Highlighter();
|
||||
|
||||
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
|
||||
this._searchSettings.connect('changed::disabled', this._reloadRemoteProviders.bind(this));
|
||||
@@ -739,8 +741,7 @@ var SearchResultsView = GObject.registerClass({
|
||||
if (this._searchTimeoutId == 0)
|
||||
this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, this._onSearchTimeout.bind(this));
|
||||
|
||||
- let escapedTerms = this._terms.map(term => Shell.util_regex_escape(term));
|
||||
- this._highlightRegex = new RegExp('(%s)'.format(escapedTerms.join('|')), 'gi');
|
||||
+ this._highlighter = new Highlighter(this._terms);
|
||||
|
||||
this.emit('terms-changed');
|
||||
}
|
||||
@@ -894,10 +895,7 @@ var SearchResultsView = GObject.registerClass({
|
||||
if (!description)
|
||||
return '';
|
||||
|
||||
- if (!this._highlightRegex)
|
||||
- return description;
|
||||
-
|
||||
- return description.replace(this._highlightRegex, '<b>$1</b>');
|
||||
+ return this._highlighter.highlight(description);
|
||||
}
|
||||
});
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
|
||||
From 7c1abe1bd91ecf274d81e122035cbeeef6fd58d4 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Keller <skeller@gnome.org>
|
||||
Date: Wed, 17 Nov 2021 02:50:39 +0100
|
||||
Subject: [PATCH 2/3] util: Properly handle markup in highlighter
|
||||
|
||||
The code to highlight matches did not properly escape the passed in text
|
||||
as for markup before adding its highlighting markup. This lead to some
|
||||
search result descriptions not showing up, because their descriptions
|
||||
contained characters, such as "<", that would have to be escaped when
|
||||
used in markup or otherwise lead to invalid markup.
|
||||
|
||||
To work around this some search providers wrongly started escaping the
|
||||
description on their end before sending them to gnome-shell. This lead
|
||||
to another issue. Now if the highlighter was trying to highlight the
|
||||
term "a", and the escaped description contained "'", the "a" in
|
||||
that would be considered a match and surrounded by "<b></b>". This
|
||||
however would also generate invalid markup, again leading to an error
|
||||
and the description not being shown.
|
||||
|
||||
Fix this by always escaping the passed in string before applying the
|
||||
highlights in such a way that there are no matches within entities.
|
||||
|
||||
This also means that search providers that escaped their description
|
||||
strings will now show up with the markup syntax. This will have to be
|
||||
fixed separately in the affected search providers.
|
||||
|
||||
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4791
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2033>
|
||||
---
|
||||
js/misc/util.js | 21 +++++++++++++++++++--
|
||||
1 file changed, 19 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/misc/util.js b/js/misc/util.js
|
||||
index d1a702960..802398d18 100644
|
||||
--- a/js/misc/util.js
|
||||
+++ b/js/misc/util.js
|
||||
@@ -508,8 +508,25 @@ var Highlighter = class {
|
||||
*/
|
||||
highlight(text) {
|
||||
if (!this._highlightRegex)
|
||||
- return text;
|
||||
+ return GLib.markup_escape_text(text, -1);
|
||||
+
|
||||
+ let escaped = [];
|
||||
+ let lastMatchEnd = 0;
|
||||
+ let match;
|
||||
+ while ((match = this._highlightRegex.exec(text))) {
|
||||
+ if (match.index > lastMatchEnd) {
|
||||
+ let unmatched = GLib.markup_escape_text(
|
||||
+ text.slice(lastMatchEnd, match.index), -1);
|
||||
+ escaped.push(unmatched);
|
||||
+ }
|
||||
+ let matched = GLib.markup_escape_text(match[0], -1);
|
||||
+ escaped.push('<b>%s</b>'.format(matched));
|
||||
+ lastMatchEnd = match.index + match[0].length;
|
||||
+ }
|
||||
+ let unmatched = GLib.markup_escape_text(
|
||||
+ text.slice(lastMatchEnd), -1);
|
||||
+ escaped.push(unmatched);
|
||||
|
||||
- return text.replace(this._highlightRegex, '<b>$1</b>');
|
||||
+ return escaped.join('');
|
||||
}
|
||||
};
|
||||
--
|
||||
2.35.1
|
||||
|
||||
|
||||
From 82e2a6dcfabc2f82efbf468175d16c303f0c73da Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Keller <skeller@gnome.org>
|
||||
Date: Wed, 17 Nov 2021 03:05:05 +0100
|
||||
Subject: [PATCH 3/3] tests: Add unit test for highlighter
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2033>
|
||||
---
|
||||
tests/meson.build | 12 ++++-
|
||||
tests/unit/highlighter.js | 106 ++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 117 insertions(+), 1 deletion(-)
|
||||
create mode 100644 tests/unit/highlighter.js
|
||||
|
||||
diff --git a/tests/meson.build b/tests/meson.build
|
||||
index c0431631f..50fb601e9 100644
|
||||
--- a/tests/meson.build
|
||||
+++ b/tests/meson.build
|
||||
@@ -10,7 +10,17 @@ run_test = configure_file(
|
||||
testenv = environment()
|
||||
testenv.set('GSETTINGS_SCHEMA_DIR', join_paths(meson.build_root(), 'data'))
|
||||
|
||||
-foreach test : ['insertSorted', 'jsParse', 'markup', 'params', 'url', 'versionCompare']
|
||||
+tests = [
|
||||
+ 'highlighter',
|
||||
+ 'insertSorted',
|
||||
+ 'jsParse',
|
||||
+ 'markup',
|
||||
+ 'params',
|
||||
+ 'url',
|
||||
+ 'versionCompare',
|
||||
+]
|
||||
+
|
||||
+foreach test : tests
|
||||
test(test, run_test,
|
||||
args: 'unit/@0@.js'.format(test),
|
||||
env: testenv,
|
||||
diff --git a/tests/unit/highlighter.js b/tests/unit/highlighter.js
|
||||
new file mode 100644
|
||||
index 000000000..d582d38e3
|
||||
--- /dev/null
|
||||
+++ b/tests/unit/highlighter.js
|
||||
@@ -0,0 +1,106 @@
|
||||
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
+
|
||||
+// Test cases for SearchResult description match highlighter
|
||||
+
|
||||
+const JsUnit = imports.jsUnit;
|
||||
+const Pango = imports.gi.Pango;
|
||||
+
|
||||
+const Environment = imports.ui.environment;
|
||||
+Environment.init();
|
||||
+
|
||||
+const Util = imports.misc.util;
|
||||
+
|
||||
+const tests = [
|
||||
+ { input: 'abc cba',
|
||||
+ terms: null,
|
||||
+ output: 'abc cba' },
|
||||
+ { input: 'abc cba',
|
||||
+ terms: [],
|
||||
+ output: 'abc cba' },
|
||||
+ { input: 'abc cba',
|
||||
+ terms: [''],
|
||||
+ output: 'abc cba' },
|
||||
+ { input: 'abc cba',
|
||||
+ terms: ['a'],
|
||||
+ output: '<b>a</b>bc cb<b>a</b>' },
|
||||
+ { input: 'abc cba',
|
||||
+ terms: ['a', 'a'],
|
||||
+ output: '<b>a</b>bc cb<b>a</b>' },
|
||||
+ { input: 'CaSe InSenSiTiVe',
|
||||
+ terms: ['cas', 'sens'],
|
||||
+ output: '<b>CaS</b>e In<b>SenS</b>iTiVe' },
|
||||
+ { input: 'This contains the < character',
|
||||
+ terms: null,
|
||||
+ output: 'This contains the < character' },
|
||||
+ { input: 'Don\'t',
|
||||
+ terms: ['t'],
|
||||
+ output: 'Don'<b>t</b>' },
|
||||
+ { input: 'Don\'t',
|
||||
+ terms: ['n\'t'],
|
||||
+ output: 'Do<b>n't</b>' },
|
||||
+ { input: 'Don\'t',
|
||||
+ terms: ['o', 't'],
|
||||
+ output: 'D<b>o</b>n'<b>t</b>' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['salt'],
|
||||
+ output: '<b>salt</b>&pepper' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['salt', 'alt'],
|
||||
+ output: '<b>salt</b>&pepper' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['pepper'],
|
||||
+ output: 'salt&<b>pepper</b>' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['salt', 'pepper'],
|
||||
+ output: '<b>salt</b>&<b>pepper</b>' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['t', 'p'],
|
||||
+ output: 'sal<b>t</b>&<b>p</b>e<b>p</b><b>p</b>er' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['t', '&', 'p'],
|
||||
+ output: 'sal<b>t</b><b>&</b><b>p</b>e<b>p</b><b>p</b>er' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['e'],
|
||||
+ output: 'salt&p<b>e</b>pp<b>e</b>r' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['&a', '&am', '&', '&'],
|
||||
+ output: 'salt&pepper' },
|
||||
+ { input: '&&&&&',
|
||||
+ terms: ['a'],
|
||||
+ output: '&&&&&' },
|
||||
+ { input: '&;&;&;&;&;',
|
||||
+ terms: ['a'],
|
||||
+ output: '&;&;&;&;&;' },
|
||||
+ { input: '&;&;&;&;&;',
|
||||
+ terms: [';'],
|
||||
+ output: '&<b>;</b>&<b>;</b>&<b>;</b>&<b>;</b>&<b>;</b>' },
|
||||
+ { input: '&',
|
||||
+ terms: ['a'],
|
||||
+ output: '&<b>a</b>mp;' }
|
||||
+];
|
||||
+
|
||||
+try {
|
||||
+ for (let i = 0; i < tests.length; i++) {
|
||||
+ let highlighter = new Util.Highlighter(tests[i].terms);
|
||||
+ let output = highlighter.highlight(tests[i].input);
|
||||
+
|
||||
+ JsUnit.assertEquals(`Test ${i + 1} highlight ` +
|
||||
+ `"${tests[i].terms}" in "${tests[i].input}"`,
|
||||
+ output, tests[i].output);
|
||||
+
|
||||
+ let parsed = false;
|
||||
+ try {
|
||||
+ Pango.parse_markup(output, -1, '');
|
||||
+ parsed = true;
|
||||
+ } catch (e) {}
|
||||
+ JsUnit.assertEquals(`Test ${i + 1} is valid markup`, true, parsed);
|
||||
+ }
|
||||
+} catch (e) {
|
||||
+ if (typeof(e.isJsUnitException) != 'undefined'
|
||||
+ && e.isJsUnitException)
|
||||
+ {
|
||||
+ if (e.comment)
|
||||
+ log(`Error in: ${e.comment}`);
|
||||
+ }
|
||||
+ throw e;
|
||||
+}
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,92 @@
|
||||
From ce8ac36613ef4fbb697fc9f6613844168c05a8d3 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Fri, 8 Oct 2021 11:08:17 -0400
|
||||
Subject: [PATCH 1/2] unlockDialog: Don't create AuthDialog just to finish it
|
||||
|
||||
If the the unlock dialog gets finished before an auth dialog is
|
||||
created, the code currently creates one just to tell it to finish.
|
||||
|
||||
This commit changes the code to skip creating the auth dialog in
|
||||
that case.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1999>
|
||||
---
|
||||
js/ui/unlockDialog.js | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
|
||||
index c81c6184a9..d8c45f7510 100644
|
||||
--- a/js/ui/unlockDialog.js
|
||||
+++ b/js/ui/unlockDialog.js
|
||||
@@ -884,7 +884,11 @@ var UnlockDialog = GObject.registerClass({
|
||||
}
|
||||
|
||||
finish(onComplete) {
|
||||
- this._ensureAuthPrompt();
|
||||
+ if (!this._authPrompt) {
|
||||
+ onComplete();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
this._authPrompt.finish(onComplete);
|
||||
}
|
||||
|
||||
--
|
||||
2.39.1
|
||||
|
||||
|
||||
From 2a513d44e7b887b355d6b71cf88c4114a8b685f8 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 5 Oct 2021 11:01:19 -0400
|
||||
Subject: [PATCH 2/2] unlockDialog: Properly reset auth prompt when showing it
|
||||
|
||||
If a user hits escape twice really fast when coming back to
|
||||
their machine to unlock it, they made end up getting presented
|
||||
with a non-functional unlock screen that doesn't show their
|
||||
user icon and doesn't ask for a password.
|
||||
|
||||
This is because showPrompt assumes that if an auth prompt already
|
||||
exists, it's ready to go. That may not be true, if it's in the
|
||||
process of getting torn down at the time because it's in the middle
|
||||
of a cancel animation.
|
||||
|
||||
This commit solves the problem by ensuring the auth prompt is always
|
||||
in a fresh reset state before showing it.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1999>
|
||||
---
|
||||
js/ui/unlockDialog.js | 18 ++++++++----------
|
||||
1 file changed, 8 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
|
||||
index d8c45f7510..00e3eef971 100644
|
||||
--- a/js/ui/unlockDialog.js
|
||||
+++ b/js/ui/unlockDialog.js
|
||||
@@ -689,16 +689,14 @@ var UnlockDialog = GObject.registerClass({
|
||||
}
|
||||
|
||||
_ensureAuthPrompt() {
|
||||
- if (this._authPrompt)
|
||||
- return;
|
||||
-
|
||||
- this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient,
|
||||
- AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
|
||||
- this._authPrompt.connect('failed', this._fail.bind(this));
|
||||
- this._authPrompt.connect('cancelled', this._fail.bind(this));
|
||||
- this._authPrompt.connect('reset', this._onReset.bind(this));
|
||||
-
|
||||
- this._promptBox.add_child(this._authPrompt);
|
||||
+ if (!this._authPrompt) {
|
||||
+ this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient,
|
||||
+ AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
|
||||
+ this._authPrompt.connect('failed', this._fail.bind(this));
|
||||
+ this._authPrompt.connect('cancelled', this._fail.bind(this));
|
||||
+ this._authPrompt.connect('reset', this._onReset.bind(this));
|
||||
+ this._promptBox.add_child(this._authPrompt);
|
||||
+ }
|
||||
|
||||
this._authPrompt.reset();
|
||||
this._authPrompt.updateSensitivity(true);
|
||||
--
|
||||
2.39.1
|
||||
|
@ -0,0 +1,184 @@
|
||||
From 05a5f4641c8ad6337ccb46e63abcaf27dd7eb852 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 9 Jun 2020 19:42:21 +0200
|
||||
Subject: [PATCH 1/4] popupMenu: Guard against non-menu-item children
|
||||
|
||||
This avoid a harmless but annoying warning.
|
||||
---
|
||||
js/ui/popupMenu.js | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
|
||||
index 11528560d..144c600d7 100644
|
||||
--- a/js/ui/popupMenu.js
|
||||
+++ b/js/ui/popupMenu.js
|
||||
@@ -773,7 +773,8 @@ var PopupMenuBase = class {
|
||||
}
|
||||
|
||||
_getMenuItems() {
|
||||
- return this.box.get_children().map(a => a._delegate).filter(item => {
|
||||
+ const children = this.box.get_children().filter(a => a._delegate !== undefined);
|
||||
+ return children.map(a => a._delegate).filter(item => {
|
||||
return item instanceof PopupBaseMenuItem || item instanceof PopupMenuSection;
|
||||
});
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From e5b2c2b3cfd0443fa83fd1f6f56f65fefa5186c3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 9 Jun 2020 19:48:06 +0200
|
||||
Subject: [PATCH 2/4] st/shadow: Check pipeline when painting
|
||||
|
||||
We shouldn't simply assume that st_shadow_helper_update() has been
|
||||
called before paint() or that the pipeline was created successfully.
|
||||
---
|
||||
src/st/st-shadow.c | 11 ++++++-----
|
||||
1 file changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/st/st-shadow.c b/src/st/st-shadow.c
|
||||
index ab3eaa856..d53808698 100644
|
||||
--- a/src/st/st-shadow.c
|
||||
+++ b/src/st/st-shadow.c
|
||||
@@ -296,9 +296,10 @@ st_shadow_helper_paint (StShadowHelper *helper,
|
||||
ClutterActorBox *actor_box,
|
||||
guint8 paint_opacity)
|
||||
{
|
||||
- _st_paint_shadow_with_opacity (helper->shadow,
|
||||
- framebuffer,
|
||||
- helper->pipeline,
|
||||
- actor_box,
|
||||
- paint_opacity);
|
||||
+ if (helper->pipeline != NULL)
|
||||
+ _st_paint_shadow_with_opacity (helper->shadow,
|
||||
+ framebuffer,
|
||||
+ helper->pipeline,
|
||||
+ actor_box,
|
||||
+ paint_opacity);
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 0f7656d85af51339d14217b9a673442a18df3de8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 8 Jul 2021 19:10:05 +0200
|
||||
Subject: [PATCH 3/4] messageTray: Always remove destroyed banners
|
||||
|
||||
Currently we only mark the banner as removed if it is destroyed
|
||||
while in SHOWN or SHOWING state, but not if we're already HIDING
|
||||
(for example in response to `NotificationBanner::done-displaying`).
|
||||
|
||||
If this happens, we'll try to destroy the notification again at
|
||||
the end of the transition, which leads to (harmless but annoying)
|
||||
log spam since Notifications were turned into GObjects (that are
|
||||
disposed when destroyed).
|
||||
|
||||
Address this by always marking destroyed banners as removed, while
|
||||
still only triggering a state update while shown (or in the process
|
||||
of being shown).
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4457
|
||||
---
|
||||
js/ui/messageTray.js | 23 +++++++++++++----------
|
||||
1 file changed, 13 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js
|
||||
index 1dab00a70..ccf56fc5b 100644
|
||||
--- a/js/ui/messageTray.js
|
||||
+++ b/js/ui/messageTray.js
|
||||
@@ -1022,17 +1022,20 @@ var MessageTray = GObject.registerClass({
|
||||
}
|
||||
|
||||
_onNotificationDestroy(notification) {
|
||||
- if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) {
|
||||
- this._updateNotificationTimeout(0);
|
||||
- this._notificationRemoved = true;
|
||||
- this._updateState();
|
||||
- return;
|
||||
- }
|
||||
+ this._notificationRemoved = this._notification === notification;
|
||||
|
||||
- let index = this._notificationQueue.indexOf(notification);
|
||||
- if (index != -1) {
|
||||
- this._notificationQueue.splice(index, 1);
|
||||
- this.emit('queue-changed');
|
||||
+ if (this._notificationRemoved) {
|
||||
+ if (this._notificationState === State.SHOWN ||
|
||||
+ this._notificationState === State.SHOWING) {
|
||||
+ this._updateNotificationTimeout(0);
|
||||
+ this._updateState();
|
||||
+ }
|
||||
+ } else {
|
||||
+ const index = this._notificationQueue.indexOf(notification);
|
||||
+ if (index !== -1) {
|
||||
+ this._notificationQueue.splice(index, 1);
|
||||
+ this.emit('queue-changed');
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 8652836521d0729ce230268c7b448cdb393d5b47 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 8 Jul 2021 19:23:38 +0200
|
||||
Subject: [PATCH 4/4] shellInfo: Don't destroy source on undo
|
||||
|
||||
Destroying the source from an action callback will result in the
|
||||
notification being destroyed twice:
|
||||
|
||||
- source.destroy() destroys all its notifications
|
||||
|
||||
- a notification destroys itself after an action
|
||||
was activated
|
||||
|
||||
This results in unwanted log spam when attempting to dispose the
|
||||
notification for a second time.
|
||||
|
||||
There is actually no good reason for destroying the source explicitly,
|
||||
as sources already self-destruct with their last notification.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4457
|
||||
---
|
||||
js/ui/overview.js | 13 +------------
|
||||
1 file changed, 1 insertion(+), 12 deletions(-)
|
||||
|
||||
diff --git a/js/ui/overview.js b/js/ui/overview.js
|
||||
index 529779ea8..c71b11389 100644
|
||||
--- a/js/ui/overview.js
|
||||
+++ b/js/ui/overview.js
|
||||
@@ -25,16 +25,6 @@ var OVERVIEW_ACTIVATION_TIMEOUT = 0.5;
|
||||
var ShellInfo = class {
|
||||
constructor() {
|
||||
this._source = null;
|
||||
- this._undoCallback = null;
|
||||
- }
|
||||
-
|
||||
- _onUndoClicked() {
|
||||
- if (this._undoCallback)
|
||||
- this._undoCallback();
|
||||
- this._undoCallback = null;
|
||||
-
|
||||
- if (this._source)
|
||||
- this._source.destroy();
|
||||
}
|
||||
|
||||
setMessage(text, options) {
|
||||
@@ -64,9 +54,8 @@ var ShellInfo = class {
|
||||
notification.update(text, null, { clear: true });
|
||||
}
|
||||
|
||||
- this._undoCallback = undoCallback;
|
||||
if (undoCallback)
|
||||
- notification.addAction(_("Undo"), this._onUndoClicked.bind(this));
|
||||
+ notification.addAction(_('Undo'), () => undoCallback());
|
||||
|
||||
this._source.showNotification(notification);
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,244 @@
|
||||
From 1eb9fef5e18d56bbe7a6422303ff8e31fe677759 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 7 Jun 2021 17:49:57 +0200
|
||||
Subject: [PATCH 1/5] status/network: Disable modem connection when windows
|
||||
aren't allowed
|
||||
|
||||
The item launches the corresponding Settings panel when activated, which
|
||||
doesn't work when windows are disabled by the session mode. Rather than
|
||||
failing silently, turn the item insensitive.
|
||||
---
|
||||
js/ui/status/network.js | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
|
||||
index 5487fde40..6e7878d20 100644
|
||||
--- a/js/ui/status/network.js
|
||||
+++ b/js/ui/status/network.js
|
||||
@@ -563,6 +563,10 @@ var NMDeviceModem = class extends NMConnectionDevice {
|
||||
this._iconChanged();
|
||||
});
|
||||
}
|
||||
+
|
||||
+ this._sessionUpdatedId =
|
||||
+ Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
|
||||
+ this._sessionUpdated();
|
||||
}
|
||||
|
||||
get category() {
|
||||
@@ -573,6 +577,10 @@ var NMDeviceModem = class extends NMConnectionDevice {
|
||||
launchSettingsPanel('network', 'connect-3g', this._device.get_path());
|
||||
}
|
||||
|
||||
+ _sessionUpdated() {
|
||||
+ this._autoConnectItem.sensitive = Main.sessionMode.hasWindows;
|
||||
+ }
|
||||
+
|
||||
destroy() {
|
||||
if (this._operatorNameId) {
|
||||
this._mobileDevice.disconnect(this._operatorNameId);
|
||||
@@ -582,6 +590,10 @@ var NMDeviceModem = class extends NMConnectionDevice {
|
||||
this._mobileDevice.disconnect(this._signalQualityId);
|
||||
this._signalQualityId = 0;
|
||||
}
|
||||
+ if (this._sessionUpdatedId) {
|
||||
+ Main.sessionMode.disconnect(this._sessionUpdatedId);
|
||||
+ this._sessionUpdatedId = 0;
|
||||
+ }
|
||||
|
||||
super.destroy();
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 0288558940c0090dca0873daeaa33e8d20cdbb0f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 7 Jun 2021 18:28:32 +0200
|
||||
Subject: [PATCH 2/5] status/network: Only list wifi networks that can be
|
||||
activated
|
||||
|
||||
Setting up a connection for an Enterprise WPA(2) encrypted wireless
|
||||
network requires Settings. That's not available when windows are
|
||||
disabled via the session mode, so filter out affected entries.
|
||||
---
|
||||
js/ui/status/network.js | 30 +++++++++++++++++++++++++++++-
|
||||
1 file changed, 29 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
|
||||
index 6e7878d20..36915dbc1 100644
|
||||
--- a/js/ui/status/network.js
|
||||
+++ b/js/ui/status/network.js
|
||||
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported NMApplet */
|
||||
-const { Clutter, Gio, GLib, GObject, NM, St } = imports.gi;
|
||||
+const { Clutter, Gio, GLib, GObject, Meta, NM, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
@@ -816,6 +816,11 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
|
||||
GLib.source_remove(this._scanTimeoutId);
|
||||
this._scanTimeoutId = 0;
|
||||
}
|
||||
+
|
||||
+ if (this._syncVisibilityId) {
|
||||
+ Meta.later_remove(this._syncVisibilityId);
|
||||
+ this._syncVisibilityId = 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
_onScanTimeout() {
|
||||
@@ -1149,9 +1154,32 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
|
||||
this._itemBox.insert_child_at_index(network.item, newPos);
|
||||
}
|
||||
|
||||
+ this._queueSyncItemVisibility();
|
||||
this._syncView();
|
||||
}
|
||||
|
||||
+ _queueSyncItemVisibility() {
|
||||
+ if (this._syncVisibilityId)
|
||||
+ return;
|
||||
+
|
||||
+ this._syncVisibilityId = Meta.later_add(
|
||||
+ Meta.LaterType.BEFORE_REDRAW,
|
||||
+ () => {
|
||||
+ const { hasWindows } = Main.sessionMode;
|
||||
+ const { WPA2_ENT, WPA_ENT } = NMAccessPointSecurity;
|
||||
+
|
||||
+ for (const network of this._networks) {
|
||||
+ const [firstAp] = network.accessPoints;
|
||||
+ network.item.visible =
|
||||
+ hasWindows ||
|
||||
+ network.connections.length > 0 ||
|
||||
+ (firstAp._secType !== WPA2_ENT && firstAp._secType !== WPA_ENT);
|
||||
+ }
|
||||
+ this._syncVisibilityId = 0;
|
||||
+ return GLib.SOURCE_REMOVE;
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
_accessPointRemoved(device, accessPoint) {
|
||||
let res = this._findExistingNetwork(accessPoint);
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From eb9620bc134ef8e7732f5e64b93ac9ea5bba2092 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 8 Jun 2021 00:17:48 +0200
|
||||
Subject: [PATCH 3/5] status/network: Consider network-control action
|
||||
|
||||
NetworkManager installs a `network-control` polkit action that can
|
||||
be used to disallow network configuration, except that we happily
|
||||
ignore it. Add it to the conditions that turn a network section
|
||||
insensitive.
|
||||
---
|
||||
js/ui/status/network.js | 14 ++++++++++++--
|
||||
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
|
||||
index 36915dbc1..e238fdfe7 100644
|
||||
--- a/js/ui/status/network.js
|
||||
+++ b/js/ui/status/network.js
|
||||
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported NMApplet */
|
||||
-const { Clutter, Gio, GLib, GObject, Meta, NM, St } = imports.gi;
|
||||
+const { Clutter, Gio, GLib, GObject, Meta, NM, Polkit, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
@@ -1750,11 +1750,21 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
this._client.connect('connection-removed', this._connectionRemoved.bind(this));
|
||||
|
||||
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
|
||||
+ try {
|
||||
+ this._configPermission = await Polkit.Permission.new(
|
||||
+ 'org.freedesktop.NetworkManager.network-control', null, null);
|
||||
+ } catch (e) {
|
||||
+ log('No permission to control network connections: %s'.format(e.toString()));
|
||||
+ this._configPermission = null;
|
||||
+ }
|
||||
this._sessionUpdated();
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
- let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||
+ const sensitive =
|
||||
+ !Main.sessionMode.isLocked &&
|
||||
+ !Main.sessionMode.isGreeter &&
|
||||
+ this._configPermission && this._configPermission.allowed;
|
||||
this.menu.setSensitive(sensitive);
|
||||
}
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 2392810bb7e3d48fb33c4d6de39f5be2eca58988 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 10 Jun 2021 23:12:27 +0200
|
||||
Subject: [PATCH 4/5] sessionMode: Enable networkAgent on login screen
|
||||
|
||||
We will soon enable the network sections in the status menu on the
|
||||
login screen, so enable the network agent to handle authentication
|
||||
requests (like wifi/VPN passwords).
|
||||
---
|
||||
js/ui/sessionMode.js | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js
|
||||
index aa69fd115..4d4fb2444 100644
|
||||
--- a/js/ui/sessionMode.js
|
||||
+++ b/js/ui/sessionMode.js
|
||||
@@ -47,7 +47,9 @@ const _modes = {
|
||||
isGreeter: true,
|
||||
isPrimary: true,
|
||||
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
||||
- components: ['polkitAgent'],
|
||||
+ components: Config.HAVE_NETWORKMANAGER
|
||||
+ ? ['networkAgent', 'polkitAgent']
|
||||
+ : ['polkitAgent'],
|
||||
panel: {
|
||||
left: [],
|
||||
center: ['dateMenu'],
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From b5fedfd846f271bf28be02ce5cd8517af7a3bc0a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 8 Jun 2021 00:19:26 +0200
|
||||
Subject: [PATCH 5/5] status/network: Do not disable on login screen
|
||||
|
||||
We currently disable all network items on both the lock- and login
|
||||
screen. While it makes sense to be very restrictive on the lock screen,
|
||||
there are some (fringe) use cases for being more permissive on the
|
||||
login screen (like remote home directories only accessible via VPN).
|
||||
|
||||
There's precedence with the power-off/restart actions to be less
|
||||
restrictive on the login screen, and since we started respecting
|
||||
the `network-control` polkit action, it's possible to restore the
|
||||
old behavior if desired.
|
||||
---
|
||||
js/ui/status/network.js | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
|
||||
index e238fdfe7..f510f90ae 100644
|
||||
--- a/js/ui/status/network.js
|
||||
+++ b/js/ui/status/network.js
|
||||
@@ -1763,7 +1763,6 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
_sessionUpdated() {
|
||||
const sensitive =
|
||||
!Main.sessionMode.isLocked &&
|
||||
- !Main.sessionMode.isGreeter &&
|
||||
this._configPermission && this._configPermission.allowed;
|
||||
this.menu.setSensitive(sensitive);
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,67 @@
|
||||
From 1f8252470ce43dc8a0680871013e2f4492764302 Mon Sep 17 00:00:00 2001
|
||||
From: rpm-build <rpm-build>
|
||||
Date: Mon, 28 Feb 2022 10:27:09 -0500
|
||||
Subject: [PATCH] data: Enable logo extension out of the box
|
||||
|
||||
Our brand team would like the logo extension to be used on new
|
||||
installs.
|
||||
|
||||
This commit makes sure it gets enabled out of the box.
|
||||
---
|
||||
data/org.gnome.shell.gschema.xml.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index d5ea1e3..e3f440c 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -1,45 +1,45 @@
|
||||
<schemalist>
|
||||
<schema id="org.gnome.shell" path="/org/gnome/shell/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
<key name="development-tools" type="b">
|
||||
<default>true</default>
|
||||
<summary>
|
||||
Enable internal tools useful for developers and testers from Alt-F2
|
||||
</summary>
|
||||
<description>
|
||||
Allows access to internal debugging and monitoring tools
|
||||
using the Alt-F2 dialog.
|
||||
</description>
|
||||
</key>
|
||||
<key name="enabled-extensions" type="as">
|
||||
- <default>[]</default>
|
||||
+ <default>['background-logo@fedorahosted.org']</default>
|
||||
<summary>UUIDs of extensions to enable</summary>
|
||||
<description>
|
||||
GNOME Shell extensions have a UUID property; this key lists extensions
|
||||
which should be loaded. Any extension that wants to be loaded needs
|
||||
to be in this list. You can also manipulate this list with the
|
||||
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
|
||||
</description>
|
||||
</key>
|
||||
<key name="disabled-extensions" type="as">
|
||||
<default>[]</default>
|
||||
<summary>UUIDs of extensions to force disabling</summary>
|
||||
<description>
|
||||
GNOME Shell extensions have a UUID property; this key lists extensions
|
||||
which should be disabled, even if loaded as part of the current mode.
|
||||
You can also manipulate this list with the EnableExtension and
|
||||
DisableExtension D-Bus methods on org.gnome.Shell.
|
||||
This key takes precedence over the “enabled-extensions” setting.
|
||||
</description>
|
||||
</key>
|
||||
<key name="disable-user-extensions" type="b">
|
||||
<default>false</default>
|
||||
<summary>Disable user extensions</summary>
|
||||
<description>
|
||||
Disable all extensions the user has enabled without affecting
|
||||
the “enabled-extension” setting.
|
||||
</description>
|
||||
</key>
|
||||
<key name="disable-extension-version-validation" type="b">
|
||||
<default>false</default>
|
||||
<summary>Disables the validation of extension version compatibility</summary>
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From a2e62e671260576d23f18c22c10a48ac4a8504af Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 17 Sep 2014 07:11:12 +0200
|
||||
Subject: [PATCH] Replace Web with Firefox in default favorites
|
||||
|
||||
---
|
||||
data/org.gnome.shell.gschema.xml.in | 2 +-
|
||||
js/ui/appFavorites.js | 1 +
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index cd6a2356d..b8a13a9cc 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -50,7 +50,7 @@
|
||||
</description>
|
||||
</key>
|
||||
<key name="favorite-apps" type="as">
|
||||
- <default>[ 'org.gnome.Epiphany.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
||||
+ <default>[ 'firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
||||
<summary>List of desktop file IDs for favorite applications</summary>
|
||||
<description>
|
||||
The applications corresponding to these identifiers
|
||||
diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js
|
||||
index a876727ed..24ce16f81 100644
|
||||
--- a/js/ui/appFavorites.js
|
||||
+++ b/js/ui/appFavorites.js
|
||||
@@ -52,6 +52,7 @@ const RENAMED_DESKTOP_IDS = {
|
||||
'gnotski.desktop': 'org.gnome.Klotski.desktop',
|
||||
'gtali.desktop': 'org.gnome.Tali.desktop',
|
||||
'iagno.desktop': 'org.gnome.Reversi.desktop',
|
||||
+ 'mozilla-firefox.desktop': 'firefox.desktop',
|
||||
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
||||
'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
|
||||
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
|
||||
--
|
||||
2.30.1
|
||||
|
@ -0,0 +1,25 @@
|
||||
From 1e699b55f3dc84b2ddbc5acd03424240eddbe06c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 9 Mar 2017 14:44:32 +0100
|
||||
Subject: [PATCH 3/3] appFavorites: Add terminal
|
||||
|
||||
---
|
||||
data/org.gnome.shell.gschema.xml.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index 35ddaf4a9..d5ea1e35f 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -50,7 +50,7 @@
|
||||
</description>
|
||||
</key>
|
||||
<key name="favorite-apps" type="as">
|
||||
- <default>[ 'firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop' ]</default>
|
||||
+ <default>[ 'firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop', 'org.gnome.Terminal.desktop' ]</default>
|
||||
<summary>List of desktop file IDs for favorite applications</summary>
|
||||
<description>
|
||||
The applications corresponding to these identifiers
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 4e21aed64d48ddd22e40a3605084379b2fa7f1cb Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 9 Mar 2017 14:44:03 +0100
|
||||
Subject: [PATCH 2/3] Add 'yelp' to default favorites
|
||||
|
||||
Help should be easily available, so add it to the default favorites.
|
||||
---
|
||||
data/org.gnome.shell.gschema.xml.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index b8a13a9cc..35ddaf4a9 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -50,7 +50,7 @@
|
||||
</description>
|
||||
</key>
|
||||
<key name="favorite-apps" type="as">
|
||||
- <default>[ 'firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
||||
+ <default>[ 'firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop' ]</default>
|
||||
<summary>List of desktop file IDs for favorite applications</summary>
|
||||
<description>
|
||||
The applications corresponding to these identifiers
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,227 @@
|
||||
From 4024d59871d0c8990ef5e4243c9fc485971755e7 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 10 Aug 2021 13:25:57 -0400
|
||||
Subject: [PATCH 1/3] extensionSystem: Get rid of _enabled boolean optimization
|
||||
|
||||
At the moment a session mode either allows extensions or it doesn't.
|
||||
If it allows extensions, then the entire available list of
|
||||
configured extensions get enabled as soon as the session mode is
|
||||
entered.
|
||||
|
||||
Since enabling or disabling extensions is an all or nothing situation,
|
||||
the code tracks whether extensions are already enabled when entering
|
||||
the session mode, and if so, avoids iterating through the extension list
|
||||
needlessly. It does this using a boolean named _enabled.
|
||||
|
||||
In the future, the extensions themselves will be given some say on
|
||||
whether or not they should be enabled in a given session mode. This
|
||||
means, the configured extension list may contain extensions that
|
||||
shouldn't be enabled for a given session mode, and the _enabled boolean
|
||||
will no longer be appropriated.
|
||||
|
||||
This commit drops the _enabled boolean optimization.
|
||||
---
|
||||
js/ui/extensionSystem.js | 10 ----------
|
||||
1 file changed, 10 deletions(-)
|
||||
|
||||
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
|
||||
index 9f4eb757b..2aae44b53 100644
|
||||
--- a/js/ui/extensionSystem.js
|
||||
+++ b/js/ui/extensionSystem.js
|
||||
@@ -23,7 +23,6 @@ const UPDATE_CHECK_TIMEOUT = 24 * 60 * 60; // 1 day in seconds
|
||||
var ExtensionManager = class {
|
||||
constructor() {
|
||||
this._initialized = false;
|
||||
- this._enabled = false;
|
||||
this._updateNotified = false;
|
||||
|
||||
this._extensions = new Map();
|
||||
@@ -597,9 +596,6 @@ var ExtensionManager = class {
|
||||
}
|
||||
|
||||
_enableAllExtensions() {
|
||||
- if (this._enabled)
|
||||
- return;
|
||||
-
|
||||
if (!this._initialized) {
|
||||
this._loadExtensions();
|
||||
this._initialized = true;
|
||||
@@ -608,20 +604,14 @@ var ExtensionManager = class {
|
||||
this._callExtensionEnable(uuid);
|
||||
});
|
||||
}
|
||||
- this._enabled = true;
|
||||
}
|
||||
|
||||
_disableAllExtensions() {
|
||||
- if (!this._enabled)
|
||||
- return;
|
||||
-
|
||||
if (this._initialized) {
|
||||
this._extensionOrder.slice().reverse().forEach(uuid => {
|
||||
this._callExtensionDisable(uuid);
|
||||
});
|
||||
}
|
||||
-
|
||||
- this._enabled = false;
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
--
|
||||
2.33.1
|
||||
|
||||
|
||||
From f883c3f87f9778a0c2ed34db648aad73668949e3 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Sat, 28 Aug 2021 13:54:39 -0400
|
||||
Subject: [PATCH 2/3] extensionSystem: Allow extensions to run on the login
|
||||
screen
|
||||
|
||||
At the moment it's not realy possible to extend the login screen to do
|
||||
things it doesn't have built-in support for. This means in order
|
||||
to support niche use cases, those cases have to change the main
|
||||
code base. For instance, oVirt and Vmware deployments want to be able
|
||||
to automaticaly log in guest VMs when a user pre-authenticates through a
|
||||
console on a management host. To support those use cases, we added
|
||||
code to the login screen directly, even though most machines will never
|
||||
be associated with oVirt or Vmware management hosts.
|
||||
|
||||
We also get requests from e.g. government users that need certain features
|
||||
at the login screen that wouldn't get used much outside of government
|
||||
deployments. For instance, we've gotten requests that a machine contains
|
||||
prominently displays that it has "Top Secret" information.
|
||||
|
||||
All of these use cases seem like they would better handled via
|
||||
extensions that could be installed in the specific deployments. The
|
||||
problem is extensions only run in the user session, and get
|
||||
disabled at the login screen automatically.
|
||||
|
||||
This commit changes that. Now extensions can specify in their metadata
|
||||
via a new sessionModes property, which modes that want to run in. For
|
||||
backward compatibility, if an extension doesn't specify which session
|
||||
modes it works in, its assumed the extension only works in the user
|
||||
session.
|
||||
---
|
||||
js/ui/extensionSystem.js | 33 +++++++++++++++++++++++++++++----
|
||||
1 file changed, 29 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
|
||||
index 2aae44b53..937f86199 100644
|
||||
--- a/js/ui/extensionSystem.js
|
||||
+++ b/js/ui/extensionSystem.js
|
||||
@@ -75,6 +75,28 @@ var ExtensionManager = class {
|
||||
return [...this._extensions.keys()];
|
||||
}
|
||||
|
||||
+ _extensionSupportsSessionMode(uuid) {
|
||||
+ const extension = this.lookup(uuid);
|
||||
+ if (!extension)
|
||||
+ return false;
|
||||
+
|
||||
+ if (extension.sessionModes.includes(Main.sessionMode.currentMode))
|
||||
+ return true;
|
||||
+ if (extension.sessionModes.includes(Main.sessionMode.parentMode))
|
||||
+ return true;
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ _sessionModeCanUseExtension(uuid) {
|
||||
+ if (!Main.sessionMode.allowExtensions)
|
||||
+ return false;
|
||||
+
|
||||
+ if (!this._extensionSupportsSessionMode(uuid))
|
||||
+ return false;
|
||||
+
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
_callExtensionDisable(uuid) {
|
||||
let extension = this.lookup(uuid);
|
||||
if (!extension)
|
||||
@@ -134,7 +156,7 @@ var ExtensionManager = class {
|
||||
}
|
||||
|
||||
_callExtensionEnable(uuid) {
|
||||
- if (!Main.sessionMode.allowExtensions)
|
||||
+ if (!this._sessionModeCanUseExtension(uuid))
|
||||
return;
|
||||
|
||||
let extension = this.lookup(uuid);
|
||||
@@ -316,6 +338,7 @@ var ExtensionManager = class {
|
||||
hasPrefs: dir.get_child('prefs.js').query_exists(null),
|
||||
hasUpdate: false,
|
||||
canChange: false,
|
||||
+ sessionModes: meta['session-modes'] ? meta['session-modes'] : [ 'user' ],
|
||||
};
|
||||
this._extensions.set(uuid, extension);
|
||||
|
||||
@@ -398,7 +421,7 @@ var ExtensionManager = class {
|
||||
}
|
||||
|
||||
_callExtensionInit(uuid) {
|
||||
- if (!Main.sessionMode.allowExtensions)
|
||||
+ if (!this._sessionModeCanUseExtension(uuid))
|
||||
return false;
|
||||
|
||||
let extension = this.lookup(uuid);
|
||||
@@ -487,13 +510,15 @@ var ExtensionManager = class {
|
||||
// Find and enable all the newly enabled extensions: UUIDs found in the
|
||||
// new setting, but not in the old one.
|
||||
newEnabledExtensions
|
||||
- .filter(uuid => !this._enabledExtensions.includes(uuid))
|
||||
+ .filter(uuid => !this._enabledExtensions.includes(uuid) &&
|
||||
+ this._extensionSupportsSessionMode(uuid))
|
||||
.forEach(uuid => this._callExtensionEnable(uuid));
|
||||
|
||||
// Find and disable all the newly disabled extensions: UUIDs found in the
|
||||
// old setting, but not in the new one.
|
||||
this._extensionOrder
|
||||
- .filter(uuid => !newEnabledExtensions.includes(uuid))
|
||||
+ .filter(uuid => !newEnabledExtensions.includes(uuid) ||
|
||||
+ !this._extensionSupportsSessionMode(uuid))
|
||||
.reverse().forEach(uuid => this._callExtensionDisable(uuid));
|
||||
|
||||
this._enabledExtensions = newEnabledExtensions;
|
||||
--
|
||||
2.33.1
|
||||
|
||||
|
||||
From c637d0a14ea7223ea7d763e1c4dedb4d6b6609a4 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 10 Aug 2021 15:31:00 -0400
|
||||
Subject: [PATCH 3/3] sessionMode: Allow extensions at the login and unlock
|
||||
screens
|
||||
|
||||
Now extensions can specify which session modes they work in,
|
||||
but specifying the login screen or unlock screen session modes in
|
||||
an extensions metadata still won't work, because those session
|
||||
modes disallow extensions.
|
||||
|
||||
This commit fixes that.
|
||||
---
|
||||
js/ui/sessionMode.js | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js
|
||||
index 4d4fb2444..0534fd1d4 100644
|
||||
--- a/js/ui/sessionMode.js
|
||||
+++ b/js/ui/sessionMode.js
|
||||
@@ -43,6 +43,7 @@ const _modes = {
|
||||
},
|
||||
|
||||
'gdm': {
|
||||
+ allowExtensions: true,
|
||||
hasNotifications: true,
|
||||
isGreeter: true,
|
||||
isPrimary: true,
|
||||
@@ -59,6 +60,7 @@ const _modes = {
|
||||
},
|
||||
|
||||
'unlock-dialog': {
|
||||
+ allowExtensions: true,
|
||||
isLocked: true,
|
||||
unlockDialog: undefined,
|
||||
components: ['polkitAgent', 'telepathyClient'],
|
||||
--
|
||||
2.33.1
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue