grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] background_color command


From: Colin Watson
Subject: [PATCH] background_color command
Date: Fri, 10 Dec 2010 12:39:42 +0000
User-agent: Mutt/1.5.18 (2008-05-17)

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  <address@hidden>

        * 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                                       address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]