Mercurial > molko
annotate libmlk-ui/mlk/ui/notify.c @ 433:862b15c3a3ae
ui: cleanup hierarchy
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 15 Oct 2022 21:19:25 +0200 |
parents | src/libmlk-ui/ui/notify.c@8f59201dc76b |
children | 773a082f0b91 |
rev | line source |
---|---|
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * notify.c -- in game notifications |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
378
460c78706989
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
327
diff
changeset
|
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr> |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stddef.h> |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <string.h> |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
23 #include <mlk/core/font.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
24 #include <mlk/core/texture.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
25 #include <mlk/core/trace.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
26 #include <mlk/core/window.h> |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include "align.h" |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include "frame.h" |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include "label.h" |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include "notify.h" |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 #include "theme.h" |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 #define WIDTH (window.w / 3) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #define HEIGHT (window.h / 10) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 struct geo { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 const struct theme *theme; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 int frame_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 int frame_y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 unsigned int frame_w; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 unsigned int frame_h; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 int icon_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 int icon_y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 int title_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 int title_y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 int body_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 int body_y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 }; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 static void draw(const struct notify *, size_t); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 static const struct notify_system default_system = { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 .draw = draw |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 }; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 static const struct notify_system *system = &default_system; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 static struct notify stack[NOTIFY_MAX]; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 static size_t stacksz; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 static void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 geometry(struct geo *geo, const struct notify *n, size_t index) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 int x, y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 /* Determine theme. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 geo->theme = system->theme ? system->theme : theme_default(); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 /* Determine notification position. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 x = window.w - geo->theme->padding; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 x -= WIDTH; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 y = geo->theme->padding * (index + 1);; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 y += HEIGHT * index; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 /* Content frame. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 geo->frame_x = x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 geo->frame_y = y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 geo->frame_w = WIDTH; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 geo->frame_h = HEIGHT; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 /* Align icon at the left center. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 if (n->icon->h >= HEIGHT) { |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
83 tracef("notification icon is too large: %u > %u", n->icon->h, HEIGHT); |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 geo->icon_x = x + geo->theme->padding; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 geo->icon_y = y + geo->theme->padding; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 } else { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 align(ALIGN_LEFT, &geo->icon_x, &geo->icon_y, n->icon->w, n->icon->h, x, y, WIDTH, HEIGHT); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 geo->icon_x += geo->icon_y - y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 /* Align title to the right of the icon at the same y coordinate. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 geo->title_x = geo->icon_x + n->icon->w + geo->theme->padding; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 geo->title_y = geo->icon_y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 geo->title_y -= font_height(geo->theme->fonts[THEME_FONT_IMPORTANT]) / 2; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 /* Align body so it ends at the end of the icon. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 geo->body_x = geo->title_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 geo->body_y = geo->icon_y + n->icon->h; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 geo->body_y -= font_height(geo->theme->fonts[THEME_FONT_INTERFACE]) / 2; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 static void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 draw_frame(const struct geo *geo) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 const struct frame f = { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 .x = geo->frame_x, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 .y = geo->frame_y, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 .w = geo->frame_w, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 .h = geo->frame_h |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 }; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 frame_draw(&f); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 static void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 draw_icon(const struct geo *geo, const struct notify *n) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 texture_draw(n->icon, geo->icon_x, geo->icon_y); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 #include <stdio.h> |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 static void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 draw_title(const struct geo *geo, const struct notify *n) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 const struct label l = { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 .x = geo->title_x, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 .y = geo->title_y, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 .text = n->title, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 .flags = LABEL_FLAGS_SHADOW | LABEL_FLAGS_IMPORTANT |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 }; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 label_draw(&l); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 static void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 draw_body(const struct geo *geo, const struct notify *n) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 const struct label l = { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 .x = geo->body_x, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 .y = geo->body_y, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 .text = n->body, |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 .flags = LABEL_FLAGS_SHADOW |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 }; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 label_draw(&l); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 static void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 draw(const struct notify *n, size_t index) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 struct geo geo; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 /* Compute notification size and widgets. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 geometry(&geo, n, index); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 draw_frame(&geo); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 draw_icon(&geo, n); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 draw_title(&geo, n); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 draw_body(&geo, n); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 notify(const struct texture *icon, const char *title, const char *body) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 assert(icon); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 assert(title); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 assert(body); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 struct notify *n; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 if (stacksz >= NOTIFY_MAX) { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 memmove(&stack[0], &stack[1], sizeof (stack[0]) - NOTIFY_MAX - 1); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 n = &stack[NOTIFY_MAX - 1]; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 } else |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 n = &stack[stacksz++]; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 memset(n, 0, sizeof (*n)); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 n->icon = icon; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 n->title = title; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 n->body = body; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 notify_update(unsigned int ticks) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 struct notify *n; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 for (size_t i = 0; i < stacksz; ++i) { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 n = &stack[i]; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 n->elapsed += ticks; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 if (n->elapsed >= NOTIFY_TIMEOUT_DEFAULT) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 memmove(n, n + 1, sizeof (*n) * (--stacksz - i)); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 notify_draw(void) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 for (size_t i = 0; i < stacksz; ++i) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 system->draw(&stack[i], i); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 notify_set_system(const struct notify_system *sys) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 system = sys ? sys : &default_system; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 } |