This patch adds a background_color command to gfxterm, which is useful if you just want a simple background fill and don't want to have to worry about scaling a background image to the right size.
2010-12-10 Colin Watson <[email protected]> * grub-core/term/gfxterm.c (grub_gfxterm_background_color_cmd): New function. (GRUB_MOD_INIT): Register background_color command. (GRUB_MOD_FINI): Unregister background_color command. === modified file 'grub-core/term/gfxterm.c' --- grub-core/term/gfxterm.c 2010-09-14 21:06:01 +0000 +++ grub-core/term/gfxterm.c 2010-12-10 11:22:37 +0000 @@ -1180,6 +1180,76 @@ grub_gfxterm_background_image_cmd (grub_ return grub_errno; } +static grub_err_t +grub_gfxterm_background_color_cmd (grub_command_t cmd __attribute__ ((unused)), + int argc, char **args) +{ + int i; + unsigned int j; + unsigned long raw_color; + grub_uint8_t red, green, blue; + grub_uint8_t *data; + + if (argc != 1) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing operand"); + + /* Check that we have video adapter active. */ + if (grub_video_get_info(NULL) != GRUB_ERR_NONE) + return grub_errno; + + for (i = 0; i < 7 && args[0][i]; i++) + if ((args[0][i] < '0' || args[0][i] > '9') + && (args[0][i] < 'a' || args[0][i] > 'f') + && (args[0][i] < 'A' || args[0][i] > 'F')) + break; + + if (i != 6) + return grub_error (GRUB_ERR_BAD_ARGUMENT, + "color `%s' is not in RRGGBB form", args[0]); + + raw_color = grub_strtoul (args[0], 0, 16); + red = (raw_color >> 16) & 0xFF; + green = (raw_color >> 8) & 0xFF; + blue = raw_color & 0xFF; + + /* Destroy existing background bitmap if loaded. */ + if (bitmap) + { + grub_video_bitmap_destroy (bitmap); + bitmap = 0; + + /* Mark whole screen as dirty. */ + dirty_region_add (0, 0, window.width, window.height); + } + + /* Create a filled bitmap so that we get suitable text blending. */ + grub_video_bitmap_create (&bitmap, window.width, window.height, + GRUB_VIDEO_BLIT_FORMAT_RGB_888); + if (grub_errno != GRUB_ERR_NONE) + return grub_errno; + + data = bitmap->data; + for (j = 0; j < window.height * window.width; j++) + { + *data++ = red; + *data++ = green; + *data++ = blue; + } + + bitmap_width = window.width; + bitmap_height = window.height; + + /* Set the border color. */ + virtual_screen.bg_color_display = grub_video_map_rgb (red, green, blue); + + /* Mark whole screen as dirty. */ + dirty_region_add (0, 0, window.width, window.height); + + /* All was ok. */ + grub_errno = GRUB_ERR_NONE; + return grub_errno; +} + static struct grub_term_output grub_video_term = { .name = "gfxterm", @@ -1201,6 +1271,7 @@ static struct grub_term_output grub_vide }; static grub_extcmd_t background_image_cmd_handle; +static grub_command_t background_color_cmd_handle; GRUB_MOD_INIT(gfxterm) { @@ -1211,10 +1282,16 @@ GRUB_MOD_INIT(gfxterm) N_("[-m (stretch|normal)] FILE"), N_("Load background image for active terminal."), background_image_cmd_options); + background_color_cmd_handle = + grub_register_command ("background_color", + grub_gfxterm_background_color_cmd, + N_("RRGGBB"), + N_("Set background color for active terminal.")); } GRUB_MOD_FINI(gfxterm) { + grub_unregister_command (background_color_cmd_handle); grub_unregister_extcmd (background_image_cmd_handle); grub_term_unregister_output (&grub_video_term); } Thanks, -- Colin Watson [[email protected]] _______________________________________________ Grub-devel mailing list [email protected] http://lists.gnu.org/mailman/listinfo/grub-devel
