first commit

This commit is contained in:
Ward 2023-02-23 22:01:49 +02:00
commit e9062a564c
57 changed files with 3623 additions and 0 deletions

View File

@ -0,0 +1,61 @@
# Reporting Shell theme changes to Yaru.
Our default theme is Yaru, it means that any changes, especially breaking changes (meaning, changes that can't be done
without a theme update) needs to be coordinated between the gnome-shell updates and Yaru. Probably with a **Breaks:** stenza
in `debian/control`
## What should be reported?
The upstream GNOME Shell `data/theme/` directory is used as a basis for our Yaru GNOME Shell theme so any change made upstream needs to be reflected in our derivative version. Most of the sass files are under the `gnome-shell-sass/` subdirectory.
Note that Yaru has its own `meson.build` file. Changes there shouldn't be in general reported apart if new assets are installed.
It should be a simple assessment in general if you need to do anything on the build system side.
## Structure
Ensure you cloned the Yaru repository via `git clone https://github.com/ubuntu/yaru`. The shell theme is under `gnome-shell`.
It contains two subdirectories:
* `upstream/` is the latest upstream sass source we based on. This is the reference.
* `src` is the Yaru theme, which is `upstream/` + the yaru modifications.
Basically diffing `upstream` and `src` provides you the difference between the default GNOME Shell theme and our Yaru Shell theme.
## Reporting changes
### Checking what to report
Note: you should do that either recursively, or directly on each file that was modified for the new GNOME Shell release.
Basically, you can run: `diff -r yaru/gnome-shell/upstream new-gnome-shell-version/data/theme | lsdiff` to get the list between
latest upstream snapshot in Yaru and current upstream changes.
The easiest way is a 3-way merge diff and manually reporting what makes sense. I personally used `meld` for this and run:
```
$ meld yaru/gnome-shell/upstream/<path_to_modified_file_in_new_version> new-gnome-shell-version/data/theme/<path_to_modified_file_in_new_version> yaru/gnome-shell/src/<path_to_modified_file_in_new_version>
```
Note: as diff, meld can infer the filename (only repeat it once) as long as you point to the correct directory.
You will see a window with 3 columns:
* New changes are visible between the first two columns (diff between old upstream and new upstream). You report them,
as you may see it fit (clicking meld arrow or manually) on the third column.
* Second to third column diff is consequently the new additional delta you are introducing, if needed. It should be most
of the time be null (no diff) or minimal once you are done.
Commit all those changes, don't forget the svg assets.
### Taking a new upstream snapshot
Once done, snapshot the new GNOME Shell upstream directory we based our changes on for the next Shell update involving a new 3 way merge:
```
$ rm -r yaru/gnome-shell/upstream/
$ cp -a new-gnome-shell-version/data/theme/ yaru/gnome-shell/upstream/
```
### Changing package coordination
Once again, if the changes are breaking, updates the **Breaks:** or other fields between **gnome-shell** and
**yaru-theme-gnome-shell** to ensure people are getting both updates simultaneously.
### Submitting
Commit that, and submit a MP against https://github.com/ubuntu/yaru.

View File

@ -0,0 +1,11 @@
gnome-shell-vrr (43.0-99pika5) kinetic; urgency=medium
* Fix gschema.
-- Ward Nakchbandi <hotrod.master@hotmail.com> Fri, 07 Oct 2022 23:26:00 +0300
gnome-shell-vrr (43.0-99pika4) kinetic; urgency=medium
* Initial Release.
-- Ward Nakchbandi <hotrod.master@hotmail.com> Fri, 07 Oct 2022 23:26:00 +0300

View File

@ -0,0 +1 @@
debian/home/

View File

@ -0,0 +1,196 @@
# This file is autogenerated. DO NOT EDIT!
#
# Modifications should be made to debian/control.in instead.
# This file is regenerated automatically in the clean target.
# This file is autogenerated. DO NOT EDIT!
#
# Modifications should be made to debian/control.in instead.
# This file is regenerated automatically in the clean target.
# This file is autogenerated. DO NOT EDIT!
#
# Modifications should be made to debian/control.in instead.
# This file is regenerated automatically in the clean target.
Source: gnome-shell-vrr
Section: gnome
Priority: optional
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Uploaders: Jeremy Bicha <jbicha@ubuntu.com>
Build-Depends: appstream,
asciidoc-base,
bash-completion,
dbus <!nocheck>,
debhelper-compat (= 13),
dh-sequence-gir,
dh-sequence-gnome,
gjs,
gir1.2-accountsservice-1.0 <!nocheck>,
gir1.2-gdm-1.0 (>= 3.18.2) <!nocheck>,
gir1.2-geoclue-2.0 <!nocheck>,
gir1.2-gnomedesktop-3.0 (>= 3.35.90) <!nocheck>,
gir1.2-gweather-4.0 (>= 4.1) <!nocheck>,
gir1.2-rsvg-2.0 <!nocheck>,
gir1.2-upowerglib-1.0 <!nocheck>,
gnome-control-center-dev (>= 1:3.4),
gnome-pkg-tools (>= 0.11),
gnome-settings-daemon-common (>= 40~) <!nocheck>,
gobject-introspection (>= 1.49.1),
gsettings-desktop-schemas-dev (>= 42~beta),
gtk-doc-tools,
libasound2-dev,
libatk-bridge2.0-dev,
libecal2.0-dev (>= 3.45),
libedataserver1.2-dev (>= 3.45),
libgcr-3-dev (>= 3.7.5),
libgirepository1.0-dev (>= 1.29.15),
libgjs-dev (>= 1.73.1),
libgl1-mesa-dri <!nocheck>,
libglib2.0-dev (>= 2.57.2),
libgnome-autoar-0-dev,
libgnome-bluetooth-3.0-dev (>= 3.9.0) [linux-any],
libgnome-desktop-3-dev (>= 3.35.90),
libgnome-menu-3-dev,
libgstreamer1.0-dev (>= 0.11.92),
libgstreamer-plugins-base1.0-dev,
libgtk-3-bin,
libgtk-3-dev (>= 3.21.6),
libgtk-4-dev,
libibus-1.0-dev (>= 1.5.22-2ubuntu2~),
libjson-glib-dev,
libnm-dev (>= 1.10.4) [linux-any],
libpipewire-0.3-dev (>= 0.3.10) [linux-any],
libpolkit-agent-1-dev (>= 0.100),
libpulse-dev (>= 13),
libsecret-1-dev,
libstartup-notification0-dev (>= 0.11),
libsystemd-dev [linux-any],
libx11-dev,
libxfixes-dev,
libxml2-dev,
mesa-common-dev,
meson (>= 0.58.0),
mutter-vrr,
pkg-config (>= 0.22),
sassc,
systemd [linux-any],
xauth <!nocheck>,
xvfb <!nocheck>,
xwayland <!nocheck>
Rules-Requires-Root: no
Standards-Version: 4.6.1
Homepage: https://wiki.gnome.org/Projects/GnomeShell
XS-Debian-Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell.git
XS-Debian-Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell
Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell.git -b ubuntu/master
Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell/tree/ubuntu/master
Package: gnome-shell-vrr
Architecture: linux-any
Depends: gir1.2-accountsservice-1.0,
gir1.2-adw-1,
gir1.2-atk-1.0,
gir1.2-atspi-2.0 (>= 2.36),
gir1.2-gcr-3 (>= 3.7.5),
gir1.2-gdesktopenums-3.0 (>= 3.12),
gir1.2-gdkpixbuf-2.0,
gir1.2-gdm-1.0 (>= 3.18.2),
gir1.2-geoclue-2.0,
gir1.2-glib-2.0 (>= 1.56.0),
gir1.2-gnomebluetooth-3.0 (>= 3.12.0) [linux-any],
gir1.2-gnomedesktop-3.0 (>= 3.35.90),
gir1.2-graphene-1.0 (>= 1.10.2),
gir1.2-gstreamer-1.0,
gir1.2-gtk-3.0 (>= 3.16),
gir1.2-gtk-4.0,
gir1.2-gweather-4.0 (>= 4.1),
gir1.2-freedesktop,
gir1.2-ibus-1.0 (>= 1.5.22-2ubuntu2~),
gir1.2-nm-1.0 [linux-any],
gir1.2-nma-1.0 [linux-any],
gir1.2-pango-1.0,
gir1.2-polkit-1.0,
gir1.2-rsvg-2.0,
gir1.2-soup-3.0,
gir1.2-upowerglib-1.0 (>= 0.99),
gir1.2-webkit2-4.1,
mutter-vrr,
gnome-settings-daemon (>= 40~),
gnome-shell-common-vrr (= ${source:Version}),
gsettings-desktop-schemas (>= 42~beta),
gstreamer1.0-pipewire (>= 0.3.10) [linux-any],
libglib2.0-bin (>= 2.53.0),
python3,
ubuntu-wallpapers,
${gir:Depends},
${misc:Depends},
${shlibs:Depends}
Recommends: bolt (>= 0.3),
evolution-data-server (>= 3.45),
gdm3 (>= 3.10.0.1-3~),
gkbd-capplet,
gnome-control-center (>= 1:42),
gnome-remote-desktop,
gnome-menus,
gnome-user-docs,
ibus,
iio-sensor-proxy,
power-profiles-daemon,
switcheroo-control,
ubuntu-session | gnome-session,
xserver-xorg-legacy,
unzip
Suggests: gir1.2-malcontent-0 (>= 0.6.0) [linux-any],
gir1.2-telepathyglib-0.12,
gir1.2-telepathylogger-0.2 (>= 0.8.0),
gnome-backgrounds (>= 3.13.90),
gnome-shell-extension-prefs,
chrome-gnome-shell,
Breaks: gnome-shell-extension-appindicator (<< 36),
gnome-shell-extension-autohidetopbar (<< 20180511-2~),
gnome-shell-extension-caffeine (<< 0~git20171229-3~),
gnome-shell-extension-dash-to-panel (<< 43),
gnome-shell-extension-dashtodock (<< 70),
gnome-shell-extension-desktop-icons (<< 21.04),
gnome-shell-extension-desktop-icons-ng (<< 0.16.0~),
gnome-shell-extension-multi-monitors (<< 0.00~git20171014.1.df5d6e4-1.1~),
gnome-shell-extension-pixelsaver (<< 1.10+git20161217-49f47bf-1.1~),
gnome-shell-extension-taskbar (<< 57.0-2.1~),
gnome-shell-extension-top-icons-plus (<< 27-3~),
gnome-shell-extension-workspaces-to-dock (<< 54~),
gnome-shell-extensions (<< 40.0~),
gnome-shell-pomodoro (<< 0.13.4-2.1~),
Provides: notification-daemon,
polkit-1-auth-agent
Description: graphical shell for the GNOME desktop
The GNOME Shell provides core interface functions like switching
windows, launching applications or see your notifications. It takes
advantage of the capabilities of modern graphics hardware and
introduces innovative user interface concepts to provide a
delightful and easy to use experience. GNOME Shell is the defining
technology of the GNOME 3 user experience.
Package: gnome-shell-common-vrr
Architecture: all
Depends: ${misc:Depends}
Breaks: gnome-shell-vrr (<< 3.36.1-6~)
Replaces: gnome-shell-vrr (<< 3.36.1-6~)
Description: common files for the GNOME graphical shell
This package contains translations and data files for the GNOME shell.
Package: gnome-shell-extension-prefs-vrr
Architecture: linux-any
Depends: gir1.2-adw-1,
gir1.2-gtk-4.0,
gjs (>= 1.73.1),
gnome-shell-vrr (= ${binary:Version}),
gnome-shell-common-vrr (= ${source:Version}),
${gir:Depends},
${misc:Depends},
${shlibs:Depends}
Provides: gnome-extensions-app
Recommends: chrome-gnome-shell
Breaks: gnome-shell-vrr (<< 3.36.0-2)
Replaces: gnome-shell-vrr (<< 3.36.0-2)
Description: tool to enable / disable GNOME Shell extensions
This package contains a tool which users who use Shell extensions can use to
toggle them on and off, and access their preferences.

View File

@ -0,0 +1,192 @@
# This file is autogenerated. DO NOT EDIT!
#
# Modifications should be made to debian/control.in instead.
# This file is regenerated automatically in the clean target.
# This file is autogenerated. DO NOT EDIT!
#
# Modifications should be made to debian/control.in instead.
# This file is regenerated automatically in the clean target.
Source: gnome-shell-vrr
Section: gnome
Priority: optional
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Uploaders: Jeremy Bicha <jbicha@ubuntu.com>
Build-Depends: appstream,
asciidoc-base,
bash-completion,
dbus <!nocheck>,
debhelper-compat (= 13),
dh-sequence-gir,
dh-sequence-gnome,
gjs,
gir1.2-accountsservice-1.0 <!nocheck>,
gir1.2-gdm-1.0 (>= 3.18.2) <!nocheck>,
gir1.2-geoclue-2.0 <!nocheck>,
gir1.2-gnomedesktop-3.0 (>= 3.35.90) <!nocheck>,
gir1.2-gweather-4.0 (>= 4.1) <!nocheck>,
gir1.2-rsvg-2.0 <!nocheck>,
gir1.2-upowerglib-1.0 <!nocheck>,
gnome-control-center-dev (>= 1:3.4),
gnome-pkg-tools (>= 0.11),
gnome-settings-daemon-common (>= 40~) <!nocheck>,
gobject-introspection (>= 1.49.1),
gsettings-desktop-schemas-dev (>= 42~beta),
gtk-doc-tools,
libasound2-dev,
libatk-bridge2.0-dev,
libecal2.0-dev (>= 3.45),
libedataserver1.2-dev (>= 3.45),
libgcr-3-dev (>= 3.7.5),
libgirepository1.0-dev (>= 1.29.15),
libgjs-dev (>= 1.73.1),
libgl1-mesa-dri <!nocheck>,
libglib2.0-dev (>= 2.57.2),
libgnome-autoar-0-dev,
libgnome-bluetooth-3.0-dev (>= 3.9.0) [linux-any],
libgnome-desktop-3-dev (>= 3.35.90),
libgnome-menu-3-dev,
libgstreamer1.0-dev (>= 0.11.92),
libgstreamer-plugins-base1.0-dev,
libgtk-3-bin,
libgtk-3-dev (>= 3.21.6),
libgtk-4-dev,
libibus-1.0-dev (>= 1.5.22-2ubuntu2~),
libjson-glib-dev,
libnm-dev (>= 1.10.4) [linux-any],
libpipewire-0.3-dev (>= 0.3.10) [linux-any],
libpolkit-agent-1-dev (>= 0.100),
libpulse-dev (>= 13),
libsecret-1-dev,
libstartup-notification0-dev (>= 0.11),
libsystemd-dev [linux-any],
libx11-dev,
libxfixes-dev,
libxml2-dev,
mesa-common-dev,
meson (>= 0.58.0),
mutter-vrr,
pkg-config (>= 0.22),
sassc,
systemd [linux-any],
xauth <!nocheck>,
xvfb <!nocheck>,
xwayland <!nocheck>
Rules-Requires-Root: no
Standards-Version: 4.6.1
Homepage: https://wiki.gnome.org/Projects/GnomeShell
XS-Debian-Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell.git
XS-Debian-Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell
Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell.git -b ubuntu/master
Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell/tree/ubuntu/master
Package: gnome-shell-vrr
Architecture: linux-any
Depends: gir1.2-accountsservice-1.0,
gir1.2-adw-1,
gir1.2-atk-1.0,
gir1.2-atspi-2.0 (>= 2.36),
gir1.2-gcr-3 (>= 3.7.5),
gir1.2-gdesktopenums-3.0 (>= 3.12),
gir1.2-gdkpixbuf-2.0,
gir1.2-gdm-1.0 (>= 3.18.2),
gir1.2-geoclue-2.0,
gir1.2-glib-2.0 (>= 1.56.0),
gir1.2-gnomebluetooth-3.0 (>= 3.12.0) [linux-any],
gir1.2-gnomedesktop-3.0 (>= 3.35.90),
gir1.2-graphene-1.0 (>= 1.10.2),
gir1.2-gstreamer-1.0,
gir1.2-gtk-3.0 (>= 3.16),
gir1.2-gtk-4.0,
gir1.2-gweather-4.0 (>= 4.1),
gir1.2-freedesktop,
gir1.2-ibus-1.0 (>= 1.5.22-2ubuntu2~),
gir1.2-nm-1.0 [linux-any],
gir1.2-nma-1.0 [linux-any],
gir1.2-pango-1.0,
gir1.2-polkit-1.0,
gir1.2-rsvg-2.0,
gir1.2-soup-3.0,
gir1.2-upowerglib-1.0 (>= 0.99),
gir1.2-webkit2-4.1,
mutter-vrr,
gnome-settings-daemon (>= 40~),
gnome-shell-common-vrr (= ${source:Version}),
gsettings-desktop-schemas (>= 42~beta),
gstreamer1.0-pipewire (>= 0.3.10) [linux-any],
libglib2.0-bin (>= 2.53.0),
python3,
ubuntu-wallpapers,
${gir:Depends},
${misc:Depends},
${shlibs:Depends}
Recommends: bolt (>= 0.3),
evolution-data-server (>= 3.45),
gdm3 (>= 3.10.0.1-3~),
gkbd-capplet,
gnome-control-center (>= 1:42),
gnome-remote-desktop,
gnome-menus,
gnome-user-docs,
ibus,
iio-sensor-proxy,
power-profiles-daemon,
switcheroo-control,
ubuntu-session | gnome-session,
xserver-xorg-legacy,
unzip
Suggests: gir1.2-malcontent-0 (>= 0.6.0) [linux-any],
gir1.2-telepathyglib-0.12,
gir1.2-telepathylogger-0.2 (>= 0.8.0),
gnome-backgrounds (>= 3.13.90),
gnome-shell-extension-prefs,
chrome-gnome-shell,
Breaks: gnome-shell-extension-appindicator (<< 36),
gnome-shell-extension-autohidetopbar (<< 20180511-2~),
gnome-shell-extension-caffeine (<< 0~git20171229-3~),
gnome-shell-extension-dash-to-panel (<< 43),
gnome-shell-extension-dashtodock (<< 70),
gnome-shell-extension-desktop-icons (<< 21.04),
gnome-shell-extension-desktop-icons-ng (<< 0.16.0~),
gnome-shell-extension-multi-monitors (<< 0.00~git20171014.1.df5d6e4-1.1~),
gnome-shell-extension-pixelsaver (<< 1.10+git20161217-49f47bf-1.1~),
gnome-shell-extension-taskbar (<< 57.0-2.1~),
gnome-shell-extension-top-icons-plus (<< 27-3~),
gnome-shell-extension-workspaces-to-dock (<< 54~),
gnome-shell-extensions (<< 40.0~),
gnome-shell-pomodoro (<< 0.13.4-2.1~),
Provides: notification-daemon,
polkit-1-auth-agent
Description: graphical shell for the GNOME desktop
The GNOME Shell provides core interface functions like switching
windows, launching applications or see your notifications. It takes
advantage of the capabilities of modern graphics hardware and
introduces innovative user interface concepts to provide a
delightful and easy to use experience. GNOME Shell is the defining
technology of the GNOME 3 user experience.
Package: gnome-shell-common-vrr
Architecture: all
Depends: ${misc:Depends}
Breaks: gnome-shell-vrr (<< 3.36.1-6~)
Replaces: gnome-shell-vrr (<< 3.36.1-6~)
Description: common files for the GNOME graphical shell
This package contains translations and data files for the GNOME shell.
Package: gnome-shell-extension-prefs-vrr
Architecture: linux-any
Depends: gir1.2-adw-1,
gir1.2-gtk-4.0,
gjs (>= 1.73.1),
gnome-shell-vrr (= ${binary:Version}),
gnome-shell-common-vrr (= ${source:Version}),
${gir:Depends},
${misc:Depends},
${shlibs:Depends}
Provides: gnome-extensions-app
Recommends: chrome-gnome-shell
Breaks: gnome-shell-vrr (<< 3.36.0-2)
Replaces: gnome-shell-vrr (<< 3.36.0-2)
Description: tool to enable / disable GNOME Shell extensions
This package contains a tool which users who use Shell extensions can use to
toggle them on and off, and access their preferences.

View File

@ -0,0 +1,52 @@
This package was debianized by Sebastien Bacher <seb128@ubuntu.com> on
Wed, 01 Jul 2009 23:29:31 +0200.
It was downloaded from https://download.gnome.org/sources/gnome-shell/
Upstream Authors:
Colin Walters
Dan Winship
Marina Zhurakhinskaya
Owen Taylor
William Jon McCann
Files: src/*
js/*
Copyright: © 2000 Helix Code, Inc.
© 2000,2001 Eazel, Inc.
© 2001 George Lebl
© 2002 Sun Microsystems Inc.
© 2004-2005 James M. Cape <jcape@ignore-your.tv>
© 2006-2008 Red Hat, Inc.
© 2007 Ryan Lortie
© 2008 Intel Corp.
License: GPL-2+ (/usr/share/common-licenses/GPL-2)
Files: src/gdmuser/*
Copyright: © 2007-2008 William Jon McCann <mccann@jhu.edu>
© 2004-2005 James M. Cape <jcape@ignore-your.tv>
License: LGPL-2+ (/usr/share/common-licenses/LGPL-2)
Files: src/tray/*
Copyright: © 2002 Anders Carlsson <andersca@gnu.org>
© 2003-2006 Vincent Untz
© 2008 Red Hat, Inc.
Files: src/big/*
Copyright: © 2005-2008 Red Hat, Inc.
© 2008-2009 litl, LLC
Files: src/st/*
Copyright: © 2008 OpenedHand
© 2009 Intel Corporation.
© 2003-2004 Dodji Seketeli
License: LGPL-2.1 (/usr/share/common-licenses/LGPL-2.1)
The Debian packaging is:
Copyright © 2009 Sebastien Bacher <seb128@ubuntu.com>
Copyright © 2009 Collabora Ltd.
and is licensed under the GPL version 3,
see `/usr/share/common-licenses/GPL-3'.

View File

@ -0,0 +1 @@
GSETTINGS_SCHEMA_DIR="/opt/mutter-vrr/share/glib-2.0/schemas:$GSETTINGS_SCHEMA_DIR" LD_LIBRARY_PATH="/opt/mutter-vrr/lib/x86_64-linux-gnu:/opt/mutter-vrr/lib/x86_64-linux-gnu/mutter-11:/opt/mutter-vrr/lib/x86_64-linux-gnu/mutter-11/plugins:$LD_LIBRARY_PATH" PATH="/opt/mutter-vrr/bin:$PATH" /opt/mutter-vrr/bin/gnome-shell $@

View File

@ -0,0 +1,14 @@
[Desktop Entry]
Type=Application
Name=GNOME VRR Shell
Comment=Window management and application launching
Exec=/usr/bin/gnome-shell-vrr
Categories=GNOME;GTK;Core;
OnlyShowIn=GNOME;
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer
X-GNOME-Provides=panel;windowmanager;
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=false
X-GNOME-HiddenUnderSystemd=true
X-Ubuntu-Gettext-Domain=gnome-shell

View File

@ -0,0 +1,18 @@
[DEFAULT]
pristine-tar = True
debian-branch=ubuntu/master
debian-tag=ubuntu/%(version)s
upstream-branch = upstream/latest
[buildpackage]
sign-tags = True
[dch]
multimaint-merge = True
[import-orig]
postimport = dch -v%(version)s New upstream release; git add debian/changelog; debcommit
upstream-vcs-tag = %(version%~%.)s
[pq]
patch-numbers = False

View File

@ -0,0 +1,7 @@
opt/mutter-vrr/lib/systemd/user
opt/mutter-vrr/share/dbus-1/interfaces
opt/mutter-vrr/share/glib-2.0
opt/mutter-vrr/share/gnome-control-center
opt/mutter-vrr/share/gnome-shell
opt/mutter-vrr/share/icons/hicolor/*/apps/*
opt/mutter-vrr/share/locale

View File

@ -0,0 +1,2 @@
glib-compile-schemas /opt/mutter-vrr/share/glib-2.0/schemas/

View File

@ -0,0 +1,2 @@
glib-compile-schemas /opt/mutter-vrr/share/glib-2.0/schemas/

View File

@ -0,0 +1,4 @@
opt/mutter-vrr/bin/gnome-extensions-app
opt/mutter-vrr/bin/gnome-shell-extension-prefs
opt/mutter-vrr/share/applications/org.gnome.Extensions.desktop
opt/mutter-vrr/share/metainfo/org.gnome.Extensions.metainfo.xml

View File

@ -0,0 +1,2 @@
report-with: gnome-session gnome-settings-daemon libgjs0g libmutter-11-0
package-status: libegl-vendor libglx-vendor libgl1-mesa-dri

View File

@ -0,0 +1,2 @@
NEWS
README.md

View File

@ -0,0 +1,2 @@
[org.gnome.shell]
favorite-apps=[ 'firefox-esr.desktop', 'org.gnome.Evolution.desktop', 'rhythmbox.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop' ]

View File

@ -0,0 +1,14 @@
opt/mutter-vrr/bin/gnome-extensions
opt/mutter-vrr/bin/gnome-shell
opt/mutter-vrr/bin/gnome-shell-extension-tool
opt/mutter-vrr/bin/gnome-shell-perf-tool
opt/mutter-vrr/lib/gnome-shell
opt/mutter-vrr/libexec
opt/mutter-vrr/share/applications/evolution-calendar.desktop
opt/mutter-vrr/share/applications/org.gnome.Shell*.desktop
opt/mutter-vrr/share/bash-completion/completions/gnome-extensions
opt/mutter-vrr/share/dbus-1/services
opt/mutter-vrr/share/man
opt/mutter-vrr/share/xdg-desktop-portal
debian/extras/gnome-shell-vrr usr/bin/
debian/extras/gnome-vrr.Shell.desktop usr/share/applications

View File

@ -0,0 +1,16 @@
# These RUNPATHs are needed to find mutter's private clutter fork
gnome-shell: custom-library-search-path opt/mutter-vrr/bin/gnome-shell RUNPATH opt/mutter-vrr/lib/*/mutter-*/
gnome-shell: custom-library-search-path opt/mutter-vrr/lib/gnome-shell/*.so RUNPATH opt/mutter-vrr/lib/*/mutter-*/
# This is just a launcher for a desktop-required component (evolution)
gnome-shell: desktop-command-not-in-package opt/mutter-vrr/share/applications/evolution-calendar.desktop evolution
# gnome-shell ships some desktop files only to provide metadata and icons to some apps
gnome-shell: desktop-command-not-in-package opt/mutter-vrr/share/applications/org.gnome.Shell.Extensions.desktop false
gnome-shell: desktop-command-not-in-package opt/mutter-vrr/share/applications/org.gnome.Shell.PortalHelper.desktop gapplication
# This is a NoDisplay=true desktop file, so there's no need for it
gnome-shell: desktop-entry-lacks-main-category opt/mutter-vrr/share/applications/org.gnome.Shell.desktop
# Conceptually a program, only built as a shared library for technical reasons
gnome-shell: exit-in-shared-library opt/mutter-vrr/lib/gnome-shell/libgnome-shell.so

View File

@ -0,0 +1,105 @@
From: Jeremy Bicha <jeremy.bicha@canonical.com>
Date: Sun, 21 Aug 2022 10:30:55 -0400
Subject: Revert "build: Port to gcr4"
This reverts commit 5c935af7d3b3a3c9feb4e0d9ea214b6d25a7a2e7.
---
js/ui/environment.js | 2 +-
meson.build | 4 ++--
src/meson.build | 2 +-
src/shell-keyring-prompt.c | 6 +++---
src/shell-secure-text-buffer.c | 2 +-
5 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/js/ui/environment.js b/js/ui/environment.js
index 4853a83..83df7bc 100644
--- a/js/ui/environment.js
+++ b/js/ui/environment.js
@@ -8,7 +8,7 @@ imports.gi.versions.Atk = '1.0';
imports.gi.versions.Atspi = '2.0';
imports.gi.versions.Clutter = Config.LIBMUTTER_API_VERSION;
imports.gi.versions.Cogl = Config.LIBMUTTER_API_VERSION;
-imports.gi.versions.Gcr = '4';
+imports.gi.versions.Gcr = '3';
imports.gi.versions.Gdk = '3.0';
imports.gi.versions.Gdm = '1.0';
imports.gi.versions.Geoclue = '2.0';
diff --git a/meson.build b/meson.build
index f071c2c..d7cb0ce 100644
--- a/meson.build
+++ b/meson.build
@@ -20,7 +20,7 @@ libmutter_test_pc = 'libmutter-test-' + mutter_api_version
ecal_req = '>= 3.33.1'
eds_req = '>= 3.33.1'
-gcr_req = '>= 3.90.0'
+gcr_req = '>= 3.7.5'
gio_req = '>= 2.56.0'
gi_req = '>= 1.49.1'
gjs_req = '>= 1.73.1'
@@ -71,7 +71,7 @@ endif
atk_bridge_dep = dependency('atk-bridge-2.0')
ecal_dep = dependency('libecal-2.0', version: ecal_req)
eds_dep = dependency('libedataserver-1.2', version: eds_req)
-gcr_dep = dependency('gcr-4', version: gcr_req)
+gcr_dep = dependency('gcr-base-3', version: gcr_req)
gdk_x11_dep = dependency('gdk-x11-3.0')
gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0')
gi_dep = dependency('gobject-introspection-1.0', version: gi_req)
diff --git a/src/meson.build b/src/meson.build
index fc7f8bf..e9ad569 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -215,7 +215,7 @@ libshell_dep = declare_dependency(link_with: libshell)
libshell_gir_includes = [
'Clutter-@0@'.format(mutter_api_version),
'Meta-@0@'.format(mutter_api_version),
- 'Gcr-4',
+ 'Gcr-3',
'PolkitAgent-1.0'
]
diff --git a/src/shell-keyring-prompt.c b/src/shell-keyring-prompt.c
index bb03279..83c6746 100644
--- a/src/shell-keyring-prompt.c
+++ b/src/shell-keyring-prompt.c
@@ -26,7 +26,7 @@
#include "shell-secure-text-buffer.h"
#define GCR_API_SUBJECT_TO_CHANGE
-#include <gcr/gcr.h>
+#include <gcr/gcr-base.h>
#include <glib/gi18n.h>
@@ -91,7 +91,7 @@ enum {
static GParamSpec *props[N_PROPS] = { NULL, };
-static void shell_keyring_prompt_iface (GcrPromptInterface *iface);
+static void shell_keyring_prompt_iface (GcrPromptIface *iface);
G_DEFINE_TYPE_WITH_CODE (ShellKeyringPrompt, shell_keyring_prompt, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, shell_keyring_prompt_iface);
@@ -531,7 +531,7 @@ shell_keyring_prompt_close (GcrPrompt *prompt)
}
static void
-shell_keyring_prompt_iface (GcrPromptInterface *iface)
+shell_keyring_prompt_iface (GcrPromptIface *iface)
{
iface->prompt_password_async = shell_keyring_prompt_password_async;
iface->prompt_password_finish = shell_keyring_prompt_password_finish;
diff --git a/src/shell-secure-text-buffer.c b/src/shell-secure-text-buffer.c
index 8271410..03af451 100644
--- a/src/shell-secure-text-buffer.c
+++ b/src/shell-secure-text-buffer.c
@@ -26,7 +26,7 @@
#include "shell-secure-text-buffer.h"
#define GCR_API_SUBJECT_TO_CHANGE
-#include <gcr/gcr.h>
+#include <gcr/gcr-base.h>
#include <string.h>

View File

@ -0,0 +1,95 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Fri, 1 Apr 2022 02:41:07 +0200
Subject: Revert "st: Apply css foreground color to text as a PangoAttribute"
Using the pango foreground color implies that such part will have a
color set at pango level and so that cogl will use this value as a
color override (as per cogl_pango_renderer_set_color_for_part()).
This is fine for most labels, but in case the clutter-text has the
selected text color set, it is simply ignored, because the overridden
color is always preferred.
Also the reason for this commit, was not to apply colors on top of
colored fonts, but this won't happen anymore now because mutter's commit
aa136f45 ensures that no color will be applied to glyphs that are
already colored.
So to me it looks that's just safer to revert it, instead of adding
different logic to handle the selected-text-color case.
This reverts commit 66c4b1a8b607600f193b34e6a9f8c85f76c2ac2c.
Origin: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2260
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1878998
---
src/st/st-entry.c | 2 ++
src/st/st-private.c | 32 ++++++++++++++++++++++++++------
2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/src/st/st-entry.c b/src/st/st-entry.c
index 64f85fd..d45ce95 100644
--- a/src/st/st-entry.c
+++ b/src/st/st-entry.c
@@ -1095,6 +1095,8 @@ st_entry_init (StEntry *entry)
g_signal_connect (priv->entry, "notify::line-alignment",
G_CALLBACK (invalidate_shadow_pipeline), entry);
+ g_signal_connect_swapped (priv->entry, "notify::editable",
+ G_CALLBACK (st_widget_style_changed), entry);
priv->spacing = 6.0f;
diff --git a/src/st/st-private.c b/src/st/st-private.c
index bb98151..1b70c5e 100644
--- a/src/st/st-private.c
+++ b/src/st/st-private.c
@@ -115,22 +115,42 @@ _st_set_text_from_style (ClutterText *text,
StTextDecoration decoration;
PangoAttrList *attribs = NULL;
const PangoFontDescription *font;
- PangoAttribute *foreground;
StTextAlign align;
gdouble spacing;
gchar *font_features;
+ gboolean foreground_color_set;
font = st_theme_node_get_font (theme_node);
clutter_text_set_font_description (text, (PangoFontDescription *) font);
attribs = pango_attr_list_new ();
+ foreground_color_set = FALSE;
st_theme_node_get_foreground_color (theme_node, &color);
- clutter_text_set_cursor_color (text, &color);
- foreground = pango_attr_foreground_new (color.red * 255,
- color.green * 255,
- color.blue * 255);
- pango_attr_list_insert (attribs, foreground);
+
+ if (clutter_text_get_editable (text))
+ {
+ ClutterColor selected_color;
+
+ if (st_theme_node_lookup_color (theme_node, "selected-color",
+ TRUE, &selected_color) &&
+ !clutter_color_equal (&selected_color, &color))
+ {
+ clutter_text_set_color (text, &color);
+ clutter_text_set_cursor_color (text, &color);
+ foreground_color_set = TRUE;
+ }
+ }
+
+ if (!foreground_color_set)
+ {
+ PangoAttribute *foreground;
+ clutter_text_set_cursor_color (text, &color);
+ foreground = pango_attr_foreground_new (color.red * 255,
+ color.green * 255,
+ color.blue * 255);
+ pango_attr_list_insert (attribs, foreground);
+ }
if (color.alpha != 255)
{

View File

@ -0,0 +1,62 @@
From: Bastien Nocera <hadess@hadess.net>
Date: Thu, 15 Sep 2022 18:03:22 +0200
Subject: bluetooth: Show the Bluetooth switch in more cases
In older versions of GNOME, when a menu was used for Bluetooth devices,
we tried to avoid showing the Bluetooth menu to folks who didn't use
Bluetooth.
This kept causing problems as the menu would disappear if no
devices were setup and the platform "airplane mode" removed the
Bluetooth device from the USB bus, making it impossible to detect
whether a Bluetooth device existed, compared to a user unplugging a
removable Bluetooth device.
Closes: #5749
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2488>
(cherry picked from commit 57aa91e2b3f129ff12c6f87146096708e9ac2867)
---
js/ui/status/bluetooth.js | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/js/ui/status/bluetooth.js b/js/ui/status/bluetooth.js
index d4de597..f5ed177 100644
--- a/js/ui/status/bluetooth.js
+++ b/js/ui/status/bluetooth.js
@@ -64,7 +64,10 @@ const BtClient = GObject.registerClass({
g_interface_info: rfkillManagerInfo,
});
this._proxy.connect('g-properties-changed', (p, properties) => {
- if ('BluetoothHardwareAirplaneMode' in properties.unpack())
+ const changedProperties = properties.unpack();
+ if ('BluetoothHardwareAirplaneMode' in changedProperties)
+ this.notify('available');
+ else if ('BluetoothHasAirplaneMode' in changedProperties)
this.notify('available');
});
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null)
@@ -79,21 +82,19 @@ const BtClient = GObject.registerClass({
this._connectDeviceNotify(deviceStore.get_item(i));
this._client.connect('device-removed', (c, path) => {
- this._syncHadSetupDevices();
this._deviceNotifyConnected.delete(path);
this.emit('devices-changed');
});
this._client.connect('device-added', (c, device) => {
- this._syncHadSetupDevices();
this._connectDeviceNotify(device);
this.emit('devices-changed');
});
}
get available() {
- // If there were set up devices, assume there is an adapter
- // that can be powered on as long as we're not hard blocked
- return this._hadSetupDevices
+ // If we have an rfkill switch, make sure it's not a hardware
+ // one as we can't get out of it in software
+ return this._proxy.BluetoothHasAirplaneMode
? !this._proxy.BluetoothHardwareAirplaneMode
: this.active;
}

View File

@ -0,0 +1,27 @@
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
Date: Wed, 12 Oct 2022 14:47:19 +0800
Subject: config: Assume screen recording is always available
Which is safer than calling gst_init_check() as it may deadlock when it
spawns client `gst-plugin-scanner` which then tries to connect back to
us (for some plugins like gstvaapi).
Fixes: https://launchpad.net/bugs/1988488
---
js/misc/config.js.in | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/js/misc/config.js.in b/js/misc/config.js.in
index 7fc0e63..5092c1e 100644
--- a/js/misc/config.js.in
+++ b/js/misc/config.js.in
@@ -21,8 +21,4 @@ var LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@'
var HAVE_BLUETOOTH = pkg.checkSymbol('GnomeBluetooth', '3.0',
'Client.default_adapter_state')
-var HAVE_RECORDER =
- pkg.checkSymbol('Gst', '1.0') &&
- imports.gi.Gst.init_check(null) &&
- imports.gi.Gst.ElementFactory.find('pipewiresrc') &&
- imports.gi.Gst.ElementFactory.find('filesrc');
+var HAVE_RECORDER = true;

View File

@ -0,0 +1,32 @@
From: Simon McVittie <smcv@debian.org>
Date: Sun, 12 Sep 2021 10:41:54 +0100
Subject: gnome-shell-extension-prefs: Give Debian-specific advice
We package gnome-extensions-app in the same binary package as
gnome-shell-extension-prefs, so there's never a need to download it from
Flathub.
Forwarded: not-needed, Debian-specific
Signed-off-by: Simon McVittie <smcv@debian.org>
---
src/gnome-shell-extension-prefs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/gnome-shell-extension-prefs b/src/gnome-shell-extension-prefs
index 303b196..a59ffed 100755
--- a/src/gnome-shell-extension-prefs
+++ b/src/gnome-shell-extension-prefs
@@ -13,10 +13,10 @@ openPrefs() {
}
cat >&2 <<EOT
-gnome-shell-extension-prefs is deprecated
+The gnome-shell-extension-prefs program is deprecated.
-Install https://flathub.org/apps/details/org.gnome.Extensions for extension
-management, or use the gnome-extensions command line tool.
+Run gnome-extensions-app (from the gnome-shell-extension-prefs package)
+for extension management, or use the gnome-extensions command line tool.
Extensions can use the ExtensionUtils.openPrefs() method.
EOT

View File

@ -0,0 +1,248 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Tue, 1 Mar 2022 11:57:20 +0100
Subject: gmd/util: Only start fingerprint service synchronously when it's
default
On ShellUserVerifier construction we used to start fprintd in a sync
fashion all the times, however in case the daemon had startup failures
or was hanging for whatever reason (like due to devices probing, given
that fprintd synchronously wait for them all to be initialized) we used
to just fail, leaving gdm or the lockscreen inusable.
While this could be prevented with a try/catch statement, there's no
much point to wait for fprintd if that's not the default authentication
service, and so:
- If we use gdm-fingerprint as default auth method, use a sync call to
initialize it and in case of failures, just continue with fallback
authentication mechanism (password)
- Otherwise, asynchronously initialize fprintd and continue with the
ShellUserVerifier without fingerprint support until we got a reply.
In case the service fails to deliver us a result, we don't give up
but we will try doing that at each authentication via
_checkForFingerprintReader().
In case all works properly, as per the previous commit, once the
initialization is done, we'll start the fingerprint PAM gdm service.
Fixes #5168
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1962566
Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5168
Origin: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2267
---
js/gdm/util.js | 128 +++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 101 insertions(+), 27 deletions(-)
diff --git a/js/gdm/util.js b/js/gdm/util.js
index 43647e7..7a335c1 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -44,6 +44,7 @@ var DISABLE_USER_LIST_KEY = 'disable-user-list';
// Give user 48ms to read each character of a PAM message
var USER_READ_TIME = 48;
+const FINGERPRINT_SERVICE_PROXY_TIMEOUT = 5000;
const FINGERPRINT_ERROR_TIMEOUT_WAIT = 15;
var MessageType = {
@@ -148,16 +149,49 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
this._preemptingService = null;
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
- this._settings.connect('changed',
- this._updateDefaultService.bind(this));
- this._updateDefaultService();
+ this._settings.connect('changed', () => this._updateDefaultServiceWithFallback());
+
+ this._fingerprintReaderType = FingerprintReaderType.NONE;
+ if (this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY)) {
+ const fprintManager = new FprintManagerProxy(Gio.DBus.system,
+ 'net.reactivated.Fprint',
+ '/net/reactivated/Fprint/Manager',
+ null,
+ null,
+ Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES |
+ Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION |
+ Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS);
+
+ // Do not wait too much for fprintd to reply, as in case it hangs
+ // we should fail early without having the shell to misbehave because
+ fprintManager.set_default_timeout(FINGERPRINT_SERVICE_PROXY_TIMEOUT);
- this._fprintManager = new FprintManagerProxy(Gio.DBus.system,
- 'net.reactivated.Fprint',
- '/net/reactivated/Fprint/Manager',
- null,
- null,
- Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES);
+ this._updateDefaultService();
+
+ if (!this._defaultService) {
+ // Fingerprint is the default one, we must wait for it!
+ try {
+ const [devicePath] = fprintManager.GetDefaultDeviceSync();
+ this._fprintManager = fprintManager;
+
+ const fprintDeviceProxy = new FprintDeviceProxy(Gio.DBus.system,
+ 'net.reactivated.Fprint', devicePath, null, null,
+ Gio.DBusProxyFlags.NOT_CONNECT_SIGNALS);
+ this._setFingerprintReaderType(fprintDeviceProxy['scan-type']);
+ } catch (e) {
+ logError(e, 'Failed to initialize fprintd service');
+ } finally {
+ this._updateDefaultServiceWithFallback();
+ }
+ } else {
+ // Ensure fingerprint service starts, but do not wait for it
+ this._updateFingerprintReaderType(fprintManager, null).then(
+ () => (this._fprintManager = fprintManager)).catch(
+ e => logError(e, 'Failed to initialize fprintd service'));
+ }
+ } else {
+ this._updateDefaultServiceWithFallback();
+ }
this._smartcardManager = SmartcardManager.getSmartcardManager();
// We check for smartcards right away, since an inserted smartcard
@@ -176,6 +210,7 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
this.reauthenticating = false;
this._failCounter = 0;
+ this._startedServices = new Set();
this._unavailableServices = new Set();
this._credentialManagers = {};
@@ -251,6 +286,7 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
this._clearUserVerifier();
this._clearMessageQueue();
+ this._startedServices.clear();
}
destroy() {
@@ -374,27 +410,52 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
}
async _checkForFingerprintReader() {
- this._fingerprintReaderType = FingerprintReaderType.NONE;
-
- if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY) ||
- this._fprintManager == null) {
- this._updateDefaultService();
+ if (!this._fprintManager) {
+ this._updateDefaultServiceWithFallback();
return;
}
+ if (this._fingerprintReaderType !== FingerprintReaderType.NONE)
+ return;
+
+ await this._updateFingerprintReaderType(this._fprintManager, this._cancellable);
+ }
+
+ async _updateFingerprintReaderType(fprintManager, cancellable) {
try {
- const [device] = await this._fprintManager.GetDefaultDeviceAsync(
- Gio.DBusCallFlags.NONE, this._cancellable);
- const fprintDeviceProxy = new FprintDeviceProxy(Gio.DBus.system,
- 'net.reactivated.Fprint',
- device);
- const fprintDeviceType = fprintDeviceProxy['scan-type'];
+ // Wrappers don't support null cancellable, so let's cheat about it
+ const [devicePath] = await fprintManager.GetDefaultDeviceAsync(
+ cancellable ? cancellable : Gio.DBusCallFlags.NONE);
+ const fprintDeviceProxy = await new Promise((resolve, reject) => {
+ const proxy = new FprintDeviceProxy(Gio.DBus.system,
+ 'net.reactivated.Fprint', devicePath, (_, error) => {
+ if (error)
+ reject(error);
+ else
+ resolve(proxy);
+ }, cancellable, Gio.DBusProxyFlags.NOT_CONNECT_SIGNALS);
+ });
+ this._setFingerprintReaderType(fprintDeviceProxy['scan-type']);
+ this._updateDefaultServiceWithFallback();
+
+ if (this._userVerifier &&
+ !this._startedServices.has(FINGERPRINT_SERVICE_NAME)) {
+ if (!this._hold?.isAcquired())
+ this._hold = new Batch.Hold();
+ await this._maybeStartFingerprintVerification();
+ }
+ } catch (e) {
+ if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
+ logError(e);
+ }
+ }
- this._fingerprintReaderType = fprintDeviceType === 'swipe'
- ? FingerprintReaderType.SWIPE
- : FingerprintReaderType.PRESS;
- this._updateDefaultService();
- } catch (e) {}
+ _setFingerprintReaderType(fprintDeviceType) {
+ this._fingerprintReaderType =
+ FingerprintReaderType[fprintDeviceType.toUpperCase()];
+
+ if (this._fingerprintReaderType === undefined)
+ throw new Error(`Unexpected fingerprint device type '${fprintDeviceType}'`);
}
_onCredentialManagerAuthenticated(credentialManager, _token) {
@@ -495,6 +556,7 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
'problem', this._onProblem.bind(this),
'info-query', this._onInfoQuery.bind(this),
'secret-info-query', this._onSecretInfoQuery.bind(this),
+ 'conversation-started', this._onConversationStarted.bind(this),
'conversation-stopped', this._onConversationStopped.bind(this),
'service-unavailable', this._onServiceUnavailable.bind(this),
'reset', this._onReset.bind(this),
@@ -538,6 +600,10 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
this._defaultService = SMARTCARD_SERVICE_NAME;
else if (this._fingerprintReaderType !== FingerprintReaderType.NONE)
this._defaultService = FINGERPRINT_SERVICE_NAME;
+ }
+
+ _updateDefaultServiceWithFallback() {
+ this._updateDefaultService();
if (!this._defaultService) {
log("no authentication service is enabled, using password authentication");
@@ -576,11 +642,14 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
_beginVerification() {
this._startService(this._getForegroundService());
+ this._maybeStartFingerprintVerification();
+ }
+ async _maybeStartFingerprintVerification() {
if (this._userName &&
this._fingerprintReaderType !== FingerprintReaderType.NONE &&
!this.serviceIsForeground(FINGERPRINT_SERVICE_NAME))
- this._startService(FINGERPRINT_SERVICE_NAME);
+ await this._startService(FINGERPRINT_SERVICE_NAME);
}
_onChoiceListQuery(client, serviceName, promptMessage, list) {
@@ -673,8 +742,9 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
_onReset() {
// Clear previous attempts to authenticate
this._failCounter = 0;
+ this._startedServices.clear();
this._unavailableServices.clear();
- this._updateDefaultService();
+ this._updateDefaultServiceWithFallback();
this.emit('reset');
}
@@ -755,6 +825,10 @@ var ShellUserVerifier = class extends Signals.EventEmitter {
this._queueMessage(serviceName, errorMessage, MessageType.ERROR);
}
+ _onConversationStarted(client, serviceName) {
+ this._startedServices.add(serviceName);
+ }
+
_onConversationStopped(client, serviceName) {
// If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication

View File

@ -0,0 +1,237 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Tue, 24 Oct 2017 02:15:13 +0200
Subject: global: make possible to set debug-flags dynamically
Adding {set,get}_debug_flags functions to the shell global object to
make possible to set this easily from looking class, making it easier
for developers and users to debug without having to restart the shell
with environment variables.
Debug flags in main are updated when the "debug-flags" property is
changed. I'm keeping this as a string-list so that it's easier to update.
https://bugzilla.gnome.org/show_bug.cgi?id=789377
Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=789377
Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/6
---
src/main.c | 60 ++++++++++++++++++++++++++++++++++++++++++------------
src/shell-global.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
src/shell-global.h | 3 +++
3 files changed, 101 insertions(+), 13 deletions(-)
diff --git a/src/main.c b/src/main.c
index ac20be2..726afe9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -276,14 +276,14 @@ shell_a11y_init (void)
}
static void
-shell_init_debug (const char *debug_env)
+shell_update_debug (const char *debug_string)
{
static const GDebugKey keys[] = {
{ "backtrace-warnings", SHELL_DEBUG_BACKTRACE_WARNINGS },
{ "backtrace-segfaults", SHELL_DEBUG_BACKTRACE_SEGFAULTS },
};
- _shell_debug = g_parse_debug_string (debug_env, keys,
+ _shell_debug = g_parse_debug_string (debug_string, keys,
G_N_ELEMENTS (keys));
}
@@ -385,6 +385,42 @@ dump_gjs_stack_on_signal (int signo)
_tracked_signals[signo] = TRUE;
}
+static void
+reset_signal_handler_to_default (int signo)
+{
+ signal (signo, SIG_DFL);
+ _tracked_signals[signo] = FALSE;
+}
+
+static void
+setup_debug_signal_listners (void)
+{
+ dump_gjs_stack_on_signal (SIGABRT);
+ dump_gjs_stack_on_signal (SIGFPE);
+ dump_gjs_stack_on_signal (SIGIOT);
+ dump_gjs_stack_on_signal (SIGTRAP);
+
+ if ((_shell_debug & SHELL_DEBUG_BACKTRACE_SEGFAULTS))
+ {
+ dump_gjs_stack_on_signal (SIGBUS);
+ dump_gjs_stack_on_signal (SIGSEGV);
+ }
+ else
+ {
+ reset_signal_handler_to_default (SIGBUS);
+ reset_signal_handler_to_default (SIGSEGV);
+ }
+}
+
+static void
+global_notify_debug_flags (GObject *gobject,
+ GParamSpec *pspec,
+ gpointer data)
+{
+ shell_update_debug (shell_global_get_debug_flags (shell_global_get ()));
+ setup_debug_signal_listners ();
+}
+
static gboolean
list_modes (const char *option_name,
const char *value,
@@ -506,6 +542,7 @@ main (int argc, char **argv)
{
g_autoptr (MetaContext) context = NULL;
GError *error = NULL;
+ const char *debug_flags;
int ecode = EXIT_SUCCESS;
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
@@ -543,7 +580,8 @@ main (int argc, char **argv)
g_setenv ("GJS_DEBUG_OUTPUT", "stderr", TRUE);
g_setenv ("GJS_DEBUG_TOPICS", "JS ERROR;JS LOG", TRUE);
- shell_init_debug (g_getenv ("SHELL_DEBUG"));
+ debug_flags = g_getenv ("SHELL_DEBUG");
+ shell_update_debug (debug_flags);
shell_dbus_init (meta_context_is_replacing (context));
shell_a11y_init ();
@@ -557,18 +595,14 @@ main (int argc, char **argv)
if (session_mode == NULL)
session_mode = is_gdm_mode ? (char *)"gdm" : (char *)"user";
- _shell_global_init ("session-mode", session_mode, NULL);
+ _shell_global_init ("session-mode", session_mode,
+ "debug-flags", debug_flags,
+ NULL);
- dump_gjs_stack_on_signal (SIGABRT);
- dump_gjs_stack_on_signal (SIGFPE);
- dump_gjs_stack_on_signal (SIGIOT);
- dump_gjs_stack_on_signal (SIGTRAP);
+ g_signal_connect (shell_global_get (), "notify::debug-flags",
+ G_CALLBACK (global_notify_debug_flags), NULL);
- if ((_shell_debug & SHELL_DEBUG_BACKTRACE_SEGFAULTS))
- {
- dump_gjs_stack_on_signal (SIGBUS);
- dump_gjs_stack_on_signal (SIGSEGV);
- }
+ setup_debug_signal_listners ();
shell_profiler_init ();
diff --git a/src/shell-global.c b/src/shell-global.c
index 0ccdb10..1676208 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -59,6 +59,7 @@ struct _ShellGlobal {
Display *xdisplay;
char *session_mode;
+ char *debug_flags;
XserverRegion input_region;
@@ -109,6 +110,7 @@ enum {
PROP_FRAME_TIMESTAMPS,
PROP_FRAME_FINISH_TIMESTAMP,
PROP_SWITCHEROO_CONTROL,
+ PROP_DEBUG_FLAGS,
N_PROPS
};
@@ -234,6 +236,9 @@ shell_global_set_property(GObject *object,
}
}
break;
+ case PROP_DEBUG_FLAGS:
+ shell_global_set_debug_flags (global, g_value_get_string (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -316,6 +321,8 @@ shell_global_get_property(GObject *object,
break;
case PROP_SWITCHEROO_CONTROL:
g_value_set_object (value, global->switcheroo_control);
+ case PROP_DEBUG_FLAGS:
+ g_value_set_string (value, global->debug_flags);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -641,6 +648,13 @@ shell_global_class_init (ShellGlobalClass *klass)
G_TYPE_DBUS_PROXY,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ props[PROP_DEBUG_FLAGS] =
+ g_param_spec_string ("debug-flags",
+ "Debug Flags",
+ "The debugging flags",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
g_object_class_install_properties (gobject_class, N_PROPS, props);
}
@@ -1858,3 +1872,40 @@ _shell_global_locate_pointer (ShellGlobal *global)
{
g_signal_emit (global, shell_global_signals[LOCATE_POINTER], 0);
}
+
+/**
+ * shell_global_get_debug_flags:
+ * @global: a #ShellGlobal
+ *
+ * Returns: (transfer none): The current debug flags
+ */
+const gchar *
+shell_global_get_debug_flags (ShellGlobal *global)
+{
+ g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
+
+ return global->debug_flags;
+}
+
+/**
+ * shell_global_set_debug_flags:
+ * @global: a #ShellGlobal
+ * @debug_flags: (nullable): A string for debugging flags
+ *
+ * Updates the debugging flags at runtime as the one set using the SHELL_DEBUG
+ * environment variables. Currently we support 'backtrace-warnings' and
+ * 'backtrace-segfaults' keys.
+ */
+void
+shell_global_set_debug_flags (ShellGlobal *global,
+ const char *debug_flags)
+{
+ g_return_if_fail (SHELL_IS_GLOBAL (global));
+
+ if (g_strcmp0 (global->debug_flags, debug_flags) != 0)
+ {
+ g_free (global->debug_flags);
+ global->debug_flags = g_strdup (debug_flags);
+ g_object_notify (G_OBJECT (global), "debug-flags");
+ }
+}
diff --git a/src/shell-global.h b/src/shell-global.h
index 8d8238c..04c59d1 100644
--- a/src/shell-global.h
+++ b/src/shell-global.h
@@ -88,6 +88,9 @@ void shell_global_set_persistent_state (ShellGlobal *global,
GVariant * shell_global_get_persistent_state (ShellGlobal *global,
const char *property_type,
const char *property_name);
+const char * shell_global_get_debug_flags (ShellGlobal *global);
+void shell_global_set_debug_flags (ShellGlobal *global,
+ const char *debug_flags);
G_END_DECLS

View File

@ -0,0 +1,69 @@
From: =?utf-8?q?Florian_M=C3=BCllner?= <fmuellner@gnome.org>
Date: Thu, 6 Oct 2022 14:30:20 +0200
Subject: 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>
(cherry picked from commit 8590e3350145b3c652d3977d72fe0da7f1d8885c)
---
.../org.freedesktop.impl.portal.PermissionStore.xml | 7 +++++++
js/ui/inhibitShortcutsDialog.js | 12 ++++--------
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml b/data/dbus-interfaces/org.freedesktop.impl.portal.PermissionStore.xml
index 75fbc46..55d3fc3 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 f37c1f6..b6f1330 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,16 +57,12 @@ 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', {});
-
try {
- await this._permStore.SetAsync(APP_PERMISSIONS_TABLE,
+ await this._permStore.SetPermissionAsync(APP_PERMISSIONS_TABLE,
true,
APP_PERMISSIONS_ID,
- permissions,
- data);
+ this._app.get_id(),
+ [grant]);
} catch (error) {
log(error.message);
}

View File

@ -0,0 +1,172 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Wed, 27 Mar 2019 16:14:39 +0100
Subject: magnifier: Scale the sprite to match the current monitor scaling
Compute the sprite texture scale (unfortunately using a workaround, based on
mutter cursor size preferences, tying to figure out the closest texture integer
scaling), and use this value to compute the scaling that should be applied to
the sprite in order to match the current monitor scaling.
Origin: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/475
Applied-Upstream: no
Forwarded: yes
---
js/ui/layout.js | 24 ++++++++++++++++++++----
js/ui/magnifier.js | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 73 insertions(+), 6 deletions(-)
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 9393d04..0b11d24 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -951,22 +951,38 @@ var LayoutManager = GObject.registerClass({
return ws.get_work_area_for_monitor(monitorIndex);
}
+ _findIndexForRect(x, y, width, height) {
+ let rect = new Meta.Rectangle({
+ x: Math.floor(x),
+ y: Math.floor(y),
+ width: Math.ceil(x + width) - Math.floor(x),
+ height: Math.ceil(y + height) - Math.floor(y)
+ });
+ return global.display.get_monitor_index_for_rect(rect);
+ }
+
// This call guarantees that we return some monitor to simplify usage of it
// In practice all tracked actors should be visible on some monitor anyway
findIndexForActor(actor) {
let [x, y] = actor.get_transformed_position();
let [w, h] = actor.get_transformed_size();
- let rect = new Meta.Rectangle({ x, y, width: w, height: h });
- return global.display.get_monitor_index_for_rect(rect);
+ return this._findIndexForRect(x, y, w, h);
}
- findMonitorForActor(actor) {
- let index = this.findIndexForActor(actor);
+ _findMonitorForIndex(index) {
if (index >= 0 && index < this.monitors.length)
return this.monitors[index];
return null;
}
+ findMonitorForActor(actor) {
+ return this._findMonitorForIndex(this.findIndexForActor(actor));
+ }
+
+ findMonitorForPoint(x, y) {
+ return this._findMonitorForIndex(this._findIndexForRect(x, y, 1, 1));
+ }
+
_queueUpdateRegions() {
if (!this._updateRegionIdle) {
this._updateRegionIdle = Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js
index f4012de..f8d235f 100644
--- a/js/ui/magnifier.js
+++ b/js/ui/magnifier.js
@@ -46,6 +46,8 @@ var MouseSpriteContent = GObject.registerClass({
}, class MouseSpriteContent extends GObject.Object {
_init() {
super._init();
+ this._scale = 1.0;
+ this._monitorScale = 1.0;
this._texture = null;
}
@@ -53,7 +55,10 @@ var MouseSpriteContent = GObject.registerClass({
if (!this._texture)
return [false, 0, 0];
- return [true, this._texture.get_width(), this._texture.get_height()];
+ let width = this._texture.get_width() / this._scale;
+ let height = this._texture.get_height() / this._scale;
+
+ return [true, width, height];
}
vfunc_paint_content(actor, node, _paintContext) {
@@ -70,6 +75,29 @@ var MouseSpriteContent = GObject.registerClass({
textureNode.add_rectangle(actor.get_content_box());
}
+ _textureScale() {
+ if (!this._texture)
+ return 1;
+
+ /* This is a workaround to guess the sprite scale; while it works file
+ * in normal scenarios, it's not guaranteed to work in all the cases,
+ * and so we should actually add an API to mutter that will allow us
+ * to know the real spirte texture scaling in order to adapt it to the
+ * wanted one. */
+ let avgSize = (this._texture.get_width() + this._texture.get_height()) / 2;
+ return Math.max (1, Math.floor (avgSize / Meta.prefs_get_cursor_size() + .1));
+ }
+
+ _recomputeScale() {
+ let scale = this._textureScale() / this._monitorScale;
+
+ if (this._scale != scale) {
+ this._scale = scale;
+ return true;
+ }
+ return false;
+ }
+
get texture() {
return this._texture;
}
@@ -84,7 +112,19 @@ var MouseSpriteContent = GObject.registerClass({
if (!oldTexture || !coglTexture ||
oldTexture.get_width() != coglTexture.get_width() ||
- oldTexture.get_height() != coglTexture.get_height())
+ oldTexture.get_height() != coglTexture.get_height()) {
+ this._recomputeScale();
+ this.invalidate_size();
+ }
+ }
+
+ get scale() {
+ return this._scale;
+ }
+
+ set monitorScale(monitorScale) {
+ this._monitorScale = monitorScale;
+ if (this._recomputeScale())
this.invalidate_size();
}
});
@@ -113,6 +153,8 @@ var Magnifier = class Magnifier extends Signals.EventEmitter {
this._settingsInit(aZoomRegion);
aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse);
+ this._updateContentScale();
+
St.Settings.get().connect('notify::magnifier-active', () => {
this.setActive(St.Settings.get().magnifier_active);
});
@@ -120,6 +162,13 @@ var Magnifier = class Magnifier extends Signals.EventEmitter {
this.setActive(St.Settings.get().magnifier_active);
}
+ _updateContentScale() {
+ let monitor = Main.layoutManager.findMonitorForPoint(this.xMouse,
+ this.yMouse);
+ this._mouseSprite.content.monitorScale = monitor ?
+ monitor.geometry_scale : 1;
+ }
+
/**
* showSystemCursor:
* Show the system mouse pointer.
@@ -256,6 +305,8 @@ var Magnifier = class Magnifier extends Signals.EventEmitter {
this.xMouse = xMouse;
this.yMouse = yMouse;
+ this._updateContentScale();
+
let sysMouseOverAny = false;
this._zoomRegions.forEach(zoomRegion => {
if (zoomRegion.scrollToMousePos())

View File

@ -0,0 +1,47 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Thu, 2 Aug 2018 16:17:39 +0200
Subject: main: add `backtrace-crashes-all` and `backtrace-all`
These are just convenient aliases to not to have to list all the types,
as having more granularity is cool, but it might also cause some annoyance.
https://bugzilla.gnome.org/show_bug.cgi?id=789377
Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=789377
Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/6
---
src/main.c | 7 +++++++
src/shell-global.c | 2 ++
2 files changed, 9 insertions(+)
diff --git a/src/main.c b/src/main.c
index 047ea87..6604fde 100644
--- a/src/main.c
+++ b/src/main.c
@@ -50,6 +50,13 @@ static const GDebugKey SHELL_DEBUG_KEYS[] = {
{ "backtrace-segfaults", SHELL_DEBUG_BACKTRACE_SEGFAULTS },
{ "backtrace-aborts", SHELL_DEBUG_BACKTRACE_ABORTS },
{ "backtrace-math-errors", SHELL_DEBUG_BACKTRACE_FPE },
+ { "backtrace-crashes-all", SHELL_DEBUG_BACKTRACE_SEGFAULTS |
+ SHELL_DEBUG_BACKTRACE_ABORTS |
+ SHELL_DEBUG_BACKTRACE_FPE },
+ { "backtrace-all", SHELL_DEBUG_BACKTRACE_WARNINGS |
+ SHELL_DEBUG_BACKTRACE_SEGFAULTS |
+ SHELL_DEBUG_BACKTRACE_ABORTS |
+ SHELL_DEBUG_BACKTRACE_FPE },
};
static int _default_debug_flags = SHELL_DEBUG_BACKTRACE_ABORTS |
SHELL_DEBUG_BACKTRACE_FPE;
diff --git a/src/shell-global.c b/src/shell-global.c
index 60b84e6..1f5ec82 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -1898,6 +1898,8 @@ shell_global_get_debug_flags (ShellGlobal *global)
* - 'backtrace-segfaults'
* - 'backtrace-aborts'
* - 'backtrace-math-errors'
+ * - 'backtrace-crashes-all'
+ * - 'backtrace-all'
* - 'all'
*/
void

View File

@ -0,0 +1,169 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Tue, 24 Oct 2017 03:20:34 +0200
Subject: main: increase the granularity of backtraces in SHELL_DEBUG
Add support for multiple debug-keys for getting the backtraces,
allowing more control using both SHELL_DEBUG and/or set_debug_flags
https://bugzilla.gnome.org/show_bug.cgi?id=789377
Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=789377
Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/6
---
src/main.c | 76 +++++++++++++++++++++++++++++++++++++++++-------------
src/shell-global.c | 10 ++++---
2 files changed, 65 insertions(+), 21 deletions(-)
diff --git a/src/main.c b/src/main.c
index 726afe9..047ea87 100644
--- a/src/main.c
+++ b/src/main.c
@@ -34,16 +34,26 @@ extern GType gnome_shell_plugin_get_type (void);
static gboolean is_gdm_mode = FALSE;
static char *session_mode = NULL;
static int caught_signal = 0;
+static gboolean _tracked_signals[NSIG] = { 0 };
#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
#define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4
enum {
- SHELL_DEBUG_BACKTRACE_WARNINGS = 1,
- SHELL_DEBUG_BACKTRACE_SEGFAULTS = 2,
+ SHELL_DEBUG_BACKTRACE_WARNINGS = (1 << 0),
+ SHELL_DEBUG_BACKTRACE_SEGFAULTS = (1 << 1),
+ SHELL_DEBUG_BACKTRACE_ABORTS = (1 << 2),
+ SHELL_DEBUG_BACKTRACE_FPE = (1 << 3),
};
-static int _shell_debug;
-static gboolean _tracked_signals[NSIG] = { 0 };
+static const GDebugKey SHELL_DEBUG_KEYS[] = {
+ { "backtrace-warnings", SHELL_DEBUG_BACKTRACE_WARNINGS },
+ { "backtrace-segfaults", SHELL_DEBUG_BACKTRACE_SEGFAULTS },
+ { "backtrace-aborts", SHELL_DEBUG_BACKTRACE_ABORTS },
+ { "backtrace-math-errors", SHELL_DEBUG_BACKTRACE_FPE },
+};
+static int _default_debug_flags = SHELL_DEBUG_BACKTRACE_ABORTS |
+ SHELL_DEBUG_BACKTRACE_FPE;
+static int _shell_debug = 0;
static void
shell_dbus_acquire_name (GDBusProxy *bus,
@@ -278,13 +288,23 @@ shell_a11y_init (void)
static void
shell_update_debug (const char *debug_string)
{
- static const GDebugKey keys[] = {
- { "backtrace-warnings", SHELL_DEBUG_BACKTRACE_WARNINGS },
- { "backtrace-segfaults", SHELL_DEBUG_BACKTRACE_SEGFAULTS },
- };
+ _shell_debug = g_parse_debug_string (debug_string, SHELL_DEBUG_KEYS,
+ G_N_ELEMENTS (SHELL_DEBUG_KEYS));
+}
+
+static char *
+debug_flags_to_string (void)
+{
+ gsize i, j;
+ const char *enabled_flags[G_N_ELEMENTS (SHELL_DEBUG_KEYS) + 1] = { 0 };
+
+ for (i = 0, j = 0; i < G_N_ELEMENTS (SHELL_DEBUG_KEYS); ++i)
+ {
+ if ((_shell_debug & SHELL_DEBUG_KEYS[i].value))
+ enabled_flags[j++] = SHELL_DEBUG_KEYS[i].key;
+ }
- _shell_debug = g_parse_debug_string (debug_string, keys,
- G_N_ELEMENTS (keys));
+ return g_strjoinv (":", (char**) enabled_flags);
}
static GLogWriterOutput
@@ -395,10 +415,23 @@ reset_signal_handler_to_default (int signo)
static void
setup_debug_signal_listners (void)
{
- dump_gjs_stack_on_signal (SIGABRT);
- dump_gjs_stack_on_signal (SIGFPE);
- dump_gjs_stack_on_signal (SIGIOT);
- dump_gjs_stack_on_signal (SIGTRAP);
+ if ((_shell_debug & SHELL_DEBUG_BACKTRACE_ABORTS))
+ {
+ dump_gjs_stack_on_signal (SIGABRT);
+ dump_gjs_stack_on_signal (SIGIOT);
+ dump_gjs_stack_on_signal (SIGTRAP);
+ }
+ else
+ {
+ reset_signal_handler_to_default (SIGABRT);
+ reset_signal_handler_to_default (SIGIOT);
+ reset_signal_handler_to_default (SIGTRAP);
+ }
+
+ if ((_shell_debug & SHELL_DEBUG_BACKTRACE_FPE))
+ dump_gjs_stack_on_signal (SIGFPE);
+ else
+ reset_signal_handler_to_default (SIGFPE);
if ((_shell_debug & SHELL_DEBUG_BACKTRACE_SEGFAULTS))
{
@@ -541,8 +574,9 @@ int
main (int argc, char **argv)
{
g_autoptr (MetaContext) context = NULL;
+ g_autofree char *debug_flags_string = NULL;
GError *error = NULL;
- const char *debug_flags;
+ const char *shell_debug;
int ecode = EXIT_SUCCESS;
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
@@ -580,8 +614,14 @@ main (int argc, char **argv)
g_setenv ("GJS_DEBUG_OUTPUT", "stderr", TRUE);
g_setenv ("GJS_DEBUG_TOPICS", "JS ERROR;JS LOG", TRUE);
- debug_flags = g_getenv ("SHELL_DEBUG");
- shell_update_debug (debug_flags);
+ shell_debug = g_getenv ("SHELL_DEBUG");
+
+ if (shell_debug)
+ shell_update_debug (shell_debug);
+ else
+ _shell_debug = _default_debug_flags;
+
+ debug_flags_string = debug_flags_to_string ();
shell_dbus_init (meta_context_is_replacing (context));
shell_a11y_init ();
@@ -596,7 +636,7 @@ main (int argc, char **argv)
session_mode = is_gdm_mode ? (char *)"gdm" : (char *)"user";
_shell_global_init ("session-mode", session_mode,
- "debug-flags", debug_flags,
+ "debug-flags", debug_flags_string,
NULL);
g_signal_connect (shell_global_get (), "notify::debug-flags",
diff --git a/src/shell-global.c b/src/shell-global.c
index 1676208..60b84e6 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -1890,11 +1890,15 @@ shell_global_get_debug_flags (ShellGlobal *global)
/**
* shell_global_set_debug_flags:
* @global: a #ShellGlobal
- * @debug_flags: (nullable): A string for debugging flags
+ * @debug_flags: (nullable): A comma-separated string of debugging flags
*
* Updates the debugging flags at runtime as the one set using the SHELL_DEBUG
- * environment variables. Currently we support 'backtrace-warnings' and
- * 'backtrace-segfaults' keys.
+ * environment variables. Currently we support these keys:
+ * - 'backtrace-warnings'
+ * - 'backtrace-segfaults'
+ * - 'backtrace-aborts'
+ * - 'backtrace-math-errors'
+ * - 'all'
*/
void
shell_global_set_debug_flags (ShellGlobal *global,

View File

@ -0,0 +1,30 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Thu, 2 Aug 2018 15:59:20 +0200
Subject: main: show an error message on gnome-shell crash
When we call the crash signal handler, write on log the reason of the
crash, also to make easier to parse the logs later on, and being able
to understand if a stacktrace is coming from a crash or a different
gjs error.
https://bugzilla.gnome.org/show_bug.cgi?id=789377
Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=789377
Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/6
---
src/main.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/main.c b/src/main.c
index 29275cd..ac20be2 100644
--- a/src/main.c
+++ b/src/main.c
@@ -346,6 +346,8 @@ dump_gjs_stack_on_signal_handler (int signo)
struct sigaction sa = { .sa_handler = dump_gjs_stack_alarm_sigaction };
gsize i;
+ g_printerr ("GNOME Shell crashed with signal %d\n", signo);
+
/* Ignore all the signals starting this point, a part the one we'll raise
* (which is implicitly ignored here through SA_RESETHAND), this is needed
* not to get this handler being called by other signals that we were

View File

@ -0,0 +1,31 @@
gdm-util-Only-start-fingerprint-service-synchronously-whe.patch
debian/gnome-shell-extension-prefs-Give-Debian-specific-advice.patch
Revert-build-Port-to-gcr4.patch
ubuntu/desktop_detect.patch
ubuntu/lightdm-user-switching.patch
ubuntu/lock_on_suspend.patch
ubuntu/background_login.patch
ubuntu/gdm_alternatives.patch
main-show-an-error-message-on-gnome-shell-crash.patch
global-make-possible-to-set-debug-flags-dynamically.patch
main-increase-the-granularity-of-backtraces-in-SHELL_DEBU.patch
main-add-backtrace-crashes-all-and-backtrace-all.patch
sessionMode-add-support-for-debugFlags-parameter.patch
magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch
ubuntu/search-call-XUbuntuCancel-method-on-providers-when-no-dat.patch
ubuntu/resolve_alternate_theme_path.patch
ubuntu/secure_mode_extension.patch
ubuntu/keep-ubuntu-logo-bright-lp1867133-v1.patch
ubuntu/configure_login_screen.patch
ubuntu/layout-Try-to-allocate-before-getting-size-of-tracke.patch
Revert-st-Apply-css-foreground-color-to-text-as-a-PangoAt.patch
ubuntu/main-Avoid-meta-finalize.patch
ubuntu/sessionMode-Add-support-for-configuring-an-icons-resource.patch
ubuntu/main-Support-loading-multiple-Yaru-theme-variants.patch
ubuntu/Revert-dash-Use-pin-instead-of-favorites.patch
ubuntu/darkMode-Add-support-to-Yaru-theme-color-variants.patch
config-Assume-screen-recording-is-always-available.patch
status-Use-fixed-sorting-of-input-sources-on-empty-MRU.patch
bluetooth-Show-the-Bluetooth-switch-in-more-cases.patch
status-volume-Include-origin-in-device-names.patch
inhibitShortcutsDialog-Don-t-override-resource.patch

View File

@ -0,0 +1,46 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Thu, 2 Aug 2018 16:05:13 +0200
Subject: sessionMode: add support for `debugFlags` parameter
A session can now define `debugFlags` from a json file, still leaving priority
to the environment variable.
https://bugzilla.gnome.org/show_bug.cgi?id=789377
Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=789377
Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/6
---
js/ui/main.js | 7 +++++++
js/ui/sessionMode.js | 1 +
2 files changed, 8 insertions(+)
diff --git a/js/ui/main.js b/js/ui/main.js
index 2d8804a..fc5ae80 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -139,6 +139,13 @@ function _sessionUpdated() {
_remoteAccessInhibited = true;
}
}
+
+ if (!GLib.getenv('SHELL_DEBUG')) {
+ if (typeof sessionMode.debugFlags === 'string')
+ global.set_debug_flags(sessionMode.debugFlags);
+ else if (Array.isArray(sessionMode.debugFlags))
+ global.set_debug_flags(sessionMode.debugFlags.join(':'))
+ }
}
/**
diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js
index 4284366..053e678 100644
--- a/js/ui/sessionMode.js
+++ b/js/ui/sessionMode.js
@@ -29,6 +29,7 @@ const _modes = {
showWelcomeDialog: false,
allowSettings: false,
allowScreencast: false,
+ debugFlags: [],
enabledExtensions: [],
hasRunDialog: false,
hasWorkspaces: false,

View File

@ -0,0 +1,34 @@
From: Carlos Garnacho <carlosg@gnome.org>
Date: Wed, 14 Sep 2022 20:20:14 +0200
Subject: status: Use fixed sorting of input sources on empty MRU
When updating the MRU sources if there was no prior MRU, we want
to go with the unmodified list of sources in visibility order.
However iterating over object properties happens in an undetermined
order, so the initial MRU list ends up picking a value at random.
In order to prefer the sources list in the same order than they
appear in the menu if there was no prior MRU, order the keys
when accessing it and building the initial list of sources.
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5873
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2487>
(cherry picked from commit 13c9fd2a668e137b9e2569dcdedb0a25b95ae9aa)
---
js/ui/status/keyboard.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js
index 76a42f6..65b3962 100644
--- a/js/ui/status/keyboard.js
+++ b/js/ui/status/keyboard.js
@@ -492,7 +492,7 @@ var InputSourceManager = class extends Signals.EventEmitter {
_updateMruSources() {
let sourcesList = [];
- for (let i in this._inputSources)
+ for (let i of Object.keys(this._inputSources).sort((a, b) => a - b))
sourcesList.push(this._inputSources[i]);
this._keyboardManager.setUserLayouts(sourcesList.map(x => x.xkbId));

View File

@ -0,0 +1,35 @@
From: =?utf-8?q?Florian_M=C3=BCllner?= <fmuellner@gnome.org>
Date: Mon, 3 Oct 2022 18:30:13 +0200
Subject: status/volume: Include origin in device names
The description alone may not be descriptive enough, so include
the origin (if available) to disambiguate the name.
This is consistent with the Sound Settings panel.
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5829
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2502>
(cherry picked from commit 0ce2bc343b024142dddfe6e6bb57b51bfa407df9)
---
js/ui/status/volume.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/js/ui/status/volume.js b/js/ui/status/volume.js
index 71a91cb..bd49cc3 100644
--- a/js/ui/status/volume.js
+++ b/js/ui/status/volume.js
@@ -113,8 +113,11 @@ const StreamSlider = GObject.registerClass({
if (!device)
return;
- const item = new PopupMenu.PopupImageMenuItem(
- device.get_description(), device.get_gicon());
+ const {description, origin} = device;
+ const name = origin
+ ? `${description} ${origin}`
+ : description;
+ const item = new PopupMenu.PopupImageMenuItem(name, device.get_gicon());
item.connect('activate', () => this._activateDevice(device));
this._deviceSection.addMenuItem(item);

View File

@ -0,0 +1,90 @@
From: Gunnar Hjalmarsson <gunnarhj@ubuntu.com>
Date: Mon, 11 Apr 2022 21:10:37 +0200
Subject: Revert "dash: Use pin instead of favorites"
This effectively reverts this commit when using the ubuntu session:
https://gitlab.gnome.org/GNOME/gnome-shell/-/commit/a67877f5
We do that as a temporary measure in Ubuntu 22.04 in order to address
a translation issue. The issue was reported by Mitsuya Shibata:
* https://github.com/micheleg/dash-to-dock/issues/1697
* https://lists.ubuntu.com/archives/ubuntu-translators/2022-April/007829.html
In short: By using the old labels for those menu items, we can make use
of existing gnome-shell translations in Launchpad both for gnome-shell
and ubuntu-dock. Thanks Jeremy Bicha for the idea!
So even if it technically introduces new translatable strings very late,
it does not break the UIF spirit.
Forwarded: not-needed
---
js/ui/appFavorites.js | 12 ++++++++++--
js/ui/appMenu.js | 5 +++--
js/ui/dash.js | 3 +--
3 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js
index d8a3018..b4460bb 100644
--- a/js/ui/appFavorites.js
+++ b/js/ui/appFavorites.js
@@ -163,7 +163,11 @@ class AppFavorites extends Signals.EventEmitter {
let app = Shell.AppSystem.get_default().lookup_app(appId);
- let msg = _('%s has been pinned to the dash.').format(app.get_name());
+ let msg;
+ if (imports.misc.desktop.is('ubuntu'))
+ msg = _('%s has been added to your favorites.').format(app.get_name());
+ else
+ msg = _('%s has been pinned to the dash.').format(app.get_name());
Main.overview.setMessage(msg, {
forFeedback: true,
undoCallback: () => this._removeFavorite(appId),
@@ -196,7 +200,11 @@ class AppFavorites extends Signals.EventEmitter {
if (!this._removeFavorite(appId))
return;
- let msg = _('%s has been unpinned from the dash.').format(app.get_name());
+ let msg;
+ if (imports.misc.desktop.is('ubuntu'))
+ msg = _('%s has been removed from your favorites.').format(app.get_name());
+ else
+ msg = _('%s has been unpinned from the dash.').format(app.get_name());
Main.overview.setMessage(msg, {
forFeedback: true,
undoCallback: () => this._addFavorite(appId, pos),
diff --git a/js/ui/appMenu.js b/js/ui/appMenu.js
index 010fdb3..e96043b 100644
--- a/js/ui/appMenu.js
+++ b/js/ui/appMenu.js
@@ -153,9 +153,10 @@ var AppMenu = class AppMenu extends PopupMenu.PopupMenu {
return;
const { id } = this._app;
+ const isUbuntu = imports.misc.desktop.is('ubuntu');
this._toggleFavoriteItem.label.text = this._appFavorites.isFavorite(id)
- ? _('Unpin')
- : _('Pin to Dash');
+ ? (isUbuntu ? _('Remove from Favorites') : _('Unpin'))
+ : (isUbuntu ? _('Add to Favorites') : _('Pin to Dash'));
}
_updateGpuItem() {
diff --git a/js/ui/dash.js b/js/ui/dash.js
index a40377c..3ff2219 100644
--- a/js/ui/dash.js
+++ b/js/ui/dash.js
@@ -244,9 +244,8 @@ class ShowAppsIcon extends DashItemContainer {
this.toggleButton.set_hover(canRemove);
if (this._iconActor)
this._iconActor.set_hover(canRemove);
-
if (canRemove)
- this.setLabelText(_('Unpin'));
+ this.setLabelText(imports.misc.desktop.is('ubuntu') ? _('Remove from Favorites') : _('Unpin'));
else
this.setLabelText(_("Show Applications"));
}

View File

@ -0,0 +1,39 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Tue, 10 Sep 2019 13:13:14 +0100
Subject: js/ui/background.js: Match theme login screen color
This way the login animation will appear to expand over the login
screen (system background) instead of suddenly replacing it.
Original author: Didier Roche <didrocks@ubuntu.com>
Original author: Daniel van Vugt <daniel.van.vugt@canonical.com>
Author: Marco Trevisan <marco.trevisan@canonical.com>
Last-Update: 2022-08-30
Forwarded: not-needed
---
js/ui/background.js | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/js/ui/background.js b/js/ui/background.js
index 829ffb4..8701941 100644
--- a/js/ui/background.js
+++ b/js/ui/background.js
@@ -530,7 +530,16 @@ var SystemBackground = GObject.registerClass({
_init() {
if (_systemBackground == null) {
_systemBackground = new Meta.Background({ meta_display: global.display });
- _systemBackground.set_color(DEFAULT_BACKGROUND_COLOR);
+
+ let backgroundColor = DEFAULT_BACKGROUND_COLOR;
+ if (imports.misc.desktop.is("ubuntu")) {
+ const dummyBgActor = new imports.gi.St.Widget({ name: 'lockDialogGroup' });
+ Main.uiGroup.add_actor(dummyBgActor);
+ backgroundColor = dummyBgActor.get_theme_node().get_background_color();
+ dummyBgActor.destroy();
+ }
+
+ _systemBackground.set_color(backgroundColor);
}
super._init({

View File

@ -0,0 +1,199 @@
From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Date: Thu, 11 Mar 2021 10:12:06 +0200
Subject: Allow configuring login screen background
Configuring login screen backgound and properties is a recurring request
especially on corporate environment.
Allows to override the default embedded style in the theme with specific
gsettings keys.
Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/680
Bug: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1918613
Origin: ubuntu
---
data/com.ubuntu.login-screen.gschema.xml.in | 70 +++++++++++++++++++++++++++++
data/meson.build | 8 +++-
js/ui/background.js | 4 ++
js/ui/screenShield.js | 37 +++++++++++++++
4 files changed, 118 insertions(+), 1 deletion(-)
create mode 100644 data/com.ubuntu.login-screen.gschema.xml.in
diff --git a/data/com.ubuntu.login-screen.gschema.xml.in b/data/com.ubuntu.login-screen.gschema.xml.in
new file mode 100644
index 0000000..ee8b3a2
--- /dev/null
+++ b/data/com.ubuntu.login-screen.gschema.xml.in
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schemalist gettext-domain="@GETTEXT_PACKAGE@">
+ <enum id="com.ubuntu.login-screen.BackgroundRepeat">
+ <value value="1" nick="default"/>
+ <value value="2" nick="repeat"/>
+ <value value="3" nick="repeat-x"/>
+ <value value="4" nick="repeat-y"/>
+ <value value="5" nick="no-repeat"/>
+ <value value="6" nick="space"/>
+ <value value="7" nick="round"/>
+ </enum>
+ <enum id="com.ubuntu.login-screen.BackgroundSize">
+ <value value="1" nick="default"/>
+ <value value="2" nick="auto"/>
+ <value value="3" nick="cover"/>
+ <value value="4" nick="contain"/>
+ </enum>
+ <schema id="com.ubuntu.login-screen" path="/com/ubuntu/login-screen/">
+ <key name="background-picture-uri" type="s">
+ <default>''</default>
+ <summary>
+ Sets the background image for the login screen.
+ </summary>
+ <description>
+ URI to use for the background image. Note that the backend only
+ supports local (file://) URIs.
+ It overrides the value defined in the default style sheet.
+ </description>
+ </key>
+ <key name="background-color" type="s">
+ <default>''</default>
+ <summary>
+ The background-color property sets the background color.
+ </summary>
+ <description>
+ The background-color property sets the background color to use when
+ the background picture URI is missing or when it doesn't cover the whole background.
+ It overrides the value defined in the default style sheet.
+ </description>
+ </key>
+ <key name="background-repeat" enum="com.ubuntu.login-screen.BackgroundRepeat">
+ <default>'default'</default>
+ <summary>
+ The background-repeat property sets if/how the background image will be repeated.
+ </summary>
+ <description>
+ The background-repeat property sets if/how a background image will be repeated.
+ By default, a background-image is repeated both vertically and horizontally.
+
+ It overrides the value defined in the default style sheet.
+ </description>
+ </key>
+ <key name="background-size" enum="com.ubuntu.login-screen.BackgroundSize">
+ <default>'default'</default>
+ <summary>
+ The background-size property specifies the size of the background image.
+ </summary>
+ <description>
+ The background-size property specifies the size of the background images.
+
+ There are three keywords you can use with this property:
+ auto: The background image is displayed in its original size;
+ cover: Resize the background image to cover the entire container, even if it has to stretch the image or cut a little bit off one of the edges;
+ contain: Resize the background image to make sure the image is fully visible.
+
+ It overrides the value defined in the default style sheet.
+ </description>
+ </key>
+ </schema>
+</schemalist>
diff --git a/data/meson.build b/data/meson.build
index 30d4917..22d6665 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -95,6 +95,12 @@ schema = configure_file(
configuration: schemaconf,
install_dir: schemadir
)
+schema_ubuntu_login = configure_file(
+ input: 'com.ubuntu.login-screen.gschema.xml.in',
+ output: 'com.ubuntu.login-screen.gschema.xml',
+ configuration: schemaconf,
+ install_dir: schemadir
+)
install_data('00_org.gnome.shell.gschema.override', install_dir: schemadir)
overrides_migration_conf = configuration_data()
@@ -132,7 +138,7 @@ endif
# for unit tests - gnome.compile_schemas() only looks in srcdir
custom_target('compile-schemas',
- input: schema,
+ input: [schema, chema_ubuntu_login],
output: 'gschemas.compiled',
command: [find_program('glib-compile-schemas'), meson.current_build_dir()],
build_by_default: true)
diff --git a/js/ui/background.js b/js/ui/background.js
index 8701941..c055fcf 100644
--- a/js/ui/background.js
+++ b/js/ui/background.js
@@ -533,7 +533,11 @@ var SystemBackground = GObject.registerClass({
let backgroundColor = DEFAULT_BACKGROUND_COLOR;
if (imports.misc.desktop.is("ubuntu")) {
+ const loginSettings = new Gio.Settings({ schema_id: 'com.ubuntu.login-screen' });
+ const bgColor = loginSettings.get_string('background-color');
const dummyBgActor = new imports.gi.St.Widget({ name: 'lockDialogGroup' });
+ if (bgColor)
+ dummyBgActor.set_style(`background-color: ${bgColor};`);
Main.uiGroup.add_actor(dummyBgActor);
backgroundColor = dummyBgActor.get_theme_node().get_background_color();
dummyBgActor.destroy();
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index 1cc5cb7..7a6867f 100644
--- a/js/ui/screenShield.js
+++ b/js/ui/screenShield.js
@@ -29,6 +29,12 @@ const DISABLE_LOCK_KEY = 'disable-lock-screen';
const LOCKED_STATE_STR = 'screenShield.locked';
+const LOGIN_SCREEN_SCHEMA = 'com.ubuntu.login-screen';
+const LOGIN_SCREEN_BACKGROUND_COLOR_KEY = 'background-color';
+const LOGIN_SCREEN_BACKGROUND_PICTURE_URI_KEY = 'background-picture-uri';
+const LOGIN_SCREEN_BACKGROUND_REPEAT_KEY = 'background-repeat';
+const LOGIN_SCREEN_BACKGROUND_SIZE_KEY = 'background-size';
+
// 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,
@@ -116,6 +122,16 @@ var ScreenShield = class extends Signals.EventEmitter {
this._lockSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
this._lockSettings.connect(`changed::${DISABLE_LOCK_KEY}`, this._syncInhibitor.bind(this));
+ this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
+ [
+ LOGIN_SCREEN_BACKGROUND_COLOR_KEY,
+ LOGIN_SCREEN_BACKGROUND_PICTURE_URI_KEY,
+ LOGIN_SCREEN_BACKGROUND_REPEAT_KEY,
+ LOGIN_SCREEN_BACKGROUND_SIZE_KEY,
+ ].forEach(schema => this._loginScreenSettings.connect(`changed::${schema}`,
+ () => this._refreshBackground()));
+ this._refreshBackground();
+
this._isModal = false;
this._isGreeter = false;
this._isActive = false;
@@ -216,6 +232,27 @@ var ScreenShield = class extends Signals.EventEmitter {
return this._isModal;
}
+ _refreshBackground() {
+ const inlineStyle = [];
+
+ const getSetting = s => this._loginScreenSettings.get_string(s);
+ const backgroundColor = getSetting(LOGIN_SCREEN_BACKGROUND_COLOR_KEY);
+ const backgroundPictureUri = getSetting(LOGIN_SCREEN_BACKGROUND_PICTURE_URI_KEY);
+ const backgroundRepeat = getSetting(LOGIN_SCREEN_BACKGROUND_REPEAT_KEY);
+ const backgroundSize = getSetting(LOGIN_SCREEN_BACKGROUND_SIZE_KEY);
+
+ if (backgroundColor)
+ inlineStyle.push(`background-color: ${backgroundColor}`);
+ if (backgroundPictureUri)
+ inlineStyle.push(`background-image: url("${backgroundPictureUri}")`);
+ if (backgroundRepeat !== 'default')
+ inlineStyle.push(`background-repeat: ${backgroundRepeat}`);
+ if (backgroundSize !== 'default')
+ inlineStyle.push(`background-size: ${backgroundSize}`);
+
+ this._lockDialogGroup.set_style(inlineStyle.join('; '));
+ }
+
async _syncInhibitor() {
const lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY) ||
this._settings.get_boolean(SUSPEND_LOCK_ENABLED_KEY);

View File

@ -0,0 +1,81 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Wed, 24 Aug 2022 19:15:36 +0200
Subject: darkMode: Add support to Yaru theme color variants
Support switching to dark mode when using the Yaru theme color accents.
---
js/ui/status/darkMode.js | 43 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 41 insertions(+), 2 deletions(-)
diff --git a/js/ui/status/darkMode.js b/js/ui/status/darkMode.js
index d1ec2bd..ea0dc6a 100644
--- a/js/ui/status/darkMode.js
+++ b/js/ui/status/darkMode.js
@@ -1,5 +1,5 @@
/* exported Indicator */
-const {Gio, GObject} = imports.gi;
+const {Gio, GObject, St} = imports.gi;
const Main = imports.ui.main;
const {QuickToggle, SystemIndicator} = imports.ui.quickSettings;
@@ -18,6 +18,9 @@ class DarkModeToggle extends QuickToggle {
this._changedId = this._settings.connect('changed::color-scheme',
() => this._sync());
+ St.Settings.get().connect('notify::gtk-theme', () => this._sync());
+ St.Settings.get().connect('notify::gtk-theme-variant', () => this._sync());
+
this.connectObject(
'destroy', () => this._settings.run_dispose(),
'clicked', () => this._toggleMode(),
@@ -27,13 +30,49 @@ class DarkModeToggle extends QuickToggle {
_toggleMode() {
Main.layoutManager.screenTransition.run();
+ const preferDark = !this.checked;
+ const {gtkTheme, gtkThemeVariant} = St.Settings.get();
+ const themeVariant = gtkThemeVariant?.toLowerCase();
this._settings.set_string('color-scheme',
this.checked ? 'default' : 'prefer-dark');
+
+ if (gtkTheme === 'Yaru')
+ this._setYaruSettings(themeVariant, preferDark);
+ }
+
+ _setYaruSettings(themeVariant, preferDark) {
+ const currentlyDark = themeVariant === 'dark' || themeVariant?.endsWith('-dark');
+ if (currentlyDark)
+ themeVariant = themeVariant.slice(0, -'-dark'.length);
+
+ if (currentlyDark !== preferDark) {
+ const newTheme = `Yaru${
+ themeVariant ? `-${themeVariant}` : ''}${
+ preferDark ? '-dark' : ''}`;
+
+ this._settings.set_string('gtk-theme', newTheme);
+ this._settings.set_string('icon-theme', newTheme);
+ }
+
+ const schemaSource = Gio.SettingsSchemaSource.get_default();
+ const geditSchema = schemaSource.lookup('org.gnome.gedit.preferences.editor', true);
+
+ if (geditSchema) {
+ const geditSettings = Gio.Settings.new_full(geditSchema, null, null);
+ const geditScheme = geditSettings.get_user_value('scheme')?.unpack();
+
+ if (geditScheme?.startsWith('Yaru') &&
+ geditScheme.endsWith('-dark') !== preferDark)
+ geditSettings.set_string('scheme', `Yaru${preferDark ? '-dark' : ''}`);
+ }
}
_sync() {
const colorScheme = this._settings.get_string('color-scheme');
- const checked = colorScheme === 'prefer-dark';
+ const {gtkTheme, gtkThemeVariant} = St.Settings.get();
+ let checked = colorScheme === 'prefer-dark';
+ if (gtkTheme === 'Yaru' && !gtkThemeVariant?.endsWith('dark'))
+ checked = false;
if (this.checked !== checked)
this.set({checked});
}

View File

@ -0,0 +1,66 @@
From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Date: Wed, 20 Jun 2018 19:22:06 +0200
Subject: Add an helper to detect current desktop
We will differentiate some behavior depending on current desktop. Add an
helper to centralize the current desktop detection.
Forwarded: not-needed
Origin: ubuntu
===================================================================
---
js/js-resources.gresource.xml | 1 +
js/misc/desktop.js | 33 +++++++++++++++++++++++++++++++++
2 files changed, 34 insertions(+)
create mode 100644 js/misc/desktop.js
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
index 76b5f95..5babd0f 100644
--- a/js/js-resources.gresource.xml
+++ b/js/js-resources.gresource.xml
@@ -13,6 +13,7 @@
<file>misc/config.js</file>
<file>misc/extensionUtils.js</file>
+ <file>misc/desktop.js</file>
<file>misc/fileUtils.js</file>
<file>misc/dbusUtils.js</file>
<file>misc/gnomeSession.js</file>
diff --git a/js/misc/desktop.js b/js/misc/desktop.js
new file mode 100644
index 0000000..8bdca57
--- /dev/null
+++ b/js/misc/desktop.js
@@ -0,0 +1,33 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+const GLib = imports.gi.GLib;
+
+// current desktop doesn't change unless we restart the shell or control
+// the env variable. It's safe to cache matching result
+const _currentDesktopsMatches = new Map();
+
+// is:
+// @name: desktop string you want to assert if it matches the current desktop env
+//
+// The function examples XDG_CURRENT_DESKTOP and return if the current desktop
+// is part of that desktop string.
+//
+// Return value: if the environment isn't set or doesn't match, return False
+// otherwise, return True.
+function is(name) {
+ if (!_currentDesktopsMatches.size) {
+ const desktopsEnv = GLib.getenv('XDG_CURRENT_DESKTOP');
+ if (!desktopsEnv) {
+ _currentDesktopsMatches.set(name, false);
+ return false;
+ }
+
+ const desktops = desktopsEnv.split(':');
+ desktops.forEach(d => _currentDesktopsMatches.set(d, true));
+
+ if (!_currentDesktopsMatches.size)
+ _currentDesktopsMatches.set(name, _currentDesktopsMatches.has(name));
+ }
+
+ return !!_currentDesktopsMatches.get(name);
+}

View File

@ -0,0 +1,42 @@
From: Jeremy Soller <jeremy@system76.com>
Date: Wed, 20 Jun 2018 19:22:06 +0200
Subject: Add support for GDM theme alternatives
GNOME vanilla and systemd76 derivative ships their own GDM theme.
This allows to provide alternative gresource file for gdm3 that must contain
a `gdm3.css` stylesheet that will be applied.
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=787454
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1715722
Last-Update: 2017-09-08
---
data/gnome-shell-theme.gresource.xml | 1 +
js/ui/sessionMode.js | 2 ++
2 files changed, 3 insertions(+)
diff --git a/data/gnome-shell-theme.gresource.xml b/data/gnome-shell-theme.gresource.xml
index 24b3be8..2632e5d 100644
--- a/data/gnome-shell-theme.gresource.xml
+++ b/data/gnome-shell-theme.gresource.xml
@@ -9,6 +9,7 @@
<file>checkbox-off-focused.svg</file>
<file>checkbox-off-light.svg</file>
<file>checkbox-off.svg</file>
+ <file alias="gdm.css">gnome-shell.css</file>
<file>gnome-shell.css</file>
<file>gnome-shell-high-contrast.css</file>
<file>gnome-shell-start.svg</file>
diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js
index b38bcdf..4284366 100644
--- a/js/ui/sessionMode.js
+++ b/js/ui/sessionMode.js
@@ -50,6 +50,8 @@ const _modes = {
'gdm': {
hasNotifications: true,
+ stylesheetName: 'gdm.css',
+ themeResourceName: 'gdm-theme.gresource',
isGreeter: true,
isPrimary: true,
unlockDialog: imports.gdm.loginDialog.LoginDialog,

View File

@ -0,0 +1,36 @@
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
Date: Thu, 2 Apr 2020 17:16:27 +0800
Subject: Keep the Ubuntu logo at full brightness during startup animation
Bug-Ubuntu: https://bugs.launchpad.net/bugs/1867133
Forwarded: not-needed
Last-Update: 2020-03-18
---
js/gdm/loginDialog.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index 6071936..196fab5 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -1260,7 +1260,11 @@ var LoginDialog = GObject.registerClass({
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE });
this.activate();
- this.opacity = 0;
+ // Clutter doesn't yet fully support invisible parents with forced
+ // visible children and will make everything invisible (flicker) on
+ // the first frame if we start at 0. So we start at 1 instead...
+ this.opacity = 1;
+ this._logoBin.set_opacity_override(255);
this._grab = Main.pushModal(global.stage, { actionMode: Shell.ActionMode.LOGIN_SCREEN });
@@ -1268,6 +1272,7 @@ var LoginDialog = GObject.registerClass({
opacity: 255,
duration: 1000,
mode: Clutter.AnimationMode.EASE_IN_QUAD,
+ onComplete: () => { this._logoBin.set_opacity_override(-1); },
});
return true;

View File

@ -0,0 +1,34 @@
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
Date: Wed, 31 Mar 2021 17:59:09 +0800
Subject: layout: Try to allocate before getting size of tracked actors
Because we're about to `get_transformed_{position,size}` of each,
which will return NaNs if not yet allocated. Those NaNs were finding
their way into the workspace strut definitions on startup and not
getting corrected until after the startup animation completed. This
meant any extensions depending on the `workareas-changed` signal were
getting an incorrect workarea (the whole workspace) and so were
rendered out of place during the login animation. Now they're not.
Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
Origin: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1785
Bug-Ubuntu: https://launchpad.net/bugs/1917939, https://launchpad.net/bugs/1919979
Bug-GNOME: https://gitlab.gnome.org/GNOME/mutter/-/issues/1627
Forwarded: yes
Last-Update: 2021-04-07
---
js/ui/layout.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 0b11d24..42c7a36 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -1026,6 +1026,7 @@ var LayoutManager = GObject.registerClass({
if (!(actorData.affectsInputRegion && wantsInputRegion) && !actorData.affectsStruts)
continue;
+ actorData.actor.get_allocation_box();
let [x, y] = actorData.actor.get_transformed_position();
let [w, h] = actorData.actor.get_transformed_size();
x = Math.round(x);

View File

@ -0,0 +1,93 @@
From: Tim Lunn <tim@feathertop.org>
Date: Tue, 9 Oct 2012 11:18:28 +0200
Subject: [PATCH] userMenu: allow user switching when using lightdm
When running lightdm and gnome-shell, its currently not possible to
switch users via the usermenu. This commit adds a dbus call to
switch to the lightdm greeter.
https://bugzilla.gnome.org/show_bug.cgi?id=685794
---
js/misc/systemActions.js | 47 ++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 40 insertions(+), 7 deletions(-)
diff --git a/js/misc/systemActions.js b/js/misc/systemActions.js
index c57afe5..e4b301f 100644
--- a/js/misc/systemActions.js
+++ b/js/misc/systemActions.js
@@ -224,6 +224,34 @@ const SystemActions = GObject.registerClass({
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName;
}
+ _lightdmLoginSession() {
+ try {
+ let seat = GLib.getenv("XDG_SEAT_PATH");
+ let result = Gio.DBus.system.call_sync('org.freedesktop.DisplayManager',
+ seat,
+ 'org.freedesktop.DisplayManager.Seat',
+ 'SwitchToGreeter', null, null,
+ Gio.DBusCallFlags.NONE,
+ -1, null);
+ return result;
+ } catch(e) {
+ return false;
+ }
+ }
+
+ _sensorProxyAppeared() {
+ this._sensorProxy = new SensorProxy(Gio.DBus.system, SENSOR_BUS_NAME, SENSOR_OBJECT_PATH,
+ (proxy, error) => {
+ if (error) {
+ log(error.message);
+ return;
+ }
+ this._sensorProxy.connect('g-properties-changed',
+ () => { this._updateOrientationLock(); });
+ this._updateOrientationLock();
+ });
+ }
+
_updateOrientationLock() {
const available = this._monitorManager.get_panel_orientation_managed();
@@ -325,7 +353,7 @@ const SystemActions = GObject.registerClass({
_updateLockScreen() {
let showLock = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
- this._actions.get(LOCK_SCREEN_ACTION_ID).available = showLock && allowLockScreen && LoginManager.canLock();
+ this._actions.get(LOCK_SCREEN_ACTION_ID).available = showLock && allowLockScreen;
this.notify('can-lock-screen');
}
@@ -413,20 +441,25 @@ const SystemActions = GObject.registerClass({
if (!this._actions.get(LOCK_SCREEN_ACTION_ID).available)
throw new Error('The lock-screen action is not available!');
- Main.screenShield.lock(true);
+ if (Main.screenShield)
+ Main.screenShield.lock(true);
+ else
+ this._lightdmLoginSession();
}
activateSwitchUser() {
if (!this._actions.get(SWITCH_USER_ACTION_ID).available)
throw new Error('The switch-user action is not available!');
- if (Main.screenShield)
+ if (Main.screenShield) {
Main.screenShield.lock(false);
- Clutter.threads_add_repaint_func_full(Clutter.RepaintFlags.POST_PAINT, () => {
- Gdm.goto_login_session_sync(null);
- return false;
- });
+ Clutter.threads_add_repaint_func_full(Clutter.RepaintFlags.POST_PAINT, () => {
+ Gdm.goto_login_session_sync(null);
+ return false;
+ });
+ } else
+ this._lightdmLoginSession();
}
activateLogout() {

View File

@ -0,0 +1,48 @@
From: Tim Lunn <tim@feathertop.org>
Date: Wed, 20 Jun 2018 19:22:06 +0200
Subject: add support for the ubuntu lock on suspend option
Bug-Ubuntu: https://bugs.launchpad.net/bugs/1063110
---
js/ui/screenShield.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index 325fbff..1cc5cb7 100644
--- a/js/ui/screenShield.js
+++ b/js/ui/screenShield.js
@@ -22,6 +22,7 @@ const { adjustAnimationTime } = imports.ui.environment;
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOCK_ENABLED_KEY = 'lock-enabled';
const LOCK_DELAY_KEY = 'lock-delay';
+const SUSPEND_LOCK_ENABLED_KEY = 'ubuntu-lock-on-suspend';
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const DISABLE_LOCK_KEY = 'disable-lock-screen';
@@ -110,6 +111,7 @@ var ScreenShield = class extends Signals.EventEmitter {
this._settings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
this._settings.connect(`changed::${LOCK_ENABLED_KEY}`, this._syncInhibitor.bind(this));
+ this._settings.connect(`changed::${SUSPEND_LOCK_ENABLED_KEY}`, this._syncInhibitor.bind(this));
this._lockSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
this._lockSettings.connect(`changed::${DISABLE_LOCK_KEY}`, this._syncInhibitor.bind(this));
@@ -215,7 +217,8 @@ var ScreenShield = class extends Signals.EventEmitter {
}
async _syncInhibitor() {
- const lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
+ const lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY) ||
+ this._settings.get_boolean(SUSPEND_LOCK_ENABLED_KEY);
const lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY);
const inhibit = !!this._loginSession && this._loginSession.Active &&
!this._isActive && lockEnabled && !lockLocked &&
@@ -246,7 +249,7 @@ var ScreenShield = class extends Signals.EventEmitter {
_prepareForSleep(loginManager, aboutToSuspend) {
if (aboutToSuspend) {
- if (this._settings.get_boolean(LOCK_ENABLED_KEY))
+ if (this._settings.get_boolean(SUSPEND_LOCK_ENABLED_KEY))
this.lock(true);
} else {
this._wakeUpScreen();

View File

@ -0,0 +1,70 @@
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
Date: Tue, 5 Oct 2021 04:39:09 +0200
Subject: main: Avoid meta and gjs finalization
This is a workaround to maintain a clean environment for gnome-shell
and particularly JavaScript/GJS to shutdown without crashing.
The main cause of shutdown crashes is _shell_global_destroy_gjs_context
needing Clutter/Cogl resources to clean up, when those resources have
already been destroyed by meta_finalize in meta_run. So by never calling
meta_finalize via meta_run, we can simply avoid all those ordering
conflicts that cause so many crashes.
https://launchpad.net/bugs/1936826 verified fixed
https://launchpad.net/bugs/1942031 verified fixed
https://launchpad.net/bugs/1942121 verified fixed
https://launchpad.net/bugs/1943406 expected fixed
https://launchpad.net/bugs/1944054 expected fixed
https://launchpad.net/bugs/1945010 expected fixed
https://launchpad.net/bugs/1945116 expected fixed
https://launchpad.net/bugs/1944388 expected fixed
https://launchpad.net/bugs/1964458 expected fixed
Proper fixes will eventually come upstream when these are finished or
replaced by something else:
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1759
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/648
Given that, and upstream's usual preference for proper permanent fixes,
this will not be forwarded.
Bug-Ubuntu: https://launchpad.net/bugs/1936826,
https://launchpad.net/bugs/1942031,
https://launchpad.net/bugs/1942121,
https://launchpad.net/bugs/1943406,
https://launchpad.net/bugs/1944054,
https://launchpad.net/bugs/1945010,
https://launchpad.net/bugs/1945116,
https://launchpad.net/bugs/1944388,
https://launchpad.net/bugs/1964458
Forwarded: no
Last-Update: 2022-03-25
---
src/main.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/main.c b/src/main.c
index 6604fde..77b035c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -668,11 +668,17 @@ main (int argc, char **argv)
ecode = EXIT_FAILURE;
}
- meta_context_destroy (g_steal_pointer (&context));
+ // FIXME: We're leaking context here, but that's to prevent LP: #1936826
+ g_steal_pointer (&context);
shell_profiler_shutdown ();
g_debug ("Doing final cleanup");
+
+ // Workaround live session crashes by leaking JS contexts (LP: #1964458)
+ if (g_strcmp0 (shell_global_get_session_mode (shell_global_get ()), "ubiquity") == 0)
+ return ecode;
+
_shell_global_destroy_gjs_context (shell_global_get ());
g_object_unref (shell_global_get ());

View File

@ -0,0 +1,352 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Fri, 25 Feb 2022 01:07:12 +0100
Subject: main: Support loading multiple Yaru theme variants
Yaru can provide multiple variants, we can support using more theme
variants in GNOME shell as it happens on Gtk apps.
So, make StSettings to compute the main theme and the chosen variant,
and we use those to pick the correct .css file.
We don't make difference between dark/light themes here, as we assume
that the shell theme will always be dark or light.
Forwarded: not-needed
---
data/meson.build | 8 +-
data/org.gnome.shell.ubuntu.gschema.xml.in | 17 +++++
js/ui/main.js | 42 +++++++++++
src/st/meson.build | 1 +
src/st/st-settings.c | 114 +++++++++++++++++++++++++++++
5 files changed, 181 insertions(+), 1 deletion(-)
create mode 100644 data/org.gnome.shell.ubuntu.gschema.xml.in
diff --git a/data/meson.build b/data/meson.build
index 22d6665..e16d108 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -95,6 +95,12 @@ schema = configure_file(
configuration: schemaconf,
install_dir: schemadir
)
+schema_ubuntu = configure_file(
+ input: 'org.gnome.shell.ubuntu.gschema.xml.in',
+ output: 'org.gnome.shell.ubuntu.gschema.xml',
+ configuration: schemaconf,
+ install_dir: schemadir
+)
schema_ubuntu_login = configure_file(
input: 'com.ubuntu.login-screen.gschema.xml.in',
output: 'com.ubuntu.login-screen.gschema.xml',
@@ -138,7 +144,7 @@ endif
# for unit tests - gnome.compile_schemas() only looks in srcdir
custom_target('compile-schemas',
- input: [schema, chema_ubuntu_login],
+ input: [schema, schema_ubuntu, schema_ubuntu_login],
output: 'gschemas.compiled',
command: [find_program('glib-compile-schemas'), meson.current_build_dir()],
build_by_default: true)
diff --git a/data/org.gnome.shell.ubuntu.gschema.xml.in b/data/org.gnome.shell.ubuntu.gschema.xml.in
new file mode 100644
index 0000000..6f9cc62
--- /dev/null
+++ b/data/org.gnome.shell.ubuntu.gschema.xml.in
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schemalist gettext-domain="@GETTEXT_PACKAGE@">
+ <enum id="org.gnome.shell.ubuntu.GDesktopColorScheme">
+ <value value="1" nick="default"/>
+ <value value="2" nick="prefer-dark"/>
+ <value value="3" nick="prefer-light"/>
+ </enum>
+ <schema id="org.gnome.shell.ubuntu" path="/org/gnome/shell/ubuntu/">
+ <key name="color-scheme" enum="org.gnome.shell.ubuntu.GDesktopColorScheme">
+ <default>'default'</default>
+ <summary>Color scheme</summary>
+ <description>
+ The preferred color scheme for the shell user interface. Valid values are “default”, “prefer-dark”, “prefer-light”.
+ </description>
+ </key>
+ </schema>
+</schemalist>
diff --git a/js/ui/main.js b/js/ui/main.js
index 33f62be..60969fd 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -186,6 +186,9 @@ function start() {
sessionMode.connect('updated', _sessionUpdated);
St.Settings.get().connect('notify::high-contrast', _loadDefaultStylesheet);
+ St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet);
+ St.Settings.get().connect('notify::gtk-theme-variant', _loadDefaultStylesheet);
+ St.Settings.get().connect('notify::shell-color-scheme', _loadDefaultStylesheet);
// Initialize ParentalControlsManager before the UI
ParentalControlsManager.getDefault();
@@ -423,6 +426,38 @@ function _getStylesheet(name) {
return null;
}
+function _getYaruStyleSheet(themeVariant) {
+ const { shellColorScheme: colorScheme } = St.Settings.get();
+ const baseThemeName = sessionMode.stylesheetName.split(".css").at(0);
+ const isDark = themeVariant === 'dark' || themeVariant?.endsWith('-dark');
+ let colorSchemeVariant;
+
+ if (isDark && colorScheme == 'prefer-light') {
+ colorSchemeVariant = themeVariant.split('-').slice(0, -1).join('-');
+ } else if (!isDark && colorScheme == 'prefer-dark' ) {
+ colorSchemeVariant = themeVariant ? `${themeVariant}-dark` : 'dark';
+ }
+
+ if (colorSchemeVariant !== undefined) {
+ if (colorSchemeVariant.length)
+ colorSchemeVariant = `-${colorSchemeVariant}`;
+ const stylesheet = _getStylesheet(`${baseThemeName}${colorSchemeVariant}.css`);
+ if (stylesheet)
+ return stylesheet;
+ }
+
+ if (!themeVariant)
+ return null;
+
+ const stylesheet = _getStylesheet(`${baseThemeName}-${themeVariant}.css`);
+
+ // Try to use the dark theme if a dark variant is selected
+ if (!stylesheet && isDark)
+ return _getStylesheet(`${baseThemeName}-dark.css`);
+
+ return stylesheet;
+}
+
function _getDefaultStylesheet() {
let stylesheet = null;
let name = sessionMode.stylesheetName;
@@ -431,6 +466,13 @@ function _getDefaultStylesheet() {
if (St.Settings.get().high_contrast)
stylesheet = _getStylesheet(name.replace('.css', '-high-contrast.css'));
+ if (stylesheet == null) {
+ const settings = St.Settings.get();
+
+ if (settings.gtkTheme === 'Yaru')
+ stylesheet = _getYaruStyleSheet(settings.gtkThemeVariant?.toLowerCase());
+ }
+
if (stylesheet == null)
stylesheet = _getStylesheet(sessionMode.stylesheetName);
diff --git a/src/st/meson.build b/src/st/meson.build
index 717aa05..03a5978 100644
--- a/src/st/meson.build
+++ b/src/st/meson.build
@@ -202,6 +202,7 @@ if get_option('tests')
)
test('CSS styling support', test_theme,
+ env: ['GSETTINGS_SCHEMA_DIR=' + meson.project_build_root() / 'data' ],
workdir: meson.current_source_dir()
)
endif
diff --git a/src/st/st-settings.c b/src/st/st-settings.c
index 04bf68f..a5f584d 100644
--- a/src/st/st-settings.c
+++ b/src/st/st-settings.c
@@ -33,6 +33,7 @@
#define KEY_FONT_NAME "font-name"
#define KEY_HIGH_CONTRAST "high-contrast"
#define KEY_GTK_ICON_THEME "icon-theme"
+#define KEY_GTK_THEME "gtk-theme"
#define KEY_MAGNIFIER_ACTIVE "screen-magnifier-enabled"
#define KEY_DISABLE_SHOW_PASSWORD "disable-show-password"
@@ -43,7 +44,10 @@ enum {
PROP_DRAG_THRESHOLD,
PROP_FONT_NAME,
PROP_HIGH_CONTRAST,
+ PROP_GTK_THEME,
+ PROP_GTK_THEME_VARIANT,
PROP_GTK_ICON_THEME,
+ PROP_SHELL_COLOR_SCHEME,
PROP_MAGNIFIER_ACTIVE,
PROP_SLOW_DOWN_FACTOR,
PROP_DISABLE_SHOW_PASSWORD,
@@ -60,10 +64,13 @@ struct _StSettings
GSettings *a11y_applications_settings;
GSettings *a11y_interface_settings;
GSettings *lockdown_settings;
+ GSettings *ubuntu_settings;
gchar *font_name;
gboolean high_contrast;
gchar *gtk_icon_theme;
+ gchar *gtk_theme;
+ gchar *gtk_theme_variant;
int inhibit_animations_count;
gboolean enable_animations;
gboolean primary_paste;
@@ -133,7 +140,10 @@ st_settings_finalize (GObject *object)
g_object_unref (settings->a11y_applications_settings);
g_object_unref (settings->a11y_interface_settings);
g_object_unref (settings->lockdown_settings);
+ g_object_unref (settings->ubuntu_settings);
g_free (settings->font_name);
+ g_free (settings->gtk_theme);
+ g_free (settings->gtk_theme_variant);
g_free (settings->gtk_icon_theme);
G_OBJECT_CLASS (st_settings_parent_class)->finalize (object);
@@ -185,6 +195,16 @@ st_settings_get_property (GObject *object,
case PROP_GTK_ICON_THEME:
g_value_set_string (value, settings->gtk_icon_theme);
break;
+ case PROP_GTK_THEME:
+ g_value_set_string (value, settings->gtk_theme);
+ break;
+ case PROP_GTK_THEME_VARIANT:
+ g_value_set_string (value, settings->gtk_theme_variant);
+ break;
+ case PROP_SHELL_COLOR_SCHEME:
+ g_value_take_string (value,
+ g_settings_get_string (settings->ubuntu_settings, "color-scheme"));
+ break;
case PROP_MAGNIFIER_ACTIVE:
g_value_set_boolean (value, settings->magnifier_active);
break;
@@ -275,6 +295,39 @@ st_settings_class_init (StSettingsClass *klass)
"",
ST_PARAM_READABLE);
+ /**
+ * StSettings:gtk-theme:
+ *
+ * The current GTK theme
+ */
+ props[PROP_GTK_THEME] = g_param_spec_string ("gtk-theme",
+ "GTK Theme",
+ "GTK Theme",
+ "",
+ ST_PARAM_READABLE);
+
+ /**
+ * StSettings:gtk-theme-variant:
+ *
+ * The current GTK theme
+ */
+ props[PROP_GTK_THEME_VARIANT] = g_param_spec_string ("gtk-theme-variant",
+ "GTK Theme Variant",
+ "GTK Theme Variant",
+ "",
+ ST_PARAM_READABLE);
+
+ /**
+ * StSettings:shell-color-scheme:
+ *
+ * The current GTK theme
+ */
+ props[PROP_SHELL_COLOR_SCHEME] = g_param_spec_string ("shell-color-scheme",
+ "Shell Color Scheme",
+ "Shell Color Scheme",
+ "default",
+ ST_PARAM_READABLE);
+
/**
* StSettings:magnifier-active:
*
@@ -311,6 +364,45 @@ st_settings_class_init (StSettingsClass *klass)
g_object_class_install_properties (object_class, N_PROPS, props);
}
+static void
+update_theme_settings (StSettings *settings)
+{
+ g_auto(GStrv) parts = NULL;
+ g_autofree char *theme = NULL;
+ g_autofree char *variant = NULL;
+
+ theme = g_settings_get_string (settings->interface_settings, KEY_GTK_THEME);
+ parts = g_strsplit (theme, "-", 2);
+
+ switch (g_strv_length (parts))
+ {
+ case 2:
+ variant = g_strdup (parts[1]);
+ /* fallthrough */
+ case 1:
+ theme = g_strdup (parts[0]);
+ break;
+ }
+
+ if (g_strcmp0 (settings->gtk_theme, theme) != 0)
+ {
+ g_free (settings->gtk_theme);
+ settings->gtk_theme = g_steal_pointer (&theme);
+
+ g_object_notify_by_pspec (G_OBJECT (settings),
+ props[PROP_GTK_THEME]);
+ }
+
+ if (g_strcmp0 (settings->gtk_theme_variant, variant) != 0)
+ {
+ g_free (settings->gtk_theme_variant);
+ settings->gtk_theme_variant = g_steal_pointer (&variant);
+
+ g_object_notify_by_pspec (G_OBJECT (settings),
+ props[PROP_GTK_THEME_VARIANT]);
+ }
+}
+
static void
on_interface_settings_changed (GSettings *g_settings,
const gchar *key,
@@ -332,6 +424,10 @@ on_interface_settings_changed (GSettings *g_settings,
settings->font_name = g_settings_get_string (g_settings, key);
g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_FONT_NAME]);
}
+ else if (g_str_equal (key, KEY_GTK_THEME))
+ {
+ update_theme_settings (settings);
+ }
else if (g_str_equal (key, KEY_GTK_ICON_THEME))
{
g_free (settings->gtk_icon_theme);
@@ -341,6 +437,18 @@ on_interface_settings_changed (GSettings *g_settings,
}
}
+static void
+on_ubuntu_settings_changed (GSettings *g_settings,
+ const gchar *key,
+ StSettings *settings)
+{
+ if (g_str_equal (key, "color-scheme"))
+ {
+ g_object_notify_by_pspec (G_OBJECT (settings),
+ props[PROP_SHELL_COLOR_SCHEME]);
+ }
+}
+
static void
on_mouse_settings_changed (GSettings *g_settings,
const gchar *key,
@@ -398,6 +506,10 @@ st_settings_init (StSettings *settings)
g_signal_connect (settings->interface_settings, "changed",
G_CALLBACK (on_interface_settings_changed), settings);
+ settings->ubuntu_settings = g_settings_new ("org.gnome.shell.ubuntu");
+ g_signal_connect (settings->ubuntu_settings, "changed",
+ G_CALLBACK (on_ubuntu_settings_changed), settings);
+
settings->mouse_settings = g_settings_new ("org.gnome.desktop.peripherals.mouse");
g_signal_connect (settings->mouse_settings, "changed",
G_CALLBACK (on_mouse_settings_changed), settings);
@@ -414,6 +526,8 @@ st_settings_init (StSettings *settings)
g_signal_connect (settings->lockdown_settings, "changed",
G_CALLBACK (on_lockdown_settings_changed), settings);
+ update_theme_settings (settings);
+
settings->enable_animations = g_settings_get_boolean (settings->interface_settings,
KEY_ENABLE_ANIMATIONS);
settings->primary_paste = g_settings_get_boolean (settings->interface_settings,

View File

@ -0,0 +1,50 @@
From: Didier Roche <didrocks@ubuntu.com>
Date: Tue, 22 Oct 2019 11:22:06 +0200
Subject: Resolve real path name for theme file
We are using alternative theme paths. Some of them are symlinks like
gdm3.css. It points to a different directory and we need to ensure
assets are loaded from the real theme path then (assets path are
relative to it).
Resolve them symlinks to ensure we use the original file itself when
loading the stylesheet.
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1798747
Forwarded: Not-needed (upstream doesn't support officially theming)
---
js/ui/main.js | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/js/ui/main.js b/js/ui/main.js
index fc5ae80..3bb9b8f 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -393,6 +393,14 @@ async function _handleLockScreenWarning() {
}
}
+function _realpath(path) {
+ try {
+ while (GLib.file_test(path, GLib.FileTest.IS_SYMLINK))
+ path = GLib.file_read_link(path);
+ } catch (e) { }
+ return path;
+}
+
function _getStylesheet(name) {
let stylesheet;
@@ -403,12 +411,12 @@ function _getStylesheet(name) {
let dataDirs = GLib.get_system_data_dirs();
for (let i = 0; i < dataDirs.length; i++) {
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'theme', name]);
- stylesheet = Gio.file_new_for_path(path);
+ stylesheet = Gio.file_new_for_path(_realpath(path));
if (stylesheet.query_exists(null))
return stylesheet;
}
- stylesheet = Gio.File.new_for_path(`${global.datadir}/theme/${name}`);
+ stylesheet = Gio.File.new_for_path(_realpath(`${global.datadir}/theme/${name}`));
if (stylesheet.query_exists(null))
return stylesheet;

View File

@ -0,0 +1,163 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Thu, 23 Aug 2018 20:00:57 +0200
Subject: search: call XUbuntuCancel method on providers when no data is
needed
Add XUbuntuCancel method to search providers and call it when a search provider
is still doing operations.
Ignore the result when the method does not exist or is cancelled.
This will allow to stop operations on providers.
Fixes LP: #1756826
Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-shell/issues/183
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/bionic/+source/gnome-shell/+bug/1756826
Forwarded: not-needed
---
.../org.gnome.ShellSearchProvider.xml | 6 ++++
.../org.gnome.ShellSearchProvider2.xml | 6 ++++
js/ui/remoteSearch.js | 12 ++++++++
js/ui/search.js | 33 ++++++++++++++++++++++
4 files changed, 57 insertions(+)
diff --git a/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml b/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml
index 78ad305..393cb01 100644
--- a/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml
+++ b/data/dbus-interfaces/org.gnome.ShellSearchProvider.xml
@@ -69,5 +69,11 @@
<method name="ActivateResult">
<arg type="s" name="identifier" direction="in" />
</method>
+
+ <!--
+ XUbuntuCancel:
+ Cancel the current search operation
+ -->
+ <method name="XUbuntuCancel" />
</interface>
</node>
diff --git a/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml b/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml
index 9502340..8141bc0 100644
--- a/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml
+++ b/data/dbus-interfaces/org.gnome.ShellSearchProvider2.xml
@@ -83,5 +83,11 @@
<arg type="as" name="terms" direction="in" />
<arg type="u" name="timestamp" direction="in" />
</method>
+
+ <!--
+ XUbuntuCancel:
+ Cancel the current search operation
+ -->
+ <method name="XUbuntuCancel" />
</interface>
</node>
diff --git a/js/ui/remoteSearch.js b/js/ui/remoteSearch.js
index 87ee384..74f9c38 100644
--- a/js/ui/remoteSearch.js
+++ b/js/ui/remoteSearch.js
@@ -26,6 +26,7 @@ const SearchProviderIface = `
<method name="ActivateResult">
<arg type="s" direction="in" />
</method>
+<method name="XUbuntuCancel" />
</interface>
</node>`;
@@ -54,6 +55,7 @@ const SearchProvider2Iface = `
<arg type="as" direction="in" />
<arg type="u" direction="in" />
</method>
+<method name="XUbuntuCancel" />
</interface>
</node>`;
@@ -301,6 +303,16 @@ var RemoteSearchProvider = class {
return resultMetas;
}
+ async XUbuntuCancel(cancellable) {
+ try {
+ await this.proxy.XUbuntuCancelAsync(cancellable);
+ } catch (error) {
+ if (!error.matches(Gio.DBusError, Gio.DBusError.UNKNOWN_METHOD) &&
+ !error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
+ log(`Received error from D-Bus search provider ${this.id} during XUbuntuCancel: ${error}`);
+ }
+ }
+
activateResult(id) {
this.proxy.ActivateResultAsync(id).catch(logError);
}
diff --git a/js/ui/search.js b/js/ui/search.js
index 71870a0..fc668fb 100644
--- a/js/ui/search.js
+++ b/js/ui/search.js
@@ -218,7 +218,9 @@ var SearchResultsBase = GObject.registerClass({
this._cancellable.cancel();
this._cancellable.reset();
+ this.provider.resultsMetasInProgress = true;
const metas = await this.provider.getResultMetas(metasNeeded, this._cancellable);
+ this.provider.resultsMetasInProgress = this._cancellable.is_cancelled();
if (this._cancellable.is_cancelled()) {
if (metas.length > 0)
@@ -588,6 +590,10 @@ var SearchResultsView = GObject.registerClass({
this._searchTimeoutId = 0;
this._cancellable = new Gio.Cancellable();
+ this._searchCancelCancellable = new Gio.Cancellable();
+ const cancellableCancelledId = this._cancellable.connect(() =>
+ this._cancelSearchProviderRequest());
+ this.connect('destroy', () => this._cancellable.disconnect(cancellableCancelledId));
this._registerProvider(new AppDisplay.AppSearchProvider());
@@ -636,11 +642,31 @@ var SearchResultsView = GObject.registerClass({
}
}
+ _cancelSearchProviderRequest() {
+ if (this._terms.length !== 0 || this._searchCancelTimeoutId)
+ return;
+
+ this._searchCancelTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 100, () => {
+ Promise.all(this._providers.map(async provider => {
+ if (provider.isRemoteProvider &&
+ (provider.searchInProgress || provider.resultsMetasInProgress)) {
+ await provider.XUbuntuCancel(this._searchCancelCancellable);
+ provider.searchInProgress = false;
+ provider.resultsMetasInProgress = false;
+ }
+ })).catch(logError);
+
+ delete this._searchCancelTimeoutId;
+ return GLib.SOURCE_REMOVE;
+ });
+ }
+
_reset() {
this._terms = [];
this._results = {};
this._clearDisplay();
this._clearSearchTimeout();
+ this._cancelSearchProviderRequest();
this._defaultResult = null;
this._startingSearch = false;
@@ -712,6 +738,13 @@ var SearchResultsView = GObject.registerClass({
if (this._terms.length > 0)
isSubSearch = searchString.indexOf(previousSearchString) == 0;
+ this._searchCancelCancellable.cancel();
+ this._searchCancelCancellable.reset();
+ if (this._searchCancelTimeoutId) {
+ GLib.source_remove(this._searchCancelTimeoutId);
+ delete this._searchCancelTimeoutId;
+ }
+
this._terms = terms;
this._isSubSearch = isSubSearch;
this._updateSearchProgress();

View File

@ -0,0 +1,89 @@
From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Date: Wed, 20 Jun 2018 19:22:06 +0200
Subject: Don't allow ubuntu mode extension to update
Ensure that no update is proposed or loaded if sideloaded (always
prefer system version) on the ubuntu session.
We want to ensure that the default code running is going through
our QA and security team process than being loaded from a 3rd
party website.
Also, that will enable us to upload newer versions on GNOME
extension website while still letting older ubuntu release versions
running expected extension version.
Origin: ubuntu
Forwarded: https://bugzilla.gnome.org/show_bug.cgi?id=789852
---
js/ui/extensionDownloader.js | 11 +++++++++++
js/ui/extensionSystem.js | 9 +++++++++
2 files changed, 20 insertions(+)
diff --git a/js/ui/extensionDownloader.js b/js/ui/extensionDownloader.js
index 94ba8fa..54b1105 100644
--- a/js/ui/extensionDownloader.js
+++ b/js/ui/extensionDownloader.js
@@ -4,6 +4,7 @@
const { Clutter, Gio, GLib, GObject, Soup } = imports.gi;
const Config = imports.misc.config;
+const Desktop = imports.misc.desktop;
const Dialog = imports.ui.dialog;
const ExtensionUtils = imports.misc.extensionUtils;
const FileUtils = imports.misc.fileUtils;
@@ -32,6 +33,13 @@ async function installExtension(uuid, invocation) {
shell_version: Config.PACKAGE_VERSION,
};
+ if (Desktop.is('ubuntu') && Main.extensionManager.isModeExtension(uuid)) {
+ const msg = _("This is an extension enabled by your current mode, you can't install manually any update in that session.");
+ Main.notifyError(_("Can't install “%s”:").format(uuid), msg);
+ invocation.return_dbus_error('org.gnome.Shell.ExtensionError', msg);
+ return;
+ }
+
const message = Soup.Message.new_from_encoded_form('GET',
REPOSITORY_URL_INFO,
Soup.form_encode_hash(params));
@@ -161,6 +169,9 @@ async function checkForUpdates() {
return;
if (extension.hasUpdate)
return;
+ // don't updates out of repository mode extension
+ if (Desktop.is("ubuntu") && Main.extensionManager.isModeExtension(uuid))
+ return;
metadatas[uuid] = {
version: extension.metadata.version,
};
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
index c21cc7c..db47088 100644
--- a/js/ui/extensionSystem.js
+++ b/js/ui/extensionSystem.js
@@ -4,6 +4,7 @@
const { GLib, Gio, GObject, Shell, St } = imports.gi;
const Signals = imports.misc.signals;
+const Desktop = imports.misc.desktop;
const ExtensionDownloader = imports.ui.extensionDownloader;
const ExtensionUtils = imports.misc.extensionUtils;
const FileUtils = imports.misc.fileUtils;
@@ -434,6 +435,10 @@ var ExtensionManager = class extends Signals.EventEmitter {
this.loadExtension(newExtension);
}
+ isModeExtension(uuid) {
+ return this._getModeExtensions().indexOf(uuid) !== -1;
+ }
+
_callExtensionInit(uuid) {
if (!this._extensionSupportsSessionMode(uuid))
return false;
@@ -624,6 +629,10 @@ var ExtensionManager = class extends Signals.EventEmitter {
let type = dir.has_prefix(perUserDir)
? ExtensionType.PER_USER
: ExtensionType.SYSTEM;
+ if (Desktop.is("ubuntu") && this.isModeExtension(uuid) && type === ExtensionType.PER_USER) {
+ log(`Found user extension ${uuid}, but not loading from ${dir.get_path()} directory as part of session mode.`);
+ return;
+ }
try {
extension = this.createExtensionObject(uuid, dir, type);
} catch (e) {

View File

@ -0,0 +1,38 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Thu, 24 Feb 2022 04:22:32 +0100
Subject: sessionMode: Add support for configuring an icons resource name
Similar to what we did (and upstreamed) for the theme, in this case
however there's very likely no interest from upstream for this.
Forwarded: not-needed
---
js/ui/main.js | 2 +-
js/ui/sessionMode.js | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/js/ui/main.js b/js/ui/main.js
index 3bb9b8f..33f62be 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -480,7 +480,7 @@ function reloadThemeResource() {
/** @private */
function _loadIcons() {
- _iconResource = Gio.Resource.load(`${global.datadir}/gnome-shell-icons.gresource`);
+ _iconResource = Gio.Resource.load(`${global.datadir}/${sessionMode.iconsResourceName}`);
_iconResource._register();
}
diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js
index 053e678..bfcdf26 100644
--- a/js/ui/sessionMode.js
+++ b/js/ui/sessionMode.js
@@ -24,6 +24,7 @@ const _modes = {
parentMode: null,
stylesheetName: 'gnome-shell.css',
themeResourceName: 'gnome-shell-theme.gresource',
+ iconsResourceName: 'gnome-shell-icons.gresource',
hasOverview: false,
showCalendarEvents: false,
showWelcomeDialog: false,

39
gnome-shell-43.0/debian/rules Executable file
View File

@ -0,0 +1,39 @@
#!/usr/bin/make -f
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1 -Wl,-z,defs
%:
dh $@ --with bash_completion
CONFFLAGS =
ifeq ($(DEB_HOST_ARCH_OS),linux)
CONFFLAGS += \
-Dnetworkmanager=true \
-Dsoup2=false \
-Dsystemd=true
endif
CONFFLAGS += -Dtests=false
override_dh_auto_configure:
GSETTINGS_SCHEMA_DIR=/opt/mutter-vrr/share/glib-2.0/schemas/:$(GSETTINGS_SCHEMA_DIR) PKG_CONFIG_PATH=/opt/mutter-vrr/lib/x86_64-linux-gnu/pkgconfig:$(PKG_CONFIG_PATH) LD_LIBRARY_PATH=/opt/mutter-vrr/lib/x86_64-linux-gnu:/opt/mutter-vrr/lib/x86_64-linux-gnu/mutter-11:/opt/mutter-vrr/lib/x86_64-linux-gnu/mutter-11/plugins:$(LD_LIBRARY_PATH) PATH=/opt/mutter-vrr/bin:$(PATH) dh_auto_configure -- \
--prefix=/opt/mutter-vrr \
--libdir=lib \
-Dextensions-tool:bash_completion=enabled \
$(CONFFLAGS)
override_dh_install:
dh_install
rm -r debian/tmp/etc/xdg/autostart/gnome-shell-overrides-migration.desktop
override_dh_makeshlibs:
echo "dh_makeshlibs disabled!"
override_dh_shlibdeps:
echo "dh_shlibdeps disabled!"
override_dh_auto_test:
echo "dh_auto_test disabled!"

View File

@ -0,0 +1 @@
3.0 (quilt)

View File

@ -0,0 +1,45 @@
from apport.hookutils import *
import os
def is_process_running(proc):
'''
Determine if process has a registered process id
'''
log = command_output(['pidof', proc])
if not log or log[:5] == "Error" or len(log)<1:
return False
return True
def add_info(report):
attach_related_packages(report, ['mutter-common'])
attach_gsettings_package(report, 'gnome-shell-common')
attach_gsettings_package(report, 'gsettings-desktop-schemas')
attach_gsettings_package(report, 'mutter-common')
attach_gsettings_schema(report, 'org.gnome.settings-daemon.plugins.color')
attach_gsettings_schema(report, 'org.gnome.settings-daemon.peripherals.touchscreen')
try:
monitors = os.path.join(os.environ['XDG_CONFIG_HOME'], 'monitors.xml')
except KeyError:
monitors = os.path.expanduser('~/.config/monitors.xml')
attach_file_if_exists(report, monitors, 'monitors.xml')
result = ''
dm_list = apport.hookutils.command_output(['sh', '-c',
'apt-cache search \"display manager\" | cut -d \' \' -f1 | grep -E \"dm$|^gdm3?\\b\"'])
for line in dm_list.split('\n'):
if (is_process_running(line)):
result = line
break
report['DisplayManager'] = result
if command_available('journalctl') and os.path.exists('/run/systemd/system'):
report['ShellJournal'] = command_output(['journalctl',
'/usr/bin/gnome-shell',
'-b', '-o', 'short-monotonic',
'--lines', '3000'])

View File

@ -0,0 +1,5 @@
Bug-Database: https://gitlab.gnome.org/GNOME/gnome-shell/issues/
Bug-Submit: https://gitlab.gnome.org/GNOME/gnome-shell/issues/new
Name: GNOME Shell
Repository: https://gitlab.gnome.org/gnome/gnome-shell.git
Repository-Browse: https://gitlab.gnome.org/GNOME/gnome-shell/

View File

@ -0,0 +1,4 @@
version=4
opts="searchmode=plain, uversionmangle=s/\.(alpha|beta|rc)/~$1/, downloadurlmangle=s|cache.json||" \
https://download.gnome.org/sources/@PACKAGE@/cache.json \
[\d.]+/@PACKAGE@-([\d.]+)@ARCHIVE_EXT@

3
orig.source.txt Normal file
View File

@ -0,0 +1,3 @@
# gnome-shell_43.0.orig.tar.xz has been renamed to gnome-shell-vrr_43.0.orig.tar.xz but the contents are the same
gnome-shell-vrr_43.0.orig.tar.xz
#https://gitlab.gnome.org/GNOME/gnome-shell