summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-02 07:11:13 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-02 07:11:13 +0000
commit4671d4f870417e2e0f6b0b4fadfa31570c7752fb (patch)
treee230ed83ee4a856befa7d96addd3d34d78a958b1
parentede92676c7c3a698398455318cc45011057260d2 (diff)
automatic import of gnome-shellopeneuler24.03_LTSopeneuler23.09
-rw-r--r--.gitignore1
-rw-r--r--0001-Revert-dash-Subtract-vertical-margins-from-availHeig.patch25
-rw-r--r--0001-Update-generated-stylesheets.patch364
-rw-r--r--0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch28
-rw-r--r--0001-authPrompt-Disregard-smartcard-status-changes-events.patch100
-rw-r--r--0001-extensionDownloader-Refuse-to-override-system-extens.patch36
-rw-r--r--0001-extensionSystem-Support-locking-down-extension-insta.patch92
-rw-r--r--0001-introspect-Add-WindowsChanged-signal.patch51
-rw-r--r--0001-introspect-Allowlist-GNOME-portal.patch33
-rw-r--r--0001-kbdA11yDialog-Use-MetaKeyboardA11yFlags.patch51
-rw-r--r--0001-layout-Initialize-regions-unconditionally.patch48
-rw-r--r--0001-loginDialog-make-info-messages-themed.patch83
-rw-r--r--0001-magnifier-Request-window-relative-coordinates-for-fo.patch148
-rw-r--r--0001-main-Dump-stack-on-segfaults-by-default.patch38
-rw-r--r--0001-main-Leak-the-GJS-context-and-ShellGlobal.patch31
-rw-r--r--0001-osk-layouts-Replace-SS-extra-key-with.patch281
-rw-r--r--0001-panel-add-an-icon-to-the-ActivitiesButton.patch56
-rw-r--r--0001-po-Update-translations.patch8714
-rw-r--r--0001-screenShield-unblank-when-inserting-smartcard.patch33
-rw-r--r--0001-st-icon-Only-get-resource-scale-after-peeking-theme-.patch36
-rw-r--r--0001-st-texture-cache-purge-on-resume.patch66
-rw-r--r--0001-status-network-Use-wwan-settings-panel-for-GSM-LTE-M.patch58
-rw-r--r--0001-status-volume-Hide-sliders-initially.patch30
-rw-r--r--0001-welcomeDialog-Adapt-dialog-title.patch38
-rw-r--r--0001-window-tracker-Emit-tracked-windows-changed-on-title.patch64
-rw-r--r--0001-window-tracker-Only-emit-tracked-windows-changed-on-.patch44
-rw-r--r--0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch45
-rw-r--r--0001-windowMenu-Ignore-release.patch26
-rw-r--r--0001-windowPreview-Override-with-window-icon-if-available.patch46
-rw-r--r--add-power-profiles-menu.patch333
-rw-r--r--disable-unlock-entry-until-question.patch176
-rw-r--r--enforce-smartcard-at-unlock.patch114
-rw-r--r--fix-inhibit-shortcut-permission.patch107
-rw-r--r--fix-markup-in-highlighter.patch334
-rw-r--r--fix-resetting-auth-prompt.patch92
-rw-r--r--fix-some-js-warnings.patch184
-rw-r--r--gdm-networking.patch244
-rw-r--r--gnome-shell-enabled-extensions-background-logos.patch67
-rw-r--r--gnome-shell-favourite-apps-firefox.patch38
-rw-r--r--gnome-shell-favourite-apps-terminal.patch25
-rw-r--r--gnome-shell-favourite-apps-yelp.patch26
-rw-r--r--gnome-shell.spec1791
-rw-r--r--login-screen-extensions.patch227
-rw-r--r--owe-support.patch107
-rw-r--r--portal-notify.patch499
-rw-r--r--restrict-dbus-callers.patch1353
-rw-r--r--screencast-bus-name.patch34
-rw-r--r--sources1
-rw-r--r--support-choicelist-extension.patch1210
49 files changed, 17628 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..6345a96 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/gnome-shell-40.10.tar.xz
diff --git a/0001-Revert-dash-Subtract-vertical-margins-from-availHeig.patch b/0001-Revert-dash-Subtract-vertical-margins-from-availHeig.patch
new file mode 100644
index 0000000..a62d76e
--- /dev/null
+++ b/0001-Revert-dash-Subtract-vertical-margins-from-availHeig.patch
@@ -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
+
diff --git a/0001-Update-generated-stylesheets.patch b/0001-Update-generated-stylesheets.patch
new file mode 100644
index 0000000..4133dd6
--- /dev/null
+++ b/0001-Update-generated-stylesheets.patch
@@ -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
+
diff --git a/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch b/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch
new file mode 100644
index 0000000..001e896
--- /dev/null
+++ b/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch
@@ -0,0 +1,28 @@
+From afa3fc7be62cf70c9f6c6954e9cf5b49581269fb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 20 May 2015 16:44:00 +0200
+Subject: [PATCH] app: Fall back to window title instead of WM_CLASS
+
+It's a bad fallback as it's clearly window-specific (rather than
+app-specific), but it likely looks prettier when we fail to associate
+a .desktop file ...
+---
+ src/shell-app.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/shell-app.c b/src/shell-app.c
+index 62ba2ec73..dc0e1c732 100644
+--- a/src/shell-app.c
++++ b/src/shell-app.c
+@@ -293,7 +293,7 @@ shell_app_get_name (ShellApp *app)
+ const char *name = NULL;
+
+ if (window)
+- name = meta_window_get_wm_class (window);
++ name = meta_window_get_title (window);
+ if (!name)
+ name = C_("program", "Unknown");
+ return name;
+--
+2.31.1
+
diff --git a/0001-authPrompt-Disregard-smartcard-status-changes-events.patch b/0001-authPrompt-Disregard-smartcard-status-changes-events.patch
new file mode 100644
index 0000000..35dd9e0
--- /dev/null
+++ b/0001-authPrompt-Disregard-smartcard-status-changes-events.patch
@@ -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
+
diff --git a/0001-extensionDownloader-Refuse-to-override-system-extens.patch b/0001-extensionDownloader-Refuse-to-override-system-extens.patch
new file mode 100644
index 0000000..58a3ee8
--- /dev/null
+++ b/0001-extensionDownloader-Refuse-to-override-system-extens.patch
@@ -0,0 +1,36 @@
+From c18b7b7819f17f5d14be1ba2760653f3d93b81b1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Mon, 1 Feb 2021 18:26:00 +0100
+Subject: [PATCH] extensionDownloader: Refuse to override system extensions
+
+The website allows to "update" system extensions by installing the
+upstream version into the user's home directory.
+
+Prevent that by refusing to download and install extensions that are
+already installed system-wide.
+---
+ js/ui/extensionDownloader.js | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/js/ui/extensionDownloader.js b/js/ui/extensionDownloader.js
+index 6a3b2b488..471ddab14 100644
+--- a/js/ui/extensionDownloader.js
++++ b/js/ui/extensionDownloader.js
+@@ -17,6 +17,14 @@ var REPOSITORY_URL_UPDATE = 'https://extensions.gnome.org/update-info/';
+ let _httpSession;
+
+ function installExtension(uuid, invocation) {
++ const oldExt = Main.extensionManager.lookup(uuid);
++ if (oldExt && oldExt.type === ExtensionUtils.ExtensionType.SYSTEM) {
++ log('extensionDownloader: Trying to replace system extension %s'.format(uuid));
++ invocation.return_dbus_error('org.gnome.Shell.InstallError',
++ 'System extensions cannot be replaced');
++ return;
++ }
++
+ let params = { uuid,
+ shell_version: Config.PACKAGE_VERSION };
+
+--
+2.31.1
+
diff --git a/0001-extensionSystem-Support-locking-down-extension-insta.patch b/0001-extensionSystem-Support-locking-down-extension-insta.patch
new file mode 100644
index 0000000..9993f7a
--- /dev/null
+++ b/0001-extensionSystem-Support-locking-down-extension-insta.patch
@@ -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
+
diff --git a/0001-introspect-Add-WindowsChanged-signal.patch b/0001-introspect-Add-WindowsChanged-signal.patch
new file mode 100644
index 0000000..68c57bf
--- /dev/null
+++ b/0001-introspect-Add-WindowsChanged-signal.patch
@@ -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
+
diff --git a/0001-introspect-Allowlist-GNOME-portal.patch b/0001-introspect-Allowlist-GNOME-portal.patch
new file mode 100644
index 0000000..a2eafa8
--- /dev/null
+++ b/0001-introspect-Allowlist-GNOME-portal.patch
@@ -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
+
diff --git a/0001-kbdA11yDialog-Use-MetaKeyboardA11yFlags.patch b/0001-kbdA11yDialog-Use-MetaKeyboardA11yFlags.patch
new file mode 100644
index 0000000..2ff43aa
--- /dev/null
+++ b/0001-kbdA11yDialog-Use-MetaKeyboardA11yFlags.patch
@@ -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
+
diff --git a/0001-layout-Initialize-regions-unconditionally.patch b/0001-layout-Initialize-regions-unconditionally.patch
new file mode 100644
index 0000000..751be5d
--- /dev/null
+++ b/0001-layout-Initialize-regions-unconditionally.patch
@@ -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
+
diff --git a/0001-loginDialog-make-info-messages-themed.patch b/0001-loginDialog-make-info-messages-themed.patch
new file mode 100644
index 0000000..761f06a
--- /dev/null
+++ b/0001-loginDialog-make-info-messages-themed.patch
@@ -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
+
diff --git a/0001-magnifier-Request-window-relative-coordinates-for-fo.patch b/0001-magnifier-Request-window-relative-coordinates-for-fo.patch
new file mode 100644
index 0000000..0ebffe9
--- /dev/null
+++ b/0001-magnifier-Request-window-relative-coordinates-for-fo.patch
@@ -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
+
diff --git a/0001-main-Dump-stack-on-segfaults-by-default.patch b/0001-main-Dump-stack-on-segfaults-by-default.patch
new file mode 100644
index 0000000..57dc9f0
--- /dev/null
+++ b/0001-main-Dump-stack-on-segfaults-by-default.patch
@@ -0,0 +1,38 @@
+From f54c3f9f66001c210e10fda6aa17b9218fb67dc1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 29 Oct 2020 18:21:06 +0100
+Subject: [PATCH] main: Dump stack on segfaults by default
+
+---
+ src/main.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/main.c b/src/main.c
+index 5d07a4301..ed0b78dcc 100644
+--- a/src/main.c
++++ b/src/main.c
+@@ -38,6 +38,7 @@ static int caught_signal = 0;
+ #define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
+ #define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4
+
++#define DEFAULT_SHELL_DEBUG SHELL_DEBUG_BACKTRACE_SEGFAULTS
+ enum {
+ SHELL_DEBUG_BACKTRACE_WARNINGS = 1,
+ SHELL_DEBUG_BACKTRACE_SEGFAULTS = 2,
+@@ -279,8 +280,11 @@ shell_init_debug (const char *debug_env)
+ { "backtrace-segfaults", SHELL_DEBUG_BACKTRACE_SEGFAULTS },
+ };
+
+- _shell_debug = g_parse_debug_string (debug_env, keys,
+- G_N_ELEMENTS (keys));
++ if (debug_env)
++ _shell_debug = g_parse_debug_string (debug_env, keys,
++ G_N_ELEMENTS (keys));
++ else
++ _shell_debug = DEFAULT_SHELL_DEBUG;
+ }
+
+ static void
+--
+2.31.1
+
diff --git a/0001-main-Leak-the-GJS-context-and-ShellGlobal.patch b/0001-main-Leak-the-GJS-context-and-ShellGlobal.patch
new file mode 100644
index 0000000..250416d
--- /dev/null
+++ b/0001-main-Leak-the-GJS-context-and-ShellGlobal.patch
@@ -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
+
diff --git a/0001-osk-layouts-Replace-SS-extra-key-with.patch b/0001-osk-layouts-Replace-SS-extra-key-with.patch
new file mode 100644
index 0000000..de5dfb5
--- /dev/null
+++ b/0001-osk-layouts-Replace-SS-extra-key-with.patch
@@ -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
+
diff --git a/0001-panel-add-an-icon-to-the-ActivitiesButton.patch b/0001-panel-add-an-icon-to-the-ActivitiesButton.patch
new file mode 100644
index 0000000..8ebfc46
--- /dev/null
+++ b/0001-panel-add-an-icon-to-the-ActivitiesButton.patch
@@ -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
+
diff --git a/0001-po-Update-translations.patch b/0001-po-Update-translations.patch
new file mode 100644
index 0000000..3af909c
--- /dev/null
+++ b/0001-po-Update-translations.patch
@@ -0,0 +1,8714 @@
+From e9c4e8a8335b561df4c8fa7807e0edb14ab84423 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Fri, 20 Jan 2023 12:44:13 +0100
+Subject: [PATCH] po: Update translations
+
+---
+ po/fr.po | 740 +++++++++++++-----------------
+ po/ja.po | 1243 ++++++++++++++++++++++++++-------------------------
+ po/ko.po | 716 ++++++++++++++---------------
+ po/zh_CN.po | 664 +++++++++++++--------------
+ 4 files changed, 1596 insertions(+), 1767 deletions(-)
+
+diff --git a/po/fr.po b/po/fr.po
+index 6832a07b9..f913d8295 100644
+--- a/po/fr.po
++++ b/po/fr.po
+@@ -22,8 +22,8 @@
+ msgid ""
+ msgstr ""
+ "Project-Id-Version: gnome-shell master fr\n"
+-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
+-"POT-Creation-Date: 2021-11-06 13:24+0000\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2023-01-19 16:43+0100\n"
+ "PO-Revision-Date: 2021-11-08 09:58+0100\n"
+ "Last-Translator: Charles Monzat <charles.monzat@free.fr>\n"
+ "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
+@@ -68,17 +68,13 @@ msgstr "Gestion des fenêtres et lancement des applications"
+
+ #: data/org.gnome.shell.gschema.xml.in:6
+ msgid "Enable internal tools useful for developers and testers from Alt-F2"
+-msgstr ""
+-"Activer les outils internes pour les développeurs et les testeurs depuis Alt-"
+-"F2"
++msgstr "Activer les outils internes pour les développeurs et les testeurs depuis Alt-F2"
+
+ #: data/org.gnome.shell.gschema.xml.in:9
+ msgid ""
+ "Allows access to internal debugging and monitoring tools using the Alt-F2 "
+ "dialog."
+-msgstr ""
+-"Autoriser l’accès aux outils internes de débogage et de surveillance grâce à "
+-"la boîte de dialogue de lancement d’applications (Alt-F2)."
++msgstr "Autoriser l’accès aux outils internes de débogage et de surveillance grâce à la boîte de dialogue de lancement d’applications (Alt-F2)."
+
+ #: data/org.gnome.shell.gschema.xml.in:16
+ msgid "UUIDs of extensions to enable"
+@@ -90,12 +86,7 @@ msgid ""
+ "should be loaded. Any extension that wants to be loaded needs to be in this "
+ "list. You can also manipulate this list with the EnableExtension and "
+ "DisableExtension D-Bus methods on org.gnome.Shell."
+-msgstr ""
+-"Les extensions Shell de GNOME ont une propriété UUID. Cette clé énumère les "
+-"extensions qui doivent être chargées. Toute extension qui voudrait être "
+-"chargée doit être ajoutée dans cette liste. Vous pouvez aussi manipuler "
+-"cette liste avec les méthodes DBus EnableExtension et DisableExtension de "
+-"org.gnome.Shell."
++msgstr "Les extensions Shell de GNOME ont une propriété UUID. Cette clé énumère les extensions qui doivent être chargées. Toute extension qui voudrait être chargée doit être ajoutée dans cette liste. Vous pouvez aussi manipuler cette liste avec les méthodes DBus EnableExtension et DisableExtension de org.gnome.Shell."
+
+ #: data/org.gnome.shell.gschema.xml.in:26
+ msgid "UUIDs of extensions to force disabling"
+@@ -108,12 +99,7 @@ msgid ""
+ "manipulate this list with the EnableExtension and DisableExtension D-Bus "
+ "methods on org.gnome.Shell. This key takes precedence over the “enabled-"
+ "extensions” setting."
+-msgstr ""
+-"Les extensions Shell de GNOME ont une propriété UUID. Cette clé énumère les "
+-"extensions qui doivent être désactivées, même si elles sont chargées dans le "
+-"mode actuel. Vous pouvez aussi manipuler cette liste avec les méthodes DBus "
+-"EnableExtension et DisableExtension de org.gnome.Shell. Cette clé est "
+-"prioritaire sur la clé « enabled-extensions »."
++msgstr "Les extensions Shell de GNOME ont une propriété UUID. Cette clé énumère les extensions qui doivent être désactivées, même si elles sont chargées dans le mode actuel. Vous pouvez aussi manipuler cette liste avec les méthodes DBus EnableExtension et DisableExtension de org.gnome.Shell. Cette clé est prioritaire sur la clé « enabled-extensions »."
+
+ #: data/org.gnome.shell.gschema.xml.in:37
+ msgid "Disable user extensions"
+@@ -123,9 +109,7 @@ msgstr "Désactiver les extensions utilisateur"
+ msgid ""
+ "Disable all extensions the user has enabled without affecting the “enabled-"
+ "extension” setting."
+-msgstr ""
+-"Désactiver l’ensemble des extensions activées par l’utilisateur sans "
+-"affecter la propriété « enabled-extension »."
++msgstr "Désactiver l’ensemble des extensions activées par l’utilisateur sans affecter la propriété « enabled-extension »."
+
+ #: data/org.gnome.shell.gschema.xml.in:45
+ msgid "Disables the validation of extension version compatibility"
+@@ -136,24 +120,17 @@ msgid ""
+ "GNOME Shell will only load extensions that claim to support the current "
+ "running version. Enabling this option will disable this check and try to "
+ "load all extensions regardless of the versions they claim to support."
+-msgstr ""
+-"Shell de GNOME charge uniquement les extensions annonçant leur gestion de la "
+-"version en cours. Activer cette option désactive cette vérification et "
+-"essaie de charger toutes les extensions, sans considérer les versions "
+-"qu’elles annoncent prendre en charge."
++msgstr "Shell de GNOME charge uniquement les extensions annonçant leur gestion de la version en cours. Activer cette option désactive cette vérification et essaie de charger toutes les extensions, sans considérer les versions qu’elles annoncent prendre en charge."
+
+ #: data/org.gnome.shell.gschema.xml.in:54
+ msgid "List of desktop file IDs for favorite applications"
+-msgstr ""
+-"Liste d’identifiants de fichiers desktop pour les applications favorites"
++msgstr "Liste d’identifiants de fichiers desktop pour les applications favorites"
+
+ #: data/org.gnome.shell.gschema.xml.in:55
+ msgid ""
+ "The applications corresponding to these identifiers will be displayed in the "
+ "favorites area."
+-msgstr ""
+-"Les applications correspondant à ces identifiants sont affichées dans la "
+-"zone des favoris."
++msgstr "Les applications correspondant à ces identifiants sont affichées dans la zone des favoris."
+
+ #: data/org.gnome.shell.gschema.xml.in:62
+ msgid "History for command (Alt-F2) dialog"
+@@ -166,24 +143,18 @@ msgstr "Historique de la boîte de dialogue d’inspection"
+
+ #: data/org.gnome.shell.gschema.xml.in:71
+ msgid "Always show the “Log out” menu item in the user menu."
+-msgstr ""
+-"Toujours afficher l’élément « Se déconnecter » dans le menu utilisateur."
++msgstr "Toujours afficher l’élément « Se déconnecter » dans le menu utilisateur."
+
+ #: data/org.gnome.shell.gschema.xml.in:72
+ msgid ""
+ "This key overrides the automatic hiding of the “Log out” menu item in single-"
+ "user, single-session situations."
+-msgstr ""
+-"Cette clé affiche l’élément « Se déconnecter » du menu utilisateur "
+-"normalement caché automatiquement dans le cas d’une session ou d’un "
+-"utilisateur unique."
++msgstr "Cette clé affiche l’élément « Se déconnecter » du menu utilisateur normalement caché automatiquement dans le cas d’une session ou d’un utilisateur unique."
+
+ #: data/org.gnome.shell.gschema.xml.in:79
+ msgid ""
+ "Whether to remember password for mounting encrypted or remote filesystems"
+-msgstr ""
+-"Se souvenir des mots de passe pour les montages des systèmes de fichiers "
+-"chiffrés ou distants"
++msgstr "Se souvenir des mots de passe pour les montages des systèmes de fichiers chiffrés ou distants"
+
+ #: data/org.gnome.shell.gschema.xml.in:80
+ msgid ""
+@@ -191,12 +162,7 @@ msgid ""
+ "filesystem is mounted. If the password can be saved for future use a "
+ "“Remember Password” checkbox will be present. This key sets the default "
+ "state of the checkbox."
+-msgstr ""
+-"Le shell demandera un mot de passe au montage d’un périphérique chiffré ou "
+-"d’un système de fichiers distant. Si le mot de passe peut être enregistré "
+-"pour une utilisation ultérieure, une case à cocher « Se souvenir du mot de "
+-"passe » sera présente. Cette clé détermine l’état par défaut de cette case à "
+-"cocher."
++msgstr "Le shell demandera un mot de passe au montage d’un périphérique chiffré ou d’un système de fichiers distant. Si le mot de passe peut être enregistré pour une utilisation ultérieure, une case à cocher « Se souvenir du mot de passe » sera présente. Cette clé détermine l’état par défaut de cette case à cocher."
+
+ #: data/org.gnome.shell.gschema.xml.in:89
+ msgid ""
+@@ -209,17 +175,11 @@ msgid ""
+ "powered, or if there were devices set up associated with the default "
+ "adapter. This will be reset if the default adapter is ever seen not to have "
+ "devices associated to it."
+-msgstr ""
+-"Le shell n’affichera d’élément de menu Bluetooth que si un adaptateur "
+-"Bluetooth est allumé ou s’il y a des périphériques associés avec "
+-"l’adaptateur par défaut. Cela sera réinitialisé si l’adaptateur par défaut "
+-"se retrouve sans aucun périphérique associé."
++msgstr "Le shell n’affichera d’élément de menu Bluetooth que si un adaptateur Bluetooth est allumé ou s’il y a des périphériques associés avec l’adaptateur par défaut. Cela sera réinitialisé si l’adaptateur par défaut se retrouve sans aucun périphérique associé."
+
+ #: data/org.gnome.shell.gschema.xml.in:99
+ msgid "The last version the “Welcome to GNOME” dialog was shown for"
+-msgstr ""
+-"La dernière version pour laquelle le dialogue « Bienvenue dans GNOME » s’est "
+-"affichée"
++msgstr "La dernière version pour laquelle le dialogue « Bienvenue dans GNOME » s’est affichée"
+
+ #: data/org.gnome.shell.gschema.xml.in:100
+ msgid ""
+@@ -227,236 +187,190 @@ msgid ""
+ "shown. An empty string represents the oldest possible version, and a huge "
+ "number will represent versions that do not exist yet. This huge number can "
+ "be used to effectively disable the dialog."
+-msgstr ""
+-"Cette clé détermine la version affichée dans le dialogue « Bienvenue dans "
+-"GNOME ». Une chaîne vide représente la dernière version possible de GNOME et "
+-"un nombre très élevé représentera des versions qui n’existent pas encore. Ce "
+-"nombre très élevé peut être utilisé pour désactiver le dialogue."
+-
+-#: data/org.gnome.shell.gschema.xml.in:109
+-msgid "Enable introspection API"
+-msgstr "Activer l’API d’introspection"
+-
+-#: data/org.gnome.shell.gschema.xml.in:110
+-msgid ""
+-"Enables a D-Bus API that allows to introspect the application state of the "
+-"shell."
+-msgstr ""
+-"Active l’API D-Bus, qui permet d’introspecter l’état d’application du shell."
++msgstr "Cette clé détermine la version affichée dans le dialogue « Bienvenue dans GNOME ». Une chaîne vide représente la dernière version possible de GNOME et un nombre très élevé représentera des versions qui n’existent pas encore. Ce nombre très élevé peut être utilisé pour désactiver le dialogue."
+
+-#: data/org.gnome.shell.gschema.xml.in:141
++#: data/org.gnome.shell.gschema.xml.in:133
+ msgid "Layout of the app picker"
+ msgstr "Disposition du sélecteur d’applications"
+
+-#: data/org.gnome.shell.gschema.xml.in:142
++#: data/org.gnome.shell.gschema.xml.in:134
+ msgid ""
+ "Layout of the app picker. Each entry in the array is a page. Pages are "
+ "stored in the order they appear in GNOME Shell. Each page contains an "
+ "“application id” → 'data' pair. Currently, the following values are stored "
+ "as 'data': • “position”: the position of the application icon in the page"
+-msgstr ""
+-"Disposition du sélecteur d’applications. Chaque entrée du tableau est une "
+-"page. Les pages sont stockées dans l’ordre dans lequel elles apparaissent "
+-"dans Shell de GNOME. Chaque page contient une paire « identifiant "
+-"d’application » → « données ». Actuellement, les valeurs suivantes sont "
+-"stockées comme « données » : • « position » : la position de l’icône de "
+-"l’application sur la page"
++msgstr "Disposition du sélecteur d’applications. Chaque entrée du tableau est une page. Les pages sont stockées dans l’ordre dans lequel elles apparaissent dans Shell de GNOME. Chaque page contient une paire « identifiant d’application » → « données ». Actuellement, les valeurs suivantes sont stockées comme « données » : • « position » : la position de l’icône de l’application sur la page"
+
+-#: data/org.gnome.shell.gschema.xml.in:157
++#: data/org.gnome.shell.gschema.xml.in:149
+ msgid "Keybinding to open the application menu"
+ msgstr "Combinaison de touches pour ouvrir le menu de l’application"
+
+-#: data/org.gnome.shell.gschema.xml.in:158
++#: data/org.gnome.shell.gschema.xml.in:150
+ msgid "Keybinding to open the application menu."
+ msgstr "Combinaison de touches pour ouvrir le menu de l’application."
+
+-#: data/org.gnome.shell.gschema.xml.in:164
+-#: data/org.gnome.shell.gschema.xml.in:171
++#: data/org.gnome.shell.gschema.xml.in:156
++#: data/org.gnome.shell.gschema.xml.in:163
+ msgid "Keybinding to shift between overview states"
+-msgstr ""
+-"Combinaison de touches pour basculer entre les états de la vue d’ensemble"
++msgstr "Combinaison de touches pour basculer entre les états de la vue d’ensemble"
+
+-#: data/org.gnome.shell.gschema.xml.in:165
++#: data/org.gnome.shell.gschema.xml.in:157
+ msgid "Keybinding to shift between session, window picker and app grid"
+-msgstr ""
+-"Combinaison de touches pour basculer entre la session, le sélecteur de "
+-"fenêtre et la grille des applications"
++msgstr "Combinaison de touches pour basculer entre la session, le sélecteur de fenêtre et la grille des applications"
+
+-#: data/org.gnome.shell.gschema.xml.in:172
++#: data/org.gnome.shell.gschema.xml.in:164
+ msgid "Keybinding to shift between app grid, window picker and session"
+-msgstr ""
+-"Combinaison de touches pour basculer entre la grille des applications, le "
+-"sélecteur de fenêtre et la session"
++msgstr "Combinaison de touches pour basculer entre la grille des applications, le sélecteur de fenêtre et la session"
+
+-#: data/org.gnome.shell.gschema.xml.in:178
++#: data/org.gnome.shell.gschema.xml.in:170
+ msgid "Keybinding to open the “Show Applications” view"
+-msgstr ""
+-"Combinaison de touches pour ouvrir la vue « Afficher les applications »"
++msgstr "Combinaison de touches pour ouvrir la vue « Afficher les applications »"
+
+-#: data/org.gnome.shell.gschema.xml.in:179
++#: data/org.gnome.shell.gschema.xml.in:171
+ msgid ""
+ "Keybinding to open the “Show Applications” view of the Activities Overview."
+-msgstr ""
+-"Combinaison de touches pour ouvrir la vue « Afficher les applications » de "
+-"la vue d’ensemble des activités."
++msgstr "Combinaison de touches pour ouvrir la vue « Afficher les applications » de la vue d’ensemble des activités."
+
+-#: data/org.gnome.shell.gschema.xml.in:186
++#: data/org.gnome.shell.gschema.xml.in:178
+ msgid "Keybinding to open the overview"
+ msgstr "Combinaison de touches pour ouvrir la vue d’ensemble"
+
+-#: data/org.gnome.shell.gschema.xml.in:187
++#: data/org.gnome.shell.gschema.xml.in:179
+ msgid "Keybinding to open the Activities Overview."
+ msgstr "Combinaison de touches pour ouvrir la vue d’ensemble des activités."
+
+-#: data/org.gnome.shell.gschema.xml.in:193
++#: data/org.gnome.shell.gschema.xml.in:185
+ msgid "Keybinding to toggle the visibility of the notification list"
+-msgstr ""
+-"Combinaison de touches pour inverser la visibilité de la liste des "
+-"notifications"
++msgstr "Combinaison de touches pour inverser la visibilité de la liste des notifications"
+
+-#: data/org.gnome.shell.gschema.xml.in:194
++#: data/org.gnome.shell.gschema.xml.in:186
+ msgid "Keybinding to toggle the visibility of the notification list."
+-msgstr ""
+-"Combinaison de touches pour inverser la visibilité de la liste des "
+-"notifications."
++msgstr "Combinaison de touches pour inverser la visibilité de la liste des notifications."
+
+-#: data/org.gnome.shell.gschema.xml.in:200
++#: data/org.gnome.shell.gschema.xml.in:192
+ msgid "Keybinding to focus the active notification"
+ msgstr "Combinaison de touches pour donner le focus à la notification active"
+
+-#: data/org.gnome.shell.gschema.xml.in:201
++#: data/org.gnome.shell.gschema.xml.in:193
+ msgid "Keybinding to focus the active notification."
+ msgstr "Combinaison de touches pour donner le focus à la notification active."
+
+-#: data/org.gnome.shell.gschema.xml.in:207
++#: data/org.gnome.shell.gschema.xml.in:199
+ msgid "Switch to application 1"
+ msgstr "Passer à l’application 1"
+
+-#: data/org.gnome.shell.gschema.xml.in:211
++#: data/org.gnome.shell.gschema.xml.in:203
+ msgid "Switch to application 2"
+ msgstr "Passer à l’application 2"
+
+-#: data/org.gnome.shell.gschema.xml.in:215
++#: data/org.gnome.shell.gschema.xml.in:207
+ msgid "Switch to application 3"
+ msgstr "Passer à l’application 3"
+
+-#: data/org.gnome.shell.gschema.xml.in:219
++#: data/org.gnome.shell.gschema.xml.in:211
+ msgid "Switch to application 4"
+ msgstr "Passer à l’application 4"
+
+-#: data/org.gnome.shell.gschema.xml.in:223
++#: data/org.gnome.shell.gschema.xml.in:215
+ msgid "Switch to application 5"
+ msgstr "Passer à l’application 5"
+
+-#: data/org.gnome.shell.gschema.xml.in:227
++#: data/org.gnome.shell.gschema.xml.in:219
+ msgid "Switch to application 6"
+ msgstr "Passer à l’application 6"
+
+-#: data/org.gnome.shell.gschema.xml.in:231
++#: data/org.gnome.shell.gschema.xml.in:223
+ msgid "Switch to application 7"
+ msgstr "Passer à l’application 7"
+
+-#: data/org.gnome.shell.gschema.xml.in:235
++#: data/org.gnome.shell.gschema.xml.in:227
+ msgid "Switch to application 8"
+ msgstr "Passer à l’application 8"
+
+-#: data/org.gnome.shell.gschema.xml.in:239
++#: data/org.gnome.shell.gschema.xml.in:231
+ msgid "Switch to application 9"
+ msgstr "Passer à l’application 9"
+
+-#: data/org.gnome.shell.gschema.xml.in:248
+-#: data/org.gnome.shell.gschema.xml.in:275
++#: data/org.gnome.shell.gschema.xml.in:240
++#: data/org.gnome.shell.gschema.xml.in:267
+ msgid "Limit switcher to current workspace."
+ msgstr "Limite le sélecteur de fenêtres à l’espace de travail actuel."
+
+-#: data/org.gnome.shell.gschema.xml.in:249
++#: data/org.gnome.shell.gschema.xml.in:241
+ msgid ""
+ "If true, only applications that have windows on the current workspace are "
+ "shown in the switcher. Otherwise, all applications are included."
+-msgstr ""
+-"Si vrai, seules les applications ayant des fenêtres ouvertes sur l’espace de "
+-"travail actuel sont affichées dans le sélecteur. Sinon, toutes les "
+-"applications y sont incluses."
++msgstr "Si vrai, seules les applications ayant des fenêtres ouvertes sur l’espace de travail actuel sont affichées dans le sélecteur. Sinon, toutes les applications y sont incluses."
+
+-#: data/org.gnome.shell.gschema.xml.in:266
++#: data/org.gnome.shell.gschema.xml.in:258
+ msgid "The application icon mode."
+ msgstr "Le type d’icône des applications."
+
+-#: data/org.gnome.shell.gschema.xml.in:267
++#: data/org.gnome.shell.gschema.xml.in:259
+ msgid ""
+ "Configures how the windows are shown in the switcher. Valid possibilities "
+ "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
+ "only” (shows only the application icon) or “both”."
+-msgstr ""
+-"Configure la façon dont les fenêtres sont affichées dans le sélecteur. Les "
+-"choix possibles sont « thumbnail-only » (affiche une miniature de la "
+-"fenêtre), « app-icon-only » (affiche uniquement l’icône de l’application), "
+-"ou « both » (affiche les deux)."
++msgstr "Configure la façon dont les fenêtres sont affichées dans le sélecteur. Les choix possibles sont « thumbnail-only » (affiche une miniature de la fenêtre), « app-icon-only » (affiche uniquement l’icône de l’application), ou « both » (affiche les deux)."
+
+-#: data/org.gnome.shell.gschema.xml.in:276
++#: data/org.gnome.shell.gschema.xml.in:268
+ msgid ""
+ "If true, only windows from the current workspace are shown in the switcher. "
+ "Otherwise, all windows are included."
+-msgstr ""
+-"Si vrai, seules les fenêtres de l’espace de travail actuel sont affichées "
+-"dans le sélecteur. Sinon, toutes les fenêtres y sont incluses."
++msgstr "Si vrai, seules les fenêtres de l’espace de travail actuel sont affichées dans le sélecteur. Sinon, toutes les fenêtres y sont incluses."
+
+-#: data/org.gnome.shell.gschema.xml.in:286
++#: data/org.gnome.shell.gschema.xml.in:278
+ msgid "Locations"
+ msgstr "Emplacements"
+
+-#: data/org.gnome.shell.gschema.xml.in:287
++#: data/org.gnome.shell.gschema.xml.in:279
+ msgid "The locations to show in world clocks"
+ msgstr "Les emplacements à afficher dans les horloges mondiales"
+
+-#: data/org.gnome.shell.gschema.xml.in:297
++#: data/org.gnome.shell.gschema.xml.in:289
+ msgid "Automatic location"
+ msgstr "Emplacement automatique"
+
+-#: data/org.gnome.shell.gschema.xml.in:298
++#: data/org.gnome.shell.gschema.xml.in:290
+ msgid "Whether to fetch the current location or not"
+ msgstr "Indique s’il faut récupérer l’emplacement actuel ou non"
+
+-#: data/org.gnome.shell.gschema.xml.in:305
++#: data/org.gnome.shell.gschema.xml.in:297
+ msgid "Location"
+ msgstr "Emplacement"
+
+-#: data/org.gnome.shell.gschema.xml.in:306
++#: data/org.gnome.shell.gschema.xml.in:298
+ msgid "The location for which to show a forecast"
+ msgstr "L’emplacement pour lequel afficher les prévisions"
+
+-#: data/org.gnome.shell.gschema.xml.in:318
++#: data/org.gnome.shell.gschema.xml.in:310
+ msgid "Attach modal dialog to the parent window"
+ msgstr "Attacher les dialogues modaux à leur fenêtre parente"
+
+-#: data/org.gnome.shell.gschema.xml.in:319
++#: data/org.gnome.shell.gschema.xml.in:311
++#: data/org.gnome.shell.gschema.xml.in:320
+ #: data/org.gnome.shell.gschema.xml.in:328
+ #: data/org.gnome.shell.gschema.xml.in:336
+ #: data/org.gnome.shell.gschema.xml.in:344
+-#: data/org.gnome.shell.gschema.xml.in:352
+ msgid ""
+ "This key overrides the key in org.gnome.mutter when running GNOME Shell."
+-msgstr ""
+-"Cette clé prend le pas sur la clé dans org.gnome.mutter lorsque Shell de "
+-"GNOME est lancé."
++msgstr "Cette clé prend le pas sur la clé dans org.gnome.mutter lorsque Shell de GNOME est lancé."
+
+-#: data/org.gnome.shell.gschema.xml.in:327
++#: data/org.gnome.shell.gschema.xml.in:319
+ msgid "Enable edge tiling when dropping windows on screen edges"
+ msgstr "Activer l’empilage des fenêtres déposées sur les bords de l’écran"
+
+-#: data/org.gnome.shell.gschema.xml.in:335
++#: data/org.gnome.shell.gschema.xml.in:327
+ msgid "Workspaces are managed dynamically"
+ msgstr "Les espaces de travail sont gérés dynamiquement"
+
+-#: data/org.gnome.shell.gschema.xml.in:343
++#: data/org.gnome.shell.gschema.xml.in:335
+ msgid "Workspaces only on primary monitor"
+ msgstr "Les espaces de travail sont uniquement sur l’écran principal"
+
+-#: data/org.gnome.shell.gschema.xml.in:351
++#: data/org.gnome.shell.gschema.xml.in:343
+ msgid "Delay focus changes in mouse mode until the pointer stops moving"
+-msgstr ""
+-"Retarder les changements de focus en mode souris jusqu’à ce que le pointeur "
+-"arrête de bouger"
++msgstr "Retarder les changements de focus en mode souris jusqu’à ce que le pointeur arrête de bouger"
+
+ #: data/org.gnome.Shell.PortalHelper.desktop.in.in:3
+ msgid "Network Login"
+@@ -472,10 +386,7 @@ msgid ""
+ "We’re very sorry, but there’s been a problem: the settings for this "
+ "extension can’t be displayed. We recommend that you report the issue to the "
+ "extension authors."
+-msgstr ""
+-"Nous sommes désolés, mais il y a eu un problème : les paramètres de cette "
+-"extension ne peuvent être affichés. Nous vous recommandons de signaler ce "
+-"problème aux auteurs de l’extension."
++msgstr "Nous sommes désolés, mais il y a eu un problème : les paramètres de cette extension ne peuvent être affichés. Nous vous recommandons de signaler ce problème aux auteurs de l’extension."
+
+ #: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:64
+ msgid "Technical Details"
+@@ -489,16 +400,16 @@ msgstr "Site Web"
+ msgid "Visit extension homepage"
+ msgstr "Visiter le site Web de l’extension"
+
+-#: js/gdm/authPrompt.js:141 js/ui/audioDeviceSelection.js:61
++#: js/gdm/authPrompt.js:150 js/ui/audioDeviceSelection.js:61
+ #: js/ui/components/networkAgent.js:111 js/ui/components/polkitAgent.js:138
+-#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:190
++#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:198
+ #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
+-#: js/ui/status/network.js:946 subprojects/extensions-app/js/main.js:183
++#: js/ui/status/network.js:978 subprojects/extensions-app/js/main.js:183
+ msgid "Cancel"
+ msgstr "Annuler"
+
+ #. Cisco LEAP
+-#: js/gdm/authPrompt.js:285 js/ui/components/networkAgent.js:210
++#: js/gdm/authPrompt.js:319 js/ui/components/networkAgent.js:210
+ #: js/ui/components/networkAgent.js:226 js/ui/components/networkAgent.js:250
+ #: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:291
+ #: js/ui/components/networkAgent.js:301 js/ui/components/polkitAgent.js:275
+@@ -510,13 +421,13 @@ msgstr "Mot de passe"
+ msgid "Choose Session"
+ msgstr "Choisir une session"
+
+-#: js/gdm/loginDialog.js:456
++#: js/gdm/loginDialog.js:461
+ msgid "Not listed?"
+ msgstr "Absent de la liste ?"
+
+ #. Translators: this message is shown below the username entry field
+ #. to clue the user in on how to login to the local network realm
+-#: js/gdm/loginDialog.js:921
++#: js/gdm/loginDialog.js:926
+ #, javascript-format
+ msgid "(e.g., user or %s)"
+ msgstr "(par ex. utilisateur ou %s)"
+@@ -524,28 +435,28 @@ msgstr "(par ex. utilisateur ou %s)"
+ #. TTLS and PEAP are actually much more complicated, but this complication
+ #. is not visible here since we only care about phase2 authentication
+ #. (and don't even care of which one)
+-#: js/gdm/loginDialog.js:926 js/ui/components/networkAgent.js:246
++#: js/gdm/loginDialog.js:931 js/ui/components/networkAgent.js:246
+ #: js/ui/components/networkAgent.js:269 js/ui/components/networkAgent.js:287
+ msgid "Username"
+ msgstr "Nom d’utilisateur"
+
+-#: js/gdm/loginDialog.js:1279
++#: js/gdm/loginDialog.js:1285
+ msgid "Login Window"
+ msgstr "Fenêtre de connexion"
+
+-#: js/gdm/util.js:430
++#: js/gdm/util.js:441
+ msgid "Authentication error"
+ msgstr "Erreur d’authentification"
+
+ #. Translators: this message is shown below the password entry field
+ #. to indicate the user can swipe their finger on the fingerprint reader
+-#: js/gdm/util.js:589
++#: js/gdm/util.js:622
+ msgid "(or swipe finger across reader)"
+ msgstr "(ou faites glisser le doigt à travers le lecteur)"
+
+ #. Translators: this message is shown below the password entry field
+ #. to indicate the user can place their finger on the fingerprint reader instead
+-#: js/gdm/util.js:594
++#: js/gdm/util.js:627
+ msgid "(or place finger on reader)"
+ msgstr "(ou placez le doigt sur le lecteur)"
+
+@@ -630,65 +541,65 @@ msgctxt "search-result"
+ msgid "Lock Screen Rotation"
+ msgstr "Verrouiller la rotation de l’écran"
+
+-#: js/misc/util.js:120
++#: js/misc/util.js:121
+ msgid "Command not found"
+ msgstr "Commande non trouvée"
+
+ #. Replace "Error invoking GLib.shell_parse_argv: " with
+ #. something nicer
+-#: js/misc/util.js:156
++#: js/misc/util.js:157
+ msgid "Could not parse command:"
+ msgstr "Impossible d’analyser la commande :"
+
+-#: js/misc/util.js:164
++#: js/misc/util.js:165
+ #, javascript-format
+ msgid "Execution of “%s” failed:"
+ msgstr "Exécution de « %s » impossible :"
+
+-#: js/misc/util.js:181
++#: js/misc/util.js:182
+ msgid "Just now"
+ msgstr "À l’instant"
+
+-#: js/misc/util.js:183
++#: js/misc/util.js:184
+ #, javascript-format
+ msgid "%d minute ago"
+ msgid_plural "%d minutes ago"
+ msgstr[0] "Il y a %d minute"
+ msgstr[1] "Il y a %d minutes"
+
+-#: js/misc/util.js:187
++#: js/misc/util.js:188
+ #, javascript-format
+ msgid "%d hour ago"
+ msgid_plural "%d hours ago"
+ msgstr[0] "Il y a %d heure"
+ msgstr[1] "Il y a %d heures"
+
+-#: js/misc/util.js:191 js/ui/dateMenu.js:162
++#: js/misc/util.js:192 js/ui/dateMenu.js:163
+ msgid "Yesterday"
+ msgstr "Hier"
+
+-#: js/misc/util.js:193
++#: js/misc/util.js:194
+ #, javascript-format
+ msgid "%d day ago"
+ msgid_plural "%d days ago"
+ msgstr[0] "Il y a %d jour"
+ msgstr[1] "Il y a %d jours"
+
+-#: js/misc/util.js:197
++#: js/misc/util.js:198
+ #, javascript-format
+ msgid "%d week ago"
+ msgid_plural "%d weeks ago"
+ msgstr[0] "Il y a %d semaine"
+ msgstr[1] "Il y a %d semaines"
+
+-#: js/misc/util.js:201
++#: js/misc/util.js:202
+ #, javascript-format
+ msgid "%d month ago"
+ msgid_plural "%d months ago"
+ msgstr[0] "Il y a %d mois"
+ msgstr[1] "Il y a %d mois"
+
+-#: js/misc/util.js:204
++#: js/misc/util.js:205
+ #, javascript-format
+ msgid "%d year ago"
+ msgid_plural "%d years ago"
+@@ -696,20 +607,20 @@ msgstr[0] "Il y a %d an"
+ msgstr[1] "Il y a %d ans"
+
+ #. Translators: Time in 24h format
+-#: js/misc/util.js:237
++#: js/misc/util.js:238
+ msgid "%H∶%M"
+ msgstr "%H∶%M"
+
+ #. Translators: this is the word "Yesterday" followed by a
+ #. time string in 24h format. i.e. "Yesterday, 14:30"
+-#: js/misc/util.js:243
++#: js/misc/util.js:244
+ #, no-c-format
+ msgid "Yesterday, %H∶%M"
+ msgstr "Hier, %H∶%M"
+
+ #. Translators: this is the week day name followed by a time
+ #. string in 24h format. i.e. "Monday, 14:30"
+-#: js/misc/util.js:249
++#: js/misc/util.js:250
+ #, no-c-format
+ msgid "%A, %H∶%M"
+ msgstr "%A, %H∶%M"
+@@ -717,7 +628,7 @@ msgstr "%A, %H∶%M"
+ #. Translators: this is the month name and day number
+ #. followed by a time string in 24h format.
+ #. i.e. "May 25, 14:30"
+-#: js/misc/util.js:255
++#: js/misc/util.js:256
+ #, no-c-format
+ msgid "%B %-d, %H∶%M"
+ msgstr "%-d %B, %H∶%M"
+@@ -725,7 +636,7 @@ msgstr "%-d %B, %H∶%M"
+ #. Translators: this is the month name, day number, year
+ #. number followed by a time string in 24h format.
+ #. i.e. "May 25 2012, 14:30"
+-#: js/misc/util.js:261
++#: js/misc/util.js:262
+ #, no-c-format
+ msgid "%B %-d %Y, %H∶%M"
+ msgstr "%-d %B %Y, %H∶%M"
+@@ -733,20 +644,20 @@ msgstr "%-d %B %Y, %H∶%M"
+ #. Show only the time if date is on today
+ #. eslint-disable-line no-lonely-if
+ #. Translators: Time in 12h format
+-#: js/misc/util.js:266
++#: js/misc/util.js:267
+ msgid "%l∶%M %p"
+ msgstr "%l∶%M %p"
+
+ #. Translators: this is the word "Yesterday" followed by a
+ #. time string in 12h format. i.e. "Yesterday, 2:30 pm"
+-#: js/misc/util.js:272
++#: js/misc/util.js:273
+ #, no-c-format
+ msgid "Yesterday, %l∶%M %p"
+ msgstr "Hier, %l∶%M %p"
+
+ #. Translators: this is the week day name followed by a time
+ #. string in 12h format. i.e. "Monday, 2:30 pm"
+-#: js/misc/util.js:278
++#: js/misc/util.js:279
+ #, no-c-format
+ msgid "%A, %l∶%M %p"
+ msgstr "%A, %l∶%M %p"
+@@ -754,7 +665,7 @@ msgstr "%A, %l∶%M %p"
+ #. Translators: this is the month name and day number
+ #. followed by a time string in 12h format.
+ #. i.e. "May 25, 2:30 pm"
+-#: js/misc/util.js:284
++#: js/misc/util.js:285
+ #, no-c-format
+ msgid "%B %-d, %l∶%M %p"
+ msgstr "%-d %B, %l∶%M %p"
+@@ -762,7 +673,7 @@ msgstr "%-d %B, %l∶%M %p"
+ #. Translators: this is the month name, day number, year
+ #. number followed by a time string in 12h format.
+ #. i.e. "May 25 2012, 2:30 pm"
+-#: js/misc/util.js:290
++#: js/misc/util.js:291
+ #, no-c-format
+ msgid "%B %-d %Y, %l∶%M %p"
+ msgstr "%-d %B %Y, %l∶%M %p"
+@@ -776,10 +687,7 @@ msgstr "Identification du point d’accès"
+ msgid ""
+ "Your connection to this hotspot login is not secure. Passwords or other "
+ "information you enter on this page can be viewed by people nearby."
+-msgstr ""
+-"La connexion à ce point d’accès n’est pas sécurisée. Les mots de passe et "
+-"les autres informations que vous saisissez sur cette page peuvent être "
+-"interceptés par des personnes autour de vous."
++msgstr "La connexion à ce point d’accès n’est pas sécurisée. Les mots de passe et les autres informations que vous saisissez sur cette page peuvent être interceptés par des personnes autour de vous."
+
+ #. No support for non-modal system dialogs, so ignore the option
+ #. let modal = options['modal'] || true;
+@@ -824,12 +732,12 @@ msgstr "Ajouter aux favoris"
+ msgid "Show Details"
+ msgstr "Afficher les détails"
+
+-#: js/ui/appFavorites.js:164
++#: js/ui/appFavorites.js:165
+ #, javascript-format
+ msgid "%s has been added to your favorites."
+ msgstr "%s a été ajouté à vos favoris."
+
+-#: js/ui/appFavorites.js:197
++#: js/ui/appFavorites.js:198
+ #, javascript-format
+ msgid "%s has been removed from your favorites."
+ msgstr "%s a été supprimé de vos favoris."
+@@ -850,7 +758,7 @@ msgstr "Casque audio"
+ msgid "Headset"
+ msgstr "Micro-casque"
+
+-#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:277
++#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:278
+ msgid "Microphone"
+ msgstr "Microphone"
+
+@@ -867,7 +775,7 @@ msgid "Settings"
+ msgstr "Paramètres"
+
+ #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
+-#: js/ui/calendar.js:36
++#: js/ui/calendar.js:35
+ msgctxt "calendar-no-work"
+ msgid "06"
+ msgstr "06"
+@@ -877,43 +785,43 @@ msgstr "06"
+ #. * NOTE: These grid abbreviations are always shown together
+ #. * and in order, e.g. "S M T W T F S".
+ #.
+-#: js/ui/calendar.js:65
++#: js/ui/calendar.js:61
+ msgctxt "grid sunday"
+ msgid "S"
+ msgstr "D"
+
+ #. Translators: Calendar grid abbreviation for Monday
+-#: js/ui/calendar.js:67
++#: js/ui/calendar.js:63
+ msgctxt "grid monday"
+ msgid "M"
+ msgstr "L"
+
+ #. Translators: Calendar grid abbreviation for Tuesday
+-#: js/ui/calendar.js:69
++#: js/ui/calendar.js:65
+ msgctxt "grid tuesday"
+ msgid "T"
+ msgstr "M"
+
+ #. Translators: Calendar grid abbreviation for Wednesday
+-#: js/ui/calendar.js:71
++#: js/ui/calendar.js:67
+ msgctxt "grid wednesday"
+ msgid "W"
+ msgstr "M"
+
+ #. Translators: Calendar grid abbreviation for Thursday
+-#: js/ui/calendar.js:73
++#: js/ui/calendar.js:69
+ msgctxt "grid thursday"
+ msgid "T"
+ msgstr "J"
+
+ #. Translators: Calendar grid abbreviation for Friday
+-#: js/ui/calendar.js:75
++#: js/ui/calendar.js:71
+ msgctxt "grid friday"
+ msgid "F"
+ msgstr "V"
+
+ #. Translators: Calendar grid abbreviation for Saturday
+-#: js/ui/calendar.js:77
++#: js/ui/calendar.js:73
+ msgctxt "grid saturday"
+ msgid "S"
+ msgstr "S"
+@@ -924,7 +832,7 @@ msgstr "S"
+ #. * "%OB" is the new format specifier introduced in glibc 2.27,
+ #. * in most cases you should not change it.
+ #.
+-#: js/ui/calendar.js:392
++#: js/ui/calendar.js:400
+ msgid "%OB"
+ msgstr "%OB"
+
+@@ -937,37 +845,37 @@ msgstr "%OB"
+ #. * in most cases you should not use the old "%B" here unless you
+ #. * absolutely know what you are doing.
+ #.
+-#: js/ui/calendar.js:402
++#: js/ui/calendar.js:410
+ msgid "%OB %Y"
+ msgstr "%OB %Y"
+
+-#: js/ui/calendar.js:461
++#: js/ui/calendar.js:469
+ msgid "Previous month"
+ msgstr "Mois précédent"
+
+-#: js/ui/calendar.js:476
++#: js/ui/calendar.js:484
+ msgid "Next month"
+ msgstr "Mois suivant"
+
+-#: js/ui/calendar.js:626
++#: js/ui/calendar.js:632
+ #, no-javascript-format
+ msgctxt "date day number format"
+ msgid "%d"
+ msgstr "%d"
+
+-#: js/ui/calendar.js:682
++#: js/ui/calendar.js:688
+ msgid "Week %V"
+ msgstr "Semaine %V"
+
+-#: js/ui/calendar.js:896
++#: js/ui/calendar.js:902
+ msgid "No Notifications"
+ msgstr "Aucune notification"
+
+-#: js/ui/calendar.js:950
++#: js/ui/calendar.js:956
+ msgid "Do Not Disturb"
+ msgstr "Ne pas déranger"
+
+-#: js/ui/calendar.js:971
++#: js/ui/calendar.js:977
+ msgid "Clear"
+ msgstr "Effacer"
+
+@@ -981,9 +889,7 @@ msgstr "« %s » ne répond pas."
+ msgid ""
+ "You may choose to wait a short while for it to continue or force the "
+ "application to quit entirely."
+-msgstr ""
+-"Vous pouvez soit attendre un peu pour continuer, soit forcer l’application à "
+-"quitter."
++msgstr "Vous pouvez soit attendre un peu pour continuer, soit forcer l’application à quitter."
+
+ #: js/ui/closeDialog.js:70
+ msgid "Force Quit"
+@@ -1017,12 +923,10 @@ msgstr "Ouvrir avec %s"
+ #: js/ui/components/networkAgent.js:93
+ msgid ""
+ "Alternatively you can connect by pushing the “WPS” button on your router."
+-msgstr ""
+-"Vous pouvez également vous connecter en appuyant sur le bouton « WPS » sur "
+-"votre routeur."
++msgstr "Vous pouvez également vous connecter en appuyant sur le bouton « WPS » sur votre routeur."
+
+ #: js/ui/components/networkAgent.js:105 js/ui/status/network.js:258
+-#: js/ui/status/network.js:349 js/ui/status/network.js:949
++#: js/ui/status/network.js:349 js/ui/status/network.js:981
+ msgid "Connect"
+ msgstr "Se connecter"
+
+@@ -1052,9 +956,7 @@ msgstr "Authentification nécessaire"
+ msgid ""
+ "Passwords or encryption keys are required to access the wireless network "
+ "“%s”."
+-msgstr ""
+-"Il faut un mot de passe ou une clé de chiffrement pour accéder au réseau "
+-"sans fil « %s »."
++msgstr "Il faut un mot de passe ou une clé de chiffrement pour accéder au réseau sans fil « %s »."
+
+ #: js/ui/components/networkAgent.js:323 js/ui/components/networkAgent.js:684
+ msgid "Wired 802.1X authentication"
+@@ -1087,7 +989,7 @@ msgstr "PIN"
+ msgid "A password is required to connect to “%s”."
+ msgstr "Un mot de passe est requis pour se connecter à « %s »."
+
+-#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1723
++#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1792
+ msgid "Network Manager"
+ msgstr "Gestionnaire de réseau"
+
+@@ -1172,7 +1074,7 @@ msgstr "%A %e %B %Y"
+ # luc: TODO: to test, this possibly explodes on dimanche 25 septembre 2011
+ # L M M J V S D
+ #. Translators: Shown on calendar heading when selected day occurs on current year
+-#: js/ui/dateMenu.js:151
++#: js/ui/dateMenu.js:152
+ msgctxt "calendar heading"
+ msgid "%B %-d"
+ msgstr "%-d %B"
+@@ -1184,16 +1086,16 @@ msgstr "%-d %B"
+ # luc: TODO: to test, this possibly explodes on dimanche 25 septembre 2011
+ # L M M J V S D
+ #. Translators: Shown on calendar heading when selected day occurs on different year
+-#: js/ui/dateMenu.js:154
++#: js/ui/dateMenu.js:155
+ msgctxt "calendar heading"
+ msgid "%B %-d %Y"
+ msgstr "%-d %B %Y"
+
+-#: js/ui/dateMenu.js:160
++#: js/ui/dateMenu.js:161
+ msgid "Today"
+ msgstr "Aujourd’hui"
+
+-#: js/ui/dateMenu.js:164
++#: js/ui/dateMenu.js:165
+ msgid "Tomorrow"
+ msgstr "Demain"
+
+@@ -1215,40 +1117,40 @@ msgstr "Demain"
+ #. Translators: Shown in calendar event list for all day events
+ #. * Keep it short, best if you can use less then 10 characters
+ #.
+-#: js/ui/dateMenu.js:180
++#: js/ui/dateMenu.js:181
+ msgctxt "event list time"
+ msgid "All Day"
+ msgstr "Journée"
+
+-#: js/ui/dateMenu.js:231
++#: js/ui/dateMenu.js:232
+ msgid "No Events"
+ msgstr "Aucun évènement"
+
+-#: js/ui/dateMenu.js:348
++#: js/ui/dateMenu.js:349
+ msgid "Add world clocks…"
+ msgstr "Ajouter des horloges mondiales…"
+
+-#: js/ui/dateMenu.js:349
++#: js/ui/dateMenu.js:350
+ msgid "World Clocks"
+ msgstr "Horloges mondiales"
+
+-#: js/ui/dateMenu.js:629
++#: js/ui/dateMenu.js:630
+ msgid "Loading…"
+ msgstr "Chargement…"
+
+-#: js/ui/dateMenu.js:639
++#: js/ui/dateMenu.js:640
+ msgid "Go online for weather information"
+ msgstr "Chercher les informations météorologiques en ligne"
+
+-#: js/ui/dateMenu.js:641
++#: js/ui/dateMenu.js:642
+ msgid "Weather information is currently unavailable"
+ msgstr "Les informations météorologiques ne sont pas disponibles actuellement"
+
+-#: js/ui/dateMenu.js:651
++#: js/ui/dateMenu.js:652
+ msgid "Weather"
+ msgstr "Météo"
+
+-#: js/ui/dateMenu.js:653
++#: js/ui/dateMenu.js:654
+ msgid "Select weather location…"
+ msgstr "Choisir un emplacement pour la météo…"
+
+@@ -1339,8 +1241,7 @@ msgstr "Redémarrer et installer les mises à jour"
+ #: js/ui/endSessionDialog.js:104
+ #, javascript-format
+ msgid "The system will automatically restart and install updates in %d second."
+-msgid_plural ""
+-"The system will automatically restart and install updates in %d seconds."
++msgid_plural "The system will automatically restart and install updates in %d seconds."
+ msgstr[0] "Le système redémarrera automatiquement dans %d seconde."
+ msgstr[1] "Le système redémarrera automatiquement dans %d secondes."
+
+@@ -1372,20 +1273,15 @@ msgstr "Redémarrer et installer la mise à niveau"
+ msgid ""
+ "%s %s will be installed after restart. Upgrade installation can take a long "
+ "time: ensure that you have backed up and that the computer is plugged in."
+-msgstr ""
+-"%s %s sera installé après le redémarrage. L’installation d’une mise à niveau "
+-"peut prendre beaucoup de temps : vérifiez que vous disposez de sauvegardes "
+-"et que l’ordinateur est branché sur le secteur."
++msgstr "%s %s sera installé après le redémarrage. L’installation d’une mise à niveau peut prendre beaucoup de temps : vérifiez que vous disposez de sauvegardes et que l’ordinateur est branché sur le secteur."
+
+ #: js/ui/endSessionDialog.js:284
+ msgid "Low battery power: please plug in before installing updates."
+-msgstr ""
+-"Batterie faible : veuillez vous brancher avant d’installer les mises à jour."
++msgstr "Batterie faible : veuillez vous brancher avant d’installer les mises à jour."
+
+ #: js/ui/endSessionDialog.js:293
+ msgid "Some applications are busy or have unsaved work"
+-msgstr ""
+-"Certaines applications sont occupées ou des documents ne sont pas enregistrés"
++msgstr "Certaines applications sont occupées ou des documents ne sont pas enregistrés"
+
+ #: js/ui/endSessionDialog.js:298
+ msgid "Other users are logged in"
+@@ -1408,24 +1304,24 @@ msgstr "%s (distant)"
+ msgid "%s (console)"
+ msgstr "%s (console)"
+
+-#: js/ui/extensionDownloader.js:194
++#: js/ui/extensionDownloader.js:202
+ msgid "Install"
+ msgstr "Installer"
+
+-#: js/ui/extensionDownloader.js:200
++#: js/ui/extensionDownloader.js:208
+ msgid "Install Extension"
+ msgstr "Installer l’extension"
+
+-#: js/ui/extensionDownloader.js:201
++#: js/ui/extensionDownloader.js:209
+ #, javascript-format
+ msgid "Download and install “%s” from extensions.gnome.org?"
+ msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?"
+
+-#: js/ui/extensionSystem.js:253
++#: js/ui/extensionSystem.js:275
+ msgid "Extension Updates Available"
+ msgstr "Mises à jour d’extensions disponibles"
+
+-#: js/ui/extensionSystem.js:254
++#: js/ui/extensionSystem.js:276
+ msgid "Extension updates are ready to be installed."
+ msgstr "Des mises à jour d’extensions sont prêtes à être installées."
+
+@@ -1469,10 +1365,7 @@ msgstr "Touches lentes désactivées"
+ msgid ""
+ "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."
+-msgstr ""
+-"Vous venez d’appuyer pendant 8 secondes sur la touche Maj. Ceci est le "
+-"raccourci d’activation des touches lentes et affecte la façon dont votre "
+-"clavier réagit."
++msgstr "Vous venez d’appuyer pendant 8 secondes sur la touche Maj. Ceci est le raccourci d’activation des touches lentes et affecte la façon dont votre clavier réagit."
+
+ #: js/ui/kbdA11yDialog.js:40
+ msgid "Sticky Keys Turned On"
+@@ -1486,33 +1379,27 @@ msgstr "Touches rémanentes désactivées"
+ msgid ""
+ "You just pressed the Shift key 5 times in a row. This is the shortcut for "
+ "the Sticky Keys feature, which affects the way your keyboard works."
+-msgstr ""
+-"Vous venez d’appuyer 5 fois de suite sur la touche Maj. Ceci est le "
+-"raccourci d’activation des touches rémanentes et affecte la façon dont votre "
+-"clavier réagit."
++msgstr "Vous venez d’appuyer 5 fois de suite sur la touche Maj. Ceci est le raccourci d’activation des touches rémanentes et affecte la façon dont votre clavier réagit."
+
+ #: js/ui/kbdA11yDialog.js:45
+ msgid ""
+ "You just pressed two keys at once, or pressed the Shift key 5 times in a "
+ "row. This turns off the Sticky Keys feature, which affects the way your "
+ "keyboard works."
+-msgstr ""
+-"Vous venez d’appuyer sur deux touches en même temps, ou 5 fois de suite sur "
+-"la touche Maj. Ceci désactive la fonction touches rémanentes et affecte la "
+-"façon dont votre clavier réagit."
++msgstr "Vous venez d’appuyer sur deux touches en même temps, ou 5 fois de suite sur la touche Maj. Ceci désactive la fonction touches rémanentes et affecte la façon dont votre clavier réagit."
+
+ #: js/ui/kbdA11yDialog.js:54
+ msgid "Leave On"
+ msgstr "Laisser activé"
+
+ #: js/ui/kbdA11yDialog.js:54 js/ui/status/bluetooth.js:156
+-#: js/ui/status/network.js:1321
++#: js/ui/status/network.js:1381
+ msgid "Turn On"
+ msgstr "Activer"
+
+ #: js/ui/kbdA11yDialog.js:62 js/ui/status/bluetooth.js:156
+ #: js/ui/status/network.js:166 js/ui/status/network.js:350
+-#: js/ui/status/network.js:1321 js/ui/status/network.js:1433
++#: js/ui/status/network.js:1381 js/ui/status/network.js:1493
+ #: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
+ #: js/ui/status/rfkill.js:110
+ msgid "Turn Off"
+@@ -1575,29 +1462,25 @@ msgstr "Afficher la source"
+ msgid "Web Page"
+ msgstr "Page Web"
+
+-#: js/ui/main.js:300
++#: js/ui/main.js:304
+ msgid "Logged in as a privileged user"
+ msgstr "Connecté en tant qu’utilisateur privilégié"
+
+-#: js/ui/main.js:301
++#: js/ui/main.js:305
+ msgid ""
+ "Running a session as a privileged user should be avoided for security "
+ "reasons. If possible, you should log in as a normal user."
+-msgstr ""
+-"Ouvrir une session en tant qu’utilisateur privilégié devrait être évité pour "
+-"des raisons de sécurité. Si possible, connectez-vous comme utilisateur "
+-"normal."
++msgstr "Ouvrir une session en tant qu’utilisateur privilégié devrait être évité pour des raisons de sécurité. Si possible, connectez-vous comme utilisateur normal."
+
+-#: js/ui/main.js:350
++#: js/ui/main.js:354
+ msgid "Screen Lock disabled"
+ msgstr "Verrouillage d’écran désactivé"
+
+-#: js/ui/main.js:351
++#: js/ui/main.js:355
+ msgid "Screen Locking requires the GNOME display manager."
+-msgstr ""
+-"Le verrouillage de l’écran nécessite le gestionnaire d’affichage GNOME."
++msgstr "Le verrouillage de l’écran nécessite le gestionnaire d’affichage GNOME."
+
+-#: js/ui/messageTray.js:1437
++#: js/ui/messageTray.js:1443
+ msgid "System Information"
+ msgstr "Informations du système"
+
+@@ -1621,13 +1504,13 @@ msgstr "Saisissez votre recherche"
+ msgid "Applications"
+ msgstr "Applications"
+
+-#: js/ui/overview.js:69
++#: js/ui/overview.js:58
+ msgid "Undo"
+ msgstr "Annuler"
+
+ #. Translators: This is the main view to select
+ #. activities. See also note for "Activities" string.
+-#: js/ui/overview.js:82
++#: js/ui/overview.js:71
+ msgid "Overview"
+ msgstr "Vue d’ensemble"
+
+@@ -1681,16 +1564,16 @@ msgstr "Quitter"
+
+ #. Translators: If there is no suitable word for "Activities"
+ #. in your language, you can use the word for "Overview".
+-#: js/ui/panel.js:395
++#: js/ui/panel.js:404
+ msgid "Activities"
+ msgstr "Activités"
+
+-#: js/ui/panel.js:666
++#: js/ui/panel.js:690
+ msgctxt "System menu in the top bar"
+ msgid "System"
+ msgstr "Système"
+
+-#: js/ui/panel.js:778
++#: js/ui/panel.js:808
+ msgid "Top Bar"
+ msgstr "Barre supérieure"
+
+@@ -1710,7 +1593,7 @@ msgstr "Le redémarrage n’est pas disponible sur Wayland"
+ msgid "Restarting…"
+ msgstr "Redémarrage…"
+
+-#: js/ui/screenShield.js:219
++#: js/ui/screenShield.js:221
+ msgid "GNOME needs to lock the screen"
+ msgstr "GNOME a besoin de verrouiller l’écran"
+
+@@ -1721,27 +1604,27 @@ msgstr "GNOME a besoin de verrouiller l’écran"
+ #.
+ #. XXX: another option is to kick the user into the gdm login
+ #. screen, where we're not affected by grabs
+-#: js/ui/screenShield.js:268 js/ui/screenShield.js:636
++#: js/ui/screenShield.js:270 js/ui/screenShield.js:638
+ msgid "Unable to lock"
+ msgstr "Impossible de verrouiller"
+
+-#: js/ui/screenShield.js:269 js/ui/screenShield.js:637
++#: js/ui/screenShield.js:271 js/ui/screenShield.js:639
+ msgid "Lock was blocked by an application"
+ msgstr "Le verrouillage a été bloqué par une application"
+
+-#: js/ui/screenshot.js:141
++#: js/ui/screenshot.js:155
+ msgid "Screenshot taken"
+ msgstr "Capture d’écran effectuée"
+
+-#: js/ui/search.js:825
++#: js/ui/search.js:826
+ msgid "Searching…"
+ msgstr "Recherche…"
+
+-#: js/ui/search.js:827
++#: js/ui/search.js:828
+ msgid "No results."
+ msgstr "Aucun résultat."
+
+-#: js/ui/search.js:953
++#: js/ui/search.js:951
+ #, javascript-format
+ msgid "%d more"
+ msgid_plural "%d more"
+@@ -1789,9 +1672,7 @@ msgstr "Utilise des fichiers de clés"
+ #, javascript-format
+ msgid ""
+ "To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
+-msgstr ""
+-"Pour déverrouiller un volume qui utilise des fichiers de clés, utilisez "
+-"plutôt l’utilitaire <i>%s</i>."
++msgstr "Pour déverrouiller un volume qui utilise des fichiers de clés, utilisez plutôt l’utilitaire <i>%s</i>."
+
+ #: js/ui/shellMountOperation.js:306
+ msgid "PIM Number"
+@@ -1875,7 +1756,7 @@ msgstr "Grand texte"
+ msgid "Bluetooth"
+ msgstr "Bluetooth"
+
+-#: js/ui/status/bluetooth.js:49 js/ui/status/network.js:625
++#: js/ui/status/bluetooth.js:49 js/ui/status/network.js:652
+ msgid "Bluetooth Settings"
+ msgstr "Paramètres Bluetooth"
+
+@@ -1963,16 +1844,14 @@ msgstr "L’application %s souhaite accéder à votre emplacement géographique"
+
+ #: js/ui/status/location.js:362
+ msgid "Location access can be changed at any time from the privacy settings."
+-msgstr ""
+-"Les règles d’accès à la localisation peuvent à tout moment être modifiées "
+-"dans les paramètres de confidentialité."
++msgstr "Les règles d’accès à la localisation peuvent à tout moment être modifiées dans les paramètres de confidentialité."
+
+ #: js/ui/status/network.js:72
+ msgid "<unknown>"
+ msgstr "<inconnu>"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:455 js/ui/status/network.js:1350
++#: js/ui/status/network.js:455 js/ui/status/network.js:1410
+ #, javascript-format
+ msgid "%s Off"
+ msgstr "%s éteint"
+@@ -1998,7 +1877,7 @@ msgid "%s Disconnecting"
+ msgstr "Déconnexion de %s en cours"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:473 js/ui/status/network.js:1342
++#: js/ui/status/network.js:473 js/ui/status/network.js:1402
+ #, javascript-format
+ msgid "%s Connecting"
+ msgstr "Connexion de %s en cours"
+@@ -2033,142 +1912,142 @@ msgstr "Échec de connexion à %s"
+ msgid "Wired Settings"
+ msgstr "Paramètres filaire"
+
+-#: js/ui/status/network.js:546
++#: js/ui/status/network.js:550
+ msgid "Mobile Broadband Settings"
+ msgstr "Paramètres connexion mobile"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:592 js/ui/status/network.js:1347
++#: js/ui/status/network.js:619 js/ui/status/network.js:1407
+ #, javascript-format
+ msgid "%s Hardware Disabled"
+ msgstr "Équipement %s désactivé"
+
+ #. Translators: this is for a network device that cannot be activated
+ #. because it's disabled by rfkill (airplane mode); %s is a network identifier
+-#: js/ui/status/network.js:596
++#: js/ui/status/network.js:623
+ #, javascript-format
+ msgid "%s Disabled"
+ msgstr "%s désactivé"
+
+-#: js/ui/status/network.js:637
++#: js/ui/status/network.js:664
+ msgid "Connect to Internet"
+ msgstr "Se connecter à Internet"
+
+-#: js/ui/status/network.js:841
++#: js/ui/status/network.js:873
+ msgid "Airplane Mode is On"
+ msgstr "Le mode avion est activé"
+
+-#: js/ui/status/network.js:842
++#: js/ui/status/network.js:874
+ msgid "Wi-Fi is disabled when airplane mode is on."
+ msgstr "Le Wi-Fi est désactivé quand le mode avion est activé."
+
+-#: js/ui/status/network.js:843
++#: js/ui/status/network.js:875
+ msgid "Turn Off Airplane Mode"
+ msgstr "Désactiver le mode avion"
+
+-#: js/ui/status/network.js:852
++#: js/ui/status/network.js:884
+ msgid "Wi-Fi is Off"
+ msgstr "Le Wi-Fi est désactivé"
+
+-#: js/ui/status/network.js:853
++#: js/ui/status/network.js:885
+ msgid "Wi-Fi needs to be turned on in order to connect to a network."
+ msgstr "Le Wi-Fi a besoin d’être activé pour se connecter à un réseau."
+
+-#: js/ui/status/network.js:854
++#: js/ui/status/network.js:886
+ msgid "Turn On Wi-Fi"
+ msgstr "Activer le Wi-Fi"
+
+-#: js/ui/status/network.js:879
++#: js/ui/status/network.js:911
+ msgid "Wi-Fi Networks"
+ msgstr "Réseaux Wi-Fi"
+
+-#: js/ui/status/network.js:881
++#: js/ui/status/network.js:913
+ msgid "Select a network"
+ msgstr "Choisir un réseau"
+
+-#: js/ui/status/network.js:913
++#: js/ui/status/network.js:945
+ msgid "No Networks"
+ msgstr "Aucun réseau disponible"
+
+-#: js/ui/status/network.js:934 js/ui/status/rfkill.js:108
++#: js/ui/status/network.js:966 js/ui/status/rfkill.js:108
+ msgid "Use hardware switch to turn off"
+ msgstr "Utiliser l’interrupteur matériel pour éteindre"
+
+-#: js/ui/status/network.js:1211
++#: js/ui/status/network.js:1271
+ msgid "Select Network"
+ msgstr "Sélectionner un réseau"
+
+-#: js/ui/status/network.js:1217
++#: js/ui/status/network.js:1277
+ msgid "Wi-Fi Settings"
+ msgstr "Paramètres Wi-Fi"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:1338
++#: js/ui/status/network.js:1398
+ #, javascript-format
+ msgid "%s Hotspot Active"
+ msgstr "Point d’accès %s actif"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:1353
++#: js/ui/status/network.js:1413
+ #, javascript-format
+ msgid "%s Not Connected"
+ msgstr "%s non connecté"
+
+-#: js/ui/status/network.js:1450
++#: js/ui/status/network.js:1510
+ msgid "connecting…"
+ msgstr "connexion…"
+
+ #. Translators: this is for network connections that require some kind of key or password
+-#: js/ui/status/network.js:1453
++#: js/ui/status/network.js:1513
+ msgid "authentication required"
+ msgstr "authentification nécessaire"
+
+-#: js/ui/status/network.js:1455
++#: js/ui/status/network.js:1515
+ msgid "connection failed"
+ msgstr "échec de connexion"
+
+-#: js/ui/status/network.js:1506
++#: js/ui/status/network.js:1566
+ msgid "VPN Settings"
+ msgstr "Paramètres VPN"
+
+-#: js/ui/status/network.js:1523
++#: js/ui/status/network.js:1583
+ msgid "VPN"
+ msgstr "VPN"
+
+-#: js/ui/status/network.js:1533
++#: js/ui/status/network.js:1593
+ msgid "VPN Off"
+ msgstr "VPN désactivé"
+
+-#: js/ui/status/network.js:1594 js/ui/status/rfkill.js:84
++#: js/ui/status/network.js:1654 js/ui/status/rfkill.js:84
+ msgid "Network Settings"
+ msgstr "Paramètres du réseau"
+
+-#: js/ui/status/network.js:1622
++#: js/ui/status/network.js:1682
+ #, javascript-format
+ msgid "%s Wired Connection"
+ msgid_plural "%s Wired Connections"
+ msgstr[0] "%s connexion filaire."
+ msgstr[1] "%s connexions filaires."
+
+-#: js/ui/status/network.js:1626
++#: js/ui/status/network.js:1686
+ #, javascript-format
+ msgid "%s Wi-Fi Connection"
+ msgid_plural "%s Wi-Fi Connections"
+ msgstr[0] "%s connexion Wi-Fi."
+ msgstr[1] "%s connexions Wi-Fi."
+
+-#: js/ui/status/network.js:1630
++#: js/ui/status/network.js:1690
+ #, javascript-format
+ msgid "%s Modem Connection"
+ msgid_plural "%s Modem Connections"
+ msgstr[0] "%s connexion à un modem."
+ msgstr[1] "%s connexions à des modems."
+
+-#: js/ui/status/network.js:1764
++#: js/ui/status/network.js:1833
+ msgid "Connection failed"
+ msgstr "Échec de connexion"
+
+-#: js/ui/status/network.js:1765
++#: js/ui/status/network.js:1834
+ msgid "Activation of network connection failed"
+ msgstr "L’activation de la connexion réseau a échoué"
+
+@@ -2188,7 +2067,7 @@ msgstr "Reprendre"
+ msgid "Disable Until Tomorrow"
+ msgstr "Désactiver jusqu’à demain"
+
+-#: js/ui/status/power.js:51
++#: js/ui/status/power.js:51 js/ui/status/powerProfiles.js:57
+ msgid "Power Settings"
+ msgstr "Paramètres de gestion de l’énergie"
+
+@@ -2224,6 +2103,21 @@ msgstr "%d∶%02d avant chargement complet (%d %%)"
+ msgid "%d %%"
+ msgstr "%d %%"
+
++#: js/ui/status/powerProfiles.js:19
++msgctxt "Power profile"
++msgid "Performance"
++msgstr "Performances"
++
++#: js/ui/status/powerProfiles.js:20
++msgctxt "Power profile"
++msgid "Balanced"
++msgstr "Équilibré"
++
++#: js/ui/status/powerProfiles.js:21
++msgctxt "Power profile"
++msgid "Power Saver"
++msgstr "Economiseur d'énergie"
++
+ #: js/ui/status/remoteAccess.js:38
+ msgid "Screen is Being Shared"
+ msgstr "L’écran est partagé"
+@@ -2279,9 +2173,7 @@ msgstr "Périphérique Thunderbolt inconnu"
+ msgid ""
+ "New device has been detected while you were away. Please disconnect and "
+ "reconnect the device to start using it."
+-msgstr ""
+-"Un nouveau périphérique a été détecté pendant votre absence. Veuillez le "
+-"débrancher et rebrancher avant de commencer à l’utiliser."
++msgstr "Un nouveau périphérique a été détecté pendant votre absence. Veuillez le débrancher et rebrancher avant de commencer à l’utiliser."
+
+ #: js/ui/status/thunderbolt.js:328
+ msgid "Unauthorized Thunderbolt device"
+@@ -2290,9 +2182,7 @@ msgstr "Périphérique Thunderbolt non autorisé"
+ #: js/ui/status/thunderbolt.js:329
+ msgid ""
+ "New device has been detected and needs to be authorized by an administrator."
+-msgstr ""
+-"Un nouvel appareil a été détecté et a besoin d’être autorisé par un "
+-"administrateur."
++msgstr "Un nouvel appareil a été détecté et a besoin d’être autorisé par un administrateur."
+
+ #: js/ui/status/thunderbolt.js:335
+ msgid "Thunderbolt authorization error"
+@@ -2303,11 +2193,11 @@ msgstr "Erreur d’autorisation Thunderbolt"
+ msgid "Could not authorize the Thunderbolt device: %s"
+ msgstr "Impossible d’autoriser le périphérique Thunderbolt : %s"
+
+-#: js/ui/status/volume.js:160
++#: js/ui/status/volume.js:161
+ msgid "Volume changed"
+ msgstr "Volume modifié"
+
+-#: js/ui/status/volume.js:222
++#: js/ui/status/volume.js:223
+ msgid "Volume"
+ msgstr "Volume"
+
+@@ -2341,40 +2231,40 @@ msgstr "Intégré seulement"
+
+ #. Translators: This is a time format for a date in
+ #. long format
+-#: js/ui/unlockDialog.js:371
++#: js/ui/unlockDialog.js:380
+ msgid "%A %B %-d"
+ msgstr "%A %-d %B"
+
+-#: js/ui/unlockDialog.js:377
++#: js/ui/unlockDialog.js:386
+ msgid "Swipe up to unlock"
+ msgstr "Faire glisser vers le haut pour déverrouiller"
+
+-#: js/ui/unlockDialog.js:378
++#: js/ui/unlockDialog.js:387
+ msgid "Click or press a key to unlock"
+ msgstr "Cliquer ou appuyer sur une touche pour déverrouiller"
+
+-#: js/ui/unlockDialog.js:556
++#: js/ui/unlockDialog.js:572
+ msgid "Unlock Window"
+ msgstr "Fenêtre de déverrouillage"
+
+-#: js/ui/unlockDialog.js:565
++#: js/ui/unlockDialog.js:581
+ msgid "Log in as another user"
+ msgstr "Se connecter en tant qu’autre utilisateur"
+
+-#: js/ui/welcomeDialog.js:36
++#: js/ui/welcomeDialog.js:34
+ #, javascript-format
+-msgid "Welcome to GNOME %s"
+-msgstr "Bienvenue dans GNOME %s"
++msgid "Welcome to %s"
++msgstr "Bienvenue à %s"
+
+-#: js/ui/welcomeDialog.js:37
++#: js/ui/welcomeDialog.js:35
+ msgid "If you want to learn your way around, check out the tour."
+ msgstr "Si vous désirez en apprendre davantage, consultez la visite guidée."
+
+-#: js/ui/welcomeDialog.js:45
++#: js/ui/welcomeDialog.js:43
+ msgid "No Thanks"
+ msgstr "Non merci"
+
+-#: js/ui/welcomeDialog.js:50
++#: js/ui/welcomeDialog.js:48
+ msgid "Take Tour"
+ msgstr "Effectuer la visite guidée"
+
+@@ -2384,22 +2274,22 @@ msgid "“%s” is ready"
+ msgstr "« %s » est prêt"
+
+ #. Translators: This string should be shorter than 30 characters
+-#: js/ui/windowManager.js:63
++#: js/ui/windowManager.js:64
+ msgid "Keep these display settings?"
+ msgstr "Garder ces paramètres d’affichage ?"
+
+ #. Translators: this and the following message should be limited in length,
+ #. to avoid ellipsizing the labels.
+ #.
+-#: js/ui/windowManager.js:72
++#: js/ui/windowManager.js:73
+ msgid "Revert Settings"
+ msgstr "Restaurer les paramètres"
+
+-#: js/ui/windowManager.js:75
++#: js/ui/windowManager.js:76
+ msgid "Keep Changes"
+ msgstr "Conserver les modifications"
+
+-#: js/ui/windowManager.js:94
++#: js/ui/windowManager.js:95
+ #, javascript-format
+ msgid "Settings changes will revert in %d second"
+ msgid_plural "Settings changes will revert in %d seconds"
+@@ -2408,7 +2298,7 @@ msgstr[1] "Les paramètres seront restaurés dans %d secondes"
+
+ #. Translators: This represents the size of a window. The first number is
+ #. * the width of the window and the second is the height.
+-#: js/ui/windowManager.js:550
++#: js/ui/windowManager.js:551
+ #, javascript-format
+ msgid "%d × %d"
+ msgstr "%d × %d"
+@@ -2461,23 +2351,27 @@ msgstr "Déplacer vers l’espace de travail supérieur"
+ msgid "Move to Workspace Down"
+ msgstr "Déplacer vers l’espace de travail inférieur"
+
+-#: js/ui/windowMenu.js:132
++#: js/ui/windowMenu.js:123
++msgid "Move to another workspace"
++msgstr "Déplacer vers un autre espace de travail"
++
++#: js/ui/windowMenu.js:149
+ msgid "Move to Monitor Up"
+ msgstr "Déplacer vers l’écran du haut"
+
+-#: js/ui/windowMenu.js:141
++#: js/ui/windowMenu.js:158
+ msgid "Move to Monitor Down"
+ msgstr "Déplacer vers l’écran du bas"
+
+-#: js/ui/windowMenu.js:150
++#: js/ui/windowMenu.js:167
+ msgid "Move to Monitor Left"
+ msgstr "Déplacer vers l’écran de gauche"
+
+-#: js/ui/windowMenu.js:159
++#: js/ui/windowMenu.js:176
+ msgid "Move to Monitor Right"
+ msgstr "Déplacer vers l’écran de droite"
+
+-#: js/ui/windowMenu.js:167
++#: js/ui/windowMenu.js:184
+ msgid "Close"
+ msgstr "Fermer"
+
+@@ -2485,29 +2379,28 @@ msgstr "Fermer"
+ msgid "Evolution Calendar"
+ msgstr "Agenda d’Evolution"
+
+-#: src/main.c:419 subprojects/extensions-tool/src/main.c:317
++#: src/main.c:423 subprojects/extensions-tool/src/main.c:321
+ msgid "Print version"
+ msgstr "Afficher la version"
+
+-#: src/main.c:425
++#: src/main.c:429
+ msgid "Mode used by GDM for login screen"
+ msgstr "Mode utilisé par GDM pour l’écran de connexion"
+
+-#: src/main.c:431
++#: src/main.c:435
+ msgid "Use a specific mode, e.g. “gdm” for login screen"
+-msgstr ""
+-"Utiliser un mode particulier, par ex. « gdm » pour l’écran de connexion"
++msgstr "Utiliser un mode particulier, par ex. « gdm » pour l’écran de connexion"
+
+-#: src/main.c:437
++#: src/main.c:441
+ msgid "List possible modes"
+ msgstr "Lister les modes possibles"
+
+-#: src/shell-app.c:298
++#: src/shell-app.c:300
+ msgctxt "program"
+ msgid "Unknown"
+ msgstr "Inconnu"
+
+-#: src/shell-app.c:549
++#: src/shell-app.c:564
+ #, c-format
+ msgid "Failed to launch “%s”"
+ msgstr "Impossible de lancer « %s »"
+@@ -2544,10 +2437,7 @@ msgstr "Le projet GNOME"
+ msgid ""
+ "GNOME Extensions handles updating extensions, configuring extension "
+ "preferences and removing or disabling unwanted extensions."
+-msgstr ""
+-"Extensions de GNOME gère la mise à jour des extensions, la configuration des "
+-"préférences des extensions et la suppression ou la désactivation des "
+-"extensions non désirées."
++msgstr "Extensions de GNOME gère la mise à jour des extensions, la configuration des préférences des extensions et la suppression ou la désactivation des extensions non désirées."
+
+ #: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
+ msgid "Configure GNOME Shell Extensions"
+@@ -2567,9 +2457,7 @@ msgstr "Enlever « %s » ?"
+ msgid ""
+ "If you remove the extension, you need to return to download it if you want "
+ "to enable it again"
+-msgstr ""
+-"Si vous enlevez cette extension, vous devrez recommencer son téléchargement "
+-"si vous souhaitez la réactiver plus tard"
++msgstr "Si vous enlevez cette extension, vous devrez recommencer son téléchargement si vous souhaitez la réactiver plus tard"
+
+ #: subprojects/extensions-app/js/main.js:184
+ msgid "Remove"
+@@ -2577,8 +2465,7 @@ msgstr "Enlever"
+
+ #: subprojects/extensions-app/js/main.js:216
+ msgid "translator-credits"
+-msgstr ""
+-"Mathieu Bridon <bochecha@fedoraproject.org>\n"
++msgstr "Mathieu Bridon <bochecha@fedoraproject.org>\n"
+ "Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>\n"
+ "Bruno Brouard <annoa.b@gmail.com>\n"
+ "Cyril Arnaud <cyril dot arnaud at gmail dot com>\n"
+@@ -2643,11 +2530,9 @@ msgstr "À propos des extensions"
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:27
+ msgid ""
+-"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
+-"\">extensions.gnome.org</a>."
+-msgstr ""
+-"Pour trouver et ajouter des extensions, visitez <a href=\"https://extensions."
+-"gnome.org\">extensions.gnome.org</a>."
++"To find and add extensions, visit <a href=\"https://extensions.gnome."
++"org\">extensions.gnome.org</a>."
++msgstr "Pour trouver et ajouter des extensions, visitez <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:34
+ msgid "Warning"
+@@ -2658,10 +2543,7 @@ msgid ""
+ "Extensions can cause system issues, including performance problems. If you "
+ "encounter problems with your system, it is recommended to disable all "
+ "extensions."
+-msgstr ""
+-"Les extensions peuvent poser des problèmes au système, y compris au niveau "
+-"des performances. Si vous pensez être dans ce cas, il est recommandé de "
+-"désactiver toutes les extensions."
++msgstr "Les extensions peuvent poser des problèmes au système, y compris au niveau des performances. Si vous pensez être dans ce cas, il est recommandé de désactiver toutes les extensions."
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:150
+ msgid "Manually Installed"
+@@ -2679,10 +2561,7 @@ msgstr "Aucune extension installée"
+ msgid ""
+ "We’re very sorry, but it was not possible to get the list of installed "
+ "extensions. Make sure you are logged into GNOME and try again."
+-msgstr ""
+-"Nous sommes désolés, mais il n’est pas possible d’obtenir la liste des "
+-"extensions installées. Vérifiez que vous êtes bien connecté à GNOME et "
+-"essayez encore une fois."
++msgstr "Nous sommes désolés, mais il n’est pas possible d’obtenir la liste des extensions installées. Vérifiez que vous êtes bien connecté à GNOME et essayez encore une fois."
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:288
+ msgid "Extension Updates Ready"
+@@ -2703,8 +2582,7 @@ msgstr "La nouvelle extension a bien été créée dans %s.\n"
+ msgid ""
+ "Name should be a very short (ideally descriptive) string.\n"
+ "Examples are: %s"
+-msgstr ""
+-"Le nom doit être une chaîne très courte (idéalement descriptive).\n"
++msgstr "Le nom doit être une chaîne très courte (idéalement descriptive).\n"
+ "Exemples : %s"
+
+ #: subprojects/extensions-tool/src/command-create.c:302
+@@ -2717,22 +2595,20 @@ msgstr "Nom"
+ msgid ""
+ "Description is a single-sentence explanation of what your extension does.\n"
+ "Examples are: %s"
+-msgstr ""
+-"La description est composée d’une seule phrase expliquant ce que fait votre "
+-"extension.\n"
++msgstr "La description est composée d’une seule phrase expliquant ce que fait votre extension.\n"
+ "Exemples : %s"
+
+ #: subprojects/extensions-tool/src/command-create.c:336
++#, c-format
+ msgid ""
+ "UUID is a globally-unique identifier for your extension.\n"
+ "This should be in the format of an email address (clicktofocus@janedoe."
+ "example.com)\n"
+-msgstr ""
+-"L’UUID est un identifiant globalement unique pour votre extension.\n"
+-"Son format doit correspondre à celui d’une adresse électronique "
+-"(clicpourfocus@toto.exemple.com)\n"
++msgstr "L’UUID est un identifiant globalement unique pour votre extension.\n"
++"Son format doit correspondre à celui d’une adresse électronique (clicpourfocus@toto.exemple.com)\n"
+
+ #: subprojects/extensions-tool/src/command-create.c:363
++#, c-format
+ msgid "Choose one of the available templates:\n"
+ msgstr "Sélectionnez un des modèles disponibles :\n"
+
+@@ -2790,6 +2666,7 @@ msgstr "Les champs UUID, nom et description sont obligatoires"
+ #: subprojects/extensions-tool/src/command-info.c:50
+ #: subprojects/extensions-tool/src/command-list.c:64
+ #: subprojects/extensions-tool/src/main.c:146
++#, c-format
+ msgid "Failed to connect to GNOME Shell\n"
+ msgstr "Erreur lors de la connexion à Shell de GNOME\n"
+
+@@ -2959,6 +2836,7 @@ msgid "Reset an extension"
+ msgstr "Réinitialiser une extension"
+
+ #: subprojects/extensions-tool/src/command-uninstall.c:49
++#, c-format
+ msgid "Cannot uninstall system extensions\n"
+ msgstr "Impossible de désinstaller les extensions système\n"
+
+@@ -2991,78 +2869,78 @@ msgstr "Auteur d’origine"
+ msgid "State"
+ msgstr "État"
+
+-#: subprojects/extensions-tool/src/main.c:290
++#: subprojects/extensions-tool/src/main.c:294
+ msgid "“version” takes no arguments"
+ msgstr "« version » ne prend pas de paramètre"
+
+-#: subprojects/extensions-tool/src/main.c:292
+-#: subprojects/extensions-tool/src/main.c:312
++#: subprojects/extensions-tool/src/main.c:296
++#: subprojects/extensions-tool/src/main.c:316
+ msgid "Usage:"
+ msgstr "Utilisation :"
+
+-#: subprojects/extensions-tool/src/main.c:295
++#: subprojects/extensions-tool/src/main.c:299
+ msgid "Print version information and exit."
+ msgstr "Afficher les informations de version et quitter."
+
+-#: subprojects/extensions-tool/src/main.c:310
+-#: subprojects/extensions-tool/src/main.c:313
++#: subprojects/extensions-tool/src/main.c:314
++#: subprojects/extensions-tool/src/main.c:317
+ msgid "COMMAND"
+ msgstr "COMMANDE"
+
+-#: subprojects/extensions-tool/src/main.c:313
++#: subprojects/extensions-tool/src/main.c:317
+ msgid "[ARGS…]"
+ msgstr "[PARAMÈTRES…]"
+
+-#: subprojects/extensions-tool/src/main.c:315
++#: subprojects/extensions-tool/src/main.c:319
+ msgid "Commands:"
+ msgstr "Commandes :"
+
+-#: subprojects/extensions-tool/src/main.c:316
++#: subprojects/extensions-tool/src/main.c:320
+ msgid "Print help"
+ msgstr "Afficher l’aide"
+
+-#: subprojects/extensions-tool/src/main.c:318
++#: subprojects/extensions-tool/src/main.c:322
+ msgid "Enable extension"
+ msgstr "Activer l’extension"
+
+-#: subprojects/extensions-tool/src/main.c:319
++#: subprojects/extensions-tool/src/main.c:323
+ msgid "Disable extension"
+ msgstr "Désactiver l’extension"
+
+-#: subprojects/extensions-tool/src/main.c:320
++#: subprojects/extensions-tool/src/main.c:324
+ msgid "Reset extension"
+ msgstr "Réinitialiser l’extension"
+
+-#: subprojects/extensions-tool/src/main.c:321
++#: subprojects/extensions-tool/src/main.c:325
+ msgid "Uninstall extension"
+ msgstr "Désinstaller l’extension"
+
+-#: subprojects/extensions-tool/src/main.c:322
++#: subprojects/extensions-tool/src/main.c:326
+ msgid "List extensions"
+ msgstr "Afficher la liste des extensions"
+
+-#: subprojects/extensions-tool/src/main.c:323
+-#: subprojects/extensions-tool/src/main.c:324
++#: subprojects/extensions-tool/src/main.c:327
++#: subprojects/extensions-tool/src/main.c:328
+ msgid "Show extension info"
+ msgstr "Afficher les infos de l’extension"
+
+-#: subprojects/extensions-tool/src/main.c:325
++#: subprojects/extensions-tool/src/main.c:329
+ msgid "Open extension preferences"
+ msgstr "Ouvrir les préférences de l’extension"
+
+-#: subprojects/extensions-tool/src/main.c:326
++#: subprojects/extensions-tool/src/main.c:330
+ msgid "Create extension"
+ msgstr "Créer une extension"
+
+-#: subprojects/extensions-tool/src/main.c:327
++#: subprojects/extensions-tool/src/main.c:331
+ msgid "Package extension"
+ msgstr "Mettre en paquet l’extension"
+
+-#: subprojects/extensions-tool/src/main.c:328
++#: subprojects/extensions-tool/src/main.c:332
+ msgid "Install extension bundle"
+ msgstr "Installer l’extension empaquetée"
+
+-#: subprojects/extensions-tool/src/main.c:330
++#: subprojects/extensions-tool/src/main.c:334
+ #, c-format
+ msgid "Use “%s” to get detailed help.\n"
+ msgstr "Utilisez « %s » pour obtenir une aide détaillée.\n"
+@@ -3105,6 +2983,16 @@ msgstr[1] "%u entrées"
+ msgid "System Sounds"
+ msgstr "Sons système"
+
++#~ msgid "Enable introspection API"
++#~ msgstr "Activer l’API d’introspection"
++
++#~ msgid ""
++#~ "Enables a D-Bus API that allows to introspect the application state of "
++#~ "the shell."
++#~ msgstr ""
++#~ "Active l’API D-Bus, qui permet d’introspecter l’état d’application du "
++#~ "shell."
++
+ #~ msgid "Failed to connect to GNOME Shell"
+ #~ msgstr "Impossible de se connecter à Shell de GNOME"
+
+@@ -3187,5 +3075,3 @@ msgstr "Sons système"
+ #~ msgid "Account Settings"
+ #~ msgstr "Paramètres du compte"
+
+-#~ msgid "Orientation Lock"
+-#~ msgstr "Verrouillage de l’orientation"
+diff --git a/po/ja.po b/po/ja.po
+index 39f227996..938ed3e03 100644
+--- a/po/ja.po
++++ b/po/ja.po
+@@ -15,8 +15,8 @@
+ msgid ""
+ msgstr ""
+ "Project-Id-Version: gnome-shell master\n"
+-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
+-"POT-Creation-Date: 2020-08-17 22:03+0000\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2023-01-19 16:43+0100\n"
+ "PO-Revision-Date: 2020-08-18 18:20+0900\n"
+ "Last-Translator: sicklylife <translation@sicklylife.jp>\n"
+ "Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
+@@ -66,9 +66,7 @@ msgstr "Alt-F2 から開発・テスト用の内部ツールを利用可能に
+ msgid ""
+ "Allows access to internal debugging and monitoring tools using the Alt-F2 "
+ "dialog."
+-msgstr ""
+-"Alt-F2 ダイアログを利用した内部のデバッグツールとモニターツールへのアクセスを"
+-"許可します。"
++msgstr "Alt-F2 ダイアログを利用した内部のデバッグツールとモニターツールへのアクセスを許可します。"
+
+ #: data/org.gnome.shell.gschema.xml.in:16
+ msgid "UUIDs of extensions to enable"
+@@ -80,30 +78,20 @@ msgid ""
+ "should be loaded. Any extension that wants to be loaded needs to be in this "
+ "list. You can also manipulate this list with the EnableExtension and "
+ "DisableExtension D-Bus methods on org.gnome.Shell."
+-msgstr ""
+-"GNOME Shell の拡張機能には UUID プロパティがあり、このキーは、ロードしたい拡"
+-"張機能の UUID のリストです。ロードしたい拡張機能はこのリストに含めなければな"
+-"りません。このリストは org.gnome.Shell の EnableExtensions や "
+-"DisableExtensions といった DBus メソッドでも操作できます。"
++msgstr "GNOME Shell の拡張機能には UUID プロパティがあり、このキーは、ロードしたい拡張機能の UUID のリストです。ロードしたい拡張機能はこのリストに含めなければなりません。このリストは org.gnome.Shell の EnableExtensions や DisableExtensions といった DBus メソッドでも操作できます。"
+
+ #: data/org.gnome.shell.gschema.xml.in:26
+ msgid "UUIDs of extensions to force disabling"
+ msgstr "強制的に無効にする拡張機能の UUID"
+
+ #: data/org.gnome.shell.gschema.xml.in:27
+-#, fuzzy
+ msgid ""
+ "GNOME Shell extensions have a UUID property; this key lists extensions which "
+ "should be disabled, even if loaded as part of the current mode. You can also "
+ "manipulate this list with the EnableExtension and DisableExtension D-Bus "
+ "methods on org.gnome.Shell. This key takes precedence over the “enabled-"
+ "extensions” setting."
+-msgstr ""
+-"GNOME Shell の拡張機能には UUID プロパティがあり、このキーは、現在のモードの"
+-"一部としてロードされる場合でも無効化したい拡張機能の UUID のリストです。この"
+-"リストは org.gnome.Shell の EnableExtensions や DisableExtensions といった "
+-"DBus メソッドでも操作できます。このキーは“enabled-extensions”の設定より優先さ"
+-"れます。"
++msgstr "GNOME Shell 拡張機能には UUID プロパティーがあります。このキーは、現在のモードの一部として読み込まれる場合でも無効にする必要のある拡張機能をリストします。また、org.gnome.Shell の EnableExtension および DisableExtension D-Bus メソッドを使用してこの一覧を操作することもできます。このキーは、enabled-extensions 設定よりも優先されます。"
+
+ #: data/org.gnome.shell.gschema.xml.in:37
+ msgid "Disable user extensions"
+@@ -113,9 +101,7 @@ msgstr "ユーザー拡張機能を無効化"
+ msgid ""
+ "Disable all extensions the user has enabled without affecting the “enabled-"
+ "extension” setting."
+-msgstr ""
+-"ユーザーが有効にした拡張機能をすべて無効にします。“enabled-extension”の設定値"
+-"には影響しません。"
++msgstr "ユーザーが有効にした拡張機能をすべて無効にします。“enabled-extension”の設定値には影響しません。"
+
+ #: data/org.gnome.shell.gschema.xml.in:45
+ msgid "Disables the validation of extension version compatibility"
+@@ -126,10 +112,7 @@ msgid ""
+ "GNOME Shell will only load extensions that claim to support the current "
+ "running version. Enabling this option will disable this check and try to "
+ "load all extensions regardless of the versions they claim to support."
+-msgstr ""
+-"通常は現在起動中の GNOME Shell のバージョンをサポートする拡張機能のみを読み込"
+-"みます。この設定を true にした場合、バージョンチェック機能が無効になり、拡張"
+-"機能のサポートバージョンに関係なく、すべての拡張機能を読み込みます。"
++msgstr "通常は現在起動中の GNOME Shell のバージョンをサポートする拡張機能のみを読み込みます。この設定を true にした場合、バージョンチェック機能が無効になり、拡張機能のサポートバージョンに関係なく、すべての拡張機能を読み込みます。"
+
+ #: data/org.gnome.shell.gschema.xml.in:54
+ msgid "List of desktop file IDs for favorite applications"
+@@ -142,260 +125,242 @@ msgid ""
+ msgstr "これらの ID で示されるアプリケーションは「お気に入り」に表示されます。"
+
+ #: data/org.gnome.shell.gschema.xml.in:62
+-msgid "App Picker View"
+-msgstr "アプリ一覧画面"
+-
+-#: data/org.gnome.shell.gschema.xml.in:63
+-msgid "Index of the currently selected view in the application picker."
+-msgstr "現在のアプリケーション一覧画面のインデックスです。"
+-
+-#: data/org.gnome.shell.gschema.xml.in:69
+ msgid "History for command (Alt-F2) dialog"
+ msgstr "コマンド (Alt-F2) ダイアログの履歴"
+
+ #. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass
+-#: data/org.gnome.shell.gschema.xml.in:74
++#: data/org.gnome.shell.gschema.xml.in:67
+ msgid "History for the looking glass dialog"
+ msgstr "looking glass ダイアログの履歴"
+
+-#: data/org.gnome.shell.gschema.xml.in:78
++#: data/org.gnome.shell.gschema.xml.in:71
+ msgid "Always show the “Log out” menu item in the user menu."
+ msgstr "ユーザーメニューに「ログアウト」を常に表示する"
+
+-#: data/org.gnome.shell.gschema.xml.in:79
++#: data/org.gnome.shell.gschema.xml.in:72
+ msgid ""
+ "This key overrides the automatic hiding of the “Log out” menu item in single-"
+ "user, single-session situations."
+-msgstr ""
+-"このキーは、単一ユーザー、単一セッション状況で「ログアウト」メニューアイテム"
+-"を自動的に非表示にする機能よりも優先します。"
++msgstr "このキーは、単一ユーザー、単一セッション状況で「ログアウト」メニューアイテムを自動的に非表示にする機能よりも優先します。"
+
+-#: data/org.gnome.shell.gschema.xml.in:86
++#: data/org.gnome.shell.gschema.xml.in:79
+ msgid ""
+ "Whether to remember password for mounting encrypted or remote filesystems"
+-msgstr ""
+-"マウント対象の暗号化されたファイルシステムやリモートファイルシステムのパス"
+-"ワードを記憶する"
++msgstr "マウント対象の暗号化されたファイルシステムやリモートファイルシステムのパスワードを記憶する"
+
+-#: data/org.gnome.shell.gschema.xml.in:87
++#: data/org.gnome.shell.gschema.xml.in:80
+ msgid ""
+ "The shell will request a password when an encrypted device or a remote "
+ "filesystem is mounted. If the password can be saved for future use a "
+ "“Remember Password” checkbox will be present. This key sets the default "
+ "state of the checkbox."
+-msgstr ""
+-"GNOME Shell は、暗号化されたデバイスやリモートファイルシステムのマウント時に"
+-"パスワードを要求します。パスワードを保存できる場合は、「パスワードを保存」"
+-"チェックボックスが表示されます。このキーは、チェックボックスのデフォルト値と"
+-"なります。"
++msgstr "GNOME Shell は、暗号化されたデバイスやリモートファイルシステムのマウント時にパスワードを要求します。パスワードを保存できる場合は、「パスワードを保存」チェックボックスが表示されます。このキーは、チェックボックスのデフォルト値となります。"
+
+-#: data/org.gnome.shell.gschema.xml.in:96
++#: data/org.gnome.shell.gschema.xml.in:89
+ msgid ""
+ "Whether the default Bluetooth adapter had set up devices associated to it"
+-msgstr ""
+-"デフォルトの Bluetooth アダプターにデバイスが関連付けられているかどうか"
++msgstr "デフォルトの Bluetooth アダプターにデバイスが関連付けられているかどうか"
+
+-#: data/org.gnome.shell.gschema.xml.in:97
++#: data/org.gnome.shell.gschema.xml.in:90
+ msgid ""
+ "The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
+ "powered, or if there were devices set up associated with the default "
+ "adapter. This will be reset if the default adapter is ever seen not to have "
+ "devices associated to it."
+-msgstr ""
+-"Bluetooth アダプターの電源がオンになっているか、あるいはデフォルトのアダプ"
+-"ターに関連付けられたデバイスがある場合にのみ、GNOME Shell は Bluetooth メ"
+-"ニューを表示します。デフォルトのアダプターに関連付けられたデバイスがなくなっ"
+-"た場合に、この値はリセットされます。"
++msgstr "Bluetooth アダプターの電源がオンになっているか、あるいはデフォルトのアダプターに関連付けられたデバイスがある場合にのみ、GNOME Shell は Bluetooth メニューを表示します。デフォルトのアダプターに関連付けられたデバイスがなくなった場合に、この値はリセットされます。"
+
+-#: data/org.gnome.shell.gschema.xml.in:106
+-msgid "Enable introspection API"
+-msgstr "イントロスペクション API を有効にする"
++#: data/org.gnome.shell.gschema.xml.in:99
++msgid "The last version the “Welcome to GNOME” dialog was shown for"
++msgstr "「Welcome to GNOME」ダイアログが表示された最後のバージョン"
+
+-#: data/org.gnome.shell.gschema.xml.in:107
++#: data/org.gnome.shell.gschema.xml.in:100
+ msgid ""
+-"Enables a D-Bus API that allows to introspect the application state of the "
+-"shell."
+-msgstr ""
+-"Shell のアプリケーション状態をイントロスペクトできる D-Bus API を有効にしま"
+-"す。"
++"This key determines for which version the “Welcome to GNOME” dialog was last "
++"shown. An empty string represents the oldest possible version, and a huge "
++"number will represent versions that do not exist yet. This huge number can "
++"be used to effectively disable the dialog."
++msgstr "このキーは、Welcome to GNOME ダイアログが最後に表示されたバージョンを判断します。空の文字列は、最も古いバージョンを、大きい数値の場合はまだ存在しないバージョンを表します。この大きい数値を使用して、ダイアログを実質的に無効にすることができます。"
+
+-#: data/org.gnome.shell.gschema.xml.in:114
++#: data/org.gnome.shell.gschema.xml.in:133
+ msgid "Layout of the app picker"
+-msgstr ""
++msgstr "アプリケーションピッカーのレイアウト"
+
+-#: data/org.gnome.shell.gschema.xml.in:115
++#: data/org.gnome.shell.gschema.xml.in:134
+ msgid ""
+ "Layout of the app picker. Each entry in the array is a page. Pages are "
+ "stored in the order they appear in GNOME Shell. Each page contains an "
+ "“application id” → 'data' pair. Currently, the following values are stored "
+ "as 'data': • “position”: the position of the application icon in the page"
+-msgstr ""
++msgstr "アプリケーションピッカーのレイアウトです。アレイの各エントリーはページです。ページは、GNOME Shell に表示される順序で保存されます。各ページにはアプリケーション ID → データのペアが含まれます。現時点では、以下の値は data': • \"position\": (ページのアプリケーションアイコンの位置) として保存されます。"
+
+-#: data/org.gnome.shell.gschema.xml.in:130
++#: data/org.gnome.shell.gschema.xml.in:149
+ msgid "Keybinding to open the application menu"
+ msgstr "アプリケーションメニューを開くキーバインド"
+
+-#: data/org.gnome.shell.gschema.xml.in:131
++#: data/org.gnome.shell.gschema.xml.in:150
+ msgid "Keybinding to open the application menu."
+ msgstr "アプリケーションメニューを開くキーバインドです。"
+
+-#: data/org.gnome.shell.gschema.xml.in:137
++#: data/org.gnome.shell.gschema.xml.in:156
++#: data/org.gnome.shell.gschema.xml.in:163
++msgid "Keybinding to shift between overview states"
++msgstr "別の状態に移動するキーバインド"
++
++#: data/org.gnome.shell.gschema.xml.in:157
++msgid "Keybinding to shift between session, window picker and app grid"
++msgstr "セッション、ウィンドウ選択、およびアプリケーショングリッドの間を移動するキーバインド"
++
++#: data/org.gnome.shell.gschema.xml.in:164
++msgid "Keybinding to shift between app grid, window picker and session"
++msgstr "アプリケーショングリッド、ウィンドウ選択、およびセッションの間を移動するキーバインド"
++
++#: data/org.gnome.shell.gschema.xml.in:170
+ msgid "Keybinding to open the “Show Applications” view"
+ msgstr "アプリケーション一覧を開くキーバインド"
+
+-#: data/org.gnome.shell.gschema.xml.in:138
++#: data/org.gnome.shell.gschema.xml.in:171
+ msgid ""
+ "Keybinding to open the “Show Applications” view of the Activities Overview."
+ msgstr "アプリケーション一覧を開くキーバインドです。"
+
+-#: data/org.gnome.shell.gschema.xml.in:145
++#: data/org.gnome.shell.gschema.xml.in:178
+ msgid "Keybinding to open the overview"
+ msgstr "アクティビティ画面を開くキーバインド"
+
+-#: data/org.gnome.shell.gschema.xml.in:146
++#: data/org.gnome.shell.gschema.xml.in:179
+ msgid "Keybinding to open the Activities Overview."
+ msgstr "アクティビティ画面を開くキーバインドです。"
+
+-#: data/org.gnome.shell.gschema.xml.in:152
++#: data/org.gnome.shell.gschema.xml.in:185
+ msgid "Keybinding to toggle the visibility of the notification list"
+ msgstr "通知リストの表示/非表示を切り替えるキーバインド"
+
+-#: data/org.gnome.shell.gschema.xml.in:153
++#: data/org.gnome.shell.gschema.xml.in:186
+ msgid "Keybinding to toggle the visibility of the notification list."
+ msgstr "通知リストの表示/非表示を切り替えるキーバインドです。"
+
+-#: data/org.gnome.shell.gschema.xml.in:159
++#: data/org.gnome.shell.gschema.xml.in:192
+ msgid "Keybinding to focus the active notification"
+ msgstr "アクティブな通知にフォーカスを当てるキーバインド"
+
+-#: data/org.gnome.shell.gschema.xml.in:160
++#: data/org.gnome.shell.gschema.xml.in:193
+ msgid "Keybinding to focus the active notification."
+ msgstr "アクティブな通知にフォーカスを当てるキーバインドです。"
+
+-#: data/org.gnome.shell.gschema.xml.in:166
++#: data/org.gnome.shell.gschema.xml.in:199
+ msgid "Switch to application 1"
+ msgstr "アプリケーション 1 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:170
++#: data/org.gnome.shell.gschema.xml.in:203
+ msgid "Switch to application 2"
+ msgstr "アプリケーション 2 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:174
++#: data/org.gnome.shell.gschema.xml.in:207
+ msgid "Switch to application 3"
+ msgstr "アプリケーション 3 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:178
++#: data/org.gnome.shell.gschema.xml.in:211
+ msgid "Switch to application 4"
+ msgstr "アプリケーション 4 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:182
++#: data/org.gnome.shell.gschema.xml.in:215
+ msgid "Switch to application 5"
+ msgstr "アプリケーション 5 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:186
++#: data/org.gnome.shell.gschema.xml.in:219
+ msgid "Switch to application 6"
+ msgstr "アプリケーション 6 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:190
++#: data/org.gnome.shell.gschema.xml.in:223
+ msgid "Switch to application 7"
+ msgstr "アプリケーション 7 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:194
++#: data/org.gnome.shell.gschema.xml.in:227
+ msgid "Switch to application 8"
+ msgstr "アプリケーション 8 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:198
++#: data/org.gnome.shell.gschema.xml.in:231
+ msgid "Switch to application 9"
+ msgstr "アプリケーション 9 に切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:207
+-#: data/org.gnome.shell.gschema.xml.in:234
++#: data/org.gnome.shell.gschema.xml.in:240
++#: data/org.gnome.shell.gschema.xml.in:267
+ msgid "Limit switcher to current workspace."
+ msgstr "スイッチャーを現在のワークスペース内に制限する"
+
+-#: data/org.gnome.shell.gschema.xml.in:208
++#: data/org.gnome.shell.gschema.xml.in:241
+ msgid ""
+ "If true, only applications that have windows on the current workspace are "
+ "shown in the switcher. Otherwise, all applications are included."
+-msgstr ""
+-"true に設定した場合、現在のワークスペースにウィンドウのあるアプリケーションだ"
+-"けをスイッチャーに表示します。false に設定した場合はすべてのアプリケーション"
+-"を表示します。"
++msgstr "true に設定した場合、現在のワークスペースにウィンドウのあるアプリケーションだけをスイッチャーに表示します。false に設定した場合はすべてのアプリケーションを表示します。"
+
+-#: data/org.gnome.shell.gschema.xml.in:225
++#: data/org.gnome.shell.gschema.xml.in:258
+ msgid "The application icon mode."
+ msgstr "アプリケーションアイコンモード"
+
+-#: data/org.gnome.shell.gschema.xml.in:226
++#: data/org.gnome.shell.gschema.xml.in:259
+ msgid ""
+ "Configures how the windows are shown in the switcher. Valid possibilities "
+ "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
+ "only” (shows only the application icon) or “both”."
+-msgstr ""
+-"ウィンドウスイッチャーでのウィンドウの表示方法を設定します。指定可能な値"
+-"は、“thumbnail-only”(ウィンドウのサムネイルを表示します)、“app-icon-only”(ア"
+-"プリケーションアイコンを表示します)、あるいは“both”です。"
++msgstr "ウィンドウスイッチャーでのウィンドウの表示方法を設定します。指定可能な値は、“thumbnail-only”(ウィンドウのサムネイルを表示します)、“app-icon-only”(アプリケーションアイコンを表示します)、あるいは“both”です。"
+
+-#: data/org.gnome.shell.gschema.xml.in:235
++#: data/org.gnome.shell.gschema.xml.in:268
+ msgid ""
+ "If true, only windows from the current workspace are shown in the switcher. "
+ "Otherwise, all windows are included."
+-msgstr ""
+-"true に設定した場合、現在のワークスペースのウィンドウだけをスイッチャーに表示"
+-"します。false に設定した場合はすべてのアプリケーションを表示します。"
++msgstr "true に設定した場合、現在のワークスペースのウィンドウだけをスイッチャーに表示します。false に設定した場合はすべてのアプリケーションを表示します。"
+
+-#: data/org.gnome.shell.gschema.xml.in:245
++#: data/org.gnome.shell.gschema.xml.in:278
+ msgid "Locations"
+-msgstr ""
++msgstr "場所"
+
+-#: data/org.gnome.shell.gschema.xml.in:246
++#: data/org.gnome.shell.gschema.xml.in:279
+ msgid "The locations to show in world clocks"
+-msgstr ""
++msgstr "世界時計に表示される場所"
+
+-#: data/org.gnome.shell.gschema.xml.in:256
++#: data/org.gnome.shell.gschema.xml.in:289
+ msgid "Automatic location"
+-msgstr ""
++msgstr "場所の自動設定"
+
+-#: data/org.gnome.shell.gschema.xml.in:257
++#: data/org.gnome.shell.gschema.xml.in:290
+ msgid "Whether to fetch the current location or not"
+-msgstr ""
++msgstr "現在の場所を取得するかどうか"
+
+-#: data/org.gnome.shell.gschema.xml.in:264
++#: data/org.gnome.shell.gschema.xml.in:297
+ msgid "Location"
+-msgstr ""
++msgstr "場所"
+
+-#: data/org.gnome.shell.gschema.xml.in:265
++#: data/org.gnome.shell.gschema.xml.in:298
+ msgid "The location for which to show a forecast"
+-msgstr ""
++msgstr "予測を表示する場所"
+
+-#: data/org.gnome.shell.gschema.xml.in:277
++#: data/org.gnome.shell.gschema.xml.in:310
+ msgid "Attach modal dialog to the parent window"
+ msgstr "モーダルダイアログを親ウィンドウに結び付ける"
+
+-#: data/org.gnome.shell.gschema.xml.in:278
+-#: data/org.gnome.shell.gschema.xml.in:287
+-#: data/org.gnome.shell.gschema.xml.in:295
+-#: data/org.gnome.shell.gschema.xml.in:303
+ #: data/org.gnome.shell.gschema.xml.in:311
++#: data/org.gnome.shell.gschema.xml.in:320
++#: data/org.gnome.shell.gschema.xml.in:328
++#: data/org.gnome.shell.gschema.xml.in:336
++#: data/org.gnome.shell.gschema.xml.in:344
+ msgid ""
+ "This key overrides the key in org.gnome.mutter when running GNOME Shell."
+-msgstr ""
+-"GNOME Shell 使用時は、 このキーが、org.gnome.mutter の同じキーよりも優先しま"
+-"す。"
++msgstr "GNOME Shell 使用時は、 このキーが、org.gnome.mutter の同じキーよりも優先します。"
+
+-#: data/org.gnome.shell.gschema.xml.in:286
++#: data/org.gnome.shell.gschema.xml.in:319
+ msgid "Enable edge tiling when dropping windows on screen edges"
+ msgstr "ウィンドウを画面の端に移動させたときにタイル状に配置する"
+
+-#: data/org.gnome.shell.gschema.xml.in:294
++#: data/org.gnome.shell.gschema.xml.in:327
+ msgid "Workspaces are managed dynamically"
+ msgstr "ワークスペースを動的に管理する"
+
+-#: data/org.gnome.shell.gschema.xml.in:302
++#: data/org.gnome.shell.gschema.xml.in:335
+ msgid "Workspaces only on primary monitor"
+ msgstr "プライマリモニターのみワークスペースを切り替える"
+
+-#: data/org.gnome.shell.gschema.xml.in:310
++#: data/org.gnome.shell.gschema.xml.in:343
+ msgid "Delay focus changes in mouse mode until the pointer stops moving"
+ msgstr "マウスモードにおけるフォーカス遷移をポインターが停止するまで遅延させる"
+
+@@ -403,60 +368,58 @@ msgstr "マウスモードにおけるフォーカス遷移をポインターが
+ msgid "Network Login"
+ msgstr "ネットワークログイン"
+
+-#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:224
++#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:28
++#: subprojects/extensions-app/data/ui/extensions-window.ui:241
+ msgid "Something’s gone wrong"
+ msgstr "何か問題が起きています"
+
+-#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
++#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:39
+ msgid ""
+ "We’re very sorry, but there’s been a problem: the settings for this "
+ "extension can’t be displayed. We recommend that you report the issue to the "
+ "extension authors."
+-msgstr ""
+-"大変申し訳ありませんが、拡張機能の設定を表示できない問題が発生しました。拡張"
+-"機能の作者に問題を報告することをお勧めします。"
++msgstr "大変申し訳ありませんが、拡張機能の設定を表示できない問題が発生しました。拡張機能の作者に問題を報告することをお勧めします。"
+
+-#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
++#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:64
+ msgid "Technical Details"
+ msgstr "技術的な詳細"
+
+-#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
++#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:106
+ msgid "Homepage"
+ msgstr "ホームページ"
+
+-#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
++#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:107
+ msgid "Visit extension homepage"
+ msgstr "拡張機能のホームページを開く"
+
+-#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
+-#: js/ui/components/networkAgent.js:111 js/ui/components/polkitAgent.js:139
+-#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:183
++#: js/gdm/authPrompt.js:150 js/ui/audioDeviceSelection.js:61
++#: js/ui/components/networkAgent.js:111 js/ui/components/polkitAgent.js:138
++#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:198
+ #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
+-#: js/ui/status/network.js:940 subprojects/extensions-app/js/main.js:149
++#: js/ui/status/network.js:978 subprojects/extensions-app/js/main.js:183
+ msgid "Cancel"
+ msgstr "キャンセル"
+
+ #. Cisco LEAP
+-#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:206
+-#: js/ui/components/networkAgent.js:222 js/ui/components/networkAgent.js:246
+-#: js/ui/components/networkAgent.js:267 js/ui/components/networkAgent.js:287
+-#: js/ui/components/networkAgent.js:297 js/ui/components/polkitAgent.js:277
++#: js/gdm/authPrompt.js:319 js/ui/components/networkAgent.js:210
++#: js/ui/components/networkAgent.js:226 js/ui/components/networkAgent.js:250
++#: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:291
++#: js/ui/components/networkAgent.js:301 js/ui/components/polkitAgent.js:275
+ #: js/ui/shellMountOperation.js:326
+ msgid "Password"
+ msgstr "パスワード"
+
+-#: js/gdm/loginDialog.js:318
++#: js/gdm/loginDialog.js:317
+ msgid "Choose Session"
+ msgstr "セッションを選択する"
+
+-#: js/gdm/loginDialog.js:457
++#: js/gdm/loginDialog.js:461
+ msgid "Not listed?"
+ msgstr "アカウントが見つかりませんか?"
+
+ #. Translators: this message is shown below the username entry field
+ #. to clue the user in on how to login to the local network realm
+-#: js/gdm/loginDialog.js:913
++#: js/gdm/loginDialog.js:926
+ #, javascript-format
+ msgid "(e.g., user or %s)"
+ msgstr "(たとえば、user あるいは %s)"
+@@ -464,184 +427,186 @@ msgstr "(たとえば、user あるいは %s)"
+ #. TTLS and PEAP are actually much more complicated, but this complication
+ #. is not visible here since we only care about phase2 authentication
+ #. (and don't even care of which one)
+-#: js/gdm/loginDialog.js:918 js/ui/components/networkAgent.js:242
+-#: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:283
++#: js/gdm/loginDialog.js:931 js/ui/components/networkAgent.js:246
++#: js/ui/components/networkAgent.js:269 js/ui/components/networkAgent.js:287
+ msgid "Username"
+ msgstr "ユーザー名"
+
+-#: js/gdm/loginDialog.js:1253
++#: js/gdm/loginDialog.js:1285
+ msgid "Login Window"
+ msgstr "ログインウィンドウ"
+
+-#: js/gdm/util.js:355
++#: js/gdm/util.js:441
+ msgid "Authentication error"
+ msgstr "認証エラー"
+
+-#. We don't show fingerprint messages directly since it's
+-#. not the main auth service. Instead we use the messages
+-#. as a cue to display our own message.
+ #. Translators: this message is shown below the password entry field
+-#. to indicate the user can swipe their finger instead
+-#: js/gdm/util.js:481
+-msgid "(or swipe finger)"
+-msgstr "(あるいは指でスワイプする)"
++#. to indicate the user can swipe their finger on the fingerprint reader
++#: js/gdm/util.js:622
++msgid "(or swipe finger across reader)"
++msgstr "(またはリーダーを指でスワイプする)"
++
++#. Translators: this message is shown below the password entry field
++#. to indicate the user can place their finger on the fingerprint reader instead
++#: js/gdm/util.js:627
++msgid "(or place finger on reader)"
++msgstr "(またはリーダーに指を置く)"
+
+ #. Translators: The name of the power-off action in search
+-#: js/misc/systemActions.js:91
++#: js/misc/systemActions.js:82
+ msgctxt "search-result"
+ msgid "Power Off"
+ msgstr "電源オフ"
+
+ #. Translators: A list of keywords that match the power-off action, separated by semicolons
+-#: js/misc/systemActions.js:94
++#: js/misc/systemActions.js:85
+ msgid "power off;shutdown;halt;stop"
+-msgstr ""
+-"power off;shutdown;halt;stop;電源オフ;パワーオフ;シャットダウン;停止;"
++msgstr "power off;shutdown;halt;stop;電源オフ;パワーオフ;シャットダウン;停止;"
+
+ #. Translators: The name of the restart action in search
+-#: js/misc/systemActions.js:99
++#: js/misc/systemActions.js:90
+ msgctxt "search-result"
+ msgid "Restart"
+ msgstr "再起動"
+
+ #. Translators: A list of keywords that match the restart action, separated by semicolons
+-#: js/misc/systemActions.js:102
++#: js/misc/systemActions.js:93
+ msgid "reboot;restart;"
+ msgstr "reboot;restart;リブート;リスタート;再起動;"
+
+ #. Translators: The name of the lock screen action in search
+-#: js/misc/systemActions.js:107
++#: js/misc/systemActions.js:98
+ msgctxt "search-result"
+ msgid "Lock Screen"
+ msgstr "画面ロック"
+
+ #. Translators: A list of keywords that match the lock screen action, separated by semicolons
+-#: js/misc/systemActions.js:110
++#: js/misc/systemActions.js:101
+ msgid "lock screen"
+ msgstr "lock screen;画面ロック"
+
+ #. Translators: The name of the logout action in search
+-#: js/misc/systemActions.js:115
++#: js/misc/systemActions.js:106
+ msgctxt "search-result"
+ msgid "Log Out"
+ msgstr "ログアウト"
+
+ #. Translators: A list of keywords that match the logout action, separated by semicolons
+-#: js/misc/systemActions.js:118
++#: js/misc/systemActions.js:109
+ msgid "logout;log out;sign off"
+ msgstr "logout;log out;sign off;ログアウト;サインオフ"
+
+ #. Translators: The name of the suspend action in search
+-#: js/misc/systemActions.js:123
++#: js/misc/systemActions.js:114
+ msgctxt "search-result"
+ msgid "Suspend"
+ msgstr "サスペンド"
+
+ #. Translators: A list of keywords that match the suspend action, separated by semicolons
+-#: js/misc/systemActions.js:126
++#: js/misc/systemActions.js:117
+ msgid "suspend;sleep"
+ msgstr "suspend;sleep;サスペンド;スリープ"
+
+ #. Translators: The name of the switch user action in search
+-#: js/misc/systemActions.js:131
++#: js/misc/systemActions.js:122
+ msgctxt "search-result"
+ msgid "Switch User"
+ msgstr "ユーザーを切り替え"
+
+ #. Translators: A list of keywords that match the switch user action, separated by semicolons
+-#: js/misc/systemActions.js:134
++#: js/misc/systemActions.js:125
+ msgid "switch user"
+ msgstr "switch user;ユーザー切り替え"
+
+ #. Translators: A list of keywords that match the lock orientation action, separated by semicolons
+-#: js/misc/systemActions.js:141
++#: js/misc/systemActions.js:132
+ msgid "lock orientation;unlock orientation;screen;rotation"
+-msgstr ""
++msgstr "lock orientation;unlock orientation;screen;rotation画面回転のロック;画面回転のロック解除;画面の方向;画面;回転"
+
+-#: js/misc/systemActions.js:266
++#: js/misc/systemActions.js:232
+ msgctxt "search-result"
+ msgid "Unlock Screen Rotation"
+ msgstr "画面の回転をロック解除"
+
+-#: js/misc/systemActions.js:267
++#: js/misc/systemActions.js:233
+ msgctxt "search-result"
+ msgid "Lock Screen Rotation"
+ msgstr "画面の回転をロック"
+
+-#: js/misc/util.js:120
++#: js/misc/util.js:121
+ msgid "Command not found"
+ msgstr "コマンドが見つかりませんでした"
+
+ #. Replace "Error invoking GLib.shell_parse_argv: " with
+ #. something nicer
+-#: js/misc/util.js:156
++#: js/misc/util.js:157
+ msgid "Could not parse command:"
+ msgstr "コマンドを解析できませんでした:"
+
+-#: js/misc/util.js:164
++#: js/misc/util.js:165
+ #, javascript-format
+ msgid "Execution of “%s” failed:"
+ msgstr "“%s”の実行に失敗しました:"
+
+-#: js/misc/util.js:181
++#: js/misc/util.js:182
+ msgid "Just now"
+ msgstr "たった今"
+
+-#: js/misc/util.js:183
++#: js/misc/util.js:184
+ #, javascript-format
+ msgid "%d minute ago"
+ msgid_plural "%d minutes ago"
+ msgstr[0] "%d 分前"
+
+-#: js/misc/util.js:187
++#: js/misc/util.js:188
+ #, javascript-format
+ msgid "%d hour ago"
+ msgid_plural "%d hours ago"
+ msgstr[0] "%d 時間前"
+
+-#: js/misc/util.js:191 js/ui/dateMenu.js:162
++#: js/misc/util.js:192 js/ui/dateMenu.js:163
+ msgid "Yesterday"
+ msgstr "昨日"
+
+-#: js/misc/util.js:193
++#: js/misc/util.js:194
+ #, javascript-format
+ msgid "%d day ago"
+ msgid_plural "%d days ago"
+ msgstr[0] "%d 日前"
+
+-#: js/misc/util.js:197
++#: js/misc/util.js:198
+ #, javascript-format
+ msgid "%d week ago"
+ msgid_plural "%d weeks ago"
+ msgstr[0] "%d 週間前"
+
+-#: js/misc/util.js:201
++#: js/misc/util.js:202
+ #, javascript-format
+ msgid "%d month ago"
+ msgid_plural "%d months ago"
+ msgstr[0] "%d ヶ月前"
+
+-#: js/misc/util.js:204
++#: js/misc/util.js:205
+ #, javascript-format
+ msgid "%d year ago"
+ msgid_plural "%d years ago"
+ msgstr[0] "%d 年前"
+
+ #. Translators: Time in 24h format
+-#: js/misc/util.js:237
++#: js/misc/util.js:238
+ msgid "%H∶%M"
+ msgstr "%H:%M"
+
+ #. Translators: this is the word "Yesterday" followed by a
+ #. time string in 24h format. i.e. "Yesterday, 14:30"
+-#: js/misc/util.js:243
++#: js/misc/util.js:244
+ #, no-c-format
+ msgid "Yesterday, %H∶%M"
+ msgstr "昨日 %H:%M"
+
+ #. Translators: this is the week day name followed by a time
+ #. string in 24h format. i.e. "Monday, 14:30"
+-#: js/misc/util.js:249
++#: js/misc/util.js:250
+ #, no-c-format
+ msgid "%A, %H∶%M"
+ msgstr "%A %H:%M"
+@@ -649,7 +614,7 @@ msgstr "%A %H:%M"
+ #. Translators: this is the month name and day number
+ #. followed by a time string in 24h format.
+ #. i.e. "May 25, 14:30"
+-#: js/misc/util.js:255
++#: js/misc/util.js:256
+ #, no-c-format
+ msgid "%B %-d, %H∶%M"
+ msgstr "%B%-e日 %H:%M"
+@@ -657,7 +622,7 @@ msgstr "%B%-e日 %H:%M"
+ #. Translators: this is the month name, day number, year
+ #. number followed by a time string in 24h format.
+ #. i.e. "May 25 2012, 14:30"
+-#: js/misc/util.js:261
++#: js/misc/util.js:262
+ #, no-c-format
+ msgid "%B %-d %Y, %H∶%M"
+ msgstr "%Y年%B%-e日 %H:%M"
+@@ -665,20 +630,20 @@ msgstr "%Y年%B%-e日 %H:%M"
+ #. Show only the time if date is on today
+ #. eslint-disable-line no-lonely-if
+ #. Translators: Time in 12h format
+-#: js/misc/util.js:266
++#: js/misc/util.js:267
+ msgid "%l∶%M %p"
+ msgstr "%p %l:%M"
+
+ #. Translators: this is the word "Yesterday" followed by a
+ #. time string in 12h format. i.e. "Yesterday, 2:30 pm"
+-#: js/misc/util.js:272
++#: js/misc/util.js:273
+ #, no-c-format
+ msgid "Yesterday, %l∶%M %p"
+ msgstr "昨日 %p %l:%M"
+
+ #. Translators: this is the week day name followed by a time
+ #. string in 12h format. i.e. "Monday, 2:30 pm"
+-#: js/misc/util.js:278
++#: js/misc/util.js:279
+ #, no-c-format
+ msgid "%A, %l∶%M %p"
+ msgstr "%A %p %l:%M"
+@@ -686,7 +651,7 @@ msgstr "%A %p %l:%M"
+ #. Translators: this is the month name and day number
+ #. followed by a time string in 12h format.
+ #. i.e. "May 25, 2:30 pm"
+-#: js/misc/util.js:284
++#: js/misc/util.js:285
+ #, no-c-format
+ msgid "%B %-d, %l∶%M %p"
+ msgstr "%B%-e日 %p %l:%M"
+@@ -694,23 +659,21 @@ msgstr "%B%-e日 %p %l:%M"
+ #. Translators: this is the month name, day number, year
+ #. number followed by a time string in 12h format.
+ #. i.e. "May 25 2012, 2:30 pm"
+-#: js/misc/util.js:290
++#: js/misc/util.js:291
+ #, no-c-format
+ msgid "%B %-d %Y, %l∶%M %p"
+ msgstr "%Y年%B%-e日 %p %l:%M"
+
+ #. TRANSLATORS: this is the title of the wifi captive portal login window
+-#: js/portalHelper/main.js:41
++#: js/portalHelper/main.js:42
+ msgid "Hotspot Login"
+ msgstr "ホットスポットログイン"
+
+-#: js/portalHelper/main.js:87
++#: js/portalHelper/main.js:88
+ msgid ""
+ "Your connection to this hotspot login is not secure. Passwords or other "
+ "information you enter on this page can be viewed by people nearby."
+-msgstr ""
+-"このホットスポットログインの接続は安全ではありません。このページであなたが入"
+-"力したパスワードなどの情報は、近くにいる人に知られてしまう恐れがあります。"
++msgstr "このホットスポットログインの接続は安全ではありません。このページであなたが入力したパスワードなどの情報は、近くにいる人に知られてしまう恐れがあります。"
+
+ #. No support for non-modal system dialogs, so ignore the option
+ #. let modal = options['modal'] || true;
+@@ -722,45 +685,45 @@ msgstr "拒否"
+ msgid "Grant Access"
+ msgstr "許可"
+
+-#: js/ui/appDisplay.js:1297
++#: js/ui/appDisplay.js:1862
+ msgid "Unnamed Folder"
+ msgstr "名前なしのフォルダー"
+
+ #. Translators: This is the heading of a list of open windows
+-#: js/ui/appDisplay.js:2766 js/ui/panel.js:75
++#: js/ui/appDisplay.js:3455 js/ui/panel.js:33
+ msgid "Open Windows"
+ msgstr "開いているウィンドウ"
+
+-#: js/ui/appDisplay.js:2785 js/ui/panel.js:82
++#: js/ui/appDisplay.js:3474 js/ui/panel.js:41
+ msgid "New Window"
+ msgstr "新しいウィンドウで開く"
+
+-#: js/ui/appDisplay.js:2801
++#: js/ui/appDisplay.js:3490
+ msgid "Launch using Integrated Graphics Card"
+ msgstr "統合グラフィックカードを使用して起動"
+
+-#: js/ui/appDisplay.js:2802
++#: js/ui/appDisplay.js:3491
+ msgid "Launch using Discrete Graphics Card"
+ msgstr "ディスクリートグラフィックカードを使用して起動"
+
+-#: js/ui/appDisplay.js:2830 js/ui/dash.js:239
++#: js/ui/appDisplay.js:3520 js/ui/dash.js:245
+ msgid "Remove from Favorites"
+ msgstr "お気に入りから削除"
+
+-#: js/ui/appDisplay.js:2836
++#: js/ui/appDisplay.js:3526
+ msgid "Add to Favorites"
+ msgstr "お気に入りに追加"
+
+-#: js/ui/appDisplay.js:2846 js/ui/panel.js:93
++#: js/ui/appDisplay.js:3536 js/ui/panel.js:52
+ msgid "Show Details"
+ msgstr "詳細を表示"
+
+-#: js/ui/appFavorites.js:164
++#: js/ui/appFavorites.js:165
+ #, javascript-format
+ msgid "%s has been added to your favorites."
+ msgstr "%s をお気に入りに追加しました。"
+
+-#: js/ui/appFavorites.js:197
++#: js/ui/appFavorites.js:198
+ #, javascript-format
+ msgid "%s has been removed from your favorites."
+ msgstr "%s をお気に入りから削除しました。"
+@@ -769,19 +732,19 @@ msgstr "%s をお気に入りから削除しました。"
+ msgid "Select Audio Device"
+ msgstr "オーディオデバイスを選択"
+
+-#: js/ui/audioDeviceSelection.js:54
++#: js/ui/audioDeviceSelection.js:56
+ msgid "Sound Settings"
+ msgstr "サウンド設定"
+
+-#: js/ui/audioDeviceSelection.js:64
++#: js/ui/audioDeviceSelection.js:69
+ msgid "Headphones"
+ msgstr "ヘッドフォン"
+
+-#: js/ui/audioDeviceSelection.js:66
++#: js/ui/audioDeviceSelection.js:71
+ msgid "Headset"
+ msgstr "ヘッドセット"
+
+-#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
++#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:278
+ msgid "Microphone"
+ msgstr "マイク"
+
+@@ -798,7 +761,7 @@ msgid "Settings"
+ msgstr "設定"
+
+ #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
+-#: js/ui/calendar.js:36
++#: js/ui/calendar.js:35
+ msgctxt "calendar-no-work"
+ msgid "06"
+ msgstr "06"
+@@ -808,43 +771,43 @@ msgstr "06"
+ #. * NOTE: These grid abbreviations are always shown together
+ #. * and in order, e.g. "S M T W T F S".
+ #.
+-#: js/ui/calendar.js:65
++#: js/ui/calendar.js:61
+ msgctxt "grid sunday"
+ msgid "S"
+ msgstr "日"
+
+ #. Translators: Calendar grid abbreviation for Monday
+-#: js/ui/calendar.js:67
++#: js/ui/calendar.js:63
+ msgctxt "grid monday"
+ msgid "M"
+ msgstr "月"
+
+ #. Translators: Calendar grid abbreviation for Tuesday
+-#: js/ui/calendar.js:69
++#: js/ui/calendar.js:65
+ msgctxt "grid tuesday"
+ msgid "T"
+ msgstr "火"
+
+ #. Translators: Calendar grid abbreviation for Wednesday
+-#: js/ui/calendar.js:71
++#: js/ui/calendar.js:67
+ msgctxt "grid wednesday"
+ msgid "W"
+ msgstr "水"
+
+ #. Translators: Calendar grid abbreviation for Thursday
+-#: js/ui/calendar.js:73
++#: js/ui/calendar.js:69
+ msgctxt "grid thursday"
+ msgid "T"
+ msgstr "木"
+
+ #. Translators: Calendar grid abbreviation for Friday
+-#: js/ui/calendar.js:75
++#: js/ui/calendar.js:71
+ msgctxt "grid friday"
+ msgid "F"
+ msgstr "金"
+
+ #. Translators: Calendar grid abbreviation for Saturday
+-#: js/ui/calendar.js:77
++#: js/ui/calendar.js:73
+ msgctxt "grid saturday"
+ msgid "S"
+ msgstr "土"
+@@ -857,7 +820,7 @@ msgstr "土"
+ #. * "%OB" is the new format specifier introduced in glibc 2.27,
+ #. * in most cases you should not change it.
+ #.
+-#: js/ui/calendar.js:392
++#: js/ui/calendar.js:400
+ msgid "%OB"
+ msgstr "%B"
+
+@@ -870,37 +833,37 @@ msgstr "%B"
+ #. * in most cases you should not use the old "%B" here unless you
+ #. * absolutely know what you are doing.
+ #.
+-#: js/ui/calendar.js:402
++#: js/ui/calendar.js:410
+ msgid "%OB %Y"
+ msgstr "%Y年%B"
+
+-#: js/ui/calendar.js:461
++#: js/ui/calendar.js:469
+ msgid "Previous month"
+ msgstr "先月"
+
+-#: js/ui/calendar.js:476
++#: js/ui/calendar.js:484
+ msgid "Next month"
+ msgstr "来月"
+
+-#: js/ui/calendar.js:626
++#: js/ui/calendar.js:632
+ #, no-javascript-format
+ msgctxt "date day number format"
+ msgid "%d"
+ msgstr "%d"
+
+-#: js/ui/calendar.js:682
++#: js/ui/calendar.js:688
+ msgid "Week %V"
+ msgstr "第 %V 週"
+
+-#: js/ui/calendar.js:895
++#: js/ui/calendar.js:902
+ msgid "No Notifications"
+ msgstr "通知なし"
+
+-#: js/ui/calendar.js:949
++#: js/ui/calendar.js:956
+ msgid "Do Not Disturb"
+ msgstr "通知ポップアップを表示しない"
+
+-#: js/ui/calendar.js:968
++#: js/ui/calendar.js:977
+ msgid "Clear"
+ msgstr "消去"
+
+@@ -914,8 +877,7 @@ msgstr "“%s”の応答がありません。"
+ msgid ""
+ "You may choose to wait a short while for it to continue or force the "
+ "application to quit entirely."
+-msgstr ""
+-"もうしばらく応答を待ちますか? それともアプリケーションを強制的に終了しますか?"
++msgstr "もうしばらく応答を待ちますか? それともアプリケーションを強制的に終了しますか?"
+
+ #: js/ui/closeDialog.js:70
+ msgid "Force Quit"
+@@ -925,22 +887,21 @@ msgstr "強制終了"
+ msgid "Wait"
+ msgstr "応答を待つ"
+
+-#: js/ui/components/automountManager.js:86
++#: js/ui/components/automountManager.js:85
+ msgid "External drive connected"
+ msgstr "外付けドライブが接続されました"
+
+-#: js/ui/components/automountManager.js:98
++#: js/ui/components/automountManager.js:97
+ msgid "External drive disconnected"
+ msgstr "外付けドライブが外されました"
+
+-#: js/ui/components/automountManager.js:208
++#: js/ui/components/automountManager.js:206
+ msgid "Unable to unlock volume"
+ msgstr "ボリュームをロック解除できません"
+
+-#: js/ui/components/automountManager.js:209
++#: js/ui/components/automountManager.js:207
+ msgid "The installed udisks version does not support the PIM setting"
+-msgstr ""
+-"インストールされているバージョンの udisks は PIM の設定に対応していません"
++msgstr "インストールされているバージョンの udisks は PIM の設定に対応していません"
+
+ #: js/ui/components/autorunManager.js:332
+ #, javascript-format
+@@ -952,76 +913,75 @@ msgid ""
+ "Alternatively you can connect by pushing the “WPS” button on your router."
+ msgstr "または、ルーターの“WPS”ボタンを押して接続する方法もあります。"
+
+-#: js/ui/components/networkAgent.js:105 js/ui/status/network.js:252
+-#: js/ui/status/network.js:343 js/ui/status/network.js:943
++#: js/ui/components/networkAgent.js:105 js/ui/status/network.js:258
++#: js/ui/status/network.js:349 js/ui/status/network.js:981
+ msgid "Connect"
+ msgstr "接続"
+
+-#: js/ui/components/networkAgent.js:212
++#: js/ui/components/networkAgent.js:216
+ msgid "Key"
+ msgstr "キー"
+
+-#: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:273
++#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:277
+ msgid "Private key password"
+ msgstr "秘密鍵のパスワード"
+
+-#: js/ui/components/networkAgent.js:271
++#: js/ui/components/networkAgent.js:275
+ msgid "Identity"
+ msgstr "Identity"
+
+-#: js/ui/components/networkAgent.js:285
++#: js/ui/components/networkAgent.js:289
+ msgid "Service"
+ msgstr "サービス"
+
+-#: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:342
+-#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:696
++#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:346
++#: js/ui/components/networkAgent.js:679 js/ui/components/networkAgent.js:700
+ msgid "Authentication required"
+ msgstr "認証が必要です"
+
+-#: js/ui/components/networkAgent.js:315 js/ui/components/networkAgent.js:676
++#: js/ui/components/networkAgent.js:319 js/ui/components/networkAgent.js:680
+ #, javascript-format
+ msgid ""
+ "Passwords or encryption keys are required to access the wireless network "
+ "“%s”."
+-msgstr ""
+-"無線ネットワーク“%s”にアクセスするにはパスワードか暗号化キーが必要です。"
++msgstr "無線ネットワーク“%s”にアクセスするにはパスワードか暗号化キーが必要です。"
+
+-#: js/ui/components/networkAgent.js:319 js/ui/components/networkAgent.js:680
++#: js/ui/components/networkAgent.js:323 js/ui/components/networkAgent.js:684
+ msgid "Wired 802.1X authentication"
+ msgstr "有線 802.1X の認証"
+
+-#: js/ui/components/networkAgent.js:321
++#: js/ui/components/networkAgent.js:325
+ msgid "Network name"
+ msgstr "ネットワーク名"
+
+-#: js/ui/components/networkAgent.js:326 js/ui/components/networkAgent.js:684
++#: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:688
+ msgid "DSL authentication"
+ msgstr "DSL 認証"
+
+-#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:689
++#: js/ui/components/networkAgent.js:337 js/ui/components/networkAgent.js:693
+ msgid "PIN code required"
+ msgstr "PIN コードが必要です"
+
+-#: js/ui/components/networkAgent.js:334 js/ui/components/networkAgent.js:690
++#: js/ui/components/networkAgent.js:338 js/ui/components/networkAgent.js:694
+ msgid "PIN code is needed for the mobile broadband device"
+ msgstr "モバイルブロードバンドデバイスには PIN コードが必要です"
+
+-#: js/ui/components/networkAgent.js:335
++#: js/ui/components/networkAgent.js:339
+ msgid "PIN"
+ msgstr "PIN"
+
+-#: js/ui/components/networkAgent.js:343 js/ui/components/networkAgent.js:681
+-#: js/ui/components/networkAgent.js:685 js/ui/components/networkAgent.js:697
+-#: js/ui/components/networkAgent.js:701
++#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:685
++#: js/ui/components/networkAgent.js:689 js/ui/components/networkAgent.js:701
++#: js/ui/components/networkAgent.js:705
+ #, javascript-format
+ msgid "A password is required to connect to “%s”."
+ msgstr "“%s”への接続にはパスワードが必要です。"
+
+-#: js/ui/components/networkAgent.js:664 js/ui/status/network.js:1718
++#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1792
+ msgid "Network Manager"
+ msgstr "ネットワークマネージャー"
+
+-#: js/ui/components/networkAgent.js:700
++#: js/ui/components/networkAgent.js:704
+ msgid "VPN password"
+ msgstr "VPN パスワード"
+
+@@ -1029,11 +989,11 @@ msgstr "VPN パスワード"
+ msgid "Authentication Required"
+ msgstr "認証が必要です"
+
+-#: js/ui/components/polkitAgent.js:80
++#: js/ui/components/polkitAgent.js:79
+ msgid "Administrator"
+ msgstr "管理者"
+
+-#: js/ui/components/polkitAgent.js:142
++#: js/ui/components/polkitAgent.js:141
+ msgid "Authenticate"
+ msgstr "認証"
+
+@@ -1041,7 +1001,7 @@ msgstr "認証"
+ #. * requested authentication was not gained; this can happen
+ #. * because of an authentication error (like invalid password),
+ #. * for instance.
+-#: js/ui/components/polkitAgent.js:254 js/ui/shellMountOperation.js:402
++#: js/ui/components/polkitAgent.js:252 js/ui/shellMountOperation.js:402
+ msgid "Sorry, that didn’t work. Please try again."
+ msgstr "申し訳ありません、認証できませんでした。再試行してください。"
+
+@@ -1052,11 +1012,11 @@ msgstr "申し訳ありません、認証できませんでした。再試行し
+ msgid "%s is now known as %s"
+ msgstr "%s は %s になりました"
+
+-#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
++#: js/ui/ctrlAltTab.js:21 js/ui/overviewControls.js:404
+ msgid "Windows"
+ msgstr "ウィンドウ"
+
+-#: js/ui/dash.js:200 js/ui/dash.js:241
++#: js/ui/dash.js:204 js/ui/dash.js:247
+ msgid "Show Applications"
+ msgstr "アプリケーションを表示する"
+
+@@ -1084,62 +1044,62 @@ msgid "%A %B %e %Y"
+ msgstr "%Y年%-m月%-e日 (%a)"
+
+ #. Translators: Shown on calendar heading when selected day occurs on current year
+-#: js/ui/dateMenu.js:151
++#: js/ui/dateMenu.js:152
+ msgctxt "calendar heading"
+ msgid "%B %-d"
+ msgstr "%-m月%-e日"
+
+ #. Translators: Shown on calendar heading when selected day occurs on different year
+-#: js/ui/dateMenu.js:154
++#: js/ui/dateMenu.js:155
+ msgctxt "calendar heading"
+ msgid "%B %-d %Y"
+ msgstr "%Y年%-m月%-e日"
+
+-#: js/ui/dateMenu.js:160
++#: js/ui/dateMenu.js:161
+ msgid "Today"
+ msgstr "今日"
+
+-#: js/ui/dateMenu.js:164
++#: js/ui/dateMenu.js:165
+ msgid "Tomorrow"
+ msgstr "明日"
+
+ #. Translators: Shown in calendar event list for all day events
+ #. * Keep it short, best if you can use less then 10 characters
+ #.
+-#: js/ui/dateMenu.js:180
++#: js/ui/dateMenu.js:181
+ msgctxt "event list time"
+ msgid "All Day"
+ msgstr "終日"
+
+-#: js/ui/dateMenu.js:231
++#: js/ui/dateMenu.js:232
+ msgid "No Events"
+ msgstr "イベントなし"
+
+-#: js/ui/dateMenu.js:348
++#: js/ui/dateMenu.js:349
+ msgid "Add world clocks…"
+ msgstr "世界時計を追加…"
+
+-#: js/ui/dateMenu.js:349
++#: js/ui/dateMenu.js:350
+ msgid "World Clocks"
+ msgstr "世界時計"
+
+-#: js/ui/dateMenu.js:629
++#: js/ui/dateMenu.js:630
+ msgid "Loading…"
+ msgstr "読み込み中…"
+
+-#: js/ui/dateMenu.js:639
++#: js/ui/dateMenu.js:640
+ msgid "Go online for weather information"
+ msgstr "気象情報取得のためにネットワークに接続してください"
+
+-#: js/ui/dateMenu.js:641
++#: js/ui/dateMenu.js:642
+ msgid "Weather information is currently unavailable"
+ msgstr "気象情報を取得できません"
+
+-#: js/ui/dateMenu.js:651
++#: js/ui/dateMenu.js:652
+ msgid "Weather"
+ msgstr "天気"
+
+-#: js/ui/dateMenu.js:653
++#: js/ui/dateMenu.js:654
+ msgid "Select weather location…"
+ msgstr "天気の場所を選択…"
+
+@@ -1226,8 +1186,7 @@ msgstr "再起動してアップデートをインストール"
+ #: js/ui/endSessionDialog.js:104
+ #, javascript-format
+ msgid "The system will automatically restart and install updates in %d second."
+-msgid_plural ""
+-"The system will automatically restart and install updates in %d seconds."
++msgid_plural "The system will automatically restart and install updates in %d seconds."
+ msgstr[0] "%d 秒後にシステムを再起動してアップデートをインストールします。"
+
+ #: js/ui/endSessionDialog.js:111 js/ui/endSessionDialog.js:132
+@@ -1258,16 +1217,11 @@ msgstr "再起動してアップグレード"
+ msgid ""
+ "%s %s will be installed after restart. Upgrade installation can take a long "
+ "time: ensure that you have backed up and that the computer is plugged in."
+-msgstr ""
+-"%s %s は再起動後にインストールされます。アップグレードには時間が掛かることが"
+-"あります。重要なデータはバックアップを取っておいてください。また、コンピュー"
+-"ター本体は電源につないでください。"
++msgstr "%s %s は再起動後にインストールされます。アップグレードには時間が掛かることがあります。重要なデータはバックアップを取っておいてください。また、コンピューター本体は電源につないでください。"
+
+ #: js/ui/endSessionDialog.js:284
+ msgid "Low battery power: please plug in before installing updates."
+-msgstr ""
+-"バッテリー低下: アップデートをインストールする前に電源に接続してくだ"
+-"さい。"
++msgstr "バッテリー低下: アップデートをインストールする前に電源に接続してください。"
+
+ #: js/ui/endSessionDialog.js:293
+ msgid "Some applications are busy or have unsaved work"
+@@ -1283,51 +1237,51 @@ msgid "Boot Options"
+ msgstr "起動オプション"
+
+ #. Translators: Remote here refers to a remote session, like a ssh login
+-#: js/ui/endSessionDialog.js:685
++#: js/ui/endSessionDialog.js:686
+ #, javascript-format
+ msgid "%s (remote)"
+ msgstr "%s (リモート)"
+
+ #. Translators: Console here refers to a tty like a VT console
+-#: js/ui/endSessionDialog.js:688
++#: js/ui/endSessionDialog.js:689
+ #, javascript-format
+ msgid "%s (console)"
+ msgstr "%s (コンソール)"
+
+-#: js/ui/extensionDownloader.js:187
++#: js/ui/extensionDownloader.js:202
+ msgid "Install"
+ msgstr "インストール"
+
+-#: js/ui/extensionDownloader.js:193
++#: js/ui/extensionDownloader.js:208
+ msgid "Install Extension"
+ msgstr "拡張機能をインストール"
+
+-#: js/ui/extensionDownloader.js:194
++#: js/ui/extensionDownloader.js:209
+ #, javascript-format
+ msgid "Download and install “%s” from extensions.gnome.org?"
+ msgstr "extensions.gnome.org から“%s”をダウンロードしてインストールしますか?"
+
+-#: js/ui/extensionSystem.js:253
++#: js/ui/extensionSystem.js:275
+ msgid "Extension Updates Available"
+ msgstr "拡張機能のアップデートが利用可能です"
+
+-#: js/ui/extensionSystem.js:254
++#: js/ui/extensionSystem.js:276
+ msgid "Extension updates are ready to be installed."
+ msgstr "拡張機能のアップデートをインストールする準備ができました。"
+
+ #: js/ui/inhibitShortcutsDialog.js:79
+ msgid "Allow inhibiting shortcuts"
+-msgstr ""
++msgstr "ショートカットの禁止を許可する"
+
+ #. Translators: %s is an application name like "Settings"
+ #: js/ui/inhibitShortcutsDialog.js:82
+ #, javascript-format
+ msgid "The application %s wants to inhibit shortcuts"
+-msgstr ""
++msgstr "アプリケーション %s はショートカットを禁止する必要があります"
+
+ #: js/ui/inhibitShortcutsDialog.js:83
+ msgid "An application wants to inhibit shortcuts"
+-msgstr ""
++msgstr "アプリケーションでのショートカットの使用を禁止する"
+
+ #. Translators: %s is a keyboard shortcut like "Super+x"
+ #: js/ui/inhibitShortcutsDialog.js:90
+@@ -1355,159 +1309,155 @@ msgstr "スローキーをオフにする"
+ msgid ""
+ "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."
+-msgstr ""
+-"[SHIFT] キーを 8 秒間押下しました。これはスローキー機能のショートカットとし"
+-"て、キーボード操作に影響を与えるものです。"
++msgstr "[SHIFT] キーを 8 秒間押下しました。これはスローキー機能のショートカットとして、キーボード操作に影響を与えるものです。"
+
+-#: js/ui/kbdA11yDialog.js:41
++#: js/ui/kbdA11yDialog.js:40
+ msgid "Sticky Keys Turned On"
+ msgstr "固定キーをオンにする"
+
+-#: js/ui/kbdA11yDialog.js:42
++#: js/ui/kbdA11yDialog.js:41
+ msgid "Sticky Keys Turned Off"
+ msgstr "固定キーをオフにする"
+
+-#: js/ui/kbdA11yDialog.js:44
++#: js/ui/kbdA11yDialog.js:43
+ msgid ""
+ "You just pressed the Shift key 5 times in a row. This is the shortcut for "
+ "the Sticky Keys feature, which affects the way your keyboard works."
+-msgstr ""
+-"[SHIFT] キーを連続して 5 回押下しました。これは固定キー機能のショートカットと"
+-"して、キーボード操作に影響を与えるものです。"
++msgstr "[SHIFT] キーを連続して 5 回押下しました。これは固定キー機能のショートカットとして、キーボード操作に影響を与えるものです。"
+
+-#: js/ui/kbdA11yDialog.js:46
++#: js/ui/kbdA11yDialog.js:45
+ msgid ""
+ "You just pressed two keys at once, or pressed the Shift key 5 times in a "
+ "row. This turns off the Sticky Keys feature, which affects the way your "
+ "keyboard works."
+-msgstr ""
+-"同時に 2 つのキーを押下したか、[SHIFT] キーを連続して 5 回押下しました。これ"
+-"は固定キー機能を無効にし、キーボード操作に影響を与えるものです。"
++msgstr "同時に 2 つのキーを押下したか、[SHIFT] キーを連続して 5 回押下しました。これは固定キー機能を無効にし、キーボード操作に影響を与えるものです。"
+
+-#: js/ui/kbdA11yDialog.js:55
++#: js/ui/kbdA11yDialog.js:54
+ msgid "Leave On"
+ msgstr "オンのままにする"
+
+-#: js/ui/kbdA11yDialog.js:55 js/ui/status/bluetooth.js:156
+-#: js/ui/status/network.js:1315
++#: js/ui/kbdA11yDialog.js:54 js/ui/status/bluetooth.js:156
++#: js/ui/status/network.js:1381
+ msgid "Turn On"
+ msgstr "オンにする"
+
+-#: js/ui/kbdA11yDialog.js:63 js/ui/status/bluetooth.js:156
+-#: js/ui/status/network.js:160 js/ui/status/network.js:344
+-#: js/ui/status/network.js:1315 js/ui/status/network.js:1427
++#: js/ui/kbdA11yDialog.js:62 js/ui/status/bluetooth.js:156
++#: js/ui/status/network.js:166 js/ui/status/network.js:350
++#: js/ui/status/network.js:1381 js/ui/status/network.js:1493
+ #: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
+ #: js/ui/status/rfkill.js:110
+ msgid "Turn Off"
+ msgstr "オフにする"
+
+-#: js/ui/kbdA11yDialog.js:63
++#: js/ui/kbdA11yDialog.js:62
+ msgid "Leave Off"
+ msgstr "オフのままにする"
+
+-#: js/ui/keyboard.js:226
++#: js/ui/keyboard.js:227
+ msgid "Region & Language Settings"
+ msgstr "地域と言語の設定"
+
+-#: js/ui/lookingGlass.js:664
++#: js/ui/lookingGlass.js:676
+ msgid "No extensions installed"
+ msgstr "機能拡張はインストールされていません"
+
+ #. Translators: argument is an extension UUID.
+-#: js/ui/lookingGlass.js:719
++#: js/ui/lookingGlass.js:734
+ #, javascript-format
+ msgid "%s has not emitted any errors."
+ msgstr "%s は何もエラーを出力していません。"
+
+-#: js/ui/lookingGlass.js:725
++#: js/ui/lookingGlass.js:740
+ msgid "Hide Errors"
+ msgstr "エラーを非表示"
+
+-#: js/ui/lookingGlass.js:729 js/ui/lookingGlass.js:794
++#: js/ui/lookingGlass.js:744 js/ui/lookingGlass.js:810
+ msgid "Show Errors"
+ msgstr "エラーを表示"
+
+-#: js/ui/lookingGlass.js:738
++#: js/ui/lookingGlass.js:753
+ msgid "Enabled"
+ msgstr "有効"
+
+ #. translators:
+ #. * The device has been disabled
+-#: js/ui/lookingGlass.js:741 subprojects/gvc/gvc-mixer-control.c:1892
++#: js/ui/lookingGlass.js:756 subprojects/gvc/gvc-mixer-control.c:1900
+ msgid "Disabled"
+ msgstr "無効"
+
+-#: js/ui/lookingGlass.js:743
+-#: subprojects/extensions-app/data/ui/extension-row.ui:188
++#: js/ui/lookingGlass.js:758
++#: subprojects/extensions-app/data/ui/extension-row.ui:158
+ msgid "Error"
+ msgstr "エラー"
+
+-#: js/ui/lookingGlass.js:745
++#: js/ui/lookingGlass.js:760
+ msgid "Out of date"
+ msgstr "最新ではありません"
+
+-#: js/ui/lookingGlass.js:747
++#: js/ui/lookingGlass.js:762
+ msgid "Downloading"
+ msgstr "ダウンロード中"
+
+-#: js/ui/lookingGlass.js:776
++#: js/ui/lookingGlass.js:792
+ msgid "View Source"
+ msgstr "ソースを表示"
+
+-#: js/ui/lookingGlass.js:785
++#: js/ui/lookingGlass.js:801
+ msgid "Web Page"
+ msgstr "ウェブページ"
+
+-#: js/ui/main.js:294
++#: js/ui/main.js:304
+ msgid "Logged in as a privileged user"
+ msgstr "特権ユーザーでログインしました"
+
+-#: js/ui/main.js:295
++#: js/ui/main.js:305
+ msgid ""
+ "Running a session as a privileged user should be avoided for security "
+ "reasons. If possible, you should log in as a normal user."
+-msgstr ""
+-"セキュリティ上の観点から、特権ユーザーでセッションを実行することはお勧めでき"
+-"ません。可能な限り、一般ユーザーでログインしてください。"
++msgstr "セキュリティ上の観点から、特権ユーザーでセッションを実行することはお勧めできません。可能な限り、一般ユーザーでログインしてください。"
+
+-#: js/ui/main.js:334
++#: js/ui/main.js:354
+ msgid "Screen Lock disabled"
+ msgstr "画面ロックが無効です"
+
+-#: js/ui/main.js:335
++#: js/ui/main.js:355
+ msgid "Screen Locking requires the GNOME display manager."
+ msgstr "画面ロックには GNOME ディスプレイマネージャーが必要です。"
+
+-#: js/ui/messageTray.js:1476
++#: js/ui/messageTray.js:1443
+ msgid "System Information"
+ msgstr "システム情報"
+
+-#: js/ui/mpris.js:203
++#: js/ui/mpris.js:207
+ msgid "Unknown artist"
+ msgstr "不明なアーティスト"
+
+-#: js/ui/mpris.js:213
++#: js/ui/mpris.js:217
+ msgid "Unknown title"
+ msgstr "不明なタイトル"
+
+-#: js/ui/overview.js:74
++#. Translators: this is the text displayed
++#. in the search entry when no search is
++#. active; it should not exceed ~30
++#. characters.
++#: js/ui/overviewControls.js:313
++msgid "Type to search"
++msgstr "検索ワードを入力"
++
++#: js/ui/overviewControls.js:392
++msgid "Applications"
++msgstr "アプリケーション"
++
++#: js/ui/overview.js:58
+ msgid "Undo"
+ msgstr "元に戻す"
+
+ #. Translators: This is the main view to select
+ #. activities. See also note for "Activities" string.
+-#: js/ui/overview.js:87
++#: js/ui/overview.js:71
+ msgid "Overview"
+ msgstr "アクティビティ画面"
+
+-#. Translators: this is the text displayed
+-#. in the search entry when no search is
+-#. active; it should not exceed ~30
+-#. characters.
+-#: js/ui/overview.js:108
+-msgid "Type to search"
+-msgstr "検索ワードを入力"
+-
+ #: js/ui/padOsd.js:96
+ msgid "New shortcut…"
+ msgstr "新しいショートカット…"
+@@ -1532,42 +1482,42 @@ msgstr "キーストロークを割り当て"
+ msgid "Done"
+ msgstr "完了"
+
+-#: js/ui/padOsd.js:732
++#: js/ui/padOsd.js:718
+ msgid "Edit…"
+ msgstr "編集…"
+
+-#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
++#: js/ui/padOsd.js:760 js/ui/padOsd.js:877
+ msgid "None"
+ msgstr "なし"
+
+-#: js/ui/padOsd.js:845
++#: js/ui/padOsd.js:831
+ msgid "Press a button to configure"
+ msgstr "ボタンを押して設定してください"
+
+-#: js/ui/padOsd.js:846
++#: js/ui/padOsd.js:832
+ msgid "Press Esc to exit"
+ msgstr "Esc を押すと終了します"
+
+-#: js/ui/padOsd.js:849
++#: js/ui/padOsd.js:835
+ msgid "Press any key to exit"
+ msgstr "キーを押すと終了します"
+
+-#: js/ui/panel.js:107
++#: js/ui/panel.js:66
+ msgid "Quit"
+ msgstr "終了"
+
+ #. Translators: If there is no suitable word for "Activities"
+ #. in your language, you can use the word for "Overview".
+-#: js/ui/panel.js:435
++#: js/ui/panel.js:404
+ msgid "Activities"
+ msgstr "アクティビティ"
+
+-#: js/ui/panel.js:714
++#: js/ui/panel.js:690
+ msgctxt "System menu in the top bar"
+ msgid "System"
+ msgstr "システム"
+
+-#: js/ui/panel.js:825
++#: js/ui/panel.js:808
+ msgid "Top Bar"
+ msgstr "トップバー"
+
+@@ -1587,7 +1537,7 @@ msgstr "Wayland 上では再起動できません"
+ msgid "Restarting…"
+ msgstr "再起動中…"
+
+-#: js/ui/screenShield.js:203
++#: js/ui/screenShield.js:221
+ msgid "GNOME needs to lock the screen"
+ msgstr "画面をロックする必要があります"
+
+@@ -1598,19 +1548,23 @@ msgstr "画面をロックする必要があります"
+ #.
+ #. XXX: another option is to kick the user into the gdm login
+ #. screen, where we're not affected by grabs
+-#: js/ui/screenShield.js:244 js/ui/screenShield.js:602
++#: js/ui/screenShield.js:270 js/ui/screenShield.js:638
+ msgid "Unable to lock"
+ msgstr "ロックできません"
+
+-#: js/ui/screenShield.js:245 js/ui/screenShield.js:603
++#: js/ui/screenShield.js:271 js/ui/screenShield.js:639
+ msgid "Lock was blocked by an application"
+ msgstr "アプリケーションによってロックがブロックされました"
+
+-#: js/ui/search.js:823
++#: js/ui/screenshot.js:155
++msgid "Screenshot taken"
++msgstr "スクリーンショットを作成しました"
++
++#: js/ui/search.js:826
+ msgid "Searching…"
+ msgstr "検索中…"
+
+-#: js/ui/search.js:825
++#: js/ui/search.js:828
+ msgid "No results."
+ msgstr "一致するものがありません。"
+
+@@ -1620,6 +1574,10 @@ msgid "%d more"
+ msgid_plural "%d more"
+ msgstr[0] "他 %d 件"
+
++#: js/ui/searchController.js:87
++msgid "Search"
++msgstr "検索"
++
+ #: js/ui/shellEntry.js:20
+ msgid "Copy"
+ msgstr "コピー"
+@@ -1657,9 +1615,7 @@ msgstr "キーファイルを使用する"
+ #, javascript-format
+ msgid ""
+ "To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
+-msgstr ""
+-"キーファイルを使用するボリュームのロック解除には <i>%s</i> ユーティリティを使"
+-"用します。"
++msgstr "キーファイルを使用するボリュームのロック解除には <i>%s</i> ユーティリティを使用します。"
+
+ #: js/ui/shellMountOperation.js:306
+ msgid "PIM Number"
+@@ -1699,43 +1655,43 @@ msgstr "%s アプリケーションが見つかりません"
+ msgid "Accessibility"
+ msgstr "アクセシビリティ"
+
+-#: js/ui/status/accessibility.js:50
++#: js/ui/status/accessibility.js:48
+ msgid "Zoom"
+ msgstr "ズーム"
+
+-#: js/ui/status/accessibility.js:57
++#: js/ui/status/accessibility.js:55
+ msgid "Screen Reader"
+ msgstr "スクリーンリーダー"
+
+-#: js/ui/status/accessibility.js:61
++#: js/ui/status/accessibility.js:59
+ msgid "Screen Keyboard"
+ msgstr "スクリーンキーボード"
+
+-#: js/ui/status/accessibility.js:65
++#: js/ui/status/accessibility.js:63
+ msgid "Visual Alerts"
+ msgstr "視覚警告"
+
+-#: js/ui/status/accessibility.js:68
++#: js/ui/status/accessibility.js:66
+ msgid "Sticky Keys"
+ msgstr "固定キー"
+
+-#: js/ui/status/accessibility.js:71
++#: js/ui/status/accessibility.js:69
+ msgid "Slow Keys"
+ msgstr "スローキー"
+
+-#: js/ui/status/accessibility.js:74
++#: js/ui/status/accessibility.js:72
+ msgid "Bounce Keys"
+ msgstr "バウンスキー"
+
+-#: js/ui/status/accessibility.js:77
++#: js/ui/status/accessibility.js:75
+ msgid "Mouse Keys"
+ msgstr "マウスキー"
+
+-#: js/ui/status/accessibility.js:136
++#: js/ui/status/accessibility.js:134
+ msgid "High Contrast"
+ msgstr "ハイコントラスト"
+
+-#: js/ui/status/accessibility.js:178
++#: js/ui/status/accessibility.js:176
+ msgid "Large Text"
+ msgstr "大きな文字"
+
+@@ -1743,10 +1699,17 @@ msgstr "大きな文字"
+ msgid "Bluetooth"
+ msgstr "Bluetooth"
+
+-#: js/ui/status/bluetooth.js:49 js/ui/status/network.js:619
++#: js/ui/status/bluetooth.js:49 js/ui/status/network.js:652
+ msgid "Bluetooth Settings"
+ msgstr "Bluetooth の設定"
+
++#. Translators: this is the number of connected bluetooth devices
++#: js/ui/status/bluetooth.js:148
++#, javascript-format
++msgid "%d Connected"
++msgid_plural "%d Connected"
++msgstr[0] "%d 台接続"
++
+ #: js/ui/status/bluetooth.js:152
+ msgid "Bluetooth Off"
+ msgstr "Bluetooth オフ"
+@@ -1759,31 +1722,31 @@ msgstr "Bluetooth オン"
+ msgid "Brightness"
+ msgstr "明るさ"
+
+-#: js/ui/status/dwellClick.js:13
++#: js/ui/status/dwellClick.js:12
+ msgid "Single Click"
+ msgstr "シングルクリック"
+
+-#: js/ui/status/dwellClick.js:18
++#: js/ui/status/dwellClick.js:17
+ msgid "Double Click"
+ msgstr "ダブルクリック"
+
+-#: js/ui/status/dwellClick.js:23
++#: js/ui/status/dwellClick.js:22
+ msgid "Drag"
+ msgstr "ドラッグ"
+
+-#: js/ui/status/dwellClick.js:28
++#: js/ui/status/dwellClick.js:27
+ msgid "Secondary Click"
+ msgstr "セカンダリークリック"
+
+-#: js/ui/status/dwellClick.js:37
++#: js/ui/status/dwellClick.js:36
+ msgid "Dwell Click"
+ msgstr "自動クリック"
+
+-#: js/ui/status/keyboard.js:826
++#: js/ui/status/keyboard.js:829
+ msgid "Keyboard"
+ msgstr "キーボード"
+
+-#: js/ui/status/keyboard.js:848
++#: js/ui/status/keyboard.js:846
+ msgid "Show Keyboard Layout"
+ msgstr "キーボードレイアウトを表示"
+
+@@ -1823,21 +1786,20 @@ msgstr "アプリ %s が位置情報へのアクセスを要求しています"
+
+ #: js/ui/status/location.js:362
+ msgid "Location access can be changed at any time from the privacy settings."
+-msgstr ""
+-"位置情報のアクセス許可設定は、プライバシー設定からいつでも変更できます。"
++msgstr "位置情報のアクセス許可設定は、プライバシー設定からいつでも変更できます。"
+
+-#: js/ui/status/network.js:71
++#: js/ui/status/network.js:72
+ msgid "<unknown>"
+ msgstr "< 不明 >"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:449 js/ui/status/network.js:1344
++#: js/ui/status/network.js:455 js/ui/status/network.js:1410
+ #, javascript-format
+ msgid "%s Off"
+ msgstr "%s オフ"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:452
++#: js/ui/status/network.js:458
+ #, javascript-format
+ msgid "%s Connected"
+ msgstr "%s 接続済み"
+@@ -1845,186 +1807,186 @@ msgstr "%s 接続済み"
+ #. Translators: this is for network devices that are physically present but are not
+ #. under NetworkManager's control (and thus cannot be used in the menu);
+ #. %s is a network identifier
+-#: js/ui/status/network.js:457
++#: js/ui/status/network.js:463
+ #, javascript-format
+ msgid "%s Unmanaged"
+ msgstr "%s 管理対象外"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:460
++#: js/ui/status/network.js:466
+ #, javascript-format
+ msgid "%s Disconnecting"
+ msgstr "%s 切断中"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:467 js/ui/status/network.js:1336
++#: js/ui/status/network.js:473 js/ui/status/network.js:1402
+ #, javascript-format
+ msgid "%s Connecting"
+ msgstr "%s 接続中"
+
+ #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
+-#: js/ui/status/network.js:470
++#: js/ui/status/network.js:476
+ #, javascript-format
+ msgid "%s Requires Authentication"
+ msgstr "%s には認証が必要"
+
+ #. Translators: this is for devices that require some kind of firmware or kernel
+ #. module, which is missing; %s is a network identifier
+-#: js/ui/status/network.js:478
++#: js/ui/status/network.js:484
+ #, javascript-format
+ msgid "Firmware Missing For %s"
+ msgstr "%s のファームウェア未検出"
+
+ #. Translators: this is for a network device that cannot be activated (for example it
+ #. is disabled by rfkill, or it has no coverage; %s is a network identifier
+-#: js/ui/status/network.js:482
++#: js/ui/status/network.js:488
+ #, javascript-format
+ msgid "%s Unavailable"
+ msgstr "%s 利用不可"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:485
++#: js/ui/status/network.js:491
+ #, javascript-format
+ msgid "%s Connection Failed"
+ msgstr "%s 接続失敗"
+
+-#: js/ui/status/network.js:497
++#: js/ui/status/network.js:503
+ msgid "Wired Settings"
+ msgstr "有線設定"
+
+-#: js/ui/status/network.js:540
++#: js/ui/status/network.js:550
+ msgid "Mobile Broadband Settings"
+ msgstr "モバイルブロードバンド設定"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:586 js/ui/status/network.js:1341
++#: js/ui/status/network.js:619 js/ui/status/network.js:1407
+ #, javascript-format
+ msgid "%s Hardware Disabled"
+ msgstr "%s ハードウェア無効"
+
+ #. Translators: this is for a network device that cannot be activated
+ #. because it's disabled by rfkill (airplane mode); %s is a network identifier
+-#: js/ui/status/network.js:590
++#: js/ui/status/network.js:623
+ #, javascript-format
+ msgid "%s Disabled"
+ msgstr "%s 無効"
+
+-#: js/ui/status/network.js:631
++#: js/ui/status/network.js:664
+ msgid "Connect to Internet"
+ msgstr "インターネットへ接続"
+
+-#: js/ui/status/network.js:835
++#: js/ui/status/network.js:873
+ msgid "Airplane Mode is On"
+ msgstr "機内モードオン"
+
+-#: js/ui/status/network.js:836
++#: js/ui/status/network.js:874
+ msgid "Wi-Fi is disabled when airplane mode is on."
+ msgstr "機内モードがオンになっていると Wi-Fi は無効になります。"
+
+-#: js/ui/status/network.js:837
++#: js/ui/status/network.js:875
+ msgid "Turn Off Airplane Mode"
+ msgstr "機内モードをオフにする"
+
+-#: js/ui/status/network.js:846
++#: js/ui/status/network.js:884
+ msgid "Wi-Fi is Off"
+ msgstr "Wi-Fi オフ"
+
+-#: js/ui/status/network.js:847
++#: js/ui/status/network.js:885
+ msgid "Wi-Fi needs to be turned on in order to connect to a network."
+ msgstr "ネットワークに接続するには Wi-Fi をオンにする必要があります。"
+
+-#: js/ui/status/network.js:848
++#: js/ui/status/network.js:886
+ msgid "Turn On Wi-Fi"
+ msgstr "Wi-Fi をオンにする"
+
+-#: js/ui/status/network.js:873
++#: js/ui/status/network.js:911
+ msgid "Wi-Fi Networks"
+ msgstr "Wi-Fi ネットワーク"
+
+-#: js/ui/status/network.js:875
++#: js/ui/status/network.js:913
+ msgid "Select a network"
+ msgstr "ネットワークを選択してください"
+
+-#: js/ui/status/network.js:907
++#: js/ui/status/network.js:945
+ msgid "No Networks"
+ msgstr "ネットワークなし"
+
+-#: js/ui/status/network.js:928 js/ui/status/rfkill.js:108
++#: js/ui/status/network.js:966 js/ui/status/rfkill.js:108
+ msgid "Use hardware switch to turn off"
+ msgstr "オフにハードウェアスイッチを使用する"
+
+-#: js/ui/status/network.js:1205
++#: js/ui/status/network.js:1271
+ msgid "Select Network"
+ msgstr "ネットワークを選択"
+
+-#: js/ui/status/network.js:1211
++#: js/ui/status/network.js:1277
+ msgid "Wi-Fi Settings"
+ msgstr "Wi-Fi 設定"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:1332
++#: js/ui/status/network.js:1398
+ #, javascript-format
+ msgid "%s Hotspot Active"
+ msgstr "%s アクセスポイント使用中"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:1347
++#: js/ui/status/network.js:1413
+ #, javascript-format
+ msgid "%s Not Connected"
+ msgstr "%s 未接続"
+
+-#: js/ui/status/network.js:1444
++#: js/ui/status/network.js:1510
+ msgid "connecting…"
+ msgstr "接続中…"
+
+ #. Translators: this is for network connections that require some kind of key or password
+-#: js/ui/status/network.js:1447
++#: js/ui/status/network.js:1513
+ msgid "authentication required"
+ msgstr "認証が必要"
+
+-#: js/ui/status/network.js:1449
++#: js/ui/status/network.js:1515
+ msgid "connection failed"
+ msgstr "接続失敗"
+
+-#: js/ui/status/network.js:1500
++#: js/ui/status/network.js:1566
+ msgid "VPN Settings"
+ msgstr "VPN 設定"
+
+-#: js/ui/status/network.js:1517
++#: js/ui/status/network.js:1583
+ msgid "VPN"
+ msgstr "VPN"
+
+-#: js/ui/status/network.js:1527
++#: js/ui/status/network.js:1593
+ msgid "VPN Off"
+ msgstr "VPN オフ"
+
+-#: js/ui/status/network.js:1588 js/ui/status/rfkill.js:84
++#: js/ui/status/network.js:1654 js/ui/status/rfkill.js:84
+ msgid "Network Settings"
+ msgstr "ネットワーク設定"
+
+-#: js/ui/status/network.js:1617
++#: js/ui/status/network.js:1682
+ #, javascript-format
+ msgid "%s Wired Connection"
+ msgid_plural "%s Wired Connections"
+ msgstr[0] "有線接続 %s 件"
+
+-#: js/ui/status/network.js:1621
++#: js/ui/status/network.js:1686
+ #, javascript-format
+ msgid "%s Wi-Fi Connection"
+ msgid_plural "%s Wi-Fi Connections"
+ msgstr[0] "Wi-Fi 接続 %s 件"
+
+-#: js/ui/status/network.js:1625
++#: js/ui/status/network.js:1690
+ #, javascript-format
+ msgid "%s Modem Connection"
+ msgid_plural "%s Modem Connections"
+ msgstr[0] "モデム接続 %s 件"
+
+-#: js/ui/status/network.js:1759
++#: js/ui/status/network.js:1833
+ msgid "Connection failed"
+ msgstr "接続失敗"
+
+-#: js/ui/status/network.js:1760
++#: js/ui/status/network.js:1834
+ msgid "Activation of network connection failed"
+ msgstr "ネットワーク接続を有効にできません"
+
+@@ -2044,46 +2006,62 @@ msgstr "再開"
+ msgid "Disable Until Tomorrow"
+ msgstr "明日まで無効にする"
+
+-#: js/ui/status/power.js:47
++#: js/ui/status/power.js:51 js/ui/status/powerProfiles.js:57
+ msgid "Power Settings"
+ msgstr "電源設定"
+
+-#: js/ui/status/power.js:63
++#: js/ui/status/power.js:68
+ msgid "Fully Charged"
+ msgstr "充電完了"
+
+-#: js/ui/status/power.js:69
++#: js/ui/status/power.js:74
+ msgid "Not Charging"
+ msgstr "充電していません"
+
+ #. 0 is reported when UPower does not have enough data
+ #. to estimate battery life
+-#: js/ui/status/power.js:72 js/ui/status/power.js:78
++#: js/ui/status/power.js:77 js/ui/status/power.js:83
+ msgid "Estimating…"
+ msgstr "残量推計中…"
+
+ #. Translators: this is <hours>:<minutes> Remaining (<percentage>)
+-#: js/ui/status/power.js:86
++#: js/ui/status/power.js:91
+ #, javascript-format
+ msgid "%d∶%02d Remaining (%d %%)"
+ msgstr "残り %d:%02d (%d %%)"
+
+ #. Translators: this is <hours>:<minutes> Until Full (<percentage>)
+-#: js/ui/status/power.js:91
++#: js/ui/status/power.js:97
+ #, javascript-format
+ msgid "%d∶%02d Until Full (%d %%)"
+ msgstr "充電完了まで %d:%02d (%d %%)"
+
+-#: js/ui/status/power.js:139 js/ui/status/power.js:141
++#. The icon label
++#: js/ui/status/power.js:145
+ #, javascript-format
+ msgid "%d %%"
+ msgstr "%d %%"
+
+-#: js/ui/status/remoteAccess.js:45
++#: js/ui/status/powerProfiles.js:19
++msgctxt "Power profile"
++msgid "Performance"
++msgstr "パフォーマンス"
++
++#: js/ui/status/powerProfiles.js:20
++msgctxt "Power profile"
++msgid "Balanced"
++msgstr "バランス"
++
++#: js/ui/status/powerProfiles.js:21
++msgctxt "Power profile"
++msgid "Power Saver"
++msgstr "省エネルギー"
++
++#: js/ui/status/remoteAccess.js:38
+ msgid "Screen is Being Shared"
+ msgstr "画面を共有しています"
+
+-#: js/ui/status/remoteAccess.js:47
++#: js/ui/status/remoteAccess.js:40
+ msgid "Turn off"
+ msgstr "オフにする"
+
+@@ -2122,45 +2100,43 @@ msgstr "ログアウト"
+ msgid "Switch User…"
+ msgstr "ユーザーを切り替え…"
+
+-#: js/ui/status/thunderbolt.js:263
++#: js/ui/status/thunderbolt.js:262
+ msgid "Thunderbolt"
+ msgstr "Thunderbolt"
+
+-#: js/ui/status/thunderbolt.js:325
++#: js/ui/status/thunderbolt.js:324
+ msgid "Unknown Thunderbolt device"
+ msgstr "不明な Thunderbolt デバイス"
+
+-#: js/ui/status/thunderbolt.js:326
++#: js/ui/status/thunderbolt.js:325
+ msgid ""
+ "New device has been detected while you were away. Please disconnect and "
+ "reconnect the device to start using it."
+-msgstr ""
+-"離席中に新しいデバイスを検出しました。そのデバイスを使用する場合は一度取り外"
+-"し、再接続してください。"
++msgstr "離席中に新しいデバイスを検出しました。そのデバイスを使用する場合は一度取り外し、再接続してください。"
+
+-#: js/ui/status/thunderbolt.js:329
++#: js/ui/status/thunderbolt.js:328
+ msgid "Unauthorized Thunderbolt device"
+ msgstr "認証していない Thunderbolt デバイス"
+
+-#: js/ui/status/thunderbolt.js:330
++#: js/ui/status/thunderbolt.js:329
+ msgid ""
+ "New device has been detected and needs to be authorized by an administrator."
+ msgstr "新しいデバイスを検出しました。管理者の認証が必要です。"
+
+-#: js/ui/status/thunderbolt.js:336
++#: js/ui/status/thunderbolt.js:335
+ msgid "Thunderbolt authorization error"
+ msgstr "Thunderbolt 認証エラー"
+
+-#: js/ui/status/thunderbolt.js:337
++#: js/ui/status/thunderbolt.js:336
+ #, javascript-format
+ msgid "Could not authorize the Thunderbolt device: %s"
+ msgstr "Thunderbolt デバイスを認証できませんでした: %s"
+
+-#: js/ui/status/volume.js:155
++#: js/ui/status/volume.js:161
+ msgid "Volume changed"
+ msgstr "音量変更しました"
+
+-#: js/ui/status/volume.js:217
++#: js/ui/status/volume.js:223
+ msgid "Volume"
+ msgstr "音量"
+
+@@ -2194,33 +2170,42 @@ msgstr "組み込みのみ"
+
+ #. Translators: This is a time format for a date in
+ #. long format
+-#: js/ui/unlockDialog.js:371
++#: js/ui/unlockDialog.js:380
+ msgid "%A %B %-d"
+ msgstr "%B%-e日 (%a)"
+
+-#: js/ui/unlockDialog.js:377
++#: js/ui/unlockDialog.js:386
+ msgid "Swipe up to unlock"
+ msgstr "ロック解除は上にスワイプしてください"
+
+-#: js/ui/unlockDialog.js:378
++#: js/ui/unlockDialog.js:387
+ msgid "Click or press a key to unlock"
+ msgstr "ロック解除はキーを押すかクリックしてください"
+
+-#: js/ui/unlockDialog.js:555
++#: js/ui/unlockDialog.js:572
+ msgid "Unlock Window"
+ msgstr "ロック解除"
+
+-#: js/ui/unlockDialog.js:564
++#: js/ui/unlockDialog.js:581
+ msgid "Log in as another user"
+ msgstr "別のユーザーでログイン"
+
+-#: js/ui/viewSelector.js:182
+-msgid "Applications"
+-msgstr "アプリケーション"
++#: js/ui/welcomeDialog.js:34
++#, javascript-format
++msgid "Welcome to %s"
++msgstr "%s へようこそ"
+
+-#: js/ui/viewSelector.js:186
+-msgid "Search"
+-msgstr "検索"
++#: js/ui/welcomeDialog.js:35
++msgid "If you want to learn your way around, check out the tour."
++msgstr "操作方法については、ツアーを確認してください。"
++
++#: js/ui/welcomeDialog.js:43
++msgid "No Thanks"
++msgstr "必要ありません"
++
++#: js/ui/welcomeDialog.js:48
++msgid "Take Tour"
++msgstr "ツアーをチェックする"
+
+ #: js/ui/windowAttentionHandler.js:20
+ #, javascript-format
+@@ -2228,22 +2213,22 @@ msgid "“%s” is ready"
+ msgstr "“%s”の準備ができました"
+
+ #. Translators: This string should be shorter than 30 characters
+-#: js/ui/windowManager.js:60
++#: js/ui/windowManager.js:64
+ msgid "Keep these display settings?"
+ msgstr "このディスプレイ設定を保存しますか?"
+
+ #. Translators: this and the following message should be limited in length,
+ #. to avoid ellipsizing the labels.
+ #.
+-#: js/ui/windowManager.js:69
++#: js/ui/windowManager.js:73
+ msgid "Revert Settings"
+ msgstr "設定を元に戻す"
+
+-#: js/ui/windowManager.js:72
++#: js/ui/windowManager.js:76
+ msgid "Keep Changes"
+ msgstr "変更を保存"
+
+-#: js/ui/windowManager.js:91
++#: js/ui/windowManager.js:95
+ #, javascript-format
+ msgid "Settings changes will revert in %d second"
+ msgid_plural "Settings changes will revert in %d seconds"
+@@ -2304,23 +2289,27 @@ msgstr "上側のワークスペースへ移動する"
+ msgid "Move to Workspace Down"
+ msgstr "下側のワークスペースへ移動する"
+
+-#: js/ui/windowMenu.js:132
++#: js/ui/windowMenu.js:123
++msgid "Move to another workspace"
++msgstr "別のワークスペースへ移動する"
++
++#: js/ui/windowMenu.js:149
+ msgid "Move to Monitor Up"
+ msgstr "上側のモニターへ移動する"
+
+-#: js/ui/windowMenu.js:141
++#: js/ui/windowMenu.js:158
+ msgid "Move to Monitor Down"
+ msgstr "下側のモニターへ移動する"
+
+-#: js/ui/windowMenu.js:150
++#: js/ui/windowMenu.js:167
+ msgid "Move to Monitor Left"
+ msgstr "左側のモニターへ移動する"
+
+-#: js/ui/windowMenu.js:159
++#: js/ui/windowMenu.js:176
+ msgid "Move to Monitor Right"
+ msgstr "右側のモニターへ移動する"
+
+-#: js/ui/windowMenu.js:167
++#: js/ui/windowMenu.js:184
+ msgid "Close"
+ msgstr "閉じる"
+
+@@ -2328,28 +2317,28 @@ msgstr "閉じる"
+ msgid "Evolution Calendar"
+ msgstr "Evolution カレンダー"
+
+-#: src/main.c:458 subprojects/extensions-tool/src/main.c:317
++#: src/main.c:423 subprojects/extensions-tool/src/main.c:321
+ msgid "Print version"
+ msgstr "バージョンを表示する"
+
+-#: src/main.c:464
++#: src/main.c:429
+ msgid "Mode used by GDM for login screen"
+ msgstr "ログイン画面で GDM が使用するモード"
+
+-#: src/main.c:470
++#: src/main.c:435
+ msgid "Use a specific mode, e.g. “gdm” for login screen"
+ msgstr "指定したモードを使用する (例: ログイン画面用の“gdm”)"
+
+-#: src/main.c:476
++#: src/main.c:441
+ msgid "List possible modes"
+ msgstr "使用可能なモードを一覧表示する"
+
+-#: src/shell-app.c:268
++#: src/shell-app.c:300
+ msgctxt "program"
+ msgid "Unknown"
+ msgstr "不明なプログラム"
+
+-#: src/shell-app.c:519
++#: src/shell-app.c:564
+ #, c-format
+ msgid "Failed to launch “%s”"
+ msgstr "“%s”の起動に失敗しました"
+@@ -2368,13 +2357,13 @@ msgstr "認証ダイアログはユーザーに拒否されました"
+
+ #: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
+ #: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
+-#: subprojects/extensions-app/js/main.js:183
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:61
++#: subprojects/extensions-app/js/main.js:217
++#: subprojects/extensions-app/data/ui/extensions-window.ui:56
+ msgid "Extensions"
+ msgstr "拡張機能"
+
+ #: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
+-#: subprojects/extensions-app/js/main.js:184
++#: subprojects/extensions-app/js/main.js:218
+ msgid "Manage your GNOME Extensions"
+ msgstr "GNOME 拡張機能を管理します"
+
+@@ -2386,32 +2375,35 @@ msgstr "The GNOME Project"
+ msgid ""
+ "GNOME Extensions handles updating extensions, configuring extension "
+ "preferences and removing or disabling unwanted extensions."
+-msgstr ""
++msgstr "GNOME 拡張機能は、拡張機能の更新、拡張機能オプションの設定、不要な拡張機能の削除または無効化などを行います。"
+
+ #: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
+ msgid "Configure GNOME Shell Extensions"
+ msgstr "GNOME Shell 拡張機能の設定を行います"
+
+-#: subprojects/extensions-app/js/main.js:145
++#: subprojects/extensions-app/js/main.js:142
++#: subprojects/extensions-app/js/main.js:152
++msgid "No Matches"
++msgstr "一致する項目なし"
++
++#: subprojects/extensions-app/js/main.js:179
+ #, javascript-format
+ msgid "Remove “%s”?"
+ msgstr "“%s”を削除しますか?"
+
+-#: subprojects/extensions-app/js/main.js:146
++#: subprojects/extensions-app/js/main.js:180
+ msgid ""
+ "If you remove the extension, you need to return to download it if you want "
+ "to enable it again"
+-msgstr ""
+-"拡張機能を削除した場合、再度有効にするにはダウンロードし直す必要があります"
++msgstr "拡張機能を削除した場合、再度有効にするにはダウンロードし直す必要があります"
+
+-#: subprojects/extensions-app/js/main.js:150
++#: subprojects/extensions-app/js/main.js:184
+ msgid "Remove"
+ msgstr "削除"
+
+-#: subprojects/extensions-app/js/main.js:182
++#: subprojects/extensions-app/js/main.js:216
+ msgid "translator-credits"
+-msgstr ""
+-"Hideki Yamane <henrich@debian.org>\n"
++msgstr "Hideki Yamane <henrich@debian.org>\n"
+ "Ikuya Awashiro <ikuya@fruitsbasket.info>\n"
+ "IWAI, Masaharu <iwaim.sub@gmail.com>\n"
+ "Jiro Matsuzawa <jmatsuzawa@gnome.org>\n"
+@@ -2422,190 +2414,190 @@ msgstr ""
+ "Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>\n"
+ "Yoji TOYODA <bsyamato@sea.plala.or.jp>"
+
+-#: subprojects/extensions-app/js/main.js:314
++#: subprojects/extensions-app/js/main.js:344
+ #, javascript-format
+ msgid "%d extension will be updated on next login."
+ msgid_plural "%d extensions will be updated on next login."
+ msgstr[0] "%d 個の拡張機能を次回ログイン時に更新します。"
+
+-#: subprojects/extensions-app/js/main.js:461
++#: subprojects/extensions-app/js/main.js:494
+ msgid "The extension is incompatible with the current GNOME version"
+ msgstr "現在の GNOME のバージョンと互換性のない拡張機能です"
+
+-#: subprojects/extensions-app/js/main.js:464
++#: subprojects/extensions-app/js/main.js:497
+ msgid "The extension had an error"
+ msgstr "拡張機能にエラーがありました"
+
+-#: subprojects/extensions-app/data/ui/extension-row.ui:109
+-#: subprojects/extensions-tool/src/command-create.c:325
++#: subprojects/extensions-app/data/ui/extension-row.ui:83
++#: subprojects/extensions-tool/src/command-create.c:322
+ #: subprojects/extensions-tool/src/main.c:241
+ msgid "Description"
+ msgstr "説明"
+
+-#: subprojects/extensions-app/data/ui/extension-row.ui:132
++#: subprojects/extensions-app/data/ui/extension-row.ui:104
+ #: subprojects/extensions-tool/src/main.c:253
+ msgid "Version"
+ msgstr "バージョン"
+
+-#: subprojects/extensions-app/data/ui/extension-row.ui:160
++#: subprojects/extensions-app/data/ui/extension-row.ui:131
+ msgid "Author"
+ msgstr "作者"
+
+-#: subprojects/extensions-app/data/ui/extension-row.ui:216
++#: subprojects/extensions-app/data/ui/extension-row.ui:185
+ msgid "Website"
+ msgstr "ウェブサイト"
+
+-#: subprojects/extensions-app/data/ui/extension-row.ui:233
++#: subprojects/extensions-app/data/ui/extension-row.ui:201
+ msgid "Remove…"
+ msgstr "削除…"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:8
++#: subprojects/extensions-app/data/ui/extensions-window.ui:7
+ msgid "Help"
+ msgstr "ヘルプ"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:12
++#: subprojects/extensions-app/data/ui/extensions-window.ui:11
+ msgid "About Extensions"
+ msgstr "“拡張機能”について"
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:27
+ msgid ""
+-"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
+-"\">extensions.gnome.org</a>."
+-msgstr ""
+-"拡張機能の検索や追加は <a href=\"https://extensions.gnome.org\">extensions."
+-"gnome.org</a> で行うことができます。"
++"To find and add extensions, visit <a href=\"https://extensions.gnome."
++"org\">extensions.gnome.org</a>."
++msgstr "拡張機能の検索や追加は <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> で行うことができます。"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:35
++#: subprojects/extensions-app/data/ui/extensions-window.ui:34
+ msgid "Warning"
+ msgstr "警告"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:46
++#: subprojects/extensions-app/data/ui/extensions-window.ui:44
+ msgid ""
+ "Extensions can cause system issues, including performance problems. If you "
+ "encounter problems with your system, it is recommended to disable all "
+ "extensions."
+-msgstr ""
+-"拡張機能は、システムに何らかの問題 (パフォーマンスへの影響を含む) を引き起こ"
+-"す場合があります。システムに問題が発生した場合は、すべての拡張機能を無効にす"
+-"ることをお勧めします。"
++msgstr "拡張機能は、システムに何らかの問題 (パフォーマンスへの影響を含む) を引き起こす場合があります。システムに問題が発生した場合は、すべての拡張機能を無効にすることをお勧めします。"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:135
++#: subprojects/extensions-app/data/ui/extensions-window.ui:150
+ msgid "Manually Installed"
+ msgstr "手動でインストール"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:159
++#: subprojects/extensions-app/data/ui/extensions-window.ui:174
+ msgid "Built-In"
+ msgstr "組み込み"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:200
++#: subprojects/extensions-app/data/ui/extensions-window.ui:217
+ msgid "No Installed Extensions"
+ msgstr "インストールされた拡張機能はありません"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:236
++#: subprojects/extensions-app/data/ui/extensions-window.ui:252
+ msgid ""
+ "We’re very sorry, but it was not possible to get the list of installed "
+ "extensions. Make sure you are logged into GNOME and try again."
+-msgstr ""
+-"大変申し訳ありませんが、インストール済み拡張機能一覧を取得できませんでした。"
+-"GNOME にログインしていることを確認した上で再試行してください。"
++msgstr "大変申し訳ありませんが、インストール済み拡張機能一覧を取得できませんでした。GNOME にログインしていることを確認した上で再試行してください。"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:273
++#: subprojects/extensions-app/data/ui/extensions-window.ui:288
+ msgid "Extension Updates Ready"
+ msgstr "拡張機能の更新準備完了"
+
+-#: subprojects/extensions-app/data/ui/extensions-window.ui:289
++#: subprojects/extensions-app/data/ui/extensions-window.ui:303
+ msgid "Log Out…"
+ msgstr "ログアウト…"
+
+ #. Translators: a file path to an extension directory
+-#: subprojects/extensions-tool/src/command-create.c:226
++#: subprojects/extensions-tool/src/command-create.c:223
+ #, c-format
+ msgid "The new extension was successfully created in %s.\n"
+-msgstr ""
++msgstr "新しい拡張機能が %s に正常に作成されました。\n"
+
+-#: subprojects/extensions-tool/src/command-create.c:299
++#: subprojects/extensions-tool/src/command-create.c:296
+ #, c-format
+ msgid ""
+ "Name should be a very short (ideally descriptive) string.\n"
+ "Examples are: %s"
+-msgstr ""
++msgstr "名前は、非常に短い (かつ分かりやすい) 文字列で指定してください。\n"
++"例: %s"
+
+-#: subprojects/extensions-tool/src/command-create.c:305
++#: subprojects/extensions-tool/src/command-create.c:302
+ #: subprojects/extensions-tool/src/main.c:238
+ msgid "Name"
+ msgstr "名前"
+
+-#: subprojects/extensions-tool/src/command-create.c:319
++#: subprojects/extensions-tool/src/command-create.c:316
+ #, c-format
+ msgid ""
+ "Description is a single-sentence explanation of what your extension does.\n"
+ "Examples are: %s"
+-msgstr ""
++msgstr "説明は、拡張機能の動作についての説明を 1 文にまとめます。\n"
++"例: %s"
+
+-#: subprojects/extensions-tool/src/command-create.c:339
++#: subprojects/extensions-tool/src/command-create.c:336
++#, c-format
+ msgid ""
+ "UUID is a globally-unique identifier for your extension.\n"
+ "This should be in the format of an email address (clicktofocus@janedoe."
+ "example.com)\n"
+-msgstr ""
++msgstr "UUID は、グローバルに一意な識別子を指定します。\n"
++"これは、メールアドレスの形式 (clicktofocus@janedoe.example.com) にする必要があります。\n"
+
+-#: subprojects/extensions-tool/src/command-create.c:366
++#: subprojects/extensions-tool/src/command-create.c:363
++#, c-format
+ msgid "Choose one of the available templates:\n"
+-msgstr ""
++msgstr "利用可能なテンプレートから 1 つ選択します。\n"
+
+-#: subprojects/extensions-tool/src/command-create.c:380
++#: subprojects/extensions-tool/src/command-create.c:377
+ msgid "Template"
+-msgstr ""
++msgstr "テンプレート"
+
+-#: subprojects/extensions-tool/src/command-create.c:435
++#: subprojects/extensions-tool/src/command-create.c:432
+ msgid "The unique identifier of the new extension"
+-msgstr ""
++msgstr "新しい拡張機能の一意識別子"
+
+-#: subprojects/extensions-tool/src/command-create.c:438
++#: subprojects/extensions-tool/src/command-create.c:435
+ msgid "NAME"
+-msgstr ""
++msgstr "名前"
+
+-#: subprojects/extensions-tool/src/command-create.c:439
++#: subprojects/extensions-tool/src/command-create.c:436
+ msgid "The user-visible name of the new extension"
+-msgstr ""
++msgstr "ユーザーに表示される新しい拡張機能名"
+
+-#: subprojects/extensions-tool/src/command-create.c:441
++#: subprojects/extensions-tool/src/command-create.c:438
+ msgid "DESCRIPTION"
+-msgstr ""
++msgstr "概要"
+
+-#: subprojects/extensions-tool/src/command-create.c:443
++#: subprojects/extensions-tool/src/command-create.c:440
+ msgid "A short description of what the extension does"
+-msgstr ""
++msgstr "拡張機能の動作に関する簡単な説明"
+
+-#: subprojects/extensions-tool/src/command-create.c:446
++#: subprojects/extensions-tool/src/command-create.c:443
+ msgid "TEMPLATE"
+-msgstr ""
++msgstr "テンプレート"
+
+-#: subprojects/extensions-tool/src/command-create.c:447
++#: subprojects/extensions-tool/src/command-create.c:444
+ msgid "The template to use for the new extension"
+-msgstr ""
++msgstr "新しい拡張機能に使用するテンプレート"
+
+-#: subprojects/extensions-tool/src/command-create.c:453
++#: subprojects/extensions-tool/src/command-create.c:450
+ msgid "Enter extension information interactively"
+-msgstr ""
++msgstr "拡張機能の情報を対話的に入力する"
+
+-#: subprojects/extensions-tool/src/command-create.c:461
++#: subprojects/extensions-tool/src/command-create.c:458
+ msgid "Create a new extension"
+ msgstr "新しい拡張機能を作成します"
+
+-#: subprojects/extensions-tool/src/command-create.c:479
++#: subprojects/extensions-tool/src/command-create.c:476
+ #: subprojects/extensions-tool/src/command-list.c:172
+ msgid "Unknown arguments"
+ msgstr "不明な引数です"
+
+-#: subprojects/extensions-tool/src/command-create.c:504
++#: subprojects/extensions-tool/src/command-create.c:501
+ msgid "UUID, name and description are required"
+-msgstr ""
++msgstr "UUID、名前、および説明が必要です"
+
+ #: subprojects/extensions-tool/src/command-disable.c:46
+ #: subprojects/extensions-tool/src/command-enable.c:46
+ #: subprojects/extensions-tool/src/command-info.c:50
+ #: subprojects/extensions-tool/src/command-list.c:64
++#: subprojects/extensions-tool/src/main.c:146
++#, c-format
+ msgid "Failed to connect to GNOME Shell\n"
+ msgstr "GNOME Shell への接続に失敗しました\n"
+
+@@ -2622,20 +2614,20 @@ msgstr "拡張機能を無効にします"
+ #: subprojects/extensions-tool/src/command-disable.c:119
+ #: subprojects/extensions-tool/src/command-enable.c:119
+ #: subprojects/extensions-tool/src/command-info.c:103
+-#: subprojects/extensions-tool/src/command-prefs.c:97
++#: subprojects/extensions-tool/src/command-prefs.c:105
+ #: subprojects/extensions-tool/src/command-reset.c:76
+ #: subprojects/extensions-tool/src/command-uninstall.c:104
+ msgid "No UUID given"
+-msgstr ""
++msgstr "UUID が指定されていません"
+
+ #: subprojects/extensions-tool/src/command-disable.c:124
+ #: subprojects/extensions-tool/src/command-enable.c:124
+ #: subprojects/extensions-tool/src/command-info.c:108
+-#: subprojects/extensions-tool/src/command-prefs.c:102
++#: subprojects/extensions-tool/src/command-prefs.c:110
+ #: subprojects/extensions-tool/src/command-reset.c:81
+ #: subprojects/extensions-tool/src/command-uninstall.c:109
+ msgid "More than one UUID given"
+-msgstr ""
++msgstr "複数の UUID が指定されています"
+
+ #: subprojects/extensions-tool/src/command-enable.c:101
+ msgid "Enable an extension"
+@@ -2657,19 +2649,19 @@ msgstr "既存の拡張機能を上書きする"
+
+ #: subprojects/extensions-tool/src/command-install.c:175
+ msgid "EXTENSION_BUNDLE"
+-msgstr ""
++msgstr "拡張機能バンドル"
+
+ #: subprojects/extensions-tool/src/command-install.c:184
+ msgid "Install an extension bundle"
+-msgstr ""
++msgstr "拡張バンドルのインストール"
+
+ #: subprojects/extensions-tool/src/command-install.c:202
+ msgid "No extension bundle specified"
+-msgstr ""
++msgstr "拡張バンドルが指定されていません"
+
+ #: subprojects/extensions-tool/src/command-install.c:208
+ msgid "More than one extension bundle specified"
+-msgstr ""
++msgstr "複数の拡張バンドルが指定されています"
+
+ #: subprojects/extensions-tool/src/command-list.c:128
+ msgid "Show user-installed extensions"
+@@ -2705,52 +2697,52 @@ msgstr "インストールされた拡張機能一覧を表示します"
+
+ #: subprojects/extensions-tool/src/command-pack.c:450
+ msgid "FILE"
+-msgstr ""
++msgstr "ファイル"
+
+ #: subprojects/extensions-tool/src/command-pack.c:451
+ msgid "Additional source to include in the bundle"
+-msgstr ""
++msgstr "バンドルに含める追加のソース"
+
+ #: subprojects/extensions-tool/src/command-pack.c:454
+ msgid "SCHEMA"
+-msgstr ""
++msgstr "スキーマ"
+
+ #: subprojects/extensions-tool/src/command-pack.c:455
+ msgid "A GSettings schema that should be included"
+-msgstr ""
++msgstr "含める必要のある GSettings スキーマ"
+
+ #: subprojects/extensions-tool/src/command-pack.c:457
+ #: subprojects/extensions-tool/src/command-pack.c:468
+ msgid "DIRECTORY"
+-msgstr ""
++msgstr "ディレクトリー"
+
+ #: subprojects/extensions-tool/src/command-pack.c:459
+ msgid "The directory where translations are found"
+-msgstr ""
++msgstr "翻訳の保存先のディレクトリー"
+
+ #: subprojects/extensions-tool/src/command-pack.c:461
+ msgid "DOMAIN"
+-msgstr ""
++msgstr "ドメイン"
+
+ #: subprojects/extensions-tool/src/command-pack.c:463
+ msgid "The gettext domain to use for translations"
+-msgstr ""
++msgstr "翻訳に使用する gettext ドメイン"
+
+ #: subprojects/extensions-tool/src/command-pack.c:466
+ msgid "Overwrite an existing pack"
+-msgstr ""
++msgstr "既存のパックの上書き"
+
+ #: subprojects/extensions-tool/src/command-pack.c:470
+ msgid "The directory where the pack should be created"
+-msgstr ""
++msgstr "パックを作成するディレクトリー"
+
+ #: subprojects/extensions-tool/src/command-pack.c:472
+ msgid "SOURCE_DIRECTORY"
+-msgstr ""
++msgstr "ソースディレクトリー"
+
+ #: subprojects/extensions-tool/src/command-pack.c:481
+ msgid "Create an extension bundle"
+-msgstr ""
++msgstr "拡張機能バンドルの作成"
+
+ #: subprojects/extensions-tool/src/command-pack.c:501
+ msgid "More than one source directory specified"
+@@ -2761,7 +2753,12 @@ msgstr "ソースディレクトリが複数指定されています"
+ msgid "Extension “%s” doesn't have preferences\n"
+ msgstr "“%s”拡張機能には設定がありません\n"
+
+-#: subprojects/extensions-tool/src/command-prefs.c:79
++#: subprojects/extensions-tool/src/command-prefs.c:62
++#, c-format
++msgid "Failed to open prefs for extension “%s”: %s\n"
++msgstr "拡張機能 \"%s\" の設定が表示できませんでした: %s\n"
++
++#: subprojects/extensions-tool/src/command-prefs.c:87
+ msgid "Opens extension preferences"
+ msgstr "拡張機能の設定を開きます"
+
+@@ -2770,6 +2767,7 @@ msgid "Reset an extension"
+ msgstr "拡張機能をリセットします"
+
+ #: subprojects/extensions-tool/src/command-uninstall.c:49
++#, c-format
+ msgid "Cannot uninstall system extensions\n"
+ msgstr "システムの拡張機能はアンインストールできません\n"
+
+@@ -2784,11 +2782,7 @@ msgstr "拡張機能をアンインストールします"
+
+ #: subprojects/extensions-tool/src/main.c:72
+ msgid "Do not print error messages"
+-msgstr ""
+-
+-#: subprojects/extensions-tool/src/main.c:146
+-msgid "Failed to connect to GNOME Shell"
+-msgstr "GNOME Shell への接続に失敗しました"
++msgstr "エラーメッセージを出力しない"
+
+ #: subprojects/extensions-tool/src/main.c:244
+ msgid "Path"
+@@ -2806,89 +2800,89 @@ msgstr "オリジナルの作者"
+ msgid "State"
+ msgstr "状態"
+
+-#: subprojects/extensions-tool/src/main.c:290
++#: subprojects/extensions-tool/src/main.c:294
+ msgid "“version” takes no arguments"
+ msgstr "“version”は引数を取りません"
+
+-#: subprojects/extensions-tool/src/main.c:292
+-#: subprojects/extensions-tool/src/main.c:312
++#: subprojects/extensions-tool/src/main.c:296
++#: subprojects/extensions-tool/src/main.c:316
+ msgid "Usage:"
+ msgstr "使用法:"
+
+-#: subprojects/extensions-tool/src/main.c:295
++#: subprojects/extensions-tool/src/main.c:299
+ msgid "Print version information and exit."
+ msgstr "バージョン情報を表示して終了します。"
+
+-#: subprojects/extensions-tool/src/main.c:310
+-#: subprojects/extensions-tool/src/main.c:313
++#: subprojects/extensions-tool/src/main.c:314
++#: subprojects/extensions-tool/src/main.c:317
+ msgid "COMMAND"
+-msgstr ""
++msgstr "コマンド"
+
+-#: subprojects/extensions-tool/src/main.c:313
++#: subprojects/extensions-tool/src/main.c:317
+ msgid "[ARGS…]"
+ msgstr "[引数…]"
+
+-#: subprojects/extensions-tool/src/main.c:315
++#: subprojects/extensions-tool/src/main.c:319
+ msgid "Commands:"
+ msgstr "コマンド:"
+
+-#: subprojects/extensions-tool/src/main.c:316
++#: subprojects/extensions-tool/src/main.c:320
+ msgid "Print help"
+ msgstr "ヘルプを表示する"
+
+-#: subprojects/extensions-tool/src/main.c:318
++#: subprojects/extensions-tool/src/main.c:322
+ msgid "Enable extension"
+ msgstr "拡張機能を有効にする"
+
+-#: subprojects/extensions-tool/src/main.c:319
++#: subprojects/extensions-tool/src/main.c:323
+ msgid "Disable extension"
+ msgstr "拡張機能を無効にする"
+
+-#: subprojects/extensions-tool/src/main.c:320
++#: subprojects/extensions-tool/src/main.c:324
+ msgid "Reset extension"
+ msgstr "拡張機能をリセットする"
+
+-#: subprojects/extensions-tool/src/main.c:321
++#: subprojects/extensions-tool/src/main.c:325
+ msgid "Uninstall extension"
+ msgstr "拡張機能をアンインストールする"
+
+-#: subprojects/extensions-tool/src/main.c:322
++#: subprojects/extensions-tool/src/main.c:326
+ msgid "List extensions"
+ msgstr "拡張機能一覧を表示する"
+
+-#: subprojects/extensions-tool/src/main.c:323
+-#: subprojects/extensions-tool/src/main.c:324
++#: subprojects/extensions-tool/src/main.c:327
++#: subprojects/extensions-tool/src/main.c:328
+ msgid "Show extension info"
+ msgstr "拡張機能の情報を表示する"
+
+-#: subprojects/extensions-tool/src/main.c:325
++#: subprojects/extensions-tool/src/main.c:329
+ msgid "Open extension preferences"
+ msgstr "拡張機能の設定を開く"
+
+-#: subprojects/extensions-tool/src/main.c:326
++#: subprojects/extensions-tool/src/main.c:330
+ msgid "Create extension"
+ msgstr "拡張機能を作成する"
+
+-#: subprojects/extensions-tool/src/main.c:327
++#: subprojects/extensions-tool/src/main.c:331
+ msgid "Package extension"
+-msgstr ""
++msgstr "パッケージの拡張機能"
+
+-#: subprojects/extensions-tool/src/main.c:328
++#: subprojects/extensions-tool/src/main.c:332
+ msgid "Install extension bundle"
+-msgstr ""
++msgstr "拡張バンドルのインストール"
+
+-#: subprojects/extensions-tool/src/main.c:330
++#: subprojects/extensions-tool/src/main.c:334
+ #, c-format
+ msgid "Use “%s” to get detailed help.\n"
+ msgstr "“%s”を使用すると詳細なヘルプが表示されます。\n"
+
+ #: subprojects/extensions-tool/src/templates/00-plain.desktop.in:4
+ msgid "Plain"
+-msgstr ""
++msgstr "プレーン"
+
+ #: subprojects/extensions-tool/src/templates/00-plain.desktop.in:5
+ msgid "An empty extension"
+-msgstr ""
++msgstr "拡張機能が空です"
+
+ #: subprojects/extensions-tool/src/templates/indicator.desktop.in:4
+ msgid "Indicator"
+@@ -2900,7 +2894,7 @@ msgstr "トップバーにアイコンを追加します"
+
+ #. translators:
+ #. * The number of sound outputs on a particular device
+-#: subprojects/gvc/gvc-mixer-control.c:1899
++#: subprojects/gvc/gvc-mixer-control.c:1907
+ #, c-format
+ msgid "%u Output"
+ msgid_plural "%u Outputs"
+@@ -2908,16 +2902,35 @@ msgstr[0] "出力数: %u"
+
+ #. translators:
+ #. * The number of sound inputs on a particular device
+-#: subprojects/gvc/gvc-mixer-control.c:1909
++#: subprojects/gvc/gvc-mixer-control.c:1917
+ #, c-format
+ msgid "%u Input"
+ msgid_plural "%u Inputs"
+ msgstr[0] "入力数: %u"
+
+-#: subprojects/gvc/gvc-mixer-control.c:2766
++#: subprojects/gvc/gvc-mixer-control.c:2867
+ msgid "System Sounds"
+ msgstr "システムのサウンド"
+
++#~ msgid "App Picker View"
++#~ msgstr "アプリ一覧画面"
++
++#~ msgid "Index of the currently selected view in the application picker."
++#~ msgstr "現在のアプリケーション一覧画面のインデックスです。"
++
++#~ msgid "Enable introspection API"
++#~ msgstr "イントロスペクション API を有効にする"
++
++#~ msgid ""
++#~ "Enables a D-Bus API that allows to introspect the application state of "
++#~ "the shell."
++#~ msgstr ""
++#~ "Shell のアプリケーション状態をイントロスペクトできる D-Bus API を有効にし"
++#~ "ます。"
++
++#~ msgid "Failed to connect to GNOME Shell"
++#~ msgstr "GNOME Shell への接続に失敗しました"
++
+ #~ msgid "Frequently used applications will appear here"
+ #~ msgstr "よく使用するアプリケーションがここに表示されます"
+
+@@ -2938,10 +2951,6 @@ msgstr "システムのサウンド"
+ #~ msgid "Copy Error"
+ #~ msgstr "エラーをコピー"
+
+-#~ msgid "%d Connected"
+-#~ msgid_plural "%d Connected"
+-#~ msgstr[0] "%d 台接続"
+-
+ #~ msgid "Off"
+ #~ msgstr "オフ"
+
+@@ -2971,5 +2980,3 @@ msgstr "システムのサウンド"
+ #~ msgid "If true, display the ISO week date in the calendar."
+ #~ msgstr "ISO 8601 方式の暦週日付を表示します。"
+
+-#~ msgid "Not In Use"
+-#~ msgstr "未使用"
+diff --git a/po/ko.po b/po/ko.po
+index 168e2d0bc..7dbc7ba15 100644
+--- a/po/ko.po
++++ b/po/ko.po
+@@ -19,8 +19,8 @@
+ msgid ""
+ msgstr ""
+ "Project-Id-Version: gnome-shell\n"
+-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
+-"POT-Creation-Date: 2021-03-10 15:21+0000\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2023-01-19 16:43+0100\n"
+ "PO-Revision-Date: 2021-03-11 10:10+0900\n"
+ "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
+ "Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
+@@ -82,10 +82,7 @@ msgid ""
+ "should be loaded. Any extension that wants to be loaded needs to be in this "
+ "list. You can also manipulate this list with the EnableExtension and "
+ "DisableExtension D-Bus methods on org.gnome.Shell."
+-msgstr ""
+-"그놈 셸 확장에는 UUID 속성이 있습니다. 이 키는 읽어들일 확장의 UUID를 나열합"
+-"니다. 읽어들이려는 확장은 모두 이 목록에 들어 있어야 합니다. EnableExtension "
+-"및 DisableExtension D-버스 메소드를 이용해 이 목록을 조작할 수도 있습니다."
++msgstr "그놈 셸 확장에는 UUID 속성이 있습니다. 이 키는 읽어들일 확장의 UUID를 나열합니다. 읽어들이려는 확장은 모두 이 목록에 들어 있어야 합니다. EnableExtension 및 DisableExtension D-버스 메소드를 이용해 이 목록을 조작할 수도 있습니다."
+
+ #: data/org.gnome.shell.gschema.xml.in:26
+ msgid "UUIDs of extensions to force disabling"
+@@ -98,12 +95,7 @@ msgid ""
+ "manipulate this list with the EnableExtension and DisableExtension D-Bus "
+ "methods on org.gnome.Shell. This key takes precedence over the “enabled-"
+ "extensions” setting."
+-msgstr ""
+-"그놈 셸 확장에는 UUID 속성이 있습니다. 이 키는 사용하지 않을 확장의 UUID를 나"
+-"열합니다. 현재 모드의 일부로 해당 확장을 읽어들이더라도 사용하지 않습니다. "
+-"org.gnome.Shell의 EnableExtension 및 DisableExtension D-버스 메소드를 이용해 "
+-"이 목록을 조작할 수도 있습니다. 이 키가 “enabled-extensions” 설정보다 우선합"
+-"니다."
++msgstr "그놈 셸 확장에는 UUID 속성이 있습니다. 이 키는 사용하지 않을 확장의 UUID를 나열합니다. 현재 모드의 일부로 해당 확장을 읽어들이더라도 사용하지 않습니다. org.gnome.Shell의 EnableExtension 및 DisableExtension D-버스 메소드를 이용해 이 목록을 조작할 수도 있습니다. 이 키가 “enabled-extensions” 설정보다 우선합니다."
+
+ #: data/org.gnome.shell.gschema.xml.in:37
+ msgid "Disable user extensions"
+@@ -113,9 +105,7 @@ msgstr "사용자 확장 기능 사용하지 않기"
+ msgid ""
+ "Disable all extensions the user has enabled without affecting the “enabled-"
+ "extension” setting."
+-msgstr ""
+-"“enabled-extension” 설정에 영향을 미치지 않고, 사용자가 켠 확장 기능을 모두 "
+-"사용하지 않습니다."
++msgstr "“enabled-extension” 설정에 영향을 미치지 않고, 사용자가 켠 확장 기능을 모두 사용하지 않습니다."
+
+ #: data/org.gnome.shell.gschema.xml.in:45
+ msgid "Disables the validation of extension version compatibility"
+@@ -126,10 +116,7 @@ msgid ""
+ "GNOME Shell will only load extensions that claim to support the current "
+ "running version. Enabling this option will disable this check and try to "
+ "load all extensions regardless of the versions they claim to support."
+-msgstr ""
+-"그놈 셸에서 현재 실행 중인 버전을 지원하는 확장 기능만 읽어들입니다. 이 옵션"
+-"을 사용하면 이 버전 검사를 하지 않고, 지원한다고 지정된 버전에 관계없이 모든 "
+-"확장 기능을 읽어들입니다."
++msgstr "그놈 셸에서 현재 실행 중인 버전을 지원하는 확장 기능만 읽어들입니다. 이 옵션을 사용하면 이 버전 검사를 하지 않고, 지원한다고 지정된 버전에 관계없이 모든 확장 기능을 읽어들입니다."
+
+ #: data/org.gnome.shell.gschema.xml.in:54
+ msgid "List of desktop file IDs for favorite applications"
+@@ -158,16 +145,12 @@ msgstr "사용자 메뉴에 “로그아웃” 메뉴 항목을 항상 표시합
+ msgid ""
+ "This key overrides the automatic hiding of the “Log out” menu item in single-"
+ "user, single-session situations."
+-msgstr ""
+-"이 키를 설정하면, 단일 사용자 및 단일 세션에서 “로그아웃” 메뉴 항목 자동 감추"
+-"기 기능을 사용하지 않습니다."
++msgstr "이 키를 설정하면, 단일 사용자 및 단일 세션에서 “로그아웃” 메뉴 항목 자동 감추기 기능을 사용하지 않습니다."
+
+ #: data/org.gnome.shell.gschema.xml.in:79
+ msgid ""
+ "Whether to remember password for mounting encrypted or remote filesystems"
+-msgstr ""
+-"암호화 볼륨을 마운트하거나 원격 파일 시스템을 마운트할 때 암호를 저장할지 여"
+-"부"
++msgstr "암호화 볼륨을 마운트하거나 원격 파일 시스템을 마운트할 때 암호를 저장할지 여부"
+
+ #: data/org.gnome.shell.gschema.xml.in:80
+ msgid ""
+@@ -175,10 +158,7 @@ msgid ""
+ "filesystem is mounted. If the password can be saved for future use a "
+ "“Remember Password” checkbox will be present. This key sets the default "
+ "state of the checkbox."
+-msgstr ""
+-"암호화된 저장 장치나 원격 파일 시스템을 마운트하는 경우 암호를 입력해야 합니"
+-"다. 암호를 저장할 수 있으면 “암호 저장” 확인란이 나타납니다. 이 키에서는 이 "
+-"확인란의 기본 상태를 지정합니다."
++msgstr "암호화된 저장 장치나 원격 파일 시스템을 마운트하는 경우 암호를 입력해야 합니다. 암호를 저장할 수 있으면 “암호 저장” 확인란이 나타납니다. 이 키에서는 이 확인란의 기본 상태를 지정합니다."
+
+ #: data/org.gnome.shell.gschema.xml.in:89
+ msgid ""
+@@ -191,10 +171,7 @@ msgid ""
+ "powered, or if there were devices set up associated with the default "
+ "adapter. This will be reset if the default adapter is ever seen not to have "
+ "devices associated to it."
+-msgstr ""
+-"그놈 셸에서는 블루투스 어댑터에 전원이 들어오거나, 기본 어댑터에 연결 설정한 "
+-"장치가 있을 경우엠나 경우에만 블루투스 메뉴 항목을 표시합니다. 기본 어댑터에 "
+-"연결된 장치가 하나도 없는 상황이 발견되면 이 값을 초기화합니다."
++msgstr "그놈 셸에서는 블루투스 어댑터에 전원이 들어오거나, 기본 어댑터에 연결 설정한 장치가 있을 경우엠나 경우에만 블루투스 메뉴 항목을 표시합니다. 기본 어댑터에 연결된 장치가 하나도 없는 상황이 발견되면 이 값을 초기화합니다."
+
+ #: data/org.gnome.shell.gschema.xml.in:99
+ msgid "The last version the “Welcome to GNOME” dialog was shown for"
+@@ -206,212 +183,188 @@ msgid ""
+ "shown. An empty string represents the oldest possible version, and a huge "
+ "number will represent versions that do not exist yet. This huge number can "
+ "be used to effectively disable the dialog."
+-msgstr ""
+-"이 키는 “환영합니다 — 그놈” 대화 상자가 최근 표시된 버전을 지정합니다. 빈 문"
+-"자열이면 가능한 가장 오래된 버전을 뜻하고, 매우 큰 번호는 아직 없는 버전을 뜻"
+-"합니다. 매우 큰 번호를 써서 이 대화상자를 표시하지 않는 방법으로 사용할 수 있"
+-"습니다."
++msgstr "이 키는 “환영합니다 — 그놈” 대화 상자가 최근 표시된 버전을 지정합니다. 빈 문자열이면 가능한 가장 오래된 버전을 뜻하고, 매우 큰 번호는 아직 없는 버전을 뜻합니다. 매우 큰 번호를 써서 이 대화상자를 표시하지 않는 방법으로 사용할 수 있습니다."
+
+-#: data/org.gnome.shell.gschema.xml.in:109
+-msgid "Enable introspection API"
+-msgstr "상태 점검 API 사용"
+-
+-#: data/org.gnome.shell.gschema.xml.in:110
+-msgid ""
+-"Enables a D-Bus API that allows to introspect the application state of the "
+-"shell."
+-msgstr "프로그램에서 셸의 상태를 점검하도록 허용하는 D-버스 API를 사용합니다."
+-
+-#: data/org.gnome.shell.gschema.xml.in:141
++#: data/org.gnome.shell.gschema.xml.in:133
+ msgid "Layout of the app picker"
+ msgstr "프로그램 고르기의 배치"
+
+-#: data/org.gnome.shell.gschema.xml.in:142
++#: data/org.gnome.shell.gschema.xml.in:134
+ msgid ""
+ "Layout of the app picker. Each entry in the array is a page. Pages are "
+ "stored in the order they appear in GNOME Shell. Each page contains an "
+ "“application id” → 'data' pair. Currently, the following values are stored "
+ "as 'data': • “position”: the position of the application icon in the page"
+-msgstr ""
+-"프로그램 고르기의 배치. 배열의 각 항목은 페이지입니다. 페이지는 그놈 셸에 나"
+-"타나는 순서로 저장됩니다. 각 페이지에는 “application id” → 'data'의 쌍이 하"
+-"나 들어 있습니다. 현재 다음 값이 'data'로 저장됩니다: • “position”: 페이지에"
+-"서 프로그램 아이콘의 위치"
++msgstr "프로그램 고르기의 배치. 배열의 각 항목은 페이지입니다. 페이지는 그놈 셸에 나타나는 순서로 저장됩니다. 각 페이지에는 “application id” → 'data'의 쌍이 하나 들어 있습니다. 현재 다음 값이 'data'로 저장됩니다: • “position”: 페이지에서 프로그램 아이콘의 위치"
+
+-#: data/org.gnome.shell.gschema.xml.in:157
++#: data/org.gnome.shell.gschema.xml.in:149
+ msgid "Keybinding to open the application menu"
+ msgstr "프로그램 메뉴를 여는 키 바인딩"
+
+-#: data/org.gnome.shell.gschema.xml.in:158
++#: data/org.gnome.shell.gschema.xml.in:150
+ msgid "Keybinding to open the application menu."
+ msgstr "프로그램 메뉴를 여는 키 바인딩."
+
+-#: data/org.gnome.shell.gschema.xml.in:164
+-#: data/org.gnome.shell.gschema.xml.in:171
++#: data/org.gnome.shell.gschema.xml.in:156
++#: data/org.gnome.shell.gschema.xml.in:163
+ msgid "Keybinding to shift between overview states"
+ msgstr "현재 활동 요약 상태를 전환하는 키 바인딩"
+
+-#: data/org.gnome.shell.gschema.xml.in:165
++#: data/org.gnome.shell.gschema.xml.in:157
+ msgid "Keybinding to shift between session, window picker and app grid"
+ msgstr "세션, 창 고르기, 앱 그리드 사이에서 전환하는 키바인딩"
+
+-#: data/org.gnome.shell.gschema.xml.in:172
++#: data/org.gnome.shell.gschema.xml.in:164
+ msgid "Keybinding to shift between app grid, window picker and session"
+ msgstr "앱 그리드, 창 고르기, 세션 사이에서 전환하는 키바인딩"
+
+-#: data/org.gnome.shell.gschema.xml.in:178
++#: data/org.gnome.shell.gschema.xml.in:170
+ msgid "Keybinding to open the “Show Applications” view"
+ msgstr "“프로그램 보기” 뷰를 여는 키 바인딩"
+
+-#: data/org.gnome.shell.gschema.xml.in:179
++#: data/org.gnome.shell.gschema.xml.in:171
+ msgid ""
+ "Keybinding to open the “Show Applications” view of the Activities Overview."
+ msgstr "현재 활동 요약의 “프로그램 보기” 뷰를 여는 키 바인딩."
+
+-#: data/org.gnome.shell.gschema.xml.in:186
++#: data/org.gnome.shell.gschema.xml.in:178
+ msgid "Keybinding to open the overview"
+ msgstr "현재 활동 요약을 여는 키 바인딩"
+
+-#: data/org.gnome.shell.gschema.xml.in:187
++#: data/org.gnome.shell.gschema.xml.in:179
+ msgid "Keybinding to open the Activities Overview."
+ msgstr "현재 활동 요약을 여는 키 바인딩."
+
+-#: data/org.gnome.shell.gschema.xml.in:193
++#: data/org.gnome.shell.gschema.xml.in:185
+ msgid "Keybinding to toggle the visibility of the notification list"
+ msgstr "알림 목록 보이기를 토글하는 키 바인딩"
+
+-#: data/org.gnome.shell.gschema.xml.in:194
++#: data/org.gnome.shell.gschema.xml.in:186
+ msgid "Keybinding to toggle the visibility of the notification list."
+ msgstr "알림 목록 보이기를 토글하는 키 바인딩."
+
+-#: data/org.gnome.shell.gschema.xml.in:200
++#: data/org.gnome.shell.gschema.xml.in:192
+ msgid "Keybinding to focus the active notification"
+ msgstr "현재 알림에 포커스하는 키 바인딩"
+
+-#: data/org.gnome.shell.gschema.xml.in:201
++#: data/org.gnome.shell.gschema.xml.in:193
+ msgid "Keybinding to focus the active notification."
+ msgstr "현재 알림에 포커스하는 키 바인딩."
+
+-#: data/org.gnome.shell.gschema.xml.in:207
++#: data/org.gnome.shell.gschema.xml.in:199
+ msgid "Switch to application 1"
+ msgstr "프로그램 1로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:211
++#: data/org.gnome.shell.gschema.xml.in:203
+ msgid "Switch to application 2"
+ msgstr "프로그램 2로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:215
++#: data/org.gnome.shell.gschema.xml.in:207
+ msgid "Switch to application 3"
+ msgstr "프로그램 3로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:219
++#: data/org.gnome.shell.gschema.xml.in:211
+ msgid "Switch to application 4"
+ msgstr "프로그램 4로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:223
++#: data/org.gnome.shell.gschema.xml.in:215
+ msgid "Switch to application 5"
+ msgstr "프로그램 5로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:227
++#: data/org.gnome.shell.gschema.xml.in:219
+ msgid "Switch to application 6"
+ msgstr "프로그램 6으로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:231
++#: data/org.gnome.shell.gschema.xml.in:223
+ msgid "Switch to application 7"
+ msgstr "프로그램 7로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:235
++#: data/org.gnome.shell.gschema.xml.in:227
+ msgid "Switch to application 8"
+ msgstr "프로그램 8로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:239
++#: data/org.gnome.shell.gschema.xml.in:231
+ msgid "Switch to application 9"
+ msgstr "프로그램 9로 전환"
+
+-#: data/org.gnome.shell.gschema.xml.in:248
+-#: data/org.gnome.shell.gschema.xml.in:275
++#: data/org.gnome.shell.gschema.xml.in:240
++#: data/org.gnome.shell.gschema.xml.in:267
+ msgid "Limit switcher to current workspace."
+ msgstr "프로그램 전환을 현재 작업 공간에만 한정."
+
+-#: data/org.gnome.shell.gschema.xml.in:249
++#: data/org.gnome.shell.gschema.xml.in:241
+ msgid ""
+ "If true, only applications that have windows on the current workspace are "
+ "shown in the switcher. Otherwise, all applications are included."
+-msgstr ""
+-"참이면, 현재 작업 공간에 창이 있는 프로그램만 프로그램 전환 창에 표시합니다. "
+-"참이 아니면 모든 프로그램을 표시합니다."
++msgstr "참이면, 현재 작업 공간에 창이 있는 프로그램만 프로그램 전환 창에 표시합니다. 참이 아니면 모든 프로그램을 표시합니다."
+
+-#: data/org.gnome.shell.gschema.xml.in:266
++#: data/org.gnome.shell.gschema.xml.in:258
+ msgid "The application icon mode."
+ msgstr "프로그램 아이콘 모드."
+
+-#: data/org.gnome.shell.gschema.xml.in:267
++#: data/org.gnome.shell.gschema.xml.in:259
+ msgid ""
+ "Configures how the windows are shown in the switcher. Valid possibilities "
+ "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
+ "only” (shows only the application icon) or “both”."
+-msgstr ""
+-"창 전환에서 창이 어떻게 표시될지 설정합니다. 가능한 값은: “thumbnail-only”(창"
+-"의 섬네일만 표시), “app-icon-only”(프로그램 아이콘만 표시), “both”(모두)."
++msgstr "창 전환에서 창이 어떻게 표시될지 설정합니다. 가능한 값은: “thumbnail-only”(창의 섬네일만 표시), “app-icon-only”(프로그램 아이콘만 표시), “both”(모두)."
+
+-#: data/org.gnome.shell.gschema.xml.in:276
++#: data/org.gnome.shell.gschema.xml.in:268
+ msgid ""
+ "If true, only windows from the current workspace are shown in the switcher. "
+ "Otherwise, all windows are included."
+-msgstr ""
+-"참이면, 현재 작업 공간에 창이 있는 창만 창 전환 창에 표시합니다. 거짓이면 모"
+-"든 창을 표시합니다."
++msgstr "참이면, 현재 작업 공간에 창이 있는 창만 창 전환 창에 표시합니다. 거짓이면 모든 창을 표시합니다."
+
+-#: data/org.gnome.shell.gschema.xml.in:286
++#: data/org.gnome.shell.gschema.xml.in:278
+ msgid "Locations"
+ msgstr "위치 목록"
+
+-#: data/org.gnome.shell.gschema.xml.in:287
++#: data/org.gnome.shell.gschema.xml.in:279
+ msgid "The locations to show in world clocks"
+ msgstr "세계 시계에서 표시할 위치 목록"
+
+-#: data/org.gnome.shell.gschema.xml.in:297
++#: data/org.gnome.shell.gschema.xml.in:289
+ msgid "Automatic location"
+ msgstr "자동 위치"
+
+-#: data/org.gnome.shell.gschema.xml.in:298
++#: data/org.gnome.shell.gschema.xml.in:290
+ msgid "Whether to fetch the current location or not"
+ msgstr "현재 위치를 가져올지 여부"
+
+-#: data/org.gnome.shell.gschema.xml.in:305
++#: data/org.gnome.shell.gschema.xml.in:297
+ msgid "Location"
+ msgstr "위치"
+
+-#: data/org.gnome.shell.gschema.xml.in:306
++#: data/org.gnome.shell.gschema.xml.in:298
+ msgid "The location for which to show a forecast"
+ msgstr "날씨 표시에 사용할 위치"
+
+-#: data/org.gnome.shell.gschema.xml.in:318
++#: data/org.gnome.shell.gschema.xml.in:310
+ msgid "Attach modal dialog to the parent window"
+ msgstr "상위 창에 모달 대화창 붙이기"
+
+-#: data/org.gnome.shell.gschema.xml.in:319
++#: data/org.gnome.shell.gschema.xml.in:311
++#: data/org.gnome.shell.gschema.xml.in:320
+ #: data/org.gnome.shell.gschema.xml.in:328
+ #: data/org.gnome.shell.gschema.xml.in:336
+ #: data/org.gnome.shell.gschema.xml.in:344
+-#: data/org.gnome.shell.gschema.xml.in:352
+ msgid ""
+ "This key overrides the key in org.gnome.mutter when running GNOME Shell."
+ msgstr "그놈 셸을 실행할 때 org.gnome.mutter의 키 대신 사용됩니다."
+
+-#: data/org.gnome.shell.gschema.xml.in:327
++#: data/org.gnome.shell.gschema.xml.in:319
+ msgid "Enable edge tiling when dropping windows on screen edges"
+ msgstr "화면 가장자리에 창을 놓을 때 가장자리에 맞춥니다"
+
+-#: data/org.gnome.shell.gschema.xml.in:335
++#: data/org.gnome.shell.gschema.xml.in:327
+ msgid "Workspaces are managed dynamically"
+ msgstr "작업 공간을 동적으로 관리"
+
+-#: data/org.gnome.shell.gschema.xml.in:343
++#: data/org.gnome.shell.gschema.xml.in:335
+ msgid "Workspaces only on primary monitor"
+ msgstr "주 모니터에서만 작업 공간 사용"
+
+-#: data/org.gnome.shell.gschema.xml.in:351
++#: data/org.gnome.shell.gschema.xml.in:343
+ msgid "Delay focus changes in mouse mode until the pointer stops moving"
+ msgstr "마우스 포인터가 움직이지 않을 때까지 포커스 전환을 미루기"
+
+@@ -429,9 +382,7 @@ msgid ""
+ "We’re very sorry, but there’s been a problem: the settings for this "
+ "extension can’t be displayed. We recommend that you report the issue to the "
+ "extension authors."
+-msgstr ""
+-"죄송하지만 문제가 발생했습니다. 이 확장의 설정을 표시할 수 없습니다. 확장 개"
+-"발자에게 이 문제를 알려주시기를 추천합니다."
++msgstr "죄송하지만 문제가 발생했습니다. 이 확장의 설정을 표시할 수 없습니다. 확장 개발자에게 이 문제를 알려주시기를 추천합니다."
+
+ #: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:64
+ msgid "Technical Details"
+@@ -445,16 +396,16 @@ msgstr "홈페이지"
+ msgid "Visit extension homepage"
+ msgstr "확장 홈페이지 보기"
+
+-#: js/gdm/authPrompt.js:141 js/ui/audioDeviceSelection.js:58
++#: js/gdm/authPrompt.js:150 js/ui/audioDeviceSelection.js:61
+ #: js/ui/components/networkAgent.js:111 js/ui/components/polkitAgent.js:138
+-#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:183
++#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:198
+ #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
+-#: js/ui/status/network.js:941 subprojects/extensions-app/js/main.js:183
++#: js/ui/status/network.js:978 subprojects/extensions-app/js/main.js:183
+ msgid "Cancel"
+ msgstr "취소"
+
+ #. Cisco LEAP
+-#: js/gdm/authPrompt.js:244 js/ui/components/networkAgent.js:210
++#: js/gdm/authPrompt.js:319 js/ui/components/networkAgent.js:210
+ #: js/ui/components/networkAgent.js:226 js/ui/components/networkAgent.js:250
+ #: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:291
+ #: js/ui/components/networkAgent.js:301 js/ui/components/polkitAgent.js:275
+@@ -466,13 +417,13 @@ msgstr "암호"
+ msgid "Choose Session"
+ msgstr "세션 선택"
+
+-#: js/gdm/loginDialog.js:456
++#: js/gdm/loginDialog.js:461
+ msgid "Not listed?"
+ msgstr "목록에 없습니까?"
+
+ #. Translators: this message is shown below the username entry field
+ #. to clue the user in on how to login to the local network realm
+-#: js/gdm/loginDialog.js:918
++#: js/gdm/loginDialog.js:926
+ #, javascript-format
+ msgid "(e.g., user or %s)"
+ msgstr "(예를 들어, 사용자 또는 %s)"
+@@ -480,28 +431,28 @@ msgstr "(예를 들어, 사용자 또는 %s)"
+ #. TTLS and PEAP are actually much more complicated, but this complication
+ #. is not visible here since we only care about phase2 authentication
+ #. (and don't even care of which one)
+-#: js/gdm/loginDialog.js:923 js/ui/components/networkAgent.js:246
++#: js/gdm/loginDialog.js:931 js/ui/components/networkAgent.js:246
+ #: js/ui/components/networkAgent.js:269 js/ui/components/networkAgent.js:287
+ msgid "Username"
+ msgstr "사용자 이름"
+
+-#: js/gdm/loginDialog.js:1258
++#: js/gdm/loginDialog.js:1285
+ msgid "Login Window"
+ msgstr "로그인 창"
+
+-#: js/gdm/util.js:430
++#: js/gdm/util.js:441
+ msgid "Authentication error"
+ msgstr "인증 오류"
+
+ #. Translators: this message is shown below the password entry field
+ #. to indicate the user can swipe their finger on the fingerprint reader
+-#: js/gdm/util.js:589
++#: js/gdm/util.js:622
+ msgid "(or swipe finger across reader)"
+ msgstr "(또는 지문을 센서에 문지르십시오)"
+
+ #. Translators: this message is shown below the password entry field
+ #. to indicate the user can place their finger on the fingerprint reader instead
+-#: js/gdm/util.js:594
++#: js/gdm/util.js:627
+ msgid "(or place finger on reader)"
+ msgstr "(또는 손가락을 센서에 대십시오)"
+
+@@ -576,9 +527,7 @@ msgstr "사용자 바꾸기"
+ #. Translators: A list of keywords that match the lock orientation action, separated by semicolons
+ #: js/misc/systemActions.js:132
+ msgid "lock orientation;unlock orientation;screen;rotation"
+-msgstr ""
+-"lock orientation;방향 잠금;unlock orientation;방향 잠금 해제;screen;화면;"
+-"rotation;회전"
++msgstr "lock orientation;방향 잠금;unlock orientation;방향 잠금 해제;screen;화면;rotation;회전"
+
+ #: js/misc/systemActions.js:232
+ msgctxt "search-result"
+@@ -590,80 +539,80 @@ msgctxt "search-result"
+ msgid "Lock Screen Rotation"
+ msgstr "화면 회전 잠금"
+
+-#: js/misc/util.js:120
++#: js/misc/util.js:121
+ msgid "Command not found"
+ msgstr "명령이 없습니다"
+
+ #. Replace "Error invoking GLib.shell_parse_argv: " with
+ #. something nicer
+-#: js/misc/util.js:156
++#: js/misc/util.js:157
+ msgid "Could not parse command:"
+ msgstr "명령어를 파싱할 수 없습니다:"
+
+-#: js/misc/util.js:164
++#: js/misc/util.js:165
+ #, javascript-format
+ msgid "Execution of “%s” failed:"
+ msgstr "“%s” 실행이 실패했습니다:"
+
+-#: js/misc/util.js:181
++#: js/misc/util.js:182
+ msgid "Just now"
+ msgstr "방금"
+
+-#: js/misc/util.js:183
++#: js/misc/util.js:184
+ #, javascript-format
+ msgid "%d minute ago"
+ msgid_plural "%d minutes ago"
+ msgstr[0] "%d분 전"
+
+-#: js/misc/util.js:187
++#: js/misc/util.js:188
+ #, javascript-format
+ msgid "%d hour ago"
+ msgid_plural "%d hours ago"
+ msgstr[0] "%d시간 전"
+
+-#: js/misc/util.js:191 js/ui/dateMenu.js:162
++#: js/misc/util.js:192 js/ui/dateMenu.js:163
+ msgid "Yesterday"
+ msgstr "어제"
+
+-#: js/misc/util.js:193
++#: js/misc/util.js:194
+ #, javascript-format
+ msgid "%d day ago"
+ msgid_plural "%d days ago"
+ msgstr[0] "%d일 전"
+
+-#: js/misc/util.js:197
++#: js/misc/util.js:198
+ #, javascript-format
+ msgid "%d week ago"
+ msgid_plural "%d weeks ago"
+ msgstr[0] "%d주 전"
+
+-#: js/misc/util.js:201
++#: js/misc/util.js:202
+ #, javascript-format
+ msgid "%d month ago"
+ msgid_plural "%d months ago"
+ msgstr[0] "%d달 전"
+
+-#: js/misc/util.js:204
++#: js/misc/util.js:205
+ #, javascript-format
+ msgid "%d year ago"
+ msgid_plural "%d years ago"
+ msgstr[0] "%d년 전"
+
+ #. Translators: Time in 24h format
+-#: js/misc/util.js:237
++#: js/misc/util.js:238
+ msgid "%H∶%M"
+ msgstr "%H∶%M"
+
+ #. Translators: this is the word "Yesterday" followed by a
+ #. time string in 24h format. i.e. "Yesterday, 14:30"
+-#: js/misc/util.js:243
++#: js/misc/util.js:244
+ #, no-c-format
+ msgid "Yesterday, %H∶%M"
+ msgstr "어제, %H:%M"
+
+ #. Translators: this is the week day name followed by a time
+ #. string in 24h format. i.e. "Monday, 14:30"
+-#: js/misc/util.js:249
++#: js/misc/util.js:250
+ #, no-c-format
+ msgid "%A, %H∶%M"
+ msgstr "%A, %H:%M"
+@@ -671,7 +620,7 @@ msgstr "%A, %H:%M"
+ #. Translators: this is the month name and day number
+ #. followed by a time string in 24h format.
+ #. i.e. "May 25, 14:30"
+-#: js/misc/util.js:255
++#: js/misc/util.js:256
+ #, no-c-format
+ msgid "%B %-d, %H∶%M"
+ msgstr "%B %-d일, %H∶%M"
+@@ -679,7 +628,7 @@ msgstr "%B %-d일, %H∶%M"
+ #. Translators: this is the month name, day number, year
+ #. number followed by a time string in 24h format.
+ #. i.e. "May 25 2012, 14:30"
+-#: js/misc/util.js:261
++#: js/misc/util.js:262
+ #, no-c-format
+ msgid "%B %-d %Y, %H∶%M"
+ msgstr "%Y년 %B %-d일, %H∶%M"
+@@ -687,20 +636,20 @@ msgstr "%Y년 %B %-d일, %H∶%M"
+ #. Show only the time if date is on today
+ #. eslint-disable-line no-lonely-if
+ #. Translators: Time in 12h format
+-#: js/misc/util.js:266
++#: js/misc/util.js:267
+ msgid "%l∶%M %p"
+ msgstr "%p %l∶%M"
+
+ #. Translators: this is the word "Yesterday" followed by a
+ #. time string in 12h format. i.e. "Yesterday, 2:30 pm"
+-#: js/misc/util.js:272
++#: js/misc/util.js:273
+ #, no-c-format
+ msgid "Yesterday, %l∶%M %p"
+ msgstr "어제, %p %l∶%M"
+
+ #. Translators: this is the week day name followed by a time
+ #. string in 12h format. i.e. "Monday, 2:30 pm"
+-#: js/misc/util.js:278
++#: js/misc/util.js:279
+ #, no-c-format
+ msgid "%A, %l∶%M %p"
+ msgstr "%A, %p %l∶%M"
+@@ -708,7 +657,7 @@ msgstr "%A, %p %l∶%M"
+ #. Translators: this is the month name and day number
+ #. followed by a time string in 12h format.
+ #. i.e. "May 25, 2:30 pm"
+-#: js/misc/util.js:284
++#: js/misc/util.js:285
+ #, no-c-format
+ msgid "%B %-d, %l∶%M %p"
+ msgstr "%B %-d일, %p %l∶%M"
+@@ -716,7 +665,7 @@ msgstr "%B %-d일, %p %l∶%M"
+ #. Translators: this is the month name, day number, year
+ #. number followed by a time string in 12h format.
+ #. i.e. "May 25 2012, 2:30 pm"
+-#: js/misc/util.js:290
++#: js/misc/util.js:291
+ #, no-c-format
+ msgid "%B %-d %Y, %l∶%M %p"
+ msgstr "%Y년 %B %-d일, %p %l∶%M"
+@@ -730,9 +679,7 @@ msgstr "핫스팟 로그인"
+ msgid ""
+ "Your connection to this hotspot login is not secure. Passwords or other "
+ "information you enter on this page can be viewed by people nearby."
+-msgstr ""
+-"이 핫스팟 로그인에 대한 연결은 안전하지 않습니다. 암호나 기타 이 페이지에서 "
+-"입력한 정보를 주변 사람이 볼 수 있습니다."
++msgstr "이 핫스팟 로그인에 대한 연결은 안전하지 않습니다. 암호나 기타 이 페이지에서 입력한 정보를 주변 사람이 볼 수 있습니다."
+
+ #. No support for non-modal system dialogs, so ignore the option
+ #. let modal = options['modal'] || true;
+@@ -744,46 +691,46 @@ msgstr "접근 거부"
+ msgid "Grant Access"
+ msgstr "접근 허용"
+
+-#: js/ui/appDisplay.js:1815
++#: js/ui/appDisplay.js:1862
+ msgid "Unnamed Folder"
+ msgstr "이름 없는 폴더"
+
+ #. Translators: This is the heading of a list of open windows
+-#: js/ui/appDisplay.js:3392 js/ui/panel.js:33
++#: js/ui/appDisplay.js:3455 js/ui/panel.js:33
+ msgid "Open Windows"
+ msgstr "열린 창"
+
+-#: js/ui/appDisplay.js:3411 js/ui/panel.js:40
++#: js/ui/appDisplay.js:3474 js/ui/panel.js:41
+ msgid "New Window"
+ msgstr "새 창"
+
+-#: js/ui/appDisplay.js:3427
++#: js/ui/appDisplay.js:3490
+ msgid "Launch using Integrated Graphics Card"
+ msgstr "내장 그래픽 카드를 사용해 시작"
+
+-#: js/ui/appDisplay.js:3428
++#: js/ui/appDisplay.js:3491
+ msgid "Launch using Discrete Graphics Card"
+ msgstr "외장 그래픽 카드를 사용해 시작"
+
+-#: js/ui/appDisplay.js:3457 js/ui/dash.js:245
++#: js/ui/appDisplay.js:3520 js/ui/dash.js:245
+ msgid "Remove from Favorites"
+ msgstr "즐겨찾기에서 제거"
+
+-#: js/ui/appDisplay.js:3463
++#: js/ui/appDisplay.js:3526
+ msgid "Add to Favorites"
+ msgstr "즐겨찾기에 추가"
+
+ # 주의: "Show ..." 형태지만 보이기로 번역하지 않는다
+-#: js/ui/appDisplay.js:3473 js/ui/panel.js:51
++#: js/ui/appDisplay.js:3536 js/ui/panel.js:52
+ msgid "Show Details"
+ msgstr "자세히 보기"
+
+-#: js/ui/appFavorites.js:164
++#: js/ui/appFavorites.js:165
+ #, javascript-format
+ msgid "%s has been added to your favorites."
+ msgstr "%s 프로그램을 즐겨찾기에 추가했습니다."
+
+-#: js/ui/appFavorites.js:197
++#: js/ui/appFavorites.js:198
+ #, javascript-format
+ msgid "%s has been removed from your favorites."
+ msgstr "%s 프로그램을 즐겨찾기에서 제거했습니다."
+@@ -792,19 +739,19 @@ msgstr "%s 프로그램을 즐겨찾기에서 제거했습니다."
+ msgid "Select Audio Device"
+ msgstr "오디오 장치 선택"
+
+-#: js/ui/audioDeviceSelection.js:55
++#: js/ui/audioDeviceSelection.js:56
+ msgid "Sound Settings"
+ msgstr "사운드 설정"
+
+-#: js/ui/audioDeviceSelection.js:65
++#: js/ui/audioDeviceSelection.js:69
+ msgid "Headphones"
+ msgstr "헤드폰"
+
+-#: js/ui/audioDeviceSelection.js:67
++#: js/ui/audioDeviceSelection.js:71
+ msgid "Headset"
+ msgstr "헤드셋"
+
+-#: js/ui/audioDeviceSelection.js:69 js/ui/status/volume.js:277
++#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:278
+ msgid "Microphone"
+ msgstr "마이크"
+
+@@ -821,7 +768,7 @@ msgid "Settings"
+ msgstr "설정"
+
+ #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
+-#: js/ui/calendar.js:36
++#: js/ui/calendar.js:35
+ msgctxt "calendar-no-work"
+ msgid "06"
+ msgstr "06"
+@@ -831,43 +778,43 @@ msgstr "06"
+ #. * NOTE: These grid abbreviations are always shown together
+ #. * and in order, e.g. "S M T W T F S".
+ #.
+-#: js/ui/calendar.js:65
++#: js/ui/calendar.js:61
+ msgctxt "grid sunday"
+ msgid "S"
+ msgstr "일"
+
+ #. Translators: Calendar grid abbreviation for Monday
+-#: js/ui/calendar.js:67
++#: js/ui/calendar.js:63
+ msgctxt "grid monday"
+ msgid "M"
+ msgstr "월"
+
+ #. Translators: Calendar grid abbreviation for Tuesday
+-#: js/ui/calendar.js:69
++#: js/ui/calendar.js:65
+ msgctxt "grid tuesday"
+ msgid "T"
+ msgstr "화"
+
+ #. Translators: Calendar grid abbreviation for Wednesday
+-#: js/ui/calendar.js:71
++#: js/ui/calendar.js:67
+ msgctxt "grid wednesday"
+ msgid "W"
+ msgstr "수"
+
+ #. Translators: Calendar grid abbreviation for Thursday
+-#: js/ui/calendar.js:73
++#: js/ui/calendar.js:69
+ msgctxt "grid thursday"
+ msgid "T"
+ msgstr "목"
+
+ #. Translators: Calendar grid abbreviation for Friday
+-#: js/ui/calendar.js:75
++#: js/ui/calendar.js:71
+ msgctxt "grid friday"
+ msgid "F"
+ msgstr "금"
+
+ #. Translators: Calendar grid abbreviation for Saturday
+-#: js/ui/calendar.js:77
++#: js/ui/calendar.js:73
+ msgctxt "grid saturday"
+ msgid "S"
+ msgstr "토"
+@@ -878,7 +825,7 @@ msgstr "토"
+ #. * "%OB" is the new format specifier introduced in glibc 2.27,
+ #. * in most cases you should not change it.
+ #.
+-#: js/ui/calendar.js:392
++#: js/ui/calendar.js:400
+ msgid "%OB"
+ msgstr "%OB"
+
+@@ -891,37 +838,37 @@ msgstr "%OB"
+ #. * in most cases you should not use the old "%B" here unless you
+ #. * absolutely know what you are doing.
+ #.
+-#: js/ui/calendar.js:402
++#: js/ui/calendar.js:410
+ msgid "%OB %Y"
+ msgstr "%Y년 %OB"
+
+-#: js/ui/calendar.js:461
++#: js/ui/calendar.js:469
+ msgid "Previous month"
+ msgstr "이전 달"
+
+-#: js/ui/calendar.js:476
++#: js/ui/calendar.js:484
+ msgid "Next month"
+ msgstr "다음 달"
+
+-#: js/ui/calendar.js:626
++#: js/ui/calendar.js:632
+ #, no-javascript-format
+ msgctxt "date day number format"
+ msgid "%d"
+ msgstr "%d"
+
+-#: js/ui/calendar.js:682
++#: js/ui/calendar.js:688
+ msgid "Week %V"
+ msgstr "주 %V"
+
+-#: js/ui/calendar.js:896
++#: js/ui/calendar.js:902
+ msgid "No Notifications"
+ msgstr "알림 없음"
+
+-#: js/ui/calendar.js:950
++#: js/ui/calendar.js:956
+ msgid "Do Not Disturb"
+ msgstr "방해 금지"
+
+-#: js/ui/calendar.js:969
++#: js/ui/calendar.js:977
+ msgid "Clear"
+ msgstr "지우기"
+
+@@ -935,8 +882,7 @@ msgstr "“%s” 프로그램이 응답하지 않습니다."
+ msgid ""
+ "You may choose to wait a short while for it to continue or force the "
+ "application to quit entirely."
+-msgstr ""
+-"좀 더 기다려서 계속 할 수도 있고, 강제로 프로그램을 끝낼 수도 있습니다."
++msgstr "좀 더 기다려서 계속 할 수도 있고, 강제로 프로그램을 끝낼 수도 있습니다."
+
+ #: js/ui/closeDialog.js:70
+ msgid "Force Quit"
+@@ -972,8 +918,8 @@ msgid ""
+ "Alternatively you can connect by pushing the “WPS” button on your router."
+ msgstr "다른 방법으로 라우터의 “WPS” 단추를 눌러서 연결할 수 있습니다."
+
+-#: js/ui/components/networkAgent.js:105 js/ui/status/network.js:253
+-#: js/ui/status/network.js:344 js/ui/status/network.js:944
++#: js/ui/components/networkAgent.js:105 js/ui/status/network.js:258
++#: js/ui/status/network.js:349 js/ui/status/network.js:981
+ msgid "Connect"
+ msgstr "연결"
+
+@@ -1036,7 +982,7 @@ msgstr "PIN"
+ msgid "A password is required to connect to “%s”."
+ msgstr "“%s”에 연결하려면 암호가 필요합니다."
+
+-#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1718
++#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1792
+ msgid "Network Manager"
+ msgstr "네트워크 관리"
+
+@@ -1071,7 +1017,7 @@ msgstr "죄송합니다. 동작하지 않았습니다. 다시 시도하십시오
+ msgid "%s is now known as %s"
+ msgstr "%s의 대화명이 이제 %s입니다"
+
+-#: js/ui/ctrlAltTab.js:21 js/ui/overviewControls.js:377
++#: js/ui/ctrlAltTab.js:21 js/ui/overviewControls.js:404
+ msgid "Windows"
+ msgstr "창"
+
+@@ -1103,62 +1049,62 @@ msgid "%A %B %e %Y"
+ msgstr "%Y년 %B %e일 %A"
+
+ #. Translators: Shown on calendar heading when selected day occurs on current year
+-#: js/ui/dateMenu.js:151
++#: js/ui/dateMenu.js:152
+ msgctxt "calendar heading"
+ msgid "%B %-d"
+ msgstr "%B %-d일"
+
+ #. Translators: Shown on calendar heading when selected day occurs on different year
+-#: js/ui/dateMenu.js:154
++#: js/ui/dateMenu.js:155
+ msgctxt "calendar heading"
+ msgid "%B %-d %Y"
+ msgstr "%Y년 %B %-d일"
+
+-#: js/ui/dateMenu.js:160
++#: js/ui/dateMenu.js:161
+ msgid "Today"
+ msgstr "오늘"
+
+-#: js/ui/dateMenu.js:164
++#: js/ui/dateMenu.js:165
+ msgid "Tomorrow"
+ msgstr "내일"
+
+ #. Translators: Shown in calendar event list for all day events
+ #. * Keep it short, best if you can use less then 10 characters
+ #.
+-#: js/ui/dateMenu.js:180
++#: js/ui/dateMenu.js:181
+ msgctxt "event list time"
+ msgid "All Day"
+ msgstr "종일"
+
+-#: js/ui/dateMenu.js:231
++#: js/ui/dateMenu.js:232
+ msgid "No Events"
+ msgstr "행사 없음"
+
+-#: js/ui/dateMenu.js:348
++#: js/ui/dateMenu.js:349
+ msgid "Add world clocks…"
+ msgstr "세계 시계 추가…"
+
+-#: js/ui/dateMenu.js:349
++#: js/ui/dateMenu.js:350
+ msgid "World Clocks"
+ msgstr "세계 시계"
+
+-#: js/ui/dateMenu.js:629
++#: js/ui/dateMenu.js:630
+ msgid "Loading…"
+ msgstr "읽어들이는 중…"
+
+-#: js/ui/dateMenu.js:639
++#: js/ui/dateMenu.js:640
+ msgid "Go online for weather information"
+ msgstr "날씨 정보를 온라인으로 가져옵니다"
+
+-#: js/ui/dateMenu.js:641
++#: js/ui/dateMenu.js:642
+ msgid "Weather information is currently unavailable"
+ msgstr "날씨 정보를 현재 사용할 수 없습니다"
+
+-#: js/ui/dateMenu.js:651
++#: js/ui/dateMenu.js:652
+ msgid "Weather"
+ msgstr "날씨"
+
+-#: js/ui/dateMenu.js:653
++#: js/ui/dateMenu.js:654
+ msgid "Select weather location…"
+ msgstr "날씨 위치를 선택하십시오…"
+
+@@ -1245,8 +1191,7 @@ msgstr "다시 시작 및 업데이트 설치"
+ #: js/ui/endSessionDialog.js:104
+ #, javascript-format
+ msgid "The system will automatically restart and install updates in %d second."
+-msgid_plural ""
+-"The system will automatically restart and install updates in %d seconds."
++msgid_plural "The system will automatically restart and install updates in %d seconds."
+ msgstr[0] "시스템이 %d초 뒤에 자동으로 다시 시작하고 업데이트를 설치합니다."
+
+ #: js/ui/endSessionDialog.js:111 js/ui/endSessionDialog.js:132
+@@ -1277,9 +1222,7 @@ msgstr "다시 시작 및 업그레이드 설치"
+ msgid ""
+ "%s %s will be installed after restart. Upgrade installation can take a long "
+ "time: ensure that you have backed up and that the computer is plugged in."
+-msgstr ""
+-"다시 시작한 뒤에 %s %s 버전을 설치합니다. 업그레이드 설치가 오래 걸릴 수도 있"
+-"습니다: 백업을 하고 컴퓨터에 전원을 연결하십시오."
++msgstr "다시 시작한 뒤에 %s %s 버전을 설치합니다. 업그레이드 설치가 오래 걸릴 수도 있습니다: 백업을 하고 컴퓨터에 전원을 연결하십시오."
+
+ #: js/ui/endSessionDialog.js:284
+ msgid "Low battery power: please plug in before installing updates."
+@@ -1310,25 +1253,24 @@ msgstr "%s (원격)"
+ msgid "%s (console)"
+ msgstr "%s (콘솔)"
+
+-#: js/ui/extensionDownloader.js:187
++#: js/ui/extensionDownloader.js:202
+ msgid "Install"
+ msgstr "설치"
+
+-#: js/ui/extensionDownloader.js:193
++#: js/ui/extensionDownloader.js:208
+ msgid "Install Extension"
+ msgstr "확장 설치"
+
+-#: js/ui/extensionDownloader.js:194
++#: js/ui/extensionDownloader.js:209
+ #, javascript-format
+ msgid "Download and install “%s” from extensions.gnome.org?"
+-msgstr ""
+-"extensions.gnome.org 사이트에서 “%s” 확장을 다운로드해 설치하시겠습니까?"
++msgstr "extensions.gnome.org 사이트에서 “%s” 확장을 다운로드해 설치하시겠습니까?"
+
+-#: js/ui/extensionSystem.js:253
++#: js/ui/extensionSystem.js:275
+ msgid "Extension Updates Available"
+ msgstr "확장 업데이트가 있습니다"
+
+-#: js/ui/extensionSystem.js:254
++#: js/ui/extensionSystem.js:276
+ msgid "Extension updates are ready to be installed."
+ msgstr "확장 업데이트 설치할 준비가 되었습니다."
+
+@@ -1372,9 +1314,7 @@ msgstr "느린 키 끔"
+ msgid ""
+ "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."
+-msgstr ""
+-"Shift 키를 8초 동안 누르고 있었습니다. 느린 키 기능의 바로 가기이고, 이렇게 "
+-"하면 키보드 동작이 달라집니다."
++msgstr "Shift 키를 8초 동안 누르고 있었습니다. 느린 키 기능의 바로 가기이고, 이렇게 하면 키보드 동작이 달라집니다."
+
+ #: js/ui/kbdA11yDialog.js:40
+ msgid "Sticky Keys Turned On"
+@@ -1388,31 +1328,27 @@ msgstr "고정 키 끔"
+ msgid ""
+ "You just pressed the Shift key 5 times in a row. This is the shortcut for "
+ "the Sticky Keys feature, which affects the way your keyboard works."
+-msgstr ""
+-"Shift 키를 5번 연속으로 눌렀습니다. 고정 키 기능의 바로 가기이고, 이렇게 하"
+-"면 키보드 동작이 달라집니다."
++msgstr "Shift 키를 5번 연속으로 눌렀습니다. 고정 키 기능의 바로 가기이고, 이렇게 하면 키보드 동작이 달라집니다."
+
+ #: js/ui/kbdA11yDialog.js:45
+ msgid ""
+ "You just pressed two keys at once, or pressed the Shift key 5 times in a "
+ "row. This turns off the Sticky Keys feature, which affects the way your "
+ "keyboard works."
+-msgstr ""
+-"두 키를 동시에 누르거나, Shift 키를 5번 연속으로 눌렀습니다. 고정 키 기능을 "
+-"끄는 바로 가기이고, 이렇게 하면 키보드 동작이 달라집니다."
++msgstr "두 키를 동시에 누르거나, Shift 키를 5번 연속으로 눌렀습니다. 고정 키 기능을 끄는 바로 가기이고, 이렇게 하면 키보드 동작이 달라집니다."
+
+ #: js/ui/kbdA11yDialog.js:54
+ msgid "Leave On"
+ msgstr "계속 유지"
+
+ #: js/ui/kbdA11yDialog.js:54 js/ui/status/bluetooth.js:156
+-#: js/ui/status/network.js:1316
++#: js/ui/status/network.js:1381
+ msgid "Turn On"
+ msgstr "켜기"
+
+ #: js/ui/kbdA11yDialog.js:62 js/ui/status/bluetooth.js:156
+-#: js/ui/status/network.js:161 js/ui/status/network.js:345
+-#: js/ui/status/network.js:1316 js/ui/status/network.js:1428
++#: js/ui/status/network.js:166 js/ui/status/network.js:350
++#: js/ui/status/network.js:1381 js/ui/status/network.js:1493
+ #: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
+ #: js/ui/status/rfkill.js:110
+ msgid "Turn Off"
+@@ -1475,28 +1411,26 @@ msgstr "소스 보기"
+ msgid "Web Page"
+ msgstr "웹페이지"
+
+-#: js/ui/main.js:294
++#: js/ui/main.js:304
+ msgid "Logged in as a privileged user"
+ msgstr "관리자 권한으로 로그인"
+
+-#: js/ui/main.js:295
++#: js/ui/main.js:305
+ msgid ""
+ "Running a session as a privileged user should be avoided for security "
+ "reasons. If possible, you should log in as a normal user."
+-msgstr ""
+-"관리자 권한으로 세션을 시작하는 일은 보안 이유로 피해야 합니다. 할 수 있으면 "
+-"일반 유저로 로그인해야 합니다."
++msgstr "관리자 권한으로 세션을 시작하는 일은 보안 이유로 피해야 합니다. 할 수 있으면 일반 유저로 로그인해야 합니다."
+
+-#: js/ui/main.js:345
++#: js/ui/main.js:354
+ msgid "Screen Lock disabled"
+ msgstr "화면 잠금 사용하지 않음"
+
+ # GDM
+-#: js/ui/main.js:346
++#: js/ui/main.js:355
+ msgid "Screen Locking requires the GNOME display manager."
+ msgstr "화면 잠금은 그놈 디스플레이 관리자가 필요합니다."
+
+-#: js/ui/messageTray.js:1437
++#: js/ui/messageTray.js:1443
+ msgid "System Information"
+ msgstr "시스템 정보"
+
+@@ -1512,21 +1446,21 @@ msgstr "알 수 없는 제목"
+ #. in the search entry when no search is
+ #. active; it should not exceed ~30
+ #. characters.
+-#: js/ui/overviewControls.js:289
++#: js/ui/overviewControls.js:313
+ msgid "Type to search"
+ msgstr "검색하려면 입력하십시오"
+
+-#: js/ui/overviewControls.js:365
++#: js/ui/overviewControls.js:392
+ msgid "Applications"
+ msgstr "프로그램"
+
+-#: js/ui/overview.js:69
++#: js/ui/overview.js:58
+ msgid "Undo"
+ msgstr "실행 취소"
+
+ #. Translators: This is the main view to select
+ #. activities. See also note for "Activities" string.
+-#: js/ui/overview.js:82
++#: js/ui/overview.js:71
+ msgid "Overview"
+ msgstr "개요"
+
+@@ -1574,22 +1508,22 @@ msgstr "나가려면 Esc를 누르십시오"
+ msgid "Press any key to exit"
+ msgstr "나가려면 아무 키나 누르십시오"
+
+-#: js/ui/panel.js:65
++#: js/ui/panel.js:66
+ msgid "Quit"
+ msgstr "끝내기"
+
+ #. Translators: If there is no suitable word for "Activities"
+ #. in your language, you can use the word for "Overview".
+-#: js/ui/panel.js:388
++#: js/ui/panel.js:404
+ msgid "Activities"
+ msgstr "현재 활동"
+
+-#: js/ui/panel.js:659
++#: js/ui/panel.js:690
+ msgctxt "System menu in the top bar"
+ msgid "System"
+ msgstr "시스템"
+
+-#: js/ui/panel.js:771
++#: js/ui/panel.js:808
+ msgid "Top Bar"
+ msgstr "맨 위 표시줄"
+
+@@ -1609,7 +1543,7 @@ msgstr "웨일랜드에서는 다시 시작 기능을 사용할 수 없습니다
+ msgid "Restarting…"
+ msgstr "다시 시작하는 중…"
+
+-#: js/ui/screenShield.js:211
++#: js/ui/screenShield.js:221
+ msgid "GNOME needs to lock the screen"
+ msgstr "그놈에서 화면을 잠궈야 합니다"
+
+@@ -1620,27 +1554,27 @@ msgstr "그놈에서 화면을 잠궈야 합니다"
+ #.
+ #. XXX: another option is to kick the user into the gdm login
+ #. screen, where we're not affected by grabs
+-#: js/ui/screenShield.js:252 js/ui/screenShield.js:620
++#: js/ui/screenShield.js:270 js/ui/screenShield.js:638
+ msgid "Unable to lock"
+ msgstr "잠글 수 없습니다"
+
+-#: js/ui/screenShield.js:253 js/ui/screenShield.js:621
++#: js/ui/screenShield.js:271 js/ui/screenShield.js:639
+ msgid "Lock was blocked by an application"
+ msgstr "프로그램이 잠금을 막았습니다"
+
+-#: js/ui/screenshot.js:141
++#: js/ui/screenshot.js:155
+ msgid "Screenshot taken"
+ msgstr "찍은 스크린샷"
+
+-#: js/ui/search.js:824
++#: js/ui/search.js:826
+ msgid "Searching…"
+ msgstr "검색하는 중…"
+
+-#: js/ui/search.js:826
++#: js/ui/search.js:828
+ msgid "No results."
+ msgstr "결과가 없습니다."
+
+-#: js/ui/search.js:952
++#: js/ui/search.js:951
+ #, javascript-format
+ msgid "%d more"
+ msgid_plural "%d more"
+@@ -1688,9 +1622,7 @@ msgstr "keyfiles 사용"
+ #, javascript-format
+ msgid ""
+ "To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
+-msgstr ""
+-"keyfiles를 사용하는 볼륨의 잠금을 해제하려면, 대신 <i>%s</i> 유틸리티를 사용"
+-"하십시오."
++msgstr "keyfiles를 사용하는 볼륨의 잠금을 해제하려면, 대신 <i>%s</i> 유틸리티를 사용하십시오."
+
+ #: js/ui/shellMountOperation.js:306
+ msgid "PIM Number"
+@@ -1774,7 +1706,7 @@ msgstr "큰 글자"
+ msgid "Bluetooth"
+ msgstr "블루투스"
+
+-#: js/ui/status/bluetooth.js:49 js/ui/status/network.js:620
++#: js/ui/status/bluetooth.js:49 js/ui/status/network.js:652
+ msgid "Bluetooth Settings"
+ msgstr "블루투스 설정"
+
+@@ -1817,11 +1749,11 @@ msgstr "보조 누르기"
+ msgid "Dwell Click"
+ msgstr "머무르면 누르기"
+
+-#: js/ui/status/keyboard.js:825
++#: js/ui/status/keyboard.js:829
+ msgid "Keyboard"
+ msgstr "키보드"
+
+-#: js/ui/status/keyboard.js:842
++#: js/ui/status/keyboard.js:846
+ msgid "Show Keyboard Layout"
+ msgstr "키보드 배치 표시"
+
+@@ -1868,13 +1800,13 @@ msgid "<unknown>"
+ msgstr "<알 수 없음>"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:450 js/ui/status/network.js:1345
++#: js/ui/status/network.js:455 js/ui/status/network.js:1410
+ #, javascript-format
+ msgid "%s Off"
+ msgstr "%s 꺼짐"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:453
++#: js/ui/status/network.js:458
+ #, javascript-format
+ msgid "%s Connected"
+ msgstr "%s 연결됨"
+@@ -1882,186 +1814,186 @@ msgstr "%s 연결됨"
+ #. Translators: this is for network devices that are physically present but are not
+ #. under NetworkManager's control (and thus cannot be used in the menu);
+ #. %s is a network identifier
+-#: js/ui/status/network.js:458
++#: js/ui/status/network.js:463
+ #, javascript-format
+ msgid "%s Unmanaged"
+ msgstr "%s 관리되지 않음"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:461
++#: js/ui/status/network.js:466
+ #, javascript-format
+ msgid "%s Disconnecting"
+ msgstr "%s 연결 끊는 중"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:468 js/ui/status/network.js:1337
++#: js/ui/status/network.js:473 js/ui/status/network.js:1402
+ #, javascript-format
+ msgid "%s Connecting"
+ msgstr "%s 연결하는 중"
+
+ #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
+-#: js/ui/status/network.js:471
++#: js/ui/status/network.js:476
+ #, javascript-format
+ msgid "%s Requires Authentication"
+ msgstr "%s 인증 필요"
+
+ #. Translators: this is for devices that require some kind of firmware or kernel
+ #. module, which is missing; %s is a network identifier
+-#: js/ui/status/network.js:479
++#: js/ui/status/network.js:484
+ #, javascript-format
+ msgid "Firmware Missing For %s"
+ msgstr "%s에 필요한 펌웨어 없음"
+
+ #. Translators: this is for a network device that cannot be activated (for example it
+ #. is disabled by rfkill, or it has no coverage; %s is a network identifier
+-#: js/ui/status/network.js:483
++#: js/ui/status/network.js:488
+ #, javascript-format
+ msgid "%s Unavailable"
+ msgstr "%s 사용 불가"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:486
++#: js/ui/status/network.js:491
+ #, javascript-format
+ msgid "%s Connection Failed"
+ msgstr "%s 연결이 실패했습니다"
+
+-#: js/ui/status/network.js:498
++#: js/ui/status/network.js:503
+ msgid "Wired Settings"
+ msgstr "유선 네트워크 설정"
+
+-#: js/ui/status/network.js:541
++#: js/ui/status/network.js:550
+ msgid "Mobile Broadband Settings"
+ msgstr "휴대전화 네트워크 설정"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:587 js/ui/status/network.js:1342
++#: js/ui/status/network.js:619 js/ui/status/network.js:1407
+ #, javascript-format
+ msgid "%s Hardware Disabled"
+ msgstr "%s 하드웨어 사용 않음"
+
+ #. Translators: this is for a network device that cannot be activated
+ #. because it's disabled by rfkill (airplane mode); %s is a network identifier
+-#: js/ui/status/network.js:591
++#: js/ui/status/network.js:623
+ #, javascript-format
+ msgid "%s Disabled"
+ msgstr "%s 사용 않음"
+
+-#: js/ui/status/network.js:632
++#: js/ui/status/network.js:664
+ msgid "Connect to Internet"
+ msgstr "인터넷에 연결"
+
+-#: js/ui/status/network.js:836
++#: js/ui/status/network.js:873
+ msgid "Airplane Mode is On"
+ msgstr "비행기 모드 켜짐"
+
+-#: js/ui/status/network.js:837
++#: js/ui/status/network.js:874
+ msgid "Wi-Fi is disabled when airplane mode is on."
+ msgstr "비행기 모드에서는 와이파이를 사용하지 않습니다."
+
+-#: js/ui/status/network.js:838
++#: js/ui/status/network.js:875
+ msgid "Turn Off Airplane Mode"
+ msgstr "비행기 모드 끄기"
+
+-#: js/ui/status/network.js:847
++#: js/ui/status/network.js:884
+ msgid "Wi-Fi is Off"
+ msgstr "와이파이 꺼짐"
+
+-#: js/ui/status/network.js:848
++#: js/ui/status/network.js:885
+ msgid "Wi-Fi needs to be turned on in order to connect to a network."
+ msgstr "네트워크에 연결하려면 와이파이를 켜야 합니다."
+
+-#: js/ui/status/network.js:849
++#: js/ui/status/network.js:886
+ msgid "Turn On Wi-Fi"
+ msgstr "와이파이 켜기"
+
+-#: js/ui/status/network.js:874
++#: js/ui/status/network.js:911
+ msgid "Wi-Fi Networks"
+ msgstr "와이파이 네트워크"
+
+-#: js/ui/status/network.js:876
++#: js/ui/status/network.js:913
+ msgid "Select a network"
+ msgstr "네트워크를 선택하십시오"
+
+-#: js/ui/status/network.js:908
++#: js/ui/status/network.js:945
+ msgid "No Networks"
+ msgstr "네트워크 없음"
+
+-#: js/ui/status/network.js:929 js/ui/status/rfkill.js:108
++#: js/ui/status/network.js:966 js/ui/status/rfkill.js:108
+ msgid "Use hardware switch to turn off"
+ msgstr "끄려면 하드웨어 스위치를 사용하십시오"
+
+-#: js/ui/status/network.js:1206
++#: js/ui/status/network.js:1271
+ msgid "Select Network"
+ msgstr "네트워크 선택"
+
+-#: js/ui/status/network.js:1212
++#: js/ui/status/network.js:1277
+ msgid "Wi-Fi Settings"
+ msgstr "와이파이 설정"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:1333
++#: js/ui/status/network.js:1398
+ #, javascript-format
+ msgid "%s Hotspot Active"
+ msgstr "%s 핫스팟 사용 중"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:1348
++#: js/ui/status/network.js:1413
+ #, javascript-format
+ msgid "%s Not Connected"
+ msgstr "%s 연결되지 않음"
+
+-#: js/ui/status/network.js:1445
++#: js/ui/status/network.js:1510
+ msgid "connecting…"
+ msgstr "연결하는 중…"
+
+ #. Translators: this is for network connections that require some kind of key or password
+-#: js/ui/status/network.js:1448
++#: js/ui/status/network.js:1513
+ msgid "authentication required"
+ msgstr "인증 필요"
+
+-#: js/ui/status/network.js:1450
++#: js/ui/status/network.js:1515
+ msgid "connection failed"
+ msgstr "연결 실패"
+
+-#: js/ui/status/network.js:1501
++#: js/ui/status/network.js:1566
+ msgid "VPN Settings"
+ msgstr "가상사설망 설정"
+
+-#: js/ui/status/network.js:1518
++#: js/ui/status/network.js:1583
+ msgid "VPN"
+ msgstr "가상사설망"
+
+-#: js/ui/status/network.js:1528
++#: js/ui/status/network.js:1593
+ msgid "VPN Off"
+ msgstr "가상사설망 꺼짐"
+
+-#: js/ui/status/network.js:1589 js/ui/status/rfkill.js:84
++#: js/ui/status/network.js:1654 js/ui/status/rfkill.js:84
+ msgid "Network Settings"
+ msgstr "네트워크 설정"
+
+-#: js/ui/status/network.js:1617
++#: js/ui/status/network.js:1682
+ #, javascript-format
+ msgid "%s Wired Connection"
+ msgid_plural "%s Wired Connections"
+ msgstr[0] "%s 유선 연결"
+
+-#: js/ui/status/network.js:1621
++#: js/ui/status/network.js:1686
+ #, javascript-format
+ msgid "%s Wi-Fi Connection"
+ msgid_plural "%s Wi-Fi Connections"
+ msgstr[0] "%s 와이파이 연결"
+
+-#: js/ui/status/network.js:1625
++#: js/ui/status/network.js:1690
+ #, javascript-format
+ msgid "%s Modem Connection"
+ msgid_plural "%s Modem Connections"
+ msgstr[0] "%s 모뎀 연결"
+
+-#: js/ui/status/network.js:1759
++#: js/ui/status/network.js:1833
+ msgid "Connection failed"
+ msgstr "연결이 실패했습니다"
+
+-#: js/ui/status/network.js:1760
++#: js/ui/status/network.js:1834
+ msgid "Activation of network connection failed"
+ msgstr "네트워크 연결이 실패했습니다"
+
+@@ -2081,41 +2013,57 @@ msgstr "계속 하기"
+ msgid "Disable Until Tomorrow"
+ msgstr "내일까지 사용하지 않기"
+
+-#: js/ui/status/power.js:47
++#: js/ui/status/power.js:51 js/ui/status/powerProfiles.js:57
+ msgid "Power Settings"
+ msgstr "전원 설정"
+
+-#: js/ui/status/power.js:63
++#: js/ui/status/power.js:68
+ msgid "Fully Charged"
+ msgstr "완전 충전"
+
+-#: js/ui/status/power.js:69
++#: js/ui/status/power.js:74
+ msgid "Not Charging"
+ msgstr "충전 중 아님"
+
+ #. 0 is reported when UPower does not have enough data
+ #. to estimate battery life
+-#: js/ui/status/power.js:72 js/ui/status/power.js:78
++#: js/ui/status/power.js:77 js/ui/status/power.js:83
+ msgid "Estimating…"
+ msgstr "예상치 계산 중…"
+
+ #. Translators: this is <hours>:<minutes> Remaining (<percentage>)
+-#: js/ui/status/power.js:86
++#: js/ui/status/power.js:91
+ #, javascript-format
+ msgid "%d∶%02d Remaining (%d %%)"
+ msgstr "%d∶%02d 남음(%d %%)"
+
+ #. Translators: this is <hours>:<minutes> Until Full (<percentage>)
+-#: js/ui/status/power.js:91
++#: js/ui/status/power.js:97
+ #, javascript-format
+ msgid "%d∶%02d Until Full (%d %%)"
+ msgstr "충전까지 %d:%02d(%d %%)"
+
+-#: js/ui/status/power.js:139 js/ui/status/power.js:141
++#. The icon label
++#: js/ui/status/power.js:145
+ #, javascript-format
+ msgid "%d %%"
+ msgstr "%d %%"
+
++#: js/ui/status/powerProfiles.js:19
++msgctxt "Power profile"
++msgid "Performance"
++msgstr "성능"
++
++#: js/ui/status/powerProfiles.js:20
++msgctxt "Power profile"
++msgid "Balanced"
++msgstr "균형"
++
++#: js/ui/status/powerProfiles.js:21
++msgctxt "Power profile"
++msgid "Power Saver"
++msgstr "절전"
++
+ #: js/ui/status/remoteAccess.js:38
+ msgid "Screen is Being Shared"
+ msgstr "화면을 공유하는 중입니다"
+@@ -2171,9 +2119,7 @@ msgstr "알 수 없는 썬더볼트 장치"
+ msgid ""
+ "New device has been detected while you were away. Please disconnect and "
+ "reconnect the device to start using it."
+-msgstr ""
+-"자리에 없는 동안 새 장치를 검색했습니다. 이 장치를 사용하려면 장치 연결을 끊"
+-"었다가 다시 연결하십시오."
++msgstr "자리에 없는 동안 새 장치를 검색했습니다. 이 장치를 사용하려면 장치 연결을 끊었다가 다시 연결하십시오."
+
+ #: js/ui/status/thunderbolt.js:328
+ msgid "Unauthorized Thunderbolt device"
+@@ -2194,12 +2140,12 @@ msgid "Could not authorize the Thunderbolt device: %s"
+ msgstr "썬더볼트 장치에 권한을 부여할 수 없습니다: %s"
+
+ # 오디오 볼륨
+-#: js/ui/status/volume.js:160
++#: js/ui/status/volume.js:161
+ msgid "Volume changed"
+ msgstr "볼륨 바꿈"
+
+ # 오디오 볼륨
+-#: js/ui/status/volume.js:222
++#: js/ui/status/volume.js:223
+ msgid "Volume"
+ msgstr "볼륨"
+
+@@ -2233,40 +2179,40 @@ msgstr "내장만 사용"
+
+ #. Translators: This is a time format for a date in
+ #. long format
+-#: js/ui/unlockDialog.js:371
++#: js/ui/unlockDialog.js:380
+ msgid "%A %B %-d"
+ msgstr "%B %-d일 %A"
+
+-#: js/ui/unlockDialog.js:377
++#: js/ui/unlockDialog.js:386
+ msgid "Swipe up to unlock"
+ msgstr "잠금을 풀려면 위로 살짝 미십시오"
+
+-#: js/ui/unlockDialog.js:378
++#: js/ui/unlockDialog.js:387
+ msgid "Click or press a key to unlock"
+ msgstr "잠금을 풀려면 마우스 단추 또는 키를 누르십시오"
+
+-#: js/ui/unlockDialog.js:555
++#: js/ui/unlockDialog.js:572
+ msgid "Unlock Window"
+ msgstr "창 잠금 풀기"
+
+-#: js/ui/unlockDialog.js:564
++#: js/ui/unlockDialog.js:581
+ msgid "Log in as another user"
+ msgstr "다른 사용자로 로그인"
+
+-#: js/ui/welcomeDialog.js:36
++#: js/ui/welcomeDialog.js:34
+ #, javascript-format
+-msgid "Welcome to GNOME %s"
+-msgstr "환영합니다 — 그놈 %s"
++msgid "Welcome to %s"
++msgstr "%s에 오신 것을 환영합니다"
+
+-#: js/ui/welcomeDialog.js:37
++#: js/ui/welcomeDialog.js:35
+ msgid "If you want to learn your way around, check out the tour."
+ msgstr "사용 방법을 배우고 싶으시면, 둘러보기를 확인해 보십시오."
+
+-#: js/ui/welcomeDialog.js:45
++#: js/ui/welcomeDialog.js:43
+ msgid "No Thanks"
+ msgstr "괜찮습니다"
+
+-#: js/ui/welcomeDialog.js:50
++#: js/ui/welcomeDialog.js:48
+ msgid "Take Tour"
+ msgstr "둘러보기"
+
+@@ -2276,22 +2222,22 @@ msgid "“%s” is ready"
+ msgstr "“%s” 프로그램이 준비되었습니다"
+
+ #. Translators: This string should be shorter than 30 characters
+-#: js/ui/windowManager.js:63
++#: js/ui/windowManager.js:64
+ msgid "Keep these display settings?"
+ msgstr "이 디스플레이 설정을 유지하시겠습니까?"
+
+ #. Translators: this and the following message should be limited in length,
+ #. to avoid ellipsizing the labels.
+ #.
+-#: js/ui/windowManager.js:72
++#: js/ui/windowManager.js:73
+ msgid "Revert Settings"
+ msgstr "설정 되돌리기"
+
+-#: js/ui/windowManager.js:75
++#: js/ui/windowManager.js:76
+ msgid "Keep Changes"
+ msgstr "바뀐 사항 유지"
+
+-#: js/ui/windowManager.js:94
++#: js/ui/windowManager.js:95
+ #, javascript-format
+ msgid "Settings changes will revert in %d second"
+ msgid_plural "Settings changes will revert in %d seconds"
+@@ -2299,7 +2245,7 @@ msgstr[0] "바뀐 설정을 %d초 후에 되돌립니다"
+
+ #. Translators: This represents the size of a window. The first number is
+ #. * the width of the window and the second is the height.
+-#: js/ui/windowManager.js:550
++#: js/ui/windowManager.js:551
+ #, javascript-format
+ msgid "%d × %d"
+ msgstr "%d × %d"
+@@ -2352,23 +2298,27 @@ msgstr "위 작업 공간으로 옮기기"
+ msgid "Move to Workspace Down"
+ msgstr "아래 작업 공간으로 옮기기"
+
+-#: js/ui/windowMenu.js:132
++#: js/ui/windowMenu.js:123
++msgid "Move to another workspace"
++msgstr "다른 작업 공간으로 옮기기"
++
++#: js/ui/windowMenu.js:149
+ msgid "Move to Monitor Up"
+ msgstr "위 모니터로 옮기기"
+
+-#: js/ui/windowMenu.js:141
++#: js/ui/windowMenu.js:158
+ msgid "Move to Monitor Down"
+ msgstr "아래 모니터로 옮기기"
+
+-#: js/ui/windowMenu.js:150
++#: js/ui/windowMenu.js:167
+ msgid "Move to Monitor Left"
+ msgstr "왼쪽 모니터로 옮기기"
+
+-#: js/ui/windowMenu.js:159
++#: js/ui/windowMenu.js:176
+ msgid "Move to Monitor Right"
+ msgstr "오른쪽 모니터로 옮기기"
+
+-#: js/ui/windowMenu.js:167
++#: js/ui/windowMenu.js:184
+ msgid "Close"
+ msgstr "닫기"
+
+@@ -2377,28 +2327,28 @@ msgid "Evolution Calendar"
+ msgstr "에볼루션 달력"
+
+ # 커맨드라인 옵션 설명
+-#: src/main.c:415 subprojects/extensions-tool/src/main.c:317
++#: src/main.c:423 subprojects/extensions-tool/src/main.c:321
+ msgid "Print version"
+ msgstr "버전을 표시합니다"
+
+-#: src/main.c:421
++#: src/main.c:429
+ msgid "Mode used by GDM for login screen"
+ msgstr "GDM에서 로그인 화면에 사용할 모드"
+
+-#: src/main.c:427
++#: src/main.c:435
+ msgid "Use a specific mode, e.g. “gdm” for login screen"
+ msgstr "특정 모드 사용. 예를 들어 로그인 화면에 대해 “gdm”"
+
+-#: src/main.c:433
++#: src/main.c:441
+ msgid "List possible modes"
+ msgstr "가능한 모드 목록 표시"
+
+-#: src/shell-app.c:268
++#: src/shell-app.c:300
+ msgctxt "program"
+ msgid "Unknown"
+ msgstr "알 수 없음"
+
+-#: src/shell-app.c:519
++#: src/shell-app.c:564
+ #, c-format
+ msgid "Failed to launch “%s”"
+ msgstr "“%s” 실행에 실패했습니다"
+@@ -2435,9 +2385,7 @@ msgstr "그놈 프로젝트"
+ msgid ""
+ "GNOME Extensions handles updating extensions, configuring extension "
+ "preferences and removing or disabling unwanted extensions."
+-msgstr ""
+-"그놈 확장 관리자에서는 확장 기능의 업데이트, 확장 기능의 설정, 원하지 않는 확"
+-"장 기능 제거 또는 사용 중지를 처리합니다."
++msgstr "그놈 확장 관리자에서는 확장 기능의 업데이트, 확장 기능의 설정, 원하지 않는 확장 기능 제거 또는 사용 중지를 처리합니다."
+
+ #: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
+ msgid "Configure GNOME Shell Extensions"
+@@ -2465,8 +2413,7 @@ msgstr "제거"
+
+ #: subprojects/extensions-app/js/main.js:216
+ msgid "translator-credits"
+-msgstr ""
+-"차영호 <ganadist@gmail.com>\n"
++msgstr "차영호 <ganadist@gmail.com>\n"
+ "조성호 <darkcircle.0426@gmail.com>\n"
+ "류창우 <cwryu@debian.org>"
+
+@@ -2518,11 +2465,9 @@ msgstr "확장 정보"
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:27
+ msgid ""
+-"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
+-"\">extensions.gnome.org</a>."
+-msgstr ""
+-"확장을 찾고 추가하려면, <a href=\"https://extensions.gnome.org\">extensions."
+-"gnome.org</a> 사이트를 방문하십시오."
++"To find and add extensions, visit <a href=\"https://extensions.gnome."
++"org\">extensions.gnome.org</a>."
++msgstr "확장을 찾고 추가하려면, <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> 사이트를 방문하십시오."
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:34
+ msgid "Warning"
+@@ -2533,9 +2478,7 @@ msgid ""
+ "Extensions can cause system issues, including performance problems. If you "
+ "encounter problems with your system, it is recommended to disable all "
+ "extensions."
+-msgstr ""
+-"확장 때문에 성능 문제 등의 시스템 문제가 발생할 수 있습니다. 시스템에 문제를 "
+-"발견할 경우, 모든 확장을 꺼 보기를 권합니다."
++msgstr "확장 때문에 성능 문제 등의 시스템 문제가 발생할 수 있습니다. 시스템에 문제를 발견할 경우, 모든 확장을 꺼 보기를 권합니다."
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:150
+ msgid "Manually Installed"
+@@ -2553,9 +2496,7 @@ msgstr "설치한 확장 없음"
+ msgid ""
+ "We’re very sorry, but it was not possible to get the list of installed "
+ "extensions. Make sure you are logged into GNOME and try again."
+-msgstr ""
+-"대단히 죄송합니다. 설치한 확장 기능의 목록을 가져올 수 없습니다. 그놈 데스크"
+-"톱에 로그인했는지 확인하시고 다시 시도하십시오."
++msgstr "대단히 죄송합니다. 설치한 확장 기능의 목록을 가져올 수 없습니다. 그놈 데스크톱에 로그인했는지 확인하시고 다시 시도하십시오."
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:288
+ msgid "Extension Updates Ready"
+@@ -2576,8 +2517,7 @@ msgstr "새 확장을 %s 안에 성공적으로 만들었습니다.\n"
+ msgid ""
+ "Name should be a very short (ideally descriptive) string.\n"
+ "Examples are: %s"
+-msgstr ""
+-"이름은 아주 짧은 (무슨 기능인지 설명이 되면 좋은) 문자열이어야 합니다.\n"
++msgstr "이름은 아주 짧은 (무슨 기능인지 설명이 되면 좋은) 문자열이어야 합니다.\n"
+ "예: %s"
+
+ #: subprojects/extensions-tool/src/command-create.c:302
+@@ -2590,20 +2530,20 @@ msgstr "이름"
+ msgid ""
+ "Description is a single-sentence explanation of what your extension does.\n"
+ "Examples are: %s"
+-msgstr ""
+-"설명은 이 확장 기능이 무슨 일을 하는지 한 문장으로 설명합니다.\n"
++msgstr "설명은 이 확장 기능이 무슨 일을 하는지 한 문장으로 설명합니다.\n"
+ "예: %s"
+
+ #: subprojects/extensions-tool/src/command-create.c:336
++#, c-format
+ msgid ""
+ "UUID is a globally-unique identifier for your extension.\n"
+ "This should be in the format of an email address (clicktofocus@janedoe."
+ "example.com)\n"
+-msgstr ""
+-"UUID는 이 확장을 나타내는 전셰계적으로 유일한 ID 값입니다.\n"
++msgstr "UUID는 이 확장을 나타내는 전셰계적으로 유일한 ID 값입니다.\n"
+ "전자메일 주소의 형식이어야 합니다 (clicktofocus@janedoe.example.com)\n"
+
+ #: subprojects/extensions-tool/src/command-create.c:363
++#, c-format
+ msgid "Choose one of the available templates:\n"
+ msgstr "다음 사용 가능한 서식 중 하나를 고르십시오:\n"
+
+@@ -2660,6 +2600,8 @@ msgstr "UUID, 이름, 설명이 필요합니다"
+ #: subprojects/extensions-tool/src/command-enable.c:46
+ #: subprojects/extensions-tool/src/command-info.c:50
+ #: subprojects/extensions-tool/src/command-list.c:64
++#: subprojects/extensions-tool/src/main.c:146
++#, c-format
+ msgid "Failed to connect to GNOME Shell\n"
+ msgstr "그놈 셸 연결에 실패했습니다\n"
+
+@@ -2676,7 +2618,7 @@ msgstr "확장 기능 사용하지 않기"
+ #: subprojects/extensions-tool/src/command-disable.c:119
+ #: subprojects/extensions-tool/src/command-enable.c:119
+ #: subprojects/extensions-tool/src/command-info.c:103
+-#: subprojects/extensions-tool/src/command-prefs.c:97
++#: subprojects/extensions-tool/src/command-prefs.c:105
+ #: subprojects/extensions-tool/src/command-reset.c:76
+ #: subprojects/extensions-tool/src/command-uninstall.c:104
+ msgid "No UUID given"
+@@ -2685,7 +2627,7 @@ msgstr "UUID가 주어지지 않았습니다"
+ #: subprojects/extensions-tool/src/command-disable.c:124
+ #: subprojects/extensions-tool/src/command-enable.c:124
+ #: subprojects/extensions-tool/src/command-info.c:108
+-#: subprojects/extensions-tool/src/command-prefs.c:102
++#: subprojects/extensions-tool/src/command-prefs.c:110
+ #: subprojects/extensions-tool/src/command-reset.c:81
+ #: subprojects/extensions-tool/src/command-uninstall.c:109
+ msgid "More than one UUID given"
+@@ -2815,7 +2757,12 @@ msgstr "여러 개의 소스 디렉터리를 지정했습니다"
+ msgid "Extension “%s” doesn't have preferences\n"
+ msgstr "“%s” 확장에 설정이 없습니다\n"
+
+-#: subprojects/extensions-tool/src/command-prefs.c:79
++#: subprojects/extensions-tool/src/command-prefs.c:62
++#, c-format
++msgid "Failed to open prefs for extension “%s”: %s\n"
++msgstr "확장 프로그램 \"%s\"의 설정을 볼 수 없습니다: %s\n"
++
++#: subprojects/extensions-tool/src/command-prefs.c:87
+ msgid "Opens extension preferences"
+ msgstr "확장 기능 설정을 엽니다"
+
+@@ -2824,6 +2771,7 @@ msgid "Reset an extension"
+ msgstr "확장 기능 초기화"
+
+ #: subprojects/extensions-tool/src/command-uninstall.c:49
++#, c-format
+ msgid "Cannot uninstall system extensions\n"
+ msgstr "시스템 확장 기능은 설치를 제거할 수 없습니다\n"
+
+@@ -2840,10 +2788,6 @@ msgstr "확장 기능 설치 제거"
+ msgid "Do not print error messages"
+ msgstr "오류 메시지를 인쇄하지 않습니다"
+
+-#: subprojects/extensions-tool/src/main.c:146
+-msgid "Failed to connect to GNOME Shell"
+-msgstr "그놈 셸 연결에 실패했습니다"
+-
+ #: subprojects/extensions-tool/src/main.c:244
+ msgid "Path"
+ msgstr "경로"
+@@ -2860,80 +2804,80 @@ msgstr "원 작성자"
+ msgid "State"
+ msgstr "상태"
+
+-#: subprojects/extensions-tool/src/main.c:290
++#: subprojects/extensions-tool/src/main.c:294
+ msgid "“version” takes no arguments"
+ msgstr "“version” 옵션은 인수를 받지 않습니다"
+
+-#: subprojects/extensions-tool/src/main.c:292
+-#: subprojects/extensions-tool/src/main.c:312
++#: subprojects/extensions-tool/src/main.c:296
++#: subprojects/extensions-tool/src/main.c:316
+ msgid "Usage:"
+ msgstr "사용법:"
+
+-#: subprojects/extensions-tool/src/main.c:295
++#: subprojects/extensions-tool/src/main.c:299
+ msgid "Print version information and exit."
+ msgstr "버전 정보를 표시하고 끝납니다."
+
+-#: subprojects/extensions-tool/src/main.c:310
+-#: subprojects/extensions-tool/src/main.c:313
++#: subprojects/extensions-tool/src/main.c:314
++#: subprojects/extensions-tool/src/main.c:317
+ msgid "COMMAND"
+ msgstr "<명령>"
+
+-#: subprojects/extensions-tool/src/main.c:313
++#: subprojects/extensions-tool/src/main.c:317
+ msgid "[ARGS…]"
+ msgstr "[인자…]"
+
+-#: subprojects/extensions-tool/src/main.c:315
++#: subprojects/extensions-tool/src/main.c:319
+ msgid "Commands:"
+ msgstr "명령어:"
+
+ # 커맨드라인 옵션 설명
+-#: subprojects/extensions-tool/src/main.c:316
++#: subprojects/extensions-tool/src/main.c:320
+ msgid "Print help"
+ msgstr "도움말을 표시합니다"
+
+-#: subprojects/extensions-tool/src/main.c:318
++#: subprojects/extensions-tool/src/main.c:322
+ msgid "Enable extension"
+ msgstr "확장 기능 사용"
+
+-#: subprojects/extensions-tool/src/main.c:319
++#: subprojects/extensions-tool/src/main.c:323
+ msgid "Disable extension"
+ msgstr "확장 기능 사용하지 않기"
+
+-#: subprojects/extensions-tool/src/main.c:320
++#: subprojects/extensions-tool/src/main.c:324
+ msgid "Reset extension"
+ msgstr "확장 기능 초기화"
+
+-#: subprojects/extensions-tool/src/main.c:321
++#: subprojects/extensions-tool/src/main.c:325
+ msgid "Uninstall extension"
+ msgstr "확장 기능 설치 제거"
+
+-#: subprojects/extensions-tool/src/main.c:322
++#: subprojects/extensions-tool/src/main.c:326
+ msgid "List extensions"
+ msgstr "확장 기능 목록 보기"
+
+-#: subprojects/extensions-tool/src/main.c:323
+-#: subprojects/extensions-tool/src/main.c:324
++#: subprojects/extensions-tool/src/main.c:327
++#: subprojects/extensions-tool/src/main.c:328
+ msgid "Show extension info"
+ msgstr "확장 기능 정보 보기"
+
+-#: subprojects/extensions-tool/src/main.c:325
++#: subprojects/extensions-tool/src/main.c:329
+ msgid "Open extension preferences"
+ msgstr "확장 기능 설정 열기"
+
+-#: subprojects/extensions-tool/src/main.c:326
++#: subprojects/extensions-tool/src/main.c:330
+ msgid "Create extension"
+ msgstr "확장 기능 만들기"
+
+-#: subprojects/extensions-tool/src/main.c:327
++#: subprojects/extensions-tool/src/main.c:331
+ msgid "Package extension"
+ msgstr "확장 기능 패키지 만들기"
+
+-#: subprojects/extensions-tool/src/main.c:328
++#: subprojects/extensions-tool/src/main.c:332
+ msgid "Install extension bundle"
+ msgstr "확장 번들 설치"
+
+ # “gnome-extensions help COMMAND”
+-#: subprojects/extensions-tool/src/main.c:330
++#: subprojects/extensions-tool/src/main.c:334
+ #, c-format
+ msgid "Use “%s” to get detailed help.\n"
+ msgstr "자세한 도움말을 보려면 “%s” 명령을 사용하십시오.\n"
+@@ -2974,8 +2918,18 @@ msgstr[0] "%u개 입력"
+ msgid "System Sounds"
+ msgstr "시스템 소리"
+
++#~ msgid "Enable introspection API"
++#~ msgstr "상태 점검 API 사용"
++
++#~ msgid ""
++#~ "Enables a D-Bus API that allows to introspect the application state of "
++#~ "the shell."
++#~ msgstr ""
++#~ "프로그램에서 셸의 상태를 점검하도록 허용하는 D-버스 API를 사용합니다."
++
++#~ msgid "Failed to connect to GNOME Shell"
++#~ msgstr "그놈 셸 연결에 실패했습니다"
++
+ #~ msgid "App Picker View"
+ #~ msgstr "프로그램 고르기 뷰"
+
+-#~ msgid "Index of the currently selected view in the application picker."
+-#~ msgstr "프로그램 고르기에서 현재 선택한 뷰의 인덱스 값."
+diff --git a/po/zh_CN.po b/po/zh_CN.po
+index 603428ba4..da6f11a9f 100644
+--- a/po/zh_CN.po
++++ b/po/zh_CN.po
+@@ -22,8 +22,8 @@
+ msgid ""
+ msgstr ""
+ "Project-Id-Version: gnome-shell master\n"
+-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
+-"POT-Creation-Date: 2021-03-25 02:36+0000\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2023-01-19 16:43+0100\n"
+ "PO-Revision-Date: 2021-03-25 19:16+0800\n"
+ "Last-Translator: Dingzhong Chen <wsxy162@gmail.com>\n"
+ "Language-Team: Chinese - China <i18n-zh@googlegroups.com>\n"
+@@ -86,10 +86,7 @@ msgid ""
+ "should be loaded. Any extension that wants to be loaded needs to be in this "
+ "list. You can also manipulate this list with the EnableExtension and "
+ "DisableExtension D-Bus methods on org.gnome.Shell."
+-msgstr ""
+-"GNOME Shell 扩展有一个 UUID 属性,此键列出了应该加载的扩展。任何需要加载的扩"
+-"展都需出现在此列表中。您还可以通过 DBus 的方式对 org.gnome.Shell 里的 "
+-"EnableExtension 和 DisableExtension 的值进行修改,以修改此列表。"
++msgstr "GNOME Shell 扩展有一个 UUID 属性,此键列出了应该加载的扩展。任何需要加载的扩展都需出现在此列表中。您还可以通过 DBus 的方式对 org.gnome.Shell 里的 EnableExtension 和 DisableExtension 的值进行修改,以修改此列表。"
+
+ #: data/org.gnome.shell.gschema.xml.in:26
+ msgid "UUIDs of extensions to force disabling"
+@@ -102,11 +99,7 @@ msgid ""
+ "manipulate this list with the EnableExtension and DisableExtension D-Bus "
+ "methods on org.gnome.Shell. This key takes precedence over the “enabled-"
+ "extensions” setting."
+-msgstr ""
+-"GNOME Shell 扩展有一个 UUID 属性,此键列出了应该禁用的扩展,不管它们是否在当"
+-"前模式中已加载。您还可以通过 DBus 的方式对 org.gnome.Shell 里的 "
+-"EnableExtension 和 DisableExtension 的值进行修改,以修改此列表。此键优先"
+-"于“enabled-extensions”设置。"
++msgstr "GNOME Shell 扩展有一个 UUID 属性,此键列出了应该禁用的扩展,不管它们是否在当前模式中已加载。您还可以通过 DBus 的方式对 org.gnome.Shell 里的 EnableExtension 和 DisableExtension 的值进行修改,以修改此列表。此键优先于“enabled-extensions”设置。"
+
+ #: data/org.gnome.shell.gschema.xml.in:37
+ msgid "Disable user extensions"
+@@ -127,9 +120,7 @@ msgid ""
+ "GNOME Shell will only load extensions that claim to support the current "
+ "running version. Enabling this option will disable this check and try to "
+ "load all extensions regardless of the versions they claim to support."
+-msgstr ""
+-"GNOME 只会加载声明支持当前运行版本的扩展。启用该选项会禁止此检查,并尝试加载"
+-"所有扩展,无视它们声明支持的版本。"
++msgstr "GNOME 只会加载声明支持当前运行版本的扩展。启用该选项会禁止此检查,并尝试加载所有扩展,无视它们声明支持的版本。"
+
+ #: data/org.gnome.shell.gschema.xml.in:54
+ msgid "List of desktop file IDs for favorite applications"
+@@ -159,8 +150,7 @@ msgstr "总在用户菜单中显示“注销”选项。"
+ msgid ""
+ "This key overrides the automatic hiding of the “Log out” menu item in single-"
+ "user, single-session situations."
+-msgstr ""
+-"单用户、单会话情形下,“注销”菜单项会自动隐藏,使用这个键会覆盖这种行为。"
++msgstr "单用户、单会话情形下,“注销”菜单项会自动隐藏,使用这个键会覆盖这种行为。"
+
+ #: data/org.gnome.shell.gschema.xml.in:79
+ msgid ""
+@@ -173,9 +163,7 @@ msgid ""
+ "filesystem is mounted. If the password can be saved for future use a "
+ "“Remember Password” checkbox will be present. This key sets the default "
+ "state of the checkbox."
+-msgstr ""
+-"挂载加密设备或远程文件系统时 Shell 将要求输入密码。如果该密码可以记住并在今后"
+-"使用,则会有“记住密码”复选框出现。这个键设置了该复选框的默认状态。"
++msgstr "挂载加密设备或远程文件系统时 Shell 将要求输入密码。如果该密码可以记住并在今后使用,则会有“记住密码”复选框出现。这个键设置了该复选框的默认状态。"
+
+ #: data/org.gnome.shell.gschema.xml.in:89
+ msgid ""
+@@ -188,9 +176,7 @@ msgid ""
+ "powered, or if there were devices set up associated with the default "
+ "adapter. This will be reset if the default adapter is ever seen not to have "
+ "devices associated to it."
+-msgstr ""
+-"Shell 只会在有蓝牙适配器有供电时或有设备与默认适配器关联时显示蓝牙菜单。若默"
+-"认适配器不再和设备关联,蓝牙菜单将不再因此出现。"
++msgstr "Shell 只会在有蓝牙适配器有供电时或有设备与默认适配器关联时显示蓝牙菜单。若默认适配器不再和设备关联,蓝牙菜单将不再因此出现。"
+
+ #: data/org.gnome.shell.gschema.xml.in:99
+ msgid "The last version the “Welcome to GNOME” dialog was shown for"
+@@ -202,206 +188,188 @@ msgid ""
+ "shown. An empty string represents the oldest possible version, and a huge "
+ "number will represent versions that do not exist yet. This huge number can "
+ "be used to effectively disable the dialog."
+-msgstr ""
+-"本键位确定上一次“欢迎使用 GNOME”对话框显示时对应的版本。如字符串为空,则默认"
+-"对应最旧的版本;一个非常大的数字指代尚未存在的版本。使用大数字可以等效于禁用"
+-"该对话框。"
++msgstr "本键位确定上一次“欢迎使用 GNOME”对话框显示时对应的版本。如字符串为空,则默认对应最旧的版本;一个非常大的数字指代尚未存在的版本。使用大数字可以等效于禁用该对话框。"
+
+-#: data/org.gnome.shell.gschema.xml.in:109
+-msgid "Enable introspection API"
+-msgstr "启用 introspection API"
+-
+-#: data/org.gnome.shell.gschema.xml.in:110
+-msgid ""
+-"Enables a D-Bus API that allows to introspect the application state of the "
+-"shell."
+-msgstr "启用一个允许审视(introspect)shell 应用程序状态的 D-Bus API。"
+-
+-#: data/org.gnome.shell.gschema.xml.in:141
++#: data/org.gnome.shell.gschema.xml.in:133
+ msgid "Layout of the app picker"
+ msgstr "应用选择器的布局"
+
+-#: data/org.gnome.shell.gschema.xml.in:142
++#: data/org.gnome.shell.gschema.xml.in:134
+ msgid ""
+ "Layout of the app picker. Each entry in the array is a page. Pages are "
+ "stored in the order they appear in GNOME Shell. Each page contains an "
+ "“application id” → 'data' pair. Currently, the following values are stored "
+ "as 'data': • “position”: the position of the application icon in the page"
+-msgstr ""
+-"应用选择器的布局。列表中的每个条目都是一个页面。页面按在 GNOME Shell 中显示的"
+-"顺序存储。每个页面都包含一个“应用程序 ID”→“数据”对。目前,以下值存储为“数"
+-"据”:•“位置\":应用程序图标在页面中的位置"
++msgstr "应用选择器的布局。列表中的每个条目都是一个页面。页面按在 GNOME Shell 中显示的顺序存储。每个页面都包含一个“应用程序 ID”→“数据”对。目前,以下值存储为“数据”:•“位置\":应用程序图标在页面中的位置"
+
+-#: data/org.gnome.shell.gschema.xml.in:157
++#: data/org.gnome.shell.gschema.xml.in:149
+ msgid "Keybinding to open the application menu"
+ msgstr "用于打开应用程序菜单的快捷键"
+
+-#: data/org.gnome.shell.gschema.xml.in:158
++#: data/org.gnome.shell.gschema.xml.in:150
+ msgid "Keybinding to open the application menu."
+ msgstr "用于打开应用程序菜单的快捷键。"
+
+-#: data/org.gnome.shell.gschema.xml.in:164
+-#: data/org.gnome.shell.gschema.xml.in:171
++#: data/org.gnome.shell.gschema.xml.in:156
++#: data/org.gnome.shell.gschema.xml.in:163
+ msgid "Keybinding to shift between overview states"
+ msgstr "用于在概览状态之间切换的快捷键"
+
+-#: data/org.gnome.shell.gschema.xml.in:165
++#: data/org.gnome.shell.gschema.xml.in:157
+ msgid "Keybinding to shift between session, window picker and app grid"
+ msgstr "用于在会话、窗口拾取器和应用网格之间切换的快捷键"
+
+-#: data/org.gnome.shell.gschema.xml.in:172
++#: data/org.gnome.shell.gschema.xml.in:164
+ msgid "Keybinding to shift between app grid, window picker and session"
+ msgstr "用于在应用网格、窗口拾取器和会话之间切换的快捷键"
+
+-#: data/org.gnome.shell.gschema.xml.in:178
++#: data/org.gnome.shell.gschema.xml.in:170
+ msgid "Keybinding to open the “Show Applications” view"
+ msgstr "用于打开“显示应用程序”视图的快捷键"
+
+-#: data/org.gnome.shell.gschema.xml.in:179
++#: data/org.gnome.shell.gschema.xml.in:171
+ msgid ""
+ "Keybinding to open the “Show Applications” view of the Activities Overview."
+ msgstr "用于打开活动概览中的“显示应用程序”视图的快捷键。"
+
+-#: data/org.gnome.shell.gschema.xml.in:186
++#: data/org.gnome.shell.gschema.xml.in:178
+ msgid "Keybinding to open the overview"
+ msgstr "用于打开概览的快捷键"
+
+-#: data/org.gnome.shell.gschema.xml.in:187
++#: data/org.gnome.shell.gschema.xml.in:179
+ msgid "Keybinding to open the Activities Overview."
+ msgstr "用于打开活动概览的快捷键。"
+
+-#: data/org.gnome.shell.gschema.xml.in:193
++#: data/org.gnome.shell.gschema.xml.in:185
+ msgid "Keybinding to toggle the visibility of the notification list"
+ msgstr "用来切换通知列表是否可见的快捷键"
+
+-#: data/org.gnome.shell.gschema.xml.in:194
++#: data/org.gnome.shell.gschema.xml.in:186
+ msgid "Keybinding to toggle the visibility of the notification list."
+ msgstr "用来切换通知列表是否可见的快捷键。"
+
+-#: data/org.gnome.shell.gschema.xml.in:200
++#: data/org.gnome.shell.gschema.xml.in:192
+ msgid "Keybinding to focus the active notification"
+ msgstr "用于聚焦到活动通知的快捷键"
+
+-#: data/org.gnome.shell.gschema.xml.in:201
++#: data/org.gnome.shell.gschema.xml.in:193
+ msgid "Keybinding to focus the active notification."
+ msgstr "用于聚焦到活动通知的快捷键。"
+
+-#: data/org.gnome.shell.gschema.xml.in:207
++#: data/org.gnome.shell.gschema.xml.in:199
+ msgid "Switch to application 1"
+ msgstr "切换到应用程序 11"
+
+-#: data/org.gnome.shell.gschema.xml.in:211
++#: data/org.gnome.shell.gschema.xml.in:203
+ msgid "Switch to application 2"
+ msgstr "切换到应用程序 2"
+
+-#: data/org.gnome.shell.gschema.xml.in:215
++#: data/org.gnome.shell.gschema.xml.in:207
+ msgid "Switch to application 3"
+ msgstr "切换到应用程序 3"
+
+-#: data/org.gnome.shell.gschema.xml.in:219
++#: data/org.gnome.shell.gschema.xml.in:211
+ msgid "Switch to application 4"
+ msgstr "切换到应用程序 4"
+
+-#: data/org.gnome.shell.gschema.xml.in:223
++#: data/org.gnome.shell.gschema.xml.in:215
+ msgid "Switch to application 5"
+ msgstr "切换到应用程序 5"
+
+-#: data/org.gnome.shell.gschema.xml.in:227
++#: data/org.gnome.shell.gschema.xml.in:219
+ msgid "Switch to application 6"
+ msgstr "切换到应用程序 6"
+
+-#: data/org.gnome.shell.gschema.xml.in:231
++#: data/org.gnome.shell.gschema.xml.in:223
+ msgid "Switch to application 7"
+ msgstr "切换到应用程序 7"
+
+-#: data/org.gnome.shell.gschema.xml.in:235
++#: data/org.gnome.shell.gschema.xml.in:227
+ msgid "Switch to application 8"
+ msgstr "切换到应用程序 8"
+
+-#: data/org.gnome.shell.gschema.xml.in:239
++#: data/org.gnome.shell.gschema.xml.in:231
+ msgid "Switch to application 9"
+ msgstr "切换到应用程序 9"
+
+-#: data/org.gnome.shell.gschema.xml.in:248
+-#: data/org.gnome.shell.gschema.xml.in:275
++#: data/org.gnome.shell.gschema.xml.in:240
++#: data/org.gnome.shell.gschema.xml.in:267
+ msgid "Limit switcher to current workspace."
+ msgstr "仅在当前工作区切换。"
+
+-#: data/org.gnome.shell.gschema.xml.in:249
++#: data/org.gnome.shell.gschema.xml.in:241
+ msgid ""
+ "If true, only applications that have windows on the current workspace are "
+ "shown in the switcher. Otherwise, all applications are included."
+ msgstr "如果设为 true,则切换器只显示当前工作区中的应用。否则,显示所有应用。"
+
+-#: data/org.gnome.shell.gschema.xml.in:266
++#: data/org.gnome.shell.gschema.xml.in:258
+ msgid "The application icon mode."
+ msgstr "应用程序图标模式。"
+
+-#: data/org.gnome.shell.gschema.xml.in:267
++#: data/org.gnome.shell.gschema.xml.in:259
+ msgid ""
+ "Configures how the windows are shown in the switcher. Valid possibilities "
+ "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
+ "only” (shows only the application icon) or “both”."
+-msgstr ""
+-"配置窗口如何显示于切换器中。有效的值有“thumbnail-only”“app-icon-"
+-"only”和“both”。"
++msgstr "配置窗口如何显示于切换器中。有效的值有“thumbnail-only”“app-icon-only”和“both”。"
+
+-#: data/org.gnome.shell.gschema.xml.in:276
++#: data/org.gnome.shell.gschema.xml.in:268
+ msgid ""
+ "If true, only windows from the current workspace are shown in the switcher. "
+ "Otherwise, all windows are included."
+ msgstr "如果设为 true,切换器只显示当前工作区的窗口。否则,包括所有窗口。"
+
+-#: data/org.gnome.shell.gschema.xml.in:286
++#: data/org.gnome.shell.gschema.xml.in:278
+ msgid "Locations"
+ msgstr "位置"
+
+-#: data/org.gnome.shell.gschema.xml.in:287
++#: data/org.gnome.shell.gschema.xml.in:279
+ msgid "The locations to show in world clocks"
+ msgstr "要在世界时钟中显示的位置"
+
+-#: data/org.gnome.shell.gschema.xml.in:297
++#: data/org.gnome.shell.gschema.xml.in:289
+ msgid "Automatic location"
+ msgstr "自动定位"
+
+-#: data/org.gnome.shell.gschema.xml.in:298
++#: data/org.gnome.shell.gschema.xml.in:290
+ msgid "Whether to fetch the current location or not"
+ msgstr "是否获取当前的位置"
+
+-#: data/org.gnome.shell.gschema.xml.in:305
++#: data/org.gnome.shell.gschema.xml.in:297
+ msgid "Location"
+ msgstr "位置"
+
+-#: data/org.gnome.shell.gschema.xml.in:306
++#: data/org.gnome.shell.gschema.xml.in:298
+ msgid "The location for which to show a forecast"
+ msgstr "要显示天气预报的位置"
+
+-#: data/org.gnome.shell.gschema.xml.in:318
++#: data/org.gnome.shell.gschema.xml.in:310
+ msgid "Attach modal dialog to the parent window"
+ msgstr "将模态对话框附到其父窗口上"
+
+-#: data/org.gnome.shell.gschema.xml.in:319
++#: data/org.gnome.shell.gschema.xml.in:311
++#: data/org.gnome.shell.gschema.xml.in:320
+ #: data/org.gnome.shell.gschema.xml.in:328
+ #: data/org.gnome.shell.gschema.xml.in:336
+ #: data/org.gnome.shell.gschema.xml.in:344
+-#: data/org.gnome.shell.gschema.xml.in:352
+ msgid ""
+ "This key overrides the key in org.gnome.mutter when running GNOME Shell."
+ msgstr "当 GNOME Shell 运行时,此键会覆盖 org.gnome.mutter 中的键。"
+
+-#: data/org.gnome.shell.gschema.xml.in:327
++#: data/org.gnome.shell.gschema.xml.in:319
+ msgid "Enable edge tiling when dropping windows on screen edges"
+ msgstr "启用拖拽窗口到屏幕边缘时边缘平铺的功能"
+
+-#: data/org.gnome.shell.gschema.xml.in:335
++#: data/org.gnome.shell.gschema.xml.in:327
+ msgid "Workspaces are managed dynamically"
+ msgstr "动态地管理工作区"
+
+-#: data/org.gnome.shell.gschema.xml.in:343
++#: data/org.gnome.shell.gschema.xml.in:335
+ msgid "Workspaces only on primary monitor"
+ msgstr "仅在主显示器上显示工作区"
+
+-#: data/org.gnome.shell.gschema.xml.in:351
++#: data/org.gnome.shell.gschema.xml.in:343
+ msgid "Delay focus changes in mouse mode until the pointer stops moving"
+ msgstr "将鼠标模式下焦点的更改推迟到指针停止移动之后"
+
+@@ -419,9 +387,7 @@ msgid ""
+ "We’re very sorry, but there’s been a problem: the settings for this "
+ "extension can’t be displayed. We recommend that you report the issue to the "
+ "extension authors."
+-msgstr ""
+-"非常抱歉,但是出现了问题:此扩展的设置无法显示。我们建议您将问题报告给扩展的"
+-"作者。"
++msgstr "非常抱歉,但是出现了问题:此扩展的设置无法显示。我们建议您将问题报告给扩展的作者。"
+
+ #: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:64
+ msgid "Technical Details"
+@@ -435,16 +401,16 @@ msgstr "主页"
+ msgid "Visit extension homepage"
+ msgstr "访问扩展主页"
+
+-#: js/gdm/authPrompt.js:141 js/ui/audioDeviceSelection.js:58
++#: js/gdm/authPrompt.js:150 js/ui/audioDeviceSelection.js:61
+ #: js/ui/components/networkAgent.js:111 js/ui/components/polkitAgent.js:138
+-#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:183
++#: js/ui/endSessionDialog.js:438 js/ui/extensionDownloader.js:198
+ #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
+-#: js/ui/status/network.js:941 subprojects/extensions-app/js/main.js:183
++#: js/ui/status/network.js:978 subprojects/extensions-app/js/main.js:183
+ msgid "Cancel"
+ msgstr "取消"
+
+ #. Cisco LEAP
+-#: js/gdm/authPrompt.js:244 js/ui/components/networkAgent.js:210
++#: js/gdm/authPrompt.js:319 js/ui/components/networkAgent.js:210
+ #: js/ui/components/networkAgent.js:226 js/ui/components/networkAgent.js:250
+ #: js/ui/components/networkAgent.js:271 js/ui/components/networkAgent.js:291
+ #: js/ui/components/networkAgent.js:301 js/ui/components/polkitAgent.js:275
+@@ -456,13 +422,13 @@ msgstr "密码"
+ msgid "Choose Session"
+ msgstr "选择会话"
+
+-#: js/gdm/loginDialog.js:456
++#: js/gdm/loginDialog.js:461
+ msgid "Not listed?"
+ msgstr "未列出?"
+
+ #. Translators: this message is shown below the username entry field
+ #. to clue the user in on how to login to the local network realm
+-#: js/gdm/loginDialog.js:918
++#: js/gdm/loginDialog.js:926
+ #, javascript-format
+ msgid "(e.g., user or %s)"
+ msgstr "(如 user 或 %s)"
+@@ -470,28 +436,28 @@ msgstr "(如 user 或 %s)"
+ #. TTLS and PEAP are actually much more complicated, but this complication
+ #. is not visible here since we only care about phase2 authentication
+ #. (and don't even care of which one)
+-#: js/gdm/loginDialog.js:923 js/ui/components/networkAgent.js:246
++#: js/gdm/loginDialog.js:931 js/ui/components/networkAgent.js:246
+ #: js/ui/components/networkAgent.js:269 js/ui/components/networkAgent.js:287
+ msgid "Username"
+ msgstr "用户名"
+
+-#: js/gdm/loginDialog.js:1258
++#: js/gdm/loginDialog.js:1285
+ msgid "Login Window"
+ msgstr "登录窗口"
+
+-#: js/gdm/util.js:430
++#: js/gdm/util.js:441
+ msgid "Authentication error"
+ msgstr "认证出错"
+
+ #. Translators: this message is shown below the password entry field
+ #. to indicate the user can swipe their finger on the fingerprint reader
+-#: js/gdm/util.js:589
++#: js/gdm/util.js:622
+ msgid "(or swipe finger across reader)"
+ msgstr "(或将手指划过指纹读取器)"
+
+ #. Translators: this message is shown below the password entry field
+ #. to indicate the user can place their finger on the fingerprint reader instead
+-#: js/gdm/util.js:594
++#: js/gdm/util.js:627
+ msgid "(or place finger on reader)"
+ msgstr "(或将手指置于指纹读取器上)"
+
+@@ -576,80 +542,80 @@ msgctxt "search-result"
+ msgid "Lock Screen Rotation"
+ msgstr "锁定屏幕旋转"
+
+-#: js/misc/util.js:120
++#: js/misc/util.js:121
+ msgid "Command not found"
+ msgstr "命令未找到"
+
+ #. Replace "Error invoking GLib.shell_parse_argv: " with
+ #. something nicer
+-#: js/misc/util.js:156
++#: js/misc/util.js:157
+ msgid "Could not parse command:"
+ msgstr "不能解析命令:"
+
+-#: js/misc/util.js:164
++#: js/misc/util.js:165
+ #, javascript-format
+ msgid "Execution of “%s” failed:"
+ msgstr "执行“%s”失败:"
+
+-#: js/misc/util.js:181
++#: js/misc/util.js:182
+ msgid "Just now"
+ msgstr "刚刚"
+
+-#: js/misc/util.js:183
++#: js/misc/util.js:184
+ #, javascript-format
+ msgid "%d minute ago"
+ msgid_plural "%d minutes ago"
+ msgstr[0] "%d 分钟前"
+
+-#: js/misc/util.js:187
++#: js/misc/util.js:188
+ #, javascript-format
+ msgid "%d hour ago"
+ msgid_plural "%d hours ago"
+ msgstr[0] "%d 小时前"
+
+-#: js/misc/util.js:191 js/ui/dateMenu.js:162
++#: js/misc/util.js:192 js/ui/dateMenu.js:163
+ msgid "Yesterday"
+ msgstr "昨天"
+
+-#: js/misc/util.js:193
++#: js/misc/util.js:194
+ #, javascript-format
+ msgid "%d day ago"
+ msgid_plural "%d days ago"
+ msgstr[0] "%d 天前"
+
+-#: js/misc/util.js:197
++#: js/misc/util.js:198
+ #, javascript-format
+ msgid "%d week ago"
+ msgid_plural "%d weeks ago"
+ msgstr[0] "%d 周前"
+
+-#: js/misc/util.js:201
++#: js/misc/util.js:202
+ #, javascript-format
+ msgid "%d month ago"
+ msgid_plural "%d months ago"
+ msgstr[0] "%d 月前"
+
+-#: js/misc/util.js:204
++#: js/misc/util.js:205
+ #, javascript-format
+ msgid "%d year ago"
+ msgid_plural "%d years ago"
+ msgstr[0] "%d 年前"
+
+ #. Translators: Time in 24h format
+-#: js/misc/util.js:237
++#: js/misc/util.js:238
+ msgid "%H∶%M"
+ msgstr "%H∶%M"
+
+ #. Translators: this is the word "Yesterday" followed by a
+ #. time string in 24h format. i.e. "Yesterday, 14:30"
+-#: js/misc/util.js:243
++#: js/misc/util.js:244
+ #, no-c-format
+ msgid "Yesterday, %H∶%M"
+ msgstr "昨天 %H:%M"
+
+ #. Translators: this is the week day name followed by a time
+ #. string in 24h format. i.e. "Monday, 14:30"
+-#: js/misc/util.js:249
++#: js/misc/util.js:250
+ #, no-c-format
+ msgid "%A, %H∶%M"
+ msgstr "%A %H:%M"
+@@ -657,7 +623,7 @@ msgstr "%A %H:%M"
+ #. Translators: this is the month name and day number
+ #. followed by a time string in 24h format.
+ #. i.e. "May 25, 14:30"
+-#: js/misc/util.js:255
++#: js/misc/util.js:256
+ #, no-c-format
+ msgid "%B %-d, %H∶%M"
+ msgstr "%-m月%-d日,%H∶%M"
+@@ -665,7 +631,7 @@ msgstr "%-m月%-d日,%H∶%M"
+ #. Translators: this is the month name, day number, year
+ #. number followed by a time string in 24h format.
+ #. i.e. "May 25 2012, 14:30"
+-#: js/misc/util.js:261
++#: js/misc/util.js:262
+ #, no-c-format
+ msgid "%B %-d %Y, %H∶%M"
+ msgstr "%Y年%-m月%-d日,%H:%M"
+@@ -673,20 +639,20 @@ msgstr "%Y年%-m月%-d日,%H:%M"
+ #. Show only the time if date is on today
+ #. eslint-disable-line no-lonely-if
+ #. Translators: Time in 12h format
+-#: js/misc/util.js:266
++#: js/misc/util.js:267
+ msgid "%l∶%M %p"
+ msgstr "%p %-l:%M"
+
+ #. Translators: this is the word "Yesterday" followed by a
+ #. time string in 12h format. i.e. "Yesterday, 2:30 pm"
+-#: js/misc/util.js:272
++#: js/misc/util.js:273
+ #, no-c-format
+ msgid "Yesterday, %l∶%M %p"
+ msgstr "昨天%p %-l:%M"
+
+ #. Translators: this is the week day name followed by a time
+ #. string in 12h format. i.e. "Monday, 2:30 pm"
+-#: js/misc/util.js:278
++#: js/misc/util.js:279
+ #, no-c-format
+ msgid "%A, %l∶%M %p"
+ msgstr "%A%p %-l:%M"
+@@ -694,7 +660,7 @@ msgstr "%A%p %-l:%M"
+ #. Translators: this is the month name and day number
+ #. followed by a time string in 12h format.
+ #. i.e. "May 25, 2:30 pm"
+-#: js/misc/util.js:284
++#: js/misc/util.js:285
+ #, no-c-format
+ msgid "%B %-d, %l∶%M %p"
+ msgstr "%-m月%-d日,%p %-l:%M"
+@@ -702,7 +668,7 @@ msgstr "%-m月%-d日,%p %-l:%M"
+ #. Translators: this is the month name, day number, year
+ #. number followed by a time string in 12h format.
+ #. i.e. "May 25 2012, 2:30 pm"
+-#: js/misc/util.js:290
++#: js/misc/util.js:291
+ #, no-c-format
+ msgid "%B %-d %Y, %l∶%M %p"
+ msgstr "%Y年%-m月%-d日,%p %-l:%M"
+@@ -728,45 +694,45 @@ msgstr "拒绝访问"
+ msgid "Grant Access"
+ msgstr "允许访问"
+
+-#: js/ui/appDisplay.js:1816
++#: js/ui/appDisplay.js:1862
+ msgid "Unnamed Folder"
+ msgstr "未命名文件夹"
+
+ #. Translators: This is the heading of a list of open windows
+-#: js/ui/appDisplay.js:3393 js/ui/panel.js:33
++#: js/ui/appDisplay.js:3455 js/ui/panel.js:33
+ msgid "Open Windows"
+ msgstr "打开的窗口"
+
+-#: js/ui/appDisplay.js:3412 js/ui/panel.js:40
++#: js/ui/appDisplay.js:3474 js/ui/panel.js:41
+ msgid "New Window"
+ msgstr "新建窗口"
+
+-#: js/ui/appDisplay.js:3428
++#: js/ui/appDisplay.js:3490
+ msgid "Launch using Integrated Graphics Card"
+ msgstr "使用集成显卡启动"
+
+-#: js/ui/appDisplay.js:3429
++#: js/ui/appDisplay.js:3491
+ msgid "Launch using Discrete Graphics Card"
+ msgstr "使用独立显卡启动"
+
+-#: js/ui/appDisplay.js:3458 js/ui/dash.js:245
++#: js/ui/appDisplay.js:3520 js/ui/dash.js:245
+ msgid "Remove from Favorites"
+ msgstr "从收藏夹中移除"
+
+-#: js/ui/appDisplay.js:3464
++#: js/ui/appDisplay.js:3526
+ msgid "Add to Favorites"
+ msgstr "添加到收藏夹"
+
+-#: js/ui/appDisplay.js:3474 js/ui/panel.js:51
++#: js/ui/appDisplay.js:3536 js/ui/panel.js:52
+ msgid "Show Details"
+ msgstr "显示细节"
+
+-#: js/ui/appFavorites.js:164
++#: js/ui/appFavorites.js:165
+ #, javascript-format
+ msgid "%s has been added to your favorites."
+ msgstr "%s 已经添加到了您的收藏夹。"
+
+-#: js/ui/appFavorites.js:197
++#: js/ui/appFavorites.js:198
+ #, javascript-format
+ msgid "%s has been removed from your favorites."
+ msgstr "%s 已经从您的收藏夹移除。"
+@@ -775,19 +741,19 @@ msgstr "%s 已经从您的收藏夹移除。"
+ msgid "Select Audio Device"
+ msgstr "选择声音设备"
+
+-#: js/ui/audioDeviceSelection.js:55
++#: js/ui/audioDeviceSelection.js:56
+ msgid "Sound Settings"
+ msgstr "声音设置"
+
+-#: js/ui/audioDeviceSelection.js:65
++#: js/ui/audioDeviceSelection.js:69
+ msgid "Headphones"
+ msgstr "耳机"
+
+-#: js/ui/audioDeviceSelection.js:67
++#: js/ui/audioDeviceSelection.js:71
+ msgid "Headset"
+ msgstr "耳麦"
+
+-#: js/ui/audioDeviceSelection.js:69 js/ui/status/volume.js:277
++#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:278
+ msgid "Microphone"
+ msgstr "麦克风"
+
+@@ -804,7 +770,7 @@ msgid "Settings"
+ msgstr "设置"
+
+ #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
+-#: js/ui/calendar.js:36
++#: js/ui/calendar.js:35
+ msgctxt "calendar-no-work"
+ msgid "06"
+ msgstr "06"
+@@ -814,43 +780,43 @@ msgstr "06"
+ #. * NOTE: These grid abbreviations are always shown together
+ #. * and in order, e.g. "S M T W T F S".
+ #.
+-#: js/ui/calendar.js:65
++#: js/ui/calendar.js:61
+ msgctxt "grid sunday"
+ msgid "S"
+ msgstr "日"
+
+ #. Translators: Calendar grid abbreviation for Monday
+-#: js/ui/calendar.js:67
++#: js/ui/calendar.js:63
+ msgctxt "grid monday"
+ msgid "M"
+ msgstr "一"
+
+ #. Translators: Calendar grid abbreviation for Tuesday
+-#: js/ui/calendar.js:69
++#: js/ui/calendar.js:65
+ msgctxt "grid tuesday"
+ msgid "T"
+ msgstr "二"
+
+ #. Translators: Calendar grid abbreviation for Wednesday
+-#: js/ui/calendar.js:71
++#: js/ui/calendar.js:67
+ msgctxt "grid wednesday"
+ msgid "W"
+ msgstr "三"
+
+ #. Translators: Calendar grid abbreviation for Thursday
+-#: js/ui/calendar.js:73
++#: js/ui/calendar.js:69
+ msgctxt "grid thursday"
+ msgid "T"
+ msgstr "四"
+
+ #. Translators: Calendar grid abbreviation for Friday
+-#: js/ui/calendar.js:75
++#: js/ui/calendar.js:71
+ msgctxt "grid friday"
+ msgid "F"
+ msgstr "五"
+
+ #. Translators: Calendar grid abbreviation for Saturday
+-#: js/ui/calendar.js:77
++#: js/ui/calendar.js:73
+ msgctxt "grid saturday"
+ msgid "S"
+ msgstr "六"
+@@ -861,7 +827,7 @@ msgstr "六"
+ #. * "%OB" is the new format specifier introduced in glibc 2.27,
+ #. * in most cases you should not change it.
+ #.
+-#: js/ui/calendar.js:392
++#: js/ui/calendar.js:400
+ msgid "%OB"
+ msgstr "%OB"
+
+@@ -874,37 +840,37 @@ msgstr "%OB"
+ #. * in most cases you should not use the old "%B" here unless you
+ #. * absolutely know what you are doing.
+ #.
+-#: js/ui/calendar.js:402
++#: js/ui/calendar.js:410
+ msgid "%OB %Y"
+ msgstr "%Y %OB"
+
+-#: js/ui/calendar.js:461
++#: js/ui/calendar.js:469
+ msgid "Previous month"
+ msgstr "上个月"
+
+-#: js/ui/calendar.js:476
++#: js/ui/calendar.js:484
+ msgid "Next month"
+ msgstr "下个月"
+
+-#: js/ui/calendar.js:626
++#: js/ui/calendar.js:632
+ #, no-javascript-format
+ msgctxt "date day number format"
+ msgid "%d"
+ msgstr "%d"
+
+-#: js/ui/calendar.js:682
++#: js/ui/calendar.js:688
+ msgid "Week %V"
+ msgstr "第 %V 周"
+
+-#: js/ui/calendar.js:896
++#: js/ui/calendar.js:902
+ msgid "No Notifications"
+ msgstr "无通知"
+
+-#: js/ui/calendar.js:950
++#: js/ui/calendar.js:956
+ msgid "Do Not Disturb"
+ msgstr "请勿打扰"
+
+-#: js/ui/calendar.js:969
++#: js/ui/calendar.js:977
+ msgid "Clear"
+ msgstr "清除"
+
+@@ -954,8 +920,8 @@ msgid ""
+ "Alternatively you can connect by pushing the “WPS” button on your router."
+ msgstr "此外,您也可以通过按下您路由器的“WPS”按钮来连接。"
+
+-#: js/ui/components/networkAgent.js:105 js/ui/status/network.js:253
+-#: js/ui/status/network.js:344 js/ui/status/network.js:944
++#: js/ui/components/networkAgent.js:105 js/ui/status/network.js:258
++#: js/ui/status/network.js:349 js/ui/status/network.js:981
+ msgid "Connect"
+ msgstr "连接"
+
+@@ -1018,7 +984,7 @@ msgstr "PIN"
+ msgid "A password is required to connect to “%s”."
+ msgstr "连接到“%s”需要密码。"
+
+-#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1718
++#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1792
+ msgid "Network Manager"
+ msgstr "网络管理器"
+
+@@ -1054,7 +1020,7 @@ msgstr "抱歉,认证失败。请重试。"
+ msgid "%s is now known as %s"
+ msgstr "%s 现在叫做 %s"
+
+-#: js/ui/ctrlAltTab.js:21 js/ui/overviewControls.js:395
++#: js/ui/ctrlAltTab.js:21 js/ui/overviewControls.js:404
+ msgid "Windows"
+ msgstr "窗口"
+
+@@ -1086,62 +1052,62 @@ msgid "%A %B %e %Y"
+ msgstr "%Y年%-m月%-d日 %A"
+
+ #. Translators: Shown on calendar heading when selected day occurs on current year
+-#: js/ui/dateMenu.js:151
++#: js/ui/dateMenu.js:152
+ msgctxt "calendar heading"
+ msgid "%B %-d"
+ msgstr "%-m月%-d日"
+
+ #. Translators: Shown on calendar heading when selected day occurs on different year
+-#: js/ui/dateMenu.js:154
++#: js/ui/dateMenu.js:155
+ msgctxt "calendar heading"
+ msgid "%B %-d %Y"
+ msgstr "%Y年%-m月%-d日"
+
+-#: js/ui/dateMenu.js:160
++#: js/ui/dateMenu.js:161
+ msgid "Today"
+ msgstr "今天"
+
+-#: js/ui/dateMenu.js:164
++#: js/ui/dateMenu.js:165
+ msgid "Tomorrow"
+ msgstr "明天"
+
+ #. Translators: Shown in calendar event list for all day events
+ #. * Keep it short, best if you can use less then 10 characters
+ #.
+-#: js/ui/dateMenu.js:180
++#: js/ui/dateMenu.js:181
+ msgctxt "event list time"
+ msgid "All Day"
+ msgstr "全天"
+
+-#: js/ui/dateMenu.js:231
++#: js/ui/dateMenu.js:232
+ msgid "No Events"
+ msgstr "无事件"
+
+-#: js/ui/dateMenu.js:348
++#: js/ui/dateMenu.js:349
+ msgid "Add world clocks…"
+ msgstr "添加世界时钟…"
+
+-#: js/ui/dateMenu.js:349
++#: js/ui/dateMenu.js:350
+ msgid "World Clocks"
+ msgstr "世界时钟"
+
+-#: js/ui/dateMenu.js:629
++#: js/ui/dateMenu.js:630
+ msgid "Loading…"
+ msgstr "正在载入…"
+
+-#: js/ui/dateMenu.js:639
++#: js/ui/dateMenu.js:640
+ msgid "Go online for weather information"
+ msgstr "通过互联网查看天气信息"
+
+-#: js/ui/dateMenu.js:641
++#: js/ui/dateMenu.js:642
+ msgid "Weather information is currently unavailable"
+ msgstr "天气信息目前不可用"
+
+-#: js/ui/dateMenu.js:651
++#: js/ui/dateMenu.js:652
+ msgid "Weather"
+ msgstr "天气"
+
+-#: js/ui/dateMenu.js:653
++#: js/ui/dateMenu.js:654
+ msgid "Select weather location…"
+ msgstr "选择天气地点…"
+
+@@ -1228,8 +1194,7 @@ msgstr "重启并安装更新"
+ #: js/ui/endSessionDialog.js:104
+ #, javascript-format
+ msgid "The system will automatically restart and install updates in %d second."
+-msgid_plural ""
+-"The system will automatically restart and install updates in %d seconds."
++msgid_plural "The system will automatically restart and install updates in %d seconds."
+ msgstr[0] "系统将在 %d 秒后自动重启并安装更新。"
+
+ #: js/ui/endSessionDialog.js:111 js/ui/endSessionDialog.js:132
+@@ -1260,9 +1225,7 @@ msgstr "重启并安装升级"
+ msgid ""
+ "%s %s will be installed after restart. Upgrade installation can take a long "
+ "time: ensure that you have backed up and that the computer is plugged in."
+-msgstr ""
+-"重启后将安装 %s %s。升级安装可能需要较长时间:请确保已经进行了备份并且已经插"
+-"入了电源。"
++msgstr "重启后将安装 %s %s。升级安装可能需要较长时间:请确保已经进行了备份并且已经插入了电源。"
+
+ #: js/ui/endSessionDialog.js:284
+ msgid "Low battery power: please plug in before installing updates."
+@@ -1293,24 +1256,24 @@ msgstr "%s(远程)"
+ msgid "%s (console)"
+ msgstr "%s(控制台)"
+
+-#: js/ui/extensionDownloader.js:187
++#: js/ui/extensionDownloader.js:202
+ msgid "Install"
+ msgstr "安装"
+
+-#: js/ui/extensionDownloader.js:193
++#: js/ui/extensionDownloader.js:208
+ msgid "Install Extension"
+ msgstr "安装扩展"
+
+-#: js/ui/extensionDownloader.js:194
++#: js/ui/extensionDownloader.js:209
+ #, javascript-format
+ msgid "Download and install “%s” from extensions.gnome.org?"
+ msgstr "从 extensions.gnome.org 下载并安装“%s”?"
+
+-#: js/ui/extensionSystem.js:253
++#: js/ui/extensionSystem.js:275
+ msgid "Extension Updates Available"
+ msgstr "扩展更新可用"
+
+-#: js/ui/extensionSystem.js:254
++#: js/ui/extensionSystem.js:276
+ msgid "Extension updates are ready to be installed."
+ msgstr "扩展更新已做好安装准备。"
+
+@@ -1354,9 +1317,7 @@ msgstr "慢速键已关闭"
+ msgid ""
+ "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."
+-msgstr ""
+-"您刚刚按住了 Shift 键 8 秒钟。这是启用慢速键特性的快捷方式,这会影响您键盘的"
+-"使用。"
++msgstr "您刚刚按住了 Shift 键 8 秒钟。这是启用慢速键特性的快捷方式,这会影响您键盘的使用。"
+
+ #: js/ui/kbdA11yDialog.js:40
+ msgid "Sticky Keys Turned On"
+@@ -1370,30 +1331,27 @@ msgstr "粘滞键已关闭"
+ msgid ""
+ "You just pressed the Shift key 5 times in a row. This is the shortcut for "
+ "the Sticky Keys feature, which affects the way your keyboard works."
+-msgstr ""
+-"您刚刚按了 Shift 键五次。这是启用粘滞键特性的快捷方式,这会影响您键盘的使用。"
++msgstr "您刚刚按了 Shift 键五次。这是启用粘滞键特性的快捷方式,这会影响您键盘的使用。"
+
+ #: js/ui/kbdA11yDialog.js:45
+ msgid ""
+ "You just pressed two keys at once, or pressed the Shift key 5 times in a "
+ "row. This turns off the Sticky Keys feature, which affects the way your "
+ "keyboard works."
+-msgstr ""
+-"您刚刚一次按了两个键或者按了 Shift 键五次。这将会关闭粘滞键特性,这会影响您使"
+-"用键盘的方式。"
++msgstr "您刚刚一次按了两个键或者按了 Shift 键五次。这将会关闭粘滞键特性,这会影响您使用键盘的方式。"
+
+ #: js/ui/kbdA11yDialog.js:54
+ msgid "Leave On"
+ msgstr "保持开启"
+
+ #: js/ui/kbdA11yDialog.js:54 js/ui/status/bluetooth.js:156
+-#: js/ui/status/network.js:1316
++#: js/ui/status/network.js:1381
+ msgid "Turn On"
+ msgstr "开启"
+
+ #: js/ui/kbdA11yDialog.js:62 js/ui/status/bluetooth.js:156
+-#: js/ui/status/network.js:161 js/ui/status/network.js:345
+-#: js/ui/status/network.js:1316 js/ui/status/network.js:1428
++#: js/ui/status/network.js:166 js/ui/status/network.js:350
++#: js/ui/status/network.js:1381 js/ui/status/network.js:1493
+ #: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
+ #: js/ui/status/rfkill.js:110
+ msgid "Turn Off"
+@@ -1456,27 +1414,25 @@ msgstr "查看源"
+ msgid "Web Page"
+ msgstr "网页"
+
+-#: js/ui/main.js:294
++#: js/ui/main.js:304
+ msgid "Logged in as a privileged user"
+ msgstr "以特权用户身份登录"
+
+-#: js/ui/main.js:295
++#: js/ui/main.js:305
+ msgid ""
+ "Running a session as a privileged user should be avoided for security "
+ "reasons. If possible, you should log in as a normal user."
+-msgstr ""
+-"出于安全原因,应避免以特权用户身份运行会话。如有可能,你应该以正常用户身份登"
+-"录。"
++msgstr "出于安全原因,应避免以特权用户身份运行会话。如有可能,你应该以正常用户身份登录。"
+
+-#: js/ui/main.js:345
++#: js/ui/main.js:354
+ msgid "Screen Lock disabled"
+ msgstr "屏幕锁定已禁用"
+
+-#: js/ui/main.js:346
++#: js/ui/main.js:355
+ msgid "Screen Locking requires the GNOME display manager."
+ msgstr "屏幕锁定需要 GNOME 显示管理器。"
+
+-#: js/ui/messageTray.js:1437
++#: js/ui/messageTray.js:1443
+ msgid "System Information"
+ msgstr "系统信息"
+
+@@ -1492,21 +1448,21 @@ msgstr "未知标题"
+ #. in the search entry when no search is
+ #. active; it should not exceed ~30
+ #. characters.
+-#: js/ui/overviewControls.js:307
++#: js/ui/overviewControls.js:313
+ msgid "Type to search"
+ msgstr "输入以搜索"
+
+-#: js/ui/overviewControls.js:383
++#: js/ui/overviewControls.js:392
+ msgid "Applications"
+ msgstr "应用程序"
+
+-#: js/ui/overview.js:69
++#: js/ui/overview.js:58
+ msgid "Undo"
+ msgstr "撤消"
+
+ #. Translators: This is the main view to select
+ #. activities. See also note for "Activities" string.
+-#: js/ui/overview.js:82
++#: js/ui/overview.js:71
+ msgid "Overview"
+ msgstr "概览"
+
+@@ -1554,22 +1510,22 @@ msgstr "按 Esc 以退出"
+ msgid "Press any key to exit"
+ msgstr "按任意键退出"
+
+-#: js/ui/panel.js:65
++#: js/ui/panel.js:66
+ msgid "Quit"
+ msgstr "退出"
+
+ #. Translators: If there is no suitable word for "Activities"
+ #. in your language, you can use the word for "Overview".
+-#: js/ui/panel.js:388
++#: js/ui/panel.js:404
+ msgid "Activities"
+ msgstr "活动"
+
+-#: js/ui/panel.js:659
++#: js/ui/panel.js:690
+ msgctxt "System menu in the top bar"
+ msgid "System"
+ msgstr "系统"
+
+-#: js/ui/panel.js:771
++#: js/ui/panel.js:808
+ msgid "Top Bar"
+ msgstr "顶栏"
+
+@@ -1589,7 +1545,7 @@ msgstr "Wayland 下重启不可用"
+ msgid "Restarting…"
+ msgstr "正在重启…"
+
+-#: js/ui/screenShield.js:211
++#: js/ui/screenShield.js:221
+ msgid "GNOME needs to lock the screen"
+ msgstr "GNOME 需要锁定屏幕"
+
+@@ -1600,27 +1556,27 @@ msgstr "GNOME 需要锁定屏幕"
+ #.
+ #. XXX: another option is to kick the user into the gdm login
+ #. screen, where we're not affected by grabs
+-#: js/ui/screenShield.js:252 js/ui/screenShield.js:620
++#: js/ui/screenShield.js:270 js/ui/screenShield.js:638
+ msgid "Unable to lock"
+ msgstr "无法锁定"
+
+-#: js/ui/screenShield.js:253 js/ui/screenShield.js:621
++#: js/ui/screenShield.js:271 js/ui/screenShield.js:639
+ msgid "Lock was blocked by an application"
+ msgstr "一个应用程序阻止了锁定"
+
+-#: js/ui/screenshot.js:141
++#: js/ui/screenshot.js:155
+ msgid "Screenshot taken"
+ msgstr "已获取屏幕截图"
+
+-#: js/ui/search.js:824
++#: js/ui/search.js:826
+ msgid "Searching…"
+ msgstr "正在搜索…"
+
+-#: js/ui/search.js:826
++#: js/ui/search.js:828
+ msgid "No results."
+ msgstr "无结果。"
+
+-#: js/ui/search.js:952
++#: js/ui/search.js:951
+ #, javascript-format
+ msgid "%d more"
+ msgid_plural "%d more"
+@@ -1752,7 +1708,7 @@ msgstr "大号文本"
+ msgid "Bluetooth"
+ msgstr "蓝牙"
+
+-#: js/ui/status/bluetooth.js:49 js/ui/status/network.js:620
++#: js/ui/status/bluetooth.js:49 js/ui/status/network.js:652
+ msgid "Bluetooth Settings"
+ msgstr "蓝牙设置"
+
+@@ -1795,11 +1751,11 @@ msgstr "副键点击"
+ msgid "Dwell Click"
+ msgstr "悬停点击"
+
+-#: js/ui/status/keyboard.js:825
++#: js/ui/status/keyboard.js:829
+ msgid "Keyboard"
+ msgstr "键盘"
+
+-#: js/ui/status/keyboard.js:842
++#: js/ui/status/keyboard.js:846
+ msgid "Show Keyboard Layout"
+ msgstr "显示键盘布局"
+
+@@ -1846,13 +1802,13 @@ msgid "<unknown>"
+ msgstr "<未知>"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:450 js/ui/status/network.js:1345
++#: js/ui/status/network.js:455 js/ui/status/network.js:1410
+ #, javascript-format
+ msgid "%s Off"
+ msgstr "%s 已关闭"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:453
++#: js/ui/status/network.js:458
+ #, javascript-format
+ msgid "%s Connected"
+ msgstr "%s 已连接"
+@@ -1860,186 +1816,186 @@ msgstr "%s 已连接"
+ #. Translators: this is for network devices that are physically present but are not
+ #. under NetworkManager's control (and thus cannot be used in the menu);
+ #. %s is a network identifier
+-#: js/ui/status/network.js:458
++#: js/ui/status/network.js:463
+ #, javascript-format
+ msgid "%s Unmanaged"
+ msgstr "%s 未托管"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:461
++#: js/ui/status/network.js:466
+ #, javascript-format
+ msgid "%s Disconnecting"
+ msgstr "%s 正在断开"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:468 js/ui/status/network.js:1337
++#: js/ui/status/network.js:473 js/ui/status/network.js:1402
+ #, javascript-format
+ msgid "%s Connecting"
+ msgstr "%s 正在连接"
+
+ #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
+-#: js/ui/status/network.js:471
++#: js/ui/status/network.js:476
+ #, javascript-format
+ msgid "%s Requires Authentication"
+ msgstr "%s 需要认证"
+
+ #. Translators: this is for devices that require some kind of firmware or kernel
+ #. module, which is missing; %s is a network identifier
+-#: js/ui/status/network.js:479
++#: js/ui/status/network.js:484
+ #, javascript-format
+ msgid "Firmware Missing For %s"
+ msgstr "%s 的固件缺失"
+
+ #. Translators: this is for a network device that cannot be activated (for example it
+ #. is disabled by rfkill, or it has no coverage; %s is a network identifier
+-#: js/ui/status/network.js:483
++#: js/ui/status/network.js:488
+ #, javascript-format
+ msgid "%s Unavailable"
+ msgstr "%s 不可用"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:486
++#: js/ui/status/network.js:491
+ #, javascript-format
+ msgid "%s Connection Failed"
+ msgstr "%s 连接失败"
+
+-#: js/ui/status/network.js:498
++#: js/ui/status/network.js:503
+ msgid "Wired Settings"
+ msgstr "有线设置"
+
+-#: js/ui/status/network.js:541
++#: js/ui/status/network.js:550
+ msgid "Mobile Broadband Settings"
+ msgstr "移动宽带设置"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:587 js/ui/status/network.js:1342
++#: js/ui/status/network.js:619 js/ui/status/network.js:1407
+ #, javascript-format
+ msgid "%s Hardware Disabled"
+ msgstr "%s 硬件开关关闭"
+
+ #. Translators: this is for a network device that cannot be activated
+ #. because it's disabled by rfkill (airplane mode); %s is a network identifier
+-#: js/ui/status/network.js:591
++#: js/ui/status/network.js:623
+ #, javascript-format
+ msgid "%s Disabled"
+ msgstr "%s 已禁用"
+
+-#: js/ui/status/network.js:632
++#: js/ui/status/network.js:664
+ msgid "Connect to Internet"
+ msgstr "连接到互联网"
+
+-#: js/ui/status/network.js:836
++#: js/ui/status/network.js:873
+ msgid "Airplane Mode is On"
+ msgstr "飞行模式已开启"
+
+-#: js/ui/status/network.js:837
++#: js/ui/status/network.js:874
+ msgid "Wi-Fi is disabled when airplane mode is on."
+ msgstr "启用飞行模式时 Wi-Fi 会关闭。"
+
+-#: js/ui/status/network.js:838
++#: js/ui/status/network.js:875
+ msgid "Turn Off Airplane Mode"
+ msgstr "关闭飞行模式"
+
+-#: js/ui/status/network.js:847
++#: js/ui/status/network.js:884
+ msgid "Wi-Fi is Off"
+ msgstr "Wi-Fi 已关闭"
+
+-#: js/ui/status/network.js:848
++#: js/ui/status/network.js:885
+ msgid "Wi-Fi needs to be turned on in order to connect to a network."
+ msgstr "连接网络需要开启 Wi-Fi。"
+
+-#: js/ui/status/network.js:849
++#: js/ui/status/network.js:886
+ msgid "Turn On Wi-Fi"
+ msgstr "开启 Wi-Fi"
+
+-#: js/ui/status/network.js:874
++#: js/ui/status/network.js:911
+ msgid "Wi-Fi Networks"
+ msgstr "Wi-Fi 网络"
+
+-#: js/ui/status/network.js:876
++#: js/ui/status/network.js:913
+ msgid "Select a network"
+ msgstr "选择网络"
+
+-#: js/ui/status/network.js:908
++#: js/ui/status/network.js:945
+ msgid "No Networks"
+ msgstr "无网络"
+
+-#: js/ui/status/network.js:929 js/ui/status/rfkill.js:108
++#: js/ui/status/network.js:966 js/ui/status/rfkill.js:108
+ msgid "Use hardware switch to turn off"
+ msgstr "使用硬件开关关闭"
+
+-#: js/ui/status/network.js:1206
++#: js/ui/status/network.js:1271
+ msgid "Select Network"
+ msgstr "选择网络"
+
+-#: js/ui/status/network.js:1212
++#: js/ui/status/network.js:1277
+ msgid "Wi-Fi Settings"
+ msgstr "Wi-Fi 设置"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:1333
++#: js/ui/status/network.js:1398
+ #, javascript-format
+ msgid "%s Hotspot Active"
+ msgstr "%s 热点已激活"
+
+ #. Translators: %s is a network identifier
+-#: js/ui/status/network.js:1348
++#: js/ui/status/network.js:1413
+ #, javascript-format
+ msgid "%s Not Connected"
+ msgstr "%s 未连接"
+
+-#: js/ui/status/network.js:1445
++#: js/ui/status/network.js:1510
+ msgid "connecting…"
+ msgstr "正在连接…"
+
+ #. Translators: this is for network connections that require some kind of key or password
+-#: js/ui/status/network.js:1448
++#: js/ui/status/network.js:1513
+ msgid "authentication required"
+ msgstr "需要认证"
+
+-#: js/ui/status/network.js:1450
++#: js/ui/status/network.js:1515
+ msgid "connection failed"
+ msgstr "连接失败"
+
+-#: js/ui/status/network.js:1501
++#: js/ui/status/network.js:1566
+ msgid "VPN Settings"
+ msgstr "VPN 设置"
+
+-#: js/ui/status/network.js:1518
++#: js/ui/status/network.js:1583
+ msgid "VPN"
+ msgstr "VPN"
+
+-#: js/ui/status/network.js:1528
++#: js/ui/status/network.js:1593
+ msgid "VPN Off"
+ msgstr "VPN 已关闭"
+
+-#: js/ui/status/network.js:1589 js/ui/status/rfkill.js:84
++#: js/ui/status/network.js:1654 js/ui/status/rfkill.js:84
+ msgid "Network Settings"
+ msgstr "网络设置"
+
+-#: js/ui/status/network.js:1617
++#: js/ui/status/network.js:1682
+ #, javascript-format
+ msgid "%s Wired Connection"
+ msgid_plural "%s Wired Connections"
+ msgstr[0] "%s 个有线连接"
+
+-#: js/ui/status/network.js:1621
++#: js/ui/status/network.js:1686
+ #, javascript-format
+ msgid "%s Wi-Fi Connection"
+ msgid_plural "%s Wi-Fi Connections"
+ msgstr[0] "%s 个 Wi-Fi 连接"
+
+-#: js/ui/status/network.js:1625
++#: js/ui/status/network.js:1690
+ #, javascript-format
+ msgid "%s Modem Connection"
+ msgid_plural "%s Modem Connections"
+ msgstr[0] "%s 个调制解调器连接"
+
+-#: js/ui/status/network.js:1759
++#: js/ui/status/network.js:1833
+ msgid "Connection failed"
+ msgstr "连接失败"
+
+-#: js/ui/status/network.js:1760
++#: js/ui/status/network.js:1834
+ msgid "Activation of network connection failed"
+ msgstr "网络连接激活失败"
+
+@@ -2059,41 +2015,57 @@ msgstr "继续使用"
+ msgid "Disable Until Tomorrow"
+ msgstr "明天前禁用"
+
+-#: js/ui/status/power.js:47
++#: js/ui/status/power.js:51 js/ui/status/powerProfiles.js:57
+ msgid "Power Settings"
+ msgstr "电源设置"
+
+-#: js/ui/status/power.js:63
++#: js/ui/status/power.js:68
+ msgid "Fully Charged"
+ msgstr "已充满电"
+
+-#: js/ui/status/power.js:69
++#: js/ui/status/power.js:74
+ msgid "Not Charging"
+ msgstr "未在充电"
+
+ #. 0 is reported when UPower does not have enough data
+ #. to estimate battery life
+-#: js/ui/status/power.js:72 js/ui/status/power.js:78
++#: js/ui/status/power.js:77 js/ui/status/power.js:83
+ msgid "Estimating…"
+ msgstr "正在估计…"
+
+ #. Translators: this is <hours>:<minutes> Remaining (<percentage>)
+-#: js/ui/status/power.js:86
++#: js/ui/status/power.js:91
+ #, javascript-format
+ msgid "%d∶%02d Remaining (%d %%)"
+ msgstr "剩余 %d:%02d (%d%%)"
+
+ #. Translators: this is <hours>:<minutes> Until Full (<percentage>)
+-#: js/ui/status/power.js:91
++#: js/ui/status/power.js:97
+ #, javascript-format
+ msgid "%d∶%02d Until Full (%d %%)"
+ msgstr "距充满还剩 %d:%02d (%d%%)"
+
+-#: js/ui/status/power.js:139 js/ui/status/power.js:141
++#. The icon label
++#: js/ui/status/power.js:145
+ #, javascript-format
+ msgid "%d %%"
+ msgstr "%d %%"
+
++#: js/ui/status/powerProfiles.js:19
++msgctxt "Power profile"
++msgid "Performance"
++msgstr "性能"
++
++#: js/ui/status/powerProfiles.js:20
++msgctxt "Power profile"
++msgid "Balanced"
++msgstr "平衡"
++
++#: js/ui/status/powerProfiles.js:21
++msgctxt "Power profile"
++msgid "Power Saver"
++msgstr "省电"
++
+ #: js/ui/status/remoteAccess.js:38
+ msgid "Screen is Being Shared"
+ msgstr "正在共享屏幕"
+@@ -2170,11 +2142,11 @@ msgstr "Thunderbolt 授权错误"
+ msgid "Could not authorize the Thunderbolt device: %s"
+ msgstr "无法授权 Thunderbolt 设备:%s"
+
+-#: js/ui/status/volume.js:160
++#: js/ui/status/volume.js:161
+ msgid "Volume changed"
+ msgstr "音量已变更"
+
+-#: js/ui/status/volume.js:222
++#: js/ui/status/volume.js:223
+ msgid "Volume"
+ msgstr "音量"
+
+@@ -2208,40 +2180,40 @@ msgstr "只使用内置"
+
+ #. Translators: This is a time format for a date in
+ #. long format
+-#: js/ui/unlockDialog.js:371
++#: js/ui/unlockDialog.js:380
+ msgid "%A %B %-d"
+ msgstr "%-m月%-d日 %A"
+
+-#: js/ui/unlockDialog.js:377
++#: js/ui/unlockDialog.js:386
+ msgid "Swipe up to unlock"
+ msgstr "向上滑动解锁"
+
+-#: js/ui/unlockDialog.js:378
++#: js/ui/unlockDialog.js:387
+ msgid "Click or press a key to unlock"
+ msgstr "单击或按键解锁"
+
+-#: js/ui/unlockDialog.js:556
++#: js/ui/unlockDialog.js:572
+ msgid "Unlock Window"
+ msgstr "解锁窗口"
+
+-#: js/ui/unlockDialog.js:565
++#: js/ui/unlockDialog.js:581
+ msgid "Log in as another user"
+ msgstr "以另一个用户身份登录"
+
+-#: js/ui/welcomeDialog.js:36
++#: js/ui/welcomeDialog.js:34
+ #, javascript-format
+-msgid "Welcome to GNOME %s"
+-msgstr "欢迎使用 GNOME %s"
++msgid "Welcome to %s"
++msgstr "欢迎使用 %s"
+
+-#: js/ui/welcomeDialog.js:37
++#: js/ui/welcomeDialog.js:35
+ msgid "If you want to learn your way around, check out the tour."
+ msgstr "如果您想了解基本用法,请跟随我们的导览。"
+
+-#: js/ui/welcomeDialog.js:45
++#: js/ui/welcomeDialog.js:43
+ msgid "No Thanks"
+ msgstr "不用了,谢谢"
+
+-#: js/ui/welcomeDialog.js:50
++#: js/ui/welcomeDialog.js:48
+ msgid "Take Tour"
+ msgstr "进行导览"
+
+@@ -2251,22 +2223,22 @@ msgid "“%s” is ready"
+ msgstr "“%s”已就绪"
+
+ #. Translators: This string should be shorter than 30 characters
+-#: js/ui/windowManager.js:63
++#: js/ui/windowManager.js:64
+ msgid "Keep these display settings?"
+ msgstr "保留这些显示设置吗?"
+
+ #. Translators: this and the following message should be limited in length,
+ #. to avoid ellipsizing the labels.
+ #.
+-#: js/ui/windowManager.js:72
++#: js/ui/windowManager.js:73
+ msgid "Revert Settings"
+ msgstr "还原设置"
+
+-#: js/ui/windowManager.js:75
++#: js/ui/windowManager.js:76
+ msgid "Keep Changes"
+ msgstr "保留更改"
+
+-#: js/ui/windowManager.js:94
++#: js/ui/windowManager.js:95
+ #, javascript-format
+ msgid "Settings changes will revert in %d second"
+ msgid_plural "Settings changes will revert in %d seconds"
+@@ -2274,7 +2246,7 @@ msgstr[0] "设置更改将在 %d 秒后还原"
+
+ #. Translators: This represents the size of a window. The first number is
+ #. * the width of the window and the second is the height.
+-#: js/ui/windowManager.js:550
++#: js/ui/windowManager.js:551
+ #, javascript-format
+ msgid "%d × %d"
+ msgstr "%d × %d"
+@@ -2327,23 +2299,27 @@ msgstr "移至上工作区"
+ msgid "Move to Workspace Down"
+ msgstr "移至下工作区"
+
+-#: js/ui/windowMenu.js:132
++#: js/ui/windowMenu.js:123
++msgid "Move to another workspace"
++msgstr "移到另一个工作区"
++
++#: js/ui/windowMenu.js:149
+ msgid "Move to Monitor Up"
+ msgstr "移到上边显示器"
+
+-#: js/ui/windowMenu.js:141
++#: js/ui/windowMenu.js:158
+ msgid "Move to Monitor Down"
+ msgstr "移到下边显示器"
+
+-#: js/ui/windowMenu.js:150
++#: js/ui/windowMenu.js:167
+ msgid "Move to Monitor Left"
+ msgstr "移到左边显示器"
+
+-#: js/ui/windowMenu.js:159
++#: js/ui/windowMenu.js:176
+ msgid "Move to Monitor Right"
+ msgstr "移至右边显示器"
+
+-#: js/ui/windowMenu.js:167
++#: js/ui/windowMenu.js:184
+ msgid "Close"
+ msgstr "关闭"
+
+@@ -2351,28 +2327,28 @@ msgstr "关闭"
+ msgid "Evolution Calendar"
+ msgstr "Evolution 日历"
+
+-#: src/main.c:415 subprojects/extensions-tool/src/main.c:317
++#: src/main.c:423 subprojects/extensions-tool/src/main.c:321
+ msgid "Print version"
+ msgstr "打印版本"
+
+-#: src/main.c:421
++#: src/main.c:429
+ msgid "Mode used by GDM for login screen"
+ msgstr "GDM 用于登录屏幕的模式"
+
+-#: src/main.c:427
++#: src/main.c:435
+ msgid "Use a specific mode, e.g. “gdm” for login screen"
+ msgstr "使用指定模式,如“gdm”用于登录屏幕"
+
+-#: src/main.c:433
++#: src/main.c:441
+ msgid "List possible modes"
+ msgstr "列出可用的模式"
+
+-#: src/shell-app.c:298
++#: src/shell-app.c:300
+ msgctxt "program"
+ msgid "Unknown"
+ msgstr "未知"
+
+-#: src/shell-app.c:549
++#: src/shell-app.c:564
+ #, c-format
+ msgid "Failed to launch “%s”"
+ msgstr "启动“%s”失败"
+@@ -2437,8 +2413,7 @@ msgstr "移除"
+
+ #: subprojects/extensions-app/js/main.js:216
+ msgid "translator-credits"
+-msgstr ""
+-"eternalhui <www.eternalhui@gmail.com>, 2013\n"
++msgstr "eternalhui <www.eternalhui@gmail.com>, 2013\n"
+ "tuhaihe <1132321739qq@gmail.com>, 2013, 2020\n"
+ "Wylmer Wang <wantinghard@gmail.com>, 2013\n"
+ "YunQiang Su <wzssyqa@gmail.com>, 2014\n"
+@@ -2499,11 +2474,9 @@ msgstr "关于扩展"
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:27
+ msgid ""
+-"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
+-"\">extensions.gnome.org</a>."
+-msgstr ""
+-"如需查找或添加扩展,请访问 <a href=\"https://extensions.gnome.org"
+-"\">extensions.gnome.org</a> 网站。"
++"To find and add extensions, visit <a href=\"https://extensions.gnome."
++"org\">extensions.gnome.org</a>."
++msgstr "如需查找或添加扩展,请访问 <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> 网站。"
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:34
+ msgid "Warning"
+@@ -2514,8 +2487,7 @@ msgid ""
+ "Extensions can cause system issues, including performance problems. If you "
+ "encounter problems with your system, it is recommended to disable all "
+ "extensions."
+-msgstr ""
+-"扩展可引起系统问题,包括性能问题。如果您遇到了系统的问题,推荐禁用全部扩展。"
++msgstr "扩展可引起系统问题,包括性能问题。如果您遇到了系统的问题,推荐禁用全部扩展。"
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:150
+ msgid "Manually Installed"
+@@ -2533,8 +2505,7 @@ msgstr "没有已安装的扩展"
+ msgid ""
+ "We’re very sorry, but it was not possible to get the list of installed "
+ "extensions. Make sure you are logged into GNOME and try again."
+-msgstr ""
+-"非常抱歉,我们无法获取已安装扩展的列表。请确保您已登录进 GNOME 并再试一次。"
++msgstr "非常抱歉,我们无法获取已安装扩展的列表。请确保您已登录进 GNOME 并再试一次。"
+
+ #: subprojects/extensions-app/data/ui/extensions-window.ui:288
+ msgid "Extension Updates Ready"
+@@ -2555,8 +2526,7 @@ msgstr "新扩展已成功创建在目录 %s。\n"
+ msgid ""
+ "Name should be a very short (ideally descriptive) string.\n"
+ "Examples are: %s"
+-msgstr ""
+-"名称应该为很短(最好是描述性的)的字符串。\n"
++msgstr "名称应该为很短(最好是描述性的)的字符串。\n"
+ "示例:%s"
+
+ #: subprojects/extensions-tool/src/command-create.c:302
+@@ -2569,20 +2539,20 @@ msgstr "名称"
+ msgid ""
+ "Description is a single-sentence explanation of what your extension does.\n"
+ "Examples are: %s"
+-msgstr ""
+-"描述是对你的扩展的单句话解释。\n"
++msgstr "描述是对你的扩展的单句话解释。\n"
+ "示例:%s"
+
+ #: subprojects/extensions-tool/src/command-create.c:336
++#, c-format
+ msgid ""
+ "UUID is a globally-unique identifier for your extension.\n"
+ "This should be in the format of an email address (clicktofocus@janedoe."
+ "example.com)\n"
+-msgstr ""
+-"UUID 是你的扩展全局唯一的标识符。\n"
++msgstr "UUID 是你的扩展全局唯一的标识符。\n"
+ "这应该是电子邮件地址的格式(clicktofocus@janedoe.example.com)\n"
+
+ #: subprojects/extensions-tool/src/command-create.c:363
++#, c-format
+ msgid "Choose one of the available templates:\n"
+ msgstr "选择一个可用模板:\n"
+
+@@ -2639,6 +2609,8 @@ msgstr "UUID、名称和描述都是必需的"
+ #: subprojects/extensions-tool/src/command-enable.c:46
+ #: subprojects/extensions-tool/src/command-info.c:50
+ #: subprojects/extensions-tool/src/command-list.c:64
++#: subprojects/extensions-tool/src/main.c:146
++#, c-format
+ msgid "Failed to connect to GNOME Shell\n"
+ msgstr "连接 GNOME Shell 失败\n"
+
+@@ -2655,7 +2627,7 @@ msgstr "禁用扩展"
+ #: subprojects/extensions-tool/src/command-disable.c:119
+ #: subprojects/extensions-tool/src/command-enable.c:119
+ #: subprojects/extensions-tool/src/command-info.c:103
+-#: subprojects/extensions-tool/src/command-prefs.c:97
++#: subprojects/extensions-tool/src/command-prefs.c:105
+ #: subprojects/extensions-tool/src/command-reset.c:76
+ #: subprojects/extensions-tool/src/command-uninstall.c:104
+ msgid "No UUID given"
+@@ -2664,7 +2636,7 @@ msgstr "未给定 UUID"
+ #: subprojects/extensions-tool/src/command-disable.c:124
+ #: subprojects/extensions-tool/src/command-enable.c:124
+ #: subprojects/extensions-tool/src/command-info.c:108
+-#: subprojects/extensions-tool/src/command-prefs.c:102
++#: subprojects/extensions-tool/src/command-prefs.c:110
+ #: subprojects/extensions-tool/src/command-reset.c:81
+ #: subprojects/extensions-tool/src/command-uninstall.c:109
+ msgid "More than one UUID given"
+@@ -2794,7 +2766,12 @@ msgstr "指定了超过一个的源目录"
+ msgid "Extension “%s” doesn't have preferences\n"
+ msgstr "扩展 “%s” 没有首选项\n"
+
+-#: subprojects/extensions-tool/src/command-prefs.c:79
++#: subprojects/extensions-tool/src/command-prefs.c:62
++#, c-format
++msgid "Failed to open prefs for extension “%s”: %s\n"
++msgstr "为扩展 \"%s\" 打开 prefs 失败:%s\n"
++
++#: subprojects/extensions-tool/src/command-prefs.c:87
+ msgid "Opens extension preferences"
+ msgstr "打开扩展首选项"
+
+@@ -2803,6 +2780,7 @@ msgid "Reset an extension"
+ msgstr "重置扩展"
+
+ #: subprojects/extensions-tool/src/command-uninstall.c:49
++#, c-format
+ msgid "Cannot uninstall system extensions\n"
+ msgstr "无法卸载系统扩展\n"
+
+@@ -2819,10 +2797,6 @@ msgstr "卸载扩展"
+ msgid "Do not print error messages"
+ msgstr "不要打印错误信息"
+
+-#: subprojects/extensions-tool/src/main.c:146
+-msgid "Failed to connect to GNOME Shell"
+-msgstr "连接 GNOME Shell 失败"
+-
+ #: subprojects/extensions-tool/src/main.c:244
+ msgid "Path"
+ msgstr "路径"
+@@ -2839,78 +2813,78 @@ msgstr "原作者"
+ msgid "State"
+ msgstr "状态"
+
+-#: subprojects/extensions-tool/src/main.c:290
++#: subprojects/extensions-tool/src/main.c:294
+ msgid "“version” takes no arguments"
+ msgstr "“version”不接受参数"
+
+-#: subprojects/extensions-tool/src/main.c:292
+-#: subprojects/extensions-tool/src/main.c:312
++#: subprojects/extensions-tool/src/main.c:296
++#: subprojects/extensions-tool/src/main.c:316
+ msgid "Usage:"
+ msgstr "用法:"
+
+-#: subprojects/extensions-tool/src/main.c:295
++#: subprojects/extensions-tool/src/main.c:299
+ msgid "Print version information and exit."
+ msgstr "打印版本信息并退出。"
+
+-#: subprojects/extensions-tool/src/main.c:310
+-#: subprojects/extensions-tool/src/main.c:313
++#: subprojects/extensions-tool/src/main.c:314
++#: subprojects/extensions-tool/src/main.c:317
+ msgid "COMMAND"
+ msgstr "命令"
+
+-#: subprojects/extensions-tool/src/main.c:313
++#: subprojects/extensions-tool/src/main.c:317
+ msgid "[ARGS…]"
+ msgstr "[参数…]"
+
+-#: subprojects/extensions-tool/src/main.c:315
++#: subprojects/extensions-tool/src/main.c:319
+ msgid "Commands:"
+ msgstr "命令:"
+
+-#: subprojects/extensions-tool/src/main.c:316
++#: subprojects/extensions-tool/src/main.c:320
+ msgid "Print help"
+ msgstr "打印帮助"
+
+-#: subprojects/extensions-tool/src/main.c:318
++#: subprojects/extensions-tool/src/main.c:322
+ msgid "Enable extension"
+ msgstr "启用扩展"
+
+-#: subprojects/extensions-tool/src/main.c:319
++#: subprojects/extensions-tool/src/main.c:323
+ msgid "Disable extension"
+ msgstr "禁用扩展"
+
+-#: subprojects/extensions-tool/src/main.c:320
++#: subprojects/extensions-tool/src/main.c:324
+ msgid "Reset extension"
+ msgstr "重置扩展"
+
+-#: subprojects/extensions-tool/src/main.c:321
++#: subprojects/extensions-tool/src/main.c:325
+ msgid "Uninstall extension"
+ msgstr "卸载扩展"
+
+-#: subprojects/extensions-tool/src/main.c:322
++#: subprojects/extensions-tool/src/main.c:326
+ msgid "List extensions"
+ msgstr "列出扩展"
+
+-#: subprojects/extensions-tool/src/main.c:323
+-#: subprojects/extensions-tool/src/main.c:324
++#: subprojects/extensions-tool/src/main.c:327
++#: subprojects/extensions-tool/src/main.c:328
+ msgid "Show extension info"
+ msgstr "显示扩展信息"
+
+-#: subprojects/extensions-tool/src/main.c:325
++#: subprojects/extensions-tool/src/main.c:329
+ msgid "Open extension preferences"
+ msgstr "打开扩展首选项"
+
+-#: subprojects/extensions-tool/src/main.c:326
++#: subprojects/extensions-tool/src/main.c:330
+ msgid "Create extension"
+ msgstr "创建扩展"
+
+-#: subprojects/extensions-tool/src/main.c:327
++#: subprojects/extensions-tool/src/main.c:331
+ msgid "Package extension"
+ msgstr "打包扩展"
+
+-#: subprojects/extensions-tool/src/main.c:328
++#: subprojects/extensions-tool/src/main.c:332
+ msgid "Install extension bundle"
+ msgstr "安装扩展包"
+
+-#: subprojects/extensions-tool/src/main.c:330
++#: subprojects/extensions-tool/src/main.c:334
+ #, c-format
+ msgid "Use “%s” to get detailed help.\n"
+ msgstr "使用“%s”以获取详细帮助。\n"
+@@ -2951,6 +2925,17 @@ msgstr[0] "%u 个输入"
+ msgid "System Sounds"
+ msgstr "系统声音"
+
++#~ msgid "Enable introspection API"
++#~ msgstr "启用 introspection API"
++
++#~ msgid ""
++#~ "Enables a D-Bus API that allows to introspect the application state of "
++#~ "the shell."
++#~ msgstr "启用一个允许审视(introspect)shell 应用程序状态的 D-Bus API。"
++
++#~ msgid "Failed to connect to GNOME Shell"
++#~ msgstr "连接 GNOME Shell 失败"
++
+ #~ msgid "App Picker View"
+ #~ msgstr "应用选择器视图"
+
+@@ -3134,6 +3119,3 @@ msgstr "系统声音"
+ #~ msgid "%H∶%M"
+ #~ msgstr "%H∶%M"
+
+-#~ msgctxt "event list time"
+-#~ msgid "%l∶%M %p"
+-#~ msgstr "%p %-l:%M"
+--
+2.38.1
+
diff --git a/0001-screenShield-unblank-when-inserting-smartcard.patch b/0001-screenShield-unblank-when-inserting-smartcard.patch
new file mode 100644
index 0000000..3a1ac18
--- /dev/null
+++ b/0001-screenShield-unblank-when-inserting-smartcard.patch
@@ -0,0 +1,33 @@
+From 1e4e9248ef6bcdd95ec3b91c8c8e94c4587a876b Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Fri, 3 Jul 2015 13:54:36 -0400
+Subject: [PATCH] screenShield: unblank when inserting smartcard
+
+If a user inserts the smartcard when the screen is locked/blanked
+we should ask them their pin right away.
+
+At the moment they have to wiggle the mouse or do some other
+action to get the screen to unblank.
+---
+ js/ui/screenShield.js | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
+index 9a64fc32c..bc1a0fba7 100644
+--- a/js/ui/screenShield.js
++++ b/js/ui/screenShield.js
+@@ -85,8 +85,10 @@ var ScreenShield = class {
+ this._smartcardManager = SmartcardManager.getSmartcardManager();
+ this._smartcardManager.connect('smartcard-inserted',
+ (manager, token) => {
+- if (this._isLocked && token.UsedToLogin)
++ if (this._isLocked && token.UsedToLogin) {
++ this._wakeUpScreen();
+ this._activateDialog();
++ }
+ });
+
+ this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
+--
+2.31.1
+
diff --git a/0001-st-icon-Only-get-resource-scale-after-peeking-theme-.patch b/0001-st-icon-Only-get-resource-scale-after-peeking-theme-.patch
new file mode 100644
index 0000000..f5d4b0e
--- /dev/null
+++ b/0001-st-icon-Only-get-resource-scale-after-peeking-theme-.patch
@@ -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
+
diff --git a/0001-st-texture-cache-purge-on-resume.patch b/0001-st-texture-cache-purge-on-resume.patch
new file mode 100644
index 0000000..1a32fc7
--- /dev/null
+++ b/0001-st-texture-cache-purge-on-resume.patch
@@ -0,0 +1,66 @@
+From 483f0340bb64767bd8d6d95788058270dfdb5def Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Tue, 15 Jan 2019 12:54:32 -0500
+Subject: [PATCH] st-texture-cache: purge on resume
+
+With the proprietary nvidia driver, textures get garbled on suspend,
+so the texture cache needs to evict all textures in that situation.
+---
+ js/ui/main.js | 6 +++++-
+ src/st/st-texture-cache.c | 10 ++++++++++
+ src/st/st-texture-cache.h | 1 +
+ 3 files changed, 16 insertions(+), 1 deletion(-)
+
+diff --git a/js/ui/main.js b/js/ui/main.js
+index 979fcefa5..dbf3a32d3 100644
+--- a/js/ui/main.js
++++ b/js/ui/main.js
+@@ -249,7 +249,11 @@ function _initializeUI() {
+ return true;
+ });
+
+- global.display.connect('gl-video-memory-purged', loadTheme);
++ global.display.connect('gl-video-memory-purged', () => {
++ let cache = St.TextureCache.get_default();
++ cache.clear();
++ loadTheme();
++ });
+
+ // Provide the bus object for gnome-session to
+ // initiate logouts.
+diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c
+index b7b547a78..583c3f7d2 100644
+--- a/src/st/st-texture-cache.c
++++ b/src/st/st-texture-cache.c
+@@ -130,6 +130,16 @@ st_texture_cache_class_init (StTextureCacheClass *klass)
+ G_TYPE_NONE, 1, G_TYPE_FILE);
+ }
+
++/* Evicts all cached textures */
++void
++st_texture_cache_clear (StTextureCache *cache)
++{
++ g_return_if_fail (ST_IS_TEXTURE_CACHE (cache));
++
++ g_hash_table_remove_all (cache->priv->keyed_cache);
++ g_signal_emit (cache, signals[ICON_THEME_CHANGED], 0);
++}
++
+ /* Evicts all cached textures for named icons */
+ static void
+ st_texture_cache_evict_icons (StTextureCache *cache)
+diff --git a/src/st/st-texture-cache.h b/src/st/st-texture-cache.h
+index 55d84952d..948915c30 100644
+--- a/src/st/st-texture-cache.h
++++ b/src/st/st-texture-cache.h
+@@ -53,6 +53,7 @@ typedef enum {
+ } StTextureCachePolicy;
+
+ StTextureCache* st_texture_cache_get_default (void);
++void st_texture_cache_clear (StTextureCache *cache);
+
+ ClutterActor *
+ st_texture_cache_load_sliced_image (StTextureCache *cache,
+--
+2.31.1
+
diff --git a/0001-status-network-Use-wwan-settings-panel-for-GSM-LTE-M.patch b/0001-status-network-Use-wwan-settings-panel-for-GSM-LTE-M.patch
new file mode 100644
index 0000000..b910c43
--- /dev/null
+++ b/0001-status-network-Use-wwan-settings-panel-for-GSM-LTE-M.patch
@@ -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
+
diff --git a/0001-status-volume-Hide-sliders-initially.patch b/0001-status-volume-Hide-sliders-initially.patch
new file mode 100644
index 0000000..1600ab9
--- /dev/null
+++ b/0001-status-volume-Hide-sliders-initially.patch
@@ -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
+
diff --git a/0001-welcomeDialog-Adapt-dialog-title.patch b/0001-welcomeDialog-Adapt-dialog-title.patch
new file mode 100644
index 0000000..dd812c7
--- /dev/null
+++ b/0001-welcomeDialog-Adapt-dialog-title.patch
@@ -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
+
diff --git a/0001-window-tracker-Emit-tracked-windows-changed-on-title.patch b/0001-window-tracker-Emit-tracked-windows-changed-on-title.patch
new file mode 100644
index 0000000..98fc45a
--- /dev/null
+++ b/0001-window-tracker-Emit-tracked-windows-changed-on-title.patch
@@ -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
+
diff --git a/0001-window-tracker-Only-emit-tracked-windows-changed-on-.patch b/0001-window-tracker-Only-emit-tracked-windows-changed-on-.patch
new file mode 100644
index 0000000..ca0e67c
--- /dev/null
+++ b/0001-window-tracker-Only-emit-tracked-windows-changed-on-.patch
@@ -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
+
diff --git a/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch b/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
new file mode 100644
index 0000000..980f607
--- /dev/null
+++ b/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
@@ -0,0 +1,45 @@
+From 34a7bfdade939e39c2a01cc1b0737a7bdccddd5b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Tue, 14 Mar 2017 17:04:36 +0100
+Subject: [PATCH] windowMenu: Bring back workspaces submenu for static
+ workspaces
+
+When the titlebar context menu was moved to the shell, the submenu for
+moving to a specific workspace was intentionally left out; some people
+are quite attached to it though, so bring it back when static workspaces
+are used.
+---
+ js/ui/windowMenu.js | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js
+index bb6a8df7b..3449f759d 100644
+--- a/js/ui/windowMenu.js
++++ b/js/ui/windowMenu.js
+@@ -116,6 +116,23 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
+ window.change_workspace(workspace.get_neighbor(dir));
+ });
+ }
++
++ let { workspaceManager } = global;
++ let nWorkspaces = workspaceManager.n_workspaces;
++ if (nWorkspaces > 1 && !Meta.prefs_get_dynamic_workspaces()) {
++ item = new PopupMenu.PopupSubMenuMenuItem(_("Move to another workspace"));
++ this.addMenuItem(item);
++
++ let currentIndex = workspaceManager.get_active_workspace_index();
++ for (let i = 0; i < nWorkspaces; i++) {
++ let index = i;
++ let name = Meta.prefs_get_workspace_name(i);
++ let subitem = item.menu.addAction(name, () => {
++ window.change_workspace_by_index(index, false);
++ });
++ subitem.setSensitive(currentIndex != i);
++ }
++ }
+ }
+ }
+
+--
+2.31.1
+
diff --git a/0001-windowMenu-Ignore-release.patch b/0001-windowMenu-Ignore-release.patch
new file mode 100644
index 0000000..bb55ef9
--- /dev/null
+++ b/0001-windowMenu-Ignore-release.patch
@@ -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
+
diff --git a/0001-windowPreview-Override-with-window-icon-if-available.patch b/0001-windowPreview-Override-with-window-icon-if-available.patch
new file mode 100644
index 0000000..c4cc0e9
--- /dev/null
+++ b/0001-windowPreview-Override-with-window-icon-if-available.patch
@@ -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
+
diff --git a/add-power-profiles-menu.patch b/add-power-profiles-menu.patch
new file mode 100644
index 0000000..289a80b
--- /dev/null
+++ b/add-power-profiles-menu.patch
@@ -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
+
diff --git a/disable-unlock-entry-until-question.patch b/disable-unlock-entry-until-question.patch
new file mode 100644
index 0000000..20980c5
--- /dev/null
+++ b/disable-unlock-entry-until-question.patch
@@ -0,0 +1,176 @@
+From 6739f213965c2b6a41c21b446095f393f9d86e43 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 30 Sep 2015 12:51:24 -0400
+Subject: [PATCH 1/3] authPrompt: don't fade out auth messages if user types
+ password up front
+
+Right now we fade out any stale auth messages as soon as the user starts
+typing. This behavior doesn't really make sense if the user is typing up
+front, before a password is asked.
+---
+ js/gdm/authPrompt.js | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
+index 4844b9ee0..149e5ad4a 100644
+--- a/js/gdm/authPrompt.js
++++ b/js/gdm/authPrompt.js
+@@ -179,7 +179,7 @@ var AuthPrompt = GObject.registerClass({
+
+ [this._textEntry, this._passwordEntry].forEach(entry => {
+ entry.clutter_text.connect('text-changed', () => {
+- if (!this._userVerifier.hasPendingMessages)
++ if (!this._userVerifier.hasPendingMessages && this._queryingService && !this._preemptiveAnswer)
+ this._fadeOutMessage();
+ });
+
+--
+2.31.1
+
+
+From 2b84c3d611120ae2f60386d5c637b84d1958398d Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 30 Sep 2015 14:36:33 -0400
+Subject: [PATCH 2/3] authPrompt: don't spin unless answering question
+
+---
+ js/gdm/authPrompt.js | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
+index 149e5ad4a..c5643d046 100644
+--- a/js/gdm/authPrompt.js
++++ b/js/gdm/authPrompt.js
+@@ -243,13 +243,14 @@ var AuthPrompt = GObject.registerClass({
+ this.verificationStatus = AuthPromptStatus.VERIFICATION_IN_PROGRESS;
+ this.updateSensitivity(false);
+
+- if (shouldSpin)
+- this.startSpinning();
++ if (this._queryingService) {
++ if (shouldSpin)
++ this.startSpinning();
+
+- if (this._queryingService)
+ this._userVerifier.answerQuery(this._queryingService, this._entry.text);
+- else
++ } else {
+ this._preemptiveAnswer = this._entry.text;
++ }
+
+ this.emit('next');
+ }
+--
+2.31.1
+
+
+From 56360c872e01b0554b4d8b53dddba5407d4e889b Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 5 Oct 2015 15:26:18 -0400
+Subject: [PATCH 3/3] authPrompt: stop accepting preemptive answer if user
+ stops typing
+
+We only want to allow the user to type the preemptive password in
+one smooth motion. If they start to type, and then stop typing,
+we should discard their preemptive password as expired.
+
+Typing ahead the password is just a convenience for users who don't
+want to manually lift the shift before typing their passwords, after
+all.
+---
+ js/gdm/authPrompt.js | 37 ++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 36 insertions(+), 1 deletion(-)
+
+diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
+index c5643d046..84c608b2f 100644
+--- a/js/gdm/authPrompt.js
++++ b/js/gdm/authPrompt.js
+@@ -1,7 +1,7 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+ /* exported AuthPrompt */
+
+-const { Clutter, GLib, GObject, Pango, Shell, St } = imports.gi;
++const { Clutter, GLib, GObject, Meta, Pango, Shell, St } = imports.gi;
+
+ const Animation = imports.ui.animation;
+ const Batch = imports.gdm.batch;
+@@ -63,6 +63,8 @@ var AuthPrompt = GObject.registerClass({
+ this._defaultButtonWellActor = null;
+ this._cancelledRetries = 0;
+
++ this._idleMonitor = Meta.IdleMonitor.get_core();
++
+ let reauthenticationOnly;
+ if (this._mode == AuthPromptMode.UNLOCK_ONLY)
+ reauthenticationOnly = true;
+@@ -119,6 +121,11 @@ var AuthPrompt = GObject.registerClass({
+ }
+
+ _onDestroy() {
++ if (this._preemptiveAnswerWatchId) {
++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
++ this._preemptiveAnswerWatchId = 0;
++ }
++
+ this._userVerifier.destroy();
+ this._userVerifier = null;
+ }
+@@ -250,6 +257,11 @@ var AuthPrompt = GObject.registerClass({
+ this._userVerifier.answerQuery(this._queryingService, this._entry.text);
+ } else {
+ this._preemptiveAnswer = this._entry.text;
++
++ if (this._preemptiveAnswerWatchId) {
++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
++ this._preemptiveAnswerWatchId = 0;
++ }
+ }
+
+ this.emit('next');
+@@ -429,6 +441,11 @@ var AuthPrompt = GObject.registerClass({
+ }
+
+ setQuestion(question) {
++ if (this._preemptiveAnswerWatchId) {
++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
++ this._preemptiveAnswerWatchId = 0;
++ }
++
+ this._entry.hint_text = question;
+
+ this._entry.show();
+@@ -530,6 +547,19 @@ var AuthPrompt = GObject.registerClass({
+ this._updateEntry(false);
+ }
+
++ _onUserStoppedTypePreemptiveAnswer() {
++ if (!this._preemptiveAnswerWatchId ||
++ this._preemptiveAnswer ||
++ this._queryingService)
++ return;
++
++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
++ this._preemptiveAnswerWatchId = 0;
++
++ this._entry.text = '';
++ this.updateSensitivity(false);
++ }
++
+ reset() {
+ let oldStatus = this.verificationStatus;
+ this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
+@@ -537,6 +567,11 @@ var AuthPrompt = GObject.registerClass({
+ this.cancelButton.can_focus = this._hasCancelButton;
+ this._preemptiveAnswer = null;
+
++ if (this._preemptiveAnswerWatchId)
++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
++ this._preemptiveAnswerWatchId = this._idleMonitor.add_idle_watch(500,
++ this._onUserStoppedTypePreemptiveAnswer.bind(this));
++
+ if (this._userVerifier)
+ this._userVerifier.cancel();
+
+--
+2.31.1
+
diff --git a/enforce-smartcard-at-unlock.patch b/enforce-smartcard-at-unlock.patch
new file mode 100644
index 0000000..ffe2316
--- /dev/null
+++ b/enforce-smartcard-at-unlock.patch
@@ -0,0 +1,114 @@
+From d2c12a372ea0ccbe6ba682c553d8b83b3253169f Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 28 Sep 2015 10:57:02 -0400
+Subject: [PATCH 1/3] smartcardManager: add way to detect if user logged using
+ (any) token
+
+If a user uses a token at login time, we need to make sure they continue
+to use the token at unlock time.
+
+As a prerequisite for addressing that problem we need to know up front
+if a user logged in with a token at all.
+
+This commit adds the necessary api to detect that case.
+---
+ js/misc/smartcardManager.js | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js
+index d9b6ff474..26f9f5aaa 100644
+--- a/js/misc/smartcardManager.js
++++ b/js/misc/smartcardManager.js
+@@ -111,5 +111,12 @@ var SmartcardManager = class {
+
+ return true;
+ }
++
++ loggedInWithToken() {
++ if (this._loginToken)
++ return true;
++
++ return false;
++ }
+ };
+ Signals.addSignalMethods(SmartcardManager.prototype);
+--
+2.31.1
+
+
+From 98393eef884edc9e685b712c71356751acdd552f Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 28 Sep 2015 19:56:53 -0400
+Subject: [PATCH 2/3] gdm: only unlock with smartcard, if smartcard used for
+ login
+
+If a smartcard is used for login, we need to make sure the smartcard
+gets used for unlock, too.
+---
+ js/gdm/util.js | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/js/gdm/util.js b/js/gdm/util.js
+index 72561daab..6b92e3564 100644
+--- a/js/gdm/util.js
++++ b/js/gdm/util.js
+@@ -149,7 +149,6 @@ var ShellUserVerifier = class {
+ this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
+ this._settings.connect('changed',
+ this._updateDefaultService.bind(this));
+- this._updateDefaultService();
+
+ this._fprintManager = new FprintManagerProxy(Gio.DBus.system,
+ 'net.reactivated.Fprint',
+@@ -166,6 +165,8 @@ var ShellUserVerifier = class {
+ this.smartcardDetected = false;
+ this._checkForSmartcard();
+
++ this._updateDefaultService();
++
+ this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
+ this._checkForSmartcard.bind(this));
+ this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed',
+@@ -527,7 +528,9 @@ var ShellUserVerifier = class {
+ }
+
+ _updateDefaultService() {
+- if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
++ if (this._smartcardManager.loggedInWithToken())
++ this._defaultService = SMARTCARD_SERVICE_NAME;
++ else if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
+ this._defaultService = PASSWORD_SERVICE_NAME;
+ else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
+ this._defaultService = SMARTCARD_SERVICE_NAME;
+--
+2.31.1
+
+
+From 57ca969a0af6f65e71dc1158163b9c826bdb7079 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 28 Sep 2015 19:57:36 -0400
+Subject: [PATCH 3/3] gdm: update default service when smartcard inserted
+
+Early on at start up we may not know if a smartcard is
+available. Make sure we reupdate the default service
+after we get a smartcard insertion event.
+---
+ js/gdm/util.js | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/js/gdm/util.js b/js/gdm/util.js
+index 6b92e3564..e62114cb1 100644
+--- a/js/gdm/util.js
++++ b/js/gdm/util.js
+@@ -420,6 +420,8 @@ var ShellUserVerifier = class {
+ else if (this._preemptingService == SMARTCARD_SERVICE_NAME)
+ this._preemptingService = null;
+
++ this._updateDefaultService();
++
+ this.emit('smartcard-status-changed');
+ }
+ }
+--
+2.31.1
+
diff --git a/fix-inhibit-shortcut-permission.patch b/fix-inhibit-shortcut-permission.patch
new file mode 100644
index 0000000..d20d91b
--- /dev/null
+++ b/fix-inhibit-shortcut-permission.patch
@@ -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
+
diff --git a/fix-markup-in-highlighter.patch b/fix-markup-in-highlighter.patch
new file mode 100644
index 0000000..b7509f6
--- /dev/null
+++ b/fix-markup-in-highlighter.patch
@@ -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 "&apos;", 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 &lt; character' },
++ { input: 'Don\'t',
++ terms: ['t'],
++ output: 'Don&apos;<b>t</b>' },
++ { input: 'Don\'t',
++ terms: ['n\'t'],
++ output: 'Do<b>n&apos;t</b>' },
++ { input: 'Don\'t',
++ terms: ['o', 't'],
++ output: 'D<b>o</b>n&apos;<b>t</b>' },
++ { input: 'salt&pepper',
++ terms: ['salt'],
++ output: '<b>salt</b>&amp;pepper' },
++ { input: 'salt&pepper',
++ terms: ['salt', 'alt'],
++ output: '<b>salt</b>&amp;pepper' },
++ { input: 'salt&pepper',
++ terms: ['pepper'],
++ output: 'salt&amp;<b>pepper</b>' },
++ { input: 'salt&pepper',
++ terms: ['salt', 'pepper'],
++ output: '<b>salt</b>&amp;<b>pepper</b>' },
++ { input: 'salt&pepper',
++ terms: ['t', 'p'],
++ output: 'sal<b>t</b>&amp;<b>p</b>e<b>p</b><b>p</b>er' },
++ { input: 'salt&pepper',
++ terms: ['t', '&', 'p'],
++ output: 'sal<b>t</b><b>&amp;</b><b>p</b>e<b>p</b><b>p</b>er' },
++ { input: 'salt&pepper',
++ terms: ['e'],
++ output: 'salt&amp;p<b>e</b>pp<b>e</b>r' },
++ { input: 'salt&pepper',
++ terms: ['&a', '&am', '&amp', '&amp;'],
++ output: 'salt&amp;pepper' },
++ { input: '&&&&&',
++ terms: ['a'],
++ output: '&amp;&amp;&amp;&amp;&amp;' },
++ { input: '&;&;&;&;&;',
++ terms: ['a'],
++ output: '&amp;;&amp;;&amp;;&amp;;&amp;;' },
++ { input: '&;&;&;&;&;',
++ terms: [';'],
++ output: '&amp;<b>;</b>&amp;<b>;</b>&amp;<b>;</b>&amp;<b>;</b>&amp;<b>;</b>' },
++ { input: '&amp;',
++ terms: ['a'],
++ output: '&amp;<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
+
diff --git a/fix-resetting-auth-prompt.patch b/fix-resetting-auth-prompt.patch
new file mode 100644
index 0000000..98bfef7
--- /dev/null
+++ b/fix-resetting-auth-prompt.patch
@@ -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
+
diff --git a/fix-some-js-warnings.patch b/fix-some-js-warnings.patch
new file mode 100644
index 0000000..67adf0d
--- /dev/null
+++ b/fix-some-js-warnings.patch
@@ -0,0 +1,184 @@
+From 05a5f4641c8ad6337ccb46e63abcaf27dd7eb852 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Tue, 9 Jun 2020 19:42:21 +0200
+Subject: [PATCH 1/4] popupMenu: Guard against non-menu-item children
+
+This avoid a harmless but annoying warning.
+---
+ js/ui/popupMenu.js | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
+index 11528560d..144c600d7 100644
+--- a/js/ui/popupMenu.js
++++ b/js/ui/popupMenu.js
+@@ -773,7 +773,8 @@ var PopupMenuBase = class {
+ }
+
+ _getMenuItems() {
+- return this.box.get_children().map(a => a._delegate).filter(item => {
++ const children = this.box.get_children().filter(a => a._delegate !== undefined);
++ return children.map(a => a._delegate).filter(item => {
+ return item instanceof PopupBaseMenuItem || item instanceof PopupMenuSection;
+ });
+ }
+--
+2.31.1
+
+
+From e5b2c2b3cfd0443fa83fd1f6f56f65fefa5186c3 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Tue, 9 Jun 2020 19:48:06 +0200
+Subject: [PATCH 2/4] st/shadow: Check pipeline when painting
+
+We shouldn't simply assume that st_shadow_helper_update() has been
+called before paint() or that the pipeline was created successfully.
+---
+ src/st/st-shadow.c | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/src/st/st-shadow.c b/src/st/st-shadow.c
+index ab3eaa856..d53808698 100644
+--- a/src/st/st-shadow.c
++++ b/src/st/st-shadow.c
+@@ -296,9 +296,10 @@ st_shadow_helper_paint (StShadowHelper *helper,
+ ClutterActorBox *actor_box,
+ guint8 paint_opacity)
+ {
+- _st_paint_shadow_with_opacity (helper->shadow,
+- framebuffer,
+- helper->pipeline,
+- actor_box,
+- paint_opacity);
++ if (helper->pipeline != NULL)
++ _st_paint_shadow_with_opacity (helper->shadow,
++ framebuffer,
++ helper->pipeline,
++ actor_box,
++ paint_opacity);
+ }
+--
+2.31.1
+
+
+From 0f7656d85af51339d14217b9a673442a18df3de8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 8 Jul 2021 19:10:05 +0200
+Subject: [PATCH 3/4] messageTray: Always remove destroyed banners
+
+Currently we only mark the banner as removed if it is destroyed
+while in SHOWN or SHOWING state, but not if we're already HIDING
+(for example in response to `NotificationBanner::done-displaying`).
+
+If this happens, we'll try to destroy the notification again at
+the end of the transition, which leads to (harmless but annoying)
+log spam since Notifications were turned into GObjects (that are
+disposed when destroyed).
+
+Address this by always marking destroyed banners as removed, while
+still only triggering a state update while shown (or in the process
+of being shown).
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4457
+---
+ js/ui/messageTray.js | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js
+index 1dab00a70..ccf56fc5b 100644
+--- a/js/ui/messageTray.js
++++ b/js/ui/messageTray.js
+@@ -1022,17 +1022,20 @@ var MessageTray = GObject.registerClass({
+ }
+
+ _onNotificationDestroy(notification) {
+- if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) {
+- this._updateNotificationTimeout(0);
+- this._notificationRemoved = true;
+- this._updateState();
+- return;
+- }
++ this._notificationRemoved = this._notification === notification;
+
+- let index = this._notificationQueue.indexOf(notification);
+- if (index != -1) {
+- this._notificationQueue.splice(index, 1);
+- this.emit('queue-changed');
++ if (this._notificationRemoved) {
++ if (this._notificationState === State.SHOWN ||
++ this._notificationState === State.SHOWING) {
++ this._updateNotificationTimeout(0);
++ this._updateState();
++ }
++ } else {
++ const index = this._notificationQueue.indexOf(notification);
++ if (index !== -1) {
++ this._notificationQueue.splice(index, 1);
++ this.emit('queue-changed');
++ }
+ }
+ }
+
+--
+2.31.1
+
+
+From 8652836521d0729ce230268c7b448cdb393d5b47 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 8 Jul 2021 19:23:38 +0200
+Subject: [PATCH 4/4] shellInfo: Don't destroy source on undo
+
+Destroying the source from an action callback will result in the
+notification being destroyed twice:
+
+ - source.destroy() destroys all its notifications
+
+ - a notification destroys itself after an action
+ was activated
+
+This results in unwanted log spam when attempting to dispose the
+notification for a second time.
+
+There is actually no good reason for destroying the source explicitly,
+as sources already self-destruct with their last notification.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4457
+---
+ js/ui/overview.js | 13 +------------
+ 1 file changed, 1 insertion(+), 12 deletions(-)
+
+diff --git a/js/ui/overview.js b/js/ui/overview.js
+index 529779ea8..c71b11389 100644
+--- a/js/ui/overview.js
++++ b/js/ui/overview.js
+@@ -25,16 +25,6 @@ var OVERVIEW_ACTIVATION_TIMEOUT = 0.5;
+ var ShellInfo = class {
+ constructor() {
+ this._source = null;
+- this._undoCallback = null;
+- }
+-
+- _onUndoClicked() {
+- if (this._undoCallback)
+- this._undoCallback();
+- this._undoCallback = null;
+-
+- if (this._source)
+- this._source.destroy();
+ }
+
+ setMessage(text, options) {
+@@ -64,9 +54,8 @@ var ShellInfo = class {
+ notification.update(text, null, { clear: true });
+ }
+
+- this._undoCallback = undoCallback;
+ if (undoCallback)
+- notification.addAction(_("Undo"), this._onUndoClicked.bind(this));
++ notification.addAction(_('Undo'), () => undoCallback());
+
+ this._source.showNotification(notification);
+ }
+--
+2.31.1
+
diff --git a/gdm-networking.patch b/gdm-networking.patch
new file mode 100644
index 0000000..6bb33d7
--- /dev/null
+++ b/gdm-networking.patch
@@ -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
+
diff --git a/gnome-shell-enabled-extensions-background-logos.patch b/gnome-shell-enabled-extensions-background-logos.patch
new file mode 100644
index 0000000..c511c66
--- /dev/null
+++ b/gnome-shell-enabled-extensions-background-logos.patch
@@ -0,0 +1,67 @@
+From 1f8252470ce43dc8a0680871013e2f4492764302 Mon Sep 17 00:00:00 2001
+From: rpm-build <rpm-build>
+Date: Mon, 28 Feb 2022 10:27:09 -0500
+Subject: [PATCH] data: Enable logo extension out of the box
+
+Our brand team would like the logo extension to be used on new
+installs.
+
+This commit makes sure it gets enabled out of the box.
+---
+ data/org.gnome.shell.gschema.xml.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
+index d5ea1e3..e3f440c 100644
+--- a/data/org.gnome.shell.gschema.xml.in
++++ b/data/org.gnome.shell.gschema.xml.in
+@@ -1,45 +1,45 @@
+ <schemalist>
+ <schema id="org.gnome.shell" path="/org/gnome/shell/"
+ gettext-domain="@GETTEXT_PACKAGE@">
+ <key name="development-tools" type="b">
+ <default>true</default>
+ <summary>
+ Enable internal tools useful for developers and testers from Alt-F2
+ </summary>
+ <description>
+ Allows access to internal debugging and monitoring tools
+ using the Alt-F2 dialog.
+ </description>
+ </key>
+ <key name="enabled-extensions" type="as">
+- <default>[]</default>
++ <default>['background-logo@fedorahosted.org']</default>
+ <summary>UUIDs of extensions to enable</summary>
+ <description>
+ GNOME Shell extensions have a UUID property; this key lists extensions
+ which should be loaded. Any extension that wants to be loaded needs
+ to be in this list. You can also manipulate this list with the
+ EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
+ </description>
+ </key>
+ <key name="disabled-extensions" type="as">
+ <default>[]</default>
+ <summary>UUIDs of extensions to force disabling</summary>
+ <description>
+ GNOME Shell extensions have a UUID property; this key lists extensions
+ which should be disabled, even if loaded as part of the current mode.
+ You can also manipulate this list with the EnableExtension and
+ DisableExtension D-Bus methods on org.gnome.Shell.
+ This key takes precedence over the “enabled-extensions” setting.
+ </description>
+ </key>
+ <key name="disable-user-extensions" type="b">
+ <default>false</default>
+ <summary>Disable user extensions</summary>
+ <description>
+ Disable all extensions the user has enabled without affecting
+ the “enabled-extension” setting.
+ </description>
+ </key>
+ <key name="disable-extension-version-validation" type="b">
+ <default>false</default>
+ <summary>Disables the validation of extension version compatibility</summary>
+--
+2.35.1
+
diff --git a/gnome-shell-favourite-apps-firefox.patch b/gnome-shell-favourite-apps-firefox.patch
new file mode 100644
index 0000000..fba63ae
--- /dev/null
+++ b/gnome-shell-favourite-apps-firefox.patch
@@ -0,0 +1,38 @@
+From a2e62e671260576d23f18c22c10a48ac4a8504af Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 17 Sep 2014 07:11:12 +0200
+Subject: [PATCH] Replace Web with Firefox in default favorites
+
+---
+ data/org.gnome.shell.gschema.xml.in | 2 +-
+ js/ui/appFavorites.js | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
+index cd6a2356d..b8a13a9cc 100644
+--- a/data/org.gnome.shell.gschema.xml.in
++++ b/data/org.gnome.shell.gschema.xml.in
+@@ -50,7 +50,7 @@
+ </description>
+ </key>
+ <key name="favorite-apps" type="as">
+- <default>[ 'org.gnome.Epiphany.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
++ <default>[ 'firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
+ <summary>List of desktop file IDs for favorite applications</summary>
+ <description>
+ The applications corresponding to these identifiers
+diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js
+index a876727ed..24ce16f81 100644
+--- a/js/ui/appFavorites.js
++++ b/js/ui/appFavorites.js
+@@ -52,6 +52,7 @@ const RENAMED_DESKTOP_IDS = {
+ 'gnotski.desktop': 'org.gnome.Klotski.desktop',
+ 'gtali.desktop': 'org.gnome.Tali.desktop',
+ 'iagno.desktop': 'org.gnome.Reversi.desktop',
++ 'mozilla-firefox.desktop': 'firefox.desktop',
+ 'nautilus.desktop': 'org.gnome.Nautilus.desktop',
+ 'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
+ 'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
+--
+2.30.1
+
diff --git a/gnome-shell-favourite-apps-terminal.patch b/gnome-shell-favourite-apps-terminal.patch
new file mode 100644
index 0000000..5f7207a
--- /dev/null
+++ b/gnome-shell-favourite-apps-terminal.patch
@@ -0,0 +1,25 @@
+From 1e699b55f3dc84b2ddbc5acd03424240eddbe06c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 9 Mar 2017 14:44:32 +0100
+Subject: [PATCH 3/3] appFavorites: Add terminal
+
+---
+ data/org.gnome.shell.gschema.xml.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
+index 35ddaf4a9..d5ea1e35f 100644
+--- a/data/org.gnome.shell.gschema.xml.in
++++ b/data/org.gnome.shell.gschema.xml.in
+@@ -50,7 +50,7 @@
+ </description>
+ </key>
+ <key name="favorite-apps" type="as">
+- <default>[ 'firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop' ]</default>
++ <default>[ 'firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop', 'org.gnome.Terminal.desktop' ]</default>
+ <summary>List of desktop file IDs for favorite applications</summary>
+ <description>
+ The applications corresponding to these identifiers
+--
+2.31.1
+
diff --git a/gnome-shell-favourite-apps-yelp.patch b/gnome-shell-favourite-apps-yelp.patch
new file mode 100644
index 0000000..f47dab8
--- /dev/null
+++ b/gnome-shell-favourite-apps-yelp.patch
@@ -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
+
diff --git a/gnome-shell.spec b/gnome-shell.spec
new file mode 100644
index 0000000..66c5a60
--- /dev/null
+++ b/gnome-shell.spec
@@ -0,0 +1,1791 @@
+%global tarball_version %%(echo %{version} | tr '~' '.')
+
+%if 0%{?rhel}
+%global portal_helper 0
+%else
+%global portal_helper 1
+%endif
+
+Name: gnome-shell
+Version: 40.10
+Release: 21%{?dist}
+Summary: Window management and application launching for GNOME
+
+License: GPLv2+
+URL: https://wiki.gnome.org/Projects/GnomeShell
+Source0: http://download.gnome.org/sources/gnome-shell/40/%{name}-%{tarball_version}.tar.xz
+
+Recommends: gnome-shell-extension-background-logo
+
+# Replace Epiphany with Firefox in the default favourite apps list, etc
+# and enable background extension by default
+Patch1: gnome-shell-favourite-apps-firefox.patch
+Patch2: gnome-shell-favourite-apps-yelp.patch
+Patch3: gnome-shell-favourite-apps-terminal.patch
+Patch4: gnome-shell-enabled-extensions-background-logos.patch
+
+# GDM/Lock stuff
+Patch10: 0001-screenShield-unblank-when-inserting-smartcard.patch
+Patch11: enforce-smartcard-at-unlock.patch
+Patch12: disable-unlock-entry-until-question.patch
+Patch13: 0001-loginDialog-make-info-messages-themed.patch
+Patch14: support-choicelist-extension.patch
+Patch15: gdm-networking.patch
+Patch16: login-screen-extensions.patch
+Patch17: fix-resetting-auth-prompt.patch
+Patch18: 0001-authPrompt-Disregard-smartcard-status-changes-events.patch
+
+# Misc.
+Patch30: 0001-panel-add-an-icon-to-the-ActivitiesButton.patch
+Patch31: 0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch
+Patch32: 0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
+Patch33: 0001-main-Dump-stack-on-segfaults-by-default.patch
+Patch34: 0001-extensionDownloader-Refuse-to-override-system-extens.patch
+Patch35: fix-some-js-warnings.patch
+Patch36: 0001-st-texture-cache-purge-on-resume.patch
+Patch37: 0001-Update-generated-stylesheets.patch
+Patch38: add-power-profiles-menu.patch
+Patch39: 0001-status-network-Use-wwan-settings-panel-for-GSM-LTE-M.patch
+Patch40: 0001-welcomeDialog-Adapt-dialog-title.patch
+Patch41: 0001-main-Leak-the-GJS-context-and-ShellGlobal.patch
+Patch42: fix-markup-in-highlighter.patch
+Patch43: restrict-dbus-callers.patch
+Patch44: 0001-Revert-dash-Subtract-vertical-margins-from-availHeig.patch
+Patch45: 0001-status-volume-Hide-sliders-initially.patch
+Patch46: 0001-kbdA11yDialog-Use-MetaKeyboardA11yFlags.patch
+Patch47: 0001-layout-Initialize-regions-unconditionally.patch
+Patch48: 0001-introspect-Allowlist-GNOME-portal.patch
+Patch49: 0001-introspect-Add-WindowsChanged-signal.patch
+Patch50: 0001-window-tracker-Emit-tracked-windows-changed-on-title.patch
+Patch51: 0001-magnifier-Request-window-relative-coordinates-for-fo.patch
+Patch52: 0001-osk-layouts-Replace-SS-extra-key-with.patch
+Patch53: 0001-po-Update-translations.patch
+Patch54: 0001-st-icon-Only-get-resource-scale-after-peeking-theme-.patch
+Patch55: 0001-window-tracker-Only-emit-tracked-windows-changed-on-.patch
+Patch56: owe-support.patch
+Patch57: 0001-windowMenu-Ignore-release.patch
+Patch58: portal-notify.patch
+Patch59: 0001-extensionSystem-Support-locking-down-extension-insta.patch
+Patch60: 0001-windowPreview-Override-with-window-icon-if-available.patch
+Patch61: screencast-bus-name.patch
+Patch62: fix-inhibit-shortcut-permission.patch
+
+%define eds_version 3.33.1
+%define gnome_desktop_version 3.35.91
+%define glib2_version 2.56.0
+%define gobject_introspection_version 1.49.1
+%define gjs_version 1.57.3
+%define gtk3_version 3.15.0
+%define gtk4_version 4.0.0
+%define mutter_version 40.0~alpha.1.1
+%define polkit_version 0.100
+%define gsettings_desktop_schemas_version 40~alpha
+%define ibus_version 1.5.2
+%define gnome_bluetooth_version 1:3.9.0
+%define gstreamer_version 1.4.5
+%define pipewire_version 0.3.0
+%define gnome_settings_daemon_version 3.37.1
+%define libgweather_version 40~alpha
+
+BuildRequires: bash-completion
+BuildRequires: gcc
+BuildRequires: meson
+BuildRequires: git
+BuildRequires: ibus-devel >= %{ibus_version}
+BuildRequires: chrpath
+BuildRequires: desktop-file-utils
+BuildRequires: evolution-data-server-devel >= %{eds_version}
+BuildRequires: gcr-devel
+BuildRequires: gjs-devel >= %{gjs_version}
+BuildRequires: glib2-devel >= %{glib2_version}
+BuildRequires: gnome-autoar-devel
+BuildRequires: pkgconfig(gnome-desktop-3.0)
+BuildRequires: gobject-introspection >= %{gobject_introspection_version}
+BuildRequires: mesa-libGL-devel
+BuildRequires: mesa-libEGL-devel
+BuildRequires: NetworkManager-libnm-devel
+BuildRequires: polkit-devel >= %{polkit_version}
+BuildRequires: startup-notification-devel
+BuildRequires: systemd-devel
+# for screencast recorder functionality
+BuildRequires: gstreamer1-devel >= %{gstreamer_version}
+BuildRequires: pkgconfig(libpipewire-0.3) >= %{pipewire_version}
+BuildRequires: gtk3-devel >= %{gtk3_version}
+BuildRequires: gtk4-devel >= %{gtk4_version}
+BuildRequires: gettext >= 0.19.6
+BuildRequires: libcanberra-devel
+BuildRequires: python3
+
+# for barriers
+BuildRequires: libXfixes-devel >= 5.0
+# used in unused BigThemeImage
+BuildRequires: librsvg2-devel
+BuildRequires: mutter-devel >= %{mutter_version}
+BuildRequires: pulseaudio-libs-devel
+%ifnarch s390 s390x ppc ppc64 ppc64p7
+BuildRequires: gnome-bluetooth-libs-devel >= %{gnome_bluetooth_version}
+%endif
+# Bootstrap requirements
+BuildRequires: gtk-doc
+%ifnarch s390 s390x
+Requires: gnome-bluetooth%{?_isa} >= %{gnome_bluetooth_version}
+%endif
+Requires: gnome-desktop3%{?_isa} >= %{gnome_desktop_version}
+%if 0%{?rhel} != 7
+# Disabled on RHEL 7 to allow logging into KDE session by default
+Recommends: gnome-session-xsession
+%endif
+# wrapper script uses to restart old GNOME session if run --replace
+# from the command line
+Requires: gobject-introspection%{?_isa} >= %{gobject_introspection_version}
+Requires: gjs%{?_isa} >= %{gjs_version}
+Requires: gtk3%{?_isa} >= %{gtk3_version}
+Requires: gtk4%{?_isa} >= %{gtk4_version}
+Requires: highcontrast-icon-theme
+Requires: libnma%{?_isa}
+# needed for loading SVG's via gdk-pixbuf
+Requires: librsvg2%{?_isa}
+Requires: mutter%{?_isa} >= %{mutter_version}
+Requires: upower%{?_isa}
+Requires: polkit%{?_isa} >= %{polkit_version}
+Requires: gnome-desktop3%{?_isa} >= %{gnome_desktop_version}
+Requires: glib2%{?_isa} >= %{glib2_version}
+Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version}
+Requires: gnome-settings-daemon%{?_isa} >= %{gnome_settings_daemon_version}
+Requires: gstreamer1%{?_isa} >= %{gstreamer_version}
+# needed for screen recorder
+Requires: gstreamer1-plugins-good%{?_isa}
+Requires: pipewire-gstreamer%{?_isa}
+Requires: xdg-user-dirs-gtk
+# needed for schemas
+Requires: at-spi2-atk%{?_isa}
+# needed for on-screen keyboard
+Requires: ibus%{?_isa} >= %{ibus_version}
+# needed for "show keyboard layout"
+Requires: libgnomekbd
+# needed for the user menu
+Requires: accountsservice-libs%{?_isa}
+Requires: gdm-libs%{?_isa}
+# needed for settings items in menus
+Requires: control-center
+# needed by some utilities
+Requires: python3%{_isa}
+# needed for the dual-GPU launch menu
+Requires: switcheroo-control
+# needed for clocks/weather integration
+Requires: geoclue2-libs%{?_isa}
+Requires: libgweather%{?_isa} >= %{libgweather_version}
+# needed for thunderbolt support
+Requires: bolt%{?_isa}
+# Needed for launching flatpak apps etc
+# 1.8.0 is needed for source type support in the screencast portal.
+Requires: xdg-desktop-portal-gtk >= 1.8.0
+Requires: xdg-desktop-portal-gnome
+# needed by the welcome dialog
+Recommends: gnome-tour
+
+Provides: desktop-notification-daemon = %{version}-%{release}
+Provides: PolicyKit-authentication-agent = %{version}-%{release}
+Provides: bundled(gvc)
+Provides: bundled(libcroco) = 0.6.13
+
+%if 0%{?rhel}
+# In Fedora, fedora-obsolete-packages obsoletes caribou
+Obsoletes: caribou < 0.4.21-10
+Obsoletes: caribou-antler < 0.4.21-10
+Obsoletes: caribou-devel < 0.4.21-10
+Obsoletes: caribou-gtk2-module < 0.4.21-10
+Obsoletes: caribou-gtk3-module < 0.4.21-10
+Obsoletes: python-caribou < 0.4.21-10
+Obsoletes: python2-caribou < 0.4.21-10
+Obsoletes: python3-caribou < 0.4.21-10
+%endif
+
+# https://bugzilla.redhat.com/show_bug.cgi?id=1740897
+Conflicts: gnome-shell-extension-background-logo < 3.34.0
+
+%description
+GNOME Shell provides core user interface functions for the GNOME 3 desktop,
+like switching to windows and launching applications. GNOME Shell takes
+advantage of the capabilities of modern graphics hardware and introduces
+innovative user interface concepts to provide a visually attractive and
+easy to use experience.
+
+%prep
+%autosetup -S git -n %{name}-%{tarball_version}
+
+%build
+%meson \
+ -Dextensions_app=false \
+%if %{portal_helper}
+ -Dportal_helper=true \
+%else
+ -Dportal_helper=false \
+%endif
+ %{nil}
+%meson_build
+
+%install
+%meson_install
+
+# Create empty directories where other packages can drop extensions
+mkdir -p %{buildroot}%{_datadir}/gnome-shell/extensions
+mkdir -p %{buildroot}%{_datadir}/gnome-shell/search-providers
+
+%find_lang %{name}
+
+%check
+desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Shell.desktop
+desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.desktop
+
+%files -f %{name}.lang
+%license COPYING
+%doc README.md
+%{_bindir}/gnome-shell
+%{_bindir}/gnome-extensions
+%{_bindir}/gnome-shell-extension-prefs
+%{_bindir}/gnome-shell-extension-tool
+%{_bindir}/gnome-shell-perf-tool
+%{_datadir}/glib-2.0/schemas/*.xml
+%{_datadir}/glib-2.0/schemas/00_org.gnome.shell.gschema.override
+%{_datadir}/applications/org.gnome.Shell.Extensions.desktop
+%{_datadir}/applications/org.gnome.Shell.desktop
+%{_datadir}/applications/evolution-calendar.desktop
+%{_datadir}/bash-completion/completions/gnome-extensions
+%{_datadir}/gnome-control-center/keybindings/50-gnome-shell-system.xml
+%{_datadir}/gnome-shell/
+%{_datadir}/dbus-1/services/org.gnome.ScreenSaver.service
+%{_datadir}/dbus-1/services/org.gnome.Shell.CalendarServer.service
+%{_datadir}/dbus-1/services/org.gnome.Shell.Extensions.service
+%{_datadir}/dbus-1/services/org.gnome.Shell.HotplugSniffer.service
+%{_datadir}/dbus-1/services/org.gnome.Shell.Notifications.service
+%{_datadir}/dbus-1/services/org.gnome.Shell.Screencast.service
+%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Extensions.xml
+%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Introspect.xml
+%{_datadir}/dbus-1/interfaces/org.gnome.Shell.PadOsd.xml
+%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Screencast.xml
+%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Screenshot.xml
+%{_datadir}/dbus-1/interfaces/org.gnome.ShellSearchProvider.xml
+%{_datadir}/dbus-1/interfaces/org.gnome.ShellSearchProvider2.xml
+%{_datadir}/icons/hicolor/scalable/apps/org.gnome.Shell.Extensions.svg
+%{_datadir}/icons/hicolor/symbolic/apps/org.gnome.Shell.Extensions-symbolic.svg
+%{_userunitdir}/org.gnome.Shell-disable-extensions.service
+%{_userunitdir}/org.gnome.Shell.target
+%{_userunitdir}/org.gnome.Shell@wayland.service
+%{_userunitdir}/org.gnome.Shell@x11.service
+%{_sysconfdir}/xdg/autostart/gnome-shell-overrides-migration.desktop
+# Co own directory instead of pulling in xdg-desktop-portal - we
+# are providing a backend to the portal, not depending on it
+%dir %{_datadir}/xdg-desktop-portal/portals/
+%{_datadir}/xdg-desktop-portal/portals/gnome-shell.portal
+%{_libdir}/gnome-shell/
+%{_libexecdir}/gnome-shell-calendar-server
+%{_libexecdir}/gnome-shell-perf-helper
+%{_libexecdir}/gnome-shell-hotplug-sniffer
+%{_libexecdir}/gnome-shell-overrides-migration.sh
+# Co own these directories instead of pulling in GConf
+# after all, we are trying to get rid of GConf with these files
+%dir %{_datadir}/GConf
+%dir %{_datadir}/GConf/gsettings
+%{_datadir}/GConf/gsettings/gnome-shell-overrides.convert
+%{_mandir}/man1/gnome-extensions.1*
+%{_mandir}/man1/gnome-shell.1*
+
+%if %{portal_helper}
+%{_datadir}/applications/org.gnome.Shell.PortalHelper.desktop
+%{_datadir}/dbus-1/services/org.gnome.Shell.PortalHelper.service
+%{_libexecdir}/gnome-shell-portal-helper
+%endif
+
+%changelog
+* Wed Jul 10 2024 Florian Müllner <fmuellner@redhat.com> - 40.10-21
+- Only open portal login in response to user action
+ Resolves: RHEL-39098
+
+* Wed May 15 2024 Florian Müllner <fmuellner@redhat.com> - 40.10-20
+- Fix inhibit-shortcut permissions
+ Resolves: #RHEL-2031
+
+* Wed May 15 2024 Michael Catanzaro <mcatanzaro@redhat.com> - 40.10-19
+- Use correct bus name for screencast service
+ Related: RHEL-35775
+
+* Tue Mar 19 2024 Florian Müllner <fmuellner@redhat.com> - 40.10-18
+- Use window icon in overview if available
+ Resolves: RHEL-24713
+
+* Sat Feb 10 2024 Florian Müllner <fmuellner@redhat.com> - 40.10-17
+- Allow restricting extension installation
+ Resolves: RHEL-25017
+
+* Wed Nov 01 2023 Michael Catanzaro <mcatanzaro@redhat.com> - 40.10-16
+- Disable captive portal helper if WebKitGTK is not installed
+ Resolves: RHEL-10487
+
+* Wed Oct 18 2023 Florian Müllner <fmuellner@redhat.com> - 40.10-15
+- Fix window-menu closing immediately on open
+ Resolves: RHEL-2663
+
+* Wed Sep 06 2023 Florian Müllner <fmuellner@redhat.com> - 40.10-14
+- Support OWE networks
+ Resolves: #2236665
+
+* Mon May 15 2023 Ray Strode <rstrode@redhat.com> - 40.10-13
+- Don't reset smartcard conversation twice when smartcard is inserted.
+ Resolves: #2140898
+
+* Wed Feb 22 2023 Florian Müllner <fmuellner@redhat.com> - 40.10-12
+- Require xdg-desktop-portal-gnome
+ Resolves: #2172524
+
+* Mon Feb 13 2023 Jonas Ådahl <jadahl@redhat.com> - 40.10-11
+- Backport 'WindowsChanged' regression fix
+ Resolves: #2168915
+
+* Mon Feb 13 2023 Jonas Ådahl <jadahl@redhat.com> - 40.10-10
+- Backport fix for starting headless
+ Resolves: #2116363
+
+* Tue Feb 07 2023 Florian Müllner <fmuellner@redhat.com> - 40.10-9
+- Fix resetting auth prompt
+ Resolves: #2166226
+
+* Wed Jan 25 2023 Florian Müllner <fmuellner@redhat.com> - 40.10-8
+- Update translations
+ Resolves: #2131801
+
+* Wed Jan 25 2023 Florian Müllner <fmuellner@redhat.com> - 40.10-7
+- Use "ẞ" instead of "SS" in on-screen keyboard
+ Resolves: #2019420
+
+* Wed Jan 18 2023 Florian Müllner <fmuellner@redhat.com> - 40.10-6
+- Request window-relative coordinates in focus tracker
+ Resolves: #2009350
+
+* Fri Dec 02 2022 Jonas Ådahl <jadahl@redhat.com> - 40.10-5
+- Backport 'WindowsChanged' introspect signal
+ Related: #2148362
+
+* Wed Nov 23 2022 Florian Müllner <fmuellner@redhat.com> - 40.10-4
+- Fix struts on login screen
+ Resolves: #2145185
+- Allow gnome portal to access introspection API
+ Resolves: #2079194
+
+* Mon Jun 20 2022 Florian Müllner <fmuellner@redhat.com> - 40.10-3
+- Fix keyboard a11y confirmation dialog
+ Resolves: #2047644
+
+* Wed May 11 2022 Florian Müllner <fmuellner@redhat.com> - 40.10-2
+- Hide volume sliders initially
+ Related: #2052808
+
+* Tue Apr 19 2022 Florian Müllner <fmuellner@redhat.com> - 40.10-1
+- Update to 40.10
+ Related: #2066169
+
+* Tue Apr 05 2022 Florian Müllner <fmuellner@redhat.com>- 40.9-5
+- Keep new ShimMetaContext type private
+ Related: #2055366
+
+* Fri Apr 01 2022 Florian Müllner <fmuellner@redhat.com>- 40.9-4
+- Restrict D-Bus callers
+ Resolves: #2055366
+
+* Wed Mar 30 2022 Florian Müllner <fmuellner@redhat.com> - 40.9-3
+- Fix markup handling in highlighter
+ Resolves: #2049194
+- Fix warning on restacking
+ Resolves: #2053638
+
+* Mon Feb 28 2022 Ray Strode <rstrode@redhat.com> - 40.9-2
+- Depend on and use background extension
+ Related: #2057150
+
+* Tue Feb 22 2022 Florian Müllner <fmuellner@redhat.com> - 40.9-1
+- Update to 40.9
+ Resolves: #2056411
+
+* Tue Feb 08 2022 Ray Strode <rstrode@redhat.com> - 40.8-3
+- Backport latest, working, version of ChoiceList extension
+- Regenerate stylesheet patch
+ Related: #1993954
+
+* Thu Jan 27 2022 Florian Müllner <fmuellner@redhat.com> - 40.8-2
+- Do not hardcode OS name in welcome dialog
+ Resolves: #2044040
+
+* Mon Jan 17 2022 Florian Müllner <fmuellner@redhat.com> - 40.8-1
+- Update to 40.8
+ Resolves: #2040061
+
+* Mon Dec 13 2021 Florian Müllner <fmuellner@redhat.com> - 40.7-1
+- Update to 40.7
+ Resolves: #2031655
+
+* Thu Nov 04 2021 Florian Müllner <fmuellner@redhat.com> - 40.6-1
+- Update to 40.6
+- Work around crashy tear down
+ Resolves: #2008065
+
+* Wed Oct 27 2021 Florian Müllner <fmuellner@redhat.com> - 40.4-5
+- Adapt welcome dialog title
+ Resolves: #2013989
+
+* Wed Oct 13 2021 Ray Strode <rstrode@redhat.com> - 40.4-4
+- Ensure extensions are reenabled after unlock
+ Resolves: #2013801
+
+* Mon Sep 27 2021 Ray Strode <rstrode@redhat.com> - 40.4-3
+- Allow extensions at the login screen
+ Related: #2006985
+
+* Thu Aug 19 2021 Florian Müllner <fmuellner@redhat.com> - 40.4-2
+- Use wwan setting panel for GSM/LTE modems
+ Resolves: #1995560
+
+* Wed Aug 18 2021 Florian Müllner <fmuellner@redhat.com> - 40.4-1
+- Update to 40.4
+ Resolves: #1995094
+
+* Wed Aug 18 2021 Florian Müllner <fmuellner@redhat.com> - 40.3-4
+- Add power profiles menu
+ Resolves: #1994471
+
+* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 40.3-3
+- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
+ Related: rhbz#1991688
+
+* Mon Aug 09 2021 Florian Müllner <fmuellner@redhat.com> - 40.3-2
+- Avoid a gjs warning
+ Resolves: #1990821
+
+* Mon Jul 12 2021 Florian Müllner <fmuellner@redhat.com> - 40.3-1
+- Update to 40.3
+ Resolves: #1979143
+- Fix some more JS warnings
+ Resolves: #1980414
+
+* Tue Jun 15 2021 Florian Müllner <fmuellner@redhat.com> - 40.2-1
+- Update to 40.2-1
+ Resolves: #1971432
+
+* Fri Jun 04 2021 Florian Müllner <fmuellner@redhat.com> - 40.1-5
+- Don't set CAP_SYS_NICE
+ Resolves: #1967973
+
+* Wed Jun 02 2021 Florian Müllner <fmuellner@redhat.com> - 40.1-4
+- Fix regression in AuthList rebase
+ Resolves: #1966841
+
+* Thu May 27 2021 Florian Müllner <fmuellner@redhat.com> - 40.1-3
+- Update generated stylesheets
+ Resolves: #1965327
+
+* Wed May 19 2021 Florian Müllner <fmuellner@redhat.com> - 40.1-2
+- Re-apply RHEL8 downstream patches that are still valid
+ Resolves: #1949133
+
+* Fri May 14 2021 Florian Müllner <fmuellner@redhat.com> - 40.1-1
+- Update to 40.1
+ Resolves: #1951132
+
+* Fri Apr 30 2021 Kalev Lember <klember@redhat.com> - 40.0-4
+- Move gnome-tour dep here from gnome-initial-setup (#1955179)
+
+* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 40.0-3
+- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
+
+* Tue Apr 13 2021 Ray Strode <rstrode@redhat.com> - 40.0-2
+- Fix timed login when user list is disabled
+ Resolves: #1940618
+
+* Sat Mar 20 2021 Florian Müllner <fmuellner@redhat.com> - 40.0-1
+- Update to 40.0
+
+* Mon Mar 15 2021 Florian Müllner <fmuellner@redhat.com> - 40.0~rc-1
+- Update to 40.rc
+
+* Thu Mar 11 2021 Kalev Lember <klember@redhat.com> - 40.0~beta-4.20210304git7a57528bd
+- Recommend gnome-session-xsession rather than hard-require it
+
+* Mon Mar 08 2021 Florian Müllner <fmuellner@redhat.com> - 40.0~beta-3.20210304git40.7a57528bd
+- Fix crash after launching apps via drag-and-drop
+
+* Thu Mar 04 2021 Florian Müllner <fmuellner@redhat.com> - 40.0~beta-2.20210304git40.7a57528bd
+- Build snapshot of current upstream
+
+* Tue Feb 23 2021 Florian Müllner <fmuellner@redhat.com> - 40.0~beta-1
+- Update to 40.beta
+
+* Mon Feb 22 2021 Kalev Lember <klember@redhat.com> - 40.0~alpha.1.1-9.20210212git829a096ba
+- Add missing requires on gstreamer1-plugins-good and xdg-user-dirs-gtk (#1931342)
+
+* Sun Feb 14 2021 Florian Müllner <fmuellner@redhat.com> - 40.0~alpha.1.1-8.20210212git829a096ba
+- Only open app picker on left-click/touch
+
+* Sun Feb 14 2021 Florian Müllner <fmuellner@redhat.com> - 40.0~alpha.1.1-7.20210212git829a096ba
+- Don't open app picker when clicking minimap
+
+* Fri Feb 12 2021 Florian Müllner <fmuellner@redhat.com> - 40.0~alpha.1.1-6.20210212git829a096ba
+- Update snapshot to current upstream
+- Allow opening app picker by clicking overview background
+
+* Fri Feb 12 2021 Milan Crha <mcrha@redhat.com> - 40.0~alpha.1.1-5.20210202git9ce666ac1
+- Rebuilt for evolution-data-server soname version bump
+
+* Tue Feb 02 2021 Florian Müllner <fmuellner@redhat.com> - 40.0~alpha.1.1-4.20210202git9ce666ac1
+- Build snapshot of current upstream
+
+* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 40.0~alpha.1.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Tue Jan 19 2021 Kalev Lember <klember@redhat.com> - 40.0~alpha.1.1-2
+- Require libgweather >= 40~alpha for new application_id property
+
+* Mon Jan 18 2021 Florian Müllner <fmuellner@redhat.com> - 40.alpha.1.1-1
+- Update to 40.alpha.1.1
+
+* Fri Jan 15 2021 Florian Müllner <fmuellner@redhat.com> - 40.alpha.1-1
+- Update to 40.alpha.1
+
+* Wed Dec 02 2020 Florian Müllner <fmuellner@redhat.com> - 40.alpha-1
+- Update to 40.alpha
+
+* Tue Oct 13 2020 Florian Müllner <fmuellner@redhat.com> - 3.38.1-2
+- Fix crash on size change (non-)transitions
+
+* Mon Oct 05 2020 Florian Müllner <fmuellner@redhat.com> - 3.38.1-1
+- Update to 3.38.1
+
+* Tue Sep 29 2020 David King <amigadave@amigadave.com> - 3.38.0-2
+- Better specify xdg-desktop-portal-gtk dependency (#1882894)
+
+* Mon Sep 14 2020 Florian Müllner <fmuellner@redhat.com> - 3.38.0-1
+- Update to 3.38.0
+
+* Thu Sep 10 2020 Kalev Lember <klember@redhat.com> - 3.37.92-5
+- Set minimum gnome-settings-daemon version for Screencast proxy changes
+
+* Wed Sep 09 2020 Kalev Lember <klember@redhat.com> - 3.37.92-4
+- Add missing pipewire-gstreamer dependency for screen recorder
+
+* Sun Sep 06 2020 Florian Müllner <fmuellner@redhat.com> - 3.37.92-1
+- Update to 3.37.92
+
+* Wed Sep 02 2020 Florian Müllner <fmuellner@redhat.com> - 3.37.91-3
+- Add missing pipewire dependency for screen recorder
+
+* Wed Aug 26 2020 Kalev Lember <klember@redhat.com> - 3.37.91-2
+- Add PolicyKit-authentication-agent virtual provides
+
+* Mon Aug 24 2020 Florian Müllner <fmuellner@redhat.com> - 3.37.91-1
+- Update to 3.37.91
+
+* Sun Aug 23 2020 Kalev Lember <klember@redhat.com> - 3.37.90-2
+- Backport a fix for launching apps under X11 (#1870234)
+
+* Fri Aug 14 2020 Florian Müllner <fmuellner@redhat.com> - 3.37.90-1
+- Update to 3.37.90
+
+* Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.37.3-4
+- Second attempt - Rebuilt for
+ https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.37.3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Mon Jul 13 2020 Milan Crha <mcrha@redhat.com> - 3.37.3-2
+- Rebuilt for evolution-data-server soname version bump
+
+* Tue Jul 07 2020 Florian Müllner <fmuellner@redhat.com> - 3.37.3-1
+- Update to 3.37.3
+
+* Fri Jul 03 2020 Milan Crha <mcrha@redhat.com> - 3.37.2-2
+- Rebuilt for evolution-data-server soname version bump
+
+* Wed Jun 03 2020 Florian Müllner <fmuellner@redhat.com> - 3.37.2-1
+- Update to 3.37.2
+
+* Wed May 20 2020 Stephen Gallagher <sgallagh@redhat.com> - 3.37.1-3
+- Fix crashes when locking the screen while certain extensions are active
+- Resolves: rhbz#1817082
+
+* Mon May 04 2020 Adam Williamson <awilliam@redhat.com> - 3.37.1-2
+- Fix panel to show input methods (MR #1235)
+
+* Thu Apr 30 2020 Florian Müllner <fmuellner@redhat.com - 3.37.1-1
+- Update to 3.37.1
+
+* Tue Mar 31 2020 Florian Müllner <fmuellner@redhat.com - 3.36.1-2
+- Remove obsolete libcroco require
+
+* Tue Mar 31 2020 Jonas Ådahl <jadahl@redhat.com> - 3.36.1-2
+- Backport fixup for spring animation fix
+
+* Tue Mar 31 2020 Florian Müllner <fmuellner@redhat.com> - 3.36.1-1
+- Update to 3.36.1
+- Remove gnome-extensions-app subpackage (will move to a separate .spec)
+
+* Wed Mar 25 2020 Ray Strode <rstrode@redhat.com> - 3.36.0-4
+- Clear environment on logout
+ Fixes log in to Xorg right after log out from wayland
+ Resolves: #1815487
+
+* Wed Mar 11 2020 Adam Williamson <awilliam@redhat.com> - 3.36.0-3
+- Backport fix for input method preedit issue (MR #1084)
+
+* Tue Mar 10 2020 Adam Williamson <awilliam@redhat.com> - 3.36.0-2
+- Backport fix for ibus failing to start automatically (MR #1080)
+
+* Sat Mar 07 2020 Florian Müllner <fmuellner@redhat.com> - 3.36.0-1
+- Update to 3.36.0
+
+* Sun Mar 01 2020 Florian Müllner <fmuellner@redhat.com> - 3.35.92-1
+- Update to 3.35.92
+
+* Tue Feb 18 2020 Florian Müllner <fmuellner@redhat.com> - 3.35.91-1
+- Update to 3.35.91
+
+* Fri Feb 07 2020 Kalev Lember <klember@redhat.com> - 3.35.90-2
+- Adjust the favorites patch to include the apps we install by default
+
+* Thu Feb 06 2020 Florian Müllner <fmuellner@redhat.com> - 3.35.90-1
+- Update to 3.35.90
+
+* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.35.3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Thu Jan 16 2020 Kalev Lember <klember@redhat.com> - 3.35.3-2
+- Rebuilt for libgnome-desktop soname bump
+
+* Sun Jan 05 2020 Florian Müllner <fmuellner@redhat.com> - 3.35.3-2
+- Update to 3.35.3
+
+* Wed Dec 11 2019 Florian Müllner <fmuellner@redhat.com> - 3.35.2-1
+- Udpate to 3.35.2
+
+* Sat Oct 12 2019 Florian Müllner <fmuellner@redhat.com> - 3.35.1-1
+- Update to 3.35.1
+
+* Sat Oct 12 2019 Adam Williamson <awilliam@redhat.com> - 3.34.1-2
+- Backport MR #754 to fix #1749433
+
+* Wed Oct 09 2019 Florian Müllner <fmuellner@redhat.com> - 3.34.1-1
+- Update to 3.34.1
+
+* Tue Sep 24 2019 Debarshi Ray <rishi@fedorapeople.org> - 3.34.0-3
+- Stop NOTIFY_SOCKET from leaking into the GNOME environment
+
+* Fri Sep 20 2019 Florian Müllner <fmuellner@redhat.com> - 3.34.0-2
+- Fix disappearing icons in frequent view
+
+* Mon Sep 09 2019 Florian Müllner <fmuellner@redhat.com> - 3.34.0-1
+- Update to 3.34.0
+
+* Thu Sep 05 2019 Kalev Lember <klember@redhat.com> - 3.33.92-1
+- Update to 3.33.92
+
+* Mon Aug 26 2019 Kalev Lember <klember@redhat.com> - 3.33.91-1
+- Update to 3.33.91
+
+* Fri Aug 23 2019 Adam Williamson <awilliam@redhat.com> - 3.33.90-2
+- Revert commit that causes #1740897 (overview type-to-search bug)
+ Resolves: #1740897
+
+* Sat Aug 10 2019 Florian Müllner <fmuellner@redhat.com> - 3.33.90-1
+- Update to 3.33.90
+
+* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.33.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Sat Jul 20 2019 Florian Müllner <fmuellner@redhat.com> - 3.33.4-1
+- Update to 3.33.4
+
+* Mon Jun 24 2019 Florian Mülllner <fmuellner@redhat.com> - 3.33.3-1
+- Update to 3.33.3
+
+* Wed May 22 2019 Florian Müllner <fmuellner@redhat.com> - 3.33.2-1
+- Update to 3.33.2
+
+* Wed May 22 2019 Kalev Lember <klember@redhat.com> - 3.33.1-2
+- Rebuild for libecal-2.0
+
+* Tue May 14 2019 Florian Müllner <fmuellner@redhat.com> - 3.33.1-1
+- Update to 3.33.1
+
+* Wed Apr 17 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.1-1
+- Update to 3.32.1
+
+* Wed Apr 17 2019 Adam Williamson <awilliam@redhat.com> - 3.32.0-3
+- Backport MR #463 and MR #494 to fix a couple of bugs
+ Resolves: #1696270
+ Resolves: #1690429
+
+* Sat Mar 23 2019 Phil Wyett <philwyett@kathenas.org> - 3.32.0-2
+- Update source URL
+- Add gcc BuildRequires
+- Update versions required for gjs and mutter
+
+* Tue Mar 12 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.0-1
+- Update to 3.32.0
+
+* Tue Mar 05 2019 Florian Müllner <fmuellner@redhat.com> - 3.31.92-1
+- Update to 3.31.92
+
+* Thu Feb 21 2019 Florian Müllner <fmuellner@redhat.com> - 3.31.91-1
+- Update to 3.31.91
+
+* Mon Feb 11 2019 Adam Williamson <awilliam@redhat.com> - 3.31.90-2
+- Backport MR #402 to fix missing logo on login screen
+
+* Thu Feb 07 2019 Florian Müllner <fmuellner@redhat.com> - 3.31.90-1
+- Update to 3.31.90
+
+* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.31.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Thu Jan 10 2019 Florian Müllner <fmuellner@redhat.com> - 3.31.4-1
+- Update to 3.31.4
+
+* Fri Dec 14 2018 Adam Williamson <awilliam@redhat.com> - 3.31.2-3
+- Backport several bugfix commits from current git master
+
+* Fri Nov 30 2018 Adam Williamson <awilliam@redhat.com> - 3.31.2-2
+- Backport PR #293 to fix 'empty input method indicator' bug
+
+* Wed Nov 14 2018 Florian Müllner <fmuellner@redhat.com> - 3.31.2-1
+- Update to 3.31.2
+
+* Mon Nov 12 2018 Mohan Boddu <mboddu@bhujji.com> - 3.30.1-3
+- Rebuilt for evolution-data-server soname bump
+
+* Tue Oct 23 2018 Jonas Ådahl <jadahl@redhat.com> - 3.30.1-2
+- Backport keyboard layout change fixes (rhbz#1637418)
+
+* Mon Oct 08 2018 Florian Müllner <fmuellner@redhat.com> - 3.30.1-1
+- Update to 3.30.1
+
+* Thu Sep 27 2018 Hans de Goede <hdegoede@redhat.com> - 3.30.0-9
+- Add downstream patches implementing the "Boot Options" menu from:
+ https://wiki.gnome.org/Design/OS/BootOptions
+
+* Sat Sep 22 2018 Adam Williamson <awilliam@redhat.com> - 3.30.0-8
+- Backport fix for IBus type issue (GGO MR #228)
+
+* Wed Sep 19 2018 Adam Williamson <awilliam@redhat.com> - 3.30.0-7
+- Replace dnd fix from -5 with upstream version (GGO MR #209)
+- Fix a window destroy crash which can occur with new gjs (GGO #539)
+- Fix a window menu issue on multi-monitor systems (GGO MR #227)
+- Fix hover and active states for some buttons (GGO #523)
+
+* Wed Sep 19 2018 Adam Williamson <awilliam@redhat.com> - 3.30.0-6
+- Fix missing key description in ssh key unlock prompt (GGO #574)
+
+* Wed Sep 19 2018 Ray Strode <rstrode@redhat.com> - 3.30.0-5
+- Fix lock up when dropping icon on dash
+ Resolves: #1630134
+
+* Tue Sep 18 2018 Adam Williamson <awilliam@redhat.com> - 3.30.0-4
+- Fix connecting to wifi from user menu (RHBZ #1628263)
+
+* Sat Sep 15 2018 Adam Williamson <awilliam@redhat.com> - 3.30.0-3
+- Backport fix for GGO #140 from upstream master
+
+* Thu Sep 13 2018 Kalev Lember <klember@redhat.com> - 3.30.0-2
+- Require xdg-desktop-portal-gtk
+
+* Tue Sep 04 2018 Florian Müllner <fmuellner@redhat.com> - 3.30.0-1
+- Update to 3.30.0
+
+* Wed Aug 29 2018 Florian Müllner <fmuellner@redhat.com> - 3.29.92-1
+- Update to 3.29.92
+
+* Mon Aug 20 2018 Florian Müllner <fmuellner@redhat.com> - 3.29.91-1
+- Update to 3.29.91
+
+* Thu Aug 09 2018 Debarshi Ray <rishi@fedoraproject.org> - 3.29.90-2
+- Remove telepathy-logger and telepathy-glib runtime dependencies
+
+* Wed Aug 01 2018 Florian Müllner <fmuellner@redhat.com> - 3.29.90-1
+- Update to 3.29.90
+
+* Wed Jul 18 2018 Florian Müllner <fmuellner@redhat.com> - 3.29.4-1
+- Update to 3.29.4
+
+* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.29.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Thu May 24 2018 Florian Müllner <fmuellner@redhat.com> - 3.29.2-1
+- Update to 3.29.2
+
+* Wed May 09 2018 Florian Müllner <fmuellner@redhat.com> - 3.29.1-3
+- Fix automatic connection to wireless networks without stored secrets
+
+* Sun Apr 29 2018 Adam Williamson <awilliam@redhat.com> - 3.29.1-2
+- Backport fix for password entry modifier key issues (#1569211)
+
+* Wed Apr 25 2018 Florian Müllner <fmuellner@redhat.com> - 3.29.1-1
+- Update to 3.29.1
+
+* Tue Apr 24 2018 Ray Strode <rstrode@redhat.com> - 3.28.1-2
+- pull polkit cancel lock up from upstream
+ Resolves: #1568213
+
+* Fri Apr 13 2018 Florian Müllner <fmuellner@redhat.com> - 3.28.1-1
+- Update to 3.28.1
+
+* Mon Mar 12 2018 Florian Müllner <fmuellner@redhat.com> - 3.28.0-1
+- Update to 3.28.0
+
+* Mon Mar 05 2018 Florian Müllner <fmuellner@redhat.com> - 3.27.92-1
+- Update to 3.27.92
+
+* Thu Feb 22 2018 Lubomir Rintel <lkundrak@v3.sk> - 3.27.91-2
+- Replace libnm-gtk with libnma
+
+* Wed Feb 21 2018 Florian Müllner <fmuellner@redhat.com> - 3.27.91-1
+- Update to 3.27.91
+
+* Wed Feb 07 2018 Kalev Lember <klember@redhat.com> - 3.27.1-5
+- Rebuilt for evolution-data-server soname bump
+
+* Mon Jan 22 2018 Adam Williamson <awilliam@redhat.com> - 3.27.1-4
+- Backport fix for crasher bug BGO #788931 (#1469129)
+
+* Tue Dec 19 2017 Kalev Lember <klember@redhat.com> - 3.27.1-3
+- Explicitly require libnm-gtk (#1509496)
+
+* Wed Nov 08 2017 Milan Crha <mcrha@redhat.com> - 3.27.1-2
+- Rebuild for newer libical
+
+* Tue Oct 17 2017 Florian Müllner <fmuellner@redhat.com> - 3.27.1-1
+- Update to 3.27.1
+
+* Wed Oct 04 2017 Florian Müllner <fmuellner@redhat.com> - 3.26.1-1
+- Update to 3.26.1
+
+* Thu Sep 21 2017 Florian Müllner <fmuellner@redhat.com> - 3.26.0-2
+- Fix crash on fast status icon remapping
+
+* Tue Sep 12 2017 Florian Müllner <fmuellner@redhat.com> - 3.26.0-1
+- Update to 3.26.0
+
+* Tue Aug 22 2017 Florian Müllner <fmuellner@redhat.com> - 3.25.91-1
+- Update to 3.25.91
+
+* Fri Aug 11 2017 Kevin Fenzi <kevin@scrye.com> - 3.25.90-2
+- Rebuild with older working rpm
+
+* Thu Aug 10 2017 Florian Müllner <fmuellner@redhat.com> - 3.25.90-1
+- Update to 3.25.90
+
+* Wed Aug 02 2017 Fedora Release Engineering <releng@fedoraproject.org> - 3.25.4-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 3.25.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Thu Jul 20 2017 Florian Müllner <fmuellner@redhat.com> - 3.25.4-1
+- Update to 3.25.4
+
+* Wed Jun 21 2017 Florian Müllner <fmuellner@redhat.com> - 3.25.3-1
+- Update to 3.25.3
+
+* Thu May 25 2017 Florian Müllner <fmuellner@redhat.com> - 3.25.2-1
+- Update to 3.25.2
+
+* Thu Apr 27 2017 Florian Müllner <fmuellner@redhat.com> - 3.25.1-1
+- Update to 3.25.1
+
+* Tue Apr 11 2017 Florian Müllner <fmuellner@redhat.com> - 3.24.1-1
+- Update to 3.24.1
+
+* Mon Mar 20 2017 Florian Müllner <fmuellner@redhat.com> - 3.24.0-1
+- Update to 3.24.0
+
+* Thu Mar 16 2017 Igor Gnatenko <ignatenko@redhat.com> - 3.23.92-2
+- Fix wrong runtime requirements
+
+* Tue Mar 14 2017 Florian Müllner <fmuellner@redhat.com> - 3.23.92-1
+- Update to 3.23.92
+
+* Wed Mar 01 2017 Florian Müllner <fmuellner@redhat.com> - 3.23.91-1
+- Update to 3.23.91
+
+* Thu Feb 16 2017 Florian Müllner <fmuellner@redhat.com> - 3.23.90-1
+- Update to 3.23.90
+
+* Tue Feb 14 2017 Richard Hughes <rhughes@redhat.com> - 3.23.3-1
+- Update to 3.23.3
+
+* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 3.23.2-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Mon Dec 19 2016 Miro Hrončok <mhroncok@redhat.com> - 3.23.2-3
+- Rebuild for Python 3.6
+
+* Tue Dec 6 2016 Rui Matos <rmatos@redhat.com> - 3.23.2-2
+- Tighten mutter version dependency for plugin API changes
+ Resolves: #1401886
+
+* Wed Nov 23 2016 Florian Müllner <fmuellner@redhat.com> - 3.23.2-1
+- Update to 3.23.2
+
+* Sun Oct 30 2016 Florian Müllner <fmuellner@redhat.com> - 3.23.1-1
+- Update to 3.23.1
+
+* Fri Oct 21 2016 Bastien Nocera <bnocera@redhat.com> - 3.22.1-2
+- Add patches to allow launching on discrete GPU when available
+
+* Tue Oct 11 2016 Florian Müllner <fmuellner@redhat.com> - 3.22.1
+- Update to 3.22.1
+
+* Mon Sep 19 2016 Florian Müllner <fmuellner@redhat.com> - 3.22.0
+- Update to 3.22.0
+
+* Tue Sep 13 2016 Florian Müllner <fmuellner@redhat.com> - 3.21.92
+- Update to 3.21.92
+
+* Fri Sep 09 2016 Kalev Lember <klember@redhat.com> - 3.21.91-2
+- Drop libgsystem dependency
+
+* Tue Aug 30 2016 Florian Müllner <fmuellner@redhat.com> - 3.21.91
+- Update to 3.21.91
+
+* Sat Aug 20 2016 Florian Müllner <fmuellner@redhat.com> - 3.21.90.1-1
+- Update to 3.21.90.1
+ (Fixes a corrupt .desktop file that made it from the build directory into
+ the 3.21.90 tarball)
+
+* Fri Aug 19 2016 Florian Müllner <fmuellner@redhat.com> - 3.21.90-1
+- Update to 3.21.90
+
+* Wed Jul 20 2016 Florian Müllner <fmuellner@redhat.com> - 3.21.4-1
+- Update to 3.21.4
+
+* Mon Jul 18 2016 Milan Crha <mcrha@redhat.com> - 3.21.3-2
+- Rebuild for newer evolution-data-server
+
+* Tue Jun 21 2016 Florian Müllner <fmuellner@redhat.com> - 3.21.3-1
+- Update to 3.21.3
+
+* Tue Jun 21 2016 Milan Crha <mcrha@redhat.com> - 3.21.2-2
+- Rebuild for newer evolution-data-server
+
+* Thu May 26 2016 Florian Müllner <fmuellner@redhat.com> - 3.21.2-1
+- Update to 3.21.2
+
+* Fri Apr 29 2016 Florian Müllner <fmuellner@redhat.com> - 3.21.1-1
+- Update to 3.21.1
+
+* Fri Apr 15 2016 David Tardon <dtardon@redhat.com> - 3.20.1-2
+- rebuild for ICU 57.1
+
+* Wed Apr 13 2016 Florian Müllner <fmuellner@redhat.com> - 3.20.1-1
+- Update to 3.20.1
+
+* Tue Mar 22 2016 Florian Müllner <fmuellner@redhat.com> - 3.20.0-1
+- Update to 3.20.0
+
+* Wed Mar 16 2016 Florian Müllner <fmuellner@redhat.com> - 3.19.92-1
+- Update to 3.19.92
+
+* Thu Mar 03 2016 Florian Müllner <fmuellner@redhat.com> - 3.19.91-1
+- Update to 3.19.91
+
+* Fri Feb 19 2016 Florian Müllner <fmuellner@redhat.com> - 3.19.90-1
+- Update to 3.19.90
+
+* Tue Feb 16 2016 Milan Crha <mcrha@redhat.com> - 3.19.4-3
+- Rebuild for newer evolution-data-server
+
+* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 3.19.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Thu Jan 21 2016 Florian Müllner <fmuellner@redhat.com> - 3.19.4-1
+- Update to 3.19.4
+
+* Mon Jan 18 2016 David Tardon <dtardon@redhat.com> - 3.19.3-2
+- rebuild for libical 2.0.0
+
+* Thu Dec 17 2015 Florian Müllner <fmuellner@redhat.com> - 3.19.3-1
+- Update to 3.19.3
+
+* Tue Dec 01 2015 Kalev Lember <klember@redhat.com> - 3.19.2-2
+- Bump gsettings-desktop-schemas dep to 3.19.2
+
+* Wed Nov 25 2015 Florian Müllner <fmuellner@redhat.com> - 3.19.2-1
+- Update to 3.19.2
+
+* Tue Nov 10 2015 Ray Strode <rstrode@redhat.com> 3.19.1-3.20151110
+- Update to git snapshot
+
+* Sun Nov 01 2015 Kalev Lember <klember@redhat.com> - 3.19.1-2
+- Fix gnome-shell crashing in gdm mode (#1276833)
+
+* Thu Oct 29 2015 Florian Müllner <fmuellner@redhat.com> - 3.19.1-1
+- Update to 3.19.1
+
+* Thu Oct 15 2015 Florian Müllner <fmuellner@redhat.com> - 3.18.1-1
+- Update to 3.18.1
+
+* Mon Sep 21 2015 Florian Müllner <fmuellner@redhat.com> - 3.18.0-1
+- Update to 3.18.0
+
+* Wed Sep 16 2015 Florian Müllner <fmuellner@redhat.com> - 3.17.92-1
+- Update to 3.17.92
+
+* Thu Sep 03 2015 Florian Müllner <fmuellner@redhat.com> - 3.17.91-1
+- Update to 3.17.91
+
+* Thu Aug 20 2015 Florian Müllner <fmuellner@redhat.com> - 3.17.90-1
+- Update to 3.17.90
+
+* Wed Aug 19 2015 Kalev Lember <klember@redhat.com> - 3.17.4-2
+- Create empty directories for extensions and search providers
+- Move desktop file validation to %%check section
+- Use make_install macro
+
+* Thu Jul 23 2015 Florian Müllner <fmuellner@redhat.com> - 3.17.4-1
+- Update to 3.17.4
+
+* Wed Jul 22 2015 Milan Crha <mcrha@redhat.com> - 3.17.3-3
+- Rebuild for newer evolution-data-server
+
+* Sat Jul 04 2015 Kalev Lember <klember@redhat.com> - 3.17.3-2
+- Require gobject-introspection 1.45.3
+
+* Thu Jul 02 2015 Florian Müllner <fmuellner@redhat.com> - 3.17.3-1
+- Update to 3.17.3
+
+* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.17.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Wed May 27 2015 Florian Müllner <fmuellner@redhat.com> - 3.17.2-1
+- Update to 3.17.2
+
+* Thu Apr 30 2015 Florian Müllner <fmuellner@redhat.com> - 3.17.1-1
+- Update to 3.17.1
+
+* Tue Apr 28 2015 Milan Crha <mcrha@redhat.com> - 3.16.1-2
+- Rebuild for newer evolution-data-server
+
+* Tue Apr 14 2015 Florian Müllner <fmuellner@redhat.com> - 3.16.1-1
+- Update to 3.16.1
+
+* Mon Mar 23 2015 Florian Müllner <fmuellner@redhat.com> - 3.16.0-1
+- Update to 3.16.0
+
+* Tue Mar 17 2015 Kalev Lember <kalevlember@gmail.com> - 3.15.92-2
+- Update minimum dep versions
+- Use license macro for the COPYING file
+
+* Tue Mar 17 2015 Florian Müllner <fmuellner@redhat.com> - 3.15.92-1
+- Update to 3.15.92
+
+* Tue Mar 17 2015 Ray Strode <rstrode@redhat.com> 3.15.91-2
+- Drop dep on NetworkManager-config-connectivity-fedora
+ It's already required by fedora-release-workstation
+
+* Wed Mar 04 2015 Florian Müllner <fmuellner@redhat.com> - 3.15.91-1
+- Update to 3.15.91
+
+* Fri Feb 20 2015 Florian Müllner <fmuellner@redhat.com> - 3.15.90-1
+- Update to 3.15.90
+
+* Tue Feb 17 2015 Milan Crha <mcrha@redhat.com> - 3.15.4-2
+- Rebuild against newer evolution-data-server
+
+* Wed Jan 21 2015 Florian Müllner <fmuellner@redhat.com> - 3.15.4-1
+- Update to 3.15.4
+
+* Fri Dec 19 2014 Florian Müllner <fmuellner@redhat.com> - 3.15.3-1
+- Update to 3.15.3
+
+* Thu Nov 27 2014 Florian Müllner <fmuellner@redhat.com> - 3.15.2-1
+- Update to 3.15.2
+
+* Thu Oct 30 2014 Florian Müllner <fmuellner@redhat.com> - 3.15.1-1
+- Update to 3.15.1
+
+* Tue Oct 14 2014 Florian Müllner <fmuellner@redhat.com> - 3.14.1-1
+- Update to 3.14.1
+
+* Tue Sep 23 2014 Kalev Lember <kalevlember@gmail.com> - 3.14.0-2
+- Drop unused gnome-menus dependency
+
+* Mon Sep 22 2014 Florian Müllner <fmuellner@redhat.com> - 3.14.0-1
+- Update to 3.14.0
+
+* Wed Sep 17 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.92-1
+- Update to 3.13.92
+
+* Wed Sep 03 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.91-1
+- Update to 3.13.91
+
+* Wed Aug 20 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.90-1
+- Update to 3.13.90
+
+* Sat Aug 16 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.13.4-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Thu Jul 31 2014 Milan Crha <mcrha@redhat.com> - 3.13.4-3
+- Rebuild against newer evolution-data-server
+
+* Mon Jul 28 2014 Adel Gadllah <adel.gadllah@gmail.com> - 3.13.4-2
+- Require NetworkManager-config-connectivity-fedora
+
+* Wed Jul 23 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.4-1
+- Update to 3.13.4
+
+* Tue Jul 22 2014 Kalev Lember <kalevlember@gmail.com> - 3.13.3-2
+- Rebuilt for gobject-introspection 1.41.4
+
+* Fri Jun 27 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.3-1
+- New gobject-introspection has been built, drop the last patch again
+
+* Wed Jun 25 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.3-1
+- Revert annotation updates until we get a new gobject-introspection build
+
+* Wed Jun 25 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.3-1
+- Update to 3.13.3
+
+* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.13.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Tue May 27 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.2-1
+- Update to 3.13.2
+
+* Thu May 01 2014 Kalev Lember <kalevlember@gmail.com> - 3.13.1-2
+- Pull in libgsystem
+
+* Wed Apr 30 2014 Florian Müllner <fmuellner@redhat.com> - 3.13.1-1
+- Update to 3.13.1
+
+* Tue Apr 15 2014 Florian Müllner <fmuellner@redhat.com> - 3.12.1-1
+- Update to 3.12.1
+
+* Sat Apr 05 2014 Kalev Lember <kalevlember@gmail.com> - 3.12.0-2
+- Update dep versions
+
+* Tue Mar 25 2014 Florian Müllner <fmuellner@redhat.com> - 3.12.0-1
+- Update to 3.12.0
+
+* Wed Mar 19 2014 Florian Müllner <fmuellner@redhat.com> - 3.11.92-1
+- Update to 3.11.92
+
+* Wed Mar 12 2014 Adam Williamson <awilliam@redhat.com> - 3.11.91-2
+- update to final revision of background bug fix from upstream (BGO #722149)
+
+* Thu Mar 06 2014 Florian Müllner <fmuellner@redhat.com> - 3.11.91-1
+- Update to 3.11.91
+
+* Mon Mar 03 2014 Adam Williamson <awilliam@redhat.com> - 3.11.90-5
+- backport fixes to fix drag-and-drop workspace creation (BGO #724686)
+
+* Wed Feb 26 2014 Adam Williamson <awilliam@redhat.com> - 3.11.90-4
+- backport a couple of bugfixes from BGO for things that annoy me
+
+* Sat Feb 22 2014 Florian Müllner <fmuellner@redhat.com> - 3.11.90-3
+- Add dependency on gnome-control-center - several panels are referenced
+ by a number of menu items
+
+* Thu Feb 20 2014 Kalev Lember <kalevlember@gmail.com> - 3.11.90-2
+- Rebuilt for cogl soname bump
+
+* Thu Feb 20 2014 Florian Müllner <fmuellner@redhat.com> - 3.11.90-1
+- Update to 3.11.90
+
+* Mon Feb 10 2014 Peter Hutterer <peter.hutterer@redhat.com> - 3.11.5-3
+- Rebuild for libevdev soname bump
+
+* Wed Feb 05 2014 Adam Williamson <awilliam@redhat.com> - 3.11.5-2
+- build against new gjs (and hence mozjs24)
+
+* Wed Feb 05 2014 Richard Hughes <rhughes@redhat.com> - 3.11.5-1
+- Update to 3.11.5
+
+* Mon Feb 03 2014 Milan Crha <mcrha@redhat.com> - 3.11.4-2
+- Rebuild against newer evolution-data-server
+
+* Thu Jan 16 2014 Florian Müllner <fmuellner@redhat.com> - 3.11.4-1
+- Update to 3.11.4
+
+* Tue Jan 14 2014 Milan Crha <mcrha@redhat.com> - 3.11.3-2
+- Rebuild against newer evolution-data-server
+
+* Fri Dec 20 2013 Florian Müllner <fmuellner@redhat.com> - 3.11.3-1
+- Update to 3.11.3
+
+* Thu Nov 21 2013 Milan Crha <mcrha@redhat.com> - 3.11.2-3
+- Rebuild for new libical (RH bug #1023020)
+
+* Tue Nov 19 2013 Milan Crha <mcrha@redhat.com> - 3.11.2-2
+- Rebuild against newer evolution-data-server
+
+* Wed Nov 13 2013 Florian Müllner <fmuellner@redhat.com> - 3.11.2-1
+- Update to 3.11.2
+
+* Wed Oct 30 2013 Florian Müllner <fmuellner@redhat.com> - 3.11.1-1
+- Update to 3.11.1
+
+* Fri Oct 25 2013 Florian Müllner <fmuellner@redhat.com> - 3.10.1-2
+- Rebuild for new e-d-s
+
+* Tue Oct 15 2013 Florian Müllner <fmuellner@redhat.com> - 3.10.1-1
+- Update to 3.10.1
+
+* Wed Sep 25 2013 Kalev Lember <kalevlember@gmail.com> - 3.10.0.1-1
+- Update to 3.10.0.1
+
+* Tue Sep 24 2013 Florian Müllner <fmuellner@redhat.com> - 3.10.0-1
+- Update to 3.10.0
+
+* Wed Sep 18 2013 Matthias Clasen <mclasen@redhat.com> - 3.9.92-3
+- Build against mutter-wayland
+
+* Tue Sep 17 2013 Florian Müllner <fmuellner@redhat.com> - 3.9.92-1
+- Update to 3.9.92
+
+* Tue Sep 03 2013 Florian Müllner <fmuellner@redhat.com> - 3.9.91-1
+- Update to 3.9.91
+
+* Thu Aug 22 2013 Florian Müllner <fmuellner@redhat.com> - 3.9.90-1
+- Update to 3.9.90
+
+* Mon Aug 19 2013 Adam Williamson <awilliam@redhat.com> - 3.9.5-3
+- Rebuild for new e-d-s
+
+* Sat Aug 10 2013 Kalev Lember <kalevlember@gmail.com> - 3.9.5-2
+- Drop the bluez revert patch as we now have new enough gnome-bluetooth
+
+* Tue Jul 30 2013 Florian Müllner <fmuellner@redhat.com> - 3.9.5
+- Update to 3.9.5
+
+* Mon Jul 29 2013 Adam Williamson <awilliam@redhat.com> - 3.9.4-2
+- rebuild against updated evolution-data-server
+
+* Wed Jul 10 2013 Florian Müllner <fmuellner@redhat.com> - 3.9.4-1
+- Update to 3.9.4
+
+* Wed Jul 10 2013 Milan Crha <mcrha@redhat.com> - 3.9.3-3
+- Rebuild against newer evolution-data-server
+
+* Wed Jul 10 2013 Kalev Lember <kalevlember@gmail.com> - 3.9.3-2
+- Add a downstream patch to revert back to bluez 4
+
+* Tue Jun 18 2013 Florian Müllner <fmuellner@redhat.com> - 3.9.3-1
+- Update to 3.9.3
+
+* Tue May 28 2013 Florian Müllner <fmuellner@redhat.com> - 3.9.2-1
+- Update to 3.9.2
+
+* Sat May 25 2013 Rex Dieter <rdieter@fedoraproject.org> 3.9.1-3
+- rebuild (libical)
+
+* Wed May 01 2013 Kalev Lember <kalevlember@gmail.com> - 3.9.1-2
+- Add missing telepathy-logger runtime dep
+- Depend on gnome-session-xsession so that it gets pulled in for
+ typical GNOME installs
+
+* Wed May 01 2013 Florian Müllner <fmuellner@redhat.com> - 3.9.1-1
+- Update to 3.9.1
+
+* Tue Apr 16 2013 Florian Müllner <fmuellner@redhat.com> - 3.8.1-1
+- Update to 3.8.1
+
+* Thu Mar 28 2013 Adel Gadllah <adel.gadllah@gmail.com> - 3.8.0.1-2
+- Ship the perf tool
+
+* Wed Mar 27 2013 Ray Strode <rstrode@redhat.com> - 3.8.0.1-1
+- Update to 3.8.0.1
+
+* Tue Mar 26 2013 Florian Müllner <fmuellner@redhat.com> - 3.8.0-1
+- Update to 3.8.0
+
+* Tue Mar 19 2013 Florian Müllner <fmuellner@redhat.com> - 3.7.92-1
+- Update to 3.7.92
+
+* Tue Mar 05 2013 Florian Müllner <fmuellner@redhat.com> - 3.7.91-1
+- Update to 3.7.91
+
+* Wed Feb 20 2013 Florian Müllner <fmuellner@redhat.com> - 3.7.90-1
+- Update to 3.7.90
+
+* Wed Feb 06 2013 Kalev Lember <kalevlember@gmail.com> - 3.7.5-2
+- Rebuilt for libgcr soname bump
+
+* Wed Feb 06 2013 Florian Müllner <fmuellner@redhat.com> - 3.7.5-1
+- Update to 3.7.5
+
+* Fri Jan 25 2013 Peter Robinson <pbrobinson@fedoraproject.org> 3.7.4.1-2
+- Rebuild for new cogl
+
+* Thu Jan 17 2013 Florian Müllner <fmuellner@redhat.com> - 3.7.4.1-1
+- Update to 3.7.4.1
+
+* Tue Jan 15 2013 Florian Müllner <fmuellner@redhat.com> - 3.7.4-1
+- Update to 3.7.4
+
+* Wed Jan 09 2013 Richard Hughes <hughsient@gmail.com> - 3.7.3.1-1
+- Update to 3.7.3.1
+
+* Tue Dec 18 2012 Florian Müllner <fmuellner@redhat.com> 3.7.3-1
+- Update to 3.7.3
+
+* Mon Dec 17 2012 Adam Jackson <ajax@redhat.com> 3.7.2-3
+- Also don't mangle rpath on power
+
+* Mon Dec 10 2012 Adam Jackson <ajax@redhat.com> 3.7.2-2
+- Disable bluetooth on power
+
+* Mon Nov 19 2012 Florian Müllner <fmuellner@redhat.com> - 3.7.2-1
+- Update to 3.7.2
+
+* Tue Nov 13 2012 Dan Horák <dan[at]danny.cz> - 3.7.1-2
+- don't Require: gnome-bluetooth on s390(x)
+
+* Fri Nov 09 2012 Kalev Lember <kalevlember@gmail.com> - 3.7.1-1
+- Update to 3.7.1
+
+* Wed Oct 31 2012 Brian Pepple <bpepple@fedoraproject.org> - 3.6.1-5
+- Rebuild against latest telepathy-logger
+
+* Thu Oct 25 2012 Milan Crha <mcrha@redhat.com> - 3.6.1-4
+- Rebuild against newer evolution-data-server
+
+* Sat Oct 20 2012 Dan Horák <dan[at]danny.cz> - 3.6.1-3
+- explicit BR: control-center as it isn't brought in indirectly on s390(x)
+
+* Thu Oct 18 2012 Florian Müllner <fmuellner@redhat.com> - 3.6.1-2
+- Remove avoid-redhat-menus patch
+
+ The standard way of supporting a desktop-specific menu layout is
+ to set XDG_MENU_PREFIX (which we made gnome-session do now).
+
+* Mon Oct 15 2012 Florian Müllner <fmuellner@redhat.com> - 3.6.1-1
+- Update to 3.6.1
+
+* Tue Sep 25 2012 Florian Müllner <fmuellner@redhat.com> - 3.6.0-1
+- Update to 3.6.0
+
+* Wed Sep 19 2012 Florian Müllner <fmuellner@redhat.com> - 3.5.92-1
+- Update to 3.5.92
+
+* Tue Sep 11 2012 Florian Müllner <fmuellner@redhat.com> - 3.5.91-1
+- Update dependencies
+
+* Tue Sep 04 2012 Richard Hughes <hughsient@gmail.com> - 3.5.91-1
+- Update to 3.5.91
+
+* Tue Aug 28 2012 Matthias Clasen <mclasen@redhat.com> - 3.5.90-3
+- Rebuild against new cogl/clutter
+
+* Mon Aug 27 2012 Debarshi Ray <rishi@fedoraproject.org> - 3.5.90-2
+- Rebuild for new libcamel and synchronize gnome-bluetooth Requires with
+ BuildRequires.
+
+* Wed Aug 22 2012 Richard Hughes <hughsient@gmail.com> - 3.5.90-1
+- Update to 3.5.90
+
+* Tue Aug 14 2012 Debarshi Ray <rishi@fedoraproject.org> - 3.5.5-2
+- Add Requires: gnome-bluetooth >= 3.5.5
+
+* Mon Aug 13 2012 Debarshi Ray <rishi@fedoraproject.org> - 3.5.5-1
+- Update to 3.5.5
+
+* Fri Jul 27 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.5.4-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Sat Jul 21 2012 Kalev Lember <kalevlember@gmail.com> - 3.5.4-4
+- Tighten runtime requires
+
+* Thu Jul 19 2012 Matthias Clasen <mclasen@redhat.com> - 3.5.4-3
+- Add a gdm-libs dependency
+
+* Wed Jul 18 2012 Colin Walters <walters@verbum.org> - 3.5.4-2
+- Bump release
+
+* Wed Jul 18 2012 Ray Strode <rstrode@redhat.com> 3.5.4-1
+- Update to 3.5.4
+
+* Tue Jun 26 2012 Matthias Clasen <mclasen@redhat.com> - 3.5.3-2
+- Rebuild against new e-d-s
+
+* Tue Jun 26 2012 Matthias Clasen <mclasen@redhat.com> - 3.5.3-1
+- Update to 3.5.3
+
+* Thu Jun 07 2012 Richard Hughes <hughsient@gmail.com> - 3.5.2-2
+- Remove upstreamed patch
+
+* Thu Jun 07 2012 Richard Hughes <hughsient@gmail.com> - 3.5.2-1
+- Update to 3.5.2
+
+* Mon May 28 2012 Peter Robinson <pbrobinson@fedoraproject.org> - 3.4.1-6
+- Cherry pick F17 changes, bump build for new evo soname
+
+* Wed May 16 2012 Owen Taylor <otaylor@redhat.com> - 3.4.1-5
+- New version of unmount notification
+
+* Tue May 15 2012 Owen Taylor <otaylor@redhat.com> - 3.4.1-4
+- Add a patch to display a notification until it's safe to remove a drive (#819492)
+
+* Fri Apr 20 2012 Owen Taylor <otaylor@redhat.com> - 3.4.1-3
+- Add a patch from upstream to avoid a crash when Evolution is not installed (#814401)
+
+* Wed Apr 18 2012 Kalev Lember <kalevlember@gmail.com> - 3.4.1-2
+- Silence glib-compile-schemas scriplets
+
+* Wed Apr 18 2012 Kalev Lember <kalevlember@gmail.com> - 3.4.1-1
+- Update to 3.4.1
+
+* Thu Apr 5 2012 Owen Taylor <otaylor@redhat.com> - 3.4.0-2
+- Change gnome-shell-favourite-apps-firefox.patch to also patch the JS code
+ to handle the transition from mozilla-firefox.desktop to firefox.desktop.
+ (#808894, reported by Jonathan Kamens)
+
+* Tue Mar 27 2012 Richard Hughes <hughsient@gmail.com> - 3.4.0-1
+- Update to 3.4.0
+
+* Wed Mar 21 2012 Matthias Clasen <mclasen@redhat.com> - 3.3.92-1
+- Update to 3.3.92
+
+* Sat Mar 10 2012 Matthias Clasen <mclasen@redhat.com> - 3.3.90-2
+- Rebuild for new cogl
+
+* Sat Feb 25 2012 Matthias Clasen <mclasen@redhat.com> - 3.3.90-1
+- Update to 3.3.90
+
+* Thu Feb 9 2012 Matthias Clasen <mclasen@redhat.com> - 3.3.5-2
+- Depend on accountsservice-libs (#755112)
+
+* Tue Feb 7 2012 Matthias Clasen <mclasen@redhat.com> - 3.3.5-1
+- Update to 3.3.5
+
+* Fri Jan 20 2012 Matthias Clasen <mclasen@redhat.com> - 3.3.4-1
+- Update to 3.3.4
+
+* Thu Jan 19 2012 Matthias Clasen <mclasen@redhat.com> - 3.3.3-2
+- Rebuild for new cogl
+
+* Thu Jan 5 2012 Matthias Clasen <mclasen@redhat.com> - 3.3.3-1
+- Update to 3.3.3
+
+* Sun Nov 27 2011 Peter Robinson <pbrobinson@fedoraproject.org> - 3.3.2-2
+- Rebuild for new clutter and e-d-s
+
+* Wed Nov 23 2011 Matthias Clasen <mclasen@redhat.com> - 3.3.2-1
+- Update to 3.3.2
+
+* Wed Nov 09 2011 Kalev Lember <kalevlember@gmail.com> - 3.2.1-6
+- Adapt to firefox desktop file name change in F17
+
+* Thu Nov 03 2011 Adam Jackson <ajax@redhat.com> 3.2.1-5
+- Build with -Wno-error=disabled-declarations for the moment
+
+* Wed Nov 02 2011 Brian Pepple <bpepple@fedoraproject.org> - 3.2.1-4
+- Rebuld against tp-logger.
+
+* Sun Oct 30 2011 Bruno Wolff III <bruno@wolff.to> - 3.2.1-3
+- Rebuild for new evolution-data-server
+
+* Wed Oct 26 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.2.1-2
+- Rebuilt for glibc bug#747377
+
+* Wed Oct 19 2011 Matthias Clasen <mclasen@redhat.com> - 3.2.1-1
+- Update to 3.2.1
+
+* Wed Sep 28 2011 Ray Strode <rstrode@redhat.com> 3.2.0-2
+- rebuild
+
+* Mon Sep 26 2011 Owen Taylor <otaylor@redhat.com> - 3.2.0-1
+- Update to 3.2.0
+
+* Tue Sep 20 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.92-1
+- Update to 3.1.92
+
+* Fri Sep 16 2011 Kalev Lember <kalevlember@gmail.com> - 3.1.91.1-2
+- Tighten dependencies by specifying the required arch (#739130)
+
+* Wed Sep 14 2011 Owen Taylor <otaylor@redhat.com> - 3.1.91.1-1
+- Update to 3.1.91.1 (adds browser plugin)
+ Update Requires
+
+* Thu Sep 08 2011 Dan Horák <dan[at]danny.cz> - 3.1.91-3
+- workaround a chrpath issue on s390(x)
+
+* Wed Sep 07 2011 Kalev Lember <kalevlember@gmail.com> - 3.1.91-2
+- Replace Epiphany with Firefox in the default favourite apps
+
+* Wed Sep 7 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.91-1
+- Update to 3.1.91
+
+* Thu Sep 1 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.90.1-2
+- Require caribou
+
+* Wed Aug 31 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.90.1-1
+- Update to 3.1.90.1
+
+* Wed Aug 31 2011 Adam Williamson <awilliam@redhat.com> - 3.1.4-3.gite7b9933
+- rebuild against e-d-s
+
+* Fri Aug 19 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.4-2.gite7b9933
+- git snapshot that builds against gnome-menus 3.1.5
+
+* Thu Aug 18 2011 Matthew Barnes <mbarnes@redhat.com> - 3.1.5-1
+- Rebuild against newer eds libraries.
+
+* Wed Jul 27 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.4-1
+- Update to 3.1.4
+
+* Wed Jul 27 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.3-4
+- Rebuild
+
+* Tue Jul 26 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.3-3
+- Add necessary requires
+
+* Mon Jul 25 2011 Matthias Clasen <mclasen@redhat.com> - 3.1.3-2
+- Rebuild
+
+* Tue Jul 5 2011 Peter Robinson <pbrobinson@fedoraproject.org> - 3.1.3-1
+- Upstream 3.1.3 dev release
+
+* Mon Jun 27 2011 Adam Williamson <awilliam@redhat.com> - 3.0.2-4
+- add fixes from f15 branch (gjs dep and rpath)
+
+* Wed Jun 22 2011 Owen Taylor <otaylor@redhat.com> - 3.0.2-3
+- Add a patch from upstream to avoid g_file_get_contents()
+
+* Fri Jun 17 2011 Tomas Bzatek <tbzatek@redhat.com> - 3.0.2-2
+- Rebuilt for new gtk3 and gnome-desktop3
+
+* Wed May 25 2011 Owen Taylor <otaylor@redhat.com> - 3.0.2-1
+- Update to 3.0.2
+
+* Tue May 10 2011 Dan Williams <dcbw@redhat.com> - 3.0.1-4
+- Fix initial connections to WPA Enterprise access points (#699014)
+- Fix initial connections to mobile broadband networks
+
+* Thu Apr 28 2011 Dan Horák <dan[at]danny.cz> - 3.0.1-3
+- no bluetooth on s390(x)
+
+* Wed Apr 27 2011 Owen Taylor <otaylor@redhat.com> - 3.0.1-2
+- Add a patch from upstream to fix duplicate applications in application display
+
+* Mon Apr 25 2011 Owen Taylor <otaylor@redhat.com> - 3.0.1-1
+- Update to 3.0.1
+
+* Mon Apr 11 2011 Colin Walters <walters@verbum.org> - 3.0.0.2-2
+- We want to use the GNOME menus which has the designed categories,
+ not the legacy redhat-menus.
+
+* Fri Apr 08 2011 Nils Philippsen <nils@redhat.com> - 3.0.0.2-1
+- Update to 3.0.0.2 (fixes missing import that was preventing extensions from
+ loading.)
+- Update source URL
+
+* Tue Apr 5 2011 Owen Taylor <otaylor@redhat.com> - 3.0.0.1-1
+- Update to 3.0.0.1 (fixes bug where network menu could leave
+ Clutter event handling stuck.)
+
+* Mon Apr 4 2011 Owen Taylor <otaylor@redhat.com> - 3.0.0-1
+- Update to 3.0.0
+
+* Tue Mar 29 2011 Brian Pepple <bpepple@fedoraproject.org> - 2.91.93-3
+- Bump
+
+* Tue Mar 29 2011 Brian Pepple <bpepple@fedoraproject.org> - 2.91.93-2
+- Rebuild for new tp-logger
+
+* Mon Mar 28 2011 Owen Taylor <otaylor@redhat.com> - 2.91.93-1
+- Update to 2.91.93.
+
+* Fri Mar 25 2011 Ray Strode <rstrode@redhat.com> 2.91.92-3
+- Adjustments for More nm-client api changes.
+- Fix VPN indicator
+
+* Thu Mar 24 2011 Christopher Aillon <caillon@redhat.com> - 2.91.92-2
+- Make activating vpn connections work from the shell indicator
+
+* Wed Mar 23 2011 Matthias Clasen <mclasen@redhat.com> - 2.91.92-1
+- Update to 2.91.92
+
+* Wed Mar 16 2011 Michel Salim <salimma@fedoraproject.org> - 2.91.91-2
+- Fix alt-tab behavior on when primary display is not leftmost (# 683932)
+
+* Tue Mar 8 2011 Owen Taylor <otaylor@redhat.com> - 2.91.91-1
+- Update to 2.91.91
+
+* Tue Feb 22 2011 Matthias Clasen <mclasen@redhat.com> - 2.91.90-2
+- Require upower and polkit at runtime
+
+* Tue Feb 22 2011 Matthias Clasen <mclasen@redhat.com> - 2.91.90-1
+- Update to 2.91.90
+
+* Thu Feb 10 2011 Matthias Clasen <mclasen@redhat.com> - 2.91.6-6
+- Rebuild against newer gtk
+
+* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.91.6-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Thu Feb 3 2011 Bill Nottingham <notting@redhat.com> - 2.91.6-4
+- buildrequire gnome-bluetooth to fix bluetooth status icon (#674874)
+
+* Wed Feb 2 2011 Matthias Clasen <mclasen@redhat.com> - 2.91.6-3
+- Rebuild against newer gtk
+
+* Tue Feb 1 2011 Owen Taylor <otaylor@redhat.com> - 2.91.6-2
+- Build-requires evolution-data-server-devel
+
+* Tue Feb 1 2011 Owen Taylor <otaylor@redhat.com> - 2.91.6-1
+- Update to 2.91.6
+
+* Thu Jan 13 2011 Mattihas Clasen <mclasen@redhat.com> - 2.91.5-3
+- Drop desktop-effects dependency
+
+* Wed Jan 12 2011 Colin Walters <walters@verbum.org> - 2.91.5-2
+- BR latest g-i, handles flags as arguments better
+
+* Tue Jan 11 2011 Matthias Clasen <mclasen@redhat.com> - 2.91.5-1
+- Update to 2.91.5
+
+* Sat Jan 8 2011 Matthias Clasen <mclasen@redhat.com> - 2.91.4-1
+- Update to 2.91.4
+- Rebuild against new gtk
+
+* Fri Dec 3 2010 Matthias Clasen <mclasen@redhat.com> - 2.91.3-2
+- Rebuild aginst new gtk
+
+* Mon Nov 29 2010 Owen Taylor <otaylor@redhat.com> - 2.91.2-1
+- Update to 2.91.3
+
+* Thu Nov 18 2010 Owen Taylor <otaylor@redhat.com> - 2.91.2-3
+- Add another memory-management crasher fix from upstream
+
+* Mon Nov 15 2010 Owen Taylor <otaylor@redhat.com> - 2.91.2-2
+- Add a patch from upstream fixing a memory-management crasher
+
+* Tue Nov 9 2010 Owen Taylor <otaylor@redhat.com> - 2.91.2-1
+- Update to 2.91.2
+
+* Mon Nov 1 2010 Owen Taylor <otaylor@redhat.com> - 2.91.1-1
+- Update to 2.91.1
+- Add libcroco-devel to BuildRequires, apparently it was getting
+ pulled in indirectly before
+- Add libcanberra-devel and pulseaudio-libs-devel BuildRequires
+
+* Mon Oct 4 2010 Owen Taylor <otaylor@redhat.com> - 2.91.0-1
+- Update to 2.91.0
+- Remove patch to disable VBlank syncing
+
+* Thu Aug 12 2010 Colin Walters <walters@verbum.org> - 2.31.5-7
+- Add patch to disable vblank syncing
+
+* Tue Jul 13 2010 Colin Walters <walters@verbum.org> - 2.31.5-5
+- Run glib-compile-schemas
+
+* Tue Jul 13 2010 Colin Walters <walters@megatron> - 2.31.5-4
+- Bless stuff in files section
+
+* Tue Jul 13 2010 Colin Walters <walters@verbum.org> - 2.31.5-3
+- Axe gnome-desktop-devel
+
+* Tue Jul 13 2010 Adel Gadllah <adel.gadllah@gmail.com> - 2.31.5-2
+- BuildRequire gnome-desktop3-devel, gtk3
+
+* Mon Jul 12 2010 Colin Walters <walters@verbum.org> - 2.31.5-1
+- New upstream version
+- Drop rpath goop, shouldn't be necessary any more
+
+* Fri Jun 25 2010 Colin Walters <walters@megatron> - 2.31.2-3
+- Drop gir-repository-devel build dependency
+
+* Fri May 28 2010 Adam Miller <maxamillion@fedoraproject.org> - 2.31.2-2
+- Added new version requirements for dependencies based on upstream releases
+- Added new file listings for gnome-shell-clock-preferences binary and .desktop
+- Added gnome-shell man page file listing
+
+* Wed May 26 2010 Adam Miller <maxamillion@fedoraproject.org> - 2.31.2-1
+- New upstream release
+
+* Fri Mar 26 2010 Colin Walters <walters@verbum.org> - 2.29.1-3
+- Specify V=1 for build, readd smp_mflags since parallel is fixed upstream
+
+* Thu Mar 25 2010 Adam Miller <maxamillion@fedoraproject.org> - 2.29.1-2
+- Bumped for new version of mutter and clutter
+- Added version requirement to gjs-devel because of dependency of build
+
+* Wed Mar 24 2010 Adam Miller <maxamillion@fedoraproject.org> - 2.29.1-1
+- Update to latest version 2.29.1
+
+* Sun Feb 21 2010 Bastien Nocera <bnocera@redhat.com> 2.28.1-0.2.20100128git
+- Require json-glib
+- Rebuild for new clutter with json split out
+- Fix deprecation in COGL
+
+* Thu Jan 28 2010 Adam Miller <maxamillion@fedoraproject.org> - 2.28.1-0.1.20100128git
+- New git snapshot
+- Fixed Version for alphatag use
+
+* Fri Jan 15 2010 Adam Miller <maxamillion@fedoraproject.org> - 2.28.0.20101015git-1
+- Added dependency on a git build of gobject-introspect to solve some breakage
+- Also went ahead and made a new git tarball
+
+* Tue Jan 12 2010 Adam Miller <maxamillion@fedoraproject.org> - 2.28.0.20100112git-1
+- New git snapshot
+
+* Mon Dec 07 2009 Adam Miller <maxamillion@fedoraproject.org> - 2.28.0.20091206git-5
+- Added libtool, glib-gettext for the libtoolize dep of git snapshot
+
+* Mon Dec 07 2009 Adam Miller <maxamillion@fedoraproject.org> - 2.28.0.20091206git-4
+- Added gnome-common needed by autogen.sh in git snapshot build
+
+* Sun Dec 06 2009 Adam Miller <maxamillion@fedoraproject.org> - 2.28.0.20091206git-3
+- Added the autotools needed to build the git snapshot to the build requires
+
+* Sun Dec 06 2009 Adam Miller <maxamillion@fedoraproject.org> - 2.28.0.20091206git-2
+- Fixed the setup naming issue with the git snapshot directory naming
+
+* Sun Dec 06 2009 Adam Miller <maxamillion@fedoraproject.org> - 2.28.0.20091206git-1
+- Update to git snapshot on 20091206
+
+* Wed Oct 7 2009 Owen Taylor <otaylor@redhat.com> - 2.28.0-2
+- Update to 2.28.0
+
+* Tue Sep 15 2009 Owen Taylor <otaylor@redhat.com> - 2.27.3-1
+- Update to 2.27.3
+
+* Fri Sep 4 2009 Owen Taylor <otaylor@redhat.com> - 2.27.2-2
+- Test for gobject-introspection version should be >= not >
+
+* Fri Sep 4 2009 Owen Taylor <otaylor@redhat.com> - 2.27.2-1
+- Update to 2.27.2
+- Add an explicit dep on gobject-introspection 0.6.5 which is required
+ for the new version
+
+* Sat Aug 29 2009 Owen Taylor <otaylor@redhat.com> - 2.27.1-4
+- Fix GConf %%preun script to properly be for package removal
+
+* Fri Aug 28 2009 Owen Taylor <otaylor@redhat.com> - 2.27.1-3
+- Replace libgnomeui with gnome-desktop in BuildRequires
+
+* Fri Aug 28 2009 Owen Taylor <otaylor@redhat.com> - 2.27.1-2
+- BuildRequire intltool
+- Add find_lang
+
+* Fri Aug 28 2009 Owen Taylor <otaylor@redhat.com> - 2.27.1-1
+- Update to 2.27.1
+- Update Requires, add desktop-effects
+
+* Wed Aug 12 2009 Owen Taylor <otaylor@redhat.com> - 2.27.0-4
+- Add an explicit dependency on GConf2 for pre/post
+
+* Tue Aug 11 2009 Owen Taylor <otaylor@redhat.com> - 2.27.0-3
+- Add missing BuildRequires on gir-repository-devel
+
+* Tue Aug 11 2009 Owen Taylor <otaylor@redhat.com> - 2.27.0-2
+- Temporarily use a non-parallel-build until gnome-shell is fixed
+
+* Mon Aug 10 2009 Owen Taylor <otaylor@redhat.com> - 2.27.0-1
+- Initial version
diff --git a/login-screen-extensions.patch b/login-screen-extensions.patch
new file mode 100644
index 0000000..bdfb9a1
--- /dev/null
+++ b/login-screen-extensions.patch
@@ -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
+
diff --git a/owe-support.patch b/owe-support.patch
new file mode 100644
index 0000000..4dcb66f
--- /dev/null
+++ b/owe-support.patch
@@ -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
+
diff --git a/portal-notify.patch b/portal-notify.patch
new file mode 100644
index 0000000..0b1028c
--- /dev/null
+++ b/portal-notify.patch
@@ -0,0 +1,499 @@
+From 4a03da36817c8d22a32a63d5c115efcf49ce85f5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 12 Jun 2024 13:13:41 +0200
+Subject: [PATCH 1/3] network: Split out CaptivePortalHandler class
+
+The handling of captive portals is going to be extended a bit,
+so split out a proper class instead of mixing it in with the
+indicator code.
+---
+ js/ui/status/network.js | 152 ++++++++++++++++++++++------------------
+ 1 file changed, 84 insertions(+), 68 deletions(-)
+
+diff --git a/js/ui/status/network.js b/js/ui/status/network.js
+index b407d8e78d..6d070f6d88 100644
+--- a/js/ui/status/network.js
++++ b/js/ui/status/network.js
+@@ -51,7 +51,7 @@ var PortalHelperResult = {
+ };
+
+ const PortalHelperIface = loadInterfaceXML('org.gnome.Shell.PortalHelper');
+-const PortalHelperProxy = Gio.DBusProxy.makeProxyWrapper(PortalHelperIface);
++const PortalHelperInfo = Gio.DBusInterfaceInfo.new_for_xml(PortalHelperIface);
+
+ function signalToIcon(value) {
+ if (value < 20)
+@@ -1707,6 +1707,77 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
+ }
+ };
+
++class CaptivePortalHandler {
++ constructor(checkUri) {
++ this._checkUri = checkUri;
++ this._connectivityQueue = new Set();
++ this._portalHelperProxy = null;
++ }
++
++ addConnection(path) {
++ if (this._connectivityQueue.has(path))
++ return;
++
++ this._launchPortalHelper(path).catch(logError);
++ }
++
++ removeConnection(path) {
++ if (this._connectivityQueue.delete(path))
++ this._portalHelperProxy?.CloseRemote(path);
++ }
++
++ _portalHelperDone(parameters) {
++ const [path, result] = parameters;
++
++ if (result === PortalHelperResult.CANCELLED) {
++ // Keep the connection in the queue, so the user is not
++ // spammed with more logins until we next flush the queue,
++ // which will happen once they choose a better connection
++ // or we get to full connectivity through other means
++ } else if (result === PortalHelperResult.COMPLETED) {
++ this.removeConnection(path);
++ } else if (result === PortalHelperResult.RECHECK) {
++ this.emit('recheck', path);
++ } else {
++ log(`Invalid result from portal helper: ${result}`);
++ }
++ }
++
++ async _launchPortalHelper(path) {
++ const timestamp = global.get_current_time();
++ if (!this._portalHelperProxy) {
++ this._portalHelperProxy = new Gio.DBusProxy({
++ g_connection: Gio.DBus.session,
++ g_name: 'org.gnome.Shell.PortalHelper',
++ g_object_path: '/org/gnome/Shell/PortalHelper',
++ g_interface_name: PortalHelperInfo.name,
++ g_interface_info: PortalHelperInfo,
++ });
++ this._portalHelperProxy.connectSignal('Done',
++ (proxy, emitter, params) => {
++ this._portalHelperDone(params);
++ });
++
++ try {
++ await this._portalHelperProxy.init_async(
++ GLib.PRIORITY_DEFAULT, null);
++ } catch (e) {
++ console.error(`Error launching the portal helper: ${e.message}`);
++ }
++ }
++
++ this._portalHelperProxy?.AuthenticateRemote(path, this._checkUri, timestamp);
++ this._connectivityQueue.add(path);
++ }
++
++ clear() {
++ for (const item of this._connectivityQueue)
++ this._portalHelperProxy?.CloseRemote(item);
++ this._connectivityQueue.clear();
++ }
++}
++Signals.addSignalMethods(CaptivePortalHandler.prototype);
++
+ var NMApplet = GObject.registerClass(
+ class Indicator extends PanelMenu.SystemIndicator {
+ _init() {
+@@ -1763,6 +1834,16 @@ class Indicator extends PanelMenu.SystemIndicator {
+ this._vpnSection.connect('icon-changed', this._updateIcon.bind(this));
+ this.menu.addMenuItem(this._vpnSection.item);
+
++ const {connectivityCheckUri} = this._client;
++ this._portalHandler = new CaptivePortalHandler(connectivityCheckUri);
++ this._portalHandler.connect('recheck', async (o, path) => {
++ try {
++ const state = await this._client.check_connectivity_async(null);
++ if (state >= NM.ConnectivityState.FULL)
++ this._portalHandler.removeConnection(path);
++ } catch (e) { }
++ });
++
+ this._readConnections();
+ this._readDevices();
+ this._syncNMState();
+@@ -2074,51 +2155,10 @@ class Indicator extends PanelMenu.SystemIndicator {
+ this._syncConnectivity();
+ }
+
+- _flushConnectivityQueue() {
+- if (this._portalHelperProxy) {
+- for (let item of this._connectivityQueue)
+- this._portalHelperProxy.CloseRemote(item);
+- }
+-
+- this._connectivityQueue = [];
+- }
+-
+- _closeConnectivityCheck(path) {
+- let index = this._connectivityQueue.indexOf(path);
+-
+- if (index >= 0) {
+- if (this._portalHelperProxy)
+- this._portalHelperProxy.CloseRemote(path);
+-
+- this._connectivityQueue.splice(index, 1);
+- }
+- }
+-
+- async _portalHelperDone(proxy, emitter, parameters) {
+- let [path, result] = parameters;
+-
+- if (result == PortalHelperResult.CANCELLED) {
+- // Keep the connection in the queue, so the user is not
+- // spammed with more logins until we next flush the queue,
+- // which will happen once he chooses a better connection
+- // or we get to full connectivity through other means
+- } else if (result == PortalHelperResult.COMPLETED) {
+- this._closeConnectivityCheck(path);
+- } else if (result == PortalHelperResult.RECHECK) {
+- try {
+- const state = await this._client.check_connectivity_async(null);
+- if (state >= NM.ConnectivityState.FULL)
+- this._closeConnectivityCheck(path);
+- } catch (e) { }
+- } else {
+- log('Invalid result from portal helper: %s'.format(result));
+- }
+- }
+-
+ _syncConnectivity() {
+ if (this._mainConnection == null ||
+ this._mainConnection.state != NM.ActiveConnectionState.ACTIVATED) {
+- this._flushConnectivityQueue();
++ this._portalHandler.clear();
+ return;
+ }
+
+@@ -2133,31 +2173,7 @@ class Indicator extends PanelMenu.SystemIndicator {
+ if (!isPortal || Main.sessionMode.isGreeter)
+ return;
+
+- let path = this._mainConnection.get_path();
+- for (let item of this._connectivityQueue) {
+- if (item == path)
+- return;
+- }
+-
+- let timestamp = global.get_current_time();
+- if (this._portalHelperProxy) {
+- this._portalHelperProxy.AuthenticateRemote(path, '', timestamp);
+- } else {
+- new PortalHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PortalHelper',
+- '/org/gnome/Shell/PortalHelper', (proxy, error) => {
+- if (error) {
+- log('Error launching the portal helper: %s'.format(error));
+- return;
+- }
+-
+- this._portalHelperProxy = proxy;
+- proxy.connectSignal('Done', this._portalHelperDone.bind(this));
+-
+- proxy.AuthenticateRemote(path, '', timestamp);
+- });
+- }
+-
+- this._connectivityQueue.push(path);
++ this._portalHandler.addConnection(this._mainConnection.get_path());
+ }
+
+ _updateIcon() {
+--
+2.45.2
+
+
+From 7d1a2442c957df3a31ab544da9b4e1365b8c2348 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 12 Jun 2024 13:13:41 +0200
+Subject: [PATCH 2/3] status/network: Show notification when detecting captive
+ portal
+
+When NetworkManager detects limited connectivity, we currently
+pop up the portal helper window immediately. This can both be
+disruptive when it happens unexpectedly, and unnoticeable
+when it happens during screen lock.
+
+In any case, it seems better to not pop up a window without
+explicit user action, so instead show a notification that
+launches the portal window when activated.
+
+Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7688
+---
+ js/ui/status/network.js | 38 ++++++++++++++++++++++++++++++++++----
+ 1 file changed, 34 insertions(+), 4 deletions(-)
+
+diff --git a/js/ui/status/network.js b/js/ui/status/network.js
+index 6d070f6d88..5913467454 100644
+--- a/js/ui/status/network.js
++++ b/js/ui/status/network.js
+@@ -1711,19 +1711,43 @@ class CaptivePortalHandler {
+ constructor(checkUri) {
+ this._checkUri = checkUri;
+ this._connectivityQueue = new Set();
++ this._notifications = new Map();
+ this._portalHelperProxy = null;
+ }
+
+- addConnection(path) {
+- if (this._connectivityQueue.has(path))
++ addConnection(name, path) {
++ if (this._connectivityQueue.has(path) || this._notifications.has(path))
+ return;
+
+- this._launchPortalHelper(path).catch(logError);
++ const source = new MessageTray.Source(
++ _('System'),
++ 'emblem-system-symbolic');
++ Main.messageTray.add(source);
++
++ const notification = new MessageTray.Notification(
++ source, _('Sign Into Wi–Fi Network'), name);
++ notification.connect('activated',
++ () => this._onNotificationActivated(path));
++ notification.connect('destroy',
++ () => this._notifications.delete(path));
++ this._notifications.set(path, notification);
++ source.showNotification(notification);
+ }
+
++
+ removeConnection(path) {
+ if (this._connectivityQueue.delete(path))
+ this._portalHelperProxy?.CloseRemote(path);
++ this._notifications.get(path)?.destroy(
++ MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
++ this._notifications.delete(path);
++ }
++
++ _onNotificationActivated(path) {
++ this._launchPortalHelper(path).catch(logError);
++
++ Main.overview.hide();
++ Main.panel.closeCalendar();
+ }
+
+ _portalHelperDone(parameters) {
+@@ -1774,6 +1798,10 @@ class CaptivePortalHandler {
+ for (const item of this._connectivityQueue)
+ this._portalHelperProxy?.CloseRemote(item);
+ this._connectivityQueue.clear();
++
++ for (const n of this._notifications.values())
++ n.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
++ this._notifications.clear();
+ }
+ }
+ Signals.addSignalMethods(CaptivePortalHandler.prototype);
+@@ -2173,7 +2201,9 @@ class Indicator extends PanelMenu.SystemIndicator {
+ if (!isPortal || Main.sessionMode.isGreeter)
+ return;
+
+- this._portalHandler.addConnection(this._mainConnection.get_path());
++ this._portalHandler.addConnection(
++ this._mainConnection.get_id(),
++ this._mainConnection.get_path());
+ }
+
+ _updateIcon() {
+--
+2.45.2
+
+
+From cda2810d13bb9b5294759a8268cfbb27d83190f1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 12 Jun 2024 13:13:41 +0200
+Subject: [PATCH 3/3] build: Add option to disable portal-helper
+
+The portal login window uses WebKit, which is a security-sensitive
+component that not all vendors want to support.
+
+Support that case with a build option, and update the captive
+portal handler to use the user's default browser if the portal-helper
+is disabled.
+---
+ data/icons/meson.build | 10 +++++++++-
+ data/meson.build | 2 +-
+ js/meson.build | 14 ++++++++------
+ js/misc/config.js.in | 2 ++
+ js/misc/meson.build | 1 +
+ js/ui/status/network.js | 13 ++++++++++---
+ meson.build | 5 +++++
+ meson_options.txt | 6 ++++++
+ src/meson.build | 2 +-
+ 9 files changed, 43 insertions(+), 12 deletions(-)
+
+diff --git a/data/icons/meson.build b/data/icons/meson.build
+index eff6e4b530..277df017b2 100644
+--- a/data/icons/meson.build
++++ b/data/icons/meson.build
+@@ -1 +1,9 @@
+-install_subdir('hicolor', install_dir: icondir)
++excluded_icons=[]
++if not have_portal_helper
++ excluded_icons += [
++ 'scalable/apps/org.gnome.Shell.CaptivePortal.svg',
++ 'symbolic/apps/org.gnome.Shell.CaptivePortal-symbolic.svg',
++ ]
++endif
++install_subdir('hicolor',
++ install_dir: icondir, exclude_files: excluded_icons)
+diff --git a/data/meson.build b/data/meson.build
+index 4a1e16d467..01cf828310 100644
+--- a/data/meson.build
++++ b/data/meson.build
+@@ -4,7 +4,7 @@ desktop_files = [
+ ]
+ service_files = []
+
+-if have_networkmanager
++if have_portal_helper
+ desktop_files += 'org.gnome.Shell.PortalHelper.desktop'
+ service_files += 'org.gnome.Shell.PortalHelper.service'
+ endif
+diff --git a/js/meson.build b/js/meson.build
+index 4809f82b83..e594e23627 100644
+--- a/js/meson.build
++++ b/js/meson.build
+@@ -8,9 +8,11 @@ js_resources = gnome.compile_resources(
+ dependencies: [config_js]
+ )
+
+-portal_resources = gnome.compile_resources(
+- 'portal-resources', 'portal-resources.gresource.xml',
+- source_dir: ['.', meson.current_build_dir()],
+- c_name: 'portal_js_resources',
+- dependencies: [config_js]
+-)
++if have_portal_helper
++ portal_resources = gnome.compile_resources(
++ 'portal-resources', 'portal-resources.gresource.xml',
++ source_dir: ['.', meson.current_build_dir()],
++ c_name: 'portal_js_resources',
++ dependencies: [config_js]
++ )
++endif
+diff --git a/js/misc/config.js.in b/js/misc/config.js.in
+index e54e280441..0882af6d01 100644
+--- a/js/misc/config.js.in
++++ b/js/misc/config.js.in
+@@ -8,6 +8,8 @@ var PACKAGE_VERSION = '@PACKAGE_VERSION@';
+ var HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
+ /* 1 if networkmanager is available, 0 otherwise */
+ var HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@;
++/* 1 if portal helper is enabled, 0 otherwise */
++var HAVE_PORTAL_HELPER = @HAVE_PORTAL_HELPER@;
+ /* gettext package */
+ var GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
+ /* locale dir */
+diff --git a/js/misc/meson.build b/js/misc/meson.build
+index 2702c3dbc9..5f5f6c390f 100644
+--- a/js/misc/meson.build
++++ b/js/misc/meson.build
+@@ -5,6 +5,7 @@ jsconf.set('GETTEXT_PACKAGE', meson.project_name())
+ jsconf.set('LIBMUTTER_API_VERSION', mutter_api_version)
+ jsconf.set10('HAVE_BLUETOOTH', bt_dep.found())
+ jsconf.set10('HAVE_NETWORKMANAGER', have_networkmanager)
++jsconf.set10('HAVE_PORTAL_HELPER', have_portal_helper)
+ jsconf.set('datadir', datadir)
+ jsconf.set('libexecdir', libexecdir)
+
+diff --git a/js/ui/status/network.js b/js/ui/status/network.js
+index 5913467454..27a5eeb823 100644
+--- a/js/ui/status/network.js
++++ b/js/ui/status/network.js
+@@ -4,6 +4,7 @@ const { Clutter, Gio, GLib, GObject, Meta, NM, Polkit, St } = imports.gi;
+ const Signals = imports.signals;
+
+ const Animation = imports.ui.animation;
++const Config = imports.misc.config;
+ const Main = imports.ui.main;
+ const PanelMenu = imports.ui.panelMenu;
+ const PopupMenu = imports.ui.popupMenu;
+@@ -1744,7 +1745,13 @@ class CaptivePortalHandler {
+ }
+
+ _onNotificationActivated(path) {
+- this._launchPortalHelper(path).catch(logError);
++ const context = global.create_app_launch_context(
++ global.get_current_time(), -1);
++
++ if (Config.HAVE_PORTAL_HELPER)
++ this._launchPortalHelper(path, context).catch(logError);
++ else
++ Gio.AppInfo.launch_default_for_uri(this._checkUri, context);
+
+ Main.overview.hide();
+ Main.panel.closeCalendar();
+@@ -1767,8 +1774,7 @@ class CaptivePortalHandler {
+ }
+ }
+
+- async _launchPortalHelper(path) {
+- const timestamp = global.get_current_time();
++ async _launchPortalHelper(path, context) {
+ if (!this._portalHelperProxy) {
+ this._portalHelperProxy = new Gio.DBusProxy({
+ g_connection: Gio.DBus.session,
+@@ -1790,6 +1796,7 @@ class CaptivePortalHandler {
+ }
+ }
+
++ const {timestamp} = context;
+ this._portalHelperProxy?.AuthenticateRemote(path, this._checkUri, timestamp);
+ this._connectivityQueue.add(path);
+ }
+diff --git a/meson.build b/meson.build
+index ff841dccf2..8feac29224 100644
+--- a/meson.build
++++ b/meson.build
+@@ -116,6 +116,11 @@ else
+ have_networkmanager = false
+ endif
+
++have_portal_helper = get_option('portal_helper')
++if have_portal_helper and not have_networkmanager
++ error('Portal helper requires networkmanager support')
++endif
++
+ if get_option('systemd')
+ libsystemd_dep = dependency('libsystemd')
+ systemd_dep = dependency('systemd')
+diff --git a/meson_options.txt b/meson_options.txt
+index ef76b73c34..7666fc5421 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -28,6 +28,12 @@ option('networkmanager',
+ description: 'Enable NetworkManager support'
+ )
+
++option('portal_helper',
++ type: 'boolean',
++ value: true,
++ description: 'Enable build-in network portal login'
++)
++
+ option('systemd',
+ type: 'boolean',
+ value: true,
+diff --git a/src/meson.build b/src/meson.build
+index d235c37438..3e1accf2e7 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -250,7 +250,7 @@ executable('gnome-shell', 'main.c',
+ install: true
+ )
+
+-if have_networkmanager
++if have_portal_helper
+ executable('gnome-shell-portal-helper',
+ 'gnome-shell-portal-helper.c', portal_resources,
+ c_args: tools_cflags,
+--
+2.45.2
+
diff --git a/restrict-dbus-callers.patch b/restrict-dbus-callers.patch
new file mode 100644
index 0000000..914adcd
--- /dev/null
+++ b/restrict-dbus-callers.patch
@@ -0,0 +1,1353 @@
+From eb26ea5e1bb0c6fc978aae5db99ed3427b34175b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Fri, 1 Apr 2022 19:40:31 +0200
+Subject: [PATCH 01/12] shell/global: Expose shim context property
+
+Parts of the following commits rely on the ShellGlobal:context
+property that was added in GNOME 41 to expose the MetaContext
+(likewise a GNOME 41 addition).
+
+To prepare for that, expose a small shim object as context
+property that mimicks the expected upstream API.
+---
+ src/shell-global.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 92 insertions(+)
+
+diff --git a/src/shell-global.c b/src/shell-global.c
+index 24e771f52..805c73145 100644
+--- a/src/shell-global.c
++++ b/src/shell-global.c
+@@ -47,6 +47,9 @@
+
+ static ShellGlobal *the_object = NULL;
+
++#define SHIM_TYPE_META_CONTEXT shim_meta_context_get_type ()
++G_DECLARE_FINAL_TYPE (ShimMetaContext, shim_meta_context, SHIM, META_CONTEXT, GObject)
++
+ struct _ShellGlobal {
+ GObject parent;
+
+@@ -54,6 +57,7 @@ struct _ShellGlobal {
+
+ MetaBackend *backend;
+ MetaDisplay *meta_display;
++ ShimMetaContext *meta_context;
+ MetaWorkspaceManager *workspace_manager;
+ Display *xdisplay;
+
+@@ -92,6 +96,7 @@ enum {
+
+ PROP_SESSION_MODE,
+ PROP_BACKEND,
++ PROP_CONTEXT,
+ PROP_DISPLAY,
+ PROP_WORKSPACE_MANAGER,
+ PROP_SCREEN_WIDTH,
+@@ -235,6 +240,9 @@ shell_global_get_property(GObject *object,
+ case PROP_BACKEND:
+ g_value_set_object (value, global->backend);
+ break;
++ case PROP_CONTEXT:
++ g_value_set_object (value, global->meta_context);
++ break;
+ case PROP_DISPLAY:
+ g_value_set_object (value, global->meta_display);
+ break;
+@@ -514,6 +522,13 @@ shell_global_class_init (ShellGlobalClass *klass)
+ "MetaBackend object",
+ META_TYPE_BACKEND,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
++ g_object_class_install_property (gobject_class,
++ PROP_CONTEXT,
++ g_param_spec_object ("context",
++ "Context",
++ "MetaContext object",
++ G_TYPE_OBJECT,
++ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class,
+ PROP_DISPLAY,
+ g_param_spec_object ("display",
+@@ -996,6 +1011,7 @@ _shell_global_set_plugin (ShellGlobal *global,
+
+ display = meta_plugin_get_display (plugin);
+ global->meta_display = display;
++ global->meta_context = g_object_new (SHIM_TYPE_META_CONTEXT, NULL);
+ global->workspace_manager = meta_display_get_workspace_manager (display);
+
+ global->stage = CLUTTER_STAGE (meta_get_stage_for_display (display));
+@@ -1888,3 +1904,79 @@ _shell_global_locate_pointer (ShellGlobal *global)
+ {
+ g_signal_emit (global, shell_global_signals[LOCATE_POINTER], 0);
+ }
++
++enum {
++ SHIM_PROP_0,
++
++ SHIM_PROP_UNSAFE_MODE,
++
++ N_SHIM_PROPS
++};
++
++static GParamSpec *shim_obj_props [N_SHIM_PROPS];
++
++struct _ShimMetaContext
++{
++ GObject parent_instance;
++};
++
++G_DEFINE_TYPE (ShimMetaContext, shim_meta_context, G_TYPE_OBJECT);
++
++static void
++shim_meta_context_get_property (GObject *object,
++ guint prop_id,
++ GValue *value,
++ GParamSpec *pspec)
++{
++ switch (prop_id)
++ {
++ case SHIM_PROP_UNSAFE_MODE:
++ {
++ gboolean unsafe_mode;
++
++ g_object_get (meta_get_backend (), "unsafe-mode", &unsafe_mode, NULL);
++ g_value_set_boolean (value, unsafe_mode);
++ }
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ }
++}
++
++static void
++shim_meta_context_set_property (GObject *object,
++ guint prop_id,
++ const GValue *value,
++ GParamSpec *pspec)
++{
++ switch (prop_id)
++ {
++ case SHIM_PROP_UNSAFE_MODE:
++ g_object_set_property (G_OBJECT (meta_get_backend ()), "unsafe-mode", value);
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ }
++}
++
++static void
++shim_meta_context_class_init (ShimMetaContextClass *klass)
++{
++ GObjectClass *object_class = G_OBJECT_CLASS (klass);
++
++ object_class->get_property = shim_meta_context_get_property;
++ object_class->set_property = shim_meta_context_set_property;
++
++ shim_obj_props[SHIM_PROP_UNSAFE_MODE] =
++ g_param_spec_boolean ("unsafe-mode",
++ "unsafe mode",
++ "Unsafe mode",
++ FALSE,
++ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
++ g_object_class_install_properties (object_class, N_SHIM_PROPS, shim_obj_props);
++}
++
++static void
++shim_meta_context_init (ShimMetaContext *self)
++{
++}
+--
+2.35.1
+
+
+From 20fcc7bc78a3c227304e89deddc57266e560175c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 2 Sep 2021 17:15:36 +0200
+Subject: [PATCH 02/12] panel: Show warning indicator when unsafe-mode is on
+
+MetaContext added an unsafe-mode property, which we will use to restrict
+a number of privileged operations unless it is enabled. It is meant to
+only be enabled temporarily for development/debugging purposes, so add
+a scary icon to the top bar as a reminder to turn it off again.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ js/ui/panel.js | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/js/ui/panel.js b/js/ui/panel.js
+index 380480744..c57c3ba8e 100644
+--- a/js/ui/panel.js
++++ b/js/ui/panel.js
+@@ -641,6 +641,20 @@ class PanelCorner extends St.DrawingArea {
+ }
+ });
+
++const UnsafeModeIndicator = GObject.registerClass(
++class UnsafeModeIndicator extends PanelMenu.SystemIndicator {
++ _init() {
++ super._init();
++
++ this._indicator = this._addIndicator();
++ this._indicator.icon_name = 'channel-insecure-symbolic';
++
++ global.context.bind_property('unsafe-mode',
++ this._indicator, 'visible',
++ GObject.BindingFlags.SYNC_CREATE);
++ }
++});
++
+ var AggregateLayout = GObject.registerClass(
+ class AggregateLayout extends Clutter.BoxLayout {
+ _init(params = {}) {
+@@ -702,6 +716,7 @@ class AggregateMenu extends PanelMenu.Button {
+ this._location = new imports.ui.status.location.Indicator();
+ this._nightLight = new imports.ui.status.nightLight.Indicator();
+ this._thunderbolt = new imports.ui.status.thunderbolt.Indicator();
++ this._unsafeMode = new UnsafeModeIndicator();
+
+ this._indicators.add_child(this._remoteAccess);
+ this._indicators.add_child(this._thunderbolt);
+@@ -713,6 +728,7 @@ class AggregateMenu extends PanelMenu.Button {
+ this._indicators.add_child(this._bluetooth);
+ this._indicators.add_child(this._rfkill);
+ this._indicators.add_child(this._volume);
++ this._indicators.add_child(this._unsafeMode);
+ this._indicators.add_child(this._power);
+ this._indicators.add_child(this._powerProfiles);
+
+--
+2.35.1
+
+
+From 158eeebc1d3a243e75de550cf5711e38a9f77f7f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 17 Jun 2021 01:50:50 +0200
+Subject: [PATCH 03/12] shellDBus: Use MetaContext:unsafe-mode to restrict
+ Eval()
+
+The Eval() method is unarguably the most sensitive D-Bus method
+we expose, since it allows running arbitrary code in the compositor.
+
+It is currently tied to the `development-tools` settings that is
+enabled by default. As users have become accustomed to the built-in
+commands that are enabled by the same setting (restart, lg, ...),
+that default cannot easily be changed.
+
+In order to restrict the method without affecting the rather harmless
+commands, guard it by the new MetaContext:unsafe-mode property instead
+of the setting.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ js/ui/shellDBus.js | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
+index 734ca4fc7..5a6edec74 100644
+--- a/js/ui/shellDBus.js
++++ b/js/ui/shellDBus.js
+@@ -54,7 +54,7 @@ var GnomeShell = class {
+ *
+ */
+ Eval(code) {
+- if (!global.settings.get_boolean('development-tools'))
++ if (!global.context.unsafe_mode)
+ return [false, ''];
+
+ let returnValue;
+--
+2.35.1
+
+
+From 0882e04a11fe8db7abf05a5d7c786664dc54ad4f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 2 Sep 2021 16:23:38 +0200
+Subject: [PATCH 04/12] introspect: Make invocation check error-based
+
+If we throw an error when the invocation isn't allowed instead of
+returning false, we can simply return that error instead of duplicating
+the error handling.
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ js/misc/introspect.js | 26 ++++++++++++++------------
+ 1 file changed, 14 insertions(+), 12 deletions(-)
+
+diff --git a/js/misc/introspect.js b/js/misc/introspect.js
+index e46a7e8c5..318955be2 100644
+--- a/js/misc/introspect.js
++++ b/js/misc/introspect.js
+@@ -134,21 +134,23 @@ var IntrospectService = class {
+ type == Meta.WindowType.UTILITY;
+ }
+
+- _isInvocationAllowed(invocation) {
++ _checkInvocation(invocation) {
+ if (this._isIntrospectEnabled())
+- return true;
++ return;
+
+ if (this._isSenderAllowed(invocation.get_sender()))
+- return true;
++ return;
+
+- return false;
++ throw new GLib.Error(Gio.DBusError,
++ Gio.DBusError.ACCESS_DENIED,
++ 'App introspection not allowed');
+ }
+
+ GetRunningApplicationsAsync(params, invocation) {
+- if (!this._isInvocationAllowed(invocation)) {
+- invocation.return_error_literal(Gio.DBusError,
+- Gio.DBusError.ACCESS_DENIED,
+- 'App introspection not allowed');
++ try {
++ this._checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
+ return;
+ }
+
+@@ -160,10 +162,10 @@ var IntrospectService = class {
+ let apps = this._appSystem.get_running();
+ let windowsList = {};
+
+- if (!this._isInvocationAllowed(invocation)) {
+- invocation.return_error_literal(Gio.DBusError,
+- Gio.DBusError.ACCESS_DENIED,
+- 'App introspection not allowed');
++ try {
++ this._checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
+ return;
+ }
+
+--
+2.35.1
+
+
+From 33c3c3846f62cc4737f0029455f9dcd838876bca Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 1 Sep 2021 21:18:42 +0200
+Subject: [PATCH 05/12] introspect: Use MetaContext:unsafe-mode instead of
+ setting
+
+The property was added precisely for this purpose, except that its
+name isn't tied to the introspect API.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ js/misc/introspect.js | 12 +-----------
+ 1 file changed, 1 insertion(+), 11 deletions(-)
+
+diff --git a/js/misc/introspect.js b/js/misc/introspect.js
+index 318955be2..967e7b830 100644
+--- a/js/misc/introspect.js
++++ b/js/misc/introspect.js
+@@ -1,8 +1,6 @@
+ /* exported IntrospectService */
+ const { Gio, GLib, Meta, Shell, St } = imports.gi;
+
+-const INTROSPECT_SCHEMA = 'org.gnome.shell';
+-const INTROSPECT_KEY = 'introspect';
+ const APP_ALLOWLIST = ['org.freedesktop.impl.portal.desktop.gtk'];
+
+ const INTROSPECT_DBUS_API_VERSION = 3;
+@@ -33,10 +31,6 @@ var IntrospectService = class {
+ this._syncRunningApplications();
+ });
+
+- this._introspectSettings = new Gio.Settings({
+- schema_id: INTROSPECT_SCHEMA,
+- });
+-
+ let tracker = Shell.WindowTracker.get_default();
+ tracker.connect('notify::focus-app',
+ () => {
+@@ -70,10 +64,6 @@ var IntrospectService = class {
+ return app.get_windows().some(w => w.transient_for == null);
+ }
+
+- _isIntrospectEnabled() {
+- return this._introspectSettings.get_boolean(INTROSPECT_KEY);
+- }
+-
+ _isSenderAllowed(sender) {
+ return [...this._allowlistMap.values()].includes(sender);
+ }
+@@ -135,7 +125,7 @@ var IntrospectService = class {
+ }
+
+ _checkInvocation(invocation) {
+- if (this._isIntrospectEnabled())
++ if (global.context.unsafe_mode)
+ return;
+
+ if (this._isSenderAllowed(invocation.get_sender()))
+--
+2.35.1
+
+
+From 4238128ba403da2cc788b0b249ee34acbea5d743 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 1 Sep 2021 21:25:26 +0200
+Subject: [PATCH 06/12] data: Remove now unused "introspect" setting
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ data/org.gnome.shell.gschema.xml.in | 8 --------
+ 1 file changed, 8 deletions(-)
+
+diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in
+index d5ea1e35f..6f1c424ba 100644
+--- a/data/org.gnome.shell.gschema.xml.in
++++ b/data/org.gnome.shell.gschema.xml.in
+@@ -104,14 +104,6 @@
+ number can be used to effectively disable the dialog.
+ </description>
+ </key>
+- <key name="introspect" type="b">
+- <default>false</default>
+- <summary>Enable introspection API</summary>
+- <description>
+- Enables a D-Bus API that allows to introspect the application state of
+- the shell.
+- </description>
+- </key>
+ <key name="app-picker-layout" type="aa{sv}">
+ <default><![CDATA[
+ [{
+--
+2.35.1
+
+
+From f6af47b55fa2a52c7cdfecf1bb7e83d7f435a6bd Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 16 Jun 2021 19:09:42 +0200
+Subject: [PATCH 07/12] introspect: Split out DBusSenderChecker
+
+Restricting callers to a list of allowed senders is useful for
+other D-Bus services as well, so split out the existing code
+into a reusable class.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ js/misc/introspect.js | 30 ++++-------------------
+ js/misc/util.js | 56 ++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 59 insertions(+), 27 deletions(-)
+
+diff --git a/js/misc/introspect.js b/js/misc/introspect.js
+index 967e7b830..e9d9260c0 100644
+--- a/js/misc/introspect.js
++++ b/js/misc/introspect.js
+@@ -6,6 +6,7 @@ const APP_ALLOWLIST = ['org.freedesktop.impl.portal.desktop.gtk'];
+ const INTROSPECT_DBUS_API_VERSION = 3;
+
+ const { loadInterfaceXML } = imports.misc.fileUtils;
++const { DBusSenderChecker } = imports.misc.util;
+
+ const IntrospectDBusIface = loadInterfaceXML('org.gnome.Shell.Introspect');
+
+@@ -40,14 +41,7 @@ var IntrospectService = class {
+
+ this._syncRunningApplications();
+
+- this._allowlistMap = new Map();
+- APP_ALLOWLIST.forEach(appName => {
+- Gio.DBus.watch_name(Gio.BusType.SESSION,
+- appName,
+- Gio.BusNameWatcherFlags.NONE,
+- (conn, name, owner) => this._allowlistMap.set(name, owner),
+- (conn, name) => this._allowlistMap.delete(name));
+- });
++ this._senderChecker = new DBusSenderChecker(APP_ALLOWLIST);
+
+ this._settings = St.Settings.get();
+ this._settings.connect('notify::enable-animations',
+@@ -64,10 +58,6 @@ var IntrospectService = class {
+ return app.get_windows().some(w => w.transient_for == null);
+ }
+
+- _isSenderAllowed(sender) {
+- return [...this._allowlistMap.values()].includes(sender);
+- }
+-
+ _getSandboxedAppId(app) {
+ let ids = app.get_windows().map(w => w.get_sandboxed_app_id());
+ return ids.find(id => id != null);
+@@ -124,21 +114,9 @@ var IntrospectService = class {
+ type == Meta.WindowType.UTILITY;
+ }
+
+- _checkInvocation(invocation) {
+- if (global.context.unsafe_mode)
+- return;
+-
+- if (this._isSenderAllowed(invocation.get_sender()))
+- return;
+-
+- throw new GLib.Error(Gio.DBusError,
+- Gio.DBusError.ACCESS_DENIED,
+- 'App introspection not allowed');
+- }
+-
+ GetRunningApplicationsAsync(params, invocation) {
+ try {
+- this._checkInvocation(invocation);
++ this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -153,7 +131,7 @@ var IntrospectService = class {
+ let windowsList = {};
+
+ try {
+- this._checkInvocation(invocation);
++ this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+diff --git a/js/misc/util.js b/js/misc/util.js
+index 802398d18..e6c183fbf 100644
+--- a/js/misc/util.js
++++ b/js/misc/util.js
+@@ -2,7 +2,7 @@
+ /* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnCommandLine,
+ formatTime, formatTimeSpan, createTimeLabel, insertSorted,
+ ensureActorVisibleInScrollView, wiggle, lerp, GNOMEversionCompare,
+- Highlighter */
++ DBusSenderChecker, Highlighter */
+
+ const { Clutter, Gio, GLib, Shell, St, GnomeDesktop } = imports.gi;
+ const Gettext = imports.gettext;
+@@ -479,6 +479,60 @@ function GNOMEversionCompare(version1, version2) {
+ return 0;
+ }
+
++var DBusSenderChecker = class {
++ /**
++ * @param {string[]} allowList - list of allowed well-known names
++ */
++ constructor(allowList) {
++ this._allowlistMap = new Map();
++
++ this._watchList = allowList.map(name => {
++ return Gio.DBus.watch_name(Gio.BusType.SESSION,
++ name,
++ Gio.BusNameWatcherFlags.NONE,
++ (conn_, name_, owner) => this._allowlistMap.set(name, owner),
++ () => this._allowlistMap.delete(name));
++ });
++ }
++
++ /**
++ * @param {string} sender - the bus name that invoked the checked method
++ * @returns {bool}
++ */
++ _isSenderAllowed(sender) {
++ return [...this._allowlistMap.values()].includes(sender);
++ }
++
++ /**
++ * Check whether the bus name that invoked @invocation maps
++ * to an entry in the allow list.
++ *
++ * @throws
++ * @param {Gio.DBusMethodInvocation} invocation - the invocation
++ * @returns {void}
++ */
++ checkInvocation(invocation) {
++ if (global.context.unsafe_mode)
++ return;
++
++ if (this._isSenderAllowed(invocation.get_sender()))
++ return;
++
++ throw new GLib.Error(Gio.DBusError,
++ Gio.DBusError.ACCESS_DENIED,
++ '%s is not allowed'.format(invocation.get_method_name()));
++ }
++
++ /**
++ * @returns {void}
++ */
++ destroy() {
++ for (const id in this._watchList)
++ Gio.DBus.unwatch_name(id);
++ this._watchList = [];
++ }
++};
++
+ /* @class Highlighter Highlight given terms in text using markup. */
+ var Highlighter = class {
+ /**
+--
+2.35.1
+
+
+From c6679a876a3c73c2c691333a5b987e27965231f3 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 17 Jun 2021 15:29:42 +0200
+Subject: [PATCH 08/12] shellDBus: Implement all methods asynchronously
+
+In order to restrict callers, we will need access to the invocation,
+not just the unpacked method parameters.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ js/ui/shellDBus.js | 31 ++++++++++++++++++++++++++++---
+ 1 file changed, 28 insertions(+), 3 deletions(-)
+
+diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
+index 5a6edec74..aa5b4dc3c 100644
+--- a/js/ui/shellDBus.js
++++ b/js/ui/shellDBus.js
+@@ -72,11 +72,26 @@ var GnomeShell = class {
+ return [success, returnValue];
+ }
+
+- FocusSearch() {
++ /**
++ * Focus the overview's search entry
++ *
++ * @param {...any} params - method parameters
++ * @param {Gio.DBusMethodInvocation} invocation - the invocation
++ * @returns {void}
++ */
++ FocusSearchAsync(params, invocation) {
+ Main.overview.focusSearch();
++ invocation.return_value(null);
+ }
+
+- ShowOSD(params) {
++ /**
++ * Show OSD with the specified parameters
++ *
++ * @param {...any} params - method parameters
++ * @param {Gio.DBusMethodInvocation} invocation - the invocation
++ * @returns {void}
++ */
++ ShowOSDAsync([params], invocation) {
+ for (let param in params)
+ params[param] = params[param].deep_unpack();
+
+@@ -97,6 +112,7 @@ var GnomeShell = class {
+ icon = Gio.Icon.new_for_string(serializedIcon);
+
+ Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel);
++ invocation.return_value(null);
+ }
+
+ /**
+@@ -118,10 +134,19 @@ var GnomeShell = class {
+ }
+
+ Main.overview.selectApp(id);
++ invocation.return_value(null);
+ }
+
+- ShowApplications() {
++ /**
++ * Show the overview's app grid
++ *
++ * @param {...any} params - method parameters
++ * @param {Gio.DBusMethodInvocation} invocation - the invocation
++ * @returns {void}
++ */
++ ShowApplicationsAsync(params, invocation) {
+ Main.overview.show(ControlsState.APP_GRID);
++ invocation.return_value(null);
+ }
+
+ GrabAcceleratorAsync(params, invocation) {
+--
+2.35.1
+
+
+From 3ad733997eecb069be543f1a4452d7a7916a0962 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 17 Jun 2021 15:29:42 +0200
+Subject: [PATCH 09/12] shellDBus: Restrict callers
+
+The org.gnome.Shell interface provides a private API to other core
+components to implement desktop functionalities like Settings or
+global keybindings. It is not meant as a public API, so limit it
+to a set of expected callers.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ js/ui/shellDBus.js | 76 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 76 insertions(+)
+
+diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
+index aa5b4dc3c..c511314f9 100644
+--- a/js/ui/shellDBus.js
++++ b/js/ui/shellDBus.js
+@@ -10,6 +10,7 @@ const Main = imports.ui.main;
+ const Screenshot = imports.ui.screenshot;
+
+ const { loadInterfaceXML } = imports.misc.fileUtils;
++const { DBusSenderChecker } = imports.misc.util;
+ const { ControlsState } = imports.ui.overviewControls;
+
+ const GnomeShellIface = loadInterfaceXML('org.gnome.Shell');
+@@ -20,6 +21,11 @@ var GnomeShell = class {
+ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this);
+ this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
+
++ this._senderChecker = new DBusSenderChecker([
++ 'org.gnome.ControlCenter',
++ 'org.gnome.SettingsDaemon.MediaKeys',
++ ]);
++
+ this._extensionsService = new GnomeShellExtensions();
+ this._screenshotService = new Screenshot.ScreenshotService();
+
+@@ -80,6 +86,13 @@ var GnomeShell = class {
+ * @returns {void}
+ */
+ FocusSearchAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ Main.overview.focusSearch();
+ invocation.return_value(null);
+ }
+@@ -92,6 +105,13 @@ var GnomeShell = class {
+ * @returns {void}
+ */
+ ShowOSDAsync([params], invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ for (let param in params)
+ params[param] = params[param].deep_unpack();
+
+@@ -124,6 +144,13 @@ var GnomeShell = class {
+ * @returns {void}
+ */
+ FocusAppAsync([id], invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ const appSys = Shell.AppSystem.get_default();
+ if (appSys.lookup_app(id) === null) {
+ invocation.return_error_literal(
+@@ -145,11 +172,25 @@ var GnomeShell = class {
+ * @returns {void}
+ */
+ ShowApplicationsAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ Main.overview.show(ControlsState.APP_GRID);
+ invocation.return_value(null);
+ }
+
+ GrabAcceleratorAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ let [accel, modeFlags, grabFlags] = params;
+ let sender = invocation.get_sender();
+ let bindingAction = this._grabAcceleratorForSender(accel, modeFlags, grabFlags, sender);
+@@ -157,6 +198,13 @@ var GnomeShell = class {
+ }
+
+ GrabAcceleratorsAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ let [accels] = params;
+ let sender = invocation.get_sender();
+ let bindingActions = [];
+@@ -168,6 +216,13 @@ var GnomeShell = class {
+ }
+
+ UngrabAcceleratorAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ let [action] = params;
+ let sender = invocation.get_sender();
+ let ungrabSucceeded = this._ungrabAcceleratorForSender(action, sender);
+@@ -176,6 +231,13 @@ var GnomeShell = class {
+ }
+
+ UngrabAcceleratorsAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ let [actions] = params;
+ let sender = invocation.get_sender();
+ let ungrabSucceeded = true;
+@@ -256,6 +318,13 @@ var GnomeShell = class {
+ }
+
+ ShowMonitorLabelsAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ let sender = invocation.get_sender();
+ let [dict] = params;
+ Main.osdMonitorLabeler.show(sender, dict);
+@@ -263,6 +332,13 @@ var GnomeShell = class {
+ }
+
+ HideMonitorLabelsAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ let sender = invocation.get_sender();
+ Main.osdMonitorLabeler.hide(sender);
+ invocation.return_value(null);
+--
+2.35.1
+
+
+From 5b87782b4950742b6ae1b29777e7812c93892ad7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Wed, 16 Jun 2021 22:11:50 +0200
+Subject: [PATCH 10/12] screenshot: Restrict callers
+
+The shell D-Bus API was always meant as a private API for core
+components, so enforce that by limiting caller to a list of
+allowed well-known names.
+
+Applications that want to request a screenshot can use the corresponding
+desktop portal.
+
+https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1970>
+---
+ js/ui/screenshot.js | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js
+index 81ab516b1..bf537b7d6 100644
+--- a/js/ui/screenshot.js
++++ b/js/ui/screenshot.js
+@@ -15,6 +15,7 @@ Gio._promisify(Shell.Screenshot.prototype,
+ 'screenshot_area', 'screenshot_area_finish');
+
+ const { loadInterfaceXML } = imports.misc.fileUtils;
++const { DBusSenderChecker } = imports.misc.util;
+
+ const ScreenshotIface = loadInterfaceXML('org.gnome.Shell.Screenshot');
+
+@@ -24,6 +25,12 @@ var ScreenshotService = class {
+ this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot');
+
+ this._screenShooter = new Map();
++ this._senderChecker = new DBusSenderChecker([
++ 'org.gnome.SettingsDaemon.MediaKeys',
++ 'org.freedesktop.impl.portal.desktop.gtk',
++ 'org.freedesktop.impl.portal.desktop.gnome',
++ 'org.gnome.Screenshot',
++ ]);
+
+ this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
+
+@@ -46,6 +53,13 @@ var ScreenshotService = class {
+ Gio.IOErrorEnum, Gio.IOErrorEnum.PERMISSION_DENIED,
+ 'Saving to disk is disabled');
+ return null;
++ } else {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return null;
++ }
+ }
+
+ let shooter = new Shell.Screenshot();
+@@ -254,6 +268,13 @@ var ScreenshotService = class {
+ }
+
+ async SelectAreaAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ let selectArea = new SelectArea();
+ try {
+ let areaRectangle = await selectArea.selectAsync();
+@@ -269,6 +290,13 @@ var ScreenshotService = class {
+ }
+
+ FlashAreaAsync(params, invocation) {
++ try {
++ this._senderChecker.checkInvocation(invocation);
++ } catch (e) {
++ invocation.return_gerror(e);
++ return;
++ }
++
+ let [x, y, width, height] = params;
+ [x, y, width, height] = this._scaleArea(x, y, width, height);
+ if (!this._checkArea(x, y, width, height)) {
+--
+2.35.1
+
+
+From b02e721663ed1481ff7b4cf40cae3a34d059d90c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Sat, 25 Sep 2021 14:15:32 +0200
+Subject: [PATCH 11/12] screenshot: Unrestrict PickColor
+
+Commit dd2cd6286cd3 restricted callers of the screenshot methods to
+portal implementations, gnome-settings-daemon and gnome-screenshot.
+
+That restriction does make sense for the actual screenshot methods,
+but `PickColor` is actually used by GTK in its color picker (and
+therefore may be called from arbitrary applications).
+
+Fix this by unrestricting access to `PickColor` again. Considering that
+the method is always interactive, it's not very privacy/security-sensitive
+anyway.
+
+https://gitlab.gnome.org/GNOME/gtk/-/issues/4283
+
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1990>
+---
+ js/ui/screenshot.js | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js
+index bf537b7d6..ae1156f47 100644
+--- a/js/ui/screenshot.js
++++ b/js/ui/screenshot.js
+@@ -37,7 +37,7 @@ var ScreenshotService = class {
+ Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
+ }
+
+- _createScreenshot(invocation, needsDisk = true) {
++ _createScreenshot(invocation, needsDisk = true, restrictCallers = true) {
+ let lockedDown = false;
+ if (needsDisk)
+ lockedDown = this._lockdownSettings.get_boolean('disable-save-to-disk');
+@@ -53,7 +53,7 @@ var ScreenshotService = class {
+ Gio.IOErrorEnum, Gio.IOErrorEnum.PERMISSION_DENIED,
+ 'Saving to disk is disabled');
+ return null;
+- } else {
++ } else if (restrictCallers) {
+ try {
+ this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+@@ -311,7 +311,7 @@ var ScreenshotService = class {
+ }
+
+ async PickColorAsync(params, invocation) {
+- const screenshot = this._createScreenshot(invocation, false);
++ const screenshot = this._createScreenshot(invocation, false, false);
+ if (!screenshot)
+ return;
+
+--
+2.35.1
+
+
+From 9e8073afbf30aaea87aefd8201fc5e04f94edaf8 Mon Sep 17 00:00:00 2001
+From: Sebastian Keller <skeller@gnome.org>
+Date: Tue, 23 Nov 2021 02:48:04 +0100
+Subject: [PATCH 12/12] util: Wait for initial name owners in DBusSenderCheck
+ before checking
+
+Otherwise an allowed caller might get rejected if the call is right
+after a gnome-shell restart and the watchers have not finished running
+their callbacks yet.
+
+Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4813
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2048>
+(cherry picked from commit 85609a232d4088b058f23f4922b9a993dea95199)
+---
+ js/misc/introspect.js | 8 ++++----
+ js/misc/util.js | 33 ++++++++++++++++++++++++++++-----
+ js/ui/screenshot.js | 18 +++++++++---------
+ js/ui/shellDBus.js | 43 +++++++++++++++++++++++--------------------
+ 4 files changed, 64 insertions(+), 38 deletions(-)
+
+diff --git a/js/misc/introspect.js b/js/misc/introspect.js
+index e9d9260c0..f3c938af9 100644
+--- a/js/misc/introspect.js
++++ b/js/misc/introspect.js
+@@ -114,9 +114,9 @@ var IntrospectService = class {
+ type == Meta.WindowType.UTILITY;
+ }
+
+- GetRunningApplicationsAsync(params, invocation) {
++ async GetRunningApplicationsAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -125,13 +125,13 @@ var IntrospectService = class {
+ invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications]));
+ }
+
+- GetWindowsAsync(params, invocation) {
++ async GetWindowsAsync(params, invocation) {
+ let focusWindow = global.display.get_focus_window();
+ let apps = this._appSystem.get_running();
+ let windowsList = {};
+
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+diff --git a/js/misc/util.js b/js/misc/util.js
+index e6c183fbf..6a0f6f641 100644
+--- a/js/misc/util.js
++++ b/js/misc/util.js
+@@ -486,20 +486,42 @@ var DBusSenderChecker = class {
+ constructor(allowList) {
+ this._allowlistMap = new Map();
+
++ this._uninitializedNames = new Set(allowList);
++ this._initializedPromise = new Promise(resolve => {
++ this._resolveInitialized = resolve;
++ });
++
+ this._watchList = allowList.map(name => {
+ return Gio.DBus.watch_name(Gio.BusType.SESSION,
+ name,
+ Gio.BusNameWatcherFlags.NONE,
+- (conn_, name_, owner) => this._allowlistMap.set(name, owner),
+- () => this._allowlistMap.delete(name));
++ (conn_, name_, owner) => {
++ this._allowlistMap.set(name, owner);
++ this._checkAndResolveInitialized(name);
++ },
++ () => {
++ this._allowlistMap.delete(name);
++ this._checkAndResolveInitialized(name);
++ });
+ });
+ }
+
+ /**
++ * @param {string} name - bus name for which the watcher got initialized
++ */
++ _checkAndResolveInitialized(name) {
++ if (this._uninitializedNames.delete(name) &&
++ this._uninitializedNames.size === 0)
++ this._resolveInitialized();
++ }
++
++ /**
++ * @async
+ * @param {string} sender - the bus name that invoked the checked method
+ * @returns {bool}
+ */
+- _isSenderAllowed(sender) {
++ async _isSenderAllowed(sender) {
++ await this._initializedPromise;
+ return [...this._allowlistMap.values()].includes(sender);
+ }
+
+@@ -507,15 +529,16 @@ var DBusSenderChecker = class {
+ * Check whether the bus name that invoked @invocation maps
+ * to an entry in the allow list.
+ *
++ * @async
+ * @throws
+ * @param {Gio.DBusMethodInvocation} invocation - the invocation
+ * @returns {void}
+ */
+- checkInvocation(invocation) {
++ async checkInvocation(invocation) {
+ if (global.context.unsafe_mode)
+ return;
+
+- if (this._isSenderAllowed(invocation.get_sender()))
++ if (await this._isSenderAllowed(invocation.get_sender()))
+ return;
+
+ throw new GLib.Error(Gio.DBusError,
+diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js
+index ae1156f47..97fcfacd0 100644
+--- a/js/ui/screenshot.js
++++ b/js/ui/screenshot.js
+@@ -37,7 +37,7 @@ var ScreenshotService = class {
+ Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
+ }
+
+- _createScreenshot(invocation, needsDisk = true, restrictCallers = true) {
++ async _createScreenshot(invocation, needsDisk = true, restrictCallers = true) {
+ let lockedDown = false;
+ if (needsDisk)
+ lockedDown = this._lockdownSettings.get_boolean('disable-save-to-disk');
+@@ -55,7 +55,7 @@ var ScreenshotService = class {
+ return null;
+ } else if (restrictCallers) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return null;
+@@ -200,7 +200,7 @@ var ScreenshotService = class {
+ "Invalid params");
+ return;
+ }
+- let screenshot = this._createScreenshot(invocation);
++ let screenshot = await this._createScreenshot(invocation);
+ if (!screenshot)
+ return;
+
+@@ -223,7 +223,7 @@ var ScreenshotService = class {
+
+ async ScreenshotWindowAsync(params, invocation) {
+ let [includeFrame, includeCursor, flash, filename] = params;
+- let screenshot = this._createScreenshot(invocation);
++ let screenshot = await this._createScreenshot(invocation);
+ if (!screenshot)
+ return;
+
+@@ -246,7 +246,7 @@ var ScreenshotService = class {
+
+ async ScreenshotAsync(params, invocation) {
+ let [includeCursor, flash, filename] = params;
+- let screenshot = this._createScreenshot(invocation);
++ let screenshot = await this._createScreenshot(invocation);
+ if (!screenshot)
+ return;
+
+@@ -269,7 +269,7 @@ var ScreenshotService = class {
+
+ async SelectAreaAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -289,9 +289,9 @@ var ScreenshotService = class {
+ }
+ }
+
+- FlashAreaAsync(params, invocation) {
++ async FlashAreaAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -311,7 +311,7 @@ var ScreenshotService = class {
+ }
+
+ async PickColorAsync(params, invocation) {
+- const screenshot = this._createScreenshot(invocation, false, false);
++ const screenshot = await this._createScreenshot(invocation, false, false);
+ if (!screenshot)
+ return;
+
+diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
+index c511314f9..39bba7aa3 100644
+--- a/js/ui/shellDBus.js
++++ b/js/ui/shellDBus.js
+@@ -81,13 +81,14 @@ var GnomeShell = class {
+ /**
+ * Focus the overview's search entry
+ *
++ * @async
+ * @param {...any} params - method parameters
+ * @param {Gio.DBusMethodInvocation} invocation - the invocation
+ * @returns {void}
+ */
+- FocusSearchAsync(params, invocation) {
++ async FocusSearchAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -100,13 +101,14 @@ var GnomeShell = class {
+ /**
+ * Show OSD with the specified parameters
+ *
++ * @async
+ * @param {...any} params - method parameters
+ * @param {Gio.DBusMethodInvocation} invocation - the invocation
+ * @returns {void}
+ */
+- ShowOSDAsync([params], invocation) {
++ async ShowOSDAsync([params], invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -143,9 +145,9 @@ var GnomeShell = class {
+ * @param {Gio.DBusMethodInvocation} invocation - the invocation
+ * @returns {void}
+ */
+- FocusAppAsync([id], invocation) {
++ async FocusAppAsync([id], invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -167,13 +169,14 @@ var GnomeShell = class {
+ /**
+ * Show the overview's app grid
+ *
++ * @async
+ * @param {...any} params - method parameters
+ * @param {Gio.DBusMethodInvocation} invocation - the invocation
+ * @returns {void}
+ */
+- ShowApplicationsAsync(params, invocation) {
++ async ShowApplicationsAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -183,9 +186,9 @@ var GnomeShell = class {
+ invocation.return_value(null);
+ }
+
+- GrabAcceleratorAsync(params, invocation) {
++ async GrabAcceleratorAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -197,9 +200,9 @@ var GnomeShell = class {
+ invocation.return_value(GLib.Variant.new('(u)', [bindingAction]));
+ }
+
+- GrabAcceleratorsAsync(params, invocation) {
++ async GrabAcceleratorsAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -215,9 +218,9 @@ var GnomeShell = class {
+ invocation.return_value(GLib.Variant.new('(au)', [bindingActions]));
+ }
+
+- UngrabAcceleratorAsync(params, invocation) {
++ async UngrabAcceleratorAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -230,9 +233,9 @@ var GnomeShell = class {
+ invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
+ }
+
+- UngrabAcceleratorsAsync(params, invocation) {
++ async UngrabAcceleratorsAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -317,9 +320,9 @@ var GnomeShell = class {
+ this._grabbers.delete(name);
+ }
+
+- ShowMonitorLabelsAsync(params, invocation) {
++ async ShowMonitorLabelsAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+@@ -331,9 +334,9 @@ var GnomeShell = class {
+ invocation.return_value(null);
+ }
+
+- HideMonitorLabelsAsync(params, invocation) {
++ async HideMonitorLabelsAsync(params, invocation) {
+ try {
+- this._senderChecker.checkInvocation(invocation);
++ await this._senderChecker.checkInvocation(invocation);
+ } catch (e) {
+ invocation.return_gerror(e);
+ return;
+--
+2.35.1
+
diff --git a/screencast-bus-name.patch b/screencast-bus-name.patch
new file mode 100644
index 0000000..323ca60
--- /dev/null
+++ b/screencast-bus-name.patch
@@ -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
+
diff --git a/sources b/sources
new file mode 100644
index 0000000..6f65bce
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+2625d20efa1bcacc4624c5fe9e474a88 gnome-shell-40.10.tar.xz
diff --git a/support-choicelist-extension.patch b/support-choicelist-extension.patch
new file mode 100644
index 0000000..54e226f
--- /dev/null
+++ b/support-choicelist-extension.patch
@@ -0,0 +1,1210 @@
+From f821b65401284cc31f68f0eb1b2e71ae3a90a122 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Tue, 18 Jul 2017 12:58:14 -0400
+Subject: [PATCH 1/2] gdm: Add AuthList control
+
+Ultimately, we want to add support for GDM's new ChoiceList
+PAM extension. That extension allows PAM modules to present
+a list of choices to the user. Before we can support that
+extension, however, we need to have a list control in the
+login-screen/unlock screen. This commit adds that control.
+
+For the most part, it's a copy-and-paste of the gdm userlist,
+but with less features. It lacks API specific to the users,
+lacks the built in timed login indicator, etc. It does feature
+a label heading.
+---
+ .../widgets/_login-dialog.scss | 26 +++
+ js/gdm/authList.js | 176 ++++++++++++++++++
+ js/js-resources.gresource.xml | 1 +
+ 3 files changed, 203 insertions(+)
+ create mode 100644 js/gdm/authList.js
+
+diff --git a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
+index 84539342d..f68d5de99 100644
+--- a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
++++ b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss
+@@ -86,60 +86,86 @@
+ .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-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: $base_border_radius + 4px;
++ padding: 6px;
++ color: darken($osd_fg_color,30%);
++ &:focus, &:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
++}
++
++.login-dialog-auth-list-label {
++ @include fontsize($base_font_size + 2);
++ font-weight: bold;
++ padding-left: 15px;
++
++ &:ltr { padding-left: 14px; text-align: left; }
++ &:rtl { padding-right: 14px; text-align: right; }
++}
++
+ .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; }
+ .login-dialog-timed-login-indicator {
+ height: 2px;
+ margin-top: 6px;
+ background-color: $osd_fg_color;
+ }
+ &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
+ }
+
+ .user-widget-label {
+ color: $osd_fg_color;
+ }
+
+ .user-widget.horizontal .user-widget-label {
+ @include fontsize($base_font_size + 2);
+ font-weight: bold;
+ padding-left: 15px;
+diff --git a/js/gdm/authList.js b/js/gdm/authList.js
+new file mode 100644
+index 000000000..fb223a972
+--- /dev/null
++++ b/js/gdm/authList.js
+@@ -0,0 +1,176 @@
++// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
++/*
++ * Copyright 2017 Red Hat, Inc
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see <http://www.gnu.org/licenses/>.
++ */
++/* exported AuthList */
++
++const { Clutter, GObject, Meta, St } = imports.gi;
++
++const SCROLL_ANIMATION_TIME = 500;
++
++const AuthListItem = GObject.registerClass({
++ Signals: { 'activate': {} },
++}, class AuthListItem extends St.Button {
++ _init(key, text) {
++ this.key = key;
++ const label = new St.Label({
++ text,
++ style_class: 'login-dialog-auth-list-label',
++ y_align: Clutter.ActorAlign.CENTER,
++ x_expand: false,
++ });
++
++ super._init({
++ style_class: 'login-dialog-auth-list-item',
++ button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
++ can_focus: true,
++ child: label,
++ reactive: true,
++ });
++
++ this.connect('key-focus-in',
++ () => this._setSelected(true));
++ this.connect('key-focus-out',
++ () => this._setSelected(false));
++ this.connect('notify::hover',
++ () => this._setSelected(this.hover));
++
++ this.connect('clicked', this._onClicked.bind(this));
++ }
++
++ _onClicked() {
++ this.emit('activate');
++ }
++
++ _setSelected(selected) {
++ if (selected) {
++ this.add_style_pseudo_class('selected');
++ this.grab_key_focus();
++ } else {
++ this.remove_style_pseudo_class('selected');
++ }
++ }
++});
++
++var AuthList = GObject.registerClass({
++ Signals: {
++ 'activate': { param_types: [GObject.TYPE_STRING] },
++ 'item-added': { param_types: [AuthListItem.$gtype] },
++ },
++}, class AuthList extends St.BoxLayout {
++ _init() {
++ super._init({
++ vertical: true,
++ style_class: 'login-dialog-auth-list-layout',
++ x_align: Clutter.ActorAlign.START,
++ y_align: Clutter.ActorAlign.CENTER,
++ });
++
++ this.label = new St.Label({ style_class: 'login-dialog-auth-list-title' });
++ this.add_child(this.label);
++
++ this._scrollView = new St.ScrollView({
++ style_class: 'login-dialog-auth-list-view',
++ });
++ this._scrollView.set_policy(
++ St.PolicyType.NEVER, St.PolicyType.AUTOMATIC);
++ this.add_child(this._scrollView);
++
++ this._box = new St.BoxLayout({
++ vertical: true,
++ style_class: 'login-dialog-auth-list',
++ pseudo_class: 'expanded',
++ });
++
++ this._scrollView.add_actor(this._box);
++ this._items = new Map();
++
++ this.connect('key-focus-in', this._moveFocusToItems.bind(this));
++ }
++
++ _moveFocusToItems() {
++ let hasItems = this.numItems > 0;
++
++ if (!hasItems)
++ return;
++
++ if (global.stage.get_key_focus() !== this)
++ return;
++
++ let focusSet = this.navigate_focus(null, St.DirectionType.TAB_FORWARD, false);
++ if (!focusSet) {
++ Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
++ this._moveFocusToItems();
++ return false;
++ });
++ }
++ }
++
++ _onItemActivated(activatedItem) {
++ this.emit('activate', activatedItem.key);
++ }
++
++ scrollToItem(item) {
++ let box = item.get_allocation_box();
++
++ let adjustment = this._scrollView.get_vscroll_bar().get_adjustment();
++
++ let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
++ adjustment.ease(value, {
++ duration: SCROLL_ANIMATION_TIME,
++ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
++ });
++ }
++
++ addItem(key, text) {
++ this.removeItem(key);
++
++ let item = new AuthListItem(key, text);
++ this._box.add(item);
++
++ this._items.set(key, item);
++
++ item.connect('activate', this._onItemActivated.bind(this));
++
++ // Try to keep the focused item front-and-center
++ item.connect('key-focus-in', () => this.scrollToItem(item));
++
++ this._moveFocusToItems();
++
++ this.emit('item-added', item);
++ }
++
++ removeItem(key) {
++ if (!this._items.has(key))
++ return;
++
++ let item = this._items.get(key);
++
++ item.destroy();
++
++ this._items.delete(key);
++ }
++
++ get numItems() {
++ return this._items.size;
++ }
++
++ clear() {
++ this.label.text = '';
++ this._box.destroy_all_children();
++ this._items.clear();
++ }
++});
+diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
+index e65e0e9cf..b2c603a55 100644
+--- a/js/js-resources.gresource.xml
++++ b/js/js-resources.gresource.xml
+@@ -1,33 +1,34 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <gresources>
+ <gresource prefix="/org/gnome/shell">
++ <file>gdm/authList.js</file>
+ <file>gdm/authPrompt.js</file>
+ <file>gdm/batch.js</file>
+ <file>gdm/loginDialog.js</file>
+ <file>gdm/oVirt.js</file>
+ <file>gdm/credentialManager.js</file>
+ <file>gdm/vmware.js</file>
+ <file>gdm/realmd.js</file>
+ <file>gdm/util.js</file>
+
+ <file>misc/config.js</file>
+ <file>misc/extensionUtils.js</file>
+ <file>misc/fileUtils.js</file>
+ <file>misc/gnomeSession.js</file>
+ <file>misc/history.js</file>
+ <file>misc/ibusManager.js</file>
+ <file>misc/inputMethod.js</file>
+ <file>misc/introspect.js</file>
+ <file>misc/jsParse.js</file>
+ <file>misc/keyboardManager.js</file>
+ <file>misc/loginManager.js</file>
+ <file>misc/modemManager.js</file>
+ <file>misc/objectManager.js</file>
+ <file>misc/params.js</file>
+ <file>misc/parentalControlsManager.js</file>
+ <file>misc/permissionStore.js</file>
+ <file>misc/smartcardManager.js</file>
+ <file>misc/systemActions.js</file>
+ <file>misc/util.js</file>
+ <file>misc/weather.js</file>
+
+--
+2.34.1
+
+From 5a2fda2fe2526f81c4dbbee6512182f19fc76a74 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 17 Jul 2017 16:48:03 -0400
+Subject: [PATCH 2/2] gdmUtil: Enable support for GDM's ChoiceList PAM
+ extension
+
+This commit hooks up support for GDM's ChoiceList PAM extension.
+---
+ js/gdm/authPrompt.js | 71 +++++++++++++++++++++++++++++++++++++++++--
+ js/gdm/loginDialog.js | 5 +++
+ js/gdm/util.js | 28 +++++++++++++++++
+ js/ui/unlockDialog.js | 7 +++++
+ 4 files changed, 109 insertions(+), 2 deletions(-)
+
+diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
+index 84c608b2f..4da91e096 100644
+--- a/js/gdm/authPrompt.js
++++ b/js/gdm/authPrompt.js
+@@ -1,36 +1,37 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+ /* exported AuthPrompt */
+
+ const { Clutter, GLib, GObject, Meta, Pango, Shell, St } = imports.gi;
+
+ const Animation = imports.ui.animation;
++const AuthList = imports.gdm.authList;
+ const Batch = imports.gdm.batch;
+ const GdmUtil = imports.gdm.util;
+ const OVirt = imports.gdm.oVirt;
+ const Vmware = imports.gdm.vmware;
+ const Params = imports.misc.params;
+ const ShellEntry = imports.ui.shellEntry;
+ const UserWidget = imports.ui.userWidget;
+ const Util = imports.misc.util;
+
+ var DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
+ var DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1000;
+ var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 300;
+
+ var MESSAGE_FADE_OUT_ANIMATION_TIME = 500;
+
+ var AuthPromptMode = {
+ UNLOCK_ONLY: 0,
+ UNLOCK_OR_LOG_IN: 1,
+ };
+
+ var AuthPromptStatus = {
+ NOT_VERIFYING: 0,
+ VERIFYING: 1,
+ VERIFICATION_FAILED: 2,
+ VERIFICATION_SUCCEEDED: 3,
+ VERIFICATION_CANCELLED: 4,
+ VERIFICATION_IN_PROGRESS: 5,
+ };
+
+ var BeginRequestType = {
+@@ -48,144 +49,164 @@ var AuthPrompt = GObject.registerClass({
+ 'reset': { param_types: [GObject.TYPE_UINT] },
+ },
+ }, class AuthPrompt extends St.BoxLayout {
+ _init(gdmClient, mode) {
+ super._init({
+ style_class: 'login-dialog-prompt-layout',
+ vertical: true,
+ x_expand: true,
+ x_align: Clutter.ActorAlign.CENTER,
+ });
+
+ this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
+
+ this._gdmClient = gdmClient;
+ this._mode = mode;
+ this._defaultButtonWellActor = null;
+ this._cancelledRetries = 0;
+
+ this._idleMonitor = Meta.IdleMonitor.get_core();
+
+ let reauthenticationOnly;
+ if (this._mode == AuthPromptMode.UNLOCK_ONLY)
+ reauthenticationOnly = true;
+ else if (this._mode == AuthPromptMode.UNLOCK_OR_LOG_IN)
+ reauthenticationOnly = false;
+
+ this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly });
+
+ this._userVerifier.connect('ask-question', this._onAskQuestion.bind(this));
+ this._userVerifier.connect('show-message', this._onShowMessage.bind(this));
++ this._userVerifier.connect('show-choice-list', this._onShowChoiceList.bind(this));
+ this._userVerifier.connect('verification-failed', this._onVerificationFailed.bind(this));
+ this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
+ this._userVerifier.connect('reset', this._onReset.bind(this));
+ this._userVerifier.connect('smartcard-status-changed', this._onSmartcardStatusChanged.bind(this));
+ this._userVerifier.connect('credential-manager-authenticated', this._onCredentialManagerAuthenticated.bind(this));
+ this.smartcardDetected = this._userVerifier.smartcardDetected;
+
+ this.connect('destroy', this._onDestroy.bind(this));
+
+ this._userWell = new St.Bin({
+ x_expand: true,
+ y_expand: true,
+ });
+ this.add_child(this._userWell);
+
+ this._hasCancelButton = this._mode === AuthPromptMode.UNLOCK_OR_LOG_IN;
+
+- this._initEntryRow();
++ this._initInputRow();
+
+ let capsLockPlaceholder = new St.Label();
+ this.add_child(capsLockPlaceholder);
+
+ this._capsLockWarningLabel = new ShellEntry.CapsLockWarning({
+ x_expand: true,
+ x_align: Clutter.ActorAlign.CENTER,
+ });
+ this.add_child(this._capsLockWarningLabel);
+
+ this._capsLockWarningLabel.bind_property('visible',
+ capsLockPlaceholder, 'visible',
+ GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN);
+
+ this._message = new St.Label({
+ opacity: 0,
+ styleClass: 'login-dialog-message',
+ y_expand: true,
+ x_expand: true,
+ y_align: Clutter.ActorAlign.START,
+ x_align: Clutter.ActorAlign.CENTER,
+ });
+ this._message.clutter_text.line_wrap = true;
+ this._message.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
+ this.add_child(this._message);
+ }
+
+ _onDestroy() {
+ if (this._preemptiveAnswerWatchId) {
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
+ this._preemptiveAnswerWatchId = 0;
+ }
+
+ this._userVerifier.destroy();
+ this._userVerifier = null;
+ }
+
+ vfunc_key_press_event(keyPressEvent) {
+ if (keyPressEvent.keyval == Clutter.KEY_Escape)
+ this.cancel();
+ return super.vfunc_key_press_event(keyPressEvent);
+ }
+
+- _initEntryRow() {
++ _initInputRow() {
+ this._mainBox = new St.BoxLayout({
+ style_class: 'login-dialog-button-box',
+ vertical: false,
+ });
+ this.add_child(this._mainBox);
+
+ this.cancelButton = new St.Button({
+ style_class: 'modal-dialog-button button cancel-button',
+ accessible_name: _('Cancel'),
+ button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
+ reactive: this._hasCancelButton,
+ can_focus: this._hasCancelButton,
+ x_align: Clutter.ActorAlign.START,
+ y_align: Clutter.ActorAlign.CENTER,
+ child: new St.Icon({ icon_name: 'go-previous-symbolic' }),
+ });
+ if (this._hasCancelButton)
+ this.cancelButton.connect('clicked', () => this.cancel());
+ else
+ this.cancelButton.opacity = 0;
+ this._mainBox.add_child(this.cancelButton);
+
++ this._authList = new AuthList.AuthList();
++ this._authList.set({
++ visible: false,
++ });
++ this._authList.connect('activate', (list, key) => {
++ this._authList.reactive = false;
++ this._authList.ease({
++ opacity: 0,
++ duration: MESSAGE_FADE_OUT_ANIMATION_TIME,
++ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
++ onComplete: () => {
++ this._authList.clear();
++ this._authList.hide();
++ this._userVerifier.selectChoice(this._queryingService, key);
++ },
++ });
++ });
++ this._mainBox.add_child(this._authList);
++
+ let entryParams = {
+ style_class: 'login-dialog-prompt-entry',
+ can_focus: true,
+ x_expand: true,
+ };
+
+ this._entry = null;
+
+ this._textEntry = new St.Entry(entryParams);
+ ShellEntry.addContextMenu(this._textEntry, { actionMode: Shell.ActionMode.NONE });
+
+ this._passwordEntry = new St.PasswordEntry(entryParams);
+ ShellEntry.addContextMenu(this._passwordEntry, { actionMode: Shell.ActionMode.NONE });
+
+ this._entry = this._passwordEntry;
+ this._mainBox.add_child(this._entry);
+ this._entry.grab_key_focus();
+
+ this._timedLoginIndicator = new St.Bin({
+ style_class: 'login-dialog-timed-login-indicator',
+ scale_x: 0,
+ });
+
+ this.add_child(this._timedLoginIndicator);
+
+ [this._textEntry, this._passwordEntry].forEach(entry => {
+ entry.clutter_text.connect('text-changed', () => {
+ if (!this._userVerifier.hasPendingMessages && this._queryingService && !this._preemptiveAnswer)
+ this._fadeOutMessage();
+ });
+@@ -276,60 +297,74 @@ var AuthPrompt = GObject.registerClass({
+ this._entry = this._textEntry;
+ }
+ this._capsLockWarningLabel.visible = secret;
+ }
+
+ _onAskQuestion(verifier, serviceName, question, secret) {
+ if (this._queryingService)
+ this.clear();
+
+ this._queryingService = serviceName;
+ if (this._preemptiveAnswer) {
+ this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer);
+ this._preemptiveAnswer = null;
+ return;
+ }
+
+ this._updateEntry(secret);
+
+ // Hack: The question string comes directly from PAM, if it's "Password:"
+ // we replace it with our own to allow localization, if it's something
+ // else we remove the last colon and any trailing or leading spaces.
+ if (question === 'Password:' || question === 'Password: ')
+ this.setQuestion(_('Password'));
+ else
+ this.setQuestion(question.replace(/: *$/, '').trim());
+
+ this.updateSensitivity(true);
+ this.emit('prompted');
+ }
+
++ _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.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) {
+@@ -411,109 +446,141 @@ var AuthPrompt = GObject.registerClass({
+ if (actor) {
+ if (isSpinner)
+ this._spinner.play();
+
+ if (!animate) {
+ actor.opacity = 255;
+ } else {
+ actor.ease({
+ opacity: 255,
+ duration: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
+ delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
+ mode: Clutter.AnimationMode.LINEAR,
+ });
+ }
+ }
+
+ this._defaultButtonWellActor = actor;
+ }
+
+ startSpinning() {
+ this.setActorInDefaultButtonWell(this._spinner, true);
+ }
+
+ stopSpinning() {
+ this.setActorInDefaultButtonWell(null, false);
+ }
+
+ clear() {
+ this._entry.text = '';
+ this.stopSpinning();
++ this._authList.clear();
++ this._authList.hide();
+ }
+
+ setQuestion(question) {
+ if (this._preemptiveAnswerWatchId) {
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
+ this._preemptiveAnswerWatchId = 0;
+ }
+
+ this._entry.hint_text = question;
+
++ this._authList.hide();
+ this._entry.show();
+ this._entry.grab_key_focus();
+ }
+
++ _fadeInChoiceList() {
++ this._authList.set({
++ opacity: 0,
++ visible: true,
++ reactive: false,
++ });
++ this._authList.ease({
++ opacity: 255,
++ duration: MESSAGE_FADE_OUT_ANIMATION_TIME,
++ transition: Clutter.AnimationMode.EASE_OUT_QUAD,
++ onComplete: () => (this._authList.reactive = true),
++ });
++ }
++
++ setChoiceList(promptMessage, choiceList) {
++ this._authList.clear();
++ this._authList.label.text = promptMessage;
++ for (let key in choiceList) {
++ let text = choiceList[key];
++ this._authList.addItem(key, text);
++ }
++
++ this._entry.hide();
++ if (this._message.text === '')
++ this._message.hide();
++ this._fadeInChoiceList();
++ }
++
+ getAnswer() {
+ let text;
+
+ if (this._preemptiveAnswer) {
+ text = this._preemptiveAnswer;
+ this._preemptiveAnswer = null;
+ } else {
+ text = this._entry.get_text();
+ }
+
+ return text;
+ }
+
+ _fadeOutMessage() {
+ if (this._message.opacity == 0)
+ return;
+ this._message.remove_all_transitions();
+ this._message.ease({
+ opacity: 0,
+ duration: MESSAGE_FADE_OUT_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ });
+ }
+
+ setMessage(serviceName, message, type) {
+ if (type == GdmUtil.MessageType.ERROR)
+ this._message.add_style_class_name('login-dialog-message-warning');
+ else
+ this._message.remove_style_class_name('login-dialog-message-warning');
+
+ if (type == GdmUtil.MessageType.HINT)
+ this._message.add_style_class_name('login-dialog-message-hint');
+ else
+ this._message.remove_style_class_name('login-dialog-message-hint');
+
++ this._message.show();
+ if (message) {
+ this._message.remove_all_transitions();
+ this._message.text = message;
+ this._message.opacity = 255;
+ } else {
+ this._message.opacity = 0;
+ }
+
+ if (type === GdmUtil.MessageType.ERROR &&
+ this._userVerifier.serviceIsFingerprint(serviceName)) {
+ // TODO: Use Await for wiggle to be over before unfreezing the user verifier queue
+ const wiggleParameters = {
+ duration: 65,
+ wiggleCount: 3,
+ };
+ this._userVerifier.increaseCurrentMessageTimeout(
+ wiggleParameters.duration * (wiggleParameters.wiggleCount + 2));
+ Util.wiggle(this._message, wiggleParameters);
+ }
+ }
+
+ updateSensitivity(sensitive) {
+ if (this._entry.reactive === sensitive)
+ return;
+
+ this._entry.reactive = sensitive;
+
+ if (sensitive) {
+ this._entry.grab_key_focus();
+ } else {
+diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
+index d2a82b43d..41dd99646 100644
+--- a/js/gdm/loginDialog.js
++++ b/js/gdm/loginDialog.js
+@@ -391,60 +391,65 @@ var SessionMenuButton = GObject.registerClass({
+ let item = new PopupMenu.PopupMenuItem(sessionName);
+ this._menu.addMenuItem(item);
+ this._items[id] = item;
+
+ item.connect('activate', () => {
+ this.setActiveSession(id);
+ this.emit('session-activated', this._activeSessionId);
+ });
+ }
+ }
+ });
+
+ var LoginDialog = GObject.registerClass({
+ Signals: {
+ 'failed': {},
+ 'wake-up-screen': {},
+ },
+ }, class LoginDialog extends St.Widget {
+ _init(parentActor) {
+ super._init({ style_class: 'login-dialog', visible: false });
+
+ this.get_accessible().set_role(Atk.Role.WINDOW);
+
+ this.add_constraint(new Layout.MonitorConstraint({ primary: true }));
+ this.connect('destroy', this._onDestroy.bind(this));
+ parentActor.add_child(this);
+
+ this._userManager = AccountsService.UserManager.get_default();
+ this._gdmClient = new Gdm.Client();
+
++ try {
++ this._gdmClient.set_enabled_extensions([Gdm.UserVerifierChoiceList.interface_info().name]);
++ } catch (e) {
++ }
++
+ this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
+
+ this._settings.connect('changed::%s'.format(GdmUtil.BANNER_MESSAGE_KEY),
+ this._updateBanner.bind(this));
+ this._settings.connect('changed::%s'.format(GdmUtil.BANNER_MESSAGE_TEXT_KEY),
+ this._updateBanner.bind(this));
+ this._settings.connect('changed::%s'.format(GdmUtil.DISABLE_USER_LIST_KEY),
+ this._updateDisableUserList.bind(this));
+ this._settings.connect('changed::%s'.format(GdmUtil.LOGO_KEY),
+ this._updateLogo.bind(this));
+
+ this._textureCache = St.TextureCache.get_default();
+ this._updateLogoTextureId = this._textureCache.connect('texture-file-changed',
+ this._updateLogoTexture.bind(this));
+
+ this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
+ x_align: Clutter.ActorAlign.CENTER,
+ y_align: Clutter.ActorAlign.CENTER,
+ vertical: true,
+ visible: false });
+ this.add_child(this._userSelectionBox);
+
+ this._userList = new UserList();
+ this._userSelectionBox.add_child(this._userList);
+
+ this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOG_IN);
+ this._authPrompt.connect('prompted', this._onPrompted.bind(this));
+ this._authPrompt.connect('reset', this._onReset.bind(this));
+ this._authPrompt.hide();
+ this.add_child(this._authPrompt);
+diff --git a/js/gdm/util.js b/js/gdm/util.js
+index e62114cb1..3f327400f 100644
+--- a/js/gdm/util.js
++++ b/js/gdm/util.js
+@@ -211,90 +211,98 @@ var ShellUserVerifier = class {
+ this._cancellable = new Gio.Cancellable();
+ this._hold = hold;
+ this._userName = userName;
+ this.reauthenticating = false;
+
+ this._checkForFingerprintReader();
+
+ // If possible, reauthenticate an already running session,
+ // so any session specific credentials get updated appropriately
+ if (userName)
+ this._openReauthenticationChannel(userName);
+ else
+ this._getUserVerifier();
+ }
+
+ cancel() {
+ if (this._cancellable)
+ this._cancellable.cancel();
+
+ if (this._userVerifier) {
+ this._userVerifier.call_cancel_sync(null);
+ this.clear();
+ }
+ }
+
+ _clearUserVerifier() {
+ if (this._userVerifier) {
+ this._disconnectSignals();
+ this._userVerifier.run_dispose();
+ this._userVerifier = null;
++ if (this._userVerifierChoiceList) {
++ this._userVerifierChoiceList.run_dispose();
++ this._userVerifierChoiceList = null;
++ }
+ }
+ }
+
+ clear() {
+ if (this._cancellable) {
+ this._cancellable.cancel();
+ this._cancellable = null;
+ }
+
+ this._clearUserVerifier();
+ this._clearMessageQueue();
+ }
+
+ destroy() {
+ this.cancel();
+
+ this._settings.run_dispose();
+ this._settings = null;
+
+ this._smartcardManager.disconnect(this._smartcardInsertedId);
+ this._smartcardManager.disconnect(this._smartcardRemovedId);
+ this._smartcardManager = null;
+
+ for (let service in this._credentialManagers) {
+ let credentialManager = this._credentialManagers[service];
+ credentialManager.disconnect(credentialManager._authenticatedSignalId);
+ credentialManager = null;
+ }
+ }
+
++ selectChoice(serviceName, key) {
++ this._userVerifierChoiceList.call_select_choice(serviceName, key, this._cancellable, null);
++ }
++
+ answerQuery(serviceName, answer) {
+ if (!this.hasPendingMessages) {
+ this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
+ } else {
+ const cancellable = this._cancellable;
+ let signalId = this.connect('no-more-messages', () => {
+ this.disconnect(signalId);
+ if (!cancellable.is_cancelled())
+ this._userVerifier.call_answer_query(serviceName, answer, cancellable, null);
+ });
+ }
+ }
+
+ _getIntervalForMessage(message) {
+ if (!message)
+ return 0;
+
+ // We probably could be smarter here
+ return message.length * USER_READ_TIME;
+ }
+
+ finishMessageQueue() {
+ if (!this.hasPendingMessages)
+ return;
+
+ this._messageQueue = [];
+
+ this.emit('no-more-messages');
+ }
+
+@@ -429,103 +437,116 @@ var ShellUserVerifier = class {
+ _reportInitError(where, error, serviceName) {
+ logError(error, where);
+ this._hold.release();
+
+ this._queueMessage(serviceName, _('Authentication error'), MessageType.ERROR);
+ this._failCounter++;
+ this._verificationFailed(serviceName, false);
+ }
+
+ async _openReauthenticationChannel(userName) {
+ try {
+ this._clearUserVerifier();
+ this._userVerifier = await this._client.open_reauthentication_channel(
+ userName, this._cancellable);
+ } catch (e) {
+ if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
+ return;
+ if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) &&
+ !this._reauthOnly) {
+ // Gdm emits org.freedesktop.DBus.Error.AccessDenied when there
+ // is no session to reauthenticate. Fall back to performing
+ // verification from this login session
+ this._getUserVerifier();
+ return;
+ }
+
+ this._reportInitError('Failed to open reauthentication channel', e);
+ return;
+ }
+
++ if (this._client.get_user_verifier_choice_list)
++ this._userVerifierChoiceList = this._client.get_user_verifier_choice_list();
++ else
++ this._userVerifierChoiceList = null;
++
+ this.reauthenticating = true;
+ this._connectSignals();
+ this._beginVerification();
+ this._hold.release();
+ }
+
+ async _getUserVerifier() {
+ try {
+ this._clearUserVerifier();
+ this._userVerifier =
+ await this._client.get_user_verifier(this._cancellable);
+ } catch (e) {
+ if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
+ return;
+ this._reportInitError('Failed to obtain user verifier', e);
+ return;
+ }
+
++ if (this._client.get_user_verifier_choice_list)
++ this._userVerifierChoiceList = this._client.get_user_verifier_choice_list();
++ else
++ this._userVerifierChoiceList = null;
++
+ this._connectSignals();
+ this._beginVerification();
+ this._hold.release();
+ }
+
+ _connectSignals() {
+ this._disconnectSignals();
+ this._signalIds = [];
+
+ let id = this._userVerifier.connect('info', this._onInfo.bind(this));
+ this._signalIds.push(id);
+ id = this._userVerifier.connect('problem', this._onProblem.bind(this));
+ this._signalIds.push(id);
+ id = this._userVerifier.connect('info-query', this._onInfoQuery.bind(this));
+ this._signalIds.push(id);
+ id = this._userVerifier.connect('secret-info-query', this._onSecretInfoQuery.bind(this));
+ this._signalIds.push(id);
+ id = this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this));
+ this._signalIds.push(id);
+ id = this._userVerifier.connect('service-unavailable', this._onServiceUnavailable.bind(this));
+ this._signalIds.push(id);
+ id = this._userVerifier.connect('reset', this._onReset.bind(this));
+ this._signalIds.push(id);
+ id = this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
+ this._signalIds.push(id);
++
++ if (this._userVerifierChoiceList)
++ this._userVerifierChoiceList.connect('choice-query', this._onChoiceListQuery.bind(this));
+ }
+
+ _disconnectSignals() {
+ if (!this._signalIds || !this._userVerifier)
+ return;
+
+ this._signalIds.forEach(s => this._userVerifier.disconnect(s));
+ this._signalIds = [];
+ }
+
+ _getForegroundService() {
+ if (this._preemptingService)
+ return this._preemptingService;
+
+ return this._defaultService;
+ }
+
+ serviceIsForeground(serviceName) {
+ return serviceName == this._getForegroundService();
+ }
+
+ serviceIsDefault(serviceName) {
+ return serviceName == this._defaultService;
+ }
+
+ serviceIsFingerprint(serviceName) {
+ return this._fingerprintReaderType !== FingerprintReaderType.NONE &&
+ serviceName === FINGERPRINT_SERVICE_NAME;
+ }
+
+@@ -554,60 +575,67 @@ var ShellUserVerifier = class {
+ } else {
+ await this._userVerifier.call_begin_verification(
+ serviceName, this._cancellable);
+ }
+ } catch (e) {
+ if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
+ return;
+ if (!this.serviceIsForeground(serviceName)) {
+ logError(e, 'Failed to start %s for %s'.format(serviceName, this._userName));
+ this._hold.release();
+ return;
+ }
+ this._reportInitError(this._userName
+ ? 'Failed to start %s verification for user'.format(serviceName)
+ : 'Failed to start %s verification'.format(serviceName), e,
+ serviceName);
+ return;
+ }
+ this._hold.release();
+ }
+
+ _beginVerification() {
+ this._startService(this._getForegroundService());
+
+ if (this._userName &&
+ this._fingerprintReaderType !== FingerprintReaderType.NONE &&
+ !this.serviceIsForeground(FINGERPRINT_SERVICE_NAME))
+ this._startService(FINGERPRINT_SERVICE_NAME);
+ }
+
++ _onChoiceListQuery(client, serviceName, promptMessage, list) {
++ if (!this.serviceIsForeground(serviceName))
++ return;
++
++ this.emit('show-choice-list', serviceName, promptMessage, list.deep_unpack());
++ }
++
+ _onInfo(client, serviceName, info) {
+ if (this.serviceIsForeground(serviceName)) {
+ this._queueMessage(serviceName, info, MessageType.INFO);
+ } else if (this.serviceIsFingerprint(serviceName)) {
+ // We don't show fingerprint messages directly since it's
+ // not the main auth service. Instead we use the messages
+ // as a cue to display our own message.
+ if (this._fingerprintReaderType === FingerprintReaderType.SWIPE) {
+ // Translators: this message is shown below the password entry field
+ // to indicate the user can swipe their finger on the fingerprint reader
+ this._queueMessage(serviceName, _('(or swipe finger across reader)'),
+ MessageType.HINT);
+ } else {
+ // Translators: this message is shown below the password entry field
+ // to indicate the user can place their finger on the fingerprint reader instead
+ this._queueMessage(serviceName, _('(or place finger on reader)'),
+ MessageType.HINT);
+ }
+ }
+ }
+
+ _onProblem(client, serviceName, problem) {
+ const isFingerprint = this.serviceIsFingerprint(serviceName);
+
+ if (!this.serviceIsForeground(serviceName) && !isFingerprint)
+ return;
+
+ this._queuePriorityMessage(serviceName, problem, MessageType.ERROR);
+
+ if (isFingerprint) {
+diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
+index 5b55cb08a..f4655b25b 100644
+--- a/js/ui/unlockDialog.js
++++ b/js/ui/unlockDialog.js
+@@ -466,60 +466,67 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
+ else
+ actorBox.x1 = box.x2 - (natWidth * 2);
+
+ actorBox.y1 = box.y2 - (natHeight * 2);
+ actorBox.x2 = actorBox.x1 + natWidth;
+ actorBox.y2 = actorBox.y1 + natHeight;
+
+ this._switchUserButton.allocate(actorBox);
+ }
+ }
+ });
+
+ var UnlockDialog = GObject.registerClass({
+ Signals: {
+ 'failed': {},
+ 'wake-up-screen': {},
+ },
+ }, class UnlockDialog extends St.Widget {
+ _init(parentActor) {
+ super._init({
+ accessible_role: Atk.Role.WINDOW,
+ style_class: 'unlock-dialog',
+ visible: false,
+ reactive: true,
+ });
+
+ parentActor.add_child(this);
+
+ this._gdmClient = new Gdm.Client();
+
++ try {
++ this._gdmClient.set_enabled_extensions([
++ Gdm.UserVerifierChoiceList.interface_info().name,
++ ]);
++ } catch (e) {
++ }
++
+ this._adjustment = new St.Adjustment({
+ actor: this,
+ lower: 0,
+ upper: 2,
+ page_size: 1,
+ page_increment: 1,
+ });
+ this._adjustment.connect('notify::value', () => {
+ this._setTransitionProgress(this._adjustment.value);
+ });
+
+ this._swipeTracker = new SwipeTracker.SwipeTracker(this,
+ Clutter.Orientation.VERTICAL,
+ Shell.ActionMode.UNLOCK_SCREEN);
+ this._swipeTracker.connect('begin', this._swipeBegin.bind(this));
+ this._swipeTracker.connect('update', this._swipeUpdate.bind(this));
+ this._swipeTracker.connect('end', this._swipeEnd.bind(this));
+
+ this.connect('scroll-event', (o, event) => {
+ if (this._swipeTracker.canHandleScrollEvent(event))
+ return Clutter.EVENT_PROPAGATE;
+
+ let direction = event.get_scroll_direction();
+ if (direction === Clutter.ScrollDirection.UP)
+ this._showClock();
+ else if (direction === Clutter.ScrollDirection.DOWN)
+ this._showPrompt();
+ return Clutter.EVENT_STOP;
+ });
+
+--
+2.34.1
+