[packages/plymouth] - updated to 0.9.0 - removed obsolete git patch

qboosh qboosh at pld-linux.org
Sun Dec 21 19:31:53 CET 2014


commit af391cce12f9d96db1498a2be0359f37d3e375fc
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Sun Dec 21 19:32:46 2014 +0100

    - updated to 0.9.0
    - removed obsolete git patch

 plymouth-git.patch | 11238 ---------------------------------------------------
 plymouth.spec      |    12 +-
 2 files changed, 6 insertions(+), 11244 deletions(-)
---
diff --git a/plymouth.spec b/plymouth.spec
index e8497df..67a9974 100644
--- a/plymouth.spec
+++ b/plymouth.spec
@@ -8,12 +8,12 @@
 Summary:	Graphical Boot Animation and Logger
 Summary(pl.UTF-8):	Graficzna animacja i logowanie startu systemu
 Name:		plymouth
-Version:	0.8.8
-Release:	10
+Version:	0.9.0
+Release:	1
 License:	GPL v2+
 Group:		Base
 Source0:	http://www.freedesktop.org/software/plymouth/releases/%{name}-%{version}.tar.bz2
-# Source0-md5:	38f5e613e5ab17806b950cee2d0d0d4e
+# Source0-md5:	147150705417f025d036304e97e33c9c
 Source1:	%{name}-logo.png
 # Source1-md5:	6b38a868585adfd3a96a4ad16973c1f8
 Source2:	%{name}.tmpfiles
@@ -21,18 +21,18 @@ Source4:	boot-duration
 Source6:	%{name}-update-initrd
 Patch0:		text-colors.patch
 Patch1:		%{name}-restore-suspend.patch
-Patch100:	%{name}-git.patch
 URL:		http://www.freedesktop.org/wiki/Software/Plymouth
 BuildRequires:	autoconf >= 2.50
 BuildRequires:	automake >= 1:1.11
 BuildRequires:	cairo-devel
 BuildRequires:	gtk+2-devel >= 2:2.12.0
-BuildRequires:	xorg-lib-libpciaccess-devel
 %{?with_drm:BuildRequires:	libdrm-devel}
 BuildRequires:	libpng-devel >= 2:1.2.16
+BuildRequires:	libtool >= 2:2
 BuildRequires:	pango-devel >= 1:1.21.0
 BuildRequires:	pkgconfig
 BuildRequires:	udev-devel
+BuildRequires:	xorg-lib-libpciaccess-devel
 Requires:	%{name}-graphics-libs = %{version}-%{release}
 Requires(post):	%{name}-scripts = %{version}-%{release}
 Requires:	/etc/os-release
@@ -348,7 +348,6 @@ Odznacza się on małym kółkiem kręcącym się na ciemnym tle.
 
 %prep
 %setup -q
-%patch100 -p1
 %patch0 -p1
 %patch1 -p1
 
@@ -356,6 +355,7 @@ Odznacza się on małym kółkiem kręcącym się na ciemnym tle.
 %{__sed} -i -e 's/Theme=.*/Theme=tribar/ig' -e 's/ShowDelay=.*//ig' src/plymouthd.defaults
 
 %build
+%{__libtoolize}
 %{__aclocal}
 %{__autoconf}
 %{__autoheader}
diff --git a/plymouth-git.patch b/plymouth-git.patch
deleted file mode 100644
index a5c8b3c..0000000
--- a/plymouth-git.patch
+++ /dev/null
@@ -1,11238 +0,0 @@
-diff --git a/Makefile.am b/Makefile.am
-index b322463..395c91b 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -1,4 +1,8 @@
--SUBDIRS = src themes images scripts docs systemd-units
-+SUBDIRS = src themes images scripts systemd-units
-+
-+if BUILD_DOCUMENTATION
-+SUBDIRS += docs
-+endif
- 
- DISTCHECK_CONFIGURE_FLAGS = --disable-tests --without-system-root-install
- 
-diff --git a/configure.ac b/configure.ac
-index 2ab0893..9c8f863 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -6,7 +6,7 @@ AC_CONFIG_AUX_DIR(build-tools)
- AC_USE_SYSTEM_EXTENSIONS
- AC_SYS_LARGEFILE
- AC_PROG_AWK
--AC_PROG_CC
-+AC_PROG_CC_STDC
- AM_PROG_CC_C_O
- AC_HEADER_STDC
- AC_C_CONST
-@@ -16,7 +16,7 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
- AM_MAINTAINER_MODE([enable])
- 
- PKG_PROG_PKG_CONFIG
--LT_INIT
-+LT_INIT([dlopen disable-static pic-only])
- 
- ## increment if the interface has additions, changes, removals.
- LT_CURRENT=3
-@@ -38,12 +38,19 @@ PKG_CHECK_MODULES(IMAGE, [libpng >= 1.2.16 ])
- AC_SUBST(IMAGE_CFLAGS)
- AC_SUBST(IMAGE_LIBS)
- 
-+PKG_CHECK_MODULES(UDEV, [libudev]);
-+AC_SUBST(UDEV_CFLAGS)
-+AC_SUBST(UDEV_LIBS)
-+
- PLYMOUTH_CFLAGS=""
- PLYMOUTH_LIBS="-lm -lrt -ldl"
- 
- AC_SUBST(PLYMOUTH_CFLAGS)
- AC_SUBST(PLYMOUTH_LIBS)
- 
-+AC_PATH_PROG([SYSTEMD_ASK_PASSWORD_AGENT], [systemd-tty-ask-password-agent])
-+AC_PATH_PROG([UDEVADM], [udevadm])
-+
- AC_ARG_ENABLE(pango, AS_HELP_STRING([--enable-pango],[enable building with pango, disabled there is no encryption prompts]),enable_pango=$enableval,enable_pango=yes)
- AM_CONDITIONAL(ENABLE_PANGO,  [test "$enable_pango" = yes])
- 
-@@ -62,148 +69,6 @@ if test x$enable_gtk = xyes; then
-   AC_SUBST(GTK_LIBS)
- fi
- 
--AC_ARG_ENABLE(libdrm_intel, AS_HELP_STRING([--enable-libdrm_intel],[enable building with libdrm_intel support]),enable_libdrm_intel=$enableval,enable_libdrm_intel=no)
--AM_CONDITIONAL(ENABLE_LIBDRM_INTEL,  [test "$enable_libdrm_intel" = yes])
--
--if test x$enable_libdrm_intel = xyes; then
--  PKG_CHECK_MODULES(DRM_INTEL, [libdrm libdrm_intel])
--  OLD_CFLAGS="$CFLAGS"
--  CFLAGS="$CFLAGS $DRM_INTEL_CFLAGS"
--  AC_MSG_CHECKING([if i915_drm.h is in include path])
--  AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
--  [[
--    #include <stdint.h>
--    #include <stdlib.h>
--    #include "i915_drm.h"
--  ]],[[]]),[found_drm_intel_kernel_headers=yes],[found_drm_intel_kernel_headers=no])
--
--  if test "$found_drm_intel_kernel_headers" = "yes"; then
--    AC_MSG_RESULT([yes])
--  else
--    AC_MSG_RESULT([no])
--    AC_MSG_CHECKING([if we can find them anyway])
--
--    MORE_DRM_CFLAGS="-I`$PKG_CONFIG --variable includedir libdrm`/drm"
--    CFLAGS="$CFLAGS $MORE_DRM_CFLAGS"
--    AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
--    [[
--      #include <stdint.h>
--      #include <stdlib.h>
--      #include "i915_drm.h"
--    ]],[[]]),[found_drm_intel_kernel_headers=yes],[found_drm_intel_kernel_headers=no])
--
--    if test "$found_drm_intel_kernel_headers" = "yes"; then
--      AC_MSG_RESULT([yes])
--      DRM_INTEL_CFLAGS="$DRM_INTEL_CFLAGS $MORE_DRM_CFLAGS"
--    else
--      AC_MSG_RESULT([no])
--      AC_MSG_ERROR([Could not find i915_drm.h])
--    fi
--  fi
--
--  AC_SUBST(DRM_INTEL_CFLAGS)
--  AC_SUBST(DRM_INTEL_LIBS)
--  AC_DEFINE(PLY_ENABLE_LIBDRM_INTEL, 1, [Enable support for libdrm_intel driver])
--fi
--
--AC_ARG_ENABLE(libdrm_radeon, AS_HELP_STRING([--enable-libdrm_radeon],[enable building with libdrm_radeon support]),enable_libdrm_radeon=$enableval,enable_libdrm_radeon=no)
--AM_CONDITIONAL(ENABLE_LIBDRM_RADEON,  [test "$enable_libdrm_radeon" = yes])
--
--if test x$enable_libdrm_radeon = xyes; then
--  PKG_CHECK_MODULES(DRM_RADEON, [libdrm libdrm_radeon])
--  OLD_CFLAGS="$CFLAGS"
--  CFLAGS="$CFLAGS $DRM_RADEON_CFLAGS"
--  AC_MSG_CHECKING([if radeon_drm.h is in include path])
--  AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
--  [[
--    #include <stdint.h>
--    #include <stdlib.h>
--    #include "radeon_drm.h"
--  ]],[[]]),[found_drm_radeon_kernel_headers=yes],[found_drm_radeon_kernel_headers=no])
--
--  if test "$found_drm_radeon_kernel_headers" = "yes"; then
--    AC_MSG_RESULT([yes])
--  else
--    AC_MSG_RESULT([no])
--    AC_MSG_CHECKING([if we can find them anyway])
--
--    MORE_DRM_CFLAGS="-I`$PKG_CONFIG --variable includedir libdrm`/drm"
--    CFLAGS="$CFLAGS $MORE_DRM_RADEON_CFLAGS"
--    AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
--    [[
--      #include <stdint.h>
--      #include <stdlib.h>
--      #include "radeon_drm.h"
--    ]],[[]]),[found_drm_radeon_kernel_headers=yes],[found_drm_radeon_kernel_headers=no])
--
--    if test "$found_drm_radeon_kernel_headers" = "yes"; then
--      AC_MSG_RESULT([yes])
--      DRM_RADEON_CFLAGS="$DRM_RADEON_CFLAGS $MORE_DRM_CFLAGS"
--    else
--      AC_MSG_RESULT([no])
--      AC_MSG_ERROR([Could not find radeon_drm.h])
--    fi
--  fi
--
--  AC_SUBST(DRM_RADEON_CFLAGS)
--  AC_SUBST(DRM_RADEON_LIBS)
--  AC_DEFINE(PLY_ENABLE_LIBDRM_RADEON, 1, [Enable support for libdrm_radeon driver])
--fi
--
--AC_ARG_ENABLE(libdrm_nouveau, AS_HELP_STRING([--enable-libdrm_nouveau],[enable building with libdrm_nouveau support]),enable_libdrm_nouveau=$enableval,enable_libdrm_nouveau=no)
--AM_CONDITIONAL(ENABLE_LIBDRM_NOUVEAU,  [test "$enable_libdrm_nouveau" = yes])
--
--if test x$enable_libdrm_nouveau = xyes; then
--  PKG_CHECK_MODULES(DRM_NOUVEAU, [libdrm libdrm_nouveau])
--  OLD_CFLAGS="$CFLAGS"
--  CFLAGS="$CFLAGS $DRM_NOUVEAU_CFLAGS"
--  AC_MSG_CHECKING([if nouveau_drm.h is in include path])
--  AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
--  [[
--    #include <stdint.h>
--    #include <stdlib.h>
--    #include "nouveau_drm.h"
--  ]],[[]]),[found_drm_nouveau_kernel_headers=yes],[found_drm_nouveau_kernel_headers=no])
--
--  if test "$found_drm_nouveau_kernel_headers" = "yes"; then
--    AC_MSG_RESULT([yes])
--  else
--    AC_MSG_RESULT([no])
--    AC_MSG_CHECKING([if we can find them anyway])
--
--    MORE_DRM_CFLAGS="-I`$PKG_CONFIG --variable includedir libdrm`/drm"
--    CFLAGS="$CFLAGS $MORE_DRM_CFLAGS"
--    AC_COMPILE_IFELSE(AC_LANG_PROGRAM(
--    [[
--      #include <stdint.h>
--      #include <stdlib.h>
--      #include "nouveau_drm.h"
--    ]],[[]]),[found_drm_nouveau_kernel_headers=yes],[found_drm_nouveau_kernel_headers=no])
--
--    if test "$found_drm_nouveau_kernel_headers" = "yes"; then
--      AC_MSG_RESULT([yes])
--      DRM_NOUVEAU_CFLAGS="$DRM_NOUVEAU_CFLAGS $MORE_DRM_CFLAGS"
--    else
--      AC_MSG_RESULT([no])
--      AC_MSG_ERROR([Could not find nouveau_drm.h])
--    fi
--  fi
--
--  AC_SUBST(DRM_NOUVEAU_CFLAGS)
--  AC_SUBST(DRM_NOUVEAU_LIBS)
--  AC_DEFINE(PLY_ENABLE_LIBDRM_NOUVEAU, 1, [Enable support for libdrm_nouveau driver])
--fi
--
--AC_ARG_ENABLE(libkms, AS_HELP_STRING([--enable-libkms],[enable building with libkms support]),enable_libkms=$enableval,enable_libkms=no)
--AM_CONDITIONAL(ENABLE_LIBKMS,  [test "$enable_libkms" = yes])
--
--if test x$enable_libkms = xyes; then
--  PKG_CHECK_MODULES(LIBKMS, [libdrm libkms])
--  AC_SUBST(LIBKMS_CFLAGS)
--  AC_SUBST(LIBKMS_LIBS)
--  AC_DEFINE(PLY_ENABLE_LIBKMS, 1, [Enable support for libkms abstraction over drm drivers])
--fi
--
- AC_ARG_ENABLE(drm, AS_HELP_STRING([--enable-drm-renderer],[enable building drm kms support]),enable_drm_renderer=$enableval,enable_drm_renderer=yes)
- AM_CONDITIONAL(ENABLE_DRM_RENDERER,  [test "$enable_drm_renderer" = yes])
- 
-@@ -211,10 +76,17 @@ if test x$enable_drm_renderer = xyes; then
-   PKG_CHECK_MODULES(DRM, [libdrm])
- fi
- 
--DRM_CFLAGS="$DRM_CFLAGS $DRM_INTEL_CFLAGS $DRM_RADEON_CFLAGS $DRM_NOUVEAU_CFLAGS $LIBKMS_CFLAG"
--DRM_LIBS="$DRM_LIBS $DRM_INTEL_LIBS $DRM_RADEON_LIBS $DRM_NOUVEAU_LIBS $LIBKMS_LIBS"
--AC_SUBST(DRM_CFLAGS)
--AC_SUBST(DRM_LIBS)
-+AC_ARG_ENABLE(documentation,
-+              AS_HELP_STRING([--enable-documentation],
-+                             [build documentation]),,
-+              enable_documentation=yes)
-+if test x$enable_documentation = xyes; then
-+   AC_PATH_PROG([XSLTPROC], [xsltproc])
-+   if test x$XSLTPROC = x; then
-+      AC_MSG_ERROR([xsltproc is required to build documentation])
-+   fi
-+fi
-+AM_CONDITIONAL(BUILD_DOCUMENTATION, test x$enable_documentation = xyes)
- 
- AC_ARG_ENABLE(tracing, AS_HELP_STRING([--enable-tracing],[enable verbose tracing code]),enable_tracing=$enableval,enable_tracing=yes)
- 
-@@ -222,10 +94,6 @@ if test x$enable_tracing = xyes; then
-   AC_DEFINE(PLY_ENABLE_TRACING, 1, [Build in verbose debug tracing spew])
- fi
- 
--AC_ARG_ENABLE(tests, AS_HELP_STRING([--enable-tests],[build tests]),enable_tests=$enableval,enable_tests=yes)
--
--AM_CONDITIONAL(ENABLE_TESTS,  [test "$enable_tests" = yes])
--
- AC_ARG_ENABLE(gdm-transition, AS_HELP_STRING([--enable-gdm-transition],[enable smooth transition to gdm]),enable_gdm_transition=$enableval,enable_gdm_transition=no)
- 
- if test x$enable_gdm_transition = xyes; then
-@@ -254,7 +122,7 @@ AM_CONDITIONAL(ENABLE_SYSTEMD_INTEGRATION, [test "$enable_systemd_integration" =
- 
- if test x$enable_systemd_integration = xyes; then
-   AC_DEFINE(PLY_ENABLE_SYSTEMD_INTEGRATION, 1, [Coordinate boot up with systemd])
--  SYSTEMD_UNIT_DIR=/lib/systemd/system
-+  SYSTEMD_UNIT_DIR=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)
-   AC_SUBST(SYSTEMD_UNIT_DIR)
- fi
- 
-@@ -278,7 +146,7 @@ AS_AC_EXPAND(PLYMOUTH_CLIENT_DIR, $plymouthclientdir)
- AS_AC_EXPAND(PLYMOUTH_DAEMON_DIR, $plymouthdaemondir)
- AS_AC_EXPAND(PLYMOUTH_RUNTIME_DIR, $plymouthruntimedir)
- 
--AC_ARG_WITH(rhgb-compat-link, AS_HELP_STRING([--with-rhgb-compat-link],[Install /usr/bin/rhgb-client compatability symlink]),with_rhgb_compat_link=${withval},with_rhgb_compat_link=yes)
-+AC_ARG_WITH(rhgb-compat-link, AS_HELP_STRING([--with-rhgb-compat-link],[Install /usr/bin/rhgb-client compatability symlink]),with_rhgb_compat_link=${withval},with_rhgb_compat_link=no)
- AM_CONDITIONAL(WITH_RHGB_COMPAT_LINK,  [test "$with_rhgb_compat_link" = yes])
- 
- AC_ARG_WITH(log-viewer, AS_HELP_STRING([--with-log-viewer],[Install plymouth log viewer]),with_log_viewer=${withval},with_log_viewer=no)
-@@ -328,7 +196,7 @@ AC_DEFUN([PLYMOUTH_CC_TRY_FLAG], [
-   plymouth_save_CFLAGS="$CFLAGS"
-   CFLAGS="$CFLAGS $1"
- 
--  AC_COMPILE_IFELSE([ ], [plymouth_cc_flag=yes], [plymouth_cc_flag=no])
-+  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ ]])], [plymouth_cc_flag=yes], [plymouth_cc_flag=no])
-   CFLAGS="$plymouth_save_CFLAGS"
- 
-   if test "x$plymouth_cc_flag" = "xyes"; then
-@@ -357,7 +225,7 @@ if test "$GCC" = "yes" -a "$set_more_warnings" != "no"; then
-    -Wchar-subscripts -Wmissing-declarations -Wmissing-prototypes \
-    -Wwrite-strings -Wnested-externs -Wpointer-arith \
-    -Wswitch-enum -Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations \
--   -Wno-missing-field-initializers -Wno-unused-parameter \
-+   -Wno-missing-field-initializers -Wno-unused-parameter -Wno-unused-result \
-    -Wcast-align -Wsign-compare -Wp,-D_FORTIFY_SOURCE=2"
- elif test "$GCC" = "yes"; then
-   AC_MSG_RESULT(no)
-@@ -427,6 +295,7 @@ AC_CONFIG_FILES([Makefile
-            src/plugins/splash/Makefile
-            src/plugins/splash/throbgress/Makefile
-            src/plugins/splash/fade-throbber/Makefile
-+           src/plugins/splash/tribar/Makefile
-            src/plugins/splash/text/Makefile
-            src/plugins/splash/details/Makefile
-            src/plugins/splash/space-flares/Makefile
-@@ -439,12 +308,10 @@ AC_CONFIG_FILES([Makefile
-            src/client/Makefile
-            src/viewer/Makefile
-            src/upstart-bridge/Makefile
--           src/tests/Makefile
--           src/libply/tests/Makefile
--           src/client/tests/Makefile
-            themes/Makefile
-            themes/spinfinity/Makefile
-            themes/fade-in/Makefile
-+           themes/tribar/Makefile
-            themes/text/Makefile
-            themes/details/Makefile
-            themes/solar/Makefile
-diff --git a/docs/Makefile.am b/docs/Makefile.am
-index dedda55..1a9f7ea 100644
---- a/docs/Makefile.am
-+++ b/docs/Makefile.am
-@@ -1,4 +1,31 @@
--dist_man_MANS = plymouth.8
-+XSLTPROC_FLAGS = \
-+        --nonet \
-+        --stringparam man.output.quietly 1 \
-+        --stringparam funcsynopsis.style ansi \
-+        --stringparam man.th.extra1.suppress 1 \
-+        --stringparam man.authors.section.enabled 0 \
-+        --stringparam man.copyright.section.enabled 0
- 
--%.html: %.txt
--	asciidoc $(ASCIIDOC_OPTS) -a toc $*.txt
-+
-+plymouth.1: plymouth1.xml
-+	$(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
-+
-+%.8: %.xml
-+	$(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
-+	
-+%.1: %.xml
-+	$(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
-+	
-+man_MANS = \
-+	plymouth.1 \
-+	plymouth.8 \
-+	plymouthd.8 \
-+	plymouth-set-default-theme.1
-+
-+EXTRA_DIST = \
-+	plymouth.xml \
-+	plymouth1.xml \
-+	plymouth-set-default-theme.xml \
-+	plymouthd.xml
-+
-+CLEANFILES = $(man_MANS)
-diff --git a/docs/plymouth-set-default-theme.xml b/docs/plymouth-set-default-theme.xml
-new file mode 100644
-index 0000000..efb051e
---- /dev/null
-+++ b/docs/plymouth-set-default-theme.xml
-@@ -0,0 +1,103 @@
-+<?xml version='1.0'?>
-+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-+        "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-+
-+<refentry id="plymouth-set-default-theme">
-+
-+        <refentryinfo>
-+                <title>plymouth-set-default-theme</title>
-+                <productname>plymouth</productname>
-+
-+                <authorgroup>
-+                        <author>
-+                                <contrib>Developer</contrib>
-+                                <firstname>Kristian</firstname>
-+                                <surname>Høgsberg</surname>
-+                        </author>
-+                        <author>
-+                                <contrib>Developer</contrib>
-+                                <firstname>Ray</firstname>
-+                                <surname>Strode</surname>
-+                        </author>
-+                </authorgroup>
-+
-+        </refentryinfo>
-+
-+        <refmeta>
-+                <refentrytitle>plymouth-set-default-theme</refentrytitle>
-+                <manvolnum>1</manvolnum>
-+                <refmiscinfo class="manual">User Commands</refmiscinfo>
-+        </refmeta>
-+
-+        <refnamediv>
-+                <refname>plymouth-set-default-theme</refname>
-+                <refpurpose>Set the plymouth theme</refpurpose>
-+        </refnamediv>
-+
-+        <refsynopsisdiv>
-+                <cmdsynopsis>
-+                        <command>plymouth-set-default-theme <arg choice="opt" rep="repeat">OPTION</arg> <arg choice="opt" rep="norepeat">THEME</arg></command>
-+                </cmdsynopsis>
-+        </refsynopsisdiv>
-+
-+        <refsect1>
-+                <title>Description</title>
-+
-+<para>
-+When called with a <option>THEME</option> argument,
-+the <command>plymouth-set-default-theme</command> command
-+changes the preferred boot theme and also performs the necessary
-+regeneration of the initial ramdisk (initrd) since plymouth is loaded
-+from the boot loader from the initrd prior to the mounting of the root
-+filesystem.
-+</para>
-+
-+<para>
-+If <command>plymouth-set-default-theme</command> is invoked with no options
-+or parameters, it shows the currently selected theme by default. This output
-+is used by the helper scripts plymouth-generate-initrd and
-+plymouth-update-initrd to set the proper theme in the initial ramdisk.
-+</para>
-+
-+        </refsect1>
-+
-+        <refsect1>
-+                <title>Options</title>
-+
-+                <para>The following options are understood:</para>
-+
-+                <variablelist>
-+                        <varlistentry>
-+                                <term><option>-h</option>, <option>--help</option></term>
-+                                <listitem><para>Show summary of options.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>-l</option>, <option>--list</option></term>
-+                                <listitem><para>List available themes.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>-r</option>, <option>--reset</option></term>
-+                                <listitem><para>Reset to default theme.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>-R</option>, <option>--rebuild-initrd</option></term>
-+                                <listitem><para>Rebuild initrd (necessary after changing theme).</para></listitem>
-+                        </varlistentry>
-+                </variablelist>
-+        </refsect1>
-+
-+        <refsect1>
-+                <title>See Also</title>
-+                <para>
-+                        <citerefentry><refentrytitle>grub</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouth</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouthd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouth</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-+                        <ulink url="http://www.freedesktop.org/wiki/Software/Plymouth">http://www.freedesktop.org/wiki/Software/Plymouth</ulink>
-+                </para>
-+        </refsect1>
-+
-+</refentry>
-diff --git a/docs/plymouth.8 b/docs/plymouth.8
-deleted file mode 100644
-index 7f4766b..0000000
---- a/docs/plymouth.8
-+++ /dev/null
-@@ -1,62 +0,0 @@
--\"                                      Hey, EMACS: -*- nroff -*-
--.TH PLYMOUTH 8 "December 15, 2009"
--.SH NAME
--plymouth \- A graphical boot system and logger
--.SH SYNOPSIS
--.B plymouth-set-default-theme
--.RI [ options ] " \<theme\>"
--.SH DESCRIPTION
--\fBplymouth\fP is a graphical boot system for Linux which takes advantage of the kernel-based
--mode setting (KMS) available for modern graphic cards to provide a seamless, flickerfree
--and attractive boot screen. It allows to choose between various, static or
--animated graphical themes to spruce up the startup and avoid the noise
--generated by the vast amount of kernel messages while the machine boots into X.
--On systems where kernel-based mode setting is not available, plymouth falls
--back to a text mode boot screen which provides a simple progress bar to provide
--feedback during boot.
--.PP
--To configure plymouth, that is to choose and install the preferred boot theme, the
--user has to invoke \fBplymouth-set-default-theme\fP. It changes the configuration
--to the new theme and also performs the necessary regeneration of the initial ramdisk
--(initrd) since plymouth is loaded from the boot loader from the initrd
--prior to the mounting of the root filesystem. The options available to this
--script are explained in the \fBOPTIONS\fP paragraph.
--.PP
--In order for the configured default plymouth theme to be loaded during boot,
--the option `splash' (or `rhgb' for backward compatibility with the RHGB boot
--splash) must be provided at the kernel command line.  With this command line
--option, plymouth will default to showing detailed boot output.
--.SH OPTIONS
--plymouth-set-default-theme follows the usual GNU command line syntax, with long
--options starting with two dashes (`-') and short variants of each of them.
--.TP
--.B \-h, \-\-help
--Show summary of options.
--.TP
--.B \-l, \-\-list
--List available themes.
--.TP
--.B \-r, \-\-reset
--Reset to default theme.
--.TP
--.B \-R, \-\-rebuild\-initrd
--Rebuild initrd (necessary after changing theme).
--.TP
--.B \<theme-name\>
--Name of new theme to use. If you want to see which themes are available, invoke the script with just \-\-list.
--.PP
--If plymouth-set-default-theme is invoked with no options or parameters, it shows the currently selected theme
--by default. This output is used by the helper scripts `plymouth-generate-initrd' and `plymouth-update-initrd'
--to set the proper theme in the initial ramdisk.
--.SH SEE ALSO
--.BR grub (8)
--.br
--.SH AUTHOR
--plymouth was originally prototyped and named by Kristian Høgsberg <krh at bitplanet.net>,
--originally written by Ray Strode <halfline at gmail.com> and has had significant contributions
--from Charlie Brej <cbrej at cs.man.ac.uk>.  It has also had contributions from
--Peter Jones <pjones at redhat.com>, Adam Jackson <ajax at nwnk.net>,
--Frederic Crozat <fcrozat at mandriva.com> and others.
--It can be downloaded here: <http://www.freedesktop.org/wiki/Software/Plymouth>.
--.PP
--This manual page was written by Adrian Glaubitz <glaubitz at physik.fu-berlin.de>.
-diff --git a/docs/plymouth.xml b/docs/plymouth.xml
-new file mode 100644
-index 0000000..0f196c6
---- /dev/null
-+++ b/docs/plymouth.xml
-@@ -0,0 +1,86 @@
-+<?xml version='1.0'?>
-+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-+        "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-+
-+<refentry id="plymouth">
-+
-+        <refentryinfo>
-+                <title>plymouth</title>
-+                <productname>plymouth</productname>
-+
-+                <authorgroup>
-+                        <author>
-+                                <contrib>Developer</contrib>
-+                                <firstname>Kristian</firstname>
-+                                <surname>Høgsberg</surname>
-+                        </author>
-+                        <author>
-+                                <contrib>Developer</contrib>
-+                                <firstname>Ray</firstname>
-+                                <surname>Strode</surname>
-+                        </author>
-+                </authorgroup>
-+
-+        </refentryinfo>
-+
-+        <refmeta>
-+                <refentrytitle>plymouth</refentrytitle>
-+                <manvolnum>8</manvolnum>
-+                <refmiscinfo class="manual">System Administration</refmiscinfo>
-+        </refmeta>
-+
-+        <refnamediv>
-+                <refname>plymouth</refname>
-+                <refpurpose>A graphical boot system and logger</refpurpose>
-+        </refnamediv>
-+
-+        <refsect1>
-+                <title>Description</title>
-+
-+<para>
-+<command>plymouth</command> is a graphical boot system for Linux which takes advantage of
-+the kernel-based mode setting (KMS) available for modern graphic  cards
-+to  provide  a  seamless,  flickerfree  and  attractive boot screen. It
-+allows to choose between various, static or animated  graphical  themes
-+to  spruce  up  the  startup  and avoid the noise generated by the vast
-+amount of kernel messages while the machine boots into X.   On  systems
-+where  kernel-based  mode setting is not available, plymouth falls back
-+to a text mode boot screen which provides a simple progress bar to pro‐
-+vide feedback during boot.
-+</para>
-+<para>
-+In order for the configured default plymouth theme to be loaded during
-+boot, the option `splash' (or `rhgb' for  backward  compatibility  with
-+the RHGB  boot  splash) must be provided at the kernel command line.
-+Without this command line option, plymouth will default to showing
-+detailed boot output.
-+</para>
-+
-+<para>
-+During the boot process, the user can switch between the graphical theme
-+and the detailed boot output using the Escape key.
-+</para>
-+
-+        </refsect1>
-+
-+        <refsect1>
-+                <title>See Also</title>
-+                <para>
-+                        <citerefentry><refentrytitle>grub</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouth-set-theme</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouthd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouth</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-+                        <ulink url="http://www.freedesktop.org/wiki/Software/Plymouth">http://www.freedesktop.org/wiki/Software/Plymouth</ulink>
-+                </para>
-+        </refsect1>
-+
-+        <refsect1>
-+                <title>Authors</title>
-+                <para>
-+plymouth  was  originally  prototyped  and  named  by Kristian Høgsberg,
-+originally written by Ray Strode and has had significant contributions from
-+Charlie Brej. It has also had contributions from Peter Jones, Adam Jackson,
-+Frederic Crozat and others.
-+                </para>
-+        </refsect1>
-+</refentry>
-diff --git a/docs/plymouth1.xml b/docs/plymouth1.xml
-new file mode 100644
-index 0000000..b484599
---- /dev/null
-+++ b/docs/plymouth1.xml
-@@ -0,0 +1,351 @@
-+<?xml version='1.0'?>
-+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-+        "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-+
-+<refentry id="plymouth-set-default-theme">
-+
-+        <refentryinfo>
-+                <title>plymouth</title>
-+                <productname>plymouth</productname>
-+
-+                <authorgroup>
-+                        <author>
-+                                <contrib>Developer</contrib>
-+                                <firstname>Kristian</firstname>
-+                                <surname>Høgsberg</surname>
-+                        </author>
-+                        <author>
-+                                <contrib>Developer</contrib>
-+                                <firstname>Ray</firstname>
-+                                <surname>Strode</surname>
-+                        </author>
-+                </authorgroup>
-+
-+        </refentryinfo>
-+
-+        <refmeta>
-+                <refentrytitle>plymouth</refentrytitle>
-+                <manvolnum>1</manvolnum>
-+                <refmiscinfo class="manual">User Commands</refmiscinfo>
-+        </refmeta>
-+
-+        <refnamediv>
-+                <refname>plymouth</refname>
-+                <refpurpose>Send commands to plymouthd</refpurpose>
-+        </refnamediv>
-+
-+        <refsynopsisdiv>
-+                <cmdsynopsis>
-+                        <command>plymouth <arg choice="opt" rep="repeat">OPTION</arg></command>
-+                </cmdsynopsis>
-+                <cmdsynopsis>
-+                        <command>plymouth <arg choice="plain">COMMAND <arg choice="opt" rep="repeat">OPTION</arg></arg></command>
-+                </cmdsynopsis>
-+        </refsynopsisdiv>
-+
-+        <refsect1>
-+                <title>Description</title>
-+
-+<para>
-+The <command>plymouth</command> sends commands to a running
-+<command>plymouthd</command>. This is used during the boot
-+process to control the display of the graphical boot splash.
-+</para>
-+
-+        </refsect1>
-+
-+        <refsect1>
-+                <title>Options</title>
-+
-+                <para>
-+The following options are understood. These options are supported
-+for compatibility with the old <command>rhgb-client</command> interface,
-+and have been replaced by the commands that are described in the
-+next section.
-+</para>
-+
-+                <variablelist>
-+                        <varlistentry>
-+                                <term><option>--help</option></term>
-+                                <listitem><para>Show summary of options.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--debug</option></term>
-+                                <listitem><para>Enable verbose debug logging.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--get-splash-plugin-path</option></term>
-+                                <listitem><para>Get directory where splash plugins are installed.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--newroot=<arg>STRING</arg></option></term>
-+                                <listitem><para>Tell plymouthd that the new root filesystem is mounted.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--quit</option></term>
-+                                <listitem><para>Tell plymouthd to quit.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--ping</option></term>
-+                                <listitem><para>Check if plymouthd is running.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--has-active-vt</option></term>
-+                                <listitem><para>Check if plymouthd has an active vt.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--sysinit</option></term>
-+                                <listitem><para>Tell plymouthd root filesystem is mounted read-write.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--show-splash</option></term>
-+                                <listitem><para>Show the splash screen.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--hide-splash</option></term>
-+                                <listitem><para>Hide the splash screen.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--ask-for-password</option></term>
-+                                <listitem><para>Ask the user for a password.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--ignore-keystroke=<arg>STRING</arg></option></term>
-+                                <listitem><para>Remove sensitivity to a keystroke.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--update=<arg>STRING</arg></option></term>
-+                                <listitem><para>Tell plymouthd an update about boot progress.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--details</option></term>
-+                                <listitem><para>Tell plymouthd there were errors during boot.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--wait</option></term>
-+                                <listitem><para>Wait for plymouthd to quit.</para></listitem>
-+                        </varlistentry>
-+                </variablelist>
-+        </refsect1>
-+
-+        <refsect1>
-+		<title>Commands</title>
-+
-+<para>
-+The following commands are understood:
-+</para>
-+                <variablelist>
-+                        <varlistentry>
-+                                <term><command>change-mode <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Change the operation mode.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--boot-up</option></term>
-+  <listitem><para>Start the system up</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--shutdown</option></term>
-+  <listitem><para>Shutting the system up</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--updates</option></term>
-+  <listitem><para>Applying updates</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>system-update <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Tell plymouthd about boot progress.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--progress=INTEGER</option></term>
-+  <listitem><para>The percentage progress of the updates</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>update <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Tell plymouthd about boot status changes.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--status=STRING</option></term>
-+  <listitem><para>Tell plymouthd the current boot status</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>update-root-fs <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Tell plymouthd about root filesystem changes.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--new-root-dir=STRING</option></term>
-+  <listitem><para>Root filesystem is about to change</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--read-write</option></term>
-+  <listitem><para>Root filesystem is no longer read-only</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>show-splash</command></term>
-+                                <listitem><para>Tell plymouthd to show splash screen.</para></listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>hide-splash</command></term>
-+                                <listitem><para>Tell plymouthd to hide splash screen.</para></listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>ask-for-password <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Ask the user for a password.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--command=STRING</option></term>
-+  <listitem><para>Command to send password to via standard input</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--prompt=STRING</option></term>
-+  <listitem><para>Message to display when asking for password</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--number-of-tries=INTEGER</option></term>
-+  <listitem><para>Number of times to ask before giving up (requires <option>--command</option>)</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--dont-pause-progress</option></term>
-+  <listitem><para>Don't pause boot progress bar while asking</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>ask-question</command></term>
-+                                <listitem><para>Ask the user a question.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--command=STRING</option></term>
-+  <listitem><para>Command to send the answer to via standard input</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--prompt=STRING</option></term>
-+  <listitem><para>Message to display when asking the question</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--dont-pause-progress</option></term>
-+  <listitem><para>Don't pause boot progress bar while asking</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>display-message <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Display a message.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--text=STRING</option></term>
-+  <listitem><para>The message text</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>hide-message <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Hide a message.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--text=STRING</option></term>
-+  <listitem><para>The message text</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>watch-keystroke <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Become sensitive to a keystroke.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--command=STRING</option></term>
-+  <listitem><para>Command to send keystroke to via standard input</para></listitem>
-+</varlistentry>
-+<varlistentry>
-+  <term><option>--keys=STRING</option></term>
-+  <listitem><para>Keys to become sensitive to</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>ignore-keystroke <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Remove sensitivity to a keystroke.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--keys=STRING</option></term>
-+  <listitem><para>Keys to remove sensitivitiy from</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>pause-progress</command></term>
-+                                <listitem><para>Pause boot progress bar.</para></listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>unpause-progress</command></term>
-+                                <listitem><para>Unpause boot progress bar.</para></listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>report-error</command></term>
-+                                <listitem><para>Tell plymouthd there were errors during boot.</para></listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>deactivate</command></term>
-+                                <listitem><para>Tell plymouthd to deactivate.</para></listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>reactivate</command></term>
-+                                <listitem><para>Tell plymouthd to reactivate.</para></listitem>
-+                        </varlistentry>
-+                        <varlistentry>
-+                                <term><command>quit <arg choice="plain">OPTION</arg></command></term>
-+                                <listitem><para>Tell plymouthd to quit.</para>
-+<variablelist>
-+<varlistentry>
-+  <term><option>--retain-splash</option></term>
-+  <listitem><para>Don't explicitly hide boot splash on exit</para></listitem>
-+</varlistentry>
-+</variablelist>
-+</listitem>
-+                        </varlistentry>
-+                </variablelist>
-+
-+        </refsect1>
-+
-+        <refsect1>
-+                <title>See Also</title>
-+                <para>
-+                        <citerefentry><refentrytitle>grub</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouth</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouthd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <ulink url="http://www.freedesktop.org/wiki/Software/Plymouth">http://www.freedesktop.org/wiki/Software/Plymouth</ulink>
-+                </para>
-+        </refsect1>
-+
-+</refentry>
-diff --git a/docs/plymouthd.xml b/docs/plymouthd.xml
-new file mode 100644
-index 0000000..4e7e499
---- /dev/null
-+++ b/docs/plymouthd.xml
-@@ -0,0 +1,121 @@
-+<?xml version='1.0'?>
-+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-+        "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-+
-+<refentry id="plymouthd">
-+
-+        <refentryinfo>
-+                <title>plymouthd</title>
-+                <productname>plymouth</productname>
-+
-+                <authorgroup>
-+                        <author>
-+                                <contrib>Developer</contrib>
-+                                <firstname>Kristian</firstname>
-+                                <surname>Høgsberg</surname>
-+                        </author>
-+                        <author>
-+                                <contrib>Developer</contrib>
-+                                <firstname>Ray</firstname>
-+                                <surname>Strode</surname>
-+                        </author>
-+                </authorgroup>
-+
-+        </refentryinfo>
-+
-+        <refmeta>
-+                <refentrytitle>plymouthd</refentrytitle>
-+                <manvolnum>8</manvolnum>
-+                <refmiscinfo class="manual">System Administration</refmiscinfo>
-+        </refmeta>
-+
-+        <refnamediv>
-+                <refname>plymouthd</refname>
-+                <refpurpose>The plymouth daemon</refpurpose>
-+        </refnamediv>
-+
-+        <refsynopsisdiv>
-+                <cmdsynopsis>
-+                        <command>plymouthd <arg choice="opt" rep="repeat">OPTION</arg></command>
-+                </cmdsynopsis>
-+        </refsynopsisdiv>
-+
-+        <refsect1>
-+                <title>Description</title>
-+
-+<para>
-+The <command>plymouthd</command> daemon is usually run out of
-+the initrd. It does the heavy lifting of the plymouth system, logging
-+the session and showing the splash screen.
-+</para>
-+<para>
-+The <command>plymouth</command> is used to send commands to plymouthd
-+that control its behaviour.
-+</para>
-+
-+        </refsect1>
-+
-+        <refsect1>
-+                <title>Options</title>
-+
-+                <para>The following options are understood:</para>
-+
-+                <variablelist>
-+                        <varlistentry>
-+                                <term><option>--help</option></term>
-+                                <listitem><para>Show summary of options.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--attach-to-session</option></term>
-+                                <listitem><para>Redirect console messages from screen to log.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--no-daemon</option></term>
-+                                <listitem><para>Do not daemonize.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--debug</option></term>
-+                                <listitem><para>Output debugging information.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--debug-file=STRING</option></term>
-+                                <listitem><para>File to write debugging information to.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--mode=MODE</option></term>
-+                                <listitem><para>Set mode to either boot or shutdown.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--pid-file=STRING</option></term>
-+                                <listitem><para>Write the PID of the daemon to a file.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--kernel-command-line=STRING</option></term>
-+                                <listitem><para>Fake kernel commandline to use.</para></listitem>
-+                        </varlistentry>
-+
-+                        <varlistentry>
-+                                <term><option>--tty=STRING</option></term>
-+                                <listitem><para>TTY to ues instead of default.</para></listitem>
-+                        </varlistentry>
-+                </variablelist>
-+        </refsect1>
-+
-+        <refsect1>
-+                <title>See Also</title>
-+                <para>
-+                        <citerefentry><refentrytitle>grub</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouth</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-+                        <citerefentry><refentrytitle>plymouth</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-+                        <ulink url="http://www.freedesktop.org/wiki/Software/Plymouth">http://www.freedesktop.org/wiki/Software/Plymouth</ulink>
-+                </para>
-+        </refsect1>
-+
-+</refentry>
-diff --git a/scripts/plymouth-generate-initrd.in b/scripts/plymouth-generate-initrd.in
-index 35509a1..c44ca4c 100755
---- a/scripts/plymouth-generate-initrd.in
-+++ b/scripts/plymouth-generate-initrd.in
-@@ -13,11 +13,12 @@ PLYMOUTH_INITRD_DIR="$(mktemp --tmpdir -d plymouth-XXXXXXX)"
- $PLYMOUTH_POPULATE_INITRD -t "$PLYMOUTH_INITRD_DIR"
- 
- if [ $? -eq 0 ]; then
-+    command -v pigz &>/dev/null && gzip=pigz || gzip=gzip
-     (cd $PLYMOUTH_INITRD_DIR;
-         # FIXME: might make sense to add a flag to plymouth-populate-initrd to
-         #        skip these from the start
-         rm -f lib*/{ld*,libc*,libdl*,libm*,libz*,libpthread*}
--        find | cpio -Hnewc -o | gzip -9 > $PLYMOUTH_IMAGE_FILE
-+        find | cpio -Hnewc -o | $gzip -9 > $PLYMOUTH_IMAGE_FILE
-     )
- fi
- 
-diff --git a/scripts/plymouth-populate-initrd.in b/scripts/plymouth-populate-initrd.in
-index 8d1eec0..43c7f22 100755
---- a/scripts/plymouth-populate-initrd.in
-+++ b/scripts/plymouth-populate-initrd.in
-@@ -8,6 +8,7 @@
- [ -z "$PLYMOUTH_DATADIR" ] && PLYMOUTH_DATADIR="@PLYMOUTH_DATADIR@"
- [ -z "$PLYMOUTH_PLUGIN_PATH" ] && PLYMOUTH_PLUGIN_PATH="$(plymouth --get-splash-plugin-path)"
- [ -z "$PLYMOUTH_LOGO_FILE" ] && PLYMOUTH_LOGO_FILE="@PLYMOUTH_LOGO_FILE@"
-+[ -n "$PLYMOUTH_THEME_NAME" ] && THEME_OVERRIDE=1
- [ -z "$PLYMOUTH_THEME_NAME" ] && PLYMOUTH_THEME_NAME=$(plymouth-set-default-theme)
- [ -z "$PLYMOUTH_CONFDIR" ] && PLYMOUTH_CONFDIR="@PLYMOUTH_CONF_DIR@"
- [ -z "$PLYMOUTH_POLICYDIR" ] && PLYMOUTH_POLICYDIR="@PLYMOUTH_POLICY_DIR@"
-@@ -372,8 +373,8 @@ done
- [ -z "$INITRDDIR" ] && usage error
- 
- mkdir -p ${INITRDDIR}${PLYMOUTH_DATADIR}/plymouth/themes
--inst ${PLYMOUTH_DAEMON_PATH} $INITRDDIR /sbin/plymouthd
--inst ${PLYMOUTH_CLIENT_PATH} $INITRDDIR /bin/plymouth
-+inst ${PLYMOUTH_DAEMON_PATH} $INITRDDIR
-+inst ${PLYMOUTH_CLIENT_PATH} $INITRDDIR
- inst ${PLYMOUTH_DATADIR}/plymouth/themes/text/text.plymouth $INITRDDIR
- inst ${PLYMOUTH_PLUGIN_PATH}/text.so $INITRDDIR
- inst ${PLYMOUTH_DATADIR}/plymouth/themes/details/details.plymouth $INITRDDIR
-@@ -388,6 +389,12 @@ if [ -z "$PLYMOUTH_THEME_NAME" ]; then
-     exit 1
- fi
- 
-+if [ $THEME_OVERRIDE ]; then
-+    conf=$INITRDDIR/${PLYMOUTH_CONFDIR}/plymouthd.conf
-+    echo "modifying plymouthd.conf: Theme=$PLYMOUTH_THEME_NAME" > /dev/stderr
-+    sed -i "s/^ *Theme *=.*/# theme modified by plymouth-populate-initrd\nTheme=$PLYMOUTH_THEME_NAME/" $conf
-+fi
-+
- PLYMOUTH_MODULE_NAME=$(grep "ModuleName *= *" ${PLYMOUTH_DATADIR}/plymouth/themes/${PLYMOUTH_THEME_NAME}/${PLYMOUTH_THEME_NAME}.plymouth | sed 's/ModuleName *= *//')
- 
- if [ ! -f ${PLYMOUTH_PLUGIN_PATH}/${PLYMOUTH_MODULE_NAME}.so ]; then
-@@ -425,6 +432,7 @@ if [ -n "$SYSTEMD_UNIT_DIR" -a -d "$SYSTEMD_UNIT_DIR" ]; then
-     inst $SYSTEMD_UNIT_DIR/plymouth-halt.service $INITRDDIR
- 
-     inst $SYSTEMD_UNIT_DIR/initrd-switch-root.target.wants/plymouth-switch-root.service $INITRDDIR
-+    inst $SYSTEMD_UNIT_DIR/initrd-switch-root.target.wants/plymouth-start.service $INITRDDIR
-     inst $SYSTEMD_UNIT_DIR/sysinit.target.wants/plymouth-start.service $INITRDDIR
-     inst $SYSTEMD_UNIT_DIR/multi-user.target.wants/plymouth-quit.service $INITRDDIR
-     inst $SYSTEMD_UNIT_DIR/multi-user.target.wants/plymouth-quit-wait.service $INITRDDIR
-diff --git a/scripts/plymouth-update-initrd b/scripts/plymouth-update-initrd
-index 1403b8b..4ed5709 100755
---- a/scripts/plymouth-update-initrd
-+++ b/scripts/plymouth-update-initrd
-@@ -1,2 +1,2 @@
- #!/bin/bash
--mkinitrd -f /boot/initrd-$(uname -r).img $(uname -r)
-+dracut -f
-diff --git a/src/Makefile.am b/src/Makefile.am
-index a9e6eb1..fc2f5da 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -1,8 +1,8 @@
--SUBDIRS = libply libply-splash-core libply-splash-graphics . plugins client viewer tests
-+SUBDIRS = libply libply-splash-core libply-splash-graphics . plugins client viewer
- if ENABLE_UPSTART_MONITORING
- SUBDIRS += upstart-bridge
- endif
--INCLUDES = -I$(top_srcdir)                                                    \
-+AM_CPPFLAGS = -I$(top_srcdir)                                                 \
-            -I$(srcdir)/libply                                                 \
-            -I$(srcdir)/libply-splash-core                                     \
-            -I$(srcdir)                                                        \
-@@ -15,6 +15,7 @@ plymouthdbindir = $(plymouthdaemondir)
- plymouthdbin_PROGRAMS = plymouthd
- 
- plymouthd_CFLAGS = $(PLYMOUTH_CFLAGS)                                         \
-+		   -rdynamic                                                  \
- 		   -DPLYMOUTH_PLUGIN_PATH=\"$(PLYMOUTH_PLUGIN_PATH)\"         \
- 		   -DPLYMOUTH_THEME_PATH=\"$(PLYMOUTH_THEME_PATH)/\"          \
- 		   -DPLYMOUTH_POLICY_DIR=\"$(PLYMOUTH_POLICY_DIR)/\"          \
-diff --git a/src/client/Makefile.am b/src/client/Makefile.am
-index 9487901..83b19cc 100644
---- a/src/client/Makefile.am
-+++ b/src/client/Makefile.am
-@@ -1,6 +1,4 @@
--SUBDIRS = . tests
--
--INCLUDES = -I$(top_srcdir)                                                    \
-+AM_CPPFLAGS = -I$(top_srcdir)                                                 \
-            -I$(top_srcdir)/src                                                \
-            -I$(top_srcdir)/src/libply                                         \
-            -I$(srcdir)
-diff --git a/src/client/ply-boot-client.c b/src/client/ply-boot-client.c
-index 56458ce..3480676 100644
---- a/src/client/ply-boot-client.c
-+++ b/src/client/ply-boot-client.c
-@@ -869,137 +869,4 @@ ply_boot_client_attach_to_event_loop (ply_boot_client_t *client,
- 
- }
- 
--#ifdef PLY_BOOT_CLIENT_ENABLE_TEST
--
--#include <stdio.h>
--
--#include "ply-event-loop.h"
--#include "ply-boot-client.h"
--
--static void
--on_pinged (ply_event_loop_t *loop)
--{
--  printf ("PING!\n");
--}
--
--static void
--on_ping_failed (ply_event_loop_t *loop)
--{
--  printf ("PING FAILED! %m\n");
--  ply_event_loop_exit (loop, 1);
--}
--
--static void
--on_update (ply_event_loop_t *loop)
--{
--  printf ("UPDATE!\n");
--}
--
--static void
--on_update_failed (ply_event_loop_t *loop)
--{
--  printf ("UPDATE FAILED! %m\n");
--  ply_event_loop_exit (loop, 1);
--}
--
--static void
--on_newroot (ply_event_loop_t *loop)
--{
--  printf ("NEWROOT!\n");
--}
--
--static void
--on_system_initialized (ply_event_loop_t *loop)
--{
--  printf ("SYSTEM INITIALIZED!\n");
--}
--
--static void
--on_system_initialized_failed (ply_event_loop_t *loop)
--{
--  printf ("SYSTEM INITIALIZATION REQUEST FAILED!\n");
--  ply_event_loop_exit (loop, 1);
--}
--
--static void
--on_quit (ply_event_loop_t *loop)
--{
--  printf ("QUIT!\n");
--  ply_event_loop_exit (loop, 0);
--}
--
--static void
--on_quit_failed (ply_event_loop_t *loop)
--{
--  printf ("QUIT FAILED! %m\n");
--  ply_event_loop_exit (loop, 2);
--}
--
--static void
--on_disconnect (ply_event_loop_t *loop)
--{
--  printf ("DISCONNECT!\n");
--  ply_event_loop_exit (loop, 1);
--}
--
--int
--main (int    argc,
--      char **argv)
--{
--  ply_event_loop_t *loop;
--  ply_boot_client_t *client;
--  int exit_code;
--
--  exit_code = 0;
--
--  loop = ply_event_loop_new ();
--
--  client = ply_boot_client_new ();
--
--  if (!ply_boot_client_connect (client, 
--                                (ply_boot_client_disconnect_handler_t) on_disconnect,
--                                loop))
--    {
--      perror ("could not start boot client");
--      return errno;
--    }
--
--  ply_boot_client_attach_to_event_loop (client, loop);
--  ply_boot_client_ping_daemon (client, 
--                               (ply_boot_client_response_handler_t) on_pinged,
--                               (ply_boot_client_response_handler_t) on_ping_failed,
--                               loop);
--
--  ply_boot_client_update_daemon (client, 
--                                 "loading",
--                                 (ply_boot_client_response_handler_t) on_update,
--                                 (ply_boot_client_response_handler_t) on_update_failed,
--                                 loop);
--
--  ply_boot_client_update_daemon (client, 
--                                 "loading more",
--                                 (ply_boot_client_response_handler_t) on_update,
--                                 (ply_boot_client_response_handler_t) on_update_failed,
--                                 loop);
--
--  ply_boot_client_tell_daemon_system_is_initialized (client, 
--                                       (ply_boot_client_response_handler_t) 
--                                       on_system_initialized,
--                                       (ply_boot_client_response_handler_t) 
--                                       on_system_initialized_failed,
--                                       loop);
--
--  ply_boot_client_tell_daemon_to_quit (client, 
--                                       (ply_boot_client_response_handler_t) on_quit,
--                                       (ply_boot_client_response_handler_t) on_quit_failed,
--                                       loop);
--
--  exit_code = ply_event_loop_run (loop);
--
--  ply_boot_client_free (client);
--
--  return exit_code;
--}
--
--#endif /* PLY_BOOT_CLIENT_ENABLE_TEST */
- /* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
-diff --git a/src/client/plymouth.c b/src/client/plymouth.c
-index e00208d..b22e90c 100644
---- a/src/client/plymouth.c
-+++ b/src/client/plymouth.c
-@@ -1173,7 +1173,8 @@ main (int    argc,
- 
-   if (get_kernel_command_line (&state))
-     {
--      if (strstr (state.kernel_command_line, "plymouth:debug") != NULL
-+      if ((strstr (state.kernel_command_line, "plymouth.debug") != NULL ||
-+           strstr (state.kernel_command_line, "plymouth:debug") != NULL)
-           && !ply_is_tracing ())
-         ply_toggle_tracing ();
-     }
-diff --git a/src/client/tests/Makefile.am b/src/client/tests/Makefile.am
-deleted file mode 100644
-index c6dbfdb..0000000
---- a/src/client/tests/Makefile.am
-+++ /dev/null
-@@ -1,10 +0,0 @@
--INCLUDES =                                                                    \
--           -I$(top_srcdir)                                                    \
--           -I$(srcdir)/..                                                     \
--           -I$(srcdir)/../..                                                  \
--           -I$(srcdir)
--TESTS = 
--
--noinst_PROGRAMS = $(TESTS)
--
--MAINTAINERCLEANFILES = Makefile.in
-diff --git a/src/libply-splash-core/Makefile.am b/src/libply-splash-core/Makefile.am
-index b289b65..d07d7f1 100644
---- a/src/libply-splash-core/Makefile.am
-+++ b/src/libply-splash-core/Makefile.am
-@@ -1,4 +1,4 @@
--INCLUDES = -I$(top_srcdir)                                                    \
-+AM_CPPFLAGS = -I$(top_srcdir)                                                 \
-            -I$(srcdir)                                                        \
-            -I$(srcdir)/../libply                                              \
-            -I$(srcdir)/../plugins/controls
-@@ -15,33 +15,39 @@ libply_splash_coredir = $(includedir)/plymouth-1/ply-splash-core
- libply_splash_core_HEADERS = \
- 		    ply-boot-splash.h                                         \
- 		    ply-boot-splash-plugin.h                                  \
-+		    ply-device-manager.h                                      \
- 		    ply-keyboard.h                                            \
- 		    ply-pixel-buffer.h                                        \
- 		    ply-pixel-display.h                                       \
- 		    ply-renderer.h                                            \
- 		    ply-renderer-plugin.h                                     \
-+		    ply-seat.h                                                \
- 		    ply-terminal.h                                            \
- 		    ply-text-display.h                                        \
--		    ply-text-progress-bar.h
-+		    ply-text-progress-bar.h                                   \
-+		    ply-text-step-bar.h
- 
--libply_splash_core_la_CFLAGS = $(PLYMOUTH_CFLAGS)                               \
-+libply_splash_core_la_CFLAGS = $(PLYMOUTH_CFLAGS) $(UDEV_CFLAGS)               \
-                              -DPLYMOUTH_BACKGROUND_COLOR=$(background_color)   \
-                        -DPLYMOUTH_BACKGROUND_END_COLOR=$(background_end_color) \
-                        -DPLYMOUTH_BACKGROUND_START_COLOR=$(background_start_color) \
-                        -DPLYMOUTH_PLUGIN_PATH=\"$(PLYMOUTH_PLUGIN_PATH)\"
--libply_splash_core_la_LIBADD = $(PLYMOUTH_LIBS) ../libply/libply.la
-+libply_splash_core_la_LIBADD = $(PLYMOUTH_LIBS) $(UDEV_LIBS) ../libply/libply.la
- libply_splash_core_la_LDFLAGS = -export-symbols-regex '^[^_].*' \
- 		    -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
- 		    -no-undefined
- libply_splash_core_la_SOURCES = \
- 		    $(libply_splash_core_HEADERS)                              \
-+		    ply-device-manager.c                                      \
- 		    ply-keyboard.c                                           \
- 		    ply-pixel-display.c                                      \
- 		    ply-text-display.c                                       \
- 		    ply-text-progress-bar.c                                  \
-+		    ply-text-step-bar.c                                      \
- 		    ply-terminal.c                                           \
- 		    ply-pixel-buffer.c                                       \
- 		    ply-renderer.c                                           \
-+		    ply-seat.c                                               \
- 		    ply-boot-splash.c
- 
- MAINTAINERCLEANFILES = Makefile.in
-diff --git a/src/libply-splash-core/ply-boot-splash.c b/src/libply-splash-core/ply-boot-splash.c
-index 93d9345..160ce45 100644
---- a/src/libply-splash-core/ply-boot-splash.c
-+++ b/src/libply-splash-core/ply-boot-splash.c
-@@ -48,10 +48,6 @@
- #define UPDATES_PER_SECOND 30
- #endif
- 
--#define KEY_CTRL_L ('\100' ^'L')
--#define KEY_CTRL_T ('\100' ^'T')
--#define KEY_CTRL_V ('\100' ^'V')
--
- struct _ply_boot_splash
- {
-   ply_event_loop_t *loop;
-@@ -59,11 +55,9 @@ struct _ply_boot_splash
-   const ply_boot_splash_plugin_interface_t *plugin_interface;
-   ply_boot_splash_plugin_t *plugin;
-   ply_boot_splash_mode_t mode;
--  ply_keyboard_t *keyboard;
-   ply_buffer_t *boot_buffer;
-   ply_trigger_t *idle_trigger;
--  ply_list_t *pixel_displays;
--  ply_list_t *text_displays;
-+  ply_list_t *seats;
- 
-   char *theme_path;
-   char *plugin_dir;
-@@ -100,18 +94,30 @@ ply_boot_splash_new (const char     *theme_path,
-   splash->mode = PLY_BOOT_SPLASH_MODE_INVALID;
- 
-   splash->boot_buffer = boot_buffer;
--  splash->pixel_displays = ply_list_new ();
--  splash->text_displays = ply_list_new ();
-+  splash->seats = ply_list_new ();
- 
-   return splash;
- }
- 
- static void
--refresh_displays (ply_boot_splash_t *splash)
-+detach_from_seat (ply_boot_splash_t *splash,
-+                  ply_seat_t        *seat)
- {
--  ply_list_node_t *node;
-+  ply_keyboard_t *keyboard;
-+  ply_list_t *displays;
-+  ply_list_node_t *node, *next_node;
- 
--  node = ply_list_get_first_node (splash->pixel_displays);
-+  ply_trace ("removing keyboard");
-+  if (splash->plugin_interface->unset_keyboard != NULL)
-+    {
-+      keyboard = ply_seat_get_keyboard (seat);
-+      splash->plugin_interface->unset_keyboard (splash->plugin, keyboard);
-+    }
-+
-+  ply_trace ("removing pixel displays");
-+  displays = ply_seat_get_pixel_displays (seat);
-+
-+  node = ply_list_get_first_node (displays);
-   while (node != NULL)
-     {
-       ply_pixel_display_t *display;
-@@ -119,184 +125,137 @@ refresh_displays (ply_boot_splash_t *splash)
-       unsigned long width, height;
- 
-       display = ply_list_node_get_data (node);
--      next_node = ply_list_get_next_node (splash->pixel_displays, node);
-+      next_node = ply_list_get_next_node (displays, node);
- 
-       width = ply_pixel_display_get_width (display);
-       height = ply_pixel_display_get_height (display);
- 
--      ply_pixel_display_draw_area (display, 0, 0, width, height);
-+      ply_trace ("Removing %lux%lu pixel display", width, height);
-+
-+      if (splash->plugin_interface->remove_pixel_display != NULL)
-+        splash->plugin_interface->remove_pixel_display (splash->plugin, display);
-+
-       node = next_node;
-     }
- 
--  node = ply_list_get_first_node (splash->text_displays);
-+  ply_trace ("removing text displays");
-+  displays = ply_seat_get_text_displays (seat);
-+
-+  node = ply_list_get_first_node (displays);
-   while (node != NULL)
-     {
-       ply_text_display_t *display;
--      ply_list_node_t *next_node;
-       int number_of_columns, number_of_rows;
- 
-       display = ply_list_node_get_data (node);
--      next_node = ply_list_get_next_node (splash->text_displays, node);
-+      next_node = ply_list_get_next_node (displays, node);
- 
-       number_of_columns = ply_text_display_get_number_of_columns (display);
-       number_of_rows = ply_text_display_get_number_of_rows (display);
- 
--      ply_text_display_draw_area (display, 0, 0,
--                                  number_of_columns,
--                                  number_of_rows);
-+      ply_trace ("Removing %dx%d text display", number_of_columns, number_of_rows);
-+
-+      if (splash->plugin_interface->remove_text_display != NULL)
-+        splash->plugin_interface->remove_text_display (splash->plugin, display);
-+
-       node = next_node;
-     }
- }
- 
--static ply_terminal_t *
--find_local_console_terminal (ply_boot_splash_t *splash)
-+static void
-+attach_to_seat (ply_boot_splash_t *splash,
-+                ply_seat_t        *seat)
- {
--  ply_list_node_t *node;
--  node = ply_list_get_first_node (splash->text_displays);
-+  ply_keyboard_t *keyboard;
-+  ply_list_t *displays;
-+  ply_list_node_t *node, *next_node;
- 
--  while (node != NULL)
-+  if (splash->plugin_interface->set_keyboard != NULL)
-     {
--      ply_text_display_t *display;
--      ply_terminal_t *terminal;
--      ply_list_node_t *next_node;
-+      keyboard = ply_seat_get_keyboard (seat);
-+      splash->plugin_interface->set_keyboard (splash->plugin, keyboard);
-+    }
- 
--      display = ply_list_node_get_data (node);
--      next_node = ply_list_get_next_node (splash->text_displays, node);
-+  if (splash->plugin_interface->add_pixel_display != NULL)
-+    {
-+      displays = ply_seat_get_pixel_displays (seat);
- 
--      terminal = ply_text_display_get_terminal (display);
-+      ply_trace ("adding pixel displays");
-+      node = ply_list_get_first_node (displays);
-+      while (node != NULL)
-+        {
-+          ply_pixel_display_t *display;
-+          ply_list_node_t *next_node;
-+          unsigned long width, height;
- 
--      if (terminal != NULL && ply_terminal_is_vt (terminal))
--        return terminal;
-+          display = ply_list_node_get_data (node);
-+          next_node = ply_list_get_next_node (displays, node);
- 
--      node = next_node;
--    }
-+          width = ply_pixel_display_get_width (display);
-+          height = ply_pixel_display_get_height (display);
- 
--  return NULL;
--}
-+          ply_trace ("Adding %lux%lu pixel display", width, height);
- 
--static void
--on_keyboard_input (ply_boot_splash_t *splash,
--                   const char        *keyboard_input,
--                   size_t             character_size)
--{
--  wchar_t key;
-+          splash->plugin_interface->add_pixel_display (splash->plugin, display);
- 
--  if ((ssize_t) mbrtowc (&key, keyboard_input, character_size, NULL) > 0)
--    {
--      switch (key)
--        {
--          case KEY_CTRL_L:
--            refresh_displays (splash);
--          return;
--
--          case KEY_CTRL_T:
--            ply_trace ("toggle text mode!");
--            splash->should_force_text_mode = !splash->should_force_text_mode;
--
--            if (ply_list_get_length (splash->pixel_displays) >= 1)
--              {
--                ply_terminal_t *terminal;
--
--                terminal = find_local_console_terminal (splash);
--
--                if (terminal != NULL)
--                  {
--                    if (splash->should_force_text_mode)
--                      {
--                        ply_terminal_set_mode (terminal, PLY_TERMINAL_MODE_TEXT);
--                        ply_terminal_ignore_mode_changes (terminal, true);
--                      }
--                    else
--                      ply_terminal_ignore_mode_changes (terminal, false);
--                  }
--              }
--            ply_trace ("text mode toggled!");
--          return;
--
--          case KEY_CTRL_V:
--            ply_trace ("toggle verbose mode!");
--            ply_toggle_tracing ();
--            ply_trace ("verbose mode toggled!");
--          return;
-+          node = next_node;
-         }
-     }
--}
- 
--void
--ply_boot_splash_set_keyboard (ply_boot_splash_t *splash,
--                              ply_keyboard_t    *keyboard)
--{
--  splash->keyboard = keyboard;
-+  if (splash->plugin_interface->add_text_display != NULL)
-+    {
-+      displays = ply_seat_get_text_displays (seat);
- 
--  ply_keyboard_add_input_handler (keyboard,
--                                  (ply_keyboard_input_handler_t)
--                                  on_keyboard_input, splash);
-+      ply_trace ("adding text displays");
-+      node = ply_list_get_first_node (displays);
-+      while (node != NULL)
-+        {
-+          ply_text_display_t *display;
-+          int number_of_columns, number_of_rows;
- 
--  if (splash->plugin_interface->set_keyboard == NULL)
--    return;
-+          display = ply_list_node_get_data (node);
-+          next_node = ply_list_get_next_node (displays, node);
- 
--  splash->plugin_interface->set_keyboard (splash->plugin, keyboard);
--}
-+          number_of_columns = ply_text_display_get_number_of_columns (display);
-+          number_of_rows = ply_text_display_get_number_of_rows (display);
- 
--void
--ply_boot_splash_unset_keyboard (ply_boot_splash_t *splash)
--{
--  ply_keyboard_remove_input_handler (splash->keyboard,
--                                     (ply_keyboard_input_handler_t)
--                                     on_keyboard_input);
-+          ply_trace ("Adding %dx%d text display", number_of_columns, number_of_rows);
- 
--  if (splash->plugin_interface->set_keyboard == NULL)
--    return;
-+          splash->plugin_interface->add_text_display (splash->plugin, display);
- 
--  splash->plugin_interface->unset_keyboard (splash->plugin, splash->keyboard);
-+          node = next_node;
-+        }
-+    }
- }
- 
- void
--ply_boot_splash_add_pixel_display (ply_boot_splash_t   *splash,
--                                   ply_pixel_display_t *display)
-+ply_boot_splash_attach_to_seat (ply_boot_splash_t *splash,
-+                                ply_seat_t        *seat)
- {
--  ply_list_append_data (splash->pixel_displays, display);
--
--  if (splash->plugin_interface->add_pixel_display == NULL)
--    return;
--
--  splash->plugin_interface->add_pixel_display (splash->plugin, display);
--}
-+  ply_list_node_t *node;
- 
--void
--ply_boot_splash_remove_pixel_display (ply_boot_splash_t   *splash,
--                                      ply_pixel_display_t *display)
--{
--  ply_list_remove_data (splash->pixel_displays, display);
-+  node = ply_list_find_node (splash->seats, seat);
- 
--  if (splash->plugin_interface->remove_pixel_display == NULL)
-+  if (node != NULL)
-     return;
- 
--  splash->plugin_interface->remove_pixel_display (splash->plugin, display);
-+  ply_list_append_data (splash->seats, seat);
-+  attach_to_seat (splash, seat);
- }
- 
- void
--ply_boot_splash_add_text_display (ply_boot_splash_t   *splash,
--                                  ply_text_display_t *display)
-+ply_boot_splash_detach_from_seat (ply_boot_splash_t *splash,
-+                                  ply_seat_t        *seat)
- {
--  ply_list_append_data (splash->text_displays, display);
-+  ply_list_node_t *node;
- 
--  if (splash->plugin_interface->add_text_display == NULL)
--    return;
-+  node = ply_list_find_node (splash->seats, seat);
- 
--  splash->plugin_interface->add_text_display (splash->plugin, display);
--}
--
--void
--ply_boot_splash_remove_text_display (ply_boot_splash_t   *splash,
--                                     ply_text_display_t *display)
--{
--  ply_list_remove_data (splash->text_displays, display);
--
--  if (splash->plugin_interface->remove_pixel_display == NULL)
-+  if (node == NULL)
-     return;
- 
--  splash->plugin_interface->remove_text_display (splash->plugin, display);
-+  ply_list_remove_data (splash->seats, seat);
-+  detach_from_seat (splash, seat);
- }
- 
- bool
-@@ -432,56 +391,24 @@ ply_boot_splash_unload (ply_boot_splash_t *splash)
- }
- 
- static void
--remove_displays (ply_boot_splash_t *splash)
-+detach_from_seats (ply_boot_splash_t *splash)
- {
--  ply_list_node_t *node, *next_node;
-+  ply_list_node_t *node;
- 
--  ply_trace ("removing pixel displays");
-+  ply_trace ("detaching from seats");
- 
--  node = ply_list_get_first_node (splash->pixel_displays);
-+  node = ply_list_get_first_node (splash->seats);
-   while (node != NULL)
-     {
--      ply_pixel_display_t *display;
-+      ply_seat_t *seat;
-       ply_list_node_t *next_node;
--      unsigned long width, height;
- 
--      display = ply_list_node_get_data (node);
--      next_node = ply_list_get_next_node (splash->pixel_displays, node);
-+      seat = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (splash->seats, node);
- 
--      width = ply_pixel_display_get_width (display);
--      height = ply_pixel_display_get_height (display);
-+      detach_from_seat (splash, seat);
- 
--      ply_trace ("Removing %lux%lu pixel display", width, height);
--
--      if (splash->plugin_interface->remove_pixel_display != NULL)
--        splash->plugin_interface->remove_pixel_display (splash->plugin, display);
--
--      ply_trace ("Removing node");
--      ply_list_remove_node (splash->pixel_displays, node);
--
--      node = next_node;
--    }
--
--  ply_trace ("removing text displays");
--  node = ply_list_get_first_node (splash->text_displays);
--  while (node != NULL)
--    {
--      ply_text_display_t *display;
--      int number_of_columns, number_of_rows;
--
--      display = ply_list_node_get_data (node);
--      next_node = ply_list_get_next_node (splash->text_displays, node);
--
--      number_of_columns = ply_text_display_get_number_of_columns (display);
--      number_of_rows = ply_text_display_get_number_of_rows (display);
--
--      ply_trace ("Removing %dx%d text display", number_of_columns, number_of_rows);
--
--      if (splash->plugin_interface->remove_text_display != NULL)
--        splash->plugin_interface->remove_text_display (splash->plugin, display);
--
--      ply_trace ("Removing node");
--      ply_list_remove_node (splash->text_displays, node);
-+      ply_list_remove_node (splash->seats, node);
- 
-       node = next_node;
-     }
-@@ -508,9 +435,8 @@ ply_boot_splash_free (ply_boot_splash_t *splash)
-                                              splash);
-     }
- 
--  remove_displays (splash);
--  ply_list_free (splash->pixel_displays);
--  ply_list_free (splash->text_displays);
-+  detach_from_seats (splash);
-+  ply_list_free (splash->seats);
- 
-   if (splash->module_handle != NULL)
-     ply_boot_splash_unload (splash);
-@@ -676,16 +602,6 @@ ply_boot_splash_hide (ply_boot_splash_t *splash)
-   splash->plugin_interface->hide_splash_screen (splash->plugin,
-                                                 splash->loop);
- 
--  if (ply_list_get_length (splash->pixel_displays) >= 1)
--    {
--      ply_terminal_t *terminal;
--
--      terminal = find_local_console_terminal (splash);
--
--      if (terminal != NULL)
--        ply_terminal_set_mode (terminal, PLY_TERMINAL_MODE_TEXT);
--    }
--
-   splash->mode = PLY_BOOT_SPLASH_MODE_INVALID;
- 
-   if (splash->loop != NULL)
-@@ -820,148 +736,4 @@ ply_boot_splash_become_idle (ply_boot_splash_t                  *splash,
-   splash->plugin_interface->become_idle (splash->plugin, splash->idle_trigger);
- }
- 
--#ifdef PLY_BOOT_SPLASH_ENABLE_TEST
--
--#include <stdio.h>
--
--#include "ply-event-loop.h"
--#include "ply-boot-splash.h"
--
--typedef struct test_state test_state_t;
--struct test_state {
--  ply_event_loop_t *loop;
--  ply_boot_splash_t *splash;
--  ply_buffer_t *buffer;
--};
--
--static void
--on_timeout (ply_boot_splash_t *splash)
--{
--  ply_boot_splash_update_status (splash, "foo");
--  ply_event_loop_watch_for_timeout (splash->loop, 
--                                    5.0,
--                                   (ply_event_loop_timeout_handler_t)
--                                   on_timeout,
--                                   splash);
--}
--
--static void
--on_quit (test_state_t *state)
--{
--    ply_boot_splash_hide (state->splash);
--    ply_event_loop_exit (state->loop, 0);
--}
--
--static void
--add_displays_to_splash_from_renderer (test_state_t   *state,
--                                      ply_renderer_t *renderer)
--{
--  ply_list_t *heads;
--  ply_list_node_t *node;
--
--  heads = ply_renderer_get_heads (renderer);
--
--  node = ply_list_get_first_node (heads);
--  while (node != NULL)
--    {
--      ply_list_node_t *next_node;
--      ply_renderer_head_t *head;
--      ply_pixel_display_t *display;
--
--      head = ply_list_node_get_data (node);
--      next_node = ply_list_get_next_node (heads, node);
--
--      display = ply_pixel_display_new (renderer, head);
--
--      ply_boot_splash_add_pixel_display (state->splash, display);
--
--      node = next_node;
--    }
--}
--
--int
--main (int    argc,
--      char **argv)
--{
--  int exit_code;
--  test_state_t state;
--  char *tty_name;
--  const char *theme_path;
--  ply_text_display_t *text_display;
--  ply_renderer_t *renderer;
--  ply_terminal_t *terminal;
--  ply_keyboard_t *keyboard;
--
--  exit_code = 0;
--
--  state.loop = ply_event_loop_new ();
--
--  if (argc > 1)
--    theme_path = argv[1];
--  else
--    theme_path = PLYMOUTH_THEME_PATH "/fade-in/fade-in.plymouth";
--
--  if (argc > 2)
--    asprintf(&tty_name, "tty%s", argv[2]);
--  else
--    tty_name = strdup("tty0");
--
--  terminal = ply_terminal_new (tty_name);
--
--  if (!ply_terminal_open (terminal))
--    {
--      perror ("could not open tty");
--      return errno;
--    }
--
--  renderer = ply_renderer_new (NULL, terminal);
--  free(tty_name);
--
--  if (!ply_renderer_open (renderer))
--    {
--      perror ("could not open renderer /dev/fb");
--      ply_renderer_free (renderer);
--      return errno;
--    }
--
--  keyboard = ply_keyboard_new_for_renderer (renderer);
--  ply_keyboard_add_escape_handler (keyboard,
--                                   (ply_keyboard_escape_handler_t) on_quit, &state);
--
--  state.buffer = ply_buffer_new ();
--  state.splash = ply_boot_splash_new (theme_path, PLYMOUTH_PLUGIN_PATH, state.buffer);
--
--  if (!ply_boot_splash_load (state.splash))
--    {
--      perror ("could not load splash screen");
--      return errno;
--    }
--
--  ply_boot_splash_set_keyboard (state.splash, keyboard);
--  add_displays_to_splash_from_renderer (&state, renderer);
--
--  text_display = ply_text_display_new (terminal);
--  ply_boot_splash_add_text_display (state.splash, text_display);
--
--  ply_boot_splash_attach_to_event_loop (state.splash, state.loop);
--
--  if (!ply_boot_splash_show (state.splash, PLY_BOOT_SPLASH_MODE_BOOT_UP))
--    {
--      perror ("could not show splash screen");
--      return errno;
--    }
--
--  ply_event_loop_watch_for_timeout (state.loop, 
--                                    1.0,
--                                   (ply_event_loop_timeout_handler_t)
--                                   on_timeout,
--                                   state.splash);
--  exit_code = ply_event_loop_run (state.loop);
--  ply_boot_splash_free (state.splash);
--  ply_buffer_free (state.buffer);
--
--  return exit_code;
--}
--
--#endif /* PLY_BOOT_SPLASH_ENABLE_TEST */
- /* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
-diff --git a/src/libply-splash-core/ply-boot-splash.h b/src/libply-splash-core/ply-boot-splash.h
-index a79e939..335039b 100644
---- a/src/libply-splash-core/ply-boot-splash.h
-+++ b/src/libply-splash-core/ply-boot-splash.h
-@@ -33,10 +33,12 @@
- #include "ply-pixel-display.h"
- #include "ply-text-display.h"
- #include "ply-progress.h"
-+#include "ply-seat.h"
- 
- #include "ply-boot-splash-plugin.h"
- 
- typedef struct _ply_boot_splash ply_boot_splash_t;
-+typedef struct _ply_seat ply_seat_t;
- 
- typedef void (* ply_boot_splash_on_idle_handler_t) (void *user_data);
- 
-@@ -48,17 +50,10 @@ ply_boot_splash_t *ply_boot_splash_new (const char   *  theme_path,
- bool ply_boot_splash_load (ply_boot_splash_t *splash);
- bool ply_boot_splash_load_built_in (ply_boot_splash_t *splash);
- void ply_boot_splash_unload (ply_boot_splash_t *splash);
--void ply_boot_splash_set_keyboard (ply_boot_splash_t *splash,
--                                   ply_keyboard_t    *keyboard);
--void ply_boot_splash_unset_keyboard (ply_boot_splash_t *splash);
--void ply_boot_splash_add_pixel_display (ply_boot_splash_t   *splash,
--                                        ply_pixel_display_t *display);
--void ply_boot_splash_remove_pixel_display (ply_boot_splash_t   *splash,
--                                           ply_pixel_display_t *display);
--void ply_boot_splash_add_text_display (ply_boot_splash_t   *splash,
--                                        ply_text_display_t *display);
--void ply_boot_splash_remove_text_display (ply_boot_splash_t   *splash,
--                                           ply_text_display_t *display);
-+void ply_boot_splash_attach_to_seat (ply_boot_splash_t *splash,
-+                                     ply_seat_t        *seat);
-+void ply_boot_splash_detach_from_seat (ply_boot_splash_t *splash,
-+                                       ply_seat_t        *seat);
- void ply_boot_splash_free (ply_boot_splash_t *splash);
- bool ply_boot_splash_show (ply_boot_splash_t *splash,
-                            ply_boot_splash_mode_t mode);
-diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
-new file mode 100644
-index 0000000..dbc203d
---- /dev/null
-+++ b/src/libply-splash-core/ply-device-manager.c
-@@ -0,0 +1,935 @@
-+/* ply-device-manager.c - device manager
-+ *
-+ * Copyright (C) 2013 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ */
-+#include "config.h"
-+#include "ply-device-manager.h"
-+
-+#include <assert.h>
-+#include <fcntl.h>
-+#include <stdbool.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <sys/inotify.h>
-+#include <sys/stat.h>
-+#include <sys/types.h>
-+
-+#include <libudev.h>
-+
-+#include "ply-logger.h"
-+#include "ply-event-loop.h"
-+#include "ply-hashtable.h"
-+#include "ply-list.h"
-+#include "ply-utils.h"
-+
-+#define SUBSYSTEM_DRM "drm"
-+#define SUBSYSTEM_FRAME_BUFFER "graphics"
-+
-+static void create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
-+                                                        const char           *device_path,
-+                                                        ply_terminal_t       *terminal,
-+                                                        ply_renderer_type_t   renderer_type);
-+struct _ply_device_manager
-+{
-+  ply_device_manager_flags_t  flags;
-+  ply_event_loop_t           *loop;
-+  ply_hashtable_t            *terminals;
-+  ply_terminal_t             *local_console_terminal;
-+  ply_seat_t                 *local_console_seat;
-+  ply_list_t                 *seats;
-+  struct udev                *udev_context;
-+  struct udev_queue          *udev_queue;
-+  int                         udev_queue_fd;
-+  ply_fd_watch_t             *udev_queue_fd_watch;
-+  struct udev_monitor        *udev_monitor;
-+
-+  ply_seat_added_handler_t    seat_added_handler;
-+  ply_seat_removed_handler_t  seat_removed_handler;
-+  void                       *seat_event_handler_data;
-+};
-+
-+static void
-+detach_from_event_loop (ply_device_manager_t *manager)
-+{
-+  assert (manager != NULL);
-+
-+  manager->loop = NULL;
-+}
-+
-+static void
-+attach_to_event_loop (ply_device_manager_t *manager,
-+                      ply_event_loop_t     *loop)
-+{
-+  assert (manager != NULL);
-+  assert (loop != NULL);
-+  assert (manager->loop == NULL);
-+
-+  manager->loop = loop;
-+
-+  ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t)
-+                                 detach_from_event_loop,
-+                                 manager);
-+}
-+
-+static bool
-+device_is_for_local_console (ply_device_manager_t *manager,
-+                             struct udev_device   *device)
-+{
-+  const char *device_path;
-+  struct udev_device *bus_device;
-+  char *bus_device_path;
-+  const char *boot_vga;
-+  bool for_local_console;
-+
-+  /* Look at the associated bus device to see if this card is the
-+   * card the kernel is using for its console. */
-+  device_path = udev_device_get_syspath (device);
-+  asprintf (&bus_device_path, "%s/device", device_path);
-+  bus_device = udev_device_new_from_syspath (manager->udev_context, bus_device_path);
-+
-+  boot_vga = udev_device_get_sysattr_value (bus_device, "boot_vga");
-+  free (bus_device_path);
-+
-+  if (boot_vga != NULL && strcmp (boot_vga, "1") == 0)
-+    for_local_console = true;
-+  else
-+    for_local_console = false;
-+
-+  return for_local_console;
-+}
-+
-+static bool
-+fb_device_has_drm_device (ply_device_manager_t *manager,
-+                          struct udev_device   *fb_device)
-+{
-+  struct udev_enumerate *card_matches;
-+  struct udev_list_entry *card_entry;
-+  const char *id_path;
-+  bool has_drm_device = false;
-+
-+  /* We want to see if the framebuffer is associated with a DRM-capable
-+   * graphics card, if it is, we'll use the DRM device */
-+  card_matches = udev_enumerate_new (manager->udev_context);
-+  udev_enumerate_add_match_is_initialized(card_matches);
-+  udev_enumerate_add_match_parent (card_matches, udev_device_get_parent (fb_device));
-+  udev_enumerate_add_match_subsystem (card_matches, "drm");
-+  id_path = udev_device_get_property_value (fb_device, "ID_PATH");
-+  udev_enumerate_add_match_property (card_matches, "ID_PATH", id_path);
-+
-+  ply_trace ("trying to find associated drm node for fb device (path: %s)", id_path);
-+
-+  udev_enumerate_scan_devices (card_matches);
-+
-+  /* there should only ever be at most one match so we don't iterate through
-+   * the list, but just look at the first entry */
-+  card_entry = udev_enumerate_get_list_entry (card_matches);
-+
-+  if (card_entry != NULL)
-+    {
-+      struct udev_device *card_device = NULL;
-+      const char *card_node;
-+      const char *card_path;
-+
-+      card_path = udev_list_entry_get_name (card_entry);
-+      card_device = udev_device_new_from_syspath (manager->udev_context, card_path);
-+      card_node = udev_device_get_devnode (card_device);
-+      if (card_node != NULL)
-+        has_drm_device = true;
-+      else
-+        ply_trace ("no card node!");
-+
-+      udev_device_unref (card_device);
-+    }
-+  else
-+    {
-+      ply_trace ("no card entry!");
-+    }
-+
-+  udev_enumerate_unref (card_matches);
-+  return has_drm_device;
-+}
-+
-+static void
-+create_seat_for_udev_device (ply_device_manager_t *manager,
-+                             struct udev_device   *device)
-+{
-+  bool for_local_console;
-+  const char *device_path;
-+  ply_terminal_t *terminal = NULL;
-+
-+  for_local_console = device_is_for_local_console (manager, device);
-+
-+  ply_trace ("device is for local console: %s", for_local_console? "yes" : "no");
-+
-+  if (for_local_console)
-+    terminal = manager->local_console_terminal;
-+
-+  device_path = udev_device_get_devnode (device);
-+
-+  if (device_path != NULL)
-+    {
-+      const char *subsystem;
-+      ply_renderer_type_t renderer_type = PLY_RENDERER_TYPE_NONE;
-+
-+      subsystem = udev_device_get_subsystem (device);
-+      ply_trace ("device subsystem is %s", subsystem);
-+
-+      if (subsystem != NULL && strcmp (subsystem, SUBSYSTEM_DRM) == 0)
-+        {
-+          ply_trace ("found DRM device %s", device_path);
-+          renderer_type = PLY_RENDERER_TYPE_DRM;
-+        }
-+      else if (strcmp (subsystem, SUBSYSTEM_FRAME_BUFFER) == 0)
-+        {
-+          ply_trace ("found frame buffer device %s", device_path);
-+          if (!fb_device_has_drm_device (manager, device))
-+            {
-+              renderer_type = PLY_RENDERER_TYPE_FRAME_BUFFER;
-+            }
-+          else
-+            {
-+              ply_trace ("ignoring, since there's a DRM device associated with it");
-+            }
-+        }
-+
-+      if (renderer_type != PLY_RENDERER_TYPE_NONE)
-+        create_seat_for_terminal_and_renderer_type (manager,
-+                                                    device_path,
-+                                                    terminal,
-+                                                    renderer_type);
-+    }
-+}
-+
-+static void
-+free_seat_from_device_path (ply_device_manager_t *manager,
-+                            const char           *device_path)
-+{
-+  ply_list_node_t *node;
-+
-+  node = ply_list_get_first_node (manager->seats);
-+  while (node != NULL)
-+    {
-+      ply_seat_t *seat;
-+      ply_renderer_t *renderer;
-+      ply_list_node_t *next_node;
-+      const char *renderer_device_path;
-+
-+      seat = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (manager->seats, node);
-+      renderer = ply_seat_get_renderer (seat);
-+
-+      if (renderer != NULL)
-+        {
-+          renderer_device_path = ply_renderer_get_device_name (renderer);
-+
-+          if (renderer_device_path != NULL)
-+            {
-+              if (strcmp (device_path, renderer_device_path) == 0)
-+                {
-+                  ply_trace ("removing seat associated with %s", device_path);
-+
-+                  if (manager->seat_removed_handler != NULL)
-+                    manager->seat_removed_handler (manager->seat_event_handler_data, seat);
-+
-+                  ply_seat_free (seat);
-+                  ply_list_remove_node (manager->seats, node);
-+                  break;
-+                }
-+            }
-+        }
-+
-+      node = next_node;
-+    }
-+}
-+
-+static void
-+free_seat_for_udev_device (ply_device_manager_t *manager,
-+                           struct udev_device   *device)
-+{
-+  const char *device_path;
-+
-+  device_path = udev_device_get_devnode (device);
-+
-+  if (device_path != NULL)
-+    free_seat_from_device_path (manager, device_path);
-+}
-+
-+static bool
-+create_seats_for_subsystem (ply_device_manager_t *manager,
-+                            const char           *subsystem)
-+{
-+  struct udev_enumerate *matches;
-+  struct udev_list_entry *entry;
-+  bool found_device = false;
-+
-+  ply_trace ("creating seats for %s devices",
-+             strcmp (subsystem, SUBSYSTEM_FRAME_BUFFER) == 0?
-+             "frame buffer":
-+             subsystem);
-+
-+  matches = udev_enumerate_new (manager->udev_context);
-+  udev_enumerate_add_match_subsystem (matches, subsystem);
-+  udev_enumerate_scan_devices (matches);
-+
-+  udev_list_entry_foreach (entry, udev_enumerate_get_list_entry (matches))
-+    {
-+      struct udev_device *device = NULL;
-+      const char *path;
-+
-+      path = udev_list_entry_get_name (entry);
-+
-+      if (path == NULL)
-+        {
-+          ply_trace ("path was null!");
-+          continue;
-+        }
-+
-+      ply_trace ("found device %s", path);
-+
-+      device = udev_device_new_from_syspath (manager->udev_context, path);
-+
-+      /* if device isn't fully initialized, we'll get an add event later
-+       */
-+      if (udev_device_get_is_initialized (device))
-+        {
-+          ply_trace ("device is initialized");
-+
-+          /* We only care about devices assigned to a (any) seat. Floating
-+           * devices should be ignored.
-+           */
-+          if (udev_device_has_tag (device, "seat"))
-+            {
-+              const char *node;
-+              node = udev_device_get_devnode (device);
-+              if (node != NULL)
-+                {
-+                  ply_trace ("found node %s", node);
-+                  found_device = true;
-+                  create_seat_for_udev_device (manager, device);
-+                }
-+            }
-+          else
-+            {
-+              ply_trace ("device doesn't have a seat tag");
-+            }
-+        }
-+      else
-+        {
-+          ply_trace ("it's not initialized");
-+        }
-+
-+      udev_device_unref (device);
-+    }
-+
-+  udev_enumerate_unref (matches);
-+
-+  return found_device;
-+}
-+
-+static void
-+on_udev_event (ply_device_manager_t *manager)
-+{
-+  struct udev_device *device;
-+  const char *action;
-+
-+  device = udev_monitor_receive_device (manager->udev_monitor);
-+  if (device == NULL)
-+    return;
-+
-+  action = udev_device_get_action (device);
-+
-+  ply_trace ("got %s event for device %s", action, udev_device_get_sysname (device));
-+
-+  if (action == NULL)
-+    return;
-+
-+  if (strcmp (action, "add") == 0)
-+    {
-+      const char *subsystem;
-+      bool coldplug_complete = manager->udev_queue_fd_watch == NULL;
-+
-+      subsystem = udev_device_get_subsystem (device);
-+
-+      if (strcmp (subsystem, SUBSYSTEM_DRM) == 0 ||
-+          coldplug_complete)
-+        {
-+          create_seat_for_udev_device (manager, device);
-+        }
-+      else
-+        {
-+          ply_trace ("ignoring since we only handle subsystem %s devices after coldplug completes", subsystem);
-+        }
-+    }
-+  else if (strcmp (action, "remove") == 0)
-+    {
-+      free_seat_for_udev_device (manager, device);
-+    }
-+
-+  udev_device_unref (device);
-+}
-+
-+static void
-+watch_for_udev_events (ply_device_manager_t *manager)
-+{
-+  int fd;
-+  assert (manager != NULL);
-+  assert (manager->udev_monitor == NULL);
-+
-+  ply_trace ("watching for udev graphics device add and remove events");
-+
-+  manager->udev_monitor = udev_monitor_new_from_netlink (manager->udev_context, "udev");
-+
-+  udev_monitor_filter_add_match_subsystem_devtype (manager->udev_monitor, SUBSYSTEM_DRM, NULL);
-+  udev_monitor_filter_add_match_subsystem_devtype (manager->udev_monitor, SUBSYSTEM_FRAME_BUFFER, NULL);
-+  udev_monitor_filter_add_match_tag (manager->udev_monitor, "seat");
-+  udev_monitor_enable_receiving (manager->udev_monitor);
-+
-+  fd = udev_monitor_get_fd (manager->udev_monitor);
-+  ply_event_loop_watch_fd (manager->loop,
-+                           fd,
-+                           PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
-+                           (ply_event_handler_t)
-+                           on_udev_event,
-+                           NULL,
-+                           manager);
-+}
-+
-+static void
-+free_seats (ply_device_manager_t *manager)
-+{
-+  ply_list_node_t *node;
-+
-+  ply_trace ("removing seats");
-+  node = ply_list_get_first_node (manager->seats);
-+  while (node != NULL)
-+    {
-+      ply_seat_t *seat;
-+      ply_list_node_t *next_node;
-+
-+      seat = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (manager->seats, node);
-+
-+      if (manager->seat_removed_handler != NULL)
-+        manager->seat_removed_handler (manager->seat_event_handler_data, seat);
-+
-+      ply_seat_free (seat);
-+      ply_list_remove_node (manager->seats, node);
-+
-+      node = next_node;
-+    }
-+}
-+
-+static void
-+free_terminal (char                 *device,
-+               ply_terminal_t       *terminal,
-+               ply_device_manager_t *manager)
-+{
-+  ply_hashtable_remove (manager->terminals, device);
-+
-+  ply_terminal_close (terminal);
-+  ply_terminal_free (terminal);
-+}
-+
-+static void
-+free_terminals (ply_device_manager_t *manager)
-+{
-+  ply_hashtable_foreach (manager->terminals,
-+                         (ply_hashtable_foreach_func_t *)
-+                         free_terminal,
-+                         manager);
-+}
-+
-+static ply_terminal_t *
-+get_terminal (ply_device_manager_t *manager,
-+              const char           *device_name)
-+{
-+  char *full_name = NULL;
-+  ply_terminal_t *terminal;
-+
-+  if (strncmp (device_name, "/dev/", strlen ("/dev/")) == 0)
-+    full_name = strdup (device_name);
-+  else
-+    asprintf (&full_name, "/dev/%s", device_name);
-+
-+  if (strcmp (full_name, "/dev/tty0") == 0 ||
-+      strcmp (full_name, "/dev/tty") == 0 ||
-+      strcmp (full_name, ply_terminal_get_name (manager->local_console_terminal)) == 0)
-+    {
-+      terminal = manager->local_console_terminal;
-+      goto done;
-+    }
-+
-+  terminal = ply_hashtable_lookup (manager->terminals, full_name);
-+
-+  if (terminal == NULL)
-+    {
-+      terminal = ply_terminal_new (full_name);
-+
-+      ply_hashtable_insert (manager->terminals,
-+                            (void *) ply_terminal_get_name (terminal),
-+                            terminal);
-+    }
-+
-+done:
-+  free (full_name);
-+  return terminal;
-+}
-+
-+ply_device_manager_t *
-+ply_device_manager_new (const char                 *default_tty,
-+                        ply_device_manager_flags_t  flags)
-+{
-+  ply_device_manager_t *manager;
-+
-+  manager = calloc (1, sizeof (ply_device_manager_t));
-+  manager->loop = NULL;
-+  manager->terminals = ply_hashtable_new (ply_hashtable_string_hash, ply_hashtable_string_compare);
-+  manager->local_console_terminal = ply_terminal_new (default_tty);
-+  ply_hashtable_insert (manager->terminals,
-+                        (void *) ply_terminal_get_name (manager->local_console_terminal),
-+                        manager->local_console_terminal);
-+  manager->seats = ply_list_new ();
-+  manager->flags = flags;
-+
-+  if (!(flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV))
-+    manager->udev_context = udev_new ();
-+
-+  attach_to_event_loop (manager, ply_event_loop_get_default ());
-+
-+  return manager;
-+}
-+
-+void
-+ply_device_manager_free (ply_device_manager_t *manager)
-+{
-+  ply_trace ("freeing device manager");
-+
-+  if (manager == NULL)
-+    return;
-+
-+  ply_event_loop_stop_watching_for_exit (manager->loop,
-+                                         (ply_event_loop_exit_handler_t)
-+                                         detach_from_event_loop,
-+                                         manager);
-+  free_seats (manager);
-+  ply_list_free (manager->seats);
-+
-+  free_terminals (manager);
-+  ply_hashtable_free (manager->terminals);
-+
-+  if (manager->udev_monitor != NULL)
-+    udev_monitor_unref (manager->udev_monitor);
-+
-+  if (manager->udev_context != NULL)
-+    udev_unref (manager->udev_context);
-+
-+  free (manager);
-+}
-+
-+static bool
-+add_consoles_from_file (ply_device_manager_t *manager,
-+                        const char           *path)
-+{
-+  int fd;
-+  char contents[512] = "";
-+  ssize_t contents_length;
-+  bool has_serial_consoles;
-+  const char *remaining_file_contents;
-+
-+  ply_trace ("opening %s", path);
-+  fd = open (path, O_RDONLY);
-+
-+  if (fd < 0)
-+    {
-+      ply_trace ("couldn't open it: %m");
-+      return false;
-+    }
-+
-+  ply_trace ("reading file");
-+  contents_length = read (fd, contents, sizeof (contents) - 1);
-+
-+  if (contents_length <= 0)
-+    {
-+      ply_trace ("couldn't read it: %m");
-+      close (fd);
-+      return false;
-+    }
-+  close (fd);
-+
-+  remaining_file_contents = contents;
-+  has_serial_consoles = false;
-+
-+  while (remaining_file_contents < contents + contents_length)
-+    {
-+      char *console;
-+      size_t console_length;
-+      const char *console_device;
-+      ply_terminal_t *terminal;
-+
-+      /* Advance past any leading whitespace */
-+      remaining_file_contents += strspn (remaining_file_contents, " \n\t\v");
-+
-+      if (*remaining_file_contents == '\0')
-+        {
-+          /* There's nothing left after the whitespace, we're done */
-+          break;
-+        }
-+
-+      /* Find trailing whitespace and NUL terminate.  If strcspn
-+       * doesn't find whitespace, it gives us the length of the string
-+       * until the next NUL byte, which we'll just overwrite with
-+       * another NUL byte anyway. */
-+      console_length = strcspn (remaining_file_contents, " \n\t\v");
-+      console = strndup (remaining_file_contents, console_length);
-+
-+      terminal = get_terminal (manager, console);
-+      console_device = ply_terminal_get_name (terminal);
-+
-+      free (console);
-+
-+      ply_trace ("console %s found!", console_device);
-+
-+      if (terminal != manager->local_console_terminal)
-+        has_serial_consoles = true;
-+
-+      /* Move past the parsed console string, and the whitespace we
-+       * may have found above.  If we found a NUL above and not whitespace,
-+       * then we're going to jump past the end of the buffer and the loop
-+       * will terminate
-+       */
-+      remaining_file_contents += console_length + 1;
-+    }
-+
-+  return has_serial_consoles;
-+}
-+
-+static void
-+create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
-+                                            const char           *device_path,
-+                                            ply_terminal_t       *terminal,
-+                                            ply_renderer_type_t   renderer_type)
-+{
-+  ply_seat_t *seat;
-+  bool is_local_terminal = false;
-+
-+  if (terminal != NULL && manager->local_console_terminal == terminal)
-+    is_local_terminal = true;
-+
-+  if (is_local_terminal && manager->local_console_seat != NULL)
-+    {
-+      ply_trace ("trying to create seat for local console when one already exists");
-+      return;
-+    }
-+
-+  ply_trace ("creating seat for %s (renderer type: %u) (terminal: %s)",
-+             device_path? : "", renderer_type, terminal? ply_terminal_get_name (terminal): "none");
-+  seat = ply_seat_new (terminal);
-+
-+  if (!ply_seat_open (seat, renderer_type, device_path))
-+    {
-+      ply_trace ("could not create seat");
-+      ply_seat_free (seat);
-+      return;
-+    }
-+
-+  ply_list_append_data (manager->seats, seat);
-+
-+  if (is_local_terminal)
-+    manager->local_console_seat = seat;
-+
-+  if (manager->seat_added_handler != NULL)
-+    manager->seat_added_handler (manager->seat_event_handler_data, seat);
-+}
-+
-+static void
-+create_seat_for_terminal (const char           *device_path,
-+                          ply_terminal_t       *terminal,
-+                          ply_device_manager_t *manager)
-+{
-+  create_seat_for_terminal_and_renderer_type (manager,
-+                                              device_path,
-+                                              terminal,
-+                                              PLY_RENDERER_TYPE_NONE);
-+}
-+static bool
-+create_seats_from_terminals (ply_device_manager_t *manager)
-+{
-+  bool has_serial_consoles;
-+
-+  ply_trace ("checking for consoles");
-+
-+  if (manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_SERIAL_CONSOLES)
-+    {
-+      has_serial_consoles = false;
-+      ply_trace ("ignoring all consoles but default console because explicitly told to.");
-+    }
-+  else
-+    {
-+      has_serial_consoles = add_consoles_from_file (manager, "/sys/class/tty/console/active");
-+    }
-+
-+  if (has_serial_consoles)
-+    {
-+      ply_trace ("serial consoles detected, managing them with details forced");
-+      ply_hashtable_foreach (manager->terminals,
-+                             (ply_hashtable_foreach_func_t *)
-+                             create_seat_for_terminal,
-+                             manager);
-+      return true;
-+    }
-+
-+  return false;
-+}
-+
-+static void
-+create_seats_from_udev (ply_device_manager_t *manager)
-+{
-+  bool found_drm_device, found_fb_device;
-+
-+  ply_trace ("Looking for devices from udev");
-+
-+  found_drm_device = create_seats_for_subsystem (manager, SUBSYSTEM_DRM);
-+  found_fb_device = create_seats_for_subsystem (manager, SUBSYSTEM_FRAME_BUFFER);
-+
-+  if (found_drm_device || found_fb_device)
-+    return;
-+
-+  ply_trace ("Creating non-graphical seat, since there's no suitable graphics hardware");
-+  create_seat_for_terminal_and_renderer_type (manager,
-+                                              ply_terminal_get_name (manager->local_console_terminal),
-+                                              manager->local_console_terminal,
-+                                              PLY_RENDERER_TYPE_NONE);
-+}
-+
-+static void
-+create_fallback_seat (ply_device_manager_t *manager)
-+{
-+  create_seat_for_terminal_and_renderer_type (manager,
-+                                              ply_terminal_get_name (manager->local_console_terminal),
-+                                              manager->local_console_terminal,
-+                                              PLY_RENDERER_TYPE_AUTO);
-+}
-+
-+static void
-+on_udev_queue_changed (ply_device_manager_t *manager)
-+{
-+
-+  if (!udev_queue_get_queue_is_empty (manager->udev_queue))
-+    return;
-+
-+  ply_trace ("udev coldplug complete");
-+  ply_event_loop_stop_watching_fd (manager->loop, manager->udev_queue_fd_watch);
-+  manager->udev_queue_fd_watch = NULL;
-+  udev_queue_unref (manager->udev_queue);
-+
-+  close (manager->udev_queue_fd);
-+  manager->udev_queue_fd = -1;
-+
-+  manager->udev_queue = NULL;
-+
-+  create_seats_from_udev (manager);
-+}
-+
-+static void
-+watch_for_coldplug_completion (ply_device_manager_t *manager)
-+{
-+  int fd;
-+  int result;
-+
-+  manager->udev_queue = udev_queue_new (manager->udev_context);
-+
-+  if (udev_queue_get_queue_is_empty (manager->udev_queue))
-+    {
-+      ply_trace ("udev coldplug completed already ");
-+      create_seats_from_udev (manager);
-+      return;
-+    }
-+
-+  fd = inotify_init1 (IN_CLOEXEC);
-+  result = inotify_add_watch (fd, "/run/udev", IN_MOVED_TO);
-+
-+  if (result < 0)
-+    {
-+      ply_trace ("could not watch for udev to show up: %m");
-+      close (fd);
-+
-+      create_fallback_seat (manager);
-+      return;
-+    }
-+
-+  manager->udev_queue_fd = fd;
-+
-+  manager->udev_queue_fd_watch = ply_event_loop_watch_fd (manager->loop,
-+                                                          fd,
-+                                                          PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
-+                                                          (ply_event_handler_t)
-+                                                          on_udev_queue_changed,
-+                                                          NULL,
-+                                                          manager);
-+
-+}
-+
-+void
-+ply_device_manager_watch_seats (ply_device_manager_t       *manager,
-+                                ply_seat_added_handler_t    seat_added_handler,
-+                                ply_seat_removed_handler_t  seat_removed_handler,
-+                                void                       *data)
-+{
-+  bool done_with_initial_seat_setup;
-+
-+  manager->seat_added_handler = seat_added_handler;
-+  manager->seat_removed_handler = seat_removed_handler;
-+  manager->seat_event_handler_data = data;
-+
-+  /* Try to create seats for each serial device right away, if possible
-+   */
-+  done_with_initial_seat_setup = create_seats_from_terminals (manager);
-+
-+  if (done_with_initial_seat_setup)
-+    return;
-+
-+  if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV))
-+    {
-+      ply_trace ("udev support disabled, creating fallback seat");
-+      create_fallback_seat (manager);
-+      return;
-+    }
-+
-+  watch_for_udev_events (manager);
-+  watch_for_coldplug_completion (manager);
-+}
-+
-+bool
-+ply_device_manager_has_open_seats (ply_device_manager_t *manager)
-+{
-+  ply_list_node_t *node;
-+
-+  node = ply_list_get_first_node (manager->seats);
-+  while (node != NULL)
-+    {
-+      ply_seat_t *seat;
-+      ply_list_node_t *next_node;
-+
-+      seat = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (manager->seats, node);
-+
-+      if (ply_seat_is_open (seat))
-+        return true;
-+
-+      node = next_node;
-+    }
-+
-+  return false;
-+}
-+
-+ply_list_t *
-+ply_device_manager_get_seats (ply_device_manager_t *manager)
-+{
-+  return manager->seats;
-+}
-+
-+ply_terminal_t *
-+ply_device_manager_get_default_terminal (ply_device_manager_t *manager)
-+{
-+  return manager->local_console_terminal;
-+}
-+
-+void
-+ply_device_manager_activate_renderers (ply_device_manager_t *manager)
-+{
-+  ply_list_node_t *node;
-+
-+  ply_trace ("activating renderers");
-+  node = ply_list_get_first_node (manager->seats);
-+  while (node != NULL)
-+    {
-+      ply_seat_t *seat;
-+      ply_list_node_t *next_node;
-+
-+      seat = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (manager->seats, node);
-+
-+      ply_seat_activate_renderer (seat);
-+
-+      node = next_node;
-+    }
-+}
-+
-+void
-+ply_device_manager_deactivate_renderers (ply_device_manager_t *manager)
-+{
-+  ply_list_node_t *node;
-+
-+  ply_trace ("deactivating renderers");
-+  node = ply_list_get_first_node (manager->seats);
-+  while (node != NULL)
-+    {
-+      ply_seat_t *seat;
-+      ply_list_node_t *next_node;
-+
-+      seat = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (manager->seats, node);
-+
-+      ply_seat_deactivate_renderer (seat);
-+
-+      node = next_node;
-+    }
-+}
-+
-+void
-+ply_device_manager_activate_keyboards (ply_device_manager_t *manager)
-+{
-+  ply_list_node_t *node;
-+
-+  ply_trace ("activating keyboards");
-+  node = ply_list_get_first_node (manager->seats);
-+  while (node != NULL)
-+    {
-+      ply_seat_t *seat;
-+      ply_list_node_t *next_node;
-+
-+      seat = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (manager->seats, node);
-+
-+      ply_seat_activate_keyboard (seat);
-+
-+      node = next_node;
-+    }
-+}
-+
-+void
-+ply_device_manager_deactivate_keyboards (ply_device_manager_t *manager)
-+{
-+  ply_list_node_t *node;
-+
-+  ply_trace ("deactivating keyboards");
-+  node = ply_list_get_first_node (manager->seats);
-+  while (node != NULL)
-+    {
-+      ply_seat_t *seat;
-+      ply_list_node_t *next_node;
-+
-+      seat = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (manager->seats, node);
-+
-+      ply_seat_deactivate_keyboard (seat);
-+
-+      node = next_node;
-+    }
-+}
-diff --git a/src/libply-splash-core/ply-device-manager.h b/src/libply-splash-core/ply-device-manager.h
-new file mode 100644
-index 0000000..d9c58e8
---- /dev/null
-+++ b/src/libply-splash-core/ply-device-manager.h
-@@ -0,0 +1,56 @@
-+/* ply-device-manager.h - udev monitor
-+ *
-+ * Copyright (C) 2013 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ */
-+#ifndef PLY_DEVICE_MANAGER_H
-+#define PLY_DEVICE_MANAGER_H
-+
-+#include <stdbool.h>
-+#include "ply-seat.h"
-+
-+typedef enum
-+{
-+  PLY_DEVICE_MANAGER_FLAGS_NONE                   = 0,
-+  PLY_DEVICE_MANAGER_FLAGS_IGNORE_SERIAL_CONSOLES = 1 << 0,
-+  PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV            = 1 << 1
-+} ply_device_manager_flags_t;
-+
-+typedef struct _ply_device_manager ply_device_manager_t;
-+typedef void (* ply_seat_added_handler_t) (void *, ply_seat_t *);
-+typedef void (* ply_seat_removed_handler_t) (void *, ply_seat_t *);
-+
-+#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
-+ply_device_manager_t *ply_device_manager_new (const char                 *default_tty,
-+                                              ply_device_manager_flags_t  flags);
-+void ply_device_manager_watch_seats (ply_device_manager_t *manager,
-+                                     ply_seat_added_handler_t seat_added_handler,
-+                                     ply_seat_removed_handler_t seat_removed_handler,
-+                                     void *data);
-+bool ply_device_manager_has_open_seats (ply_device_manager_t *manager);
-+ply_list_t *ply_device_manager_get_seats (ply_device_manager_t *manager);
-+void ply_device_manager_free (ply_device_manager_t *manager);
-+void ply_device_manager_activate_keyboards (ply_device_manager_t *manager);
-+void ply_device_manager_deactivate_keyboards (ply_device_manager_t *manager);
-+void ply_device_manager_activate_renderers (ply_device_manager_t *manager);
-+void ply_device_manager_deactivate_renderers (ply_device_manager_t *manager);
-+ply_terminal_t *ply_device_manager_get_default_terminal (ply_device_manager_t *manager);
-+
-+#endif
-+
-+#endif
-+/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
-diff --git a/src/libply-splash-core/ply-pixel-buffer.c b/src/libply-splash-core/ply-pixel-buffer.c
-index a612990..a860b7f 100644
---- a/src/libply-splash-core/ply-pixel-buffer.c
-+++ b/src/libply-splash-core/ply-pixel-buffer.c
-@@ -848,5 +848,35 @@ ply_pixel_buffer_rotate (ply_pixel_buffer_t *old_buffer,
-   return buffer;
- }
- 
-+ply_pixel_buffer_t *
-+ply_pixel_buffer_tile (ply_pixel_buffer_t *old_buffer,
-+                       long                width,
-+                       long                height)
-+{
-+  long x, y;
-+  long old_x, old_y;
-+  long old_width, old_height;
-+  uint32_t *bytes, *old_bytes;
-+  ply_pixel_buffer_t *buffer;
-+
-+  buffer = ply_pixel_buffer_new (width, height);
-+
-+  old_bytes = ply_pixel_buffer_get_argb32_data (old_buffer);
-+  bytes = ply_pixel_buffer_get_argb32_data (buffer);
-+
-+  old_width = old_buffer->area.width;
-+  old_height = old_buffer->area.height;
-+
-+  for (y = 0; y < height; y++)
-+    {
-+      old_y = y % old_height;
-+      for (x = 0; x < width; x++)
-+        {
-+          old_x = x % old_width;
-+          bytes[x + y * width] = old_bytes[old_x + old_y * old_width];
-+        }
-+    }
-+  return buffer;
-+}
- 
- /* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
-diff --git a/src/libply-splash-core/ply-pixel-buffer.h b/src/libply-splash-core/ply-pixel-buffer.h
-index 47cdd52..e0dffda 100644
---- a/src/libply-splash-core/ply-pixel-buffer.h
-+++ b/src/libply-splash-core/ply-pixel-buffer.h
-@@ -124,6 +124,10 @@ ply_pixel_buffer_t *ply_pixel_buffer_rotate (ply_pixel_buffer_t *old_buffer,
-                                              long                center_y,
-                                              double              theta_offset);
- 
-+ply_pixel_buffer_t *ply_pixel_buffer_tile (ply_pixel_buffer_t *old_buffer,
-+                                           long                width,
-+                                           long                height);
-+
- #endif
- 
- #endif /* PLY_PIXEL_BUFFER_H */
-diff --git a/src/libply-splash-core/ply-renderer.c b/src/libply-splash-core/ply-renderer.c
-index 3559e01..04a99ce 100644
---- a/src/libply-splash-core/ply-renderer.c
-+++ b/src/libply-splash-core/ply-renderer.c
-@@ -49,7 +49,7 @@ struct _ply_renderer
-   const ply_renderer_plugin_interface_t *plugin_interface;
-   ply_renderer_backend_t *backend;
- 
--  char *plugin_path;
-+  ply_renderer_type_t type;
-   char *device_name;
-   ply_terminal_t *terminal;
- 
-@@ -63,16 +63,15 @@ typedef const ply_renderer_plugin_interface_t *
- static void ply_renderer_unload_plugin (ply_renderer_t *renderer);
- 
- ply_renderer_t *
--ply_renderer_new (const char     *plugin_path,
--                  const char     *device_name,
--                  ply_terminal_t *terminal)
-+ply_renderer_new (ply_renderer_type_t  renderer_type,
-+                  const char          *device_name,
-+                  ply_terminal_t      *terminal)
- {
-   ply_renderer_t *renderer;
- 
-   renderer = calloc (1, sizeof (struct _ply_renderer));
- 
--  if (plugin_path != NULL)
--    renderer->plugin_path = strdup (plugin_path);
-+  renderer->type = renderer_type;
- 
-   if (device_name != NULL)
-     renderer->device_name = strdup (device_name);
-@@ -95,10 +94,15 @@ ply_renderer_free (ply_renderer_t *renderer)
-     }
- 
-   free (renderer->device_name);
--  free (renderer->plugin_path);
-   free (renderer);
- }
- 
-+const char *
-+ply_renderer_get_device_name (ply_renderer_t *renderer)
-+{
-+  return renderer->device_name;
-+}
-+
- static bool
- ply_renderer_load_plugin (ply_renderer_t *renderer,
-                           const char     *module_path)
-@@ -258,29 +262,28 @@ ply_renderer_open (ply_renderer_t *renderer)
- {
-   int i;
- 
--  /* FIXME: at some point we may want to make this
--   * part more dynamic (so you don't have to edit this
--   * list to add a new renderer)
--   */
--  const char *known_plugins[] =
-+  struct
-     {
--      PLYMOUTH_PLUGIN_PATH "renderers/x11.so",
--      PLYMOUTH_PLUGIN_PATH "renderers/drm.so",
--      PLYMOUTH_PLUGIN_PATH "renderers/frame-buffer.so",
--      NULL
-+      ply_renderer_type_t  type;
-+      const char          *path;
-+    } known_plugins[] =
-+    {
-+      { PLY_RENDERER_TYPE_X11, PLYMOUTH_PLUGIN_PATH "renderers/x11.so" },
-+      { PLY_RENDERER_TYPE_DRM, PLYMOUTH_PLUGIN_PATH "renderers/drm.so" },
-+      { PLY_RENDERER_TYPE_FRAME_BUFFER, PLYMOUTH_PLUGIN_PATH "renderers/frame-buffer.so" },
-+      { PLY_RENDERER_TYPE_NONE, NULL }
-     };
- 
--  if (renderer->plugin_path != NULL)
-+  for (i = 0; known_plugins[i].type != PLY_RENDERER_TYPE_NONE; i++)
-     {
--      return ply_renderer_open_plugin (renderer, renderer->plugin_path);
-+      if (renderer->type == known_plugins[i].type ||
-+          renderer->type == PLY_RENDERER_TYPE_AUTO)
-+        {
-+          if (ply_renderer_open_plugin (renderer, known_plugins[i].path))
-+            return true;
-+        }
-     }
- 
--  for (i = 0; known_plugins[i] != NULL; i++)
--    {
--      if (ply_renderer_open_plugin (renderer, known_plugins[i]))
--        return true;
--  }
--
-   ply_trace ("could not find suitable rendering plugin");
-   return false;
- }
-diff --git a/src/libply-splash-core/ply-renderer.h b/src/libply-splash-core/ply-renderer.h
-index 4b3bd1a..3d48341 100644
---- a/src/libply-splash-core/ply-renderer.h
-+++ b/src/libply-splash-core/ply-renderer.h
-@@ -35,12 +35,21 @@ typedef struct _ply_renderer ply_renderer_t;
- typedef struct _ply_renderer_head ply_renderer_head_t;
- typedef struct _ply_renderer_input_source ply_renderer_input_source_t;
- 
-+typedef enum
-+{
-+  PLY_RENDERER_TYPE_NONE = -1,
-+  PLY_RENDERER_TYPE_AUTO,
-+  PLY_RENDERER_TYPE_DRM,
-+  PLY_RENDERER_TYPE_FRAME_BUFFER,
-+  PLY_RENDERER_TYPE_X11
-+} ply_renderer_type_t;
-+
- typedef void (* ply_renderer_input_source_handler_t) (void                        *user_data,
-                                                       ply_buffer_t                *key_buffer,
-                                                       ply_renderer_input_source_t *input_source);
- 
- #ifndef PLY_HIDE_FUNCTION_DECLARATIONS
--ply_renderer_t *ply_renderer_new (const char     *plugin_path,
-+ply_renderer_t *ply_renderer_new (ply_renderer_type_t renderer_type,
-                                   const char     *device_name,
-                                   ply_terminal_t *terminal);
- void ply_renderer_free (ply_renderer_t *renderer);
-@@ -48,6 +57,7 @@ bool ply_renderer_open (ply_renderer_t *renderer);
- void ply_renderer_close (ply_renderer_t *renderer);
- void ply_renderer_activate (ply_renderer_t *renderer);
- void ply_renderer_deactivate (ply_renderer_t *renderer);
-+const char *ply_renderer_get_device_name (ply_renderer_t *renderer);
- ply_list_t *ply_renderer_get_heads (ply_renderer_t *renderer);
- ply_pixel_buffer_t *ply_renderer_get_buffer_for_head (ply_renderer_t      *renderer,
-                                                       ply_renderer_head_t *head);
-diff --git a/src/libply-splash-core/ply-seat.c b/src/libply-splash-core/ply-seat.c
-new file mode 100644
-index 0000000..2ac8bf7
---- /dev/null
-+++ b/src/libply-splash-core/ply-seat.c
-@@ -0,0 +1,387 @@
-+/* ply-seat.c - APIs for encapsulating a keyboard and one or more displays
-+ *
-+ * Copyright (C) 2013 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ * Written by: Ray Strode <rstrode at redhat.com>
-+ */
-+#include "config.h"
-+#include "ply-seat.h"
-+
-+#include <assert.h>
-+#include <errno.h>
-+#include <stdint.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+
-+#include "ply-boot-splash.h"
-+#include "ply-event-loop.h"
-+#include "ply-keyboard.h"
-+#include "ply-pixel-display.h"
-+#include "ply-text-display.h"
-+#include "ply-list.h"
-+#include "ply-logger.h"
-+#include "ply-utils.h"
-+
-+struct _ply_seat
-+{
-+  ply_event_loop_t *loop;
-+
-+  ply_boot_splash_t *splash;
-+  ply_terminal_t *terminal;
-+  ply_renderer_t *renderer;
-+  ply_keyboard_t *keyboard;
-+  ply_list_t *text_displays;
-+  ply_list_t *pixel_displays;
-+
-+  uint32_t renderer_active : 1;
-+  uint32_t keyboard_active : 1;
-+};
-+
-+ply_seat_t *
-+ply_seat_new (ply_terminal_t *terminal)
-+{
-+  ply_seat_t *seat;
-+
-+  seat = calloc (1, sizeof (ply_seat_t));
-+
-+  seat->loop = ply_event_loop_get_default ();
-+  seat->terminal = terminal;
-+  seat->text_displays = ply_list_new ();
-+  seat->pixel_displays = ply_list_new ();
-+
-+  return seat;
-+}
-+
-+static void
-+add_pixel_displays (ply_seat_t *seat)
-+{
-+  ply_list_t *heads;
-+  ply_list_node_t *node;
-+
-+  heads = ply_renderer_get_heads (seat->renderer);
-+
-+  ply_trace ("Adding displays for %d heads",
-+             ply_list_get_length (heads));
-+
-+  node = ply_list_get_first_node (heads);
-+  while (node != NULL)
-+    {
-+      ply_list_node_t *next_node;
-+      ply_renderer_head_t *head;
-+      ply_pixel_display_t *display;
-+
-+      head = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (heads, node);
-+
-+      display = ply_pixel_display_new (seat->renderer, head);
-+
-+      ply_list_append_data (seat->pixel_displays, display);
-+
-+      node = next_node;
-+    }
-+}
-+
-+static void
-+add_text_displays (ply_seat_t *seat)
-+{
-+  ply_text_display_t *display;
-+
-+  if (!ply_terminal_is_open (seat->terminal))
-+    {
-+      if (!ply_terminal_open (seat->terminal))
-+        {
-+          ply_trace ("could not add terminal %s: %m",
-+                     ply_terminal_get_name (seat->terminal));
-+          return;
-+        }
-+    }
-+
-+  ply_trace ("adding text display for terminal %s",
-+             ply_terminal_get_name (seat->terminal));
-+
-+  display = ply_text_display_new (seat->terminal);
-+  ply_list_append_data (seat->text_displays, display);
-+}
-+
-+bool
-+ply_seat_open (ply_seat_t          *seat,
-+               ply_renderer_type_t  renderer_type,
-+               const char          *device)
-+{
-+  if (renderer_type != PLY_RENDERER_TYPE_NONE)
-+    {
-+      ply_renderer_t *renderer;
-+
-+      renderer = ply_renderer_new (renderer_type, device, seat->terminal);
-+
-+      if (!ply_renderer_open (renderer))
-+        {
-+          ply_trace ("could not open renderer for %s", device);
-+          ply_renderer_free (renderer);
-+
-+          seat->renderer = NULL;
-+          seat->renderer_active = false;
-+
-+          if (renderer_type != PLY_RENDERER_TYPE_AUTO)
-+            return false;
-+        }
-+      else
-+        {
-+          seat->renderer = renderer;
-+          seat->renderer_active = true;
-+        }
-+    }
-+
-+  if (seat->renderer != NULL)
-+    {
-+      seat->keyboard = ply_keyboard_new_for_renderer (seat->renderer);
-+      add_pixel_displays (seat);
-+
-+    }
-+  else
-+    {
-+      seat->keyboard = ply_keyboard_new_for_terminal (seat->terminal);
-+    }
-+  add_text_displays (seat);
-+
-+  ply_keyboard_watch_for_input (seat->keyboard);
-+  seat->keyboard_active = true;
-+
-+  return true;
-+}
-+
-+bool
-+ply_seat_is_open (ply_seat_t *seat)
-+{
-+  return ply_list_get_length (seat->pixel_displays) > 0 ||
-+         ply_list_get_length (seat->text_displays) > 0;
-+}
-+
-+void
-+ply_seat_deactivate_keyboard (ply_seat_t *seat)
-+{
-+  if (!seat->keyboard_active)
-+    return;
-+
-+  seat->keyboard_active = false;
-+
-+  if (seat->keyboard == NULL)
-+    return;
-+
-+  ply_trace ("deactivating keybord");
-+  ply_keyboard_stop_watching_for_input (seat->keyboard);
-+}
-+
-+void
-+ply_seat_deactivate_renderer (ply_seat_t *seat)
-+{
-+  if (!seat->renderer_active)
-+    return;
-+
-+  seat->renderer_active = false;
-+
-+  if (seat->renderer == NULL)
-+    return;
-+
-+  ply_trace ("deactivating renderer");
-+  ply_renderer_deactivate (seat->renderer);
-+}
-+
-+void
-+ply_seat_activate_keyboard (ply_seat_t *seat)
-+{
-+  if (seat->keyboard_active)
-+    return;
-+
-+  if (seat->keyboard == NULL)
-+    return;
-+
-+  ply_trace ("activating keyboard");
-+  ply_keyboard_watch_for_input (seat->keyboard);
-+
-+  seat->keyboard_active = true;
-+}
-+
-+void
-+ply_seat_activate_renderer (ply_seat_t *seat)
-+{
-+  if (seat->renderer_active)
-+    return;
-+
-+  if (seat->renderer == NULL)
-+    return;
-+
-+  ply_trace ("activating renderer");
-+  ply_renderer_activate (seat->renderer);
-+
-+  seat->renderer_active = true;
-+}
-+
-+void
-+ply_seat_refresh_displays (ply_seat_t *seat)
-+{
-+  ply_list_node_t *node;
-+
-+  node = ply_list_get_first_node (seat->pixel_displays);
-+  while (node != NULL)
-+    {
-+      ply_pixel_display_t *display;
-+      ply_list_node_t *next_node;
-+      unsigned long width, height;
-+
-+      display = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (seat->pixel_displays, node);
-+
-+      width = ply_pixel_display_get_width (display);
-+      height = ply_pixel_display_get_height (display);
-+
-+      ply_pixel_display_draw_area (display, 0, 0, width, height);
-+      node = next_node;
-+    }
-+
-+  node = ply_list_get_first_node (seat->text_displays);
-+  while (node != NULL)
-+    {
-+      ply_text_display_t *display;
-+      ply_list_node_t *next_node;
-+      int number_of_columns, number_of_rows;
-+
-+      display = ply_list_node_get_data (node);
-+      next_node = ply_list_get_next_node (seat->text_displays, node);
-+
-+      number_of_columns = ply_text_display_get_number_of_columns (display);
-+      number_of_rows = ply_text_display_get_number_of_rows (display);
-+
-+      ply_text_display_draw_area (display, 0, 0,
-+                                  number_of_columns,
-+                                  number_of_rows);
-+      node = next_node;
-+    }
-+}
-+
-+void
-+ply_seat_close (ply_seat_t *seat)
-+{
-+  if (seat->renderer == NULL)
-+    return;
-+
-+  ply_trace ("destroying renderer");
-+  ply_renderer_close (seat->renderer);
-+  ply_renderer_free (seat->renderer);
-+  seat->renderer = NULL;
-+}
-+
-+void
-+ply_seat_set_splash (ply_seat_t        *seat,
-+                     ply_boot_splash_t *splash)
-+{
-+  if (seat->splash == splash)
-+    return;
-+
-+  if (seat->splash != NULL)
-+    ply_boot_splash_detach_from_seat (splash, seat);
-+
-+  if (splash != NULL)
-+    ply_boot_splash_attach_to_seat (splash, seat);
-+
-+  seat->splash = splash;
-+}
-+
-+static void
-+free_pixel_displays (ply_seat_t *seat)
-+{
-+  ply_list_node_t *node;
-+
-+  ply_trace ("freeing %d pixel displays", ply_list_get_length (seat->pixel_displays));
-+  node = ply_list_get_first_node (seat->pixel_displays);
-+  while (node != NULL)
-+    {
-+      ply_list_node_t *next_node;
-+      ply_pixel_display_t *display;
-+
-+      next_node = ply_list_get_next_node (seat->pixel_displays, node);
-+      display = ply_list_node_get_data (node);
-+      ply_pixel_display_free (display);
-+
-+      ply_list_remove_node (seat->pixel_displays, node);
-+
-+      node = next_node;
-+    }
-+}
-+
-+static void
-+free_text_displays (ply_seat_t *seat)
-+{
-+  ply_list_node_t *node;
-+
-+  ply_trace ("freeing %d text displays", ply_list_get_length (seat->text_displays));
-+  node = ply_list_get_first_node (seat->text_displays);
-+  while (node != NULL)
-+    {
-+      ply_list_node_t *next_node;
-+      ply_text_display_t *display;
-+
-+      next_node = ply_list_get_next_node (seat->text_displays, node);
-+      display = ply_list_node_get_data (node);
-+      ply_text_display_free (display);
-+
-+      ply_list_remove_node (seat->text_displays, node);
-+
-+      node = next_node;
-+    }
-+}
-+
-+void
-+ply_seat_free (ply_seat_t *seat)
-+{
-+  if (seat == NULL)
-+    return;
-+
-+  free_pixel_displays (seat);
-+  free_text_displays (seat);
-+  ply_keyboard_free (seat->keyboard);
-+
-+  free (seat);
-+}
-+
-+ply_list_t *
-+ply_seat_get_pixel_displays (ply_seat_t *seat)
-+{
-+  return seat->pixel_displays;
-+}
-+
-+ply_list_t *
-+ply_seat_get_text_displays (ply_seat_t *seat)
-+{
-+  return seat->text_displays;
-+}
-+
-+ply_keyboard_t *
-+ply_seat_get_keyboard (ply_seat_t *seat)
-+{
-+  return seat->keyboard;
-+}
-+
-+ply_renderer_t *
-+ply_seat_get_renderer (ply_seat_t *seat)
-+{
-+  return seat->renderer;
-+}
-+
-+/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
-diff --git a/src/libply-splash-core/ply-seat.h b/src/libply-splash-core/ply-seat.h
-new file mode 100644
-index 0000000..d5d3397
---- /dev/null
-+++ b/src/libply-splash-core/ply-seat.h
-@@ -0,0 +1,66 @@
-+/* ply-seat.h - APIs for encapsulating a keyboard and one or more displays
-+ *
-+ * Copyright (C) 2013 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ * Written By: Ray Strode <rstrode at redhat.com>
-+ */
-+#ifndef PLY_SEAT_H
-+#define PLY_SEAT_H
-+
-+#include <stdarg.h>
-+#include <stdbool.h>
-+#include <stdint.h>
-+#include <unistd.h>
-+
-+#include "ply-boot-splash.h"
-+#include "ply-buffer.h"
-+#include "ply-event-loop.h"
-+#include "ply-keyboard.h"
-+#include "ply-list.h"
-+#include "ply-pixel-display.h"
-+#include "ply-terminal.h"
-+#include "ply-text-display.h"
-+
-+typedef struct _ply_boot_splash ply_boot_splash_t;
-+typedef struct _ply_seat ply_seat_t;
-+
-+#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
-+ply_seat_t *ply_seat_new (ply_terminal_t *terminal);
-+
-+void ply_seat_free (ply_seat_t *seat);
-+bool ply_seat_open (ply_seat_t          *seat,
-+                    ply_renderer_type_t  renderer_type,
-+                    const char          *device);
-+bool ply_seat_is_open (ply_seat_t *seat);
-+void ply_seat_deactivate_keyboard (ply_seat_t *seat);
-+void ply_seat_activate_keyboard (ply_seat_t *seat);
-+void ply_seat_deactivate_renderer (ply_seat_t *seat);
-+void ply_seat_activate_renderer (ply_seat_t *seat);
-+void ply_seat_refresh_displays (ply_seat_t *seat);
-+void ply_seat_close (ply_seat_t *seat);
-+void ply_seat_set_splash (ply_seat_t        *seat,
-+                          ply_boot_splash_t *splash);
-+
-+ply_list_t *ply_seat_get_pixel_displays (ply_seat_t *seat);
-+ply_list_t *ply_seat_get_text_displays (ply_seat_t *seat);
-+ply_keyboard_t *ply_seat_get_keyboard (ply_seat_t *seat);
-+ply_renderer_t *ply_seat_get_renderer (ply_seat_t *seat);
-+#endif
-+
-+#endif /* PLY_SEAT_H */
-+/* vim: set ts=4 sw=4 et ai ci cino={.5s,^-2,+.5s,t0,g0,e-2,n-2,p2s,(0,=.5s,:.5s */
-diff --git a/src/libply-splash-core/ply-terminal.c b/src/libply-splash-core/ply-terminal.c
-index 2e95dc8..992dd3f 100644
---- a/src/libply-splash-core/ply-terminal.c
-+++ b/src/libply-splash-core/ply-terminal.c
-@@ -876,6 +876,12 @@ ply_terminal_free (ply_terminal_t *terminal)
-   free (terminal);
- }
- 
-+const char *
-+ply_terminal_get_name (ply_terminal_t *terminal)
-+{
-+  return terminal->name;
-+}
-+
- int
- ply_terminal_get_vt_number (ply_terminal_t *terminal)
- {
-diff --git a/src/libply-splash-core/ply-terminal.h b/src/libply-splash-core/ply-terminal.h
-index 8b4b017..48b4f77 100644
---- a/src/libply-splash-core/ply-terminal.h
-+++ b/src/libply-splash-core/ply-terminal.h
-@@ -91,6 +91,7 @@ void ply_terminal_set_mode (ply_terminal_t     *terminal,
- void ply_terminal_ignore_mode_changes (ply_terminal_t *terminal,
-                                        bool            should_ignore);
- 
-+const char *ply_terminal_get_name (ply_terminal_t *terminal);
- int ply_terminal_get_vt_number (ply_terminal_t *terminal);
- bool ply_terminal_activate_vt (ply_terminal_t *terminal);
- bool ply_terminal_deactivate_vt (ply_terminal_t *terminal);
-diff --git a/src/libply-splash-core/ply-text-progress-bar.c b/src/libply-splash-core/ply-text-progress-bar.c
-index bf4b378..8c4e759 100644
---- a/src/libply-splash-core/ply-text-progress-bar.c
-+++ b/src/libply-splash-core/ply-text-progress-bar.c
-@@ -104,7 +104,7 @@ get_os_string (void)
- 
-   buf = NULL;
- 
--  fd = open (RELEASE_FILE, O_RDONLY);
-+  fd = open (RELEASE_FILE, O_RDONLY|O_CLOEXEC);
-   if (fd == -1)
-     goto out;
- 
-@@ -136,6 +136,8 @@ get_os_string (void)
- 
-           if (pos2 != NULL)
-             *pos2 = '\0';
-+          else
-+            pos2 = pos + strlen(pos) - 1;
- 
-           if ((*pos == '\"' && pos2[-1] == '\"') ||
-               (*pos == '\'' && pos2[-1] == '\''))
-diff --git a/src/libply-splash-core/ply-text-step-bar.c b/src/libply-splash-core/ply-text-step-bar.c
-new file mode 100644
-index 0000000..552a39f
---- /dev/null
-+++ b/src/libply-splash-core/ply-text-step-bar.c
-@@ -0,0 +1,163 @@
-+/*
-+ * Copyright (C) 2008-2012 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+#include "config.h"
-+
-+#include <assert.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <unistd.h>
-+
-+#include "ply-text-display.h"
-+#include "ply-text-step-bar.h"
-+
-+struct _ply_text_step_bar
-+{
-+  ply_text_display_t *display;
-+
-+  int column;
-+  int row;
-+  int number_of_rows;
-+  int number_of_columns;
-+
-+  double percent_done;
-+  uint32_t is_hidden : 1;
-+};
-+
-+ply_text_step_bar_t *
-+ply_text_step_bar_new (void)
-+{
-+  ply_text_step_bar_t *step_bar;
-+
-+  step_bar = calloc (1, sizeof (ply_text_step_bar_t));
-+
-+  step_bar->row = 0;
-+  step_bar->column = 0;
-+  step_bar->number_of_columns = 0;
-+  step_bar->number_of_rows = 0;
-+
-+  return step_bar;
-+}
-+
-+void
-+ply_text_step_bar_free (ply_text_step_bar_t *step_bar)
-+{
-+  if (step_bar == NULL)
-+    return;
-+
-+  free (step_bar);
-+}
-+
-+void
-+ply_text_step_bar_draw (ply_text_step_bar_t *step_bar)
-+{
-+  int i;
-+  int cur;
-+
-+  if (step_bar->is_hidden)
-+    return;
-+
-+  ply_text_display_set_background_color (step_bar->display,
-+                                         PLY_TERMINAL_COLOR_BLACK);
-+
-+  ply_text_display_set_cursor_position (step_bar->display,
-+                                        step_bar->column,
-+                                        step_bar->row);
-+
-+  cur = step_bar->percent_done * step_bar->number_of_columns;
-+  for (i = 0; i < step_bar->number_of_columns; i++)
-+    {
-+      if (i == cur)
-+        {
-+          ply_text_display_set_foreground_color (step_bar->display,
-+                                                 PLY_TERMINAL_COLOR_WHITE);
-+        }
-+      else
-+        {
-+          ply_text_display_set_foreground_color (step_bar->display,
-+                                                 PLY_TERMINAL_COLOR_BROWN);
-+        }
-+
-+      ply_text_display_write (step_bar->display, "%c", '■');
-+      ply_text_display_write (step_bar->display, "%c", ' ');
-+    }
-+
-+  ply_text_display_set_foreground_color (step_bar->display,
-+                                         PLY_TERMINAL_COLOR_DEFAULT);
-+}
-+
-+void
-+ply_text_step_bar_show (ply_text_step_bar_t  *step_bar,
-+                        ply_text_display_t       *display)
-+{
-+  int screen_rows;
-+  int screen_cols;
-+
-+  assert (step_bar != NULL);
-+
-+  step_bar->display = display;
-+
-+
-+  screen_rows = ply_text_display_get_number_of_rows (display);
-+  screen_cols = ply_text_display_get_number_of_columns (display);
-+
-+  step_bar->number_of_rows = 1;
-+  step_bar->row = screen_rows * .66;
-+  step_bar->number_of_columns = 3;
-+  step_bar->column = screen_cols / 2.0 - step_bar->number_of_columns / 2.0;
-+
-+  step_bar->is_hidden = false;
-+
-+  ply_text_step_bar_draw (step_bar);
-+}
-+
-+void
-+ply_text_step_bar_hide (ply_text_step_bar_t *step_bar)
-+{
-+  step_bar->display = NULL;
-+  step_bar->is_hidden = true;
-+}
-+
-+void
-+ply_text_step_bar_set_percent_done (ply_text_step_bar_t  *step_bar,
-+                                    double percent_done)
-+{
-+  step_bar->percent_done = percent_done;
-+}
-+
-+double
-+ply_text_step_bar_get_percent_done (ply_text_step_bar_t  *step_bar)
-+{
-+  return step_bar->percent_done;
-+}
-+
-+int
-+ply_text_step_bar_get_number_of_columns (ply_text_step_bar_t *step_bar)
-+{
-+  return step_bar->number_of_columns;
-+}
-+
-+int
-+ply_text_step_bar_get_number_of_rows (ply_text_step_bar_t *step_bar)
-+{
-+  return step_bar->number_of_rows;
-+}
-+
-+/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
-diff --git a/src/libply-splash-core/ply-text-step-bar.h b/src/libply-splash-core/ply-text-step-bar.h
-new file mode 100644
-index 0000000..0a4733f
---- /dev/null
-+++ b/src/libply-splash-core/ply-text-step-bar.h
-@@ -0,0 +1,49 @@
-+/*
-+ * Copyright (C) 2008-2012 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
<Skipped 7327 lines>
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/plymouth.git/commitdiff/af391cce12f9d96db1498a2be0359f37d3e375fc




More information about the pld-cvs-commit mailing list