From 6a39a2112e60a312dba522755f0a8f4dcbdb818f Mon Sep 17 00:00:00 2001 From: Peter Oliver Date: Sun, 24 Sep 2023 21:38:47 +0100 Subject: [PATCH] Switch the default `emacs` binary to pure-GTK, suitable for Wayland Rename the old default hybrid GTK/X11 binary to `emacs-gtk+x11`. --- emacs-desktop.patch | 26 ++++++ emacs-desktop.sh | 19 ++++ emacs-pgtk-on-x-error-message.patch | 26 ++++++ emacs.spec | 133 ++++++++++++++++++++-------- 4 files changed, 165 insertions(+), 39 deletions(-) create mode 100644 emacs-desktop.patch create mode 100755 emacs-desktop.sh create mode 100644 emacs-pgtk-on-x-error-message.patch diff --git a/emacs-desktop.patch b/emacs-desktop.patch new file mode 100644 index 0000000..2453407 --- /dev/null +++ b/emacs-desktop.patch @@ -0,0 +1,26 @@ +From 90e902854c53c6ab5ef8711af27f42fbc77d9ffe Mon Sep 17 00:00:00 2001 +From: Peter Oliver +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 + diff --git a/emacs-desktop.sh b/emacs-desktop.sh new file mode 100755 index 0000000..d407ca3 --- /dev/null +++ b/emacs-desktop.sh @@ -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 "$@" diff --git a/emacs-pgtk-on-x-error-message.patch b/emacs-pgtk-on-x-error-message.patch new file mode 100644 index 0000000..cfc7c3d --- /dev/null +++ b/emacs-pgtk-on-x-error-message.patch @@ -0,0 +1,26 @@ +From eaaf4883aee50974eeb03e529a29585f8ddc1d9d Mon Sep 17 00:00:00 2001 +From: Bhavin Gandhi +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 + diff --git a/emacs.spec b/emacs.spec index 5f33af5..0700e50 100644 --- a/emacs.spec +++ b/emacs.spec @@ -18,13 +18,17 @@ Source6: default.el # Emacs Terminal Mode, #551949, #617355 Source7: emacs-terminal.desktop Source8: emacs-terminal.sh +Source9: emacs-desktop.sh # rhbz#713600 Patch1: emacs-spellchecker.patch Patch2: emacs-system-crypto-policies.patch # causes a dependency on pkgconfig(systemd) # => remove it if we stop using this 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 +Patch6: emacs-pgtk-on-x-error-message.patch BuildRequires: gcc BuildRequires: atk-devel @@ -95,7 +99,7 @@ Requires(preun): %{_sbindir}/alternatives Requires(posttrans): %{_sbindir}/alternatives Requires: emacs-common = %{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_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 native_lisp %{_libdir}/emacs/%{version}/native-lisp -%description -Emacs is a powerful, customizable, self-documenting, modeless text +%global desc %{expand:Emacs is a powerful, customizable, self-documenting, modeless text editor. Emacs contains special code editing features, a scripting language (elisp), and the capability to read mail, news, and more 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 -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(preun): %{_sbindir}/alternatives Requires(posttrans): %{_sbindir}/alternatives @@ -121,13 +142,9 @@ Requires: emacs-common = %{epoch}:%{version}-%{release} Provides: emacs(bin) = %{epoch}:%{version}-%{release} %description lucid -Emacs is a powerful, customizable, self-documenting, modeless text -editor. Emacs contains special code editing features, a scripting -language (elisp), and the capability to read mail, news, and more -without leaving the editor. - -This package provides an emacs binary with support for X windows -using LUCID toolkit. +%desc +This package provides an emacs-lucid binary with support for the X +Window System, using the Lucid toolkit. %package nox Summary: GNU Emacs text editor without X support @@ -137,13 +154,9 @@ Requires: emacs-common = %{epoch}:%{version}-%{release} Provides: emacs(bin) = %{epoch}:%{version}-%{release} %description nox -Emacs is a powerful, customizable, self-documenting, modeless text -editor. Emacs contains special code editing features, a scripting -language (elisp), and the capability to read mail, news, and more -without leaving the editor. - -This package provides an emacs binary with no X windows support for running -on a terminal. +%desc +This package provides an emacs-nox binary with no graphical display +support, for running on a terminal. %package common Summary: Emacs common files @@ -154,7 +167,7 @@ Requires(preun): %{_sbindir}/alternatives Requires(posttrans): %{_sbindir}/alternatives Requires: %{name}-filesystem = %{epoch}:%{version}-%{release} 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: info Provides: %{name}-el = %{epoch}:%{version}-%{release} @@ -174,13 +187,9 @@ Recommends: git %description common -Emacs is a powerful, customizable, self-documenting, modeless text -editor. Emacs contains special code editing features, a scripting -language (elisp), and the capability to read mail, news, and more -without leaving the editor. - -This package contains all the common files needed by emacs, emacs-lucid -or emacs-nox. +%desc +This package contains all the common files needed by emacs, emacs-gtk+x11, +emacs-lucid, or emacs-nox. %package terminal Summary: A desktop menu item for GNU Emacs terminal. @@ -262,8 +271,8 @@ ln -s ../configure . %{setarch} %make_build cd .. -# Build GTK+ binary -mkdir build-gtk && cd build-gtk +# Build GTK/X11 binary +mkdir build-gtk+x11 && cd build-gtk+x11 ln -s ../configure . LDFLAGS=-Wl,-z,relro; export LDFLAGS; @@ -277,8 +286,23 @@ LDFLAGS=-Wl,-z,relro; export LDFLAGS; %{setarch} %make_build 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 -rm build-{gtk,lucid,nox}/src/emacs-%{version}.* +rm build-{gtk+x11,lucid,nox,pgtk}/src/emacs-%{version}.* # Create pkgconfig file cat > emacs.pc << EOF @@ -301,7 +325,7 @@ cat > macros.emacs << EOF EOF %install -cd build-gtk +cd build-pgtk %make_install 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-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 the emacs without X @@ -362,6 +389,9 @@ rm -f %{buildroot}%{_infodir}/dir desktop-file-install --dir=%{buildroot}%{_datadir}/applications \ %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 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 # Install all the pdmp with fingerprints -gtk_pdmp="emacs-$(./build-gtk/src/emacs --fingerprint 2>&1 | sed 's/.* //').pdmp" -install -p -m 0644 build-gtk/src/emacs.pdmp %{buildroot}%{emacs_libexecdir}/${gtk_pdmp} +pgtk_pdmp="emacs-$(./build-pgtk/src/emacs --fingerprint 2>&1 | sed 's/.* //').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" 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 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) 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-nox/native-lisp/${nox_comp_native_ver} %{buildroot}%{native_lisp} (TOPDIR=${PWD} 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} cd %{buildroot} @@ -429,7 +468,8 @@ cp -ar build-nox/native-lisp/${nox_comp_native_ver} %{buildroot}%{native_lisp} 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" \) ) -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}/${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-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 %{_sbindir}/alternatives --remove emacs %{_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 \ --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} %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 %{_bindir}/emacs-%{version}-lucid @@ -498,6 +552,7 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/*.desktop %doc doc/NEWS BUGS README %{_bindir}/ebrowse %{_bindir}/emacsclient +%{_bindir}/emacs-desktop %{_bindir}/etags.emacs %{_bindir}/gctags %{_datadir}/applications/emacs.desktop