From 41e8c80c6c0ffaaf46ddf587b4e7a1eac0044093 Mon Sep 17 00:00:00 2001
From: Colin Watson <cjwatson@ubuntu.com>
Date: Mon, 13 Jan 2014 12:13:30 +0000
Subject: Add configure option to use vt.handoff=7

This is used for non-recovery Linux entries only; it enables
flicker-free booting if gfxpayload=keep is in use and a suitable kernel
is present.

Author: Andy Whitcroft <apw@canonical.com>
Forwarded: not-needed
Last-Update: 2013-12-25

Patch-Name: vt_handoff.patch
---
 configure.ac            | 11 +++++++++++
 util/grub.d/10_linux.in | 28 +++++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index 622b8fd31..7a8c060e8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1830,6 +1830,17 @@ else
 fi
 AC_SUBST([GFXPAYLOAD_DYNAMIC])
 
+AC_ARG_ENABLE([vt-handoff],
+              [AS_HELP_STRING([--enable-vt-handoff],
+                              [use Linux vt.handoff option for flicker-free booting (default=no)])],
+              [], [enable_vt_handoff=no])
+if test x"$enable_vt_handoff" = xyes ; then
+  VT_HANDOFF=1
+else
+  VT_HANDOFF=0
+fi
+AC_SUBST([VT_HANDOFF])
+
 LIBS=""
 
 AC_SUBST([FONT_SOURCE])
diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index 402c5629d..c219e3069 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -24,6 +24,7 @@ ubuntu_recovery="@UBUNTU_RECOVERY@"
 quiet_boot="@QUIET_BOOT@"
 quick_boot="@QUICK_BOOT@"
 gfxpayload_dynamic="@GFXPAYLOAD_DYNAMIC@"
+vt_handoff="@VT_HANDOFF@"
 
 . "$pkgdatadir/grub-mkconfig_lib"
 
@@ -94,6 +95,14 @@ if [ "$ubuntu_recovery" = 1 ]; then
     GRUB_CMDLINE_LINUX_RECOVERY="$GRUB_CMDLINE_LINUX_RECOVERY nomodeset"
 fi
 
+if [ "$vt_handoff" = 1 ]; then
+  for word in $GRUB_CMDLINE_LINUX_DEFAULT; do
+    if [ "$word" = splash ]; then
+      GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT \$vt_handoff"
+    fi
+  done
+fi
+
 linux_entry ()
 {
   os="$1"
@@ -139,7 +148,7 @@ linux_entry ()
   fi
   if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) && \
      ([ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 1 ]); then
-      echo "	set gfxpayload=\$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
+      echo "	gfxmode \$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
   fi
 
   echo "	insmod gzio" | sed "s/^/$submenu_indentation/"
@@ -214,6 +223,23 @@ prepare_root_cache=
 boot_device_id=
 title_correction_code=
 
+cat << 'EOF'
+function gfxmode {
+	set gfxpayload="${1}"
+EOF
+if [ "$vt_handoff" = 1 ]; then
+  cat << 'EOF'
+	if [ "${1}" = "keep" ]; then
+		set vt_handoff=vt.handoff=7
+	else
+		set vt_handoff=
+	fi
+EOF
+fi
+cat << EOF
+}
+EOF
+
 # Use ELILO's generic "efifb" when it's known to be available.
 # FIXME: We need an interface to select vesafb in case efifb can't be used.
 if [ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 0 ]; then
