commit
f4eb2eb00b
@ -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 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,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,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,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
|
||||||
|
|
@ -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,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,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,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