swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

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:
Mlibswc/compositor.c | 32++++++++++++++------------------
Mlibswc/compositor.h | 19++++++++++---------
Mlibswc/panel.c | 16+++++++++++-----
Mlibswc/panel.h | 1+
Mlibswc/shell_surface.c | 16----------------
Mlibswc/window.c | 19+++++++++++--------
Mlibswc/window.h | 3++-
Mlibswc/xwm.c | 2+-
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];