hikari/src/indicator.c

157 lines
4.3 KiB
C

#include <hikari/indicator.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_matrix.h>
#include <hikari/configuration.h>
#include <hikari/mark.h>
#include <hikari/render_data.h>
#include <hikari/sheet.h>
#include <hikari/view.h>
void
hikari_indicator_init(struct hikari_indicator *indicator, float color[static 4])
{
int width;
hikari_font_metrics(
&hikari_configuration.font, "", &width, &indicator->bar_height);
indicator->bar_height += 8;
int offset = 5;
hikari_indicator_bar_init(&indicator->title, indicator, offset);
offset += indicator->bar_height + 5;
hikari_indicator_bar_init(&indicator->sheet, indicator, offset);
offset += indicator->bar_height + 5;
hikari_indicator_bar_init(&indicator->group, indicator, offset);
offset += indicator->bar_height + 5;
hikari_indicator_bar_init(&indicator->mark, indicator, offset);
}
void
hikari_indicator_fini(struct hikari_indicator *indicator)
{
hikari_indicator_bar_fini(&indicator->title);
hikari_indicator_bar_fini(&indicator->sheet);
hikari_indicator_bar_fini(&indicator->group);
hikari_indicator_bar_fini(&indicator->mark);
}
void
hikari_indicator_update(struct hikari_indicator *indicator,
struct hikari_view *view,
float background[static 4])
{
assert(view != NULL);
struct wlr_box *geometry = hikari_view_geometry(view);
struct hikari_output *output = view->output;
hikari_indicator_update_title(
indicator, geometry, output, view->title, background);
hikari_indicator_update_sheet(indicator,
geometry,
output,
view->sheet,
background,
hikari_view_is_iconified(view),
hikari_view_is_floating(view));
if (view->sheet->group != view->group) {
hikari_indicator_update_group(
indicator, geometry, output, view->group->name, background);
} else {
hikari_indicator_update_group(indicator, geometry, output, "", background);
}
if (view->mark != NULL) {
hikari_indicator_update_mark(
indicator, geometry, output, view->mark->name, background);
} else {
hikari_indicator_update_mark(indicator, geometry, output, "", background);
}
}
void
hikari_indicator_render(
struct hikari_indicator *indicator, struct hikari_render_data *render_data)
{
struct wlr_box *border_geometry = render_data->geometry;
struct wlr_box geometry = *border_geometry;
render_data->geometry = &geometry;
geometry.x += 5;
struct hikari_indicator_bar *title_bar = &indicator->title;
geometry.y += 5;
hikari_indicator_bar_render(title_bar, render_data);
struct hikari_indicator_bar *sheet_bar = &indicator->sheet;
geometry.y += indicator->bar_height + 5;
hikari_indicator_bar_render(sheet_bar, render_data);
struct hikari_indicator_bar *group_bar = &indicator->group;
geometry.y += indicator->bar_height + 5;
hikari_indicator_bar_render(group_bar, render_data);
struct hikari_indicator_bar *mark_bar = &indicator->mark;
geometry.y += indicator->bar_height + 5;
hikari_indicator_bar_render(mark_bar, render_data);
render_data->geometry = border_geometry;
}
void
hikari_indicator_update_sheet(struct hikari_indicator *indicator,
struct wlr_box *view_geometry,
struct hikari_output *output,
struct hikari_sheet *sheet,
float background[static 4],
bool iconified,
bool floating)
{
char text[9];
int i = 0;
if (floating) {
text[i++] = '~';
}
if (iconified) {
text[i++] = '[';
text[i++] = sheet->group->name[0];
text[i++] = ']';
} else {
text[i++] = sheet->group->name[0];
}
if (sheet->workspace->sheet != sheet) {
text[i++] = ' ';
text[i++] = '@';
text[i++] = ' ';
text[i++] = sheet->workspace->sheet->group->name[0];
}
text[i] = '\0';
hikari_indicator_bar_update(
&indicator->sheet, view_geometry, output, text, background);
}
void
hikari_indicator_damage(
struct hikari_indicator *indicator, struct hikari_view *view)
{
assert(indicator != NULL);
assert(view != NULL);
struct wlr_box *geometry = hikari_view_border_geometry(view);
struct hikari_output *output = view->output;
hikari_indicator_bar_damage(&indicator->title, geometry, output);
hikari_indicator_bar_damage(&indicator->sheet, geometry, output);
hikari_indicator_bar_damage(&indicator->group, geometry, output);
hikari_indicator_bar_damage(&indicator->mark, geometry, output);
}