diff --git a/include/desktop/desktop.h b/include/desktop/desktop.h index 1019230..9247219 100644 --- a/include/desktop/desktop.h +++ b/include/desktop/desktop.h @@ -26,7 +26,6 @@ struct kiwmi_desktop { struct wl_list outputs; // struct kiwmi_output::link struct wl_list views; // struct kiwmi_view::link - float bg_color[4]; struct wlr_scene *scene; struct wlr_scene_rect *background_rect; struct wlr_scene_tree *strata[KIWMI_STRATA_COUNT]; diff --git a/include/desktop/layer_shell.h b/include/desktop/layer_shell.h index 83fe3f7..f17bfd9 100644 --- a/include/desktop/layer_shell.h +++ b/include/desktop/layer_shell.h @@ -30,19 +30,10 @@ struct kiwmi_layer { struct wl_listener commit; struct wl_listener map; struct wl_listener unmap; - - struct wlr_box geom; }; void arrange_layers(struct kiwmi_output *output); -struct kiwmi_layer *layer_at( - struct wl_list *layers, - struct wlr_surface **surface, - double ox, - double oy, - double *sx, - double *sy); void layer_shell_new_surface_notify(struct wl_listener *listener, void *data); #endif /* KIWMI_DESKTOP_LAYER_SHELL_H */ diff --git a/include/desktop/view.h b/include/desktop/view.h index 72c9163..5ada1bb 100644 --- a/include/desktop/view.h +++ b/include/desktop/view.h @@ -30,7 +30,6 @@ enum kiwmi_view_type { struct kiwmi_view { struct wl_list link; - struct wl_list children; // struct kiwmi_view_child::link struct kiwmi_desktop_surface desktop_surface; struct kiwmi_desktop *desktop; @@ -50,16 +49,10 @@ struct kiwmi_view { struct wl_listener unmap; struct wl_listener commit; struct wl_listener destroy; - struct wl_listener new_popup; - struct wl_listener new_subsurface; struct wl_listener request_move; struct wl_listener request_resize; - int x; - int y; - bool mapped; - bool hidden; struct { struct wl_signal unmap; @@ -74,58 +67,12 @@ struct kiwmi_view { struct kiwmi_view_impl { void (*close)(struct kiwmi_view *view); - void (*for_each_surface)( - struct kiwmi_view *view, - wlr_surface_iterator_func_t callback, - void *user_data); pid_t (*get_pid)(struct kiwmi_view *view); void (*set_activated)(struct kiwmi_view *view, bool activated); void (*set_size)(struct kiwmi_view *view, uint32_t width, uint32_t height); const char *( *get_string_prop)(struct kiwmi_view *view, enum kiwmi_view_prop prop); void (*set_tiled)(struct kiwmi_view *view, enum wlr_edges edges); - struct wlr_surface *(*surface_at)( - struct kiwmi_view *view, - double sx, - double sy, - double *sub_x, - double *sub_y); -}; - -enum kiwmi_view_child_type { - KIWMI_VIEW_CHILD_SUBSURFACE, - KIWMI_VIEW_CHILD_XDG_POPUP, -}; - -struct kiwmi_view_child { - struct wl_list link; - struct wl_list children; // struct kiwmi_view_child::link - - struct kiwmi_view *view; - struct kiwmi_view_child *parent; - - enum kiwmi_view_child_type type; - const struct kiwmi_view_child_impl *impl; - - struct wlr_surface *wlr_surface; - union { - struct wlr_subsurface *wlr_subsurface; - struct wlr_xdg_popup *wlr_xdg_popup; - }; - - bool mapped; - - struct wl_listener commit; - struct wl_listener map; - struct wl_listener unmap; - struct wl_listener new_popup; - struct wl_listener new_subsurface; - struct wl_listener extension_destroy; // the union'ed object destroy - struct wl_listener surface_destroy; // wlr_surface::events.destroy -}; - -struct kiwmi_view_child_impl { - void (*reconfigure)(struct kiwmi_view_child *child); }; struct kiwmi_request_resize_event { @@ -134,10 +81,6 @@ struct kiwmi_request_resize_event { }; void view_close(struct kiwmi_view *view); -void view_for_each_surface( - struct kiwmi_view *view, - wlr_surface_iterator_func_t callback, - void *user_data); pid_t view_get_pid(struct kiwmi_view *view); void view_get_size(struct kiwmi_view *view, uint32_t *width, uint32_t *height); const char *view_get_app_id(struct kiwmi_view *view); @@ -157,20 +100,4 @@ struct kiwmi_view *view_create( enum kiwmi_view_type type, const struct kiwmi_view_impl *impl); -void -view_init_subsurfaces(struct kiwmi_view_child *child, struct kiwmi_view *view); -bool view_child_is_mapped(struct kiwmi_view_child *child); -void view_child_damage(struct kiwmi_view_child *child); -void view_child_destroy(struct kiwmi_view_child *child); -struct kiwmi_view_child *view_child_create( - struct kiwmi_view_child *parent, - struct kiwmi_view *view, - struct wlr_surface *wlr_surface, - enum kiwmi_view_child_type type, - const struct kiwmi_view_child_impl *impl); -struct kiwmi_view_child *view_child_subsurface_create( - struct kiwmi_view_child *parent, - struct kiwmi_view *view, - struct wlr_subsurface *subsurface); - #endif /* KIWMI_DESKTOP_VIEW_H */ diff --git a/kiwmi/desktop/desktop.c b/kiwmi/desktop/desktop.c index 7e3531a..5fd4ba7 100644 --- a/kiwmi/desktop/desktop.c +++ b/kiwmi/desktop/desktop.c @@ -48,11 +48,6 @@ desktop_init(struct kiwmi_desktop *desktop) wlr_xdg_output_manager_v1_create( server->wl_display, desktop->output_layout); - desktop->bg_color[0] = 0.1f; - desktop->bg_color[1] = 0.1f; - desktop->bg_color[2] = 0.1f; - desktop->bg_color[3] = 1.0f; - desktop->scene = wlr_scene_create(); if (!desktop->scene) { wlr_log(WLR_ERROR, "failed to create scene"); diff --git a/kiwmi/desktop/layer_shell.c b/kiwmi/desktop/layer_shell.c index 3853c28..3b77a0c 100644 --- a/kiwmi/desktop/layer_shell.c +++ b/kiwmi/desktop/layer_shell.c @@ -251,14 +251,14 @@ arrange_layer( continue; } - layer->geom = arranged_area; - wlr_scene_node_set_position( - &layer->desktop_surface.tree->node, layer->geom.x, layer->geom.y); + &layer->desktop_surface.tree->node, + arranged_area.x, + arranged_area.y); wlr_scene_node_set_position( &layer->desktop_surface.popups_tree->node, - layer->geom.x, - layer->geom.y); + arranged_area.x, + arranged_area.y); apply_exclusive( usable_area, @@ -360,36 +360,6 @@ arrange_layers(struct kiwmi_output *output) seat_focus_layer(seat, topmost); } -struct kiwmi_layer * -layer_at( - struct wl_list *layers, - struct wlr_surface **surface, - double ox, - double oy, - double *sx, - double *sy) -{ - struct kiwmi_layer *layer; - wl_list_for_each_reverse (layer, layers, link) { - double layer_sx = ox - layer->geom.x; - double layer_sy = oy - layer->geom.y; - - double _sx; - double _sy; - struct wlr_surface *_surface = wlr_layer_surface_v1_surface_at( - layer->layer_surface, layer_sx, layer_sy, &_sx, &_sy); - - if (_surface) { - *sx = _sx; - *sy = _sy; - *surface = _surface; - return layer; - } - } - - return NULL; -} - static struct kiwmi_output * layer_desktop_surface_get_output(struct kiwmi_desktop_surface *desktop_surface) { diff --git a/kiwmi/desktop/view.c b/kiwmi/desktop/view.c index 4bba2ad..fdc5cc0 100644 --- a/kiwmi/desktop/view.c +++ b/kiwmi/desktop/view.c @@ -25,17 +25,6 @@ view_close(struct kiwmi_view *view) } } -void -view_for_each_surface( - struct kiwmi_view *view, - wlr_surface_iterator_func_t callback, - void *user_data) -{ - if (view->impl->for_each_surface) { - view->impl->for_each_surface(view, callback, user_data); - } -} - pid_t view_get_pid(struct kiwmi_view *view) { @@ -86,22 +75,12 @@ view_set_size(struct kiwmi_view *view, uint32_t width, uint32_t height) { if (view->impl->set_size) { view->impl->set_size(view, width, height); - - struct kiwmi_view_child *child; - wl_list_for_each (child, &view->children, link) { - if (child->impl && child->impl->reconfigure) { - child->impl->reconfigure(child); - } - } } } void view_set_pos(struct kiwmi_view *view, uint32_t x, uint32_t y) { - view->x = x; - view->y = y; - wlr_scene_node_set_position(&view->desktop_surface.tree->node, x, y); wlr_scene_node_set_position(&view->desktop_surface.popups_tree->node, x, y); @@ -125,8 +104,6 @@ view_set_tiled(struct kiwmi_view *view, enum wlr_edges edges) void view_set_hidden(struct kiwmi_view *view, bool hidden) { - view->hidden = hidden; - if (!view->mapped) { return; } @@ -206,31 +183,6 @@ view_resize(struct kiwmi_view *view, uint32_t edges) view_begin_interactive(view, KIWMI_CURSOR_RESIZE, edges); } -/** - * Creates a kiwmi_view_child for each subsurface of either the 'child' or the - * 'view'. 'child' can be NULL, 'view' should never be. - */ -void -view_init_subsurfaces(struct kiwmi_view_child *child, struct kiwmi_view *view) -{ - struct wlr_surface *surface = - child ? child->wlr_surface : view->wlr_surface; - if (!surface) { - wlr_log(WLR_ERROR, "Attempting to init_subsurfaces without a surface"); - return; - } - - struct wlr_subsurface *subsurface; - wl_list_for_each ( - subsurface, &surface->current.subsurfaces_below, current.link) { - view_child_subsurface_create(child, view, subsurface); - } - wl_list_for_each ( - subsurface, &surface->current.subsurfaces_above, current.link) { - view_child_subsurface_create(child, view, subsurface); - } -} - static struct kiwmi_output * view_desktop_surface_get_output(struct kiwmi_desktop_surface *desktop_surface) { @@ -278,14 +230,8 @@ view_create( view->type = type; view->impl = impl; view->mapped = false; - view->hidden = true; view->decoration = NULL; - view->x = 0; - view->y = 0; - - wl_list_init(&view->children); - view->desktop_surface.type = KIWMI_DESKTOP_SURFACE_VIEW; view->desktop_surface.impl = &view_desktop_surface_impl; @@ -309,171 +255,3 @@ view_create( return view; } - -bool -view_child_is_mapped(struct kiwmi_view_child *child) -{ - if (!child->mapped) { - return false; - } - - struct kiwmi_view_child *parent = child->parent; - while (parent) { - if (!parent->mapped) { - return false; - } - parent = parent->parent; - } - - return child->view->mapped; -} - -void -view_child_destroy(struct kiwmi_view_child *child) -{ - wl_list_remove(&child->link); - child->parent = NULL; - - struct kiwmi_view_child *subchild, *tmpchild; - wl_list_for_each_safe (subchild, tmpchild, &child->children, link) { - subchild->mapped = false; - view_child_destroy(subchild); - } - - wl_list_remove(&child->commit.link); - wl_list_remove(&child->map.link); - wl_list_remove(&child->unmap.link); - wl_list_remove(&child->new_popup.link); - wl_list_remove(&child->new_subsurface.link); - wl_list_remove(&child->surface_destroy.link); - wl_list_remove(&child->extension_destroy.link); - - free(child); -} - -static void -view_child_subsurface_extension_destroy_notify( - struct wl_listener *listener, - void *UNUSED(data)) -{ - struct kiwmi_view_child *child = - wl_container_of(listener, child, extension_destroy); - view_child_destroy(child); -} - -static void -view_child_surface_destroy_notify( - struct wl_listener *listener, - void *UNUSED(data)) -{ - struct kiwmi_view_child *child = - wl_container_of(listener, child, surface_destroy); - view_child_destroy(child); -} - -static void -view_child_commit_notify() -{ -} - -static void -view_child_new_subsurface_notify(struct wl_listener *listener, void *data) -{ - struct kiwmi_view_child *child = - wl_container_of(listener, child, new_subsurface); - struct wlr_subsurface *subsurface = data; - view_child_subsurface_create(child, child->view, subsurface); -} - -static void -view_child_map_notify(struct wl_listener *listener, void *UNUSED(data)) -{ - struct kiwmi_view_child *child = wl_container_of(listener, child, map); - child->mapped = true; -} - -static void -view_child_unmap_notify(struct wl_listener *listener, void *UNUSED(data)) -{ - struct kiwmi_view_child *child = wl_container_of(listener, child, unmap); - child->mapped = false; -} - -struct kiwmi_view_child * -view_child_create( - struct kiwmi_view_child *parent, - struct kiwmi_view *view, - struct wlr_surface *wlr_surface, - enum kiwmi_view_child_type type, - const struct kiwmi_view_child_impl *impl) -{ - struct kiwmi_view_child *child = calloc(1, sizeof(*child)); - if (!child) { - wlr_log(WLR_ERROR, "Failed to allocate view_child"); - return NULL; - } - - child->type = type; - child->impl = impl; - child->view = view; - child->wlr_surface = wlr_surface; - child->mapped = false; - - if (parent) { - child->parent = parent; - wl_list_insert(&parent->children, &child->link); - } else { - wl_list_insert(&view->children, &child->link); - } - - wl_list_init(&child->children); - - child->commit.notify = view_child_commit_notify; - wl_signal_add(&wlr_surface->events.commit, &child->commit); - - child->map.notify = view_child_map_notify; - child->unmap.notify = view_child_unmap_notify; - - // wlr_surface doesn't have these events, but its extensions usually do - wl_list_init(&child->map.link); - wl_list_init(&child->unmap.link); - - child->new_subsurface.notify = view_child_new_subsurface_notify; - wl_signal_add(&wlr_surface->events.new_subsurface, &child->new_subsurface); - - child->surface_destroy.notify = view_child_surface_destroy_notify; - wl_signal_add(&wlr_surface->events.destroy, &child->surface_destroy); - - // Possibly unused - wl_list_init(&child->new_popup.link); - wl_list_init(&child->extension_destroy.link); - - view_init_subsurfaces(child, child->view); - - return child; -} - -struct kiwmi_view_child * -view_child_subsurface_create( - struct kiwmi_view_child *parent, - struct kiwmi_view *view, - struct wlr_subsurface *subsurface) -{ - struct kiwmi_view_child *child = view_child_create( - parent, view, subsurface->surface, KIWMI_VIEW_CHILD_SUBSURFACE, NULL); - if (!child) { - return NULL; - } - - child->wlr_subsurface = subsurface; - child->mapped = subsurface->mapped; - - wl_signal_add(&subsurface->events.map, &child->map); - wl_signal_add(&subsurface->events.unmap, &child->unmap); - - child->extension_destroy.notify = - view_child_subsurface_extension_destroy_notify; - wl_signal_add(&subsurface->events.destroy, &child->extension_destroy); - - return child; -} diff --git a/kiwmi/desktop/xdg_shell.c b/kiwmi/desktop/xdg_shell.c index 36feaca..eac3839 100644 --- a/kiwmi/desktop/xdg_shell.c +++ b/kiwmi/desktop/xdg_shell.c @@ -26,88 +26,6 @@ #include "input/seat.h" #include "server.h" -static struct kiwmi_view_child *view_child_popup_create( - struct kiwmi_view_child *parent, - struct kiwmi_view *view, - struct wlr_xdg_popup *wlr_popup); - -static void -popup_new_popup_notify(struct wl_listener *listener, void *data) -{ - struct kiwmi_view_child *popup = - wl_container_of(listener, popup, new_popup); - struct wlr_xdg_popup *wlr_popup = data; - view_child_popup_create(popup, popup->view, wlr_popup); -} - -static void -popup_extension_destroy_notify(struct wl_listener *listener, void *UNUSED(data)) -{ - struct kiwmi_view_child *popup = - wl_container_of(listener, popup, extension_destroy); - view_child_destroy(popup); -} - -static void -popup_reconfigure(struct kiwmi_view_child *popup) -{ - if (popup->type != KIWMI_VIEW_CHILD_XDG_POPUP) { - wlr_log(WLR_ERROR, "Expected an xdg_popup view_child"); - return; - } -} - -static const struct kiwmi_view_child_impl xdg_popup_view_child_impl = { - .reconfigure = popup_reconfigure, -}; - -static struct kiwmi_view_child * -view_child_popup_create( - struct kiwmi_view_child *parent, - struct kiwmi_view *view, - struct wlr_xdg_popup *wlr_popup) -{ - struct kiwmi_view_child *child = view_child_create( - parent, - view, - wlr_popup->base->surface, - KIWMI_VIEW_CHILD_XDG_POPUP, - &xdg_popup_view_child_impl); - if (!child) { - return NULL; - } - - child->wlr_xdg_popup = wlr_popup; - child->mapped = wlr_popup->base->mapped; - - wl_signal_add(&wlr_popup->base->events.map, &child->map); - wl_signal_add(&wlr_popup->base->events.unmap, &child->unmap); - - child->new_popup.notify = popup_new_popup_notify; - wl_signal_add(&wlr_popup->base->events.new_popup, &child->new_popup); - - child->extension_destroy.notify = popup_extension_destroy_notify; - wl_signal_add(&wlr_popup->base->events.destroy, &child->extension_destroy); - - return child; -} - -static void -xdg_surface_new_popup_notify(struct wl_listener *listener, void *data) -{ - struct kiwmi_view *view = wl_container_of(listener, view, new_popup); - struct wlr_xdg_popup *wlr_popup = data; - view_child_popup_create(NULL, view, wlr_popup); -} - -static void -xdg_surface_new_subsurface_notify(struct wl_listener *listener, void *data) -{ - struct kiwmi_view *view = wl_container_of(listener, view, new_subsurface); - struct wlr_subsurface *subsurface = data; - view_child_subsurface_create(NULL, view, subsurface); -} - static void xdg_surface_map_notify(struct wl_listener *listener, void *UNUSED(data)) { @@ -143,12 +61,16 @@ xdg_surface_commit_notify(struct wl_listener *listener, void *UNUSED(data)) { struct kiwmi_view *view = wl_container_of(listener, view, commit); - struct kiwmi_desktop *desktop = view->desktop; - struct kiwmi_server *server = wl_container_of(desktop, server, desktop); - struct kiwmi_cursor *cursor = server->input.cursor; - cursor_refresh_focus(cursor, NULL, NULL, NULL); + struct wlr_box geom; + wlr_xdg_surface_get_geometry(view->xdg_surface, &geom); - wlr_xdg_surface_get_geometry(view->xdg_surface, &view->geom); + if (memcmp(&view->geom, &geom, sizeof(geom)) != 0) { + memcpy(&view->geom, &geom, sizeof(geom)); + + struct kiwmi_desktop *desktop = view->desktop; + struct kiwmi_server *server = wl_container_of(desktop, server, desktop); + cursor_refresh_focus(server->input.cursor, NULL, NULL, NULL); + } } static void @@ -168,24 +90,15 @@ xdg_surface_destroy_notify(struct wl_listener *listener, void *UNUSED(data)) } cursor_refresh_focus(server->input.cursor, NULL, NULL, NULL); - struct kiwmi_view_child *child, *tmpchild; - wl_list_for_each_safe (child, tmpchild, &view->children, link) { - child->mapped = false; - view_child_destroy(child); - } - if (view->decoration) { view->decoration->view = NULL; } wl_list_remove(&view->link); - wl_list_remove(&view->children); wl_list_remove(&view->map.link); wl_list_remove(&view->unmap.link); wl_list_remove(&view->commit.link); wl_list_remove(&view->destroy.link); - wl_list_remove(&view->new_popup.link); - wl_list_remove(&view->new_subsurface.link); wl_list_remove(&view->request_move.link); wl_list_remove(&view->request_resize.link); @@ -228,15 +141,6 @@ xdg_shell_view_close(struct kiwmi_view *view) } } -static void -xdg_shell_view_for_each_surface( - struct kiwmi_view *view, - wlr_surface_iterator_func_t callback, - void *user_data) -{ - wlr_xdg_surface_for_each_surface(view->xdg_surface, callback, user_data); -} - static pid_t xdg_shell_view_get_pid(struct kiwmi_view *view) { @@ -284,26 +188,13 @@ xdg_shell_view_set_tiled(struct kiwmi_view *view, enum wlr_edges edges) wlr_xdg_toplevel_set_tiled(view->xdg_surface, edges); } -struct wlr_surface * -xdg_shell_view_surface_at( - struct kiwmi_view *view, - double sx, - double sy, - double *sub_x, - double *sub_y) -{ - return wlr_xdg_surface_surface_at(view->xdg_surface, sx, sy, sub_x, sub_y); -} - static const struct kiwmi_view_impl xdg_shell_view_impl = { - .close = xdg_shell_view_close, - .for_each_surface = xdg_shell_view_for_each_surface, - .get_pid = xdg_shell_view_get_pid, - .get_string_prop = xdg_shell_view_get_string_prop, - .set_activated = xdg_shell_view_set_activated, - .set_size = xdg_shell_view_set_size, - .set_tiled = xdg_shell_view_set_tiled, - .surface_at = xdg_shell_view_surface_at, + .close = xdg_shell_view_close, + .get_pid = xdg_shell_view_get_pid, + .get_string_prop = xdg_shell_view_get_string_prop, + .set_activated = xdg_shell_view_set_activated, + .set_size = xdg_shell_view_set_size, + .set_tiled = xdg_shell_view_set_tiled, }; void @@ -361,13 +252,6 @@ xdg_shell_new_surface_notify(struct wl_listener *listener, void *data) view->destroy.notify = xdg_surface_destroy_notify; wl_signal_add(&xdg_surface->events.destroy, &view->destroy); - view->new_popup.notify = xdg_surface_new_popup_notify; - wl_signal_add(&xdg_surface->events.new_popup, &view->new_popup); - - view->new_subsurface.notify = xdg_surface_new_subsurface_notify; - wl_signal_add( - &xdg_surface->surface->events.new_subsurface, &view->new_subsurface); - view->request_move.notify = xdg_toplevel_request_move_notify; wl_signal_add( &xdg_surface->toplevel->events.request_move, &view->request_move); @@ -376,8 +260,6 @@ xdg_shell_new_surface_notify(struct wl_listener *listener, void *data) wl_signal_add( &xdg_surface->toplevel->events.request_resize, &view->request_resize); - view_init_subsurfaces(NULL, view); - wlr_xdg_surface_get_geometry(view->xdg_surface, &view->geom); wl_list_insert(&desktop->views, &view->link); diff --git a/kiwmi/luak/kiwmi_server.c b/kiwmi/luak/kiwmi_server.c index ec0bccc..cf44ea2 100644 --- a/kiwmi/luak/kiwmi_server.c +++ b/kiwmi/luak/kiwmi_server.c @@ -65,10 +65,7 @@ l_kiwmi_server_bg_color(lua_State *L) return luaL_argerror(L, 2, "not a valid color"); } - server->desktop.bg_color[0] = color[0]; - server->desktop.bg_color[1] = color[1]; - server->desktop.bg_color[2] = color[2]; - // ignore alpha + // Ignore alpha (color channels are already premultiplied) color[3] = 1.0f; wlr_scene_rect_set_color(server->desktop.background_rect, color);