commit a0953ef20f77ee91c0bbfc1d48296c93a3bda80e
parent fffe652646df30e6cf8b7053de4a95e60344b22f
Author: Michael Forney <mforney@mforney.org>
Date: Sun, 16 Feb 2014 15:06:12 -0800
compositor: Add create_view instead of add/remove surface
Diffstat:
8 files changed, 50 insertions(+), 58 deletions(-)
diff --git a/libswc/compositor.c b/libswc/compositor.c
@@ -512,14 +512,14 @@ static void handle_view_event(struct wl_listener * listener, void * data)
}
}
-bool swc_compositor_add_surface(struct swc_surface * surface)
+struct swc_view * swc_compositor_create_view(struct swc_surface * surface)
{
struct view * view;
view = malloc(sizeof *view);
if (!view)
- return false;
+ return NULL;
swc_view_initialize(&view->base, &view_impl);
view->event_listener.notify = &handle_view_event;
@@ -537,27 +537,25 @@ bool swc_compositor_add_surface(struct swc_surface * surface)
pixman_region32_init(&view->clip);
swc_surface_set_view(surface, &view->base);
- return true;
+ return &view->base;
}
-bool swc_compositor_remove_surface(struct swc_surface * surface)
+void compositor_view_destroy(struct swc_view * base)
{
- struct view * view = (void *) surface->view;
+ struct view * view = (void *) base;
assert(view->base.impl == &view_impl);
- swc_compositor_surface_hide(view->surface);
+ compositor_view_hide(&view->base);
swc_surface_set_view(view->surface, NULL);
swc_view_finalize(&view->base);
pixman_region32_fini(&view->clip);
free(view);
-
- return true;
}
-void swc_compositor_surface_show(struct swc_surface * surface)
+void compositor_view_show(struct swc_view * base)
{
- struct view * view = (void *) surface->view;
+ struct view * view = (void *) base;
assert(view->base.impl == &view_impl);
@@ -576,9 +574,9 @@ void swc_compositor_surface_show(struct swc_surface * surface)
wl_list_insert(&compositor.views, &view->link);
}
-void swc_compositor_surface_hide(struct swc_surface * surface)
+void compositor_view_hide(struct swc_view * base)
{
- struct view * view = (void *) surface->view;
+ struct view * view = (void *) base;
assert(view->base.impl == &view_impl);
@@ -594,10 +592,9 @@ void swc_compositor_surface_hide(struct swc_surface * surface)
view->visible = false;
}
-void swc_compositor_surface_set_border_width(struct swc_surface * surface,
- uint32_t width)
+void compositor_view_set_border_width(struct swc_view * base, uint32_t width)
{
- struct view * view = (void *) surface->view;
+ struct view * view = (void *) base;
assert(view->base.impl == &view_impl);
@@ -613,10 +610,9 @@ void swc_compositor_surface_set_border_width(struct swc_surface * surface,
update(&view->base);
}
-void swc_compositor_surface_set_border_color(struct swc_surface * surface,
- uint32_t color)
+void compositor_view_set_border_color(struct swc_view * base, uint32_t color)
{
- struct view * view = (void *) surface->view;
+ struct view * view = (void *) base;
assert(view->base.impl == &view_impl);
diff --git a/libswc/compositor.h b/libswc/compositor.h
@@ -36,15 +36,16 @@ struct swc_compositor
bool swc_compositor_initialize();
void swc_compositor_finalize();
-bool swc_compositor_add_surface(struct swc_surface * surface);
-bool swc_compositor_remove_surface(struct swc_surface * surface);
-
-void swc_compositor_surface_show(struct swc_surface * surface);
-void swc_compositor_surface_hide(struct swc_surface * surface);
-void swc_compositor_surface_set_border_color(struct swc_surface * surface,
- uint32_t color);
-void swc_compositor_surface_set_border_width(struct swc_surface * surface,
- uint32_t width);
+struct swc_view * swc_compositor_create_view
+ (struct swc_surface * surface);
+
+void compositor_view_destroy(struct swc_view * view);
+
+void compositor_view_show(struct swc_view * view);
+void compositor_view_hide(struct swc_view * view);
+
+void compositor_view_set_border_color(struct swc_view * view, uint32_t color);
+void compositor_view_set_border_width(struct swc_view * view, uint32_t width);
#endif
diff --git a/libswc/panel.c b/libswc/panel.c
@@ -40,7 +40,7 @@ static void update_position(struct swc_panel * panel)
{
int32_t x, y;
struct swc_rectangle * screen = &panel->screen->base.geometry,
- * view = &panel->surface->view->geometry;
+ * view = &panel->view->geometry;
switch (panel->edge)
{
@@ -103,11 +103,17 @@ static void dock(struct wl_client * client, struct wl_resource * resource,
panel->screen = screen;
panel->edge = edge;
panel->docked = true;
+ panel->view = swc_compositor_create_view(panel->surface);
+
+ if (!panel->view)
+ {
+ wl_resource_post_no_memory(resource);
+ return;
+ }
- swc_compositor_add_surface(panel->surface);
update_position(panel);
- swc_compositor_surface_show(panel->surface);
- wl_signal_add(&panel->surface->view->event_signal, &panel->view_listener);
+ compositor_view_show(panel->view);
+ wl_signal_add(&panel->view->event_signal, &panel->view_listener);
wl_list_insert(&screen->modifiers, &panel->modifier.link);
if (focus)
@@ -193,7 +199,7 @@ static void destroy_panel(struct wl_resource * resource)
wl_list_remove(&panel->view_listener.link);
wl_list_remove(&panel->modifier.link);
screen_update_usable_geometry(panel->screen);
- swc_compositor_remove_surface(panel->surface);
+ compositor_view_destroy(panel->view);
}
free(panel);
diff --git a/libswc/panel.h b/libswc/panel.h
@@ -35,6 +35,7 @@ struct swc_panel
struct swc_surface * surface;
struct wl_listener surface_destroy_listener;
+ struct swc_view * view;
struct wl_listener view_listener;
struct screen * screen;
struct screen_modifier modifier;
diff --git a/libswc/shell_surface.c b/libswc/shell_surface.c
@@ -83,14 +83,6 @@ static void set_transient(struct wl_client * client,
struct wl_resource * parent_resource,
int32_t x, int32_t y, uint32_t flags)
{
- struct swc_shell_surface * shell_surface
- = wl_resource_get_user_data(resource);
- struct swc_surface * parent = wl_resource_get_user_data(parent_resource);
-
- swc_view_move(shell_surface->window.surface->view,
- parent->view->geometry.x + x, parent->view->geometry.y + y);
- swc_compositor_surface_show(shell_surface->window.surface);
-
/* XXX: Handle transient */
}
@@ -107,14 +99,6 @@ static void set_popup(struct wl_client * client, struct wl_resource * resource,
struct wl_resource * parent_resource,
int32_t x, int32_t y, uint32_t flags)
{
- struct swc_shell_surface * shell_surface
- = wl_resource_get_user_data(resource);
- struct swc_surface * parent = wl_resource_get_user_data(parent_resource);
-
- swc_view_move(shell_surface->window.surface->view,
- parent->view->geometry.x + x, parent->view->geometry.y + y);
- swc_compositor_surface_show(shell_surface->window.surface);
-
/* XXX: Handle popup */
}
diff --git a/libswc/window.c b/libswc/window.c
@@ -58,13 +58,13 @@ struct wl_listener window_enter_listener = {
EXPORT
void swc_window_show(struct swc_window * window)
{
- swc_compositor_surface_show(INTERNAL(window)->surface);
+ compositor_view_show(INTERNAL(window)->view);
}
EXPORT
void swc_window_hide(struct swc_window * window)
{
- swc_compositor_surface_hide(INTERNAL(window)->surface);
+ compositor_view_hide(INTERNAL(window)->view);
}
EXPORT
@@ -99,17 +99,17 @@ void swc_window_set_geometry(struct swc_window * base,
if (window->impl->configure)
window->impl->configure(window, geometry);
- swc_view_move(window->surface->view, geometry->x, geometry->y);
+ swc_view_move(window->view, geometry->x, geometry->y);
}
EXPORT
void swc_window_set_border(struct swc_window * window,
uint32_t border_color, uint32_t border_width)
{
- struct swc_surface * surface = INTERNAL(window)->surface;
+ struct swc_view * view = INTERNAL(window)->view;
- swc_compositor_surface_set_border_color(surface, border_color);
- swc_compositor_surface_set_border_width(surface, border_width);
+ compositor_view_set_border_color(view, border_color);
+ compositor_view_set_border_width(view, border_width);
}
bool window_initialize(struct window * window, const struct window_impl * impl,
@@ -122,11 +122,14 @@ bool window_initialize(struct window * window, const struct window_impl * impl,
window->base.state = SWC_WINDOW_STATE_NONE;
window->base.parent = NULL;
wl_signal_init(&window->base.event_signal);
+
+ if (!(window->view = swc_compositor_create_view(surface)))
+ return false;
+
window->surface = surface;
window->impl = impl;
surface->window = window;
- swc_compositor_add_surface(surface);
swc.manager->new_window(&window->base);
@@ -138,7 +141,7 @@ void window_finalize(struct window * window)
DEBUG("Finalizing window, %p\n", window);
swc_send_event(&window->base.event_signal, SWC_WINDOW_DESTROYED, NULL);
- swc_compositor_remove_surface(window->surface);
+ compositor_view_destroy(window->view);
window->surface->window = NULL;
free(window->base.title);
free(window->base.class);
diff --git a/libswc/window.h b/libswc/window.h
@@ -32,9 +32,10 @@
struct window
{
struct swc_window base;
+ const struct window_impl * impl;
struct swc_surface * surface;
- const struct window_impl * impl;
+ struct swc_view * view;
};
struct window_impl
diff --git a/libswc/xwm.c b/libswc/xwm.c
@@ -349,7 +349,7 @@ void swc_xwm_manage_window(xcb_window_t id, struct swc_surface * surface)
}
if (entry->override_redirect)
- swc_compositor_surface_show(surface);
+ compositor_view_show(xwl_window->window.view);
else
{
uint32_t mask, values[1];