displayio: further ensure just one start_terminal call

@cwalther determined that for boards with 2 displays (monster m4sk),
start_terminal would be called for each one, leaking supervisor heap
entries.

Determine, by comparing addresses, whether the display being acted on
is the first display (number zero) and do (or do not) call start_terminal.

stop_terminal can safely be called multiple times, so there's no need
to guard against calling it more than once.

Slight behavioral change: The terminal size would follow the displays[0]
size, not the displays[1] size
This commit is contained in:
Jeff Epler 2020-10-13 16:57:09 -05:00
parent a57c5a10f6
commit 88d07ef35b
3 changed files with 12 additions and 5 deletions

View File

@ -347,8 +347,10 @@ void common_hal_displayio_display_set_rotation(displayio_display_obj_t* self, in
self->core.height = tmp;
}
displayio_display_core_set_rotation(&self->core, rotation);
supervisor_stop_terminal();
supervisor_start_terminal(self->core.width, self->core.height);
if (self == &displays[0].display) {
supervisor_stop_terminal();
supervisor_start_terminal(self->core.width, self->core.height);
}
if (self->core.current_group != NULL) {
displayio_group_update_transform(self->core.current_group, &self->core.transform);
}

View File

@ -85,7 +85,10 @@ void displayio_display_core_construct(displayio_display_core_t* self,
self->bus = bus;
supervisor_start_terminal(width, height);
// (offsetof core is equal in all display types)
if (self == &displays[0].display.core) {
supervisor_start_terminal(width, height);
}
self->width = width;
self->height = height;

View File

@ -280,8 +280,10 @@ void common_hal_framebufferio_framebufferdisplay_set_rotation(framebufferio_fram
self->core.height = tmp;
}
displayio_display_core_set_rotation(&self->core, rotation);
supervisor_stop_terminal();
supervisor_start_terminal(self->core.width, self->core.height);
if (self == &displays[0].framebuffer_display) {
supervisor_stop_terminal();
supervisor_start_terminal(self->core.width, self->core.height);
}
if (self->core.current_group != NULL) {
displayio_group_update_transform(self->core.current_group, &self->core.transform);
}