All of lore.kernel.org
 help / color / mirror / Atom feed
From: chaac@nic.fi
To: grub-devel@gnu.org
Subject: patch to allow modelist for gfxterm
Date: Wed, 30 May 2007 10:04:26 +0300 (EEST)	[thread overview]
Message-ID: <9513677.619671180508666760.JavaMail.chaac@nic.fi> (raw)

[-- Attachment #1: Type: text/plain, Size: 545 bytes --]

Hi All,

I am on the road at the moment so this is not polished, but I would like to get comments from you, how it works and what you think about integrating it to cvs.

Example:

set gfxmode="1024x768;800x600;640x480"

And when gfxterm is initialized it would first try out first mode and then second and so on... In order to support wide screens I think those modes would be need to be listed first or otherwise they will fallback to "standard" aspect ratio.

Patch should be attached in this message.

Thanks,
Vesa Jääskeläinen

[-- Attachment #2: grub2-gfxterm.patch --]
[-- Type: text/x-patch, Size: 11008 bytes --]

Index: ChangeLog
===================================================================
RCS file: /sources/grub/grub2/ChangeLog,v
retrieving revision 1.375
diff -u -r1.375 ChangeLog
--- ChangeLog	20 May 2007 09:10:05 -0000	1.375
+++ ChangeLog	30 May 2007 06:00:57 -0000
@@ -1,3 +1,8 @@
+2007-05-30  Vesa Jaaskelainen  <chaac@nic.fi>
+
+	* term/gfxterm.c (grub_gfxterm_init): Added support for specifying
+	list of video modes. 
+
 2007-05-20  Robert Millan  <rmh@aybabtu.com>
 
 	* util/update-grub_lib.in: New file.
Index: term/gfxterm.c
===================================================================
RCS file: /sources/grub/grub2/term/gfxterm.c,v
retrieving revision 1.3
diff -u -r1.3 gfxterm.c
--- term/gfxterm.c	31 Jul 2006 14:21:35 -0000	1.3
+++ term/gfxterm.c	30 May 2007 06:00:58 -0000
@@ -202,8 +202,11 @@
   if (modevar)
     {
       char *tmp;
+      char *next_mode;
+      char *current_mode;
       char *param;
       char *value;
+      int mode_found = 0;
 
       /* Take copy of env.var. as we don't want to modify that.  */
       tmp = grub_strdup (modevar);
@@ -211,110 +214,216 @@
 
       if (grub_errno != GRUB_ERR_NONE)
         return grub_errno;
-
-      /* Skip whitespace.  */
-      while (grub_isspace (*tmp))
-        tmp++;
-
-      /* Initialize token holders.  */
-      param = tmp;
-      value = NULL;
-
-      /* Parse <width>x<height>[x<depth>]*/
-
-      /* Find width value.  */
-      value = param;
-      param = grub_strchr(param, 'x');
-      if (param == NULL)
+        
+      /* Initialize next mode.  */
+      next_mode = modevar;
+      
+      /* Loop until all modes has been tested out.  */
+      while (next_mode != NULL)
         {
-          /* Free memory before returning.  */
-          grub_free (modevar);
-          return grub_error (GRUB_ERR_BAD_ARGUMENT, 
-                             "Invalid argument: %s\n",
-                             param);
-        }
+          /* Use last next_mode as current mode.  */
+          tmp = next_mode;
+          
+          /* Reset video mode settings.  */
+          width = DEFAULT_VIDEO_WIDTH;
+          height = DEFAULT_VIDEO_HEIGHT;
+          depth = -1;
+          flags = DEFAULT_VIDEO_FLAGS;
+        
+          /* Save position of next mode and separate modes.  */
+          next_mode = grub_strchr(next_mode, ';');
+          if (next_mode)
+            {
+              *next_mode = 0;
+              next_mode++;
+            }
 
-      *param = 0;
-      param++;
+          /* Skip whitespace.  */
+          while (grub_isspace (*tmp))
+            tmp++;
+
+          /* Initialize token holders.  */
+          current_mode = tmp;
+          param = tmp;
+          value = NULL;
 
-      width = grub_strtoul (value, 0, 0);
-      if (grub_errno != GRUB_ERR_NONE)
-        {
-          /* Free memory before returning.  */
-          grub_free (modevar);
-          return grub_error (GRUB_ERR_BAD_ARGUMENT, 
-                             "Invalid argument: %s\n",
-                             param);
-        }
+          /* Parse <width>x<height>[x<depth>]*/
 
-      /* Find height value.  */
-      value = param;
-      param = grub_strchr(param, 'x');
-      if (param == NULL)
-        {
-          height = grub_strtoul (value, 0, 0);
-          if (grub_errno != GRUB_ERR_NONE)
+          /* Find width value.  */
+          value = param;
+          param = grub_strchr(param, 'x');
+          if (param == NULL)
             {
+              grub_err_t rc;
+              
+              /* First setup error message.  */
+              rc = grub_error (GRUB_ERR_BAD_ARGUMENT, 
+                                "Invalid mode: %s\n",
+                                current_mode);
+              
               /* Free memory before returning.  */
               grub_free (modevar);
-              return grub_error (GRUB_ERR_BAD_ARGUMENT, 
-                                 "Invalid argument: %s\n",
-                                 param);
+              
+              return rc;
             }
-        }
-      else
-        {
-          /* We have optional color depth value.  */
+
           *param = 0;
           param++;
 
-          height = grub_strtoul (value, 0, 0);
+          width = grub_strtoul (value, 0, 0);
           if (grub_errno != GRUB_ERR_NONE)
             {
+              grub_err_t rc;
+              
+              /* First setup error message.  */
+              rc = grub_error (GRUB_ERR_BAD_ARGUMENT, 
+                               "Invalid mode: %s\n",
+                               current_mode);
+              
               /* Free memory before returning.  */
               grub_free (modevar);
-              return grub_error (GRUB_ERR_BAD_ARGUMENT, 
-                                 "Invalid argument: %s\n",
-                                 param);
+              
+              return rc;
             }
 
-          /* Convert color depth value.  */
+          /* Find height value.  */
           value = param;
-          depth = grub_strtoul (value, 0, 0);
-          if (grub_errno != GRUB_ERR_NONE)
+          param = grub_strchr(param, 'x');
+          if (param == NULL)
             {
-              /* Free memory before returning.  */
-              grub_free (modevar);
-              return grub_error (GRUB_ERR_BAD_ARGUMENT, 
-                                 "Invalid argument: %s\n",
-                                 param);
+              height = grub_strtoul (value, 0, 0);
+              if (grub_errno != GRUB_ERR_NONE)
+                {
+                  grub_err_t rc;
+                  
+                  /* First setup error message.  */
+                  rc = grub_error (GRUB_ERR_BAD_ARGUMENT, 
+                                   "Invalid mode: %s\n",
+                                   current_mode);
+                                   
+                  /* Free memory before returning.  */
+                  grub_free (modevar);
+                  
+                  return rc;
+                }
+            }
+          else
+            {
+              /* We have optional color depth value.  */
+              *param = 0;
+              param++;
+
+              height = grub_strtoul (value, 0, 0);
+              if (grub_errno != GRUB_ERR_NONE)
+                {
+                  grub_err_t rc;
+                  
+                  /* First setup error message.  */
+                  rc = grub_error (GRUB_ERR_BAD_ARGUMENT, 
+                                   "Invalid mode: %s\n",
+                                   current_mode);
+                                   
+                  /* Free memory before returning.  */
+                  grub_free (modevar);
+                  
+                  return rc;
+                }
+
+              /* Convert color depth value.  */
+              value = param;
+              depth = grub_strtoul (value, 0, 0);
+              if (grub_errno != GRUB_ERR_NONE)
+                {
+                  grub_err_t rc;
+                  
+                  /* First setup error message.  */
+                  rc = grub_error (GRUB_ERR_BAD_ARGUMENT, 
+                                   "Invalid mode: %s\n",
+                                   current_mode);
+                                   
+                  /* Free memory before returning.  */
+                  grub_free (modevar);
+                  
+                  return rc;
+                }
+            }
+          
+          /* Try out video mode.  */
+          
+          /* If we have 8 or less bits, then assuem that it is indexed color mode.  */
+          if ((depth <= 8) && (depth != -1))
+            flags |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
+
+          /* We have more than 8 bits, then assume that it is RGB color mode.  */
+          if (depth > 8)
+            flags |= GRUB_VIDEO_MODE_TYPE_RGB;
+
+          /* If user requested specific depth, forward that information to driver.  */
+          if (depth != -1)
+            flags |= (depth << GRUB_VIDEO_MODE_TYPE_DEPTH_POS)
+                     & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK;
+
+          /* Try to initialize requested mode.  Ignore any errors.  */
+          grub_error_push ();
+          if (grub_video_setup (width, height, flags) != GRUB_ERR_NONE)
+            {
+              grub_error_pop ();
+              continue;
+            }
+            
+          /* Figure out what mode we ended up.  */
+          if (grub_video_get_info (&mode_info) != GRUB_ERR_NONE)
+            {
+              /* Couldn't get video mode info, restore old mode and continue to next one.  */
+              grub_error_pop ();
+              
+              grub_video_restore ();
+              continue;
             }
+          
+          /* Restore state of error stack.  */
+          grub_error_pop ();
+          
+          /* Mode found!  Exit loop.  */
+          mode_found = 1;
+          break;
         }
 
       /* Free memory.  */
       grub_free (modevar);
+      
+      if (!mode_found)
+        return grub_error (GRUB_ERR_BAD_ARGUMENT,
+                           "No suitable mode found.");
     }
+  else
+    {
+      /* No gfxmode variable set, use defaults.  */
+      
+      /* If we have 8 or less bits, then assuem that it is indexed color mode.  */
+      if ((depth <= 8) && (depth != -1))
+        flags |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
+
+      /* We have more than 8 bits, then assume that it is RGB color mode.  */
+      if (depth > 8)
+        flags |= GRUB_VIDEO_MODE_TYPE_RGB;
+
+      /* If user requested specific depth, forward that information to driver.  */
+      if (depth != -1)
+        flags |= (depth << GRUB_VIDEO_MODE_TYPE_DEPTH_POS)
+                 & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK;
+
+      /* Initialize user requested mode.  */
+      if (grub_video_setup (width, height, flags) != GRUB_ERR_NONE)
+        return grub_errno;
 
-  /* If we have 8 or less bits, then assuem that it is indexed color mode.  */
-  if ((depth <= 8) && (depth != -1))
-    flags |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
-
-  /* We have more than 8 bits, then assume that it is RGB color mode.  */
-  if (depth > 8)
-    flags |= GRUB_VIDEO_MODE_TYPE_RGB;
-
-  /* If user requested specific depth, forward that information to driver.  */
-  if (depth != -1)
-    flags |= (depth << GRUB_VIDEO_MODE_TYPE_DEPTH_POS)
-             & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK;
-
-  /* Initialize user requested mode.  */
-  if (grub_video_setup (width, height, flags) != GRUB_ERR_NONE)
-    return grub_errno;
-
-  /* Figure out what mode we ended up.  */
-  if (grub_video_get_info (&mode_info) != GRUB_ERR_NONE)
-    return grub_errno;
+      /* Figure out what mode we ended up.  */
+      if (grub_video_get_info (&mode_info) != GRUB_ERR_NONE)
+        {
+          grub_video_restore ();
+          return grub_errno;
+        }
+    }
 
   /* Make sure screen is black.  */
   color = grub_video_map_rgb (0, 0, 0);

             reply	other threads:[~2007-05-30  7:04 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-30  7:04 chaac [this message]
2007-06-10 17:36 ` patch to allow modelist for gfxterm Vesa Jääskeläinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9513677.619671180508666760.JavaMail.chaac@nic.fi \
    --to=chaac@nic.fi \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.