From eb0a00804dcb5f997808ccc33a59dda8e4d5a23d Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Tue, 12 Nov 2013 18:05:25 +0000 Subject: [PATCH] If building for Ubuntu, bypass menu unless other OSes are installed or Shift is pressed. --- configure.ac | 11 ++ debian/changelog | 2 + debian/patches/quick_boot.patch | 191 ++++++++++++++++++++++++++++++++ debian/patches/series | 1 + debian/rules | 2 +- util/grub.d/00_header.in | 3 +- util/grub.d/30_os-prober.in | 68 ++++++++++++ 7 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 debian/patches/quick_boot.patch diff --git a/configure.ac b/configure.ac index 2ba9bf0e6..fbe1e57e8 100644 --- a/configure.ac +++ b/configure.ac @@ -1087,6 +1087,17 @@ else fi AC_SUBST([QUIET_BOOT]) +AC_ARG_ENABLE([quick-boot], + [AS_HELP_STRING([--enable-quick-boot], + [bypass boot menu if possible (default=no)])], + [], [enable_quick_boot=no]) +if test x"$enable_quick_boot" = xyes ; then + QUICK_BOOT=1 +else + QUICK_BOOT=0 +fi +AC_SUBST([QUICK_BOOT]) + LIBS="" AC_SUBST([FONT_SOURCE]) diff --git a/debian/changelog b/debian/changelog index 590f25e04..d077324a7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,6 +15,8 @@ grub2 (2.00-20) UNRELEASED; urgency=low partition for use (Steve Langasek). - Adjust UEFI installation to cope with Kubuntu setting GRUB_DISTRIBUTOR (LP: #1242417). + - If building for Ubuntu: + + Bypass menu unless other OSes are installed or Shift is pressed. -- Colin Watson Mon, 07 Oct 2013 09:48:53 +0100 diff --git a/debian/patches/quick_boot.patch b/debian/patches/quick_boot.patch new file mode 100644 index 000000000..356134c44 --- /dev/null +++ b/debian/patches/quick_boot.patch @@ -0,0 +1,191 @@ +Description: Add configure option to bypass boot menu if possible + If other operating systems are installed, then automatically unhide the + menu. Otherwise, if GRUB_HIDDEN_TIMEOUT is 0, then use keystatus if + available to check whether Shift is pressed. If it is, show the menu, + otherwise boot immediately. If keystatus is not available, then fall back + to a short delay interruptible with Escape. + . + This may or may not remain Ubuntu-specific, although it's not obviously + wanted upstream. It implements a requirement of + https://wiki.ubuntu.com/DesktopExperienceTeam/KarmicBootExperienceDesignSpec#Bootloader. +Author: Colin Watson +Forwarded: no +Last-Update: 2013-11-12 + +Index: b/configure.ac +=================================================================== +--- a/configure.ac ++++ b/configure.ac +@@ -1087,6 +1087,17 @@ + fi + AC_SUBST([QUIET_BOOT]) + ++AC_ARG_ENABLE([quick-boot], ++ [AS_HELP_STRING([--enable-quick-boot], ++ [bypass boot menu if possible (default=no)])], ++ [], [enable_quick_boot=no]) ++if test x"$enable_quick_boot" = xyes ; then ++ QUICK_BOOT=1 ++else ++ QUICK_BOOT=0 ++fi ++AC_SUBST([QUICK_BOOT]) ++ + LIBS="" + + AC_SUBST([FONT_SOURCE]) +Index: b/util/grub.d/00_header.in +=================================================================== +--- a/util/grub.d/00_header.in ++++ b/util/grub.d/00_header.in +@@ -23,6 +23,7 @@ + exec_prefix="@exec_prefix@" + datarootdir="@datarootdir@" + grub_lang=`echo $LANG | cut -d . -f 1` ++quick_boot="@QUICK_BOOT@" + + export TEXTDOMAIN=@PACKAGE@ + export TEXTDOMAINDIR="@localedir@" +@@ -272,7 +273,7 @@ + + make_timeout () + { +- if [ "x${1}" != "x" ] ; then ++ if [ "$quick_boot" = 0 ] && [ "x${1}" != "x" ] ; then + if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then + verbose= + else +Index: b/util/grub.d/30_os-prober.in +=================================================================== +--- a/util/grub.d/30_os-prober.in ++++ b/util/grub.d/30_os-prober.in +@@ -20,18 +20,78 @@ + prefix="@prefix@" + exec_prefix="@exec_prefix@" + datarootdir="@datarootdir@" ++quick_boot="@QUICK_BOOT@" + + export TEXTDOMAIN=@PACKAGE@ + export TEXTDOMAINDIR="@localedir@" + + . "@datadir@/@PACKAGE@/grub-mkconfig_lib" + ++found_other_os= ++ ++make_timeout () { ++ if [ "x${found_other_os}" = "x" ] ; then ++ if [ "x${1}" != "x" ] ; then ++ if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then ++ verbose= ++ else ++ verbose=" --verbose" ++ fi ++ ++ if [ "x${1}" = "x0" ] ; then ++ cat < /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then + # missing os-prober and/or linux-boot-prober ++ adjust_timeout + exit 0 + fi + +@@ -43,10 +103,12 @@ + OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`" + if [ -z "${OSPROBED}" ] ; then + # empty os-prober output, nothing doing ++ adjust_timeout + exit 0 + fi + + osx_entry() { ++ found_other_os=1 + if [ x$2 = x32 ]; then + # TRANSLATORS: it refers to kernel architecture (32-bit) + bitstr="$(gettext "(32-bit)")" +@@ -146,6 +208,7 @@ + ;; + esac + ++ found_other_os=1 + onstr="$(gettext_printf "(on %s)" "${DEVICE}")" + cat << EOF + menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' { +@@ -169,6 +232,7 @@ + EOF + ;; + efi) ++ found_other_os=1 + EFIPATH=${DEVICE#*@} + DEVICE=${DEVICE%@*} + cat << EOF +@@ -211,6 +275,7 @@ + [ "${prepare_boot_cache}" ] || continue + fi + ++ found_other_os=1 + onstr="$(gettext_printf "(on %s)" "${DEVICE}")" + recovery_params="$(echo "${LPARAMS}" | grep 'single\|recovery')" || true + counter=1 +@@ -277,6 +342,7 @@ + osx_entry xnu_kernel64 64 + ;; + hurd) ++ found_other_os=1 + onstr="$(gettext_printf "(on %s)" "${DEVICE}")" + cat << EOF + menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' { +@@ -309,3 +375,5 @@ + ;; + esac + done ++ ++adjust_timeout diff --git a/debian/patches/series b/debian/patches/series index 9ff104ec6..d0d05a1f0 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -57,3 +57,4 @@ efidisk_non_512_sectors.patch mkconfig_hurd_sort.patch probe_dmraid.patch install_efi_ubuntu_flavours.patch +quick_boot.patch diff --git a/debian/rules b/debian/rules index 7c74d5d1b..fd353ab65 100755 --- a/debian/rules +++ b/debian/rules @@ -54,7 +54,7 @@ endif ifeq (yes,$(shell dpkg-vendor --derives-from Ubuntu && echo yes)) DEFAULT_CMDLINE := quiet splash -confflags += --enable-quiet-boot +confflags += --enable-quiet-boot --enable-quick-boot else DEFAULT_CMDLINE := quiet endif diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in index 765bfdcd3..068103d97 100644 --- a/util/grub.d/00_header.in +++ b/util/grub.d/00_header.in @@ -23,6 +23,7 @@ prefix="@prefix@" exec_prefix="@exec_prefix@" datarootdir="@datarootdir@" grub_lang=`echo $LANG | cut -d . -f 1` +quick_boot="@QUICK_BOOT@" export TEXTDOMAIN=@PACKAGE@ export TEXTDOMAINDIR="@localedir@" @@ -272,7 +273,7 @@ fi make_timeout () { - if [ "x${1}" != "x" ] ; then + if [ "$quick_boot" = 0 ] && [ "x${1}" != "x" ] ; then if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then verbose= else diff --git a/util/grub.d/30_os-prober.in b/util/grub.d/30_os-prober.in index 6db581b07..39a2b2ab5 100644 --- a/util/grub.d/30_os-prober.in +++ b/util/grub.d/30_os-prober.in @@ -20,18 +20,78 @@ set -e prefix="@prefix@" exec_prefix="@exec_prefix@" datarootdir="@datarootdir@" +quick_boot="@QUICK_BOOT@" export TEXTDOMAIN=@PACKAGE@ export TEXTDOMAINDIR="@localedir@" . "@datadir@/@PACKAGE@/grub-mkconfig_lib" +found_other_os= + +make_timeout () { + if [ "x${found_other_os}" = "x" ] ; then + if [ "x${1}" != "x" ] ; then + if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then + verbose= + else + verbose=" --verbose" + fi + + if [ "x${1}" = "x0" ] ; then + cat < /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then # missing os-prober and/or linux-boot-prober + adjust_timeout exit 0 fi @@ -43,10 +103,12 @@ modprobe efivars >/dev/null 2>&1 || true OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`" if [ -z "${OSPROBED}" ] ; then # empty os-prober output, nothing doing + adjust_timeout exit 0 fi osx_entry() { + found_other_os=1 if [ x$2 = x32 ]; then # TRANSLATORS: it refers to kernel architecture (32-bit) bitstr="$(gettext "(32-bit)")" @@ -146,6 +208,7 @@ for OS in ${OSPROBED} ; do ;; esac + found_other_os=1 onstr="$(gettext_printf "(on %s)" "${DEVICE}")" cat << EOF menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' { @@ -169,6 +232,7 @@ EOF EOF ;; efi) + found_other_os=1 EFIPATH=${DEVICE#*@} DEVICE=${DEVICE%@*} cat << EOF @@ -211,6 +275,7 @@ EOF [ "${prepare_boot_cache}" ] || continue fi + found_other_os=1 onstr="$(gettext_printf "(on %s)" "${DEVICE}")" recovery_params="$(echo "${LPARAMS}" | grep 'single\|recovery')" || true counter=1 @@ -277,6 +342,7 @@ EOF osx_entry xnu_kernel64 64 ;; hurd) + found_other_os=1 onstr="$(gettext_printf "(on %s)" "${DEVICE}")" cat << EOF menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' { @@ -309,3 +375,5 @@ EOF ;; esac done + +adjust_timeout