Move map requests to shell

This commit is contained in:
Kristian Høgsberg 2011-06-18 06:12:54 -04:00
parent 83eeacb489
commit 7a5c979f4c
4 changed files with 91 additions and 114 deletions

View File

@ -37,6 +37,7 @@ struct display {
struct wl_display *display;
struct wl_visual *premultiplied_argb_visual;
struct wl_compositor *compositor;
struct wl_shell *shell;
struct {
EGLDisplay dpy;
EGLContext ctx;
@ -227,7 +228,7 @@ create_surface(struct window *window)
window->native,
NULL);
wl_surface_map_toplevel(window->surface);
wl_shell_set_toplevel(display->shell, window->surface);
ret = eglMakeCurrent(window->display->egl.dpy, window->egl_surface,
window->egl_surface, window->display->egl.ctx);
@ -320,6 +321,8 @@ display_handle_global(struct wl_display *display, uint32_t id,
d->compositor = wl_compositor_create(display, id, 1);
wl_compositor_add_listener(d->compositor,
&compositor_listener, d);
} else if (strcmp(interface, "wl_shell") == 0) {
d->shell = wl_shell_create(display, id, 1);
}
}

View File

@ -733,13 +733,13 @@ window_attach_surface(struct window *window)
}
if (window->fullscreen)
wl_surface_map_fullscreen(window->surface);
wl_shell_set_fullscreen(display->shell, window->surface);
else if (!window->parent)
wl_surface_map_toplevel(window->surface);
wl_shell_set_toplevel(display->shell, window->surface);
else
wl_surface_map_transient(window->surface,
window->parent->surface,
window->x, window->y, 0);
wl_shell_set_transient(display->shell, window->surface,
window->parent->surface,
window->x, window->y, 0);
wl_surface_damage(window->surface, 0, 0,
window->allocation.width,

View File

@ -862,119 +862,20 @@ surface_attach(struct wl_client *client,
* damaged by the client. */
wlsc_surface_damage(es);
switch (es->map_type) {
case WLSC_SURFACE_MAP_FULLSCREEN:
es->x = (es->fullscreen_output->width - es->width) / 2;
es->y = (es->fullscreen_output->height - es->height) / 2;
break;
default:
es->x += x;
es->y += y;
break;
}
es->x += x;
es->y += y;
es->width = buffer->width;
es->height = buffer->height;
if (x != 0 || y != 0)
wlsc_surface_assign_output(es);
if (es->visual == NULL)
wl_list_insert(&es->compositor->surface_list, &es->link);
wlsc_buffer_attach(buffer, surface);
es->compositor->shell->attach(es->compositor->shell, es);
}
static void
surface_map_toplevel(struct wl_client *client,
struct wl_surface *surface)
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_compositor *ec = es->compositor;
switch (es->map_type) {
case WLSC_SURFACE_MAP_UNMAPPED:
es->x = 10 + random() % 400;
es->y = 10 + random() % 400;
/* assign to first output */
es->output = container_of(ec->output_list.next,
struct wlsc_output, link);
wl_list_insert(&es->compositor->surface_list, &es->link);
break;
case WLSC_SURFACE_MAP_TOPLEVEL:
return;
case WLSC_SURFACE_MAP_FULLSCREEN:
es->fullscreen_output = NULL;
es->x = es->saved_x;
es->y = es->saved_y;
break;
default:
break;
}
wlsc_surface_damage(es);
es->map_type = WLSC_SURFACE_MAP_TOPLEVEL;
}
static void
surface_map_transient(struct wl_client *client,
struct wl_surface *surface, struct wl_surface *parent,
int x, int y, uint32_t flags)
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_surface *pes = (struct wlsc_surface *) parent;
switch (es->map_type) {
case WLSC_SURFACE_MAP_UNMAPPED:
wl_list_insert(&es->compositor->surface_list, &es->link);
/* assign to parents output */
es->output = pes->output;
break;
case WLSC_SURFACE_MAP_FULLSCREEN:
es->fullscreen_output = NULL;
break;
default:
break;
}
es->x = pes->x + x;
es->y = pes->y + y;
wlsc_surface_damage(es);
es->map_type = WLSC_SURFACE_MAP_TRANSIENT;
}
static void
surface_map_fullscreen(struct wl_client *client, struct wl_surface *surface)
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_output *output;
/* FIXME: Fullscreen on first output */
/* FIXME: Handle output going away */
output = container_of(es->compositor->output_list.next,
struct wlsc_output, link);
switch (es->map_type) {
case WLSC_SURFACE_MAP_UNMAPPED:
es->x = 10 + random() % 400;
es->y = 10 + random() % 400;
/* assign to first output */
es->output = output;
wl_list_insert(&es->compositor->surface_list, &es->link);
break;
case WLSC_SURFACE_MAP_FULLSCREEN:
return;
default:
break;
}
es->saved_x = es->x;
es->saved_y = es->y;
es->x = (output->width - es->width) / 2;
es->y = (output->height - es->height) / 2;
es->fullscreen_output = output;
wlsc_surface_damage(es);
es->map_type = WLSC_SURFACE_MAP_FULLSCREEN;
}
static void
surface_damage(struct wl_client *client,
struct wl_surface *surface,
@ -988,9 +889,6 @@ surface_damage(struct wl_client *client,
const static struct wl_surface_interface surface_interface = {
surface_destroy,
surface_attach,
surface_map_toplevel,
surface_map_transient,
surface_map_fullscreen,
surface_damage
};

View File

@ -239,6 +239,75 @@ shell_resize(struct wl_client *client, struct wl_shell *shell,
wl_input_device_set_pointer_focus(device, NULL, time, 0, 0, 0, 0);
}
static void
shell_set_toplevel(struct wl_client *client,
struct wl_shell *wl_shell,
struct wl_surface *surface)
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_compositor *ec = es->compositor;
if (es->map_type == WLSC_SURFACE_MAP_FULLSCREEN) {
es->x = es->saved_x;
es->y = es->saved_y;
} else if (es->map_type == WLSC_SURFACE_MAP_UNMAPPED) {
es->x = 10 + random() % 400;
es->y = 10 + random() % 400;
/* assign to first output */
es->output = container_of(ec->output_list.next,
struct wlsc_output, link);
}
wlsc_surface_damage(es);
es->map_type = WLSC_SURFACE_MAP_TOPLEVEL;
es->fullscreen_output = NULL;
}
static void
shell_set_transient(struct wl_client *client,
struct wl_shell *wl_shell,
struct wl_surface *surface,
struct wl_surface *parent,
int x, int y, uint32_t flags)
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_surface *pes = (struct wlsc_surface *) parent;
/* assign to parents output */
es->output = pes->output;
es->x = pes->x + x;
es->y = pes->y + y;
wlsc_surface_damage(es);
es->map_type = WLSC_SURFACE_MAP_TRANSIENT;
}
static void
shell_set_fullscreen(struct wl_client *client,
struct wl_shell *wl_shell,
struct wl_surface *surface)
{
struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_output *output;
/* FIXME: Fullscreen on first output */
/* FIXME: Handle output going away */
output = container_of(es->compositor->output_list.next,
struct wlsc_output, link);
es->output = output;
es->saved_x = es->x;
es->saved_y = es->y;
es->x = (output->width - es->width) / 2;
es->y = (output->height - es->height) / 2;
es->fullscreen_output = output;
wlsc_surface_damage(es);
es->map_type = WLSC_SURFACE_MAP_FULLSCREEN;
}
static void
destroy_drag(struct wl_resource *resource, struct wl_client *client)
{
@ -676,7 +745,10 @@ const static struct wl_shell_interface shell_interface = {
shell_move,
shell_resize,
shell_create_drag,
shell_create_selection
shell_create_selection,
shell_set_toplevel,
shell_set_transient,
shell_set_fullscreen
};
static void
@ -732,8 +804,12 @@ lock(struct wlsc_shell *shell)
}
static void
attach(struct wlsc_shell *shell, struct wlsc_surface *surface)
attach(struct wlsc_shell *shell, struct wlsc_surface *es)
{
if (es->map_type == WLSC_SURFACE_MAP_FULLSCREEN) {
es->x = (es->fullscreen_output->width - es->width) / 2;
es->y = (es->fullscreen_output->height - es->height) / 2;
}
}
int