Compare commits
No commits in common. 'i10c-beta' and 'c9' have entirely different histories.
@ -1 +1 @@
|
||||
SOURCES/gnome-shell-47.alpha.tar.xz
|
||||
SOURCES/gnome-shell-40.10.tar.xz
|
||||
|
@ -1 +1 @@
|
||||
e38a2e3b7dc71883a73c6be7fef1ce83f2c8d83c SOURCES/gnome-shell-47.alpha.tar.xz
|
||||
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,100 @@
|
||||
From ec802e39a5dfb252e2d18b8cb95f713724180565 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 15 May 2023 10:48:15 -0400
|
||||
Subject: [PATCH] authPrompt: Disregard smartcard status changes events if
|
||||
VERIFICATION_IN_PROGRESS
|
||||
|
||||
commit c8bb45b41c3a13ef161103f649aa18938e028a70 introduced a new
|
||||
verification state, VERIFICATION_IN_PROGRESS, to detect when the user
|
||||
has already interacted with the authentication service, so the auth
|
||||
prompt can rate limit the number of times the user can cancel
|
||||
authentication attempts with the escape key (without also rate limiting
|
||||
the number of times they hit escape to go back to the clock without
|
||||
interacting with the authentication service).
|
||||
|
||||
That means there are now two states that represent the
|
||||
user actively undergoing verification: VERIFYING and
|
||||
VERIFICATION_IN_PROGRESS.
|
||||
|
||||
It's inappropriate to reset the smartcard service if the user is
|
||||
actively conversing with it. We try to check for that by looking at the
|
||||
original verification state, VERIFYING, but we unfortunately, neglected
|
||||
to account for the new VERIFICATION_IN_PROGRESS state.
|
||||
|
||||
This commit fixes that oversight, and allows users to again pre-type
|
||||
their smartcard pin at the clock before inserting their smartcard.
|
||||
---
|
||||
js/gdm/authPrompt.js | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
|
||||
index 4da91e096..e961f396e 100644
|
||||
--- a/js/gdm/authPrompt.js
|
||||
+++ b/js/gdm/authPrompt.js
|
||||
@@ -327,61 +327,62 @@ var AuthPrompt = GObject.registerClass({
|
||||
_onShowChoiceList(userVerifier, serviceName, promptMessage, choiceList) {
|
||||
if (this._queryingService)
|
||||
this.clear();
|
||||
|
||||
this._queryingService = serviceName;
|
||||
|
||||
if (this._preemptiveAnswer)
|
||||
this._preemptiveAnswer = null;
|
||||
|
||||
this.setChoiceList(promptMessage, choiceList);
|
||||
this.updateSensitivity(true);
|
||||
this.emit('prompted');
|
||||
}
|
||||
|
||||
_onCredentialManagerAuthenticated() {
|
||||
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
||||
this.reset();
|
||||
}
|
||||
|
||||
_onSmartcardStatusChanged() {
|
||||
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
||||
|
||||
// Most of the time we want to reset if the user inserts or removes
|
||||
// a smartcard. Smartcard insertion "preempts" what the user was
|
||||
// doing, and smartcard removal aborts the preemption.
|
||||
// The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying
|
||||
// with a smartcard
|
||||
// 2) Don't reset if we've already succeeded at verification and
|
||||
// the user is getting logged in.
|
||||
if (this._userVerifier.serviceIsDefault(GdmUtil.SMARTCARD_SERVICE_NAME) &&
|
||||
- this.verificationStatus == AuthPromptStatus.VERIFYING &&
|
||||
+ (this.verificationStatus === AuthPromptStatus.VERIFYING ||
|
||||
+ this.verificationStatus === AuthPromptStatus.VERIFICATION_IN_PROGRESS) &&
|
||||
this.smartcardDetected)
|
||||
return;
|
||||
|
||||
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
||||
this.reset();
|
||||
}
|
||||
|
||||
_onShowMessage(_userVerifier, serviceName, message, type) {
|
||||
this.setMessage(serviceName, message, type);
|
||||
this.emit('prompted');
|
||||
}
|
||||
|
||||
_onVerificationFailed(userVerifier, serviceName, canRetry) {
|
||||
const wasQueryingService = this._queryingService === serviceName;
|
||||
|
||||
if (wasQueryingService) {
|
||||
this._queryingService = null;
|
||||
this.clear();
|
||||
}
|
||||
|
||||
this.updateSensitivity(canRetry);
|
||||
this.setActorInDefaultButtonWell(null);
|
||||
|
||||
if (!canRetry)
|
||||
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
|
||||
|
||||
if (wasQueryingService)
|
||||
Util.wiggle(this._entry);
|
||||
}
|
||||
|
||||
--
|
||||
2.39.1
|
||||
|
@ -1,56 +0,0 @@
|
||||
From 170ccbd3d237bf980f46ae87e3da8238df9f8a3c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 16 Apr 2024 20:49:40 +0200
|
||||
Subject: [PATCH] data: Update generated stylesheets
|
||||
|
||||
---
|
||||
data/theme/gnome-shell-dark.css | 3 +++
|
||||
data/theme/gnome-shell-high-contrast.css | 3 +++
|
||||
data/theme/gnome-shell-light.css | 3 +++
|
||||
3 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-dark.css b/data/theme/gnome-shell-dark.css
|
||||
index 339adf7e7b..5dd7d29a3a 100644
|
||||
--- a/data/theme/gnome-shell-dark.css
|
||||
+++ b/data/theme/gnome-shell-dark.css
|
||||
@@ -1720,6 +1720,9 @@ StScrollBar {
|
||||
min-width: 0.5455em;
|
||||
min-height: 0.5455em;
|
||||
background-color: #ffffff; }
|
||||
+ #panel .panel-button#panelActivities .activities-logo {
|
||||
+ icon-size: 1.36375em;
|
||||
+ padding: 0 6px; }
|
||||
#panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
|
||||
spacing: 0.409em; }
|
||||
#panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
|
||||
diff --git a/data/theme/gnome-shell-high-contrast.css b/data/theme/gnome-shell-high-contrast.css
|
||||
index 4bb622aa26..8f94fa4101 100644
|
||||
--- a/data/theme/gnome-shell-high-contrast.css
|
||||
+++ b/data/theme/gnome-shell-high-contrast.css
|
||||
@@ -1897,6 +1897,9 @@ StScrollBar {
|
||||
min-width: 0.5455em;
|
||||
min-height: 0.5455em;
|
||||
background-color: #ffffff; }
|
||||
+ #panel .panel-button#panelActivities .activities-logo {
|
||||
+ icon-size: 1.36375em;
|
||||
+ padding: 0 6px; }
|
||||
#panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
|
||||
spacing: 0.409em; }
|
||||
#panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
|
||||
diff --git a/data/theme/gnome-shell-light.css b/data/theme/gnome-shell-light.css
|
||||
index 82a5b0bc18..128aa93dea 100644
|
||||
--- a/data/theme/gnome-shell-light.css
|
||||
+++ b/data/theme/gnome-shell-light.css
|
||||
@@ -1720,6 +1720,9 @@ StScrollBar {
|
||||
min-width: 0.5455em;
|
||||
min-height: 0.5455em;
|
||||
background-color: #282828; }
|
||||
+ #panel .panel-button#panelActivities .activities-logo {
|
||||
+ icon-size: 1.36375em;
|
||||
+ padding: 0 6px; }
|
||||
#panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
|
||||
spacing: 0.409em; }
|
||||
#panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,92 @@
|
||||
From 91449e6a19af63eebaf5f97f85ba44f69259075a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Sat, 10 Feb 2024 00:58:27 +0100
|
||||
Subject: [PATCH] extensionSystem: Support locking down extension installation
|
||||
|
||||
Currently extensions can only be locked down completely by
|
||||
restricting the `enabled-extensions` key via dconf.
|
||||
|
||||
This is too restrictive for environments that want to allow users
|
||||
to customize their system with extensions, while still limiting
|
||||
the set of possible extensions.
|
||||
|
||||
To fill that gap, add a new `allow-extension-installation` setting,
|
||||
which restricts extensions to system extensions when disabled.
|
||||
|
||||
As the setting is mainly intended for locking down by system
|
||||
administrators, there is no attempt to load/unload extensions
|
||||
on settings changes.
|
||||
---
|
||||
data/org.gnome.shell.gschema.xml.in | 11 +++++++++++
|
||||
js/ui/extensionDownloader.js | 6 ++++++
|
||||
js/ui/extensionSystem.js | 8 ++++++--
|
||||
3 files changed, 23 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
|
||||
index 6f1c424bad..b5921983cd 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -40,6 +40,17 @@
|
||||
the “enabled-extension” setting.
|
||||
</description>
|
||||
</key>
|
||||
+ <key name="allow-extension-installation" type="b">
|
||||
+ <default>true</default>
|
||||
+ <summary>Allow extension installation</summary>
|
||||
+ <description>
|
||||
+ Allow users to install extensions in their home folder. If disabled,
|
||||
+ the InstallRemoteExtension D-Bus method will fail, and extensions
|
||||
+ are only loaded from system directories on startup.
|
||||
+ It does not affect extensions that are already loaded, so a change
|
||||
+ only takes full effect on the next login.
|
||||
+ </description>
|
||||
+ </key>
|
||||
<key name="disable-extension-version-validation" type="b">
|
||||
<default>false</default>
|
||||
<summary>Disables the validation of extension version compatibility</summary>
|
||||
diff --git a/js/ui/extensionDownloader.js b/js/ui/extensionDownloader.js
|
||||
index 471ddab147..01ed165c01 100644
|
||||
--- a/js/ui/extensionDownloader.js
|
||||
+++ b/js/ui/extensionDownloader.js
|
||||
@@ -17,6 +17,12 @@ var REPOSITORY_URL_UPDATE = 'https://extensions.gnome.org/update-info/';
|
||||
let _httpSession;
|
||||
|
||||
function installExtension(uuid, invocation) {
|
||||
+ if (!global.settings.get_boolean('allow-extension-installation')) {
|
||||
+ invocation.return_dbus_error('org.gnome.Shell.InstallError',
|
||||
+ 'Extension installation is not allowed');
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
const oldExt = Main.extensionManager.lookup(uuid);
|
||||
if (oldExt && oldExt.type === ExtensionUtils.ExtensionType.SYSTEM) {
|
||||
log('extensionDownloader: Trying to replace system extension %s'.format(uuid));
|
||||
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
|
||||
index 937f861994..528d9ea450 100644
|
||||
--- a/js/ui/extensionSystem.js
|
||||
+++ b/js/ui/extensionSystem.js
|
||||
@@ -64,7 +64,10 @@ var ExtensionManager = class {
|
||||
|
||||
get updatesSupported() {
|
||||
const appSys = Shell.AppSystem.get_default();
|
||||
- return appSys.lookup_app('org.gnome.Extensions.desktop') !== null;
|
||||
+ const hasUpdatesApp =
|
||||
+ appSys.lookup_app('org.gnome.Extensions.desktop') !== null;
|
||||
+ const allowed = global.settings.get_boolean('allow-extension-installation');
|
||||
+ return allowed && hasUpdatesApp;
|
||||
}
|
||||
|
||||
lookup(uuid) {
|
||||
@@ -595,7 +598,8 @@ var ExtensionManager = class {
|
||||
this._enabledExtensions = this._getEnabledExtensions();
|
||||
|
||||
let perUserDir = Gio.File.new_for_path(global.userdatadir);
|
||||
- FileUtils.collectFromDatadirs('extensions', true, (dir, info) => {
|
||||
+ const includeUserDir = global.settings.get_boolean('allow-extension-installation');
|
||||
+ FileUtils.collectFromDatadirs('extensions', includeUserDir, (dir, info) => {
|
||||
let fileType = info.get_file_type();
|
||||
if (fileType != Gio.FileType.DIRECTORY)
|
||||
return;
|
||||
--
|
||||
2.43.0
|
||||
|
@ -1,67 +0,0 @@
|
||||
From ff73f820b1398e5d60b8984b0003db46ad70b8ec Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Berg <bberg@redhat.com>
|
||||
Date: Wed, 28 Apr 2021 16:50:03 +0200
|
||||
Subject: [PATCH] gdm: Work around failing fingerprint auth
|
||||
|
||||
On Fedora we have the problem that fingerprint auth fails immediately if
|
||||
the PAM configuration has not been updated and no prints are enrolled.
|
||||
|
||||
So, consider a verification failure within one second to be a service
|
||||
failure instead.
|
||||
---
|
||||
js/gdm/util.js | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
diff --git a/js/gdm/util.js b/js/gdm/util.js
|
||||
index 97df6d687e..371953cb25 100644
|
||||
--- a/js/gdm/util.js
|
||||
+++ b/js/gdm/util.js
|
||||
@@ -109,6 +109,7 @@ export class ShellUserVerifier extends Signals.EventEmitter {
|
||||
this._defaultService = null;
|
||||
this._preemptingService = null;
|
||||
this._fingerprintReaderType = FingerprintReaderType.NONE;
|
||||
+ this._fprintStartTime = -1;
|
||||
|
||||
this._messageQueue = [];
|
||||
this._messageQueueTimeoutId = 0;
|
||||
@@ -669,6 +670,10 @@ export class ShellUserVerifier extends Signals.EventEmitter {
|
||||
this._hold.acquire();
|
||||
try {
|
||||
this._activeServices.add(serviceName);
|
||||
+
|
||||
+ if (serviceName == FINGERPRINT_SERVICE_NAME)
|
||||
+ this._fprintStartTime = GLib.get_monotonic_time();
|
||||
+
|
||||
if (this._userName) {
|
||||
await this._userVerifier.call_begin_verification_for_user(
|
||||
serviceName, this._userName, this._cancellable);
|
||||
@@ -763,6 +768,7 @@ export class ShellUserVerifier extends Signals.EventEmitter {
|
||||
const cancellable = this._cancellable;
|
||||
this._fingerprintFailedId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
||||
FINGERPRINT_ERROR_TIMEOUT_WAIT, () => {
|
||||
+ log("Generating _verificationFailed!");
|
||||
this._fingerprintFailedId = 0;
|
||||
if (!cancellable.is_cancelled())
|
||||
this._verificationFailed(serviceName, false);
|
||||
@@ -829,6 +835,18 @@ export class ShellUserVerifier extends Signals.EventEmitter {
|
||||
if (serviceName === FINGERPRINT_SERVICE_NAME) {
|
||||
if (this._fingerprintFailedId)
|
||||
GLib.source_remove(this._fingerprintFailedId);
|
||||
+
|
||||
+ // On Fedora we have the problem that fingerprint auth fails
|
||||
+ // immediately if the PAM configuration has not been updated and no
|
||||
+ // prints are enrolled.
|
||||
+ // So, consider a verification failure within one second to be a service
|
||||
+ // failure instead.
|
||||
+ if (this._fprintStartTime > GLib.get_monotonic_time() - GLib.USEC_PER_SEC) {
|
||||
+ log("Fingerprint service failed almost immediately, considering it unavailable.");
|
||||
+ log("Please fix your configuration by running: authselect select --force sssd with-fingerprint with-silent-lastlog");
|
||||
+ this._onServiceUnavailable(this._client, serviceName, null);
|
||||
+ return;
|
||||
+ }
|
||||
}
|
||||
|
||||
// For Not Listed / enterprise logins, immediately reset
|
||||
--
|
||||
2.43.2
|
||||
|
@ -0,0 +1,51 @@
|
||||
From eea9b9a0dac494698a64892bab8d042e7d623c9f Mon Sep 17 00:00:00 2001
|
||||
From: Cenk Uluisik <cenk.uluisik@googlemail.com>
|
||||
Date: Sun, 6 Mar 2022 19:32:48 +0100
|
||||
Subject: [PATCH] introspect: Add WindowsChanged signal
|
||||
|
||||
The screencast portal supports recording a single window,
|
||||
and presents a list of open windows when that option is
|
||||
selected. To allow updating that list when windows are
|
||||
opened or closed, add a new "WindowsChanged" signal that
|
||||
the portal can listen to.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2229>
|
||||
---
|
||||
data/dbus-interfaces/org.gnome.Shell.Introspect.xml | 6 ++++++
|
||||
js/misc/introspect.js | 3 +++
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/data/dbus-interfaces/org.gnome.Shell.Introspect.xml b/data/dbus-interfaces/org.gnome.Shell.Introspect.xml
|
||||
index 47fd7efdc2..cb19cfec56 100644
|
||||
--- a/data/dbus-interfaces/org.gnome.Shell.Introspect.xml
|
||||
+++ b/data/dbus-interfaces/org.gnome.Shell.Introspect.xml
|
||||
@@ -18,6 +18,12 @@
|
||||
-->
|
||||
<signal name="RunningApplicationsChanged" />
|
||||
|
||||
+ <!--
|
||||
+ WindowsChanged:
|
||||
+ @short_description: Notifies when any window opens or closes
|
||||
+ -->
|
||||
+ <signal name="WindowsChanged" />
|
||||
+
|
||||
<!--
|
||||
GetRunningApplications:
|
||||
@short_description: Retrieves the description of all running applications
|
||||
diff --git a/js/misc/introspect.js b/js/misc/introspect.js
|
||||
index 45eee81ce3..8916804e7f 100644
|
||||
--- a/js/misc/introspect.js
|
||||
+++ b/js/misc/introspect.js
|
||||
@@ -42,6 +42,9 @@ var IntrospectService = class {
|
||||
this._syncRunningApplications();
|
||||
});
|
||||
|
||||
+ tracker.connect('tracked-windows-changed',
|
||||
+ () => this._dbusImpl.emit_signal('WindowsChanged', null));
|
||||
+
|
||||
this._syncRunningApplications();
|
||||
|
||||
this._senderChecker = new DBusSenderChecker(APP_ALLOWLIST);
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,33 @@
|
||||
From b73a07c20a522b3be0e096625c21d5606bcb7d82 Mon Sep 17 00:00:00 2001
|
||||
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
Date: Mon, 21 Jun 2021 16:32:50 -0300
|
||||
Subject: [PATCH] introspect: Allowlist GNOME portal
|
||||
|
||||
It too implements app listing and introspection, so list it in the
|
||||
allowlist.
|
||||
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1894>
|
||||
---
|
||||
js/misc/introspect.js | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/misc/introspect.js b/js/misc/introspect.js
|
||||
index f3c938af9..45eee81ce 100644
|
||||
--- a/js/misc/introspect.js
|
||||
+++ b/js/misc/introspect.js
|
||||
@@ -1,7 +1,10 @@
|
||||
/* exported IntrospectService */
|
||||
const { Gio, GLib, Meta, Shell, St } = imports.gi;
|
||||
|
||||
-const APP_ALLOWLIST = ['org.freedesktop.impl.portal.desktop.gtk'];
|
||||
+const APP_ALLOWLIST = [
|
||||
+ 'org.freedesktop.impl.portal.desktop.gtk',
|
||||
+ 'org.freedesktop.impl.portal.desktop.gnome',
|
||||
+];
|
||||
|
||||
const INTROSPECT_DBUS_API_VERSION = 3;
|
||||
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,51 @@
|
||||
From bd4fef8354ff0730c1e96a47d77adbb4a4d7beaa Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Tue, 14 Jun 2022 16:38:27 +0200
|
||||
Subject: [PATCH] kbdA11yDialog: Use MetaKeyboardA11yFlags
|
||||
|
||||
The change in mutter to move keyboard accessibility into backends needs
|
||||
to be applied in gnome-shell as well, otherwise the keyboard
|
||||
accessibility dialog cannot work.
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2306
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2334>
|
||||
---
|
||||
js/ui/kbdA11yDialog.js | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/js/ui/kbdA11yDialog.js b/js/ui/kbdA11yDialog.js
|
||||
index a45e02443..60ec161a6 100644
|
||||
--- a/js/ui/kbdA11yDialog.js
|
||||
+++ b/js/ui/kbdA11yDialog.js
|
||||
@@ -1,5 +1,5 @@
|
||||
/* exported KbdA11yDialog */
|
||||
-const { Clutter, Gio, GObject } = imports.gi;
|
||||
+const { Clutter, Gio, GObject, Meta } = imports.gi;
|
||||
|
||||
const Dialog = imports.ui.dialog;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
@@ -25,17 +25,17 @@ class KbdA11yDialog extends GObject.Object {
|
||||
let title, description;
|
||||
let key, enabled;
|
||||
|
||||
- if (whatChanged & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) {
|
||||
+ if (whatChanged & Meta.KeyboardA11yFlags.SLOW_KEYS_ENABLED) {
|
||||
key = KEY_SLOW_KEYS_ENABLED;
|
||||
- enabled = (newFlags & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) > 0;
|
||||
+ enabled = (newFlags & Meta.KeyboardA11yFlags.SLOW_KEYS_ENABLED) > 0;
|
||||
title = enabled
|
||||
? _("Slow Keys Turned On")
|
||||
: _("Slow Keys Turned Off");
|
||||
description = _('You just held down the Shift key for 8 seconds. This is the shortcut ' +
|
||||
'for the Slow Keys feature, which affects the way your keyboard works.');
|
||||
- } else if (whatChanged & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) {
|
||||
+ } else if (whatChanged & Meta.KeyboardA11yFlags.STICKY_KEYS_ENABLED) {
|
||||
key = KEY_STICKY_KEYS_ENABLED;
|
||||
- enabled = (newFlags & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) > 0;
|
||||
+ enabled = (newFlags & Meta.KeyboardA11yFlags.STICKY_KEYS_ENABLED) > 0;
|
||||
title = enabled
|
||||
? _("Sticky Keys Turned On")
|
||||
: _("Sticky Keys Turned Off");
|
||||
--
|
||||
2.36.1
|
||||
|
@ -0,0 +1,48 @@
|
||||
From 5aeb97faee1aba8f6d4cc2c613691a7e2c880ccc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 17 Nov 2022 15:21:42 +0100
|
||||
Subject: [PATCH] layout: Initialize regions unconditionally
|
||||
|
||||
We currently initialize regions in all code paths except for the
|
||||
greeter. But while there are no windows on the login screen, the
|
||||
work area can still be used for positioning, for example for
|
||||
notifications.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2546>
|
||||
---
|
||||
js/ui/layout.js | 15 +++++++--------
|
||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/js/ui/layout.js b/js/ui/layout.js
|
||||
index 70ece6cab..c6712459a 100644
|
||||
--- a/js/ui/layout.js
|
||||
+++ b/js/ui/layout.js
|
||||
@@ -649,18 +649,17 @@ var LayoutManager = GObject.registerClass({
|
||||
reactive: true });
|
||||
this.addChrome(this._coverPane);
|
||||
|
||||
+ // Force an update of the regions before we scale the UI group to
|
||||
+ // get the correct allocation for the struts.
|
||||
+ // Do this even when we don't animate on restart, so that maximized
|
||||
+ // windows restore to the right size.
|
||||
+ this._updateRegions();
|
||||
+
|
||||
if (Meta.is_restart()) {
|
||||
- // On restart, we don't do an animation. Force an update of the
|
||||
- // regions immediately so that maximized windows restore to the
|
||||
- // right size taking struts into account.
|
||||
- this._updateRegions();
|
||||
+ // On restart, we don't do an animation.
|
||||
} else if (Main.sessionMode.isGreeter) {
|
||||
this.panelBox.translation_y = -this.panelBox.height;
|
||||
} else {
|
||||
- // We need to force an update of the regions now before we scale
|
||||
- // the UI group to get the correct allocation for the struts.
|
||||
- this._updateRegions();
|
||||
-
|
||||
this.keyboardBox.hide();
|
||||
|
||||
let monitor = this.primaryMonitor;
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,83 @@
|
||||
From 4ad30b5c506ab043c2091441021b6cf334e2412f Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 26 Jun 2017 14:35:05 -0400
|
||||
Subject: [PATCH] loginDialog: make info messages themed
|
||||
|
||||
They were lacking a definition before leading them to
|
||||
show up invisible.
|
||||
---
|
||||
data/theme/gnome-shell-sass/widgets/_login-dialog.scss | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
|
||||
index 1789beca9..84539342d 100644
|
||||
--- a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
|
||||
+++ b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
|
||||
@@ -66,60 +66,64 @@
|
||||
border-color: darken($selected_bg_color, 10%);
|
||||
background-color: darken($selected_bg_color, 10%);
|
||||
color: transparentize($selected_fg_color, 0.3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.cancel-button,
|
||||
.switch-user-button,
|
||||
.login-dialog-session-list-button {
|
||||
padding: 0;
|
||||
border-radius: 99px;
|
||||
width: $base_icon_size * 2;
|
||||
height: $base_icon_size * 2;
|
||||
border-color: darken($system_bg_color, 3%);
|
||||
background-color: darken($system_bg_color, 3%);
|
||||
|
||||
StIcon { icon-size: $base_icon_size; }
|
||||
}
|
||||
|
||||
.caps-lock-warning-label,
|
||||
.login-dialog-message-warning {
|
||||
color: $osd_fg_color;
|
||||
}
|
||||
}
|
||||
|
||||
.login-dialog-logo-bin { padding: 24px 0px; }
|
||||
.login-dialog-banner { color: darken($osd_fg_color,10%); }
|
||||
.login-dialog-button-box { width: 23em; spacing: 5px; }
|
||||
.login-dialog-message { text-align: center; }
|
||||
+.login-dialog-message-hint, .login-dialog-message {
|
||||
+ color: darken($osd_fg_color, 20%);
|
||||
+ min-height: 2.75em;
|
||||
+}
|
||||
.login-dialog-user-selection-box { padding: 100px 0px; }
|
||||
.login-dialog-not-listed-label {
|
||||
padding-left: 2px;
|
||||
.login-dialog-not-listed-button:focus &,
|
||||
.login-dialog-not-listed-button:hover & {
|
||||
color: $osd_fg_color;
|
||||
}
|
||||
}
|
||||
|
||||
.login-dialog-not-listed-label {
|
||||
@include fontsize($base_font_size - 1);
|
||||
font-weight: bold;
|
||||
color: darken($osd_fg_color,30%);
|
||||
padding-top: 1em;
|
||||
}
|
||||
|
||||
.login-dialog-user-list-view { -st-vfade-offset: 1em; }
|
||||
.login-dialog-user-list {
|
||||
spacing: 12px;
|
||||
width: 23em;
|
||||
&:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
|
||||
&:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
|
||||
}
|
||||
|
||||
.login-dialog-user-list-item {
|
||||
border-radius: $base_border_radius + 4px;
|
||||
padding: 6px;
|
||||
color: darken($osd_fg_color,30%);
|
||||
&:ltr .user-widget { padding-right: 1em; }
|
||||
&:rtl .user-widget { padding-left: 1em; }
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,148 @@
|
||||
From ea7e7acd45e428cc17306de2bf65730c90d7e118 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Keller <skeller@gnome.org>
|
||||
Date: Mon, 23 May 2022 23:01:23 +0200
|
||||
Subject: [PATCH] magnifier: Request window-relative coordinates for
|
||||
focus/caret events
|
||||
|
||||
Absolute screen coordinates are impossible for Wayland clients to
|
||||
provide, because the clients don't know where the window is positioned.
|
||||
Some clients, such as the ones using GTK 3 were providing window
|
||||
relative coordinates even when screen coordinates were requested,
|
||||
while others, such as GTK 4 clients, were just returning an error for
|
||||
caret events or also window-relative coordinates for focus events.
|
||||
|
||||
So for this to work on Wayland we have to request window-relative
|
||||
coordinates and translate them to the current focus window.
|
||||
|
||||
To ensure the correct coordinates, we have to only consider events
|
||||
coming from the current focus window. All other events are filtered out
|
||||
now. As a side effect this also fixes the magnifier always jumping
|
||||
to a terminal cursor whenever there was some output, even if the window
|
||||
was not focused.
|
||||
|
||||
This also needs some special handling for events coming from the shell
|
||||
itself, which should not be translated to the focus window either. As
|
||||
another side effect this fixes another bug that was caused by these
|
||||
events already including scaling and getting scaled again.
|
||||
|
||||
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5509
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2301>
|
||||
---
|
||||
js/ui/magnifier.js | 77 +++++++++++++++++++++++++++++++++++++++++-----
|
||||
1 file changed, 70 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js
|
||||
index 4c2e88f1a..9813664be 100644
|
||||
--- a/js/ui/magnifier.js
|
||||
+++ b/js/ui/magnifier.js
|
||||
@@ -789,21 +789,81 @@ var ZoomRegion = class ZoomRegion {
|
||||
}
|
||||
}
|
||||
|
||||
+ _convertExtentsToScreenSpace(accessible, extents) {
|
||||
+ const toplevelWindowTypes = new Set([
|
||||
+ Atspi.Role.FRAME,
|
||||
+ Atspi.Role.DIALOG,
|
||||
+ Atspi.Role.WINDOW,
|
||||
+ ]);
|
||||
+
|
||||
+ try {
|
||||
+ let app = null;
|
||||
+ let parentWindow = null;
|
||||
+ let iter = accessible;
|
||||
+ while (iter) {
|
||||
+ if (iter.get_role() === Atspi.Role.APPLICATION) {
|
||||
+ app = iter;
|
||||
+ /* This is the last Accessible we are interested in */
|
||||
+ break;
|
||||
+ } else if (toplevelWindowTypes.has(iter.get_role())) {
|
||||
+ parentWindow = iter;
|
||||
+ }
|
||||
+ iter = iter.get_parent();
|
||||
+ }
|
||||
+
|
||||
+ /* We don't want to translate our own events to the focus window.
|
||||
+ * They are also already scaled by clutter before being sent, so
|
||||
+ * we don't need to do that here either. */
|
||||
+ if (app && app.get_name() === 'gnome-shell')
|
||||
+ return extents;
|
||||
+
|
||||
+ /* Only events from the focused widget of the focused window. Some
|
||||
+ * widgets seem to claim to have focus when the window does not so
|
||||
+ * check both. */
|
||||
+ const windowActive = parentWindow &&
|
||||
+ parentWindow.get_state_set().contains(Atspi.StateType.ACTIVE);
|
||||
+ const accessibleFocused =
|
||||
+ accessible.get_state_set().contains(Atspi.StateType.FOCUSED);
|
||||
+ if (!windowActive || !accessibleFocused)
|
||||
+ return null;
|
||||
+ } catch (e) {
|
||||
+ throw new Error(`Failed to validate parent window: ${e}`);
|
||||
+ }
|
||||
+
|
||||
+ const focusWindowRect = global.display.focus_window?.get_frame_rect();
|
||||
+ if (!focusWindowRect)
|
||||
+ return null;
|
||||
+
|
||||
+ const scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
+ const screenSpaceExtents = new Atspi.Rect({
|
||||
+ x: focusWindowRect.x + (scaleFactor * extents.x),
|
||||
+ y: focusWindowRect.y + (scaleFactor * extents.y),
|
||||
+ width: scaleFactor * extents.width,
|
||||
+ height: scaleFactor * extents.height,
|
||||
+ });
|
||||
+
|
||||
+ return screenSpaceExtents;
|
||||
+ }
|
||||
+
|
||||
_updateFocus(caller, event) {
|
||||
let component = event.source.get_component_iface();
|
||||
if (!component || event.detail1 != 1)
|
||||
return;
|
||||
let extents;
|
||||
try {
|
||||
- extents = component.get_extents(Atspi.CoordType.SCREEN);
|
||||
+ extents = component.get_extents(Atspi.CoordType.WINDOW);
|
||||
+ extents = this._convertExtentsToScreenSpace(event.source, extents);
|
||||
+ if (!extents)
|
||||
+ return;
|
||||
} catch (e) {
|
||||
log(`Failed to read extents of focused component: ${e.message}`);
|
||||
return;
|
||||
}
|
||||
|
||||
- let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
- let [xFocus, yFocus] = [(extents.x + (extents.width / 2)) * scaleFactor,
|
||||
- (extents.y + (extents.height / 2)) * scaleFactor];
|
||||
+ const [xFocus, yFocus] = [
|
||||
+ extents.x + (extents.width / 2),
|
||||
+ extents.y + (extents.height / 2),
|
||||
+ ];
|
||||
|
||||
if (this._xFocus !== xFocus || this._yFocus !== yFocus) {
|
||||
[this._xFocus, this._yFocus] = [xFocus, yFocus];
|
||||
@@ -817,14 +877,17 @@ var ZoomRegion = class ZoomRegion {
|
||||
return;
|
||||
let extents;
|
||||
try {
|
||||
- extents = text.get_character_extents(text.get_caret_offset(), 0);
|
||||
+ extents = text.get_character_extents(text.get_caret_offset(),
|
||||
+ Atspi.CoordType.WINDOW);
|
||||
+ extents = this._convertExtentsToScreenSpace(text, extents);
|
||||
+ if (!extents)
|
||||
+ return;
|
||||
} catch (e) {
|
||||
log(`Failed to read extents of text caret: ${e.message}`);
|
||||
return;
|
||||
}
|
||||
|
||||
- let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
- let [xCaret, yCaret] = [extents.x * scaleFactor, extents.y * scaleFactor];
|
||||
+ const [xCaret, yCaret] = [extents.x, extents.y];
|
||||
|
||||
// Ignore event(s) if the caret size is none (0x0). This happens a lot if
|
||||
// the cursor offset can't be translated into a location. This is a work
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,31 @@
|
||||
From a9e79b1657dc7c1b702d7acc4d322539d2b8b6aa Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Wed, 6 Oct 2021 10:00:43 +0200
|
||||
Subject: [PATCH] main: Leak the GJS context and ShellGlobal
|
||||
|
||||
There are many crash-on-exit happening as a side effect of destroying
|
||||
the GJS context. Work around these until we have a better solution by
|
||||
leaking them.
|
||||
---
|
||||
src/main.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/main.c b/src/main.c
|
||||
index 91e5493fd1..d62dda9627 100644
|
||||
--- a/src/main.c
|
||||
+++ b/src/main.c
|
||||
@@ -508,9 +508,11 @@ main (int argc, char **argv)
|
||||
ecode = meta_run ();
|
||||
shell_profiler_shutdown ();
|
||||
|
||||
+#if 0
|
||||
g_debug ("Doing final cleanup");
|
||||
_shell_global_destroy_gjs_context (shell_global_get ());
|
||||
g_object_unref (shell_global_get ());
|
||||
+#endif
|
||||
|
||||
return ecode;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,281 @@
|
||||
From be3a2303cf9ed4077955aaa9fae1fc4cbe2da277 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Tue, 24 Jan 2023 17:49:24 +0100
|
||||
Subject: [PATCH] =?UTF-8?q?osk-layouts:=20Replace=20"SS"=20extra=20key=20w?=
|
||||
=?UTF-8?q?ith=20"=E1=BA=9E"?=
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The on-screen keyboard only handles a single keyval per key, so the
|
||||
current upper-case version of the German "ß" ends up as "S" instead
|
||||
of the expected "SS".
|
||||
|
||||
It is possible to change the keyboard code to emulate multiple key
|
||||
presses/releases for that particular case, but then luckily a proper
|
||||
upper-case form exists nowadays: "ẞ".
|
||||
|
||||
That seems more appropriate for a single key than a dedicated "SS"
|
||||
key, so replace it in all layouts that include it. Anybody who prefers
|
||||
the traditional "SS" can easily tap "S" twice.
|
||||
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2612>
|
||||
---
|
||||
data/osk-layouts/cz.json | 2 +-
|
||||
data/osk-layouts/de.json | 2 +-
|
||||
data/osk-layouts/dk.json | 2 +-
|
||||
data/osk-layouts/ee.json | 2 +-
|
||||
data/osk-layouts/epo.json | 2 +-
|
||||
data/osk-layouts/fi.json | 2 +-
|
||||
data/osk-layouts/hr.json | 2 +-
|
||||
data/osk-layouts/ke.json | 2 +-
|
||||
data/osk-layouts/lt.json | 2 +-
|
||||
data/osk-layouts/lv.json | 2 +-
|
||||
data/osk-layouts/no.json | 2 +-
|
||||
data/osk-layouts/pl.json | 2 +-
|
||||
data/osk-layouts/ro.json | 2 +-
|
||||
data/osk-layouts/se.json | 2 +-
|
||||
data/osk-layouts/sk.json | 2 +-
|
||||
data/osk-layouts/tr.json | 2 +-
|
||||
data/osk-layouts/uk.json | 2 +-
|
||||
data/osk-layouts/us.json | 2 +-
|
||||
18 files changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/data/osk-layouts/cz.json b/data/osk-layouts/cz.json
|
||||
index 9bad07402..526cb9cb6 100644
|
||||
--- a/data/osk-layouts/cz.json
|
||||
+++ b/data/osk-layouts/cz.json
|
||||
@@ -246,7 +246,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś"
|
||||
],
|
||||
[
|
||||
diff --git a/data/osk-layouts/de.json b/data/osk-layouts/de.json
|
||||
index 751a85603..3b1cb34b2 100644
|
||||
--- a/data/osk-layouts/de.json
|
||||
+++ b/data/osk-layouts/de.json
|
||||
@@ -208,7 +208,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/dk.json b/data/osk-layouts/dk.json
|
||||
index 80df9ae65..7bc6feaf3 100644
|
||||
--- a/data/osk-layouts/dk.json
|
||||
+++ b/data/osk-layouts/dk.json
|
||||
@@ -218,7 +218,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/ee.json b/data/osk-layouts/ee.json
|
||||
index 5fd2f11fa..b42b0afc9 100644
|
||||
--- a/data/osk-layouts/ee.json
|
||||
+++ b/data/osk-layouts/ee.json
|
||||
@@ -281,7 +281,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Ş"
|
||||
],
|
||||
diff --git a/data/osk-layouts/epo.json b/data/osk-layouts/epo.json
|
||||
index 71f9ef8d9..d7257625f 100644
|
||||
--- a/data/osk-layouts/epo.json
|
||||
+++ b/data/osk-layouts/epo.json
|
||||
@@ -316,7 +316,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Š",
|
||||
"Ś",
|
||||
"Ș",
|
||||
diff --git a/data/osk-layouts/fi.json b/data/osk-layouts/fi.json
|
||||
index 3ba5b567c..d664b0ec5 100644
|
||||
--- a/data/osk-layouts/fi.json
|
||||
+++ b/data/osk-layouts/fi.json
|
||||
@@ -200,7 +200,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś"
|
||||
],
|
||||
[
|
||||
diff --git a/data/osk-layouts/hr.json b/data/osk-layouts/hr.json
|
||||
index ff0d1d09a..e4977796a 100644
|
||||
--- a/data/osk-layouts/hr.json
|
||||
+++ b/data/osk-layouts/hr.json
|
||||
@@ -168,7 +168,7 @@
|
||||
"S",
|
||||
"Š",
|
||||
"Ś",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D",
|
||||
diff --git a/data/osk-layouts/ke.json b/data/osk-layouts/ke.json
|
||||
index 9c3e93565..2bd5b09d0 100644
|
||||
--- a/data/osk-layouts/ke.json
|
||||
+++ b/data/osk-layouts/ke.json
|
||||
@@ -217,7 +217,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D"
|
||||
diff --git a/data/osk-layouts/lt.json b/data/osk-layouts/lt.json
|
||||
index 7cd5352a8..a43ff9146 100644
|
||||
--- a/data/osk-layouts/lt.json
|
||||
+++ b/data/osk-layouts/lt.json
|
||||
@@ -270,7 +270,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Ş"
|
||||
],
|
||||
diff --git a/data/osk-layouts/lv.json b/data/osk-layouts/lv.json
|
||||
index bab6ae3d7..d72c93c25 100644
|
||||
--- a/data/osk-layouts/lv.json
|
||||
+++ b/data/osk-layouts/lv.json
|
||||
@@ -268,7 +268,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Ş"
|
||||
],
|
||||
diff --git a/data/osk-layouts/no.json b/data/osk-layouts/no.json
|
||||
index a70be9ca0..0df786853 100644
|
||||
--- a/data/osk-layouts/no.json
|
||||
+++ b/data/osk-layouts/no.json
|
||||
@@ -218,7 +218,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/pl.json b/data/osk-layouts/pl.json
|
||||
index 4b08cd5d3..8583bd64c 100644
|
||||
--- a/data/osk-layouts/pl.json
|
||||
+++ b/data/osk-layouts/pl.json
|
||||
@@ -212,7 +212,7 @@
|
||||
[
|
||||
"S",
|
||||
"Ś",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Š"
|
||||
],
|
||||
[
|
||||
diff --git a/data/osk-layouts/ro.json b/data/osk-layouts/ro.json
|
||||
index c690f4ecd..8d4676126 100644
|
||||
--- a/data/osk-layouts/ro.json
|
||||
+++ b/data/osk-layouts/ro.json
|
||||
@@ -188,7 +188,7 @@
|
||||
[
|
||||
"S",
|
||||
"Ș",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/se.json b/data/osk-layouts/se.json
|
||||
index 513a0b897..0ebb756e7 100644
|
||||
--- a/data/osk-layouts/se.json
|
||||
+++ b/data/osk-layouts/se.json
|
||||
@@ -245,7 +245,7 @@
|
||||
"Ś",
|
||||
"Š",
|
||||
"Ş",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D",
|
||||
diff --git a/data/osk-layouts/sk.json b/data/osk-layouts/sk.json
|
||||
index 678232b82..a74ad0b61 100644
|
||||
--- a/data/osk-layouts/sk.json
|
||||
+++ b/data/osk-layouts/sk.json
|
||||
@@ -269,7 +269,7 @@
|
||||
[
|
||||
"S",
|
||||
"Š",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Ş"
|
||||
],
|
||||
diff --git a/data/osk-layouts/tr.json b/data/osk-layouts/tr.json
|
||||
index b3786cc88..8243aafad 100644
|
||||
--- a/data/osk-layouts/tr.json
|
||||
+++ b/data/osk-layouts/tr.json
|
||||
@@ -202,7 +202,7 @@
|
||||
[
|
||||
"S",
|
||||
"Ş",
|
||||
- "SS",
|
||||
+ "ẞ",
|
||||
"Ś",
|
||||
"Š"
|
||||
],
|
||||
diff --git a/data/osk-layouts/uk.json b/data/osk-layouts/uk.json
|
||||
index c36a723a0..19f5aa6d9 100644
|
||||
--- a/data/osk-layouts/uk.json
|
||||
+++ b/data/osk-layouts/uk.json
|
||||
@@ -216,7 +216,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D"
|
||||
diff --git a/data/osk-layouts/us.json b/data/osk-layouts/us.json
|
||||
index 94dd6d3ad..dd0cd368f 100644
|
||||
--- a/data/osk-layouts/us.json
|
||||
+++ b/data/osk-layouts/us.json
|
||||
@@ -216,7 +216,7 @@
|
||||
],
|
||||
[
|
||||
"S",
|
||||
- "SS"
|
||||
+ "ẞ"
|
||||
],
|
||||
[
|
||||
"D"
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,51 +0,0 @@
|
||||
From c0b2f60108e7b8cffa10306ef54c620fe71a6735 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 22 May 2024 18:42:06 +0200
|
||||
Subject: [PATCH] panel: Use branding in activities button
|
||||
|
||||
Replace the upstream workspace dots with a red hat.
|
||||
---
|
||||
data/theme/gnome-shell-sass/widgets/_panel.scss | 5 +++++
|
||||
js/ui/panel.js | 10 +++++++++-
|
||||
2 files changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/widgets/_panel.scss b/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
index 2a29eee9da..02f8232de6 100644
|
||||
--- a/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
+++ b/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
@@ -58,6 +58,11 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
|
||||
min-height: $scalable_icon_size * 0.5;
|
||||
background-color: $panel_fg_color;
|
||||
}
|
||||
+
|
||||
+ & .activities-logo {
|
||||
+ icon-size: $scalable_icon_size * 1.25;
|
||||
+ padding: 0 $base_padding;
|
||||
+ }
|
||||
}
|
||||
|
||||
// screen activity indicators
|
||||
diff --git a/js/ui/panel.js b/js/ui/panel.js
|
||||
index 62c8ebb31a..1d11cc1b5f 100644
|
||||
--- a/js/ui/panel.js
|
||||
+++ b/js/ui/panel.js
|
||||
@@ -425,7 +425,15 @@ class ActivitiesButton extends PanelMenu.Button {
|
||||
accessible_name: _('Activities'),
|
||||
});
|
||||
|
||||
- this.add_child(new WorkspaceIndicators());
|
||||
+ if (GLib.get_os_info('ID') === 'rhel') {
|
||||
+ const logoIcon = new St.Icon({
|
||||
+ icon_name: 'fedora-logo-icon',
|
||||
+ style_class: 'activities-logo',
|
||||
+ });
|
||||
+ this.add_child(logoIcon);
|
||||
+ } else {
|
||||
+ this.add_child(new WorkspaceIndicators());
|
||||
+ }
|
||||
|
||||
Main.overview.connectObject('showing',
|
||||
() => this.add_style_pseudo_class('checked'),
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,56 @@
|
||||
From b5db4d318546654f4e9c1e4999fa00456441f105 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 15 Jan 2014 16:45:34 -0500
|
||||
Subject: [PATCH] panel: add an icon to the ActivitiesButton
|
||||
|
||||
Requested by brand
|
||||
---
|
||||
data/theme/gnome-shell-sass/widgets/_panel.scss | 5 +++++
|
||||
js/ui/panel.js | 11 ++++++++++-
|
||||
2 files changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/theme/gnome-shell-sass/widgets/_panel.scss b/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
index 1f4650773..5f323cbc8 100644
|
||||
--- a/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
+++ b/data/theme/gnome-shell-sass/widgets/_panel.scss
|
||||
@@ -85,6 +85,11 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
|
||||
// dimensions of the icon are hardcoded
|
||||
}
|
||||
|
||||
+ .panel-logo-icon {
|
||||
+ padding-right: .4em;
|
||||
+ icon-size: 1em;
|
||||
+ }
|
||||
+
|
||||
&#panelActivities {
|
||||
-natural-hpadding: $base_padding * 3;
|
||||
}
|
||||
diff --git a/js/ui/panel.js b/js/ui/panel.js
|
||||
index 1474886ef..ad11f4ba2 100644
|
||||
--- a/js/ui/panel.js
|
||||
+++ b/js/ui/panel.js
|
||||
@@ -390,11 +390,20 @@ class ActivitiesButton extends PanelMenu.Button {
|
||||
|
||||
this.name = 'panelActivities';
|
||||
|
||||
+ const box = new St.BoxLayout();
|
||||
+ this.add_child(box);
|
||||
+ const iconFile = Gio.File.new_for_path('/usr/share/icons/hicolor/scalable/apps/start-here.svg');
|
||||
+ this._icon = new St.Icon({
|
||||
+ gicon: new Gio.FileIcon({ file: iconFile }),
|
||||
+ style_class: 'panel-logo-icon',
|
||||
+ });
|
||||
+ box.add_child(this._icon);
|
||||
+
|
||||
/* Translators: If there is no suitable word for "Activities"
|
||||
in your language, you can use the word for "Overview". */
|
||||
this._label = new St.Label({ text: _("Activities"),
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
- this.add_actor(this._label);
|
||||
+ box.add_child(this._label);
|
||||
|
||||
this.label_actor = this._label;
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,56 @@
|
||||
From b1be295de28f45762a525d3ad3f91729295a7511 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@redhat.com>
|
||||
Date: Fri, 18 Oct 2024 13:20:23 +0200
|
||||
Subject: [PATCH] shell/window-tracker: Help mutter finding app info's for
|
||||
windows
|
||||
|
||||
---
|
||||
src/shell-window-tracker.c | 25 +++++++++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c
|
||||
index bc14040d9b..8fbcca4269 100644
|
||||
--- a/src/shell-window-tracker.c
|
||||
+++ b/src/shell-window-tracker.c
|
||||
@@ -651,6 +651,20 @@ shell_window_tracker_on_n_workspaces_changed (MetaWorkspaceManager *workspace_ma
|
||||
}
|
||||
}
|
||||
|
||||
+static GAppInfo *
|
||||
+on_find_app_info (MetaDisplay *display,
|
||||
+ MetaWindow *window,
|
||||
+ ShellWindowTracker *tracker)
|
||||
+{
|
||||
+ g_autoptr (ShellApp) app = NULL;
|
||||
+
|
||||
+ app = get_app_for_window (tracker, window);
|
||||
+ if (!app)
|
||||
+ return NULL;
|
||||
+
|
||||
+ return g_object_ref (G_APP_INFO (shell_app_get_app_info (app)));
|
||||
+}
|
||||
+
|
||||
static void
|
||||
init_window_tracking (ShellWindowTracker *self)
|
||||
{
|
||||
@@ -665,6 +679,17 @@ init_window_tracking (ShellWindowTracker *self)
|
||||
g_signal_connect(display, "window-created",
|
||||
G_CALLBACK (on_window_created), self);
|
||||
|
||||
+ if (g_signal_lookup ("find-app-info", META_TYPE_DISPLAY))
|
||||
+ {
|
||||
+ g_debug ("Mutter app finding with the help of gnome-shell");
|
||||
+ g_signal_connect (display, "find-app-info",
|
||||
+ G_CALLBACK (on_find_app_info), self);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ g_debug ("No mutter app finding with the help of gnome-shell");
|
||||
+ }
|
||||
+
|
||||
shell_window_tracker_on_n_workspaces_changed (workspace_manager, NULL, self);
|
||||
}
|
||||
|
||||
--
|
||||
2.44.0.501.g19981daefd.dirty
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 187b851530f5e76786784ec9df235304c8ddede8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 4 Aug 2021 19:46:34 +0200
|
||||
Subject: [PATCH] st/icon: Only get resource-scale after peeking theme node
|
||||
|
||||
If an actor is not on any stage view, then it doesn't have a valid
|
||||
resource scale, which will hit an assert later.
|
||||
|
||||
When that is the case (for example when running headless), we expect
|
||||
that there is no valid theme node (yet) either, so simply moving
|
||||
the clutter_actor_get_resource_scale() call after peeking at the
|
||||
theme node is enough to avoid the crash.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4522
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1935>
|
||||
---
|
||||
src/st/st-icon.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/st/st-icon.c b/src/st/st-icon.c
|
||||
index 0405d85259..e4d6e05f94 100644
|
||||
--- a/src/st/st-icon.c
|
||||
+++ b/src/st/st-icon.c
|
||||
@@ -462,6 +462,8 @@ st_icon_update (StIcon *icon)
|
||||
|
||||
resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (icon));
|
||||
|
||||
+ resource_scale = clutter_actor_get_resource_scale (CLUTTER_ACTOR (icon));
|
||||
+
|
||||
stage = clutter_actor_get_stage (CLUTTER_ACTOR (icon));
|
||||
context = st_theme_context_get_for_stage (CLUTTER_STAGE (stage));
|
||||
g_object_get (context, "scale-factor", &paint_scale, NULL);
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,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
|
||||
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,38 @@
|
||||
From 79049292451b9bb23ad92c572a438585ca37246b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 27 Oct 2021 15:18:20 +0200
|
||||
Subject: [PATCH] welcomeDialog: Adapt dialog title
|
||||
|
||||
Use RHEL branding instead of the upstream GNOME XX one.
|
||||
---
|
||||
js/ui/welcomeDialog.js | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/js/ui/welcomeDialog.js b/js/ui/welcomeDialog.js
|
||||
index 9d99f0035..783fd1108 100644
|
||||
--- a/js/ui/welcomeDialog.js
|
||||
+++ b/js/ui/welcomeDialog.js
|
||||
@@ -1,9 +1,8 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported WelcomeDialog */
|
||||
|
||||
-const { Clutter, GObject, Shell, St } = imports.gi;
|
||||
+const { Clutter, GLib, GObject, Shell, St } = imports.gi;
|
||||
|
||||
-const Config = imports.misc.config;
|
||||
const Dialog = imports.ui.dialog;
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
@@ -32,8 +31,7 @@ class WelcomeDialog extends ModalDialog.ModalDialog {
|
||||
}
|
||||
|
||||
_buildLayout() {
|
||||
- const [majorVersion] = Config.PACKAGE_VERSION.split('.');
|
||||
- const title = _('Welcome to GNOME %s').format(majorVersion);
|
||||
+ const title = _('Welcome to %s').format(GLib.get_os_info('NAME'));
|
||||
const description = _('If you want to learn your way around, check out the tour.');
|
||||
const content = new Dialog.MessageDialogContent({ title, description });
|
||||
|
||||
--
|
||||
2.33.1
|
||||
|
@ -0,0 +1,64 @@
|
||||
From a1d650ce2722fd154b047ce73fa23db205d823d2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Mon, 12 Dec 2022 13:04:11 +0100
|
||||
Subject: [PATCH] window-tracker: Emit 'tracked-windows-changed' on title
|
||||
changes
|
||||
|
||||
This means the screen share window view gets updated also when the title
|
||||
of a window changes. This is important since it often changes shortly
|
||||
after mapping, which would otherwise go unnoticed by
|
||||
xdg-desktop-portal-gnome.
|
||||
|
||||
An example is launching Files and it showing up as 'Loading..', or
|
||||
launching a terminal, and it not showing the proper title (current
|
||||
directory), but some place holder that is never visible on the
|
||||
application window.
|
||||
|
||||
Adding it to the window tracker instead of in introspect.js itself is
|
||||
for convenience - there is no per window signal tracking there, and it
|
||||
already listens to the signal emissions about changed windows.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2578>
|
||||
---
|
||||
src/shell-window-tracker.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c
|
||||
index 991613ea3f..df357f81b7 100644
|
||||
--- a/src/shell-window-tracker.c
|
||||
+++ b/src/shell-window-tracker.c
|
||||
@@ -524,6 +524,15 @@ on_wm_class_changed (MetaWindow *window,
|
||||
tracked_window_changed (self, window);
|
||||
}
|
||||
|
||||
+static void
|
||||
+on_title_changed (MetaWindow *window,
|
||||
+ GParamSpec *pspec,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data);
|
||||
+ tracked_window_changed (self, window);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
on_gtk_application_id_changed (MetaWindow *window,
|
||||
GParamSpec *pspec,
|
||||
@@ -554,6 +563,7 @@ track_window (ShellWindowTracker *self,
|
||||
g_hash_table_insert (self->window_to_app, window, app);
|
||||
|
||||
g_signal_connect (window, "notify::wm-class", G_CALLBACK (on_wm_class_changed), self);
|
||||
+ g_signal_connect (window, "notify::title", G_CALLBACK (on_title_changed), self);
|
||||
g_signal_connect (window, "notify::gtk-application-id", G_CALLBACK (on_gtk_application_id_changed), self);
|
||||
g_signal_connect (window, "unmanaged", G_CALLBACK (on_window_unmanaged), self);
|
||||
|
||||
@@ -586,6 +596,7 @@ disassociate_window (ShellWindowTracker *self,
|
||||
|
||||
_shell_app_remove_window (app, window);
|
||||
g_signal_handlers_disconnect_by_func (window, G_CALLBACK (on_wm_class_changed), self);
|
||||
+ g_signal_handlers_disconnect_by_func (window, G_CALLBACK (on_title_changed), self);
|
||||
g_signal_handlers_disconnect_by_func (window, G_CALLBACK (on_gtk_application_id_changed), self);
|
||||
g_signal_handlers_disconnect_by_func (window, G_CALLBACK (on_window_unmanaged), self);
|
||||
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,44 @@
|
||||
From e3823964957ba4dcc86b21db09b280b9299bc8cc Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Fri, 10 Feb 2023 15:07:50 +0100
|
||||
Subject: [PATCH] window-tracker: Only emit ::tracked-windows-changed on title
|
||||
changes
|
||||
|
||||
Since commit a1d650ce27, window title changes are listened for in the
|
||||
ShellWindowTracker in order to emit ::tracked-windows-changed when
|
||||
there are window title changes.
|
||||
|
||||
The rest of the things that happen in between (removing the window
|
||||
from a ShellApp, possibly have it destroyed, and possibly creating a
|
||||
new ShellApp to re-insert the window) are superfluous and even result
|
||||
in the altTab switcher popup ending up confused about the applications
|
||||
available.
|
||||
|
||||
Only emit the signal so changes can be followed on D-Bus, but avoid
|
||||
the ShellApp fiddling otherwise.
|
||||
|
||||
Fixes: a1d650ce27 - window-tracker: Emit 'tracked-windows-changed' on title changes
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6385
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2634>
|
||||
(cherry picked from commit 41c91c7a3b7f186720a0a518ef2211cb744421f3)
|
||||
---
|
||||
src/shell-window-tracker.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c
|
||||
index bc14040d9b..01143dfd7f 100644
|
||||
--- a/src/shell-window-tracker.c
|
||||
+++ b/src/shell-window-tracker.c
|
||||
@@ -524,7 +524,7 @@ on_title_changed (MetaWindow *window,
|
||||
gpointer user_data)
|
||||
{
|
||||
ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data);
|
||||
- tracked_window_changed (self, window);
|
||||
+ g_signal_emit (self, signals[TRACKED_WINDOWS_CHANGED], 0);
|
||||
}
|
||||
|
||||
static void
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From b3cac57511575e1265ab0ebd9c7465a6ade913e8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 28 Sep 2023 14:34:24 +0200
|
||||
Subject: [PATCH] windowMenu: Ignore release
|
||||
|
||||
If the menu was open on button-press, make sure it is kept open
|
||||
until explicitly dismissed, regardless of the pointer position.
|
||||
---
|
||||
js/ui/windowMenu.js | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js
|
||||
index 3449f759da..ad5c2a74cc 100644
|
||||
--- a/js/ui/windowMenu.js
|
||||
+++ b/js/ui/windowMenu.js
|
||||
@@ -229,6 +229,7 @@ var WindowMenuManager = class {
|
||||
let menu = new WindowMenu(window, this._sourceActor);
|
||||
|
||||
this._manager.addMenu(menu);
|
||||
+ this._manager.ignoreRelease();
|
||||
|
||||
menu.connect('activate', () => {
|
||||
window.check_alive(global.get_current_time());
|
||||
--
|
||||
2.41.0
|
||||
|
@ -0,0 +1,46 @@
|
||||
From 1cad6c8d47fb9f0b17a2c47f93e5f923d1cb32c3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 7 Mar 2024 18:22:32 +0100
|
||||
Subject: [PATCH] windowPreview: Override with window icon if available
|
||||
|
||||
---
|
||||
js/ui/windowPreview.js | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/js/ui/windowPreview.js b/js/ui/windowPreview.js
|
||||
index e67ec9ec0f..db325258b4 100644
|
||||
--- a/js/ui/windowPreview.js
|
||||
+++ b/js/ui/windowPreview.js
|
||||
@@ -123,6 +123,12 @@ var WindowPreview = GObject.registerClass({
|
||||
const tracker = Shell.WindowTracker.get_default();
|
||||
const app = tracker.get_window_app(this.metaWindow);
|
||||
this._icon = app.create_icon_texture(ICON_SIZE);
|
||||
+ // Override with window icon if available
|
||||
+ if (this._hasWindowIcon()) {
|
||||
+ const textureCache = St.TextureCache.get_default();
|
||||
+ this._icon.gicon = textureCache.bind_cairo_surface_property(
|
||||
+ this.metaWindow, 'icon');
|
||||
+ }
|
||||
this._icon.add_style_class_name('icon-dropshadow');
|
||||
this._icon.set({
|
||||
reactive: true,
|
||||
@@ -226,6 +232,16 @@ var WindowPreview = GObject.registerClass({
|
||||
});
|
||||
}
|
||||
|
||||
+ _hasWindowIcon() {
|
||||
+ // HACK: GI cannot handle CairoSurface, so this
|
||||
+ // will throw if the icon property is non-null
|
||||
+ try {
|
||||
+ return this.metaWindow.icon !== null;
|
||||
+ } catch (e) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
_updateIconScale() {
|
||||
const { ControlsState } = OverviewControls;
|
||||
const { currentState, initialState, finalState } =
|
||||
--
|
||||
2.44.0
|
||||
|
@ -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,107 @@
|
||||
From 3a89e8597f6f3e7fa468bae93768f8253a3141e7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 6 Oct 2022 14:30:20 +0200
|
||||
Subject: [PATCH 1/2] inhibitShortcutsDialog: Don't override resource
|
||||
|
||||
PermissionStore's Set() method takes a complete permission
|
||||
table, so when setting an app's permission, we are implicitly
|
||||
removing all previously set entries for other apps.
|
||||
|
||||
Switch to the SetPermission() method which sets the permission
|
||||
for a single app.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5937
|
||||
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2504>
|
||||
---
|
||||
...g.freedesktop.impl.portal.PermissionStore.xml | 7 +++++++
|
||||
js/ui/inhibitShortcutsDialog.js | 16 ++++++----------
|
||||
2 files changed, 13 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml b/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml
|
||||
index 75fbc468a8..55d3fc30cb 100644
|
||||
--- a/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml
|
||||
+++ b/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml
|
||||
@@ -13,6 +13,13 @@
|
||||
<arg name="app_permissions" type="a{sas}" direction="in"/>
|
||||
<arg name="data" type="v" direction="in"/>
|
||||
</method>
|
||||
+ <method name="SetPermission">
|
||||
+ <arg name='table' type='s' direction='in'/>
|
||||
+ <arg name='create' type='b' direction='in'/>
|
||||
+ <arg name='id' type='s' direction='in'/>
|
||||
+ <arg name='app' type='s' direction='in'/>
|
||||
+ <arg name='permissions' type='as' direction='in'/>
|
||||
+ </method>
|
||||
<signal name="Changed">
|
||||
<arg name="table" type="s" direction="out"/>
|
||||
<arg name="id" type="s" direction="out"/>
|
||||
diff --git a/js/ui/inhibitShortcutsDialog.js b/js/ui/inhibitShortcutsDialog.js
|
||||
index c59544eaf9..8ef5861261 100644
|
||||
--- a/js/ui/inhibitShortcutsDialog.js
|
||||
+++ b/js/ui/inhibitShortcutsDialog.js
|
||||
@@ -1,5 +1,5 @@
|
||||
/* exported InhibitShortcutsDialog */
|
||||
-const { Clutter, Gio, GLib, GObject, Gtk, Meta, Pango, Shell, St } = imports.gi;
|
||||
+const {Clutter, Gio, GObject, Gtk, Meta, Pango, Shell, St} = imports.gi;
|
||||
|
||||
const Dialog = imports.ui.dialog;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
@@ -57,15 +57,11 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
||||
if (!this._shouldUsePermStore() || this._permStore == null)
|
||||
return;
|
||||
|
||||
- let permissions = {};
|
||||
- permissions[this._app.get_id()] = [grant];
|
||||
- let data = GLib.Variant.new('av', {});
|
||||
-
|
||||
- this._permStore.SetRemote(APP_PERMISSIONS_TABLE,
|
||||
- true,
|
||||
- APP_PERMISSIONS_ID,
|
||||
- permissions,
|
||||
- data,
|
||||
+ this._permStore.SetPermissionRemote(APP_PERMISSIONS_TABLE,
|
||||
+ true,
|
||||
+ APP_PERMISSIONS_ID,
|
||||
+ this._app.get_id(),
|
||||
+ [grant],
|
||||
(result, error) => {
|
||||
if (error != null)
|
||||
log(error.message);
|
||||
--
|
||||
2.43.0
|
||||
|
||||
|
||||
From 1391efb2356d1b1eac631df2f5fbd61a7a72bf52 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Fri, 18 Nov 2022 22:40:31 +0100
|
||||
Subject: [PATCH 2/2] inhibitShorcutsDialog: Fix permission check
|
||||
|
||||
Each permission entry is an array of strings, so checking that against
|
||||
the expected string itself will always fail.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6107
|
||||
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2548>
|
||||
---
|
||||
js/ui/inhibitShortcutsDialog.js | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/inhibitShortcutsDialog.js b/js/ui/inhibitShortcutsDialog.js
|
||||
index 8ef5861261..4cd2793c3d 100644
|
||||
--- a/js/ui/inhibitShortcutsDialog.js
|
||||
+++ b/js/ui/inhibitShortcutsDialog.js
|
||||
@@ -145,7 +145,7 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
||||
let [permissions] = res;
|
||||
if (permissions[appId] === undefined) // Not found
|
||||
this._dialog.open();
|
||||
- else if (permissions[appId] == GRANTED)
|
||||
+ else if (permissions[appId][0] === GRANTED)
|
||||
this._emitResponse(DialogResponse.ALLOW);
|
||||
else
|
||||
this._emitResponse(DialogResponse.DENY);
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,334 @@
|
||||
From 49a950b9e0dc262fd20c28e21ee4815ea8efe758 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Keller <skeller@gnome.org>
|
||||
Date: Tue, 16 Nov 2021 18:57:26 +0100
|
||||
Subject: [PATCH 1/3] search: Split out the description highlighter into its
|
||||
own class
|
||||
|
||||
No functional change yet, only preparation to allow adding a unit test
|
||||
later on.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2033>
|
||||
---
|
||||
js/misc/util.js | 38 +++++++++++++++++++++++++++++++++++++-
|
||||
js/ui/search.js | 12 +++++-------
|
||||
2 files changed, 42 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/js/misc/util.js b/js/misc/util.js
|
||||
index 8139d3f47..d1a702960 100644
|
||||
--- a/js/misc/util.js
|
||||
+++ b/js/misc/util.js
|
||||
@@ -1,7 +1,8 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnCommandLine,
|
||||
formatTime, formatTimeSpan, createTimeLabel, insertSorted,
|
||||
- ensureActorVisibleInScrollView, wiggle, lerp, GNOMEversionCompare */
|
||||
+ ensureActorVisibleInScrollView, wiggle, lerp, GNOMEversionCompare,
|
||||
+ Highlighter */
|
||||
|
||||
const { Clutter, Gio, GLib, Shell, St, GnomeDesktop } = imports.gi;
|
||||
const Gettext = imports.gettext;
|
||||
@@ -477,3 +478,38 @@ function GNOMEversionCompare(version1, version2) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+/* @class Highlighter Highlight given terms in text using markup. */
|
||||
+var Highlighter = class {
|
||||
+ /**
|
||||
+ * @param {?string[]} terms - list of terms to highlight
|
||||
+ */
|
||||
+ constructor(terms) {
|
||||
+ if (!terms)
|
||||
+ return;
|
||||
+
|
||||
+ const escapedTerms = terms
|
||||
+ .map(term => Shell.util_regex_escape(term))
|
||||
+ .filter(term => term.length > 0);
|
||||
+
|
||||
+ if (escapedTerms.length === 0)
|
||||
+ return;
|
||||
+
|
||||
+ this._highlightRegex = new RegExp('(%s)'.format(
|
||||
+ escapedTerms.join('|')), 'gi');
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Highlight all occurences of the terms defined for this
|
||||
+ * highlighter in the provided text using markup.
|
||||
+ *
|
||||
+ * @param {string} text - text to highlight the defined terms in
|
||||
+ * @returns {string}
|
||||
+ */
|
||||
+ highlight(text) {
|
||||
+ if (!this._highlightRegex)
|
||||
+ return text;
|
||||
+
|
||||
+ return text.replace(this._highlightRegex, '<b>$1</b>');
|
||||
+ }
|
||||
+};
|
||||
diff --git a/js/ui/search.js b/js/ui/search.js
|
||||
index 7300b053e..b1e76c46d 100644
|
||||
--- a/js/ui/search.js
|
||||
+++ b/js/ui/search.js
|
||||
@@ -10,6 +10,8 @@ const ParentalControlsManager = imports.misc.parentalControlsManager;
|
||||
const RemoteSearch = imports.ui.remoteSearch;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
+const { Highlighter } = imports.misc.util;
|
||||
+
|
||||
const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
|
||||
|
||||
var MAX_LIST_SEARCH_RESULTS_ROWS = 5;
|
||||
@@ -596,7 +598,7 @@ var SearchResultsView = GObject.registerClass({
|
||||
|
||||
this._providers = [];
|
||||
|
||||
- this._highlightRegex = null;
|
||||
+ this._highlighter = new Highlighter();
|
||||
|
||||
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
|
||||
this._searchSettings.connect('changed::disabled', this._reloadRemoteProviders.bind(this));
|
||||
@@ -739,8 +741,7 @@ var SearchResultsView = GObject.registerClass({
|
||||
if (this._searchTimeoutId == 0)
|
||||
this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, this._onSearchTimeout.bind(this));
|
||||
|
||||
- let escapedTerms = this._terms.map(term => Shell.util_regex_escape(term));
|
||||
- this._highlightRegex = new RegExp('(%s)'.format(escapedTerms.join('|')), 'gi');
|
||||
+ this._highlighter = new Highlighter(this._terms);
|
||||
|
||||
this.emit('terms-changed');
|
||||
}
|
||||
@@ -894,10 +895,7 @@ var SearchResultsView = GObject.registerClass({
|
||||
if (!description)
|
||||
return '';
|
||||
|
||||
- if (!this._highlightRegex)
|
||||
- return description;
|
||||
-
|
||||
- return description.replace(this._highlightRegex, '<b>$1</b>');
|
||||
+ return this._highlighter.highlight(description);
|
||||
}
|
||||
});
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
|
||||
From 7c1abe1bd91ecf274d81e122035cbeeef6fd58d4 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Keller <skeller@gnome.org>
|
||||
Date: Wed, 17 Nov 2021 02:50:39 +0100
|
||||
Subject: [PATCH 2/3] util: Properly handle markup in highlighter
|
||||
|
||||
The code to highlight matches did not properly escape the passed in text
|
||||
as for markup before adding its highlighting markup. This lead to some
|
||||
search result descriptions not showing up, because their descriptions
|
||||
contained characters, such as "<", that would have to be escaped when
|
||||
used in markup or otherwise lead to invalid markup.
|
||||
|
||||
To work around this some search providers wrongly started escaping the
|
||||
description on their end before sending them to gnome-shell. This lead
|
||||
to another issue. Now if the highlighter was trying to highlight the
|
||||
term "a", and the escaped description contained "'", the "a" in
|
||||
that would be considered a match and surrounded by "<b></b>". This
|
||||
however would also generate invalid markup, again leading to an error
|
||||
and the description not being shown.
|
||||
|
||||
Fix this by always escaping the passed in string before applying the
|
||||
highlights in such a way that there are no matches within entities.
|
||||
|
||||
This also means that search providers that escaped their description
|
||||
strings will now show up with the markup syntax. This will have to be
|
||||
fixed separately in the affected search providers.
|
||||
|
||||
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4791
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2033>
|
||||
---
|
||||
js/misc/util.js | 21 +++++++++++++++++++--
|
||||
1 file changed, 19 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/js/misc/util.js b/js/misc/util.js
|
||||
index d1a702960..802398d18 100644
|
||||
--- a/js/misc/util.js
|
||||
+++ b/js/misc/util.js
|
||||
@@ -508,8 +508,25 @@ var Highlighter = class {
|
||||
*/
|
||||
highlight(text) {
|
||||
if (!this._highlightRegex)
|
||||
- return text;
|
||||
+ return GLib.markup_escape_text(text, -1);
|
||||
+
|
||||
+ let escaped = [];
|
||||
+ let lastMatchEnd = 0;
|
||||
+ let match;
|
||||
+ while ((match = this._highlightRegex.exec(text))) {
|
||||
+ if (match.index > lastMatchEnd) {
|
||||
+ let unmatched = GLib.markup_escape_text(
|
||||
+ text.slice(lastMatchEnd, match.index), -1);
|
||||
+ escaped.push(unmatched);
|
||||
+ }
|
||||
+ let matched = GLib.markup_escape_text(match[0], -1);
|
||||
+ escaped.push('<b>%s</b>'.format(matched));
|
||||
+ lastMatchEnd = match.index + match[0].length;
|
||||
+ }
|
||||
+ let unmatched = GLib.markup_escape_text(
|
||||
+ text.slice(lastMatchEnd), -1);
|
||||
+ escaped.push(unmatched);
|
||||
|
||||
- return text.replace(this._highlightRegex, '<b>$1</b>');
|
||||
+ return escaped.join('');
|
||||
}
|
||||
};
|
||||
--
|
||||
2.35.1
|
||||
|
||||
|
||||
From 82e2a6dcfabc2f82efbf468175d16c303f0c73da Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Keller <skeller@gnome.org>
|
||||
Date: Wed, 17 Nov 2021 03:05:05 +0100
|
||||
Subject: [PATCH 3/3] tests: Add unit test for highlighter
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2033>
|
||||
---
|
||||
tests/meson.build | 12 ++++-
|
||||
tests/unit/highlighter.js | 106 ++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 117 insertions(+), 1 deletion(-)
|
||||
create mode 100644 tests/unit/highlighter.js
|
||||
|
||||
diff --git a/tests/meson.build b/tests/meson.build
|
||||
index c0431631f..50fb601e9 100644
|
||||
--- a/tests/meson.build
|
||||
+++ b/tests/meson.build
|
||||
@@ -10,7 +10,17 @@ run_test = configure_file(
|
||||
testenv = environment()
|
||||
testenv.set('GSETTINGS_SCHEMA_DIR', join_paths(meson.build_root(), 'data'))
|
||||
|
||||
-foreach test : ['insertSorted', 'jsParse', 'markup', 'params', 'url', 'versionCompare']
|
||||
+tests = [
|
||||
+ 'highlighter',
|
||||
+ 'insertSorted',
|
||||
+ 'jsParse',
|
||||
+ 'markup',
|
||||
+ 'params',
|
||||
+ 'url',
|
||||
+ 'versionCompare',
|
||||
+]
|
||||
+
|
||||
+foreach test : tests
|
||||
test(test, run_test,
|
||||
args: 'unit/@0@.js'.format(test),
|
||||
env: testenv,
|
||||
diff --git a/tests/unit/highlighter.js b/tests/unit/highlighter.js
|
||||
new file mode 100644
|
||||
index 000000000..d582d38e3
|
||||
--- /dev/null
|
||||
+++ b/tests/unit/highlighter.js
|
||||
@@ -0,0 +1,106 @@
|
||||
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
+
|
||||
+// Test cases for SearchResult description match highlighter
|
||||
+
|
||||
+const JsUnit = imports.jsUnit;
|
||||
+const Pango = imports.gi.Pango;
|
||||
+
|
||||
+const Environment = imports.ui.environment;
|
||||
+Environment.init();
|
||||
+
|
||||
+const Util = imports.misc.util;
|
||||
+
|
||||
+const tests = [
|
||||
+ { input: 'abc cba',
|
||||
+ terms: null,
|
||||
+ output: 'abc cba' },
|
||||
+ { input: 'abc cba',
|
||||
+ terms: [],
|
||||
+ output: 'abc cba' },
|
||||
+ { input: 'abc cba',
|
||||
+ terms: [''],
|
||||
+ output: 'abc cba' },
|
||||
+ { input: 'abc cba',
|
||||
+ terms: ['a'],
|
||||
+ output: '<b>a</b>bc cb<b>a</b>' },
|
||||
+ { input: 'abc cba',
|
||||
+ terms: ['a', 'a'],
|
||||
+ output: '<b>a</b>bc cb<b>a</b>' },
|
||||
+ { input: 'CaSe InSenSiTiVe',
|
||||
+ terms: ['cas', 'sens'],
|
||||
+ output: '<b>CaS</b>e In<b>SenS</b>iTiVe' },
|
||||
+ { input: 'This contains the < character',
|
||||
+ terms: null,
|
||||
+ output: 'This contains the < character' },
|
||||
+ { input: 'Don\'t',
|
||||
+ terms: ['t'],
|
||||
+ output: 'Don'<b>t</b>' },
|
||||
+ { input: 'Don\'t',
|
||||
+ terms: ['n\'t'],
|
||||
+ output: 'Do<b>n't</b>' },
|
||||
+ { input: 'Don\'t',
|
||||
+ terms: ['o', 't'],
|
||||
+ output: 'D<b>o</b>n'<b>t</b>' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['salt'],
|
||||
+ output: '<b>salt</b>&pepper' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['salt', 'alt'],
|
||||
+ output: '<b>salt</b>&pepper' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['pepper'],
|
||||
+ output: 'salt&<b>pepper</b>' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['salt', 'pepper'],
|
||||
+ output: '<b>salt</b>&<b>pepper</b>' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['t', 'p'],
|
||||
+ output: 'sal<b>t</b>&<b>p</b>e<b>p</b><b>p</b>er' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['t', '&', 'p'],
|
||||
+ output: 'sal<b>t</b><b>&</b><b>p</b>e<b>p</b><b>p</b>er' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['e'],
|
||||
+ output: 'salt&p<b>e</b>pp<b>e</b>r' },
|
||||
+ { input: 'salt&pepper',
|
||||
+ terms: ['&a', '&am', '&', '&'],
|
||||
+ output: 'salt&pepper' },
|
||||
+ { input: '&&&&&',
|
||||
+ terms: ['a'],
|
||||
+ output: '&&&&&' },
|
||||
+ { input: '&;&;&;&;&;',
|
||||
+ terms: ['a'],
|
||||
+ output: '&;&;&;&;&;' },
|
||||
+ { input: '&;&;&;&;&;',
|
||||
+ terms: [';'],
|
||||
+ output: '&<b>;</b>&<b>;</b>&<b>;</b>&<b>;</b>&<b>;</b>' },
|
||||
+ { input: '&',
|
||||
+ terms: ['a'],
|
||||
+ output: '&<b>a</b>mp;' }
|
||||
+];
|
||||
+
|
||||
+try {
|
||||
+ for (let i = 0; i < tests.length; i++) {
|
||||
+ let highlighter = new Util.Highlighter(tests[i].terms);
|
||||
+ let output = highlighter.highlight(tests[i].input);
|
||||
+
|
||||
+ JsUnit.assertEquals(`Test ${i + 1} highlight ` +
|
||||
+ `"${tests[i].terms}" in "${tests[i].input}"`,
|
||||
+ output, tests[i].output);
|
||||
+
|
||||
+ let parsed = false;
|
||||
+ try {
|
||||
+ Pango.parse_markup(output, -1, '');
|
||||
+ parsed = true;
|
||||
+ } catch (e) {}
|
||||
+ JsUnit.assertEquals(`Test ${i + 1} is valid markup`, true, parsed);
|
||||
+ }
|
||||
+} catch (e) {
|
||||
+ if (typeof(e.isJsUnitException) != 'undefined'
|
||||
+ && e.isJsUnitException)
|
||||
+ {
|
||||
+ if (e.comment)
|
||||
+ log(`Error in: ${e.comment}`);
|
||||
+ }
|
||||
+ throw e;
|
||||
+}
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,92 @@
|
||||
From ce8ac36613ef4fbb697fc9f6613844168c05a8d3 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Fri, 8 Oct 2021 11:08:17 -0400
|
||||
Subject: [PATCH 1/2] unlockDialog: Don't create AuthDialog just to finish it
|
||||
|
||||
If the the unlock dialog gets finished before an auth dialog is
|
||||
created, the code currently creates one just to tell it to finish.
|
||||
|
||||
This commit changes the code to skip creating the auth dialog in
|
||||
that case.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1999>
|
||||
---
|
||||
js/ui/unlockDialog.js | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
|
||||
index c81c6184a9..d8c45f7510 100644
|
||||
--- a/js/ui/unlockDialog.js
|
||||
+++ b/js/ui/unlockDialog.js
|
||||
@@ -884,7 +884,11 @@ var UnlockDialog = GObject.registerClass({
|
||||
}
|
||||
|
||||
finish(onComplete) {
|
||||
- this._ensureAuthPrompt();
|
||||
+ if (!this._authPrompt) {
|
||||
+ onComplete();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
this._authPrompt.finish(onComplete);
|
||||
}
|
||||
|
||||
--
|
||||
2.39.1
|
||||
|
||||
|
||||
From 2a513d44e7b887b355d6b71cf88c4114a8b685f8 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 5 Oct 2021 11:01:19 -0400
|
||||
Subject: [PATCH 2/2] unlockDialog: Properly reset auth prompt when showing it
|
||||
|
||||
If a user hits escape twice really fast when coming back to
|
||||
their machine to unlock it, they made end up getting presented
|
||||
with a non-functional unlock screen that doesn't show their
|
||||
user icon and doesn't ask for a password.
|
||||
|
||||
This is because showPrompt assumes that if an auth prompt already
|
||||
exists, it's ready to go. That may not be true, if it's in the
|
||||
process of getting torn down at the time because it's in the middle
|
||||
of a cancel animation.
|
||||
|
||||
This commit solves the problem by ensuring the auth prompt is always
|
||||
in a fresh reset state before showing it.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1999>
|
||||
---
|
||||
js/ui/unlockDialog.js | 18 ++++++++----------
|
||||
1 file changed, 8 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
|
||||
index d8c45f7510..00e3eef971 100644
|
||||
--- a/js/ui/unlockDialog.js
|
||||
+++ b/js/ui/unlockDialog.js
|
||||
@@ -689,16 +689,14 @@ var UnlockDialog = GObject.registerClass({
|
||||
}
|
||||
|
||||
_ensureAuthPrompt() {
|
||||
- if (this._authPrompt)
|
||||
- return;
|
||||
-
|
||||
- this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient,
|
||||
- AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
|
||||
- this._authPrompt.connect('failed', this._fail.bind(this));
|
||||
- this._authPrompt.connect('cancelled', this._fail.bind(this));
|
||||
- this._authPrompt.connect('reset', this._onReset.bind(this));
|
||||
-
|
||||
- this._promptBox.add_child(this._authPrompt);
|
||||
+ if (!this._authPrompt) {
|
||||
+ this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient,
|
||||
+ AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
|
||||
+ this._authPrompt.connect('failed', this._fail.bind(this));
|
||||
+ this._authPrompt.connect('cancelled', this._fail.bind(this));
|
||||
+ this._authPrompt.connect('reset', this._onReset.bind(this));
|
||||
+ this._promptBox.add_child(this._authPrompt);
|
||||
+ }
|
||||
|
||||
this._authPrompt.reset();
|
||||
this._authPrompt.updateSensitivity(true);
|
||||
--
|
||||
2.39.1
|
||||
|
@ -0,0 +1,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
|
||||
|
@ -1,25 +1,25 @@
|
||||
From d4d39560f1694f06c3594f8d34eaa4b038804920 Mon Sep 17 00:00:00 2001
|
||||
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] appFavorites: Add terminal
|
||||
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 bd2bd5ead8..4827fa5b79 100644
|
||||
index 35ddaf4a9..d5ea1e35f 100644
|
||||
--- a/data/org.gnome.shell.gschema.xml.in
|
||||
+++ b/data/org.gnome.shell.gschema.xml.in
|
||||
@@ -61,7 +61,7 @@
|
||||
@@ -50,7 +50,7 @@
|
||||
</description>
|
||||
</key>
|
||||
<key name="favorite-apps" type="as">
|
||||
- <default>[ 'org.mozilla.firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'org.gnome.TextEditor.desktop']</default>
|
||||
+ <default>[ 'org.mozilla.firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'org.gnome.Ptyxis.desktop', 'org.gnome.TextEditor.desktop']</default>
|
||||
- <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.45.2
|
||||
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
|
||||
|
@ -0,0 +1,107 @@
|
||||
From ad431c28788ac1a4ec815cc4985cdb09a1a82226 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Mon, 11 Sep 2023 19:20:14 +0200
|
||||
Subject: [PATCH 1/2] status/network: Fix fallback SSID label
|
||||
|
||||
We currently only return the fallback label if the string returned
|
||||
from the ssid was invalid or couldn't be transformed to UTF-8.
|
||||
|
||||
If the ssid parameter itself is empty, we throw an error.
|
||||
|
||||
Handle this case as well, as callers otherwise would need to duplicate
|
||||
the existing error path themselves.
|
||||
---
|
||||
js/ui/status/network.js | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
|
||||
index 1f17ca8f97..99a8d51f82 100644
|
||||
--- a/js/ui/status/network.js
|
||||
+++ b/js/ui/status/network.js
|
||||
@@ -67,7 +67,9 @@ function signalToIcon(value) {
|
||||
}
|
||||
|
||||
function ssidToLabel(ssid) {
|
||||
- let label = NM.utils_ssid_to_utf8(ssid.get_data());
|
||||
+ let label;
|
||||
+ if (ssid)
|
||||
+ label = NM.utils_ssid_to_utf8(ssid.get_data());
|
||||
if (!label)
|
||||
label = _("<unknown>");
|
||||
return label;
|
||||
--
|
||||
2.41.0
|
||||
|
||||
|
||||
From 0409f18446cb55a45187e00feadb12e4389381dd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 30 Aug 2023 01:47:00 +0200
|
||||
Subject: [PATCH 2/2] status/network: Use connection name with hidden AP
|
||||
|
||||
When connected to an OWE transition network, NetworkManager
|
||||
reports the connected API with a hidden SSID.
|
||||
|
||||
Handle this by using the active connection's name before
|
||||
ultimately falling back to the device name.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6918
|
||||
|
||||
Part-of:
|
||||
<https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2927>
|
||||
---
|
||||
js/ui/status/network.js | 28 +++++++++++++++++++---------
|
||||
1 file changed, 19 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
|
||||
index 99a8d51f82..b407d8e78d 100644
|
||||
--- a/js/ui/status/network.js
|
||||
+++ b/js/ui/status/network.js
|
||||
@@ -1395,26 +1395,36 @@ var NMDeviceWireless = class {
|
||||
_getStatus() {
|
||||
let ap = this._device.active_access_point;
|
||||
|
||||
- if (this._isHotSpotMaster())
|
||||
+ if (this._isHotSpotMaster()) {
|
||||
/* Translators: %s is a network identifier */
|
||||
return _("%s Hotspot Active").format(this._description);
|
||||
- else if (this._device.state >= NM.DeviceState.PREPARE &&
|
||||
- this._device.state < NM.DeviceState.ACTIVATED)
|
||||
+ } else if (this._device.state >= NM.DeviceState.PREPARE &&
|
||||
+ this._device.state < NM.DeviceState.ACTIVATED) {
|
||||
/* Translators: %s is a network identifier */
|
||||
return _("%s Connecting").format(this._description);
|
||||
- else if (ap)
|
||||
- return ssidToLabel(ap.get_ssid());
|
||||
- else if (!this._client.wireless_hardware_enabled)
|
||||
+ } else if (ap) {
|
||||
+ const ssid = ap.get_ssid();
|
||||
+ if (ssid)
|
||||
+ return ssidToLabel(ssid);
|
||||
+
|
||||
+ // Use connection name when connected to hidden AP
|
||||
+ const activeConnection = this._device.get_active_connection();
|
||||
+ if (activeConnection)
|
||||
+ return activeConnection.connection.get_id();
|
||||
+
|
||||
+ return ssidToLabel(null);
|
||||
+ } else if (!this._client.wireless_hardware_enabled) {
|
||||
/* Translators: %s is a network identifier */
|
||||
return _("%s Hardware Disabled").format(this._description);
|
||||
- else if (!this._client.wireless_enabled)
|
||||
+ } else if (!this._client.wireless_enabled) {
|
||||
/* Translators: %s is a network identifier */
|
||||
return _("%s Off").format(this._description);
|
||||
- else if (this._device.state == NM.DeviceState.DISCONNECTED)
|
||||
+ } else if (this._device.state == NM.DeviceState.DISCONNECTED) {
|
||||
/* Translators: %s is a network identifier */
|
||||
return _("%s Not Connected").format(this._description);
|
||||
- else
|
||||
+ } else {
|
||||
return '';
|
||||
+ }
|
||||
}
|
||||
|
||||
_getMenuIcon() {
|
||||
--
|
||||
2.41.0
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,34 @@
|
||||
From b8ae8f713a15b00ec447a23294948fc463220130 Mon Sep 17 00:00:00 2001
|
||||
From: Simon McVittie <smcv@debian.org>
|
||||
Date: Mon, 6 May 2024 21:58:09 +0100
|
||||
Subject: [PATCH] screencast: Correct expected bus name for streams
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Previously, this only worked because GDBusConnection was not filtering
|
||||
signals by their sender correctly (GNOME/glib#3268).
|
||||
|
||||
Thanks: Alicia Boya García
|
||||
Signed-off-by: Simon McVittie <smcv@debian.org>
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3303>
|
||||
---
|
||||
js/dbusServices/screencast/screencastService.js | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/js/dbusServices/screencast/screencastService.js b/js/dbusServices/screencast/screencastService.js
|
||||
index 708a15c84..0321b4d69 100644
|
||||
--- a/js/dbusServices/screencast/screencastService.js
|
||||
+++ b/js/dbusServices/screencast/screencastService.js
|
||||
@@ -161,7 +161,7 @@ var Recorder = class {
|
||||
});
|
||||
|
||||
this._streamProxy = new ScreenCastStreamProxy(Gio.DBus.session,
|
||||
- 'org.gnome.ScreenCast.Stream',
|
||||
+ 'org.gnome.Mutter.ScreenCast',
|
||||
streamPath);
|
||||
|
||||
this._streamProxy.connectSignal('PipeWireStreamAdded',
|
||||
--
|
||||
2.45.0
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue