Make config file preferred mode override monitor preferred mode.

Add a new even-more-preferred bit to each mode which is used to make config
file preferences selected instead of the monitor preferred mode.
This commit is contained in:
Keith Packard 2007-10-17 11:42:28 +08:00
parent f2da10f7bc
commit feac075952
3 changed files with 28 additions and 31 deletions

View File

@ -142,6 +142,7 @@ typedef enum {
# define M_T_DEFAULT 0x10 /* (VESA) default modes */ # define M_T_DEFAULT 0x10 /* (VESA) default modes */
# define M_T_USERDEF 0x20 /* One of the modes from the config file */ # define M_T_USERDEF 0x20 /* One of the modes from the config file */
# define M_T_DRIVER 0x40 /* Supplied by the driver (EDID, etc) */ # define M_T_DRIVER 0x40 /* Supplied by the driver (EDID, etc) */
# define M_T_USERPREF 0x80 /* mode preferred by the user config */
/* Video mode */ /* Video mode */
typedef struct _DisplayModeRec { typedef struct _DisplayModeRec {

View File

@ -711,7 +711,8 @@ xf86DefaultMode (xf86OutputPtr output, int width, int height)
for (mode = output->probed_modes; mode; mode = mode->next) for (mode = output->probed_modes; mode; mode = mode->next)
{ {
int dpi; int dpi;
int preferred = (mode->type & M_T_PREFERRED) != 0; int preferred = (((mode->type & M_T_PREFERRED) != 0) +
((mode->type & M_T_USERPREF) != 0));
int diff; int diff;
if (xf86ModeWidth (mode, output->initial_rotation) > width || if (xf86ModeWidth (mode, output->initial_rotation) > width ||
@ -1415,7 +1416,7 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
mode->prev = NULL; mode->prev = NULL;
output->probed_modes = mode; output->probed_modes = mode;
} }
mode->type |= M_T_PREFERRED; mode->type |= (M_T_PREFERRED|M_T_USERPREF);
} }
else else
mode->type &= ~M_T_PREFERRED; mode->type &= ~M_T_PREFERRED;
@ -1532,6 +1533,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
int o, c; int o, c;
DisplayModePtr target_mode = NULL; DisplayModePtr target_mode = NULL;
int target_preferred = 0;
Rotation target_rotation = RR_Rotate_0; Rotation target_rotation = RR_Rotate_0;
xf86CrtcPtr *crtcs; xf86CrtcPtr *crtcs;
DisplayModePtr *modes; DisplayModePtr *modes;
@ -1572,43 +1574,34 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
} }
/* /*
* Let outputs with preferred modes drive screen size * User preferred > preferred > other modes
*/ */
for (o = 0; o < config->num_output; o++) for (o = 0; o < config->num_output; o++)
{ {
xf86OutputPtr output = config->output[o]; xf86OutputPtr output = config->output[o];
DisplayModePtr default_mode;
int default_preferred;
if (enabled[o] && if (!enabled[o])
xf86OutputHasPreferredMode (output, width, height)) continue;
default_mode = xf86DefaultMode (output, width, height);
if (!default_mode)
continue;
default_preferred = (((default_mode->type & M_T_PREFERRED) != 0) +
((default_mode->type & M_T_USERPREF) != 0));
if (default_preferred > target_preferred || !target_mode)
{ {
target_mode = xf86DefaultMode (output, width, height); target_mode = default_mode;
target_preferred = default_preferred;
target_rotation = output->initial_rotation; target_rotation = output->initial_rotation;
if (target_mode) config->compat_output = o;
{
modes[o] = target_mode;
config->compat_output = o;
break;
}
}
}
if (!target_mode)
{
for (o = 0; o < config->num_output; o++)
{
xf86OutputPtr output = config->output[o];
if (enabled[o])
{
target_mode = xf86DefaultMode (output, width, height);
target_rotation = output->initial_rotation;
if (target_mode)
{
modes[o] = target_mode;
config->compat_output = o;
break;
}
}
} }
} }
if (target_mode)
modes[config->compat_output] = target_mode;
/*
* Fill in other output modes
*/
for (o = 0; o < config->num_output; o++) for (o = 0; o < config->num_output; o++)
{ {
xf86OutputPtr output = config->output[o]; xf86OutputPtr output = config->output[o];

View File

@ -39,6 +39,9 @@
#ifndef M_T_DRIVER #ifndef M_T_DRIVER
#define M_T_DRIVER 0x40 #define M_T_DRIVER 0x40
#endif #endif
#ifndef M_T_USERPREF
#define M_T_USERPREF 0x80
#endif
#ifndef HARDWARE_CURSOR_ARGB #ifndef HARDWARE_CURSOR_ARGB
#define HARDWARE_CURSOR_ARGB 0x00004000 #define HARDWARE_CURSOR_ARGB 0x00004000
#endif #endif