Switch the default emacs binary to pure-GTK, suitable for Wayland

Rename the old default hybrid GTK/X11 binary to `emacs-gtk+x11`.
This commit is contained in:
Peter Oliver 2023-09-24 21:38:47 +01:00
parent e27f9eabc4
commit 6a39a2112e
4 changed files with 165 additions and 39 deletions

26
emacs-desktop.patch Normal file
View File

@ -0,0 +1,26 @@
From 90e902854c53c6ab5ef8711af27f42fbc77d9ffe Mon Sep 17 00:00:00 2001
From: Peter Oliver <git@mavit.org.uk>
Date: Mon, 10 Apr 2023 20:55:54 +0100
Subject: [PATCH] Use a wrapper to avoid the pure GTK build on X11, where it is
unsupported.
---
etc/emacs.desktop | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/etc/emacs.desktop b/etc/emacs.desktop
index 0d7cac14da5..eabc78bb884 100644
--- a/etc/emacs.desktop
+++ b/etc/emacs.desktop
@@ -3,7 +3,7 @@ Name=Emacs
GenericName=Text Editor
Comment=Edit text
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
-Exec=emacs %F
+Exec=emacs-desktop %F
Icon=emacs
Type=Application
Terminal=false
--
2.39.2

19
emacs-desktop.sh Executable file
View File

@ -0,0 +1,19 @@
#!/bin/sh
# The pure GTK build of emacs is not supported on X11, so try to avoid
# using if there is an alternative.
if [ "$XDG_SESSION_TYPE" = 'x11' ]; then
emacs="$(readlink -f /usr/bin/emacs)"
emacs="${emacs##*/}"
emacs="${emacs%-*.*.*}"
if [ "$emacs" = 'emacs' ]; then
if type emacs-gtk+x11 >/dev/null; then
exec emacs-gtk+x11 "$@"
elif type emacs-lucid >/dev/null; then
exec emacs-lucid "$@"
fi
fi
fi
exec emacs "$@"

View File

@ -0,0 +1,26 @@
From eaaf4883aee50974eeb03e529a29585f8ddc1d9d Mon Sep 17 00:00:00 2001
From: Bhavin Gandhi <bhavin192@geeksocket.in>
Date: Wed, 31 May 2023 22:44:54 +0530
Subject: [PATCH] Add package names to PGTK on X error message
---
src/pgtkterm.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index c00e13550bd..ce51bff5947 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -6680,7 +6680,8 @@ pgtk_display_x_warning (GdkDisplay *display)
" System. That configuration is unsupported and"
" will lead to sporadic crashes during transfer of"
" large selection data. It will also lead to"
- " various problems with keyboard input.");
+ " various problems with keyboard input."
+ "\nInstall emacs-gtk+x11 or emacs-lucid package.");
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
gtk_container_add (GTK_CONTAINER (content_area), label);
gtk_widget_show (label);
--
2.40.1

View File

@ -18,13 +18,17 @@ Source6: default.el
# Emacs Terminal Mode, #551949, #617355 # Emacs Terminal Mode, #551949, #617355
Source7: emacs-terminal.desktop Source7: emacs-terminal.desktop
Source8: emacs-terminal.sh Source8: emacs-terminal.sh
Source9: emacs-desktop.sh
# rhbz#713600 # rhbz#713600
Patch1: emacs-spellchecker.patch Patch1: emacs-spellchecker.patch
Patch2: emacs-system-crypto-policies.patch Patch2: emacs-system-crypto-policies.patch
# causes a dependency on pkgconfig(systemd) # causes a dependency on pkgconfig(systemd)
# => remove it if we stop using this patch # => remove it if we stop using this patch
Patch3: emacs-libdir-vs-systemd.patch Patch3: emacs-libdir-vs-systemd.patch
# Avoid using the pure GTK build on X11 where it is unsupported:
Patch4: emacs-desktop.patch
Patch5: 0001-configure-Remove-obsolete-check-for-b-i486-linuxaout.patch Patch5: 0001-configure-Remove-obsolete-check-for-b-i486-linuxaout.patch
Patch6: emacs-pgtk-on-x-error-message.patch
BuildRequires: gcc BuildRequires: gcc
BuildRequires: atk-devel BuildRequires: atk-devel
@ -95,7 +99,7 @@ Requires(preun): %{_sbindir}/alternatives
Requires(posttrans): %{_sbindir}/alternatives Requires(posttrans): %{_sbindir}/alternatives
Requires: emacs-common = %{epoch}:%{version}-%{release} Requires: emacs-common = %{epoch}:%{version}-%{release}
Provides: emacs(bin) = %{epoch}:%{version}-%{release} Provides: emacs(bin) = %{epoch}:%{version}-%{release}
Supplements: ((libwayland-server or xorg-x11-server-Xorg) and emacs-common) Supplements: (libwayland-server and emacs-common)
%define site_lisp %{_datadir}/emacs/site-lisp %define site_lisp %{_datadir}/emacs/site-lisp
%define site_start_d %{site_lisp}/site-start.d %define site_start_d %{site_lisp}/site-start.d
@ -104,16 +108,33 @@ Supplements: ((libwayland-server or xorg-x11-server-Xorg) and emacs-common)
%define emacs_libexecdir %{_libexecdir}/emacs/%{version}/%{_host} %define emacs_libexecdir %{_libexecdir}/emacs/%{version}/%{_host}
%define native_lisp %{_libdir}/emacs/%{version}/native-lisp %define native_lisp %{_libdir}/emacs/%{version}/native-lisp
%description %global desc %{expand:Emacs is a powerful, customizable, self-documenting, modeless text
Emacs is a powerful, customizable, self-documenting, modeless text
editor. Emacs contains special code editing features, a scripting editor. Emacs contains special code editing features, a scripting
language (elisp), and the capability to read mail, news, and more language (elisp), and the capability to read mail, news, and more
without leaving the editor. without leaving the editor.
}
This package provides an emacs binary with support for X windows. %description
%desc
This package provides an emacs binary with support for Wayland, using the
GTK toolkit.
%package gtk+x11
Summary: GNU Emacs text editor with GTK toolkit X support
Requires: libgccjit
Requires(preun): %{_sbindir}/alternatives
Requires(posttrans): %{_sbindir}/alternatives
Requires: emacs-common = %{epoch}:%{version}-%{release}
Provides: emacs(bin) = %{epoch}:%{version}-%{release}
Supplements: (xorg-x11-server-Xorg and emacs-common)
%description gtk+x11
%desc
This package provides an emacs-gtk+x11 binary with support for the X
Window System, using the GTK toolkit.
%package lucid %package lucid
Summary: GNU Emacs text editor with LUCID toolkit X support Summary: GNU Emacs text editor with Lucid toolkit X support
Requires: google-noto-sans-mono-vf-fonts Requires: google-noto-sans-mono-vf-fonts
Requires(preun): %{_sbindir}/alternatives Requires(preun): %{_sbindir}/alternatives
Requires(posttrans): %{_sbindir}/alternatives Requires(posttrans): %{_sbindir}/alternatives
@ -121,13 +142,9 @@ Requires: emacs-common = %{epoch}:%{version}-%{release}
Provides: emacs(bin) = %{epoch}:%{version}-%{release} Provides: emacs(bin) = %{epoch}:%{version}-%{release}
%description lucid %description lucid
Emacs is a powerful, customizable, self-documenting, modeless text %desc
editor. Emacs contains special code editing features, a scripting This package provides an emacs-lucid binary with support for the X
language (elisp), and the capability to read mail, news, and more Window System, using the Lucid toolkit.
without leaving the editor.
This package provides an emacs binary with support for X windows
using LUCID toolkit.
%package nox %package nox
Summary: GNU Emacs text editor without X support Summary: GNU Emacs text editor without X support
@ -137,13 +154,9 @@ Requires: emacs-common = %{epoch}:%{version}-%{release}
Provides: emacs(bin) = %{epoch}:%{version}-%{release} Provides: emacs(bin) = %{epoch}:%{version}-%{release}
%description nox %description nox
Emacs is a powerful, customizable, self-documenting, modeless text %desc
editor. Emacs contains special code editing features, a scripting This package provides an emacs-nox binary with no graphical display
language (elisp), and the capability to read mail, news, and more support, for running on a terminal.
without leaving the editor.
This package provides an emacs binary with no X windows support for running
on a terminal.
%package common %package common
Summary: Emacs common files Summary: Emacs common files
@ -154,7 +167,7 @@ Requires(preun): %{_sbindir}/alternatives
Requires(posttrans): %{_sbindir}/alternatives Requires(posttrans): %{_sbindir}/alternatives
Requires: %{name}-filesystem = %{epoch}:%{version}-%{release} Requires: %{name}-filesystem = %{epoch}:%{version}-%{release}
Requires: libgccjit Requires: libgccjit
Recommends: (emacs or emacs-lucid or emacs-nox) Recommends: (emacs or emacs-gtk+x11 or emacs-lucid or emacs-nox)
Recommends: enchant2 Recommends: enchant2
Recommends: info Recommends: info
Provides: %{name}-el = %{epoch}:%{version}-%{release} Provides: %{name}-el = %{epoch}:%{version}-%{release}
@ -174,13 +187,9 @@ Recommends: git
%description common %description common
Emacs is a powerful, customizable, self-documenting, modeless text %desc
editor. Emacs contains special code editing features, a scripting This package contains all the common files needed by emacs, emacs-gtk+x11,
language (elisp), and the capability to read mail, news, and more emacs-lucid, or emacs-nox.
without leaving the editor.
This package contains all the common files needed by emacs, emacs-lucid
or emacs-nox.
%package terminal %package terminal
Summary: A desktop menu item for GNU Emacs terminal. Summary: A desktop menu item for GNU Emacs terminal.
@ -262,8 +271,8 @@ ln -s ../configure .
%{setarch} %make_build %{setarch} %make_build
cd .. cd ..
# Build GTK+ binary # Build GTK/X11 binary
mkdir build-gtk && cd build-gtk mkdir build-gtk+x11 && cd build-gtk+x11
ln -s ../configure . ln -s ../configure .
LDFLAGS=-Wl,-z,relro; export LDFLAGS; LDFLAGS=-Wl,-z,relro; export LDFLAGS;
@ -277,8 +286,23 @@ LDFLAGS=-Wl,-z,relro; export LDFLAGS;
%{setarch} %make_build %{setarch} %make_build
cd .. cd ..
# Build pure GTK binary
mkdir build-pgtk && cd build-pgtk
ln -s ../configure .
LDFLAGS=-Wl,-z,relro; export LDFLAGS;
%configure --with-dbus --with-gif --with-jpeg --with-png --with-rsvg \
--with-tiff --with-xpm --with-pgtk --with-gpm=no \
--with-xwidgets --with-modules --with-harfbuzz --with-cairo --with-json \
--with-native-compilation=aot --with-tree-sitter --with-sqlite3 \
--with-webp
%{setarch} %make_build bootstrap
%{setarch} %make_build
cd ..
# Remove versioned file so that we end up with .1 suffix and only one DOC file # Remove versioned file so that we end up with .1 suffix and only one DOC file
rm build-{gtk,lucid,nox}/src/emacs-%{version}.* rm build-{gtk+x11,lucid,nox,pgtk}/src/emacs-%{version}.*
# Create pkgconfig file # Create pkgconfig file
cat > emacs.pc << EOF cat > emacs.pc << EOF
@ -301,7 +325,7 @@ cat > macros.emacs << EOF
EOF EOF
%install %install
cd build-gtk cd build-pgtk
%make_install %make_install
cd .. cd ..
@ -313,7 +337,10 @@ touch %{buildroot}%{_bindir}/emacs
gunzip %{buildroot}%{_datadir}/emacs/%{version}/lisp/jka-compr.el.gz gunzip %{buildroot}%{_datadir}/emacs/%{version}/lisp/jka-compr.el.gz
gunzip %{buildroot}%{_datadir}/emacs/%{version}/lisp/jka-cmpr-hook.el.gz gunzip %{buildroot}%{_datadir}/emacs/%{version}/lisp/jka-cmpr-hook.el.gz
# Install the emacs with LUCID toolkit # Install the emacs with GTK toolkit
install -p -m 0755 build-gtk+x11/src/emacs %{buildroot}%{_bindir}/emacs-%{version}-gtk+x11
# Install the emacs with Lucid toolkit
install -p -m 0755 build-lucid/src/emacs %{buildroot}%{_bindir}/emacs-%{version}-lucid install -p -m 0755 build-lucid/src/emacs %{buildroot}%{_bindir}/emacs-%{version}-lucid
# Install the emacs without X # Install the emacs without X
@ -362,6 +389,9 @@ rm -f %{buildroot}%{_infodir}/dir
desktop-file-install --dir=%{buildroot}%{_datadir}/applications \ desktop-file-install --dir=%{buildroot}%{_datadir}/applications \
%SOURCE7 %SOURCE7
# Install a wrapper to avoid running the Wayland-only build on X11
install -p -m 0755 %SOURCE9 %{buildroot}%{_bindir}/emacs-desktop
# Remove duplicate desktop-related files # Remove duplicate desktop-related files
rm %{buildroot}%{_datadir}/%{name}/%{version}/etc/%{name}.{desktop,service} rm %{buildroot}%{_datadir}/%{name}/%{version}/etc/%{name}.{desktop,service}
@ -400,8 +430,11 @@ grep -vhE '%{site_lisp}(|/(default\.el|site-start\.d|site-start\.el))$' {common,
rm %{buildroot}%{_datadir}/icons/hicolor/scalable/mimetypes/emacs-document23.svg rm %{buildroot}%{_datadir}/icons/hicolor/scalable/mimetypes/emacs-document23.svg
# Install all the pdmp with fingerprints # Install all the pdmp with fingerprints
gtk_pdmp="emacs-$(./build-gtk/src/emacs --fingerprint 2>&1 | sed 's/.* //').pdmp" pgtk_pdmp="emacs-$(./build-pgtk/src/emacs --fingerprint 2>&1 | sed 's/.* //').pdmp"
install -p -m 0644 build-gtk/src/emacs.pdmp %{buildroot}%{emacs_libexecdir}/${gtk_pdmp} install -p -m 0644 build-pgtk/src/emacs.pdmp %{buildroot}%{emacs_libexecdir}/${pgtk_pdmp}
gtkx11_pdmp="emacs-$(./build-gtk+x11/src/emacs --fingerprint 2>&1 | sed 's/.* //').pdmp"
install -p -m 0644 build-gtk+x11/src/emacs.pdmp %{buildroot}%{emacs_libexecdir}/${gtkx11_pdmp}
lucid_pdmp="emacs-$(./build-lucid/src/emacs --fingerprint 2>&1 | sed 's/.* //').pdmp" lucid_pdmp="emacs-$(./build-lucid/src/emacs --fingerprint 2>&1 | sed 's/.* //').pdmp"
install -p -m 0644 build-lucid/src/emacs.pdmp %{buildroot}%{emacs_libexecdir}/${lucid_pdmp} install -p -m 0644 build-lucid/src/emacs.pdmp %{buildroot}%{emacs_libexecdir}/${lucid_pdmp}
@ -410,16 +443,22 @@ nox_pdmp="emacs-$(./build-nox/src/emacs --fingerprint 2>&1 | sed 's/.* //').pdmp
install -p -m 0644 build-nox/src/emacs.pdmp %{buildroot}%{emacs_libexecdir}/${nox_pdmp} install -p -m 0644 build-nox/src/emacs.pdmp %{buildroot}%{emacs_libexecdir}/${nox_pdmp}
# Install native compiled Lisp of all builds # Install native compiled Lisp of all builds
gtk_comp_native_ver=$(ls -1 build-gtk/native-lisp) pgtk_comp_native_ver=$(ls -1 build-pgtk/native-lisp)
gtkx11_comp_native_ver=$(ls -1 build-gtk+x11/native-lisp)
lucid_comp_native_ver=$(ls -1 build-lucid/native-lisp) lucid_comp_native_ver=$(ls -1 build-lucid/native-lisp)
nox_comp_native_ver=$(ls -1 build-nox/native-lisp) nox_comp_native_ver=$(ls -1 build-nox/native-lisp)
cp -ar build-gtk/native-lisp/${gtk_comp_native_ver} %{buildroot}%{native_lisp} cp -ar build-pgtk/native-lisp/${pgtk_comp_native_ver} %{buildroot}%{native_lisp}
cp -ar build-gtk+x11/native-lisp/${gtkx11_comp_native_ver} %{buildroot}%{native_lisp}
cp -ar build-lucid/native-lisp/${lucid_comp_native_ver} %{buildroot}%{native_lisp} cp -ar build-lucid/native-lisp/${lucid_comp_native_ver} %{buildroot}%{native_lisp}
cp -ar build-nox/native-lisp/${nox_comp_native_ver} %{buildroot}%{native_lisp} cp -ar build-nox/native-lisp/${nox_comp_native_ver} %{buildroot}%{native_lisp}
(TOPDIR=${PWD} (TOPDIR=${PWD}
cd %{buildroot} cd %{buildroot}
find .%{native_lisp}/${gtk_comp_native_ver} \( -type f -name '*eln' -fprintf $TOPDIR/gtk-eln-filelist "%%%%attr(755,-,-) %%p\n" \) -o \( -type d -fprintf $TOPDIR/gtk-dirs "%%%%dir %%p\n" \) find .%{native_lisp}/${gtkx11_comp_native_ver} \( -type f -name '*eln' -fprintf $TOPDIR/gtk+x11-eln-filelist "%%%%attr(755,-,-) %%p\n" \) -o \( -type d -fprintf $TOPDIR/gtk+x11-dirs "%%%%dir %%p\n" \)
)
(TOPDIR=${PWD}
cd %{buildroot}
find .%{native_lisp}/${pgtk_comp_native_ver} \( -type f -name '*eln' -fprintf $TOPDIR/pgtk-eln-filelist "%%%%attr(755,-,-) %%p\n" \) -o \( -type d -fprintf $TOPDIR/pgtk-dirs "%%%%dir %%p\n" \)
) )
(TOPDIR=${PWD} (TOPDIR=${PWD}
cd %{buildroot} cd %{buildroot}
@ -429,7 +468,8 @@ cp -ar build-nox/native-lisp/${nox_comp_native_ver} %{buildroot}%{native_lisp}
cd %{buildroot} cd %{buildroot}
find .%{native_lisp}/${nox_comp_native_ver} \( -type f -name '*eln' -fprintf $TOPDIR/nox-eln-filelist "%%%%attr(755,-,-) %%p\n" \) -o \( -type d -fprintf $TOPDIR/nox-dirs "%%%%dir %%p\n" \) find .%{native_lisp}/${nox_comp_native_ver} \( -type f -name '*eln' -fprintf $TOPDIR/nox-eln-filelist "%%%%attr(755,-,-) %%p\n" \) -o \( -type d -fprintf $TOPDIR/nox-dirs "%%%%dir %%p\n" \)
) )
echo %{emacs_libexecdir}/${gtk_pdmp} >> gtk-eln-filelist echo %{emacs_libexecdir}/${pgtk_pdmp} >> pgtk-eln-filelist
echo %{emacs_libexecdir}/${gtkx11_pdmp} >> gtk+x11-eln-filelist
echo %{emacs_libexecdir}/${lucid_pdmp} >> lucid-eln-filelist echo %{emacs_libexecdir}/${lucid_pdmp} >> lucid-eln-filelist
echo %{emacs_libexecdir}/${nox_pdmp} >> nox-eln-filelist echo %{emacs_libexecdir}/${nox_pdmp} >> nox-eln-filelist
@ -462,6 +502,14 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/*.desktop
%{_sbindir}/alternatives --install %{_bindir}/emacs emacs %{_bindir}/emacs-%{version}-lucid 70 || : %{_sbindir}/alternatives --install %{_bindir}/emacs emacs %{_bindir}/emacs-%{version}-lucid 70 || :
%{_sbindir}/alternatives --install %{_bindir}/emacs-lucid emacs-lucid %{_bindir}/emacs-%{version}-lucid 60 || : %{_sbindir}/alternatives --install %{_bindir}/emacs-lucid emacs-lucid %{_bindir}/emacs-%{version}-lucid 60 || :
%preun gtk+x11
%{_sbindir}/alternatives --remove emacs %{_bindir}/emacs-%{version}-gtk+x11 || :
%{_sbindir}/alternatives --remove emacs-gtk+x11 %{_bindir}/emacs-%{version}-gtk+x11 || :
%posttrans gtk+x11
%{_sbindir}/alternatives --install %{_bindir}/emacs emacs %{_bindir}/emacs-%{version}-gtk+x11 75 || :
%{_sbindir}/alternatives --install %{_bindir}/emacs-gtk+x11 emacs-gtk+x11 %{_bindir}/emacs-%{version}-gtk+x11 60 || :
%preun nox %preun nox
%{_sbindir}/alternatives --remove emacs %{_bindir}/emacs-%{version}-nox || : %{_sbindir}/alternatives --remove emacs %{_bindir}/emacs-%{version}-nox || :
%{_sbindir}/alternatives --remove emacs-nox %{_bindir}/emacs-%{version}-nox || : %{_sbindir}/alternatives --remove emacs-nox %{_bindir}/emacs-%{version}-nox || :
@ -477,9 +525,15 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/*.desktop
%{_sbindir}/alternatives --install %{_bindir}/etags emacs.etags %{_bindir}/etags.emacs 80 \ %{_sbindir}/alternatives --install %{_bindir}/etags emacs.etags %{_bindir}/etags.emacs 80 \
--slave %{_mandir}/man1/etags.1.gz emacs.etags.man %{_mandir}/man1/etags.emacs.1.gz || : --slave %{_mandir}/man1/etags.1.gz emacs.etags.man %{_mandir}/man1/etags.emacs.1.gz || :
%files -f gtk-eln-filelist -f gtk-dirs %files -f pgtk-eln-filelist -f pgtk-dirs
%{_bindir}/emacs-%{version} %{_bindir}/emacs-%{version}
%attr(0755,-,-) %ghost %{_bindir}/emacs %attr(0755,-,-) %ghost %{_bindir}/emacs
%{_datadir}/glib-2.0/schemas/org.gnu.emacs.defaults.gschema.xml
%files gtk+x11 -f gtk+x11-eln-filelist -f gtk+x11-dirs
%{_bindir}/emacs-%{version}-gtk+x11
%attr(0755,-,-) %ghost %{_bindir}/emacs
%attr(0755,-,-) %ghost %{_bindir}/emacs-gtk+x11
%files lucid -f lucid-eln-filelist -f lucid-dirs %files lucid -f lucid-eln-filelist -f lucid-dirs
%{_bindir}/emacs-%{version}-lucid %{_bindir}/emacs-%{version}-lucid
@ -498,6 +552,7 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/*.desktop
%doc doc/NEWS BUGS README %doc doc/NEWS BUGS README
%{_bindir}/ebrowse %{_bindir}/ebrowse
%{_bindir}/emacsclient %{_bindir}/emacsclient
%{_bindir}/emacs-desktop
%{_bindir}/etags.emacs %{_bindir}/etags.emacs
%{_bindir}/gctags %{_bindir}/gctags
%{_datadir}/applications/emacs.desktop %{_datadir}/applications/emacs.desktop