compositor: Refactor weston_output_mode_switch()

This breaks weston_output_mode_switch() into 3 functions:
weston_output_mode_set_native()
weston_output_mode_switch_to_temporary()
weston_output_mode_switch_to_native()

Differences from previous behaviour:
SET_NATIVE didn't set current_scale (now it does)
SET_TEMPORARY could set mode and scale independently - now it can't.

Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Pekka Paalanen <pekka.paalanen@collabora.co.uk>
dev
Derek Foreman 10 years ago committed by Pekka Paalanen
parent 61a9bf5557
commit 6ae7bc982f
  1. 12
      desktop-shell/shell.c
  2. 13
      fullscreen-shell/fullscreen-shell.c
  3. 2
      src/compositor-rdp.c
  4. 185
      src/compositor.c
  5. 17
      src/compositor.h

@ -2247,12 +2247,8 @@ shell_surface_set_class(struct wl_client *client,
static void static void
restore_output_mode(struct weston_output *output) restore_output_mode(struct weston_output *output)
{ {
if (output->original_mode || if (output->original_mode)
(int32_t)output->current_scale != output->original_scale) weston_output_mode_switch_to_native(output);
weston_output_switch_mode(output,
output->native_mode,
output->native_scale,
WESTON_MODE_SWITCH_RESTORE_NATIVE);
} }
static void static void
@ -2876,8 +2872,8 @@ shell_configure_fullscreen(struct shell_surface *shsurf)
surf_height * surface->buffer_viewport.buffer.scale, surf_height * surface->buffer_viewport.buffer.scale,
shsurf->fullscreen.framerate}; shsurf->fullscreen.framerate};
if (weston_output_switch_mode(output, &mode, surface->buffer_viewport.buffer.scale, if (weston_output_mode_switch_to_temporary(output, &mode,
WESTON_MODE_SWITCH_SET_TEMPORARY) == 0) { surface->buffer_viewport.buffer.scale) == 0) {
weston_view_set_position(shsurf->view, weston_view_set_position(shsurf->view,
output->x - surf_x, output->x - surf_x,
output->y - surf_y); output->y - surf_y);

@ -284,12 +284,8 @@ fs_output_for_output(struct weston_output *output)
static void static void
restore_output_mode(struct weston_output *output) restore_output_mode(struct weston_output *output)
{ {
if (output->original_mode || if (output->original_mode)
(int32_t)output->current_scale != output->original_scale) weston_output_mode_switch_to_native(output);
weston_output_switch_mode(output,
output->native_mode,
output->native_scale,
WESTON_MODE_SWITCH_RESTORE_NATIVE);
} }
/* /*
@ -472,9 +468,8 @@ fs_output_configure_for_mode(struct fs_output *fsout,
mode.height = surf_height * fsout->output->native_scale; mode.height = surf_height * fsout->output->native_scale;
mode.refresh = fsout->pending.framerate; mode.refresh = fsout->pending.framerate;
ret = weston_output_switch_mode(fsout->output, &mode, ret = weston_output_mode_switch_to_temporary(fsout->output, &mode,
fsout->output->native_scale, fsout->output->native_scale);
WESTON_MODE_SWITCH_SET_TEMPORARY);
if (ret != 0) { if (ret != 0) {
/* The mode switch failed. Clear the pending and /* The mode switch failed. Clear the pending and

@ -803,7 +803,7 @@ xf_peer_post_connect(freerdp_peer* client)
weston_log("client mode not found\n"); weston_log("client mode not found\n");
return FALSE; return FALSE;
} }
weston_output_switch_mode(&output->base, target_mode, 1, WESTON_MODE_SWITCH_SET_NATIVE); weston_output_mode_set_native(&output->base, target_mode, 1);
output->base.width = new_mode.width; output->base.width = new_mode.width;
output->base.height = new_mode.height; output->base.height = new_mode.height;
} }

@ -98,76 +98,13 @@ weston_output_transform_scale_init(struct weston_output *output,
static void static void
weston_compositor_build_view_list(struct weston_compositor *compositor); weston_compositor_build_view_list(struct weston_compositor *compositor);
WL_EXPORT int static void weston_mode_switch_finish(struct weston_output *output,
weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode, int mode_changed,
int32_t scale, enum weston_mode_switch_op op) int scale_changed)
{ {
struct weston_seat *seat; struct weston_seat *seat;
struct wl_resource *resource; struct wl_resource *resource;
pixman_region32_t old_output_region; pixman_region32_t old_output_region;
int ret, notify_mode_changed, notify_scale_changed;
int temporary_mode, temporary_scale;
if (!output->switch_mode)
return -1;
temporary_mode = (output->original_mode != 0);
temporary_scale = (output->current_scale != output->original_scale);
ret = 0;
notify_mode_changed = 0;
notify_scale_changed = 0;
switch(op) {
case WESTON_MODE_SWITCH_SET_NATIVE:
output->native_mode = mode;
if (!temporary_mode) {
notify_mode_changed = 1;
ret = output->switch_mode(output, mode);
if (ret < 0)
return ret;
}
output->native_scale = scale;
if(!temporary_scale)
notify_scale_changed = 1;
break;
case WESTON_MODE_SWITCH_SET_TEMPORARY:
if (!temporary_mode)
output->original_mode = output->native_mode;
if (!temporary_scale)
output->original_scale = output->native_scale;
ret = output->switch_mode(output, mode);
if (ret < 0)
return ret;
output->current_scale = scale;
break;
case WESTON_MODE_SWITCH_RESTORE_NATIVE:
if (!temporary_mode) {
weston_log("already in the native mode\n");
return -1;
}
notify_mode_changed = (output->original_mode != output->native_mode);
ret = output->switch_mode(output, mode);
if (ret < 0)
return ret;
if (output->original_scale != output->native_scale) {
notify_scale_changed = 1;
scale = output->native_scale;
output->original_scale = scale;
}
output->original_mode = 0;
output->current_scale = output->native_scale;
break;
default:
weston_log("unknown weston_switch_mode_op %d\n", op);
break;
}
pixman_region32_init(&old_output_region); pixman_region32_init(&old_output_region);
pixman_region32_copy(&old_output_region, &output->region); pixman_region32_copy(&old_output_region, &output->region);
@ -211,25 +148,113 @@ weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode
pixman_region32_fini(&old_output_region); pixman_region32_fini(&old_output_region);
/* notify clients of the changes */ /* notify clients of the changes */
if (notify_mode_changed || notify_scale_changed) { wl_resource_for_each(resource, &output->resource_list) {
wl_resource_for_each(resource, &output->resource_list) { if (mode_changed) {
if(notify_mode_changed) { wl_output_send_mode(resource,
wl_output_send_mode(resource, output->current_mode->flags,
mode->flags | WL_OUTPUT_MODE_CURRENT, output->current_mode->width,
mode->width, output->current_mode->height,
mode->height, output->current_mode->refresh);
mode->refresh); }
}
if (scale_changed)
wl_output_send_scale(resource, output->current_scale);
if (wl_resource_get_version(resource) >= 2)
wl_output_send_done(resource);
}
}
if (notify_scale_changed) WL_EXPORT int
wl_output_send_scale(resource, scale); weston_output_mode_set_native(struct weston_output *output,
struct weston_mode *mode,
int32_t scale)
{
int ret;
int mode_changed = 0, scale_changed = 0;
if (wl_resource_get_version(resource) >= 2) if (!output->switch_mode)
wl_output_send_done(resource); return -1;
if (!output->original_mode) {
mode_changed = 1;
ret = output->switch_mode(output, mode);
if (ret < 0)
return ret;
if (output->current_scale != scale) {
scale_changed = 1;
output->current_scale = scale;
} }
} }
return ret; output->native_mode = mode;
output->native_scale = scale;
weston_mode_switch_finish(output, mode_changed, scale_changed);
return 0;
}
WL_EXPORT int
weston_output_mode_switch_to_native(struct weston_output *output)
{
int ret;
int mode_changed = 0, scale_changed = 0;
if (!output->switch_mode)
return -1;
if (!output->original_mode) {
weston_log("already in the native mode\n");
return -1;
}
/* the non fullscreen clients haven't seen a mode set since we
* switched into a temporary, so we need to notify them if the
* mode at that time is different from the native mode now.
*/
mode_changed = (output->original_mode != output->native_mode);
scale_changed = (output->original_scale != output->native_scale);
ret = output->switch_mode(output, output->native_mode);
if (ret < 0)
return ret;
output->current_scale = output->native_scale;
output->original_mode = NULL;
output->original_scale = 0;
weston_mode_switch_finish(output, mode_changed, scale_changed);
return 0;
}
WL_EXPORT int
weston_output_mode_switch_to_temporary(struct weston_output *output,
struct weston_mode *mode,
int32_t scale)
{
int ret;
if (!output->switch_mode)
return -1;
/* original_mode is the last mode non full screen clients have seen,
* so we shouldn't change it if we already have one set.
*/
if (!output->original_mode) {
output->original_mode = output->native_mode;
output->original_scale = output->native_scale;
}
ret = output->switch_mode(output, mode);
if (ret < 0)
return ret;
output->current_scale = scale;
weston_mode_switch_finish(output, 0, 0);
return 0;
} }
WL_EXPORT void WL_EXPORT void

@ -174,12 +174,6 @@ enum dpms_enum {
WESTON_DPMS_OFF WESTON_DPMS_OFF
}; };
enum weston_mode_switch_op {
WESTON_MODE_SWITCH_SET_NATIVE,
WESTON_MODE_SWITCH_SET_TEMPORARY,
WESTON_MODE_SWITCH_RESTORE_NATIVE
};
struct weston_output { struct weston_output {
uint32_t id; uint32_t id;
char *name; char *name;
@ -1434,8 +1428,15 @@ void
weston_surface_destroy(struct weston_surface *surface); weston_surface_destroy(struct weston_surface *surface);
int int
weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode, weston_output_mode_set_native(struct weston_output *output,
int32_t scale, enum weston_mode_switch_op op); struct weston_mode *mode,
int32_t scale);
int
weston_output_mode_switch_to_temporary(struct weston_output *output,
struct weston_mode *mode,
int32_t scale);
int
weston_output_mode_switch_to_native(struct weston_output *output);
int int
noop_renderer_init(struct weston_compositor *ec); noop_renderer_init(struct weston_compositor *ec);

Loading…
Cancel
Save