Browse Source

initial package creation

Signed-off-by: Toshaan Bharvani <toshaan@powerel.org>
master
Toshaan Bharvani 2 years ago
commit
8f85753442
  1. 364
      SOURCES/0001-Update-generated-stylesheets.patch
  2. 28
      SOURCES/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch
  3. 36
      SOURCES/0001-extensionDownloader-Refuse-to-override-system-extens.patch
  4. 83
      SOURCES/0001-loginDialog-make-info-messages-themed.patch
  5. 38
      SOURCES/0001-main-Dump-stack-on-segfaults-by-default.patch
  6. 31
      SOURCES/0001-main-Leak-the-GJS-context-and-ShellGlobal.patch
  7. 56
      SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch
  8. 33
      SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch
  9. 66
      SOURCES/0001-st-texture-cache-purge-on-resume.patch
  10. 58
      SOURCES/0001-status-network-Use-wwan-settings-panel-for-GSM-LTE-M.patch
  11. 38
      SOURCES/0001-welcomeDialog-Adapt-dialog-title.patch
  12. 45
      SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
  13. 333
      SOURCES/add-power-profiles-menu.patch
  14. 176
      SOURCES/disable-unlock-entry-until-question.patch
  15. 114
      SOURCES/enforce-smartcard-at-unlock.patch
  16. 184
      SOURCES/fix-some-js-warnings.patch
  17. 244
      SOURCES/gdm-networking.patch
  18. 67
      SOURCES/gnome-shell-enabled-extensions-background-logos.patch
  19. 38
      SOURCES/gnome-shell-favourite-apps-firefox.patch
  20. 25
      SOURCES/gnome-shell-favourite-apps-terminal.patch
  21. 26
      SOURCES/gnome-shell-favourite-apps-yelp.patch
  22. 227
      SOURCES/login-screen-extensions.patch
  23. 1210
      SOURCES/support-choicelist-extension.patch
  24. 1639
      SPECS/gnome-shell.spec

364
SOURCES/0001-Update-generated-stylesheets.patch

@ -0,0 +1,364 @@ @@ -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

28
SOURCES/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch

@ -0,0 +1,28 @@ @@ -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

36
SOURCES/0001-extensionDownloader-Refuse-to-override-system-extens.patch

@ -0,0 +1,36 @@ @@ -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

83
SOURCES/0001-loginDialog-make-info-messages-themed.patch

@ -0,0 +1,83 @@ @@ -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

38
SOURCES/0001-main-Dump-stack-on-segfaults-by-default.patch

@ -0,0 +1,38 @@ @@ -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

31
SOURCES/0001-main-Leak-the-GJS-context-and-ShellGlobal.patch

@ -0,0 +1,31 @@ @@ -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

56
SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch

@ -0,0 +1,56 @@ @@ -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

33
SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch

@ -0,0 +1,33 @@ @@ -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

66
SOURCES/0001-st-texture-cache-purge-on-resume.patch

@ -0,0 +1,66 @@ @@ -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

58
SOURCES/0001-status-network-Use-wwan-settings-panel-for-GSM-LTE-M.patch

@ -0,0 +1,58 @@ @@ -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

38
SOURCES/0001-welcomeDialog-Adapt-dialog-title.patch

@ -0,0 +1,38 @@ @@ -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

45
SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch

@ -0,0 +1,45 @@ @@ -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

333
SOURCES/add-power-profiles-menu.patch

@ -0,0 +1,333 @@ @@ -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

176
SOURCES/disable-unlock-entry-until-question.patch

@ -0,0 +1,176 @@ @@ -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

114
SOURCES/enforce-smartcard-at-unlock.patch

@ -0,0 +1,114 @@ @@ -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

184
SOURCES/fix-some-js-warnings.patch

@ -0,0 +1,184 @@ @@ -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

244
SOURCES/gdm-networking.patch

@ -0,0 +1,244 @@ @@ -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

67
SOURCES/gnome-shell-enabled-extensions-background-logos.patch

@ -0,0 +1,67 @@ @@ -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

38
SOURCES/gnome-shell-favourite-apps-firefox.patch

@ -0,0 +1,38 @@ @@ -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

25
SOURCES/gnome-shell-favourite-apps-terminal.patch

@ -0,0 +1,25 @@ @@ -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

26
SOURCES/gnome-shell-favourite-apps-yelp.patch

@ -0,0 +1,26 @@ @@ -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

227
SOURCES/login-screen-extensions.patch

@ -0,0 +1,227 @@ @@ -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

1210
SOURCES/support-choicelist-extension.patch

File diff suppressed because it is too large Load Diff

1639
SPECS/gnome-shell.spec

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save