Render saved buffers with the surface's dimensions

This commit is contained in:
Ryan Dwyer 2018-06-29 21:13:22 +10:00
parent a2fbb20a61
commit 3a6ed5110c
3 changed files with 25 additions and 13 deletions

View file

@ -52,11 +52,16 @@ void transaction_notify_view_ready_by_size(struct sway_view *view,
int width, int height); int width, int height);
/** /**
* Get the texture that should be rendered for a view. * Get the saved texture that should be rendered for a view.
* *
* In most cases this will return the normal live texture for a view, but if the * The addresses pointed at by the width and height pointers will be populated
* view is in a transaction then it'll return a saved texture. * with the surface's dimensions, which may be different to the texture's
* dimensions if output scaling is used.
*
* This function should only be called if it is known that the view has
* instructions.
*/ */
struct wlr_texture *transaction_get_texture(struct sway_view *view); struct wlr_texture *transaction_get_saved_texture(struct sway_view *view,
int *width, int *height);
#endif #endif

View file

@ -354,15 +354,17 @@ static void render_saved_view(struct sway_view *view,
struct sway_output *output, pixman_region32_t *damage, float alpha) { struct sway_output *output, pixman_region32_t *damage, float alpha) {
struct wlr_output *wlr_output = output->wlr_output; struct wlr_output *wlr_output = output->wlr_output;
struct wlr_texture *texture = transaction_get_texture(view); int width, height;
struct wlr_texture *texture =
transaction_get_saved_texture(view, &width, &height);
if (!texture) { if (!texture) {
return; return;
} }
struct wlr_box box = { struct wlr_box box = {
.x = view->swayc->current.view_x - output->swayc->current.swayc_x, .x = view->swayc->current.view_x - output->swayc->current.swayc_x,
.y = view->swayc->current.view_y - output->swayc->current.swayc_y, .y = view->swayc->current.view_y - output->swayc->current.swayc_y,
.width = view->swayc->current.view_width, .width = width,
.height = view->swayc->current.view_height, .height = height,
}; };
struct wlr_box output_box = { struct wlr_box output_box = {

View file

@ -41,6 +41,7 @@ struct sway_transaction_instruction {
struct sway_container *container; struct sway_container *container;
struct sway_container_state state; struct sway_container_state state;
struct wlr_buffer *saved_buffer; struct wlr_buffer *saved_buffer;
int saved_buffer_width, saved_buffer_height;
uint32_t serial; uint32_t serial;
bool ready; bool ready;
}; };
@ -71,6 +72,8 @@ static void save_view_buffer(struct sway_view *view,
} }
if (view->surface && wlr_surface_has_buffer(view->surface)) { if (view->surface && wlr_surface_has_buffer(view->surface)) {
instruction->saved_buffer = wlr_buffer_ref(view->surface->buffer); instruction->saved_buffer = wlr_buffer_ref(view->surface->buffer);
instruction->saved_buffer_width = view->surface->current->width;
instruction->saved_buffer_height = view->surface->current->height;
} }
} }
@ -392,12 +395,14 @@ void transaction_notify_view_ready_by_size(struct sway_view *view,
} }
} }
struct wlr_texture *transaction_get_texture(struct sway_view *view) { struct wlr_texture *transaction_get_saved_texture(struct sway_view *view,
if (!view->swayc || !view->swayc->instructions->length) { int *width, int *height) {
return view->surface->buffer->texture;
}
struct sway_transaction_instruction *instruction = struct sway_transaction_instruction *instruction =
view->swayc->instructions->items[0]; view->swayc->instructions->items[0];
return instruction->saved_buffer ? if (!instruction->saved_buffer) {
instruction->saved_buffer->texture : NULL; return NULL;
}
*width = instruction->saved_buffer_width;
*height = instruction->saved_buffer_height;
return instruction->saved_buffer->texture;
} }