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:
parent
c0f90770b8
commit
29b0ed4617
2 changed files with 192 additions and 78 deletions
|
@ -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
|
||||||
|
|
265
term/gfxterm.c
265
term/gfxterm.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue