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