[PATCH 1/6] update shell_set_fullscreen interface
juan.j.zhao at linux.intel.com
juan.j.zhao at linux.intel.com
Fri Dec 30 12:21:21 PST 2011
From: Juan Zhao <juan.j.zhao at linux.intel.com>
update the surface and implementation in desktop-shell
according to the protocol change for fullscreen.
in shell, mainly setting the flags and let the base compositor to
do the real mode changing for fill action.
---
clients/window.c | 4 ++-
compositor/compositor.c | 14 ++++++++++-
compositor/compositor.h | 10 +++++++-
compositor/shell.c | 56 ++++++++++++++++++++++++++++++++--------------
4 files changed, 63 insertions(+), 21 deletions(-)
diff --git a/clients/window.c b/clients/window.c
index b031daa..90e0a32 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -770,12 +770,14 @@ window_get_resize_dx_dy(struct window *window, int *x, int *y)
static void
window_set_type(struct window *window)
{
+ uint32_t fs_mode = WL_SHELL_SURFACE_FULLSCREEN_MOTHED_NONE;
+
if (!window->shell_surface)
return;
switch (window->type) {
case TYPE_FULLSCREEN:
- wl_shell_surface_set_fullscreen(window->shell_surface);
+ wl_shell_surface_set_fullscreen(window->shell_surface, fs_mode, 1);
break;
case TYPE_TOPLEVEL:
wl_shell_surface_set_toplevel(window->shell_surface);
diff --git a/compositor/compositor.c b/compositor/compositor.c
index 0fa9ed8..bef6867 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -227,7 +227,7 @@ wlsc_surface_create(struct wlsc_compositor *compositor,
surface->height = height;
surface->alpha = 255;
- surface->fullscreen_output = NULL;
+ surface->fs_support.fs_method = WLSC_SURFACE_FULLSCREEN_NONE;
surface->buffer = NULL;
surface->output = NULL;
@@ -306,6 +306,16 @@ wlsc_surface_configure(struct wlsc_surface *surface,
pixman_region32_init(&surface->opaque);
}
+WL_EXPORT void
+wlsc_surface_center_on_output( struct wlsc_surface *surface,
+ struct wlsc_output *output )
+{
+ struct wlsc_mode *mode = output->current;
+
+ surface->x = output->x + (mode->width - surface->width) / 2;
+ surface->y = output->y + (mode->height - surface->height) / 2;
+}
+
WL_EXPORT uint32_t
wlsc_compositor_get_time(void)
{
@@ -787,7 +797,7 @@ wlsc_output_repaint(struct wlsc_output *output)
/* We're drawing nothing, just let the damage accumulate */
return;
- if (es->fullscreen_output == output) {
+ if (es->fs_support.fullscreen_output == output) {
if (es->width < output->current->width ||
es->height < output->current->height)
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/compositor/compositor.h b/compositor/compositor.h
index 4c011f0..9ba107d 100644
--- a/compositor/compositor.h
+++ b/compositor/compositor.h
@@ -32,6 +32,10 @@
#include <EGL/egl.h>
#include <EGL/eglext.h>
+#define WLSC_SURFACE_FULLSCREEN_NONE 0
+#define WLSC_SURFACE_FULLSCREEN_FORCE 1
+#define WLSC_SURFACE_FULLSCREEN_FILL 2
+
struct wlsc_matrix {
GLfloat d[16];
};
@@ -249,6 +253,11 @@ struct wlsc_surface {
uint32_t alpha;
uint32_t visual;
+ struct {
+ uint32_t fs_method;
+ struct wlsc_output *fullscreen_output;
+ } fs_support;
+
/*
* Which output to vsync this surface to.
* Used to determine, whether to send or queue frame events.
@@ -256,7 +265,6 @@ struct wlsc_surface {
*/
struct wlsc_output *output;
- struct wlsc_output *fullscreen_output;
struct wl_list frame_callback_list;
EGLImageKHR image;
diff --git a/compositor/shell.c b/compositor/shell.c
index ee15ddf..94392cf 100644
--- a/compositor/shell.c
+++ b/compositor/shell.c
@@ -302,7 +302,7 @@ reset_shell_surface_type(struct shell_surface *surface)
case SHELL_SURFACE_FULLSCREEN:
surface->surface->x = surface->saved_x;
surface->surface->y = surface->saved_y;
- surface->surface->fullscreen_output = NULL;
+ surface->surface->fs_support.fullscreen_output = NULL;
break;
case SHELL_SURFACE_PANEL:
case SHELL_SURFACE_BACKGROUND:
@@ -372,7 +372,8 @@ get_default_output(struct wlsc_compositor *compositor)
static void
shell_surface_set_fullscreen(struct wl_client *client,
- struct wl_resource *resource)
+ struct wl_resource *resource,
+ uint32_t flags, uint32_t isfullscreen)
{
struct shell_surface *shsurf = resource->data;
@@ -382,6 +383,10 @@ shell_surface_set_fullscreen(struct wl_client *client,
if (reset_shell_surface_type(shsurf))
return;
+ if(!isfullscreen)
+ return;
+
+
/* FIXME: Fullscreen on first output */
/* FIXME: Handle output going away */
output = get_default_output(es->compositor);
@@ -391,9 +396,30 @@ shell_surface_set_fullscreen(struct wl_client *client,
shsurf->saved_y = es->y;
es->x = (output->current->width - es->width) / 2;
es->y = (output->current->height - es->height) / 2;
- es->fullscreen_output = output;
- wlsc_surface_damage(es);
+ es->fs_support.fullscreen_output = output;
shsurf->type = SHELL_SURFACE_FULLSCREEN;
+ switch(flags){
+ case WL_SHELL_SURFACE_FULLSCREEN_MOTHED_NONE:
+ wlsc_surface_damage(es);
+ es->fs_support.fs_method = WLSC_SURFACE_FULLSCREEN_NONE;
+ break;
+ case WL_SHELL_SURFACE_FULLSCREEN_MOTHED_FORCE:
+ es->x = 0;
+ es->y = 0;
+ wlsc_surface_damage(es);
+ es->fs_support.fs_method =
+ WLSC_SURFACE_FULLSCREEN_FORCE;
+ break;
+ case WL_SHELL_SURFACE_FULLSCREEN_MOTHED_FILL:
+ wlsc_surface_damage(es);
+ es->fs_support.fs_method = WLSC_SURFACE_FULLSCREEN_FILL;
+ default :
+ fprintf(stderr,
+ "unknown parameter for fullscreen support\n");
+ break;
+ }
+ /*will do the real action on the map or paint function*/
+
}
static const struct wl_shell_surface_interface shell_surface_implementation = {
@@ -954,15 +980,6 @@ unlock(struct wlsc_shell *base)
}
static void
-center_on_output(struct wlsc_surface *surface, struct wlsc_output *output)
-{
- struct wlsc_mode *mode = output->current;
-
- surface->x = output->x + (mode->width - surface->width) / 2;
- surface->y = output->y + (mode->height - surface->height) / 2;
-}
-
-static void
map(struct wlsc_shell *base,
struct wlsc_surface *surface, int32_t width, int32_t height)
{
@@ -970,6 +987,7 @@ map(struct wlsc_shell *base,
struct wlsc_compositor *compositor = shell->compositor;
struct wl_list *list;
struct shell_surface *shsurf;
+ struct wlsc_output *fs_output = surface->fs_support.fullscreen_output;
enum shell_surface_type surface_type = SHELL_SURFACE_NONE;
int do_configure;
@@ -996,10 +1014,11 @@ map(struct wlsc_shell *base,
break;
case SHELL_SURFACE_SCREENSAVER:
case SHELL_SURFACE_FULLSCREEN:
- center_on_output(surface, surface->fullscreen_output);
+ wlsc_surface_set_fullscreen(fs_output, surface);
break;
case SHELL_SURFACE_LOCK:
- center_on_output(surface, get_default_output(compositor));
+ wlsc_surface_center_on_output(surface,
+ get_default_output(compositor));
break;
default:
;
@@ -1077,6 +1096,9 @@ configure(struct wlsc_shell *base, struct wlsc_surface *surface,
int do_configure = !shell->locked;
enum shell_surface_type surface_type = SHELL_SURFACE_NONE;
struct shell_surface *shsurf;
+ struct wlsc_output *fs_output;
+
+ fs_output = surface->fs_support.fullscreen_output;
shsurf = get_shell_surface(surface);
if (shsurf)
@@ -1090,7 +1112,7 @@ configure(struct wlsc_shell *base, struct wlsc_surface *surface,
do_configure = !do_configure;
/* fall through */
case SHELL_SURFACE_FULLSCREEN:
- center_on_output(surface, surface->fullscreen_output);
+ wlsc_surface_center_on_output(surface, fs_output);
break;
default:
break;
@@ -1194,7 +1216,7 @@ screensaver_set_surface(struct wl_client *client,
surface->type = SHELL_SURFACE_SCREENSAVER;
- surface->surface->fullscreen_output = output;
+ surface->surface->fs_support.fullscreen_output = output;
surface->output = output;
wl_list_insert(shell->screensaver.surfaces.prev, &surface->link);
}
--
1.7.2.2
More information about the wayland-devel
mailing list