55 lines
2.4 KiB
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
|