SHA256
1
0
forked from pool/gnome-shell
Dominique Leuenberger 2024-08-06 05:41:49 +00:00 committed by Git OBS Bridge
commit c8e7b7684a
27 changed files with 10362 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

62
CVE-2024-36472.patch Normal file
View File

@ -0,0 +1,62 @@
diff --git a/js/ui/status/network.js b/dev/shm/tw/gnome-shell-js/ui/status/network.js
index c3f0aa0..d9a5a86 100644
--- a/js/ui/status/network.js
+++ b/dev/shm/tw/gnome-shell-js/ui/status/network.js
@@ -1975,6 +1975,7 @@ class Indicator extends SystemIndicator {
this._mainConnection = null;
this._notification = null;
+ this._PortalNotification = null;
this._wiredToggle = new NMWiredToggle();
this._wirelessToggle = new NMWirelessToggle();
@@ -2083,8 +2084,10 @@ class Indicator extends SystemIndicator {
}
_mainConnectionStateChanged() {
- if (this._mainConnection.state === NM.ActiveConnectionState.ACTIVATED)
+ if (this._mainConnection.state === NM.ActiveConnectionState.ACTIVATED) {
this._notification?.destroy();
+ this._PortalNotification?.destroy();
+ }
}
_flushConnectivityQueue() {
@@ -2119,7 +2122,7 @@ class Indicator extends SystemIndicator {
}
}
- async _syncConnectivity() {
+ _syncConnectivity() {
if (this._mainConnection == null ||
this._mainConnection.state !== NM.ActiveConnectionState.ACTIVATED) {
this._flushConnectivityQueue();
@@ -2137,10 +2140,28 @@ class Indicator extends SystemIndicator {
if (!isPortal || Main.sessionMode.isGreeter)
return;
+ let name = this._mainConnection.get_id();
let path = this._mainConnection.get_path();
if (this._connectivityQueue.has(path))
return;
+ this._PortalNotification?.destroy();
+ const source = MessageTray.getSystemSource();
+
+ this._PortalNotification = new MessageTray.Notification({
+ source,
+ title: _('Sign Into WiFi Network'),
+ body: _(name),
+ });
+ this._PortalNotification.connect('activated',
+ () => this._onNotificationActivated(path));
+ this._PortalNotification.connect('destroy',
+ () => (this._PortalNotification = null));
+
+ source.addNotification(this._PortalNotification);
+ }
+
+ async _onNotificationActivated(path) {
let timestamp = global.get_current_time();
if (!this._portalHelperProxy) {
this._portalHelperProxy = new Gio.DBusProxy({

27
_service Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0"?>
<services>
<service name="obs_scm" mode="manual">
<param name="scm">git</param>
<param name="url">https://gitlab.gnome.org/GNOME/gnome-shell.git</param>
<param name="revision">46.4</param>
<param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
<param name="versionrewrite-pattern">(.*)\+0</param>
<param name="versionrewrite-replacement">\1</param>
<!-- <param name="changesgenerate">enable</param> -->
</service>
<service name="obs_scm" mode="manual">
<param name="scm">git</param>
<param name="url">https://gitlab.gnome.org/GNOME/libgnome-volume-control.git</param>
<param name="revision">5f9768a2eac29c1ed56f1fbb449a77a3523683b6</param>
<param name="versionformat">0.gitmodule</param>
</service>
<service name="tar" mode="buildtime"/>
<service name="recompress" mode="buildtime">
<param name="file">*.tar</param>
<param name="compression">zst</param>
</service>
<service name="set_version" mode="manual">
<param name="basename">gnome-shell</param>
</service>
</services>

View File

@ -0,0 +1,16 @@
Index: gnome-shell-45.0/js/ui/endSessionDialog.js
===================================================================
--- gnome-shell-45.0.orig/js/ui/endSessionDialog.js
+++ gnome-shell-45.0/js/ui/endSessionDialog.js
@@ -379,7 +379,10 @@ class EndSessionDialog extends ModalDial
let description;
let displayTime = _roundSecondsToInterval(
- this._totalSecondsToStayOpen, this._secondsLeft, 10);
+ this._totalSecondsToStayOpen,
+ this._secondsLeft,
+ // larger than any normal value
+ 1000000);
if (this._user.is_loaded) {
let realName = this._user.get_real_name();

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6ece688535f1408bedc62a62186ceac9742c01b629469edb5dc2da4e77b4632e
size 16929293

3
gnome-shell-46.4.obscpio Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c4b4beecb9bbd7d4447245a73d484c4a0f983e6a0faa9d05bba8c5e4045a22a3
size 16926733

View File

@ -0,0 +1,12 @@
Index: gnome-shell-45.0/src/meson.build
===================================================================
--- gnome-shell-45.0.orig/src/meson.build
+++ gnome-shell-45.0/src/meson.build
@@ -250,6 +250,7 @@ executable('gnome-shell', 'main.c',
include_directories: [conf_inc, st_inc, include_directories('tray')],
build_rpath: mutter_typelibdir,
install_rpath: install_rpath,
+ link_args: ['-ldl'],
install: true
)

View File

@ -0,0 +1,35 @@
From 29dfda2d2f77d14e27cc27cbba1e41ec0363cf83 Mon Sep 17 00:00:00 2001
From: Xiaoguang Wang <xwang@suse.com>
Date: Thu, 9 Apr 2020 11:16:56 +0800
Subject: [PATCH] Disable ibus when out of CJK
---
js/misc/ibusManager.js | 8 ++++++++
1 file changed, 8 insertions(+)
Index: gnome-shell-45.0/js/misc/ibusManager.js
===================================================================
--- gnome-shell-45.0.orig/js/misc/ibusManager.js
+++ gnome-shell-45.0/js/misc/ibusManager.js
@@ -59,6 +59,10 @@ class IBusManager extends Signals.EventE
constructor() {
super();
+ let daemon = Gio.File.new_for_path('/usr/bin/ibus-daemon');
+ if (!daemon.query_exists(null))
+ return;
+
IBus.init();
// This is the longest we'll keep the keyboard frozen until an input
@@ -114,6 +118,10 @@ class IBusManager extends Signals.EventE
}
_spawn(extraArgs = []) {
+ let daemon = Gio.File.new_for_path('/usr/bin/ibus-daemon');
+ if (!daemon.query_exists(null))
+ return;
+
try {
const cmdLine = ['ibus-daemon', '--panel', 'disable', ...extraArgs];
const launchContext = global.create_app_launch_context(0, -1);

View File

@ -0,0 +1,25 @@
--- gnome-shell-41.orig/js/ui/endSessionDialog.js 2022-08-11 16:16:07.000000000 +0300
+++ gnome-shell-41/js/ui/endSessionDialog.js 2022-10-26 12:49:20.435238071 +0300
@@ -707,19 +703,7 @@
}
async _getUpdateInfo() {
- const connection = this._pkOfflineProxy.get_connection();
- const reply = await connection.call(
- this._pkOfflineProxy.g_name,
- this._pkOfflineProxy.g_object_path,
- 'org.freedesktop.DBus.Properties',
- 'GetAll',
- new GLib.Variant('(s)', [this._pkOfflineProxy.g_interface_name]),
- null,
- Gio.DBusCallFlags.NONE,
- -1,
- null);
- const [info] = reply.recursiveUnpack();
- return info;
+ return [];
}
async OpenAsync(parameters, invocation) {

368
gnome-shell-domain.patch Normal file
View File

@ -0,0 +1,368 @@
Index: gnome-shell-45.3/js/gdm/domain.js
===================================================================
--- /dev/null
+++ gnome-shell-45.3/js/gdm/domain.js
@@ -0,0 +1,236 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+/*
+ * Copyright 2011 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+import Atk from 'gi://Atk';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import St from 'gi://St';
+
+import * as Main from '../ui/main.js';
+import * as PopupMenu from '../ui/popupMenu.js';
+import * as Signals from '../misc/signals.js';
+
+const DomainLoadStatus = {
+ INIT : 0,
+ SEPARATOR : 1,
+ OWN_DOMAIN : 2,
+ TRUSTED_DOMAINS : 3,
+ DONE : 4,
+ ERR : 5
+};
+
+export class DomainMenuButton extends Signals.EventEmitter {
+ constructor(scope, handler) {
+ super();
+
+ this._separator = null;
+ this.domain_enabled = false;
+ this._domains = new Array();
+ this._load_config();
+ }
+
+ _domainsPush(domain) {
+ let valid_content = domain.replace(/\s+/g, '');
+
+ if (valid_content.length > 0) {
+ if (this._domains.indexOf(valid_content) == -1)
+ this._domains.push (valid_content);
+ }
+ }
+
+ _generate() {
+ let gearIcon = new St.Icon({ icon_name: 'samba-window',
+ icon_size: 24
+ });
+ this._button = new St.Button({ style_class: 'login-dialog-session-list-button', //FIXME
+ reactive: true,
+ track_hover: true,
+ can_focus: true,
+ accessible_name: _("Choose Domain"),
+ accessible_role: Atk.Role.MENU,
+ child: gearIcon });
+
+ gearIcon.show();
+ this.actor = new St.Bin({ child: this._button });
+
+ this._menu = new PopupMenu.PopupMenu(this._button, 0, St.Side.TOP);
+ Main.uiGroup.add_actor(this._menu.actor);
+ this._menu.actor.hide();
+
+ this._menu.connect('open-state-changed',
+ (menu, isOpen) => {
+ if (isOpen)
+ this._button.add_style_pseudo_class('active');
+ else
+ this._button.remove_style_pseudo_class('active');
+ });
+
+ this._manager = new PopupMenu.PopupMenuManager({ actor: this._button });
+ this._manager.addMenu(this._menu);
+
+ this._button.connect('clicked', () => {
+ this._menu.toggle();
+ });
+
+ this._populate();
+ }
+
+ _load_config() {
+ let keyfile = new GLib.KeyFile();
+ let path = "/etc/gdm/custom.conf";
+ let domain_group = "domains";
+
+ //? Why must use 'try'
+ try {
+ keyfile.load_from_file(path, GLib.KeyFileFlags.NONE);
+ } catch(e) {
+ }
+
+ if (!keyfile.has_group(domain_group)) {
+ return;
+ }
+
+ this.domain_enabled = keyfile.get_boolean(domain_group, 'Enable');
+ if (this.domain_enabled) {
+ let content = keyfile.get_string(domain_group, 'Domains');
+ let domains = content.split(';');
+ for (let i = 0; i < domains.length; i++) {
+ this._domainsPush(domains[i]);
+ }
+ this._generate();
+ }
+ }
+
+ _readStdout(data) {
+ this._dataStdout.read_line_async(GLib.PRIORITY_DEFAULT, null, (this, function(stream, result) {
+ let [line, len] = this._dataStdout.read_line_finish_utf8(result);
+
+ if (line == null) {
+ // end of file
+ this._stdout.close(null);
+ this.loadDomains(data, null);
+ return;
+ }
+
+ data.push(line);
+ this._readStdout(data);
+ }));
+ }
+
+ loadCommand(argv) {
+ try {
+ let data = new Array();
+ let [success, pid, stdin, stdout, stderr] = GLib.spawn_async_with_pipes(null,
+ argv,
+ null,
+ GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
+ null);
+ this._stdout = new Gio.UnixInputStream({ fd: stdout, close_fd: true });
+ GLib.close(stdin);
+ GLib.close(stderr);
+ this._dataStdout = new Gio.DataInputStream({ base_stream: this._stdout });
+ this._readStdout(data);
+ } catch (e) {
+ this.loadDomains(null, e);
+ }
+ }
+
+ loadDomains(data, err) {
+ /*FIXME: reload every 5 minutes? */
+ /*TODO: load the setting file */
+ switch (this._status) {
+ case DomainLoadStatus.INIT:
+ this._status = DomainLoadStatus.SEPARATOR;
+ this.loadCommand(["wbinfo", "--separator"]);
+ break;
+ case DomainLoadStatus.SEPARATOR:
+ if (data) {
+ this._separator = data[0];
+ this._status = DomainLoadStatus.OWN_DOMAIN;
+ this.loadCommand(["wbinfo", "--own-domain"]);
+ } else {
+ this._status = DomainLoadStatus.ERR;
+ this._menu.removeAll();
+ item = new PopupMenu.PopupMenuItem(_("Cannot receive 'separator'"));
+ item.setSensitive(false);
+ this._menu.addMenuItem(item);
+ }
+ break;
+ case DomainLoadStatus.OWN_DOMAIN:
+ if (data) {
+ for (let i = 0; i < data.length; i++) {
+ this._domainsPush(data[i]);
+ }
+ }
+ this._status = DomainLoadStatus.TRUSTED_DOMAINS;
+ this.loadCommand(["wbinfo", "--trusted-domains"]);
+ break;
+ case DomainLoadStatus.TRUSTED_DOMAINS:
+ if (data) {
+ for (let i = 0; i < data.length; i++) {
+ this._domainsPush(data[i]);
+ }
+ }
+ this._status = DomainLoadStatus.DONE;
+ this._menu.removeAll();
+ for (let i = 0; i < this._domains.length; i++) {
+ item = new PopupMenu.PopupMenuItem(this._domains[i]);
+ this._menu.addMenuItem(item);
+ item.connect('activate', (item) => {
+ //?? Why it does not work
+ //this.setActiveDomain(this._domains[i]);
+ this.setActiveDomain(item.label.text);
+ });
+ }
+ break;
+ }
+ }
+
+ _populate() {
+ //TODO Recent domains?
+ item = new PopupMenu.PopupMenuItem(_("loading the wbinfos..."));
+ item.setSensitive(false);
+ this._menu.addMenuItem(item);
+ this._status = DomainLoadStatus.INIT;
+ this.loadDomains(null, null);
+ }
+
+ setActiveDomain(domain) {
+ this._activeDomain = domain;
+ //this.emit('domain-activated', this._activeDomain);
+ this.emit('domain-activated');
+ }
+
+ getActiveDomain(domain) {
+ return this._activeDomain;
+ }
+
+ getQuestionMessage() {
+ return _("User for ") + this._activeDomain;
+ }
+
+ getHintMessage() {
+ return _("Contact dliang to get help");
+ }
+
+ getDomainUser(user) {
+ return this._activeDomain + this._separator + user;
+ }
+}
Index: gnome-shell-45.3/js/gdm/loginDialog.js
===================================================================
--- gnome-shell-45.3.orig/js/gdm/loginDialog.js
+++ gnome-shell-45.3/js/gdm/loginDialog.js
@@ -29,6 +29,7 @@ import Shell from 'gi://Shell';
import St from 'gi://St';
import * as AuthPrompt from './authPrompt.js';
+import * as Domain from './domain.js';
import * as Batch from './batch.js';
import * as BoxPointer from '../ui/boxpointer.js';
import * as CtrlAltTab from '../ui/ctrlAltTab.js';
@@ -464,6 +465,10 @@ export const LoginDialog = GObject.regis
this._authPrompt.hide();
this.add_child(this._authPrompt);
+ this._userLayout = new St.BoxLayout({ vertical: false,
+ x_expand: true });
+ this._userSelectionBox.add_child(this._userLayout);
+
// translators: this message is shown below the user list on the
// login screen. It can be activated to reveal an entry for
// manually entering the username.
@@ -485,7 +490,18 @@ export const LoginDialog = GObject.regis
this._notListedButton.hide();
- this._userSelectionBox.add_child(this._notListedButton);
+ this._userLayout.add_child(this._notListedButton);
+
+ // we add domain menu button
+ this._domainMenuButton = new Domain.DomainMenuButton();
+ if (this._domainMenuButton.domain_enabled) {
+ this._domainMenuButton.actor.hide();
+
+ this._domainMenuButton.connect('domain-activated',
+ (list) => {
+ this._hideUserListAskForDomainUsernameAndBeginVerification(); });
+ this._userLayout.add_child(this._domainMenuButton.actor);
+ } // domain end
this._bannerView = new St.ScrollView({
style_class: 'login-dialog-banner-view',
@@ -1004,6 +1020,37 @@ export const LoginDialog = GObject.regis
}, this);
}
+ _askForDomainUsernameAndBeginVerification(domain) {
+ this._authPrompt.setPasswordChar('');
+ this._authPrompt.setQuestion(this._domainMenuButton.getQuestionMessage());
+
+ //FIXME: I sugguest to add this info for customer to contact their account manager
+ this._authPrompt.setMessage(this._domainMenuButton.getHintMessage(), GdmUtil.MessageType.HINT);
+
+ let realmManager = new Realmd.Manager();
+ let realmSignalId = realmManager.connect('login-format-changed',
+ this._showRealmLoginHint.bind(this), this);
+ this._showRealmLoginHint(realmManager.loginFormat);
+
+ let nextSignalId = this._authPrompt.connect('next',
+ () => {
+ this._authPrompt.disconnect(nextSignalId);
+ this._authPrompt.updateSensitivity(false);
+ let answer = this._authPrompt.getAnswer();
+ let domain_answer = this._domainMenuButton.getDomainUser(answer);
+ this._user = this._userManager.get_user(domain_answer);
+ this._authPrompt.clear();
+ this._authPrompt.startSpinning();
+ this._authPrompt.begin({ userName: domain_answer});
+ this._updateCancelButton();
+
+ realmManager.disconnect(realmSignalId)
+ realmManager.release();
+ });
+ this._updateCancelButton();
+ this._showPrompt();
+ }
+
_startSession(serviceName) {
this._bindOpacity();
this.ease({
@@ -1178,6 +1225,11 @@ export const LoginDialog = GObject.regis
this._askForUsernameAndBeginVerification();
}
+ _hideUserListAskForDomainUsernameAndBeginVerification() {
+ this._hideUserList();
+ this._askForDomainUsernameAndBeginVerification();
+ }
+
_hideUserListAndBeginVerification() {
this._hideUserList();
this._authPrompt.begin();
@@ -1191,6 +1243,9 @@ export const LoginDialog = GObject.regis
this._sessionMenuButton.hide();
this._setUserListExpanded(true);
this._notListedButton.show();
+ if (this._domainMenuButton.domain_enabled)
+ this._domainMenuButton.actor.show();
+ this._userLayout.show();
this._userList.grab_key_focus();
}
Index: gnome-shell-45.3/js/js-resources.gresource.xml
===================================================================
--- gnome-shell-45.3.orig/js/js-resources.gresource.xml
+++ gnome-shell-45.3/js/js-resources.gresource.xml
@@ -3,6 +3,7 @@
<gresource prefix="/org/gnome/shell">
<file>gdm/authList.js</file>
<file>gdm/authPrompt.js</file>
+ <file>gdm/domain.js</file>
<file>gdm/batch.js</file>
<file>gdm/credentialManager.js</file>
<file>gdm/loginDialog.js</file>
Index: gnome-shell-45.3/po/POTFILES.in
===================================================================
--- gnome-shell-45.3.orig/po/POTFILES.in
+++ gnome-shell-45.3/po/POTFILES.in
@@ -9,6 +9,7 @@ data/org.gnome.Shell.Extensions.desktop.
data/org.gnome.Shell.PortalHelper.desktop.in.in
js/dbusServices/extensions/ui/extension-error-page.ui
js/gdm/authPrompt.js
+js/gdm/domain.js
js/gdm/loginDialog.js
js/gdm/util.js
js/misc/systemActions.js

View File

@ -0,0 +1,61 @@
Index: gnome-shell-44.beta/data/meson.build
===================================================================
--- gnome-shell-44.beta.orig/data/meson.build
+++ gnome-shell-44.beta/data/meson.build
@@ -117,8 +117,14 @@ if have_systemd
install_dir: systemduserunitdir
)
- units = files('org.gnome.Shell.target',
- 'org.gnome.Shell-disable-extensions.service')
+ configure_file(
+ input: 'org.gnome.Shell-disable-extensions.service.in',
+ output: 'org.gnome.Shell-disable-extensions.service',
+ configuration: unitconf,
+ install_dir: systemduserunitdir
+ )
+
+ units = files('org.gnome.Shell.target')
install_data(units, install_dir: systemduserunitdir)
endif
Index: gnome-shell-44.beta/data/org.gnome.Shell-disable-extensions.service
===================================================================
--- gnome-shell-44.beta.orig/data/org.gnome.Shell-disable-extensions.service
+++ /dev/null
@@ -1,15 +0,0 @@
-[Unit]
-Description=Disable GNOME Shell extensions after failure
-# Note that this unit must not conflict with anything, and must
-# be able to run in parallel with the gnome-session-shutdown.target.
-DefaultDependencies=no
-
-# We want to disable extensions only if gnome-shell has flagged the extensions
-# to be a likely cause of trouble.
-ConditionPathExists=%t/gnome-shell-disable-extensions
-
-[Service]
-Type=simple
-# Disable extensions
-ExecStart=gsettings set org.gnome.shell disable-user-extensions true
-Restart=no
Index: gnome-shell-44.beta/data/org.gnome.Shell-disable-extensions.service.in
===================================================================
--- /dev/null
+++ gnome-shell-44.beta/data/org.gnome.Shell-disable-extensions.service.in
@@ -0,0 +1,15 @@
+[Unit]
+Description=Disable GNOME Shell extensions after failure
+# Note that this unit must not conflict with anything, and must
+# be able to run in parallel with the gnome-session-shutdown.target.
+DefaultDependencies=no
+
+# We want to disable extensions only if gnome-shell has flagged the extensions
+# to be a likely cause of trouble.
+ConditionPathExists=%t/gnome-shell-disable-extensions
+
+[Service]
+Type=simple
+# Disable extensions
+ExecStart=@bindir@/gsettings set org.gnome.shell disable-user-extensions true
+Restart=no

View File

@ -0,0 +1,13 @@
Index: gnome-shell-45.0/src/main.c
===================================================================
--- gnome-shell-45.0.orig/src/main.c
+++ gnome-shell-45.0/src/main.c
@@ -736,7 +736,7 @@ main (int argc, char **argv)
g_object_unref (shell_global_get ());
g_debug ("Tearing down the mutter context");
- meta_context_destroy (g_steal_pointer (&context));
+ g_steal_pointer (&context);
return ecode;
}

View File

@ -0,0 +1,130 @@
Index: gnome-shell-45.3/data/gnome-shell-theme.gresource.xml
===================================================================
--- gnome-shell-45.3.orig/data/gnome-shell-theme.gresource.xml
+++ gnome-shell-45.3/data/gnome-shell-theme.gresource.xml
@@ -13,6 +13,7 @@
<file>gnome-shell-light.css</file>
<file>gnome-shell-high-contrast.css</file>
<file>gnome-shell-start.svg</file>
+ <file>noise-texture.png</file>
<file>pad-osd.css</file>
<file>process-working-light.svg</file>
<file>process-working-dark.svg</file>
Index: gnome-shell-45.3/js/ui/screenShield.js
===================================================================
--- gnome-shell-45.3.orig/js/ui/screenShield.js
+++ gnome-shell-45.3/js/ui/screenShield.js
@@ -11,6 +11,7 @@ import St from 'gi://St';
import * as Signals from '../misc/signals.js';
+import * as Background from './background.js';
import * as GnomeSession from '../misc/gnomeSession.js';
import * as OVirt from '../gdm/oVirt.js';
import * as LoginManager from '../misc/loginManager.js';
@@ -23,6 +24,8 @@ import * as SmartcardManager from '../mi
import {adjustAnimationTime} from '../misc/animationUtils.js';
+const LOCKDIALOG_BACKGROUND_SCHEMA = 'org.gnome.desktop.background.lockdialog';
+
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOCK_ENABLED_KEY = 'lock-enabled';
const LOCK_DELAY_KEY = 'lock-delay';
@@ -32,6 +35,9 @@ const DISABLE_LOCK_KEY = 'disable-lock-s
const LOCKED_STATE_STR = 'screenShield.locked';
+const BLUR_BRIGHTNESS = 0.55;
+const BLUR_SIGMA = 60;
+
// ScreenShield animation time
// - STANDARD_FADE_TIME is used when the session goes idle
// - MANUAL_FADE_TIME is used for lowering the shield when asked by the user,
@@ -74,6 +80,16 @@ export class ScreenShield extends Signal
name: 'lockDialogGroup',
});
+ // Add background for this._lockDialogGroup
+ this._bgLockDialogGroup = new Clutter.Actor();
+ this._lockDialogGroup.add_actor(this._bgLockDialogGroup);
+ this._lockDialogGroup.set_child_below_sibling(this._bgLockDialogGroup, null);
+ this._bgManagersLockDialogGroup = [];
+
+ this._updateBgLockDialogGroup();
+ this._monitorsChangedId =
+ Main.layoutManager.connect('monitors-changed', this._updateBgLockDialogGroup.bind(this));
+
this.actor.add_actor(this._lockScreenGroup);
this.actor.add_actor(this._lockDialogGroup);
@@ -142,6 +158,15 @@ export class ScreenShield extends Signal
this._cursorTracker = Meta.CursorTracker.get_for_display(global.display);
this._syncInhibitor();
+
+ this.connect('destroy', this._onDestroy.bind(this));
+ }
+
+ _onDestroy() {
+ if (this._monitorsChangedId) {
+ Main.layoutManager.disconnect(this._monitorsChangedId);
+ delete this._monitorsChangedId;
+ }
}
async _getLoginSession() {
@@ -518,6 +543,53 @@ export class ScreenShield extends Signal
this.emit('wake-up-screen');
}
+ _createBgLockDialogGroup(monitorIndex) {
+ let monitor = Main.layoutManager.monitors[monitorIndex];
+ let widget = new St.Widget({
+ style_class: 'bgLockDialogGroup-background',
+ x: monitor.x,
+ y: monitor.y,
+ width: monitor.width,
+ height: monitor.height,
+ });
+
+ let bgManager = new Background.BackgroundManager({
+ container: widget,
+ monitorIndex,
+ controlPosition: false,
+ settingsSchema: LOCKDIALOG_BACKGROUND_SCHEMA
+ });
+
+ this._bgManagersLockDialogGroup.push(bgManager);
+
+ this._bgLockDialogGroup.add_child(widget);
+
+ const themeContext = St.ThemeContext.get_for_stage(global.stage);
+
+ let effect = new Shell.BlurEffect({
+ brightness: BLUR_BRIGHTNESS,
+ sigma: BLUR_SIGMA * themeContext.scale_factor,
+ });
+
+ this._scaleChangedId = themeContext.connect('notify::scale-factor', () => {
+ effect.sigma = BLUR_SIGMA * themeContext.scale_factor;
+ });
+
+ widget.add_effect(effect);
+ }
+
+ _updateBgLockDialogGroup() {
+ for (let i = 0; i < this._bgManagersLockDialogGroup.length; i++)
+ this._bgManagersLockDialogGroup[i].destroy();
+
+ this._bgManagersLockDialogGroup = [];
+ this._bgLockDialogGroup.destroy_all_children();
+
+ for (let i = 0; i < Main.layoutManager.monitors.length; i++)
+ this._createBgLockDialogGroup(i);
+ }
+
+
get locked() {
return this._isLocked;
}

View File

@ -0,0 +1,30 @@
From c17f3aa64a264a5fec7d3c5f8d1e9415b60a55b4 Mon Sep 17 00:00:00 2001
From: Alynx Zhou <alynx.zhou@gmail.com>
Date: Wed, 15 May 2024 10:09:09 +0800
Subject: [PATCH] inputMethod: Reset preedit cursor when preedit text is
cleared
The preedit cursor position should be 0 when there is no preedit text,
currently it will pass 1, which is the wrong previous value.
---
js/misc/inputMethod.js | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js
index d8c3e62f0..2642aca9e 100644
--- a/js/misc/inputMethod.js
+++ b/js/misc/inputMethod.js
@@ -163,9 +163,7 @@ export const InputMethod = GObject.registerClass({
}
_onHidePreeditText() {
- this.set_preedit_text(
- null, this._preeditPos, this._preeditAnchor,
- this._preeditCommitMode);
+ this.set_preedit_text(null, 0, 0, this._preeditCommitMode);
this._preeditVisible = false;
}
--
2.45.0

View File

@ -0,0 +1,194 @@
Index: gnome-shell-45.3/js/js-resources.gresource.xml
===================================================================
--- gnome-shell-45.3.orig/js/js-resources.gresource.xml
+++ gnome-shell-45.3/js/js-resources.gresource.xml
@@ -42,6 +42,7 @@
<file>misc/util.js</file>
<file>misc/weather.js</file>
+ <file>ui/aboutMenu.js</file>
<file>ui/accessDialog.js</file>
<file>ui/altTab.js</file>
<file>ui/animation.js</file>
Index: gnome-shell-45.3/js/ui/panel.js
===================================================================
--- gnome-shell-45.3.orig/js/ui/panel.js
+++ gnome-shell-45.3/js/ui/panel.js
@@ -36,6 +36,7 @@ import * as ThunderboltStatus from './st
import * as AutoRotateStatus from './status/autoRotate.js';
import * as BackgroundAppsStatus from './status/backgroundApps.js';
+import {AboutMenuButton} from './aboutMenu.js';
import {DateMenuButton} from './dateMenu.js';
import {ATIndicator} from './status/accessibility.js';
import {InputSourceIndicator} from './status/keyboard.js';
@@ -633,6 +634,7 @@ class QuickSettings extends PanelMenu.Bu
});
const PANEL_ITEM_IMPLEMENTATIONS = {
+ 'aboutMenu': AboutMenuButton,
'activities': ActivitiesButton,
'appMenu': AppMenuButton,
'quickSettings': QuickSettings,
Index: gnome-shell-45.3/js/ui/sessionMode.js
===================================================================
--- gnome-shell-45.3.orig/js/ui/sessionMode.js
+++ gnome-shell-45.3/js/ui/sessionMode.js
@@ -60,7 +60,7 @@ const _modes = {
? ['networkAgent', 'polkitAgent']
: ['polkitAgent'],
panel: {
- left: [],
+ left: ['aboutMenu'],
center: ['dateMenu'],
right: ['dwellClick', 'a11y', 'keyboard', 'quickSettings'],
},
Index: gnome-shell-45.3/js/ui/aboutMenu.js
===================================================================
--- /dev/null
+++ gnome-shell-45.3/js/ui/aboutMenu.js
@@ -0,0 +1,144 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+import GLib from 'gi://GLib';
+import Gio from 'gi://Gio';
+import Clutter from 'gi://Clutter';
+import St from 'gi://St';
+import GObject from 'gi://GObject';
+
+import * as PanelMenu from './panelMenu.js';
+
+export const AboutMenuButton = GObject.registerClass(
+class AboutMenuButton extends PanelMenu.Button {
+ _init() {
+ super._init(0.5);
+
+ this._hostname = null;
+ this._updateHostnameId = 0;
+ this._ticket = 1;
+
+ let hbox;
+ let vbox;
+
+ this.about_hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
+ this.hostname_label = new St.Label({y_align: Clutter.ActorAlign.CENTER});
+ this.about_hbox.add_child(this.hostname_label);
+
+ this.add_child(this.about_hbox);
+ hbox = new St.BoxLayout({ name: 'aboutArea' });
+ this.menu.box.add_child(hbox);
+
+ vbox = new St.BoxLayout({vertical: true});
+ hbox.add(vbox);
+
+ ///// Section: read '/etc/os-release' to get pretty name
+ //
+ // Note: previously this is defaulted to 'SUSE Linux Enterprise', now
+ // let's use a "safer" option.
+ let sysinfo_text = 'SUSE Linux';
+ try {
+ let _os_release = Gio.File.new_for_path('/etc/os-release');
+ let [success_, contents] = _os_release.load_contents(null);
+
+ let osReleaseContentStr = new TextDecoder().decode(contents);
+ let prettyNameReg = /^PRETTY_NAME="(.+)"/;
+ let match = null;
+ for (let line of osReleaseContentStr.split('\n')) {
+ match = prettyNameReg.exec(line);
+ if (match) {
+ sysinfo_text = match[1];
+ }
+ }
+ }
+ catch (e) {
+ // NOTE soft fail, 'sysinfo_text' is the default
+ warn('ERROR: fail to read /etc/os-release');
+ }
+
+ this._sysinfo = new St.Label({ text: sysinfo_text, can_focus: true });
+ vbox.add(this._sysinfo);
+ this.hide();
+
+ this._updateHostnameId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
+ this._ticket,
+ ()=> {
+ if (this._ticket < 60*60)
+ this._ticket *= 2;
+ this._updateHostnameId = 0;
+ this._updateHostname();
+ return GLib.SOURCE_REMOVE;
+ });
+
+ return;
+ }
+
+ _updateHostname(){
+ let hostname_text = get_hostname();
+
+ if ((this._hostname == null) || (this._hostname != hostname_text)) {
+ this._ticket = 1;
+ this._hostname = hostname_text;
+ this.hostname_label.set_text(this._hostname);
+ this.show();
+ }
+ this._updateHostnameId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT,
+ this._ticket,
+ ()=> {
+ if (this._ticket < 60*60)
+ this._ticket *= 2;
+ this._updateHostnameId = 0;
+ this._updateHostname();
+ return GLib.SOURCE_REMOVE;
+ });
+ }
+
+ _destroy() {
+ this._ticket = 1;
+ if (this._updateHostnameId) {
+ GLib.source_remove (this._updateHostnameId);
+ this._updateHostnameId = 0;
+ }
+ }
+
+});
+
+function get_hostname() {
+ let hostname;
+ let interface_name = [GLib.Variant.new_string('org.freedesktop.hostname1'),
+ GLib.Variant.new_string('Hostname')];
+
+ let call = {
+ bus_name: 'org.freedesktop.hostname1',
+ object_path: '/org/freedesktop/hostname1',
+ interface_name: 'org.freedesktop.DBus.Properties',
+ method_name: 'Get',
+ parameters: GLib.Variant.new_tuple(interface_name),
+ reply_type: null,
+ flags: Gio.DBusCallFlags.NONE,
+ timeout_msec: -1,
+ cancellable: null,
+ };
+
+ try {
+ let dbusConnection = Gio.bus_get_sync(Gio.BusType.SYSTEM, null);
+
+ let message = dbusConnection.call_sync(
+ call.bus_name,
+ call.object_path,
+ call.interface_name,
+ call.method_name,
+ call.parameters,
+ call.reply_type,
+ call.flags,
+ call.timeout_msec,
+ call.cancellable
+ );
+
+ hostname = message.get_child_value(0).get_variant().get_string()[0];
+
+ } catch(e) {
+ hostname = 'localhost';
+ }
+
+ return hostname;
+}

View File

@ -0,0 +1,44 @@
Index: gnome-shell-45.0/js/ui/status/keyboard.js
===================================================================
--- gnome-shell-45.0.orig/js/ui/status/keyboard.js
+++ gnome-shell-45.0/js/ui/status/keyboard.js
@@ -274,6 +274,39 @@ class InputSourceSessionSettings extends
this._settings.connect(`changed::${this._KEY_INPUT_SOURCES}`, this._emitInputSourcesChanged.bind(this));
this._settings.connect(`changed::${this._KEY_KEYBOARD_OPTIONS}`, this._emitKeyboardOptionsChanged.bind(this));
this._settings.connect(`changed::${this._KEY_PER_WINDOW}`, this._emitPerWindowChanged.bind(this));
+
+ let sources = this._settings.get_value(this._KEY_INPUT_SOURCES);
+ let nSources = sources.n_children();
+ let sourcesList = [];
+
+ if (nSources <= 1) {
+ if (GLib.getenv('LANG') == 'zh_CN.UTF-8') {
+ log('Set default input method in Chinese language env.');
+ sourcesList.push(['xkb', 'cn']);
+ sourcesList.push([ "ibus", "libpinyin" ]);
+
+ let params = GLib.Variant.new('a(ss)', sourcesList);
+ this._settings.set_value(this._KEY_INPUT_SOURCES, params);
+ }
+
+ else if (GLib.getenv('LANG') == 'ja_JP.UTF-8') {
+ log('Set default input method in Japanese language env.');
+ sourcesList.push([ "ibus", "mozc-jp" ]);
+ sourcesList.push(['xkb', 'jp']);
+
+ let params = GLib.Variant.new('a(ss)', sourcesList);
+ this._settings.set_value(this._KEY_INPUT_SOURCES, params);
+ }
+
+ else if (GLib.getenv('LANG') == 'ko_KR.UTF-8') {
+ log('Set default input method in Korean language env.');
+ sourcesList.push(['xkb', 'kr']);
+ sourcesList.push([ "ibus", "hangul" ]);
+
+ let params = GLib.Variant.new('a(ss)', sourcesList);
+ this._settings.set_value(this._KEY_INPUT_SOURCES, params);
+ }
+ }
}
_getSourcesList(key) {

View File

@ -0,0 +1,24 @@
Index: gnome-shell-45.0/js/ui/endSessionDialog.js
===================================================================
--- gnome-shell-45.0.orig/js/ui/endSessionDialog.js
+++ gnome-shell-45.0/js/ui/endSessionDialog.js
@@ -300,7 +300,7 @@ class EndSessionDialog extends ModalDial
this.contentLayout.add_child(this._applicationSection);
this._sessionSection = new Dialog.ListSection({
- title: _('Other users are logged in'),
+ title: _('Other users are logged in. You can list these users with the "who" command.'),
});
this.contentLayout.add_child(this._sessionSection);
@@ -753,8 +753,8 @@ class EndSessionDialog extends ModalDial
this._applications.push(inhibitor);
}
- if (dialogContent.showOtherSessions)
- this._loadSessions().catch(logError);
+ //if (dialogContent.showOtherSessions)
+ //this._loadSessions().catch(logError);
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;

View File

@ -0,0 +1,39 @@
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index e3b9a5d..3296e1d 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -940,6 +940,11 @@ const WirelessNetwork = GObject.registerClass({
this._getDeviceDBusPath(), ap.get_path());
} else {
conn = new NM.SimpleConnection();
+ if (this._IsPrivateConnections()) {
+ let connectionSetting = new NM.SettingConnection();
+ connectionSetting.add_permission('user', GLib.get_user_name(), null);
+ conn.add_setting(connectionSetting);
+ }
this._device.client.add_and_activate_connection_async(
conn, this._device, ap.get_path(), null, null);
}
@@ -949,6 +954,22 @@ const WirelessNetwork = GObject.registerClass({
this.emit('destroy');
}
+ _IsPrivateConnections() {
+ let privateConnections = true;
+ let authority = Polkit.Authority.get_sync(null);
+ let credential = new Gio.Credentials();
+ let subject = new Polkit.UnixProcess({ pid: credential.get_unix_pid(), uid: credential.get_unix_user() });
+ let authResult = authority.check_authorization_sync(subject,
+ 'org.freedesktop.NetworkManager.settings.modify.system',
+ null /* details */,
+ Polkit.CheckAuthorizationFlags.NONE,
+ null /* cancellable */);
+ if (authResult)
+ privateConnections = !authResult.get_is_authorized();
+
+ return privateConnections;
+ }
+
_getDeviceDBusPath() {
// nm_object_get_path() is shadowed by nm_device_get_path()
return NM.Object.prototype.get_path.call(this._device);

View File

@ -0,0 +1,16 @@
Index: gnome-shell-45.0/js/gdm/authPrompt.js
===================================================================
--- gnome-shell-45.0.orig/js/gdm/authPrompt.js
+++ gnome-shell-45.0/js/gdm/authPrompt.js
@@ -627,8 +627,10 @@ export const AuthPrompt = GObject.regist
this._updateEntry(true);
this.stopSpinning();
- if (oldStatus === AuthPromptStatus.VERIFICATION_FAILED)
+ if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED) {
+ this._userVerifier.cancel();
this.emit('failed');
+ }
else if (oldStatus === AuthPromptStatus.VERIFICATION_CANCELLED)
this.emit('cancelled');

8841
gnome-shell.changes Normal file

File diff suppressed because it is too large Load Diff

4
gnome-shell.obsinfo Normal file
View File

@ -0,0 +1,4 @@
name: gnome-shell
version: 46.4
mtime: 1722708833
commit: 7bbc1f21088b7227a47b93be70e43998972aa925

347
gnome-shell.spec Normal file
View File

@ -0,0 +1,347 @@
#
# spec file for package gnome-shell
#
# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%global __requires_exclude typelib\\(Meta|MetaTest|Soup|St|Cogl|Clutter|TelepathyGlib\\)
%define mutter_api 14
%define mutter_req 46.0
Name: gnome-shell
Version: 46.4
Release: 0
Summary: GNOME Shell
# shew extension is LGPL 2.1; gnome-shell-extension-tool is GPL-3.0-or-later
License: GPL-2.0-or-later AND LGPL-2.1-or-later AND GPL-3.0-or-later
Group: System/GUI/GNOME
URL: https://wiki.gnome.org/Projects/GnomeShell
# Source url disabled as we are using a git checkout via source service
Source0: %{name}-%{version}.tar.zst
Source1: libgnome-volume-control-0.gitmodule.tar.zst
# SOURCE-FEATURE-OPENSUSE noise-texture boo#1176418 qkzhu@suse.com -- Add noise-texture as the default greeter background, used by patch4.
Source100: noise-texture.png
# PATCH-FIX-UPSTREAM gnome-shell-private-connection.patch bnc#751211 bgo#646187 dimstar@opensuse.org -- create private connections if the user is not authorized
Patch1: gnome-shell-private-connection.patch
# PATCH-FIX-OPENSUSE gnome-shell-executable-path-not-absolute.patch bsc#1176051 xwang@suse.com -- Fix ExecStart is not absolute path
Patch7: gnome-shell-executable-path-not-absolute.patch
# PATCH-FIX-UPSTREAM gnome-shell-exit-crash-workaround.patch bsc#1190878 glgo#GNOME/gnome-shell#4344 qkzhu@suse.com -- Workaround logout crashing
Patch8: gnome-shell-exit-crash-workaround.patch
# PATCH-FIX-UPSTREAM gnome-shell-fix-cursor-on-hide-preedit.patch glgo#GNOME/gnome-shell!3318 alynx.zhou@suse.com -- Correctly reset cursor when hide preedit
Patch9: gnome-shell-fix-cursor-on-hide-preedit.patch
# PATCH-FIX-UPSTREAM CVE-2024-36472.patch glgo#GNOME/gnome-shell#7688 bsc#1225567 xiaoguang.wang@suse.com -- Show notification when detecting captive portal
Patch10: CVE-2024-36472.patch
## NOTE: Keep SLE-only patches at bottom (starting on 1000).
# PATCH-FEATURE-SLE gnome-shell-gdm-login-applet.patch fate#314545 dliang@suse.com -- Add an applet on login UI to display suse icon, product name, hostname.
Patch1001: gnome-shell-gdm-login-applet.patch
# PATCH-FEATURE-SLE gnome-shell-domain.patch fate#307773 dliang@suse.com -- Active Directory Integration
Patch1002: gnome-shell-domain.patch
# PATCH-FIX-SLE gnome-shell-screen-disappear.patch bnc#870217 dliang@suse.com -- screen disapper.
Patch1003: gnome-shell-screen-disappear.patch
# PATCH-FIX-SLE endSession-dialog-update-time-label-every-sec.patch bnc#886132 cxiong@suse.com -- update time label every second in end session dialog
Patch1004: endSession-dialog-update-time-label-every-sec.patch
# PATCH-FIX-SLE gs-fate318433-prevent-same-account-multi-logins.patch fate#318433 cxiong@suse.com -- prevent multiple simultaneous login.
Patch1007: gs-fate318433-prevent-same-account-multi-logins.patch
# PATCH-FIX-SLE gnome-shell-disable-ibus-when-not-installed.patch bsc#987360 qzhao@suse.com -- disable ibus start when outof Chinese, Japanese, Korean area
Patch1008: gnome-shell-disable-ibus-when-not-installed.patch
# PATCH-FEATURE-SLE gnome-shell-fate324570-Make-GDM-background-image-configurable.patch fate#324570, glgo#GNOME/gnome-shell#680, boo#1172826 qkzhu@suse.com -- make GDM background image configurable
Patch1009: gnome-shell-fate324570-Make-GDM-background-image-configurable.patch
# PATCH-FIX-UPSTREAM gnome-shell-jsc#SLE-16051-Input-method-recommendation.patch jsc#SLE-16051 glgo#GNOME/gnome-shell!1563 qzhao@suse.com -- launch recommended input engines when Gnome-shell init in CJK regions.
Patch1010: gnome-shell-jsc#SLE-16051-Input-method-recommendation.patch
# PATCH-FIX-SLE gnome-shell-disable-offline-update-dialog.patch bsc#944832 milachew@mail.lv -- Disable offline update suggestion before shutdown/reboot in SLE and openSUSE Leap.
Patch1011: gnome-shell-disable-offline-update-dialog.patch
# PATCH-FEATURE-SLE gnome-shell-jscSLE9267-Remove-sessionList-of-endSessionDialog.patch jsc#SLE-9267 qkzhu@suse.com -- Remove sessionList of endSessionDialog
Patch1012: gnome-shell-jscSLE9267-Remove-sessionList-of-endSessionDialog.patch
# PATCH-FIX-SLE gnome-shell-add-linkoption-dl.patch -- Need explicit -ldl build option with older gcc on SLE 15
Patch1013: gnome-shell-add-linkoption-dl.patch
# needed for directory ownership
BuildRequires: asciidoc
BuildRequires: dbus-1
BuildRequires: docbook-xsl-stylesheets
BuildRequires: fdupes
BuildRequires: gcc-c++
BuildRequires: meson >= 0.58.0
BuildRequires: pkgconfig
BuildRequires: sassc
BuildRequires: xsltproc
BuildRequires: pkgconfig(atk-bridge-2.0)
BuildRequires: pkgconfig(bash-completion)
BuildRequires: pkgconfig(gcr-4) >= 3.90.0
BuildRequires: pkgconfig(gdk-pixbuf-2.0)
BuildRequires: pkgconfig(gdk-x11-3.0)
BuildRequires: pkgconfig(gi-docgen)
BuildRequires: pkgconfig(gio-2.0) >= 2.56.0
BuildRequires: pkgconfig(gio-unix-2.0) >= 2.56.0
BuildRequires: pkgconfig(gjs-1.0) >= 1.71.1
BuildRequires: pkgconfig(gnome-autoar-0)
BuildRequires: pkgconfig(gnome-bluetooth-3.0)
BuildRequires: pkgconfig(gnome-desktop-4)
BuildRequires: pkgconfig(gnome-keybindings)
BuildRequires: pkgconfig(gobject-2.0)
BuildRequires: pkgconfig(gobject-introspection-1.0) >= 1.49.1
BuildRequires: pkgconfig(gsettings-desktop-schemas) >= 46.beta
BuildRequires: pkgconfig(gstreamer-1.0) >= 0.11.92
BuildRequires: pkgconfig(gstreamer-base-1.0)
BuildRequires: pkgconfig(gtk+-3.0) >= 3.15.0
BuildRequires: pkgconfig(gtk4)
BuildRequires: pkgconfig(ibus-1.0) >= 1.5.19
BuildRequires: pkgconfig(json-glib-1.0) >= 0.13.2
BuildRequires: pkgconfig(libcanberra)
BuildRequires: pkgconfig(libcanberra-gtk3)
BuildRequires: pkgconfig(libecal-2.0) >= 3.33.1
BuildRequires: pkgconfig(libedataserver-1.2) >= 3.33.1
BuildRequires: pkgconfig(libgnome-menu-3.0) >= 3.5.3
BuildRequires: pkgconfig(libmutter-%{mutter_api}) >= %{mutter_req}
BuildRequires: pkgconfig(libnm) >= 1.10.4
BuildRequires: pkgconfig(libpipewire-0.3)
BuildRequires: pkgconfig(libpulse) >= 2.0
BuildRequires: pkgconfig(libpulse-mainloop-glib)
BuildRequires: pkgconfig(libsecret-1) >= 0.18
BuildRequires: pkgconfig(libsoup-3.0)
BuildRequires: pkgconfig(libstartup-notification-1.0) >= 0.11
BuildRequires: pkgconfig(libsystemd)
BuildRequires: pkgconfig(libxml-2.0)
BuildRequires: pkgconfig(mutter-clutter-%{mutter_api}) >= %{mutter_req}
BuildRequires: pkgconfig(mutter-cogl-%{mutter_api}) >= %{mutter_req}
BuildRequires: pkgconfig(mutter-cogl-pango-%{mutter_api}) >= %{mutter_req}
BuildRequires: pkgconfig(polkit-agent-1) >= 0.100
BuildRequires: pkgconfig(x11)
BuildRequires: python(abi) >= 3
Requires: gdk-pixbuf-loader-rsvg
Requires: gstreamer-plugin-pipewire
# "System settings" menu item
Requires: gnome-control-center
Requires: gnome-session
# For a GSettings schema and power system icon
Requires: gnome-settings-daemon
# "High Contrast" in accessibility status icon
Requires: gnome-themes-accessibility
Requires: gsettings-desktop-schemas
# ScreenSaver needs this.
Requires: gjs >= 1.71.1
Requires: mutter >= %{mutter_req}
Requires: typelib(Soup) = 3.0
Recommends: %{name}-calendar
## Finally, dependencies for session services that are needed for system icons and the user menu
# bluetooth system icon
# (lowered to recommends due to bsc#1067603, some setups without bluetooth might want to avoid this dependency)
Recommends: gnome-bluetooth
# The dateTime applet in the panel launches gnome-clocks upon user request
Recommends: gnome-clocks
# gnome-shell implements the dbus interface org.freedesktop.Notifications directly
Provides: dbus(org.freedesktop.Notifications)
# gnome-shell-browser-plugin dropped in 3.31.4
Obsoletes: gnome-shell-browser-plugin <= %{version}
%description
The GNOME Shell redefines user interactions with the GNOME desktop. In
particular, it offers new paradigms for launching applications, accessing
documents, and organizing open windows in GNOME.
%package devel
Summary: Development files for GNOME Shell
Group: Development/Libraries/GNOME
Requires: %{name} = %{version}
%description devel
The GNOME Shell redefines user interactions with the GNOME desktop. In
particular, it offers new paradigms for launching applications, accessing
documents, and organizing open windows in GNOME.
%package calendar
Summary: Evolution Calendar support for GNOME Shell
Group: System/GUI/GNOME
Requires: %{name} = %{version}
# The clock / calendar applet in the panel requires e-d-s (bnc#795793).
Requires: evolution-data-server
Supplements: (%{name} and evolution-data-server)
%description calendar
This package adds support for Evolution Calendar, such as appointments
into GNOME Shell calendar.
%package -n gnome-extensions
Summary: Extensions app for GNOME Shell
Group: System/GUI/GNOME
Requires: %{name} = %{version}
%description -n gnome-extensions
This package contains an optional extensions app for managing GNOME Shell extensions.
%lang_package
%prep
%autosetup -N
pushd subprojects
tar xf %{SOURCE1}
mv libgnome-volume-control-0.gitmodule gvc
popd
%patch -P 1 -p1
%patch -P 7 -p1
%patch -P 8 -p1
%patch -P 9 -p1
%patch -P 10 -p1
%if 0%{?sle_version}
%patch -P 1001 -p1
%patch -P 1002 -p1
%patch -P 1003 -p1
%patch -P 1004 -p1
%patch -P 1007 -p1
%patch -P 1008 -p1
%patch -P 1009 -p1
%if 0%{?suse_version} > 1500 || 0%{?sle_version} >= 150300
%patch -P 1010 -p1
%patch -P 1011 -p1
%endif
%patch -P 1012 -p1
%patch -P 1013 -p1
%endif
cp %{SOURCE100} data/theme/
%build
%meson \
--libexecdir=%{_libexecdir}/%{name} \
-D gtk_doc=true \
-D man=true \
-D networkmanager=true \
-D systemd=true \
-D tests=false \
%{nil}
%meson_build
%install
%meson_install
# This is the directory where extensions get installed
install -d %{buildroot}%{_datadir}/gnome-shell/extensions
# This is the directory where search providers get installed
install -d %{buildroot}%{_datadir}/gnome-shell/search-providers
%find_lang %{name} %{?no_lang_C}
# Work around race, as reported in bnc#844891 & bgo#709313.
install -d %{buildroot}%{_datadir}/gnome-shell/modes
%fdupes %{buildroot}%{_prefix}
# Not needed, only used for nightly git snapshots
rm -f %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/org.gnome.Extensions.Devel.svg
%python3_fix_shebang
%files
%license COPYING
%doc README.md NEWS
%{_bindir}/gnome-shell
%{_bindir}/gnome-extensions
%{_bindir}/gnome-shell-extension-prefs
%{_bindir}/gnome-shell-extension-tool
%{_bindir}/gnome-shell-test-tool
%dir %{_libdir}/gnome-shell
%dir %{_libexecdir}/gnome-shell
%exclude %{_libexecdir}/gnome-shell/gnome-shell-calendar-server
%{_libexecdir}/gnome-shell/gnome-shell-hotplug-sniffer
%{_libexecdir}/gnome-shell/gnome-shell-perf-helper
%{_libexecdir}/gnome-shell/gnome-shell-portal-helper
%{_libdir}/gnome-shell/Gvc-1.0.typelib
%{_libdir}/gnome-shell/Shell-%{mutter_api}.typelib
%{_libdir}/gnome-shell/St-%{mutter_api}.typelib
%{_libdir}/gnome-shell/libgnome-shell-menu.so
%{_libdir}/gnome-shell/libshell-%{mutter_api}.so
%{_libdir}/gnome-shell/libgvc.so
%{_libdir}/gnome-shell/libst-%{mutter_api}.so
%{_datadir}/applications/org.gnome.Shell.desktop
%{_datadir}/applications/org.gnome.Shell.PortalHelper.desktop
%{_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}/dbus-1/services/org.gnome.Shell.HotplugSniffer.service
%{_datadir}/dbus-1/services/org.gnome.Shell.PortalHelper.service
%{_datadir}/glib-2.0/schemas/org.gnome.Extensions.gschema.xml
%{_datadir}/glib-2.0/schemas/org.gnome.shell.gschema.xml
%{_datadir}/gnome-control-center/keybindings/50-gnome-shell-launchers.xml
%{_datadir}/gnome-control-center/keybindings/50-gnome-shell-system.xml
%{_datadir}/gnome-control-center/keybindings/50-gnome-shell-screenshots.xml
# Own these dirs for extensions, search-providers and work around a race condition
%dir %{_datadir}/gnome-shell/extensions
%dir %{_datadir}/gnome-shell/search-providers
%dir %{_datadir}/gnome-shell/modes
%{_datadir}/gnome-shell/gnome-shell-dbus-interfaces.gresource
%{_datadir}/gnome-shell/gnome-shell-theme.gresource
%{_datadir}/gnome-shell/gnome-shell-osk-layouts.gresource
%{_datadir}/gnome-shell/perf-background.xml
%{_datadir}/gnome-shell/gnome-shell-icons.gresource
%{_mandir}/man?/gnome-shell.?%{ext_man}
%{_userunitdir}/org.gnome.Shell.target
%{_userunitdir}/org.gnome.Shell@wayland.service
%{_userunitdir}/org.gnome.Shell@x11.service
%{_datadir}/glib-2.0/schemas/00_org.gnome.shell.gschema.override
%dir %{_libdir}/gnome-shell/girepository-1.0
%{_libdir}/gnome-shell/girepository-1.0/Shew-0.typelib
%{_libdir}/gnome-shell/libshew-0.so
%{_datadir}/dbus-1/services/org.gnome.Shell.Notifications.service
%{_datadir}/gnome-shell/org.gnome.Shell.Notifications
%{_datadir}/gnome-shell/org.gnome.Shell.Notifications.src.gresource
%{_datadir}/dbus-1/services/org.gnome.Shell.Screencast.service
%{_datadir}/gnome-shell/org.gnome.Shell.Screencast
%{_datadir}/gnome-shell/org.gnome.Shell.Screencast.src.gresource
%{_datadir}/dbus-1/services/org.gnome.ScreenSaver.service
%{_datadir}/gnome-shell/org.gnome.ScreenSaver
%{_datadir}/gnome-shell/org.gnome.ScreenSaver.src.gresource
%{_mandir}/man?/gnome-extensions.?%{ext_man}
%{_datadir}/bash-completion/completions/gnome-extensions
%{_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
%{_datadir}/applications/org.gnome.Shell.Extensions.desktop
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Extensions.xml
%{_datadir}/dbus-1/services/org.gnome.Shell.Extensions.service
%{_datadir}/gnome-shell/org.gnome.Shell.Extensions
%{_datadir}/gnome-shell/org.gnome.Shell.Extensions.src.gresource
%files devel
%doc %{_datadir}/doc/shell/
%doc %{_datadir}/doc/st/
%{_datadir}/gnome-shell/*.gir
%dir %{_datadir}/gnome-shell/gir-1.0
%{_datadir}/gnome-shell/gir-1.0/Shew-0.gir
%files calendar
%{_libexecdir}/gnome-shell/gnome-shell-calendar-server
%{_datadir}/dbus-1/services/org.gnome.Shell.CalendarServer.service
%files -n gnome-extensions
%{_bindir}/gnome-extensions-app
%{_datadir}/applications/org.gnome.Extensions.desktop
%{_datadir}/icons/hicolor/scalable/apps/org.gnome.Extensions.svg
%{_datadir}/icons/hicolor/symbolic/apps/org.gnome.Extensions-symbolic.svg
%{_datadir}/dbus-1/services/org.gnome.Extensions.service
%{_datadir}/gnome-shell/org.gnome.Extensions
%{_datadir}/gnome-shell/org.gnome.Extensions.data.gresource
%{_datadir}/gnome-shell/org.gnome.Extensions.src.gresource
%{_datadir}/metainfo/org.gnome.Extensions.metainfo.xml
%files lang -f %{name}.lang
%changelog

View File

@ -0,0 +1,34 @@
Index: gnome-shell-41.9/js/gdm/loginDialog.js
===================================================================
--- gnome-shell-41.9.orig/js/gdm/loginDialog.js
+++ gnome-shell-41.9/js/gdm/loginDialog.js
@@ -1044,6 +1044,29 @@ var LoginDialog = GObject.registerClass(
}
_onSessionOpened(client, serviceName) {
+ if (this._user.get_num_sessions_anywhere() > 1) {
+ this._authPrompt.setMessage(
+ _('Sorry, you have to log out a previous session first. Multiple logins are not supported.'),
+ GdmUtil.MessageType.ERROR);
+ // TODO: The following logic relies on the unverified fact that
+ // `AuthPrompt::_onVerificationComplete` seems to always run after
+ // current handler. This might root from the interaction between
+ // greeter and verifier, both are external programs.
+ this._authPrompt.verificationStatus = AuthPrompt.AuthPromptStatus.VERIFIED_BUT_FORBIDDEN;
+ this._authPrompt.cancelButton.reactive = true;
+
+ // NOTE: Failed Attempts as references
+ //
+ // NOTE: reset is too heavy, it skips the error prompt all together
+ // this._authPrompt.reset();
+ //
+ // NOTE: Diconnect at this stage is not working
+ //
+ // this._authPrompt._userVerifier.disconnect(this._authPrompt._userVerifierCompleteId);
+
+ return;
+ }
+
this._authPrompt.finish(() => this._startSession(serviceName));
}

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f368b8d57a8f439885d4fefd55f457b6ed2d741d481152f9fb5e504ee23627a3
size 325643

View File

@ -0,0 +1,4 @@
name: libgnome-volume-control
version: 0.gitmodule
mtime: 1715698836
commit: 5f9768a2eac29c1ed56f1fbb449a77a3523683b6

BIN
noise-texture.png (Stored with Git LFS) Normal file

Binary file not shown.