hikari/src/tile.c

55 lines
2.4 KiB
C

#include <hikari/tile.h>
#include <wayland-util.h>
#include <hikari/layout.h>
#include <hikari/sheet.h>
#include <hikari/view.h>
void
hikari_tile_init(struct hikari_tile *tile,
struct hikari_view *view,
struct wlr_box *tile_geometry,
struct wlr_box *view_geometry)
{
tile->view = view;
tile->tile_geometry = *tile_geometry;
tile->view_geometry = *view_geometry;
}
void
hikari_tile_fini(struct hikari_tile *tile)
{
assert(tile->view->tile == NULL);
wl_list_remove(&tile->layout_tiles);
}
#define CYCLE_LAYOUT(link) \
struct hikari_view *hikari_tile_##link##_view(struct hikari_tile *tile) \
{ \
assert(!hikari_view_is_hidden(tile->view)); \
\
struct wl_list *link = tile->layout_tiles.link; \
struct hikari_tile *link##_tile; \
struct wl_list *tiles = &hikari_server.workspace->sheet->layout->tiles; \
\
do { \
if (link == tiles) { \
link##_tile = wl_container_of(tiles->link, link##_tile, layout_tiles); \
} else { \
link##_tile = wl_container_of(link, link##_tile, layout_tiles); \
} \
link = link->link; \
} while (hikari_view_is_hidden(link##_tile->view)); \
\
assert(link##_tile != NULL); \
assert(link##_tile->view != NULL); \
assert(!hikari_view_is_hidden(link##_tile->view)); \
\
return link##_tile->view; \
}
CYCLE_LAYOUT(next)
CYCLE_LAYOUT(prev)
#undef CYCLE_LAYOUT