2007-06-10 Vesa Jaaskelainen <chaac@nic.fi>

* term/gfxterm.c (grub_gfxterm_init): Added support for specifying
        list of video modes.
This commit is contained in:
chaac 2007-06-10 17:31:03 +00:00
parent c0f90770b8
commit 29b0ed4617
2 changed files with 192 additions and 78 deletions

View file

@ -1,3 +1,8 @@
2007-06-10 Vesa Jaaskelainen <chaac@nic.fi>
* term/gfxterm.c (grub_gfxterm_init): Added support for specifying
list of video modes.
2007-06-06 Robert Millan <rmh@aybabtu.com> 2007-06-06 Robert Millan <rmh@aybabtu.com>
* util/update-grub_lib.in (convert_system_path_to_grub_path): Abort if * util/update-grub_lib.in (convert_system_path_to_grub_path): Abort if

View file

@ -202,8 +202,11 @@ grub_gfxterm_init (void)
if (modevar) if (modevar)
{ {
char *tmp; char *tmp;
char *next_mode;
char *current_mode;
char *param; char *param;
char *value; char *value;
int mode_found = 0;
/* Take copy of env.var. as we don't want to modify that. */ /* Take copy of env.var. as we don't want to modify that. */
tmp = grub_strdup (modevar); tmp = grub_strdup (modevar);
@ -211,110 +214,216 @@ grub_gfxterm_init (void)
if (grub_errno != GRUB_ERR_NONE) if (grub_errno != GRUB_ERR_NONE)
return grub_errno; return grub_errno;
/* Skip whitespace. */ /* Initialize next mode. */
while (grub_isspace (*tmp)) next_mode = modevar;
tmp++;
/* Loop until all modes has been tested out. */
/* Initialize token holders. */ while (next_mode != NULL)
param = tmp;
value = NULL;
/* Parse <width>x<height>[x<depth>]*/
/* Find width value. */
value = param;
param = grub_strchr(param, 'x');
if (param == NULL)
{ {
/* Free memory before returning. */ /* Use last next_mode as current mode. */
grub_free (modevar); tmp = next_mode;
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"Invalid argument: %s\n", /* Reset video mode settings. */
param); width = DEFAULT_VIDEO_WIDTH;
} height = DEFAULT_VIDEO_HEIGHT;
depth = -1;
*param = 0; flags = DEFAULT_VIDEO_FLAGS;
param++;
/* Save position of next mode and separate modes. */
width = grub_strtoul (value, 0, 0); next_mode = grub_strchr(next_mode, ';');
if (grub_errno != GRUB_ERR_NONE) if (next_mode)
{
/* Free memory before returning. */
grub_free (modevar);
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"Invalid argument: %s\n",
param);
}
/* 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)
{ {
*next_mode = 0;
next_mode++;
}
/* Skip whitespace. */
while (grub_isspace (*tmp))
tmp++;
/* Initialize token holders. */
current_mode = tmp;
param = tmp;
value = NULL;
/* Parse <width>x<height>[x<depth>]*/
/* 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. */ /* Free memory before returning. */
grub_free (modevar); grub_free (modevar);
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"Invalid argument: %s\n", return rc;
param);
} }
}
else
{
/* We have optional color depth value. */
*param = 0; *param = 0;
param++; param++;
height = grub_strtoul (value, 0, 0); width = grub_strtoul (value, 0, 0);
if (grub_errno != GRUB_ERR_NONE) 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. */ /* Free memory before returning. */
grub_free (modevar); grub_free (modevar);
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"Invalid argument: %s\n", return rc;
param);
} }
/* Convert color depth value. */ /* Find height value. */
value = param; value = param;
depth = grub_strtoul (value, 0, 0); param = grub_strchr(param, 'x');
if (grub_errno != GRUB_ERR_NONE) if (param == NULL)
{ {
/* Free memory before returning. */ height = grub_strtoul (value, 0, 0);
grub_free (modevar); if (grub_errno != GRUB_ERR_NONE)
return grub_error (GRUB_ERR_BAD_ARGUMENT, {
"Invalid argument: %s\n", grub_err_t rc;
param);
/* 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. */ /* Free memory. */
grub_free (modevar); 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;
/* If we have 8 or less bits, then assuem that it is indexed color mode. */ /* We have more than 8 bits, then assume that it is RGB color mode. */
if ((depth <= 8) && (depth != -1)) if (depth > 8)
flags |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR; flags |= GRUB_VIDEO_MODE_TYPE_RGB;
/* We have more than 8 bits, then assume that it is RGB color mode. */ /* If user requested specific depth, forward that information to driver. */
if (depth > 8) if (depth != -1)
flags |= GRUB_VIDEO_MODE_TYPE_RGB; flags |= (depth << GRUB_VIDEO_MODE_TYPE_DEPTH_POS)
& GRUB_VIDEO_MODE_TYPE_DEPTH_MASK;
/* If user requested specific depth, forward that information to driver. */ /* Initialize user requested mode. */
if (depth != -1) if (grub_video_setup (width, height, flags) != GRUB_ERR_NONE)
flags |= (depth << GRUB_VIDEO_MODE_TYPE_DEPTH_POS) return grub_errno;
& GRUB_VIDEO_MODE_TYPE_DEPTH_MASK;
/* Initialize user requested mode. */ /* Figure out what mode we ended up. */
if (grub_video_setup (width, height, flags) != GRUB_ERR_NONE) if (grub_video_get_info (&mode_info) != GRUB_ERR_NONE)
return grub_errno; {
grub_video_restore ();
/* Figure out what mode we ended up. */ return grub_errno;
if (grub_video_get_info (&mode_info) != GRUB_ERR_NONE) }
return grub_errno; }
/* Make sure screen is black. */ /* Make sure screen is black. */
color = grub_video_map_rgb (0, 0, 0); color = grub_video_map_rgb (0, 0, 0);