1 #include <hikari/indicator.h>
2
3 #include <wlr/render/wlr_renderer.h>
4 #include <wlr/types/wlr_matrix.h>
5
6 #include <hikari/configuration.h>
7 #include <hikari/mark.h>
8 #include <hikari/renderer.h>
9 #include <hikari/sheet.h>
10 #include <hikari/view.h>
11
12 void
hikari_indicator_init(struct hikari_indicator * indicator,float color[static4])13 hikari_indicator_init(struct hikari_indicator *indicator, float color[static 4])
14 {
15 int bar_height = hikari_configuration->font.height;
16
17 int offset = 5;
18 hikari_indicator_bar_init(&indicator->title, indicator, offset, color);
19 offset += bar_height + 5;
20 hikari_indicator_bar_init(&indicator->sheet, indicator, offset, color);
21 offset += bar_height + 5;
22 hikari_indicator_bar_init(&indicator->group, indicator, offset, color);
23 offset += bar_height + 5;
24 hikari_indicator_bar_init(&indicator->mark, indicator, offset, color);
25 }
26
27 void
hikari_indicator_fini(struct hikari_indicator * indicator)28 hikari_indicator_fini(struct hikari_indicator *indicator)
29 {
30 hikari_indicator_bar_fini(&indicator->title);
31 hikari_indicator_bar_fini(&indicator->sheet);
32 hikari_indicator_bar_fini(&indicator->group);
33 hikari_indicator_bar_fini(&indicator->mark);
34 }
35
36 void
hikari_indicator_update(struct hikari_indicator * indicator,struct hikari_view * view)37 hikari_indicator_update(
38 struct hikari_indicator *indicator, struct hikari_view *view)
39 {
40 assert(view != NULL);
41
42 struct hikari_output *output = view->output;
43
44 hikari_indicator_update_title(indicator, output, view->title);
45 hikari_indicator_update_sheet(indicator, output, view->sheet, view->flags);
46 hikari_indicator_update_group(indicator, output, view->group->name);
47
48 if (view->mark != NULL) {
49 hikari_indicator_update_mark(indicator, output, view->mark->name);
50 } else {
51 hikari_indicator_update_mark(indicator, output, "");
52 }
53 }
54
55 void
hikari_indicator_set_color(struct hikari_indicator * indicator,float color[static4])56 hikari_indicator_set_color(
57 struct hikari_indicator *indicator, float color[static 4])
58 {
59 hikari_indicator_set_color_title(indicator, color);
60 hikari_indicator_set_color_sheet(indicator, color);
61 hikari_indicator_set_color_group(indicator, color);
62 hikari_indicator_set_color_mark(indicator, color);
63 }
64
65 static char
sheet_name(struct hikari_sheet * sheet)66 sheet_name(struct hikari_sheet *sheet)
67 {
68 return sheet->nr + 48;
69 }
70
71 void
hikari_indicator_update_sheet(struct hikari_indicator * indicator,struct hikari_output * output,struct hikari_sheet * sheet,unsigned long flags)72 hikari_indicator_update_sheet(struct hikari_indicator *indicator,
73 struct hikari_output *output,
74 struct hikari_sheet *sheet,
75 unsigned long flags)
76 {
77 bool invisible = flags & hikari_view_invisible_flag;
78 bool floating = flags & hikari_view_floating_flag;
79 bool publicview = flags & hikari_view_public_flag;
80 char *output_name = sheet->workspace->output->wlr_output->name;
81 int i = 0;
82
83 char *text = hikari_malloc(strlen(output_name) + 13);
84
85 if (publicview) {
86 text[i++] = '!';
87 }
88
89 if (floating) {
90 text[i++] = '~';
91 }
92
93 if (invisible) {
94 text[i++] = '[';
95 text[i++] = sheet_name(sheet);
96 text[i++] = ']';
97 } else {
98 text[i++] = sheet_name(sheet);
99 }
100
101 if (sheet->workspace->sheet != sheet) {
102 text[i++] = ' ';
103 text[i++] = '@';
104 text[i++] = ' ';
105 text[i++] = sheet_name(sheet->workspace->sheet);
106 }
107
108 text[i++] = ' ';
109 text[i++] = '-';
110 text[i++] = ' ';
111
112 strcpy(&text[i], output_name);
113
114 hikari_indicator_bar_update(&indicator->sheet, output, text);
115
116 hikari_free(text);
117 }
118
119 void
hikari_indicator_damage(struct hikari_indicator * indicator,struct hikari_view * view)120 hikari_indicator_damage(
121 struct hikari_indicator *indicator, struct hikari_view *view)
122 {
123 assert(indicator != NULL);
124 assert(view != NULL);
125
126 struct wlr_box *geometry = hikari_view_border_geometry(view);
127 struct hikari_output *output = view->output;
128
129 hikari_indicator_bar_damage(&indicator->title, output, geometry);
130 hikari_indicator_bar_damage(&indicator->sheet, output, geometry);
131 hikari_indicator_bar_damage(&indicator->group, output, geometry);
132 hikari_indicator_bar_damage(&indicator->mark, output, geometry);
133 }
134