Cleanup unneeded code after switching to wlr_scene
This commit is contained in:
parent
6abedbee48
commit
abe883a6f3
8 changed files with 21 additions and 482 deletions
|
@ -26,7 +26,6 @@ struct kiwmi_desktop {
|
||||||
struct wl_list outputs; // struct kiwmi_output::link
|
struct wl_list outputs; // struct kiwmi_output::link
|
||||||
struct wl_list views; // struct kiwmi_view::link
|
struct wl_list views; // struct kiwmi_view::link
|
||||||
|
|
||||||
float bg_color[4];
|
|
||||||
struct wlr_scene *scene;
|
struct wlr_scene *scene;
|
||||||
struct wlr_scene_rect *background_rect;
|
struct wlr_scene_rect *background_rect;
|
||||||
struct wlr_scene_tree *strata[KIWMI_STRATA_COUNT];
|
struct wlr_scene_tree *strata[KIWMI_STRATA_COUNT];
|
||||||
|
|
|
@ -30,19 +30,10 @@ struct kiwmi_layer {
|
||||||
struct wl_listener commit;
|
struct wl_listener commit;
|
||||||
struct wl_listener map;
|
struct wl_listener map;
|
||||||
struct wl_listener unmap;
|
struct wl_listener unmap;
|
||||||
|
|
||||||
struct wlr_box geom;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void arrange_layers(struct kiwmi_output *output);
|
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);
|
void layer_shell_new_surface_notify(struct wl_listener *listener, void *data);
|
||||||
|
|
||||||
#endif /* KIWMI_DESKTOP_LAYER_SHELL_H */
|
#endif /* KIWMI_DESKTOP_LAYER_SHELL_H */
|
||||||
|
|
|
@ -30,7 +30,6 @@ enum kiwmi_view_type {
|
||||||
|
|
||||||
struct kiwmi_view {
|
struct kiwmi_view {
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
struct wl_list children; // struct kiwmi_view_child::link
|
|
||||||
struct kiwmi_desktop_surface desktop_surface;
|
struct kiwmi_desktop_surface desktop_surface;
|
||||||
|
|
||||||
struct kiwmi_desktop *desktop;
|
struct kiwmi_desktop *desktop;
|
||||||
|
@ -50,16 +49,10 @@ struct kiwmi_view {
|
||||||
struct wl_listener unmap;
|
struct wl_listener unmap;
|
||||||
struct wl_listener commit;
|
struct wl_listener commit;
|
||||||
struct wl_listener destroy;
|
struct wl_listener destroy;
|
||||||
struct wl_listener new_popup;
|
|
||||||
struct wl_listener new_subsurface;
|
|
||||||
struct wl_listener request_move;
|
struct wl_listener request_move;
|
||||||
struct wl_listener request_resize;
|
struct wl_listener request_resize;
|
||||||
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
|
|
||||||
bool mapped;
|
bool mapped;
|
||||||
bool hidden;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct wl_signal unmap;
|
struct wl_signal unmap;
|
||||||
|
@ -74,58 +67,12 @@ struct kiwmi_view {
|
||||||
|
|
||||||
struct kiwmi_view_impl {
|
struct kiwmi_view_impl {
|
||||||
void (*close)(struct kiwmi_view *view);
|
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);
|
pid_t (*get_pid)(struct kiwmi_view *view);
|
||||||
void (*set_activated)(struct kiwmi_view *view, bool activated);
|
void (*set_activated)(struct kiwmi_view *view, bool activated);
|
||||||
void (*set_size)(struct kiwmi_view *view, uint32_t width, uint32_t height);
|
void (*set_size)(struct kiwmi_view *view, uint32_t width, uint32_t height);
|
||||||
const char *(
|
const char *(
|
||||||
*get_string_prop)(struct kiwmi_view *view, enum kiwmi_view_prop prop);
|
*get_string_prop)(struct kiwmi_view *view, enum kiwmi_view_prop prop);
|
||||||
void (*set_tiled)(struct kiwmi_view *view, enum wlr_edges edges);
|
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 {
|
struct kiwmi_request_resize_event {
|
||||||
|
@ -134,10 +81,6 @@ struct kiwmi_request_resize_event {
|
||||||
};
|
};
|
||||||
|
|
||||||
void view_close(struct kiwmi_view *view);
|
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);
|
pid_t view_get_pid(struct kiwmi_view *view);
|
||||||
void view_get_size(struct kiwmi_view *view, uint32_t *width, uint32_t *height);
|
void view_get_size(struct kiwmi_view *view, uint32_t *width, uint32_t *height);
|
||||||
const char *view_get_app_id(struct kiwmi_view *view);
|
const char *view_get_app_id(struct kiwmi_view *view);
|
||||||
|
@ -157,20 +100,4 @@ struct kiwmi_view *view_create(
|
||||||
enum kiwmi_view_type type,
|
enum kiwmi_view_type type,
|
||||||
const struct kiwmi_view_impl *impl);
|
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 */
|
#endif /* KIWMI_DESKTOP_VIEW_H */
|
||||||
|
|
|
@ -48,11 +48,6 @@ desktop_init(struct kiwmi_desktop *desktop)
|
||||||
wlr_xdg_output_manager_v1_create(
|
wlr_xdg_output_manager_v1_create(
|
||||||
server->wl_display, desktop->output_layout);
|
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();
|
desktop->scene = wlr_scene_create();
|
||||||
if (!desktop->scene) {
|
if (!desktop->scene) {
|
||||||
wlr_log(WLR_ERROR, "failed to create scene");
|
wlr_log(WLR_ERROR, "failed to create scene");
|
||||||
|
|
|
@ -251,14 +251,14 @@ arrange_layer(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
layer->geom = arranged_area;
|
|
||||||
|
|
||||||
wlr_scene_node_set_position(
|
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(
|
wlr_scene_node_set_position(
|
||||||
&layer->desktop_surface.popups_tree->node,
|
&layer->desktop_surface.popups_tree->node,
|
||||||
layer->geom.x,
|
arranged_area.x,
|
||||||
layer->geom.y);
|
arranged_area.y);
|
||||||
|
|
||||||
apply_exclusive(
|
apply_exclusive(
|
||||||
usable_area,
|
usable_area,
|
||||||
|
@ -360,36 +360,6 @@ arrange_layers(struct kiwmi_output *output)
|
||||||
seat_focus_layer(seat, topmost);
|
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 *
|
static struct kiwmi_output *
|
||||||
layer_desktop_surface_get_output(struct kiwmi_desktop_surface *desktop_surface)
|
layer_desktop_surface_get_output(struct kiwmi_desktop_surface *desktop_surface)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
pid_t
|
||||||
view_get_pid(struct kiwmi_view *view)
|
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) {
|
if (view->impl->set_size) {
|
||||||
view->impl->set_size(view, width, height);
|
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
|
void
|
||||||
view_set_pos(struct kiwmi_view *view, uint32_t x, uint32_t y)
|
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.tree->node, x, y);
|
||||||
wlr_scene_node_set_position(&view->desktop_surface.popups_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
|
void
|
||||||
view_set_hidden(struct kiwmi_view *view, bool hidden)
|
view_set_hidden(struct kiwmi_view *view, bool hidden)
|
||||||
{
|
{
|
||||||
view->hidden = hidden;
|
|
||||||
|
|
||||||
if (!view->mapped) {
|
if (!view->mapped) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -206,31 +183,6 @@ view_resize(struct kiwmi_view *view, uint32_t edges)
|
||||||
view_begin_interactive(view, KIWMI_CURSOR_RESIZE, 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 *
|
static struct kiwmi_output *
|
||||||
view_desktop_surface_get_output(struct kiwmi_desktop_surface *desktop_surface)
|
view_desktop_surface_get_output(struct kiwmi_desktop_surface *desktop_surface)
|
||||||
{
|
{
|
||||||
|
@ -278,14 +230,8 @@ view_create(
|
||||||
view->type = type;
|
view->type = type;
|
||||||
view->impl = impl;
|
view->impl = impl;
|
||||||
view->mapped = false;
|
view->mapped = false;
|
||||||
view->hidden = true;
|
|
||||||
view->decoration = NULL;
|
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.type = KIWMI_DESKTOP_SURFACE_VIEW;
|
||||||
view->desktop_surface.impl = &view_desktop_surface_impl;
|
view->desktop_surface.impl = &view_desktop_surface_impl;
|
||||||
|
|
||||||
|
@ -309,171 +255,3 @@ view_create(
|
||||||
|
|
||||||
return view;
|
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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -26,88 +26,6 @@
|
||||||
#include "input/seat.h"
|
#include "input/seat.h"
|
||||||
#include "server.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
|
static void
|
||||||
xdg_surface_map_notify(struct wl_listener *listener, void *UNUSED(data))
|
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_view *view = wl_container_of(listener, view, commit);
|
||||||
|
|
||||||
|
struct wlr_box geom;
|
||||||
|
wlr_xdg_surface_get_geometry(view->xdg_surface, &geom);
|
||||||
|
|
||||||
|
if (memcmp(&view->geom, &geom, sizeof(geom)) != 0) {
|
||||||
|
memcpy(&view->geom, &geom, sizeof(geom));
|
||||||
|
|
||||||
struct kiwmi_desktop *desktop = view->desktop;
|
struct kiwmi_desktop *desktop = view->desktop;
|
||||||
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
|
struct kiwmi_server *server = wl_container_of(desktop, server, desktop);
|
||||||
struct kiwmi_cursor *cursor = server->input.cursor;
|
cursor_refresh_focus(server->input.cursor, NULL, NULL, NULL);
|
||||||
cursor_refresh_focus(cursor, NULL, NULL, NULL);
|
}
|
||||||
|
|
||||||
wlr_xdg_surface_get_geometry(view->xdg_surface, &view->geom);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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);
|
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) {
|
if (view->decoration) {
|
||||||
view->decoration->view = NULL;
|
view->decoration->view = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_list_remove(&view->link);
|
wl_list_remove(&view->link);
|
||||||
wl_list_remove(&view->children);
|
|
||||||
wl_list_remove(&view->map.link);
|
wl_list_remove(&view->map.link);
|
||||||
wl_list_remove(&view->unmap.link);
|
wl_list_remove(&view->unmap.link);
|
||||||
wl_list_remove(&view->commit.link);
|
wl_list_remove(&view->commit.link);
|
||||||
wl_list_remove(&view->destroy.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_move.link);
|
||||||
wl_list_remove(&view->request_resize.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
|
static pid_t
|
||||||
xdg_shell_view_get_pid(struct kiwmi_view *view)
|
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);
|
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 = {
|
static const struct kiwmi_view_impl xdg_shell_view_impl = {
|
||||||
.close = xdg_shell_view_close,
|
.close = xdg_shell_view_close,
|
||||||
.for_each_surface = xdg_shell_view_for_each_surface,
|
|
||||||
.get_pid = xdg_shell_view_get_pid,
|
.get_pid = xdg_shell_view_get_pid,
|
||||||
.get_string_prop = xdg_shell_view_get_string_prop,
|
.get_string_prop = xdg_shell_view_get_string_prop,
|
||||||
.set_activated = xdg_shell_view_set_activated,
|
.set_activated = xdg_shell_view_set_activated,
|
||||||
.set_size = xdg_shell_view_set_size,
|
.set_size = xdg_shell_view_set_size,
|
||||||
.set_tiled = xdg_shell_view_set_tiled,
|
.set_tiled = xdg_shell_view_set_tiled,
|
||||||
.surface_at = xdg_shell_view_surface_at,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -361,13 +252,6 @@ xdg_shell_new_surface_notify(struct wl_listener *listener, void *data)
|
||||||
view->destroy.notify = xdg_surface_destroy_notify;
|
view->destroy.notify = xdg_surface_destroy_notify;
|
||||||
wl_signal_add(&xdg_surface->events.destroy, &view->destroy);
|
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;
|
view->request_move.notify = xdg_toplevel_request_move_notify;
|
||||||
wl_signal_add(
|
wl_signal_add(
|
||||||
&xdg_surface->toplevel->events.request_move, &view->request_move);
|
&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(
|
wl_signal_add(
|
||||||
&xdg_surface->toplevel->events.request_resize, &view->request_resize);
|
&xdg_surface->toplevel->events.request_resize, &view->request_resize);
|
||||||
|
|
||||||
view_init_subsurfaces(NULL, view);
|
|
||||||
|
|
||||||
wlr_xdg_surface_get_geometry(view->xdg_surface, &view->geom);
|
wlr_xdg_surface_get_geometry(view->xdg_surface, &view->geom);
|
||||||
|
|
||||||
wl_list_insert(&desktop->views, &view->link);
|
wl_list_insert(&desktop->views, &view->link);
|
||||||
|
|
|
@ -65,10 +65,7 @@ l_kiwmi_server_bg_color(lua_State *L)
|
||||||
return luaL_argerror(L, 2, "not a valid color");
|
return luaL_argerror(L, 2, "not a valid color");
|
||||||
}
|
}
|
||||||
|
|
||||||
server->desktop.bg_color[0] = color[0];
|
// Ignore alpha (color channels are already premultiplied)
|
||||||
server->desktop.bg_color[1] = color[1];
|
|
||||||
server->desktop.bg_color[2] = color[2];
|
|
||||||
// ignore alpha
|
|
||||||
color[3] = 1.0f;
|
color[3] = 1.0f;
|
||||||
|
|
||||||
wlr_scene_rect_set_color(server->desktop.background_rect, color);
|
wlr_scene_rect_set_color(server->desktop.background_rect, color);
|
||||||
|
|
Loading…
Reference in a new issue