From 4335d4352eaa73fdaf40cdc97c9375cb5995cb9a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 22 May 2008 15:19:59 -0400 Subject: [PATCH] Add preliminary password support to fedora-fade-in We should really move a lot of the duplicate code between the various splash plugins to the window code. We also need line editing support. --- TODO | 2 +- scripts/plymouth-update-initrd | 5 +- src/splash-plugins/fedora-fade-in/Makefile.am | 2 +- src/splash-plugins/fedora-fade-in/bullet.png | Bin 0 -> 745 bytes src/splash-plugins/fedora-fade-in/entry.png | Bin 0 -> 857 bytes .../fedora-fade-in/fedora-fade-in.c | 182 +++++++++++++++++- src/splash-plugins/fedora-fade-in/lock.png | Bin 0 -> 29126 bytes 7 files changed, 184 insertions(+), 7 deletions(-) create mode 100644 src/splash-plugins/fedora-fade-in/bullet.png create mode 100644 src/splash-plugins/fedora-fade-in/entry.png create mode 100644 src/splash-plugins/fedora-fade-in/lock.png diff --git a/TODO b/TODO index 309c7b6..4441b6d 100644 --- a/TODO +++ b/TODO @@ -3,4 +3,4 @@ - Drop all the make ram disk and copy code. That was just to make bolting things on easier. We can integrate now. - allow longer than 255 byte replies from server to client - make server send immediate ACK for password request and then ANSWER later with a link back to original request in ANSWER -- add ask-for-password support to fedora-fade-in and details plugins +- buffer keyboard input from window instead of individual splash plugins diff --git a/scripts/plymouth-update-initrd b/scripts/plymouth-update-initrd index 2615f54..e94ee88 100755 --- a/scripts/plymouth-update-initrd +++ b/scripts/plymouth-update-initrd @@ -31,7 +31,7 @@ TMPDIR="$(mktemp -d $PWD/initrd.XXXXXXXXXX)" (cd $TMPDIR zcat $INITRD | cpio --quiet -Hnewc -i --make-directories sed -i -e 's@^#!\(.*\)@#!/bin/plymouthd \1\n@' init - sed -i -e 's@setquiet@&\n/bin/plymouth --show-splash\n/bin/plymouth --ask-for-password@' init + sed -i -e 's@setquiet@&\n/bin/plymouth --show-splash\n/bin/plymouth --ask-for-password\n@' init (cd $LIBDIR DEPS=$(get_lib_deps ${LIBEXECDIR}/plymouth/plymouth ${LIBDIR}/plymouth/fedora-fade-in.so ${LIBDIR}/plymouth/text.so ${LIBDIR}/plymouth/details.so) for dep in $DEPS; do @@ -48,6 +48,9 @@ TMPDIR="$(mktemp -d $PWD/initrd.XXXXXXXXXX)" install -m644 ${DATADIR}/pixmaps/fedora-logo.png ${TMPDIR}${DATADIR}/plymouth install -m644 ${DATADIR}/plymouth/star.png ${TMPDIR}${DATADIR}/plymouth + install -m644 ${DATADIR}/plymouth/lock.png ${TMPDIR}${DATADIR}/plymouth + install -m644 ${DATADIR}/plymouth/entry.png ${TMPDIR}${DATADIR}/plymouth + install -m644 ${DATADIR}/plymouth/bullet.png ${TMPDIR}${DATADIR}/plymouth mkdir -p ${TMPDIR}${LIBDIR}/plymouth install -m755 ${LIBDIR}/plymouth/fedora-fade-in.so ${TMPDIR}${LIBDIR}/plymouth diff --git a/src/splash-plugins/fedora-fade-in/Makefile.am b/src/splash-plugins/fedora-fade-in/Makefile.am index 29ec948..0371948 100644 --- a/src/splash-plugins/fedora-fade-in/Makefile.am +++ b/src/splash-plugins/fedora-fade-in/Makefile.am @@ -16,7 +16,7 @@ fedora_fade_in_la_SOURCES = $(srcdir)/../../ply-boot-splash-plugin.h \ $(srcdir)/fedora-fade-in.c plymouthdir = $(datadir)/plymouth -plymouth_DATA = star.png +plymouth_DATA = star.png bullet.png entry.png lock.png EXTRA_DIST = $(plymouth_DATA) MAINTAINERCLEANFILES = Makefile.in diff --git a/src/splash-plugins/fedora-fade-in/bullet.png b/src/splash-plugins/fedora-fade-in/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..691fb8033bf2c9747ff7b33e0b21e0709f74905c GIT binary patch literal 745 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOG` z12q=gh_CX>@2HM@dakSAh-}0006+NklFlt$bnM}MAe*}!UB5&9_xTrNv#~X0^We1hWt%_BdFmAY#)qxrS-@q%d*!4gTJaj0{Hu;0Zx>cbRxR8A&q1&cJo%yysYTVLZ zQ)iDF+W?WH&Z)KNLa=`^M^2f}2+vmHj;wqf1*VRz(#UKtk@H@o0t8alE6fT|i0a_R zZ-9n902&$~<>`&H?X*h)6>T`k2o>r86a-MO>;M!3P$Or|Em#2*2cS@Zbl^~b45lcU zmPV+ih2gKt=^g-S7ibn}+7(zmrO5j5B~X>L#9p`?>r6Z}TZubzNS^{z>0iw8ntU|P zrX+y1a|_(s!Db8X2I-mv1o@Q55&!pN!;@qi_dFazRd`LP3 za}QjzY^7ATUbQ5<1XUWQ%sqt<^T&^6=S;Ow0B$ACWQ!6f+Yx6-DkO#THe*4)kAAl5Nage(c!@6@aAQ`qKZ+91l z{~)+v@AAn&5zYdS$YKTtZeb8+WSBKa0w~B{;_2(keuGtv*@S=DkH_zTLXst}5hc#~ zxw)x%B@E6*sfi`2DGKG8B^e6tp1uL$jeOz^3`|=*T^vIyZoR#;vG-AcNZZB#3wbr0 zjh3;yIP6=R>u0ctoofNZse*rI2M%_b@>iGTths8*$vESI+WdE$->@)5EH(Q0{ptyZ zgqi>Pdbe0GA2_tJPBgQSt-<{0t`1{{HOALm7ceHwUHH%N>#3;MdM6c6+MRTtq<8X~ z4`V{W^e3~P%z3hTO4092QFm`G`fc(5)nOinnzO1W&x>!=TdW+LZL4NEQ=6e?cCzME z6SGT9ybRi0rN)>33VuJ!!g8LDiubegGMsrHnVr4SmHB|x_Lshoo0?}b z9#CSNeY@++y)z66g3V`hWy`BQIT>^oYcI`N?s5z0WW}X_{w{mhyOH65Ri_CvavM5N1uqZ-1vRZUebgPtdSy1hUXhv6t<|0zv`9E`s^<%~c*OFl6 zT2o_&h$E$0OU|dUF?37h;5X7EO%$w@7`ZCo}^4;_^`IoZtE|bSE*`$ z=f8O*XUgzrwf8&sJNnb_8*Q=JuJ_`7u>7PqlWU&*WB7LM3@8cwF23+wW&Ya7Z;zY# z_n9yltWI0fD#dV5=0(_&qd;2Z`NoN2*$fdD=Yo}WuQ6;0n8VmG^*66aeAd6k->o@; PiJZaH)z4*}Q$iB}c@IMH literal 0 HcmV?d00001 diff --git a/src/splash-plugins/fedora-fade-in/fedora-fade-in.c b/src/splash-plugins/fedora-fade-in/fedora-fade-in.c index 820a56c..f012ba0 100644 --- a/src/splash-plugins/fedora-fade-in/fedora-fade-in.c +++ b/src/splash-plugins/fedora-fade-in/fedora-fade-in.c @@ -1,6 +1,6 @@ /* fedora-fade-in.c - boot splash plugin * - * Copyright (C) 2007 Red Hat, Inc. + * Copyright (C) 2007, 2008 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 @@ -37,8 +37,10 @@ #include #include #include +#include #include "ply-boot-splash-plugin.h" +#include "ply-buffer.h" #include "ply-event-loop.h" #include "ply-list.h" #include "ply-logger.h" @@ -61,15 +63,32 @@ typedef struct double speed; } star_t; +typedef struct +{ + int x; + int y; + int number_of_bullets; +} entry_t; + struct _ply_boot_splash_plugin { ply_event_loop_t *loop; ply_frame_buffer_t *frame_buffer; ply_image_t *logo_image; ply_image_t *star_image; + ply_image_t *bullet_image; + ply_image_t *lock_image; + ply_image_t *entry_image; ply_list_t *stars; ply_window_t *window; + entry_t *entry; + + ply_boot_splash_password_answer_handler_t password_answer_handler; + void *password_answer_data; + + ply_buffer_t *keyboard_input_buffer; + double start_time; double now; }; @@ -83,14 +102,39 @@ create_plugin (void) plugin = calloc (1, sizeof (ply_boot_splash_plugin_t)); plugin->start_time = 0.0; + plugin->keyboard_input_buffer = ply_buffer_new (); + plugin->frame_buffer = ply_frame_buffer_new (NULL); plugin->logo_image = ply_image_new (PLYMOUTH_IMAGE_DIR "fedora-logo.png"); plugin->star_image = ply_image_new (PLYMOUTH_IMAGE_DIR "star.png"); + plugin->lock_image = ply_image_new (PLYMOUTH_IMAGE_DIR "lock.png"); + plugin->bullet_image = ply_image_new (PLYMOUTH_IMAGE_DIR "bullet.png"); + plugin->entry_image = ply_image_new (PLYMOUTH_IMAGE_DIR "entry.png"); plugin->stars = ply_list_new (); return plugin; } +static entry_t * +entry_new (int x, + int y) +{ + + entry_t *entry; + + entry = calloc (1, sizeof (entry_t)); + entry->x = x; + entry->y = y; + + return entry; +} + +static void +entry_free (entry_t *entry) +{ + free (entry); +} + star_t * star_new (int x, int y, @@ -146,9 +190,14 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin == NULL) return; + ply_buffer_free (plugin->keyboard_input_buffer); + free_stars (plugin); ply_image_free (plugin->logo_image); ply_image_free (plugin->star_image); + ply_image_free (plugin->bullet_image); + ply_image_free (plugin->entry_image); + ply_image_free (plugin->lock_image); ply_frame_buffer_free (plugin->frame_buffer); free (plugin); } @@ -222,6 +271,7 @@ animate_at_time (ply_boot_splash_plugin_t *plugin, ply_frame_buffer_unpause_updates (plugin->frame_buffer); } +static void draw_password_entry (ply_boot_splash_plugin_t *plugin); static void on_timeout (ply_boot_splash_plugin_t *plugin) { @@ -230,7 +280,6 @@ on_timeout (ply_boot_splash_plugin_t *plugin) ply_window_set_mode (plugin->window, PLY_WINDOW_MODE_GRAPHICS); plugin->now = ply_get_timestamp (); - /* The choice below is between * * 1) keeping a constant animation speed, and dropping @@ -304,8 +353,6 @@ stop_animation (ply_boot_splash_plugin_t *plugin) ply_frame_buffer_fill_with_color (plugin->frame_buffer, NULL, 0.0, 0.0, 0.0, 1.0); - ply_window_set_mode (plugin->window, PLY_WINDOW_MODE_TEXT); - if (plugin->loop != NULL) { ply_event_loop_stop_watching_for_timeout (plugin->loop, @@ -319,6 +366,7 @@ on_interrupt (ply_boot_splash_plugin_t *plugin) { ply_event_loop_exit (plugin->loop, 1); stop_animation (plugin); + ply_window_set_mode (plugin->window, PLY_WINDOW_MODE_TEXT); } static void @@ -352,6 +400,18 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, if (!ply_image_load (plugin->star_image)) return false; + ply_trace ("loading lock image"); + if (!ply_image_load (plugin->lock_image)) + return false; + + ply_trace ("loading bullet image"); + if (!ply_image_load (plugin->bullet_image)) + return false; + + ply_trace ("loading entry image"); + if (!ply_image_load (plugin->entry_image)) + return false; + ply_trace ("opening frame buffer"); if (!ply_frame_buffer_open (plugin->frame_buffer)) { @@ -473,12 +533,125 @@ hide_splash_screen (ply_boot_splash_plugin_t *plugin, } ply_frame_buffer_close (plugin->frame_buffer); + ply_window_set_mode (plugin->window, PLY_WINDOW_MODE_TEXT); +} +static void +draw_password_entry (ply_boot_splash_plugin_t *plugin) +{ + ply_frame_buffer_area_t lock_area, entry_area, bullet_area; + uint32_t *lock_data, *entry_data, *bullet_data; + int x, y, i; + + ply_frame_buffer_pause_updates (plugin->frame_buffer); + entry_data = ply_image_get_data (plugin->entry_image); + entry_area.width = ply_image_get_width (plugin->entry_image); + entry_area.height = ply_image_get_height (plugin->entry_image); + entry_area.x = plugin->entry->x; + entry_area.y = plugin->entry->y; + + ply_frame_buffer_fill_with_argb32_data (plugin->frame_buffer, + &entry_area, 0, 0, + entry_data); + + lock_data = ply_image_get_data (plugin->lock_image); + lock_area.width = ply_image_get_width (plugin->lock_image); + lock_area.height = ply_image_get_height (plugin->lock_image); + + x = plugin->entry->x - lock_area.width; + y = plugin->entry->y + entry_area.height / 2.0 - lock_area.height / 2.0; + + lock_area.x = x; + lock_area.y = y; + ply_frame_buffer_fill_with_argb32_data (plugin->frame_buffer, + &lock_area, 0, 0, + lock_data); + + + bullet_data = ply_image_get_data (plugin->bullet_image); + bullet_area.width = ply_image_get_width (plugin->bullet_image); + bullet_area.height = ply_image_get_height (plugin->bullet_image); + + for (i = 0; i < plugin->entry->number_of_bullets; i++) + { + bullet_area.x = plugin->entry->x + (i + 1) * bullet_area.width; + bullet_area.y = plugin->entry->y + entry_area.height / 2.0 - bullet_area.height / 2.0; + + ply_frame_buffer_fill_with_argb32_data (plugin->frame_buffer, + &bullet_area, 0, 0, + bullet_data); + } + ply_frame_buffer_unpause_updates (plugin->frame_buffer); +} + +static void +show_password_entry (ply_boot_splash_plugin_t *plugin) +{ + ply_frame_buffer_area_t area; + int x, y; + int lock_width, lock_height; + int entry_width, entry_height; + + assert (plugin != NULL); + + ply_frame_buffer_get_size (plugin->frame_buffer, &area); + lock_width = ply_image_get_width (plugin->lock_image); + lock_height = ply_image_get_height (plugin->lock_image); + + entry_width = ply_image_get_width (plugin->entry_image); + entry_height = ply_image_get_height (plugin->entry_image); + + x = area.width / 2.0 - (lock_width + entry_width) / 2.0 + lock_width; + y = area.height / 2.0 - entry_height / 2.0; + + plugin->entry = entry_new (x, y); + ply_frame_buffer_fill_with_color (plugin->frame_buffer, NULL, + 0.1, 0.1, .7, 1.0); + draw_password_entry (plugin); +} + +void +ask_for_password (ply_boot_splash_plugin_t *plugin, + ply_boot_splash_password_answer_handler_t answer_handler, + void *answer_data) +{ + plugin->password_answer_handler = answer_handler; + plugin->password_answer_data = answer_data; + + stop_animation (plugin); + show_password_entry (plugin); } void on_keyboard_input (ply_boot_splash_plugin_t *plugin, const char *keyboard_input) { + + ssize_t character_size; + + character_size = (ssize_t) mbrlen (keyboard_input, MB_CUR_MAX, NULL); + + if (character_size < 0) + return; + + if (plugin->password_answer_handler == NULL) + return; + + if (character_size == 1 && keyboard_input[0] == '\r') + { + plugin->password_answer_handler (plugin->password_answer_data, + ply_buffer_get_bytes (plugin->keyboard_input_buffer)); + ply_buffer_clear (plugin->keyboard_input_buffer); + plugin->password_answer_handler = NULL; + + start_animation (plugin); + return; + } + + ply_buffer_append_bytes (plugin->keyboard_input_buffer, + keyboard_input, character_size); + + plugin->entry->number_of_bullets++; + draw_password_entry (plugin); } ply_boot_splash_plugin_interface_t * @@ -491,6 +664,7 @@ ply_boot_splash_plugin_get_interface (void) .show_splash_screen = show_splash_screen, .update_status = update_status, .hide_splash_screen = hide_splash_screen, + .ask_for_password = ask_for_password, .on_keyboard_input = on_keyboard_input }; diff --git a/src/splash-plugins/fedora-fade-in/lock.png b/src/splash-plugins/fedora-fade-in/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..7ddd375166bcf021b55de719da0de0dfb0d2c0fe GIT binary patch literal 29126 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 wsOCkTAnj}IS&x-sy_BzNJQNVE@c{7u0Xfi