mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 01:20:42 -05:00
MonitorXrandr: update the internal data structures after applying
We were relying on the XRandR events from the X server to update the configuration, but we were calling meta_monitor_config_update_current() immediately after, so the MonitorConfig would be updated with the old configuration (and we would save that to disk!) https://bugzilla.gnome.org/show_bug.cgi?id=705670
This commit is contained in:
parent
3528b067d0
commit
3112794d83
@ -705,6 +705,12 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
None,
|
None,
|
||||||
RR_Rotate_0,
|
RR_Rotate_0,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
|
|
||||||
|
crtc->rect.x = 0;
|
||||||
|
crtc->rect.y = 0;
|
||||||
|
crtc->rect.width = 0;
|
||||||
|
crtc->rect.height = 0;
|
||||||
|
crtc->current_mode = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -729,6 +735,12 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
None,
|
None,
|
||||||
RR_Rotate_0,
|
RR_Rotate_0,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
|
|
||||||
|
crtc->rect.x = 0;
|
||||||
|
crtc->rect.y = 0;
|
||||||
|
crtc->rect.width = 0;
|
||||||
|
crtc->rect.height = 0;
|
||||||
|
crtc->current_mode = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert (width > 0 && height > 0);
|
g_assert (width > 0 && height > 0);
|
||||||
@ -755,6 +767,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
MetaMonitorMode *mode;
|
MetaMonitorMode *mode;
|
||||||
XID *outputs;
|
XID *outputs;
|
||||||
int j, n_outputs;
|
int j, n_outputs;
|
||||||
|
int width, height;
|
||||||
Status ok;
|
Status ok;
|
||||||
|
|
||||||
mode = crtc_info->mode;
|
mode = crtc_info->mode;
|
||||||
@ -777,18 +790,50 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
meta_error_trap_pop (meta_get_display ());
|
meta_error_trap_pop (meta_get_display ());
|
||||||
|
|
||||||
if (ok != Success)
|
if (ok != Success)
|
||||||
meta_warning ("Configuring CRTC %d with mode %d (%d x %d @ %f) at position %d, %d and transfrom %u failed\n",
|
{
|
||||||
(unsigned)(crtc->crtc_id), (unsigned)(mode->mode_id),
|
meta_warning ("Configuring CRTC %d with mode %d (%d x %d @ %f) at position %d, %d and transfrom %u failed\n",
|
||||||
mode->width, mode->height, (float)mode->refresh_rate,
|
(unsigned)(crtc->crtc_id), (unsigned)(mode->mode_id),
|
||||||
crtc_info->x, crtc_info->y, crtc_info->transform);
|
mode->width, mode->height, (float)mode->refresh_rate,
|
||||||
|
crtc_info->x, crtc_info->y, crtc_info->transform);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
g_free (outputs);
|
g_free (outputs);
|
||||||
|
|
||||||
|
if (meta_monitor_transform_is_rotated (crtc_info->transform))
|
||||||
|
{
|
||||||
|
width = mode->height;
|
||||||
|
height = mode->width;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
width = mode->width;
|
||||||
|
height = mode->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
crtc->rect.x = crtc_info->x;
|
||||||
|
crtc->rect.y = crtc_info->y;
|
||||||
|
crtc->rect.width = width;
|
||||||
|
crtc->rect.height = height;
|
||||||
|
crtc->current_mode = mode;
|
||||||
|
crtc->transform = crtc_info->transform;
|
||||||
|
|
||||||
|
for (j = 0; j < n_outputs; j++)
|
||||||
|
{
|
||||||
|
MetaOutput *output;
|
||||||
|
|
||||||
|
output = ((MetaOutput**)crtc_info->outputs->pdata)[j];
|
||||||
|
|
||||||
|
output->is_dirty = TRUE;
|
||||||
|
output->crtc = crtc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < n_outputs; i++)
|
for (i = 0; i < n_outputs; i++)
|
||||||
{
|
{
|
||||||
MetaOutputInfo *output_info = outputs[i];
|
MetaOutputInfo *output_info = outputs[i];
|
||||||
|
MetaOutput *output = output_info->output;
|
||||||
|
|
||||||
if (output_info->is_primary)
|
if (output_info->is_primary)
|
||||||
{
|
{
|
||||||
@ -800,6 +845,24 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
output_set_presentation_xrandr (manager_xrandr,
|
output_set_presentation_xrandr (manager_xrandr,
|
||||||
output_info->output,
|
output_info->output,
|
||||||
output_info->is_presentation);
|
output_info->is_presentation);
|
||||||
|
|
||||||
|
output->is_primary = output_info->is_primary;
|
||||||
|
output->is_presentation = output_info->is_presentation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable outputs not mentioned in the list */
|
||||||
|
for (i = 0; i < manager->n_outputs; i++)
|
||||||
|
{
|
||||||
|
MetaOutput *output = &manager->outputs[i];
|
||||||
|
|
||||||
|
if (output->is_dirty)
|
||||||
|
{
|
||||||
|
output->is_dirty = FALSE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
output->crtc = NULL;
|
||||||
|
output->is_primary = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_display_ungrab (meta_get_display ());
|
meta_display_ungrab (meta_get_display ());
|
||||||
|
Loading…
Reference in New Issue
Block a user