[PATCH v5 2/4] add fullscreen interface update
juan.j.zhao at linux.intel.com
juan.j.zhao at linux.intel.com
Mon Jan 16 22:17:48 PST 2012
From: Juan Zhao <juan.j.zhao at linux.intel.com>
mainly update shell part here
Signed-off-by: Juan Zhao <juan.j.zhao at linux.intel.com>
Signed-off-by: Juan Zhao <juan.j.zhao at linux.intel.com>
---
src/compositor.c | 21 +++++++++++++++++-
src/compositor.h | 28 ++++++++++++++++++++++++-
src/shell.c | 60 ++++++++++++++++++++++++++++++++++++++---------------
3 files changed, 89 insertions(+), 20 deletions(-)
diff --git a/src/compositor.c b/src/compositor.c
index 4a5e51c..1f0cb2d 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -228,7 +228,7 @@ weston_surface_create(struct weston_compositor *compositor,
surface->height = height;
surface->alpha = 255;
- surface->fullscreen_output = NULL;
+ surface->fs_support.fullscreen_output = NULL;
surface->buffer = NULL;
surface->output = NULL;
@@ -307,6 +307,23 @@ weston_surface_configure(struct weston_surface *surface,
pixman_region32_init(&surface->opaque);
}
+WL_EXPORT void
+weston_surface_center_on_output( struct weston_surface *surface,
+ struct weston_output *output )
+{
+ struct weston_mode *mode = output->current;
+
+ surface->x = output->x + (mode->width - surface->width) / 2;
+ surface->y = output->y + (mode->height - surface->height) / 2;
+}
+
+int
+weston_surface_set_fullscreen( struct weston_output *output,
+ struct weston_surface *surface)
+{
+ /*do the real set fullscreen*/
+}
+
static void
weston_surface_transform(struct weston_surface *surface,
int32_t x, int32_t y, int32_t *sx, int32_t *sy)
@@ -803,7 +820,7 @@ weston_output_repaint(struct weston_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/src/compositor.h b/src/compositor.h
index d21e285..90086e7 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -32,6 +32,14 @@
#include <EGL/egl.h>
#include <EGL/eglext.h>
+#define WESTON_SURFACE_FULLSCREEN_DEFAULT 0
+#define WESTON_SURFACE_FULLSCREEN_SCALE 1
+#define WESTON_SURFACE_FULLSCREEN_DRIVER 2
+#define WESTON_SURFACE_FULLSCREEN_FILL 3
+#define WESTON_SURFACE_TYPE_CURSOR 0
+#define WESTON_SURFACE_TYPE_PANEL 1
+#define WESTON_SURFACE_TYPE_GENERAL 2
+
struct weston_matrix {
GLfloat d[16];
};
@@ -79,8 +87,10 @@ struct weston_output {
char *make, *model;
uint32_t subpixel;
+ uint32_t fs_dirty;
struct weston_mode *current;
+ struct weston_mode *saved_mode;
struct wl_list mode_list;
struct wl_buffer *scanout_buffer;
struct wl_listener scanout_buffer_destroy_listener;
@@ -94,6 +104,7 @@ struct weston_output {
int (*set_hardware_cursor)(struct weston_output *output,
struct weston_input_device *input);
void (*destroy)(struct weston_output *output);
+ int (*set_mode)(struct weston_output *output_base, int32_t w, int32_t h, uint32_t refresh);
};
struct weston_input_device {
@@ -241,6 +252,15 @@ struct weston_surface {
struct weston_transform *transform;
uint32_t alpha;
uint32_t visual;
+ uint32_t type;
+
+ struct {
+ uint32_t framerate;
+ uint32_t fs_method;
+ struct weston_transform *fs_transform;
+ struct weston_output *fullscreen_output;
+ } fs_support;
+
/*
* Which output to vsync this surface to.
@@ -249,7 +269,6 @@ struct weston_surface {
*/
struct weston_output *output;
- struct weston_output *fullscreen_output;
struct wl_list frame_callback_list;
EGLImageKHR image;
@@ -363,6 +382,13 @@ weston_surface_damage_rectangle(struct weston_surface *surface,
int32_t x, int32_t y,
int32_t width, int32_t height);
+void
+weston_surface_center_on_output( struct weston_surface *surface,
+ struct weston_output *output );
+int
+weston_surface_set_fullscreen( struct weston_output *output,
+ struct weston_surface *surface);
+
uint32_t
weston_compositor_get_time(void);
diff --git a/src/shell.c b/src/shell.c
index 9386d1e..a131ae5 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -330,7 +330,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:
@@ -401,7 +401,8 @@ get_default_output(struct weston_compositor *compositor)
static void
shell_surface_set_fullscreen(struct wl_client *client,
- struct wl_resource *resource)
+ struct wl_resource *resource, uint32_t method,
+ uint32_t framerate)
{
struct shell_surface *shsurf = resource->data;
@@ -420,9 +421,37 @@ 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;
- weston_surface_damage(es);
+ es->fs_support.fullscreen_output = output;
+ es->fs_support.framerate = framerate;
shsurf->type = SHELL_SURFACE_FULLSCREEN;
+ switch(method){
+ case WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT:
+ weston_surface_damage(es);
+ es->fs_support.fs_method = WESTON_SURFACE_FULLSCREEN_DEFAULT;
+ break;
+ case WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE:
+ es->x = 0;
+ es->y = 0;
+ weston_surface_damage(es);
+ es->fs_support.fs_method = WESTON_SURFACE_FULLSCREEN_SCALE;
+ break;
+ case WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER:
+ es->x = 0;
+ es->y = 0;
+ weston_surface_damage(es);
+ es->fs_support.fs_method =
+ WESTON_SURFACE_FULLSCREEN_DRIVER;
+ break;
+ case WL_SHELL_SURFACE_FULLSCREEN_METHOD_FILL:
+ weston_surface_damage(es);
+ es->fs_support.fs_method = WESTON_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 void
@@ -536,6 +565,7 @@ static const struct wl_shell_surface_interface shell_surface_implementation = {
shell_surface_set_toplevel,
shell_surface_set_transient,
shell_surface_set_fullscreen,
+ NULL,
shell_surface_set_popup
};
@@ -1092,15 +1122,6 @@ unlock(struct weston_shell *base)
}
static void
-center_on_output(struct weston_surface *surface, struct weston_output *output)
-{
- struct weston_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 weston_shell *base,
struct weston_surface *surface, int32_t width, int32_t height)
{
@@ -1108,6 +1129,7 @@ map(struct weston_shell *base,
struct weston_compositor *compositor = shell->compositor;
struct wl_list *list;
struct shell_surface *shsurf;
+ struct weston_output *fs_output = surface->fs_support.fullscreen_output;
enum shell_surface_type surface_type = SHELL_SURFACE_NONE;
int do_configure;
@@ -1134,10 +1156,11 @@ map(struct weston_shell *base,
break;
case SHELL_SURFACE_SCREENSAVER:
case SHELL_SURFACE_FULLSCREEN:
- center_on_output(surface, surface->fullscreen_output);
+ weston_surface_set_fullscreen(fs_output, surface);
break;
case SHELL_SURFACE_LOCK:
- center_on_output(surface, get_default_output(compositor));
+ weston_surface_center_on_output(surface,
+ get_default_output(compositor));
break;
default:
;
@@ -1231,6 +1254,9 @@ configure(struct weston_shell *base, struct weston_surface *surface,
int do_configure = !shell->locked;
enum shell_surface_type surface_type = SHELL_SURFACE_NONE;
struct shell_surface *shsurf;
+ struct weston_output *fs_output;
+
+ fs_output = surface->fs_support.fullscreen_output;
shsurf = get_shell_surface(surface);
if (shsurf)
@@ -1244,7 +1270,7 @@ configure(struct weston_shell *base, struct weston_surface *surface,
do_configure = !do_configure;
/* fall through */
case SHELL_SURFACE_FULLSCREEN:
- center_on_output(surface, surface->fullscreen_output);
+ weston_surface_center_on_output(surface, fs_output);
break;
default:
break;
@@ -1348,7 +1374,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