Mercurial > molko
annotate libmlk-ui/mlk/ui/notify.c @ 646:7e1eb7f6c049 default tip @
misc: remove .clang
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 04 Feb 2024 15:24:37 +0100 |
parents | 29a121241485 |
children |
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 * |
445
773a082f0b91
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
433
diff
changeset
|
4 * Copyright (c) 2020-2023 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> |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
24 #include <mlk/core/painter.h> |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
25 #include <mlk/core/texture.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
26 #include <mlk/core/trace.h> |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
27 #include <mlk/core/util.h> |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
28 #include <mlk/core/window.h> |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include "align.h" |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include "notify.h" |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
32 #include "ui.h" |
587
c027304ced27
misc: add NLS for ui/rpg
David Demelier <markand@malikania.fr>
parents:
507
diff
changeset
|
33 #include "ui_p.h" |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
35 #define WIDTH (mlk_window.w / 2.5) |
485
3ff1fe64d0cd
core: window -> mlk_window
David Demelier <markand@malikania.fr>
parents:
473
diff
changeset
|
36 #define HEIGHT (mlk_window.h / 10) |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
37 #define MAX (4) |
603
ed1d3244ed57
ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents:
587
diff
changeset
|
38 #define FONT (mlk_notify_style.text_font ? mlk_notify_style.text_font : &mlk_ui_fonts[MLK_UI_FONT_INTERFACE]) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 struct geo { |
495
2af25db99273
ui: theme -> mlk_theme
David Demelier <markand@malikania.fr>
parents:
494
diff
changeset
|
41 const struct mlk_theme *theme; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 int frame_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 int frame_y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 unsigned int frame_w; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 unsigned int frame_h; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 int icon_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 int icon_y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 int title_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 int title_y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 int body_x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 int body_y; |
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 |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
54 static struct mlk_notify stack[MAX]; |
327
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 void |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
57 geometry(struct geo *geo, const struct mlk_notify *n, size_t index) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 { |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
59 struct mlk_font *font; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 int x, y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 /* Determine notification position. */ |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
63 x = mlk_window.w - mlk_notify_style.padding; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 x -= WIDTH; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
66 y = mlk_notify_style.padding * (index + 1); |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 y += HEIGHT * index; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 |
603
ed1d3244ed57
ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents:
587
diff
changeset
|
69 font = &mlk_ui_fonts[MLK_UI_FONT_INTERFACE]; |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
70 |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 /* Content frame. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 geo->frame_x = x; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 geo->frame_y = y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 geo->frame_w = WIDTH; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 geo->frame_h = HEIGHT; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 /* Align icon at the left center. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 if (n->icon->h >= HEIGHT) { |
587
c027304ced27
misc: add NLS for ui/rpg
David Demelier <markand@malikania.fr>
parents:
507
diff
changeset
|
79 mlk_tracef(_("notification icon is too large: %u > %u"), n->icon->h, HEIGHT); |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
80 geo->icon_x = x + mlk_notify_style.padding; |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
81 geo->icon_y = y + mlk_notify_style.padding; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 } else { |
487
f2d3c5a97884
ui: align -> mlk_align
David Demelier <markand@malikania.fr>
parents:
485
diff
changeset
|
83 mlk_align(MLK_ALIGN_LEFT, &geo->icon_x, &geo->icon_y, n->icon->w, n->icon->h, x, y, WIDTH, HEIGHT); |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 geo->icon_x += geo->icon_y - y; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 /* Align title to the right of the icon at the same y coordinate. */ |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
88 geo->title_x = geo->icon_x + n->icon->w + mlk_notify_style.padding; |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
89 geo->title_y = geo->icon_y + (mlk_notify_style.padding / 2); |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
90 geo->title_y -= mlk_font_height(font) / 2; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 /* Align body so it ends at the end of the icon. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 geo->body_x = geo->title_x; |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
94 geo->body_y = geo->icon_y + n->icon->h - (mlk_notify_style.padding / 2); |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
95 geo->body_y -= mlk_font_height(font) / 2; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 static void |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 draw_frame(const struct geo *geo) |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 { |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
101 mlk_painter_set_color(mlk_notify_style.border); |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
102 mlk_painter_draw_rectangle(geo->frame_x, geo->frame_y, geo->frame_w, geo->frame_h); |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
103 mlk_painter_set_color(mlk_notify_style.background); |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
104 mlk_painter_draw_rectangle( |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
105 geo->frame_x + mlk_notify_style.border_size, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
106 geo->frame_y + mlk_notify_style.border_size, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
107 geo->frame_w - (mlk_notify_style.border_size * 2), |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
108 geo->frame_h - (mlk_notify_style.border_size * 2) |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
109 ); |
327
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 static void |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
113 draw_icon(const struct geo *geo, const struct mlk_notify *n) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 { |
472
bc5483849614
core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
115 mlk_texture_draw(n->icon, geo->icon_x, geo->icon_y); |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 } |
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 static void |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
119 draw_title(const struct geo *geo, const struct mlk_notify *n) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 { |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
121 mlk_ui_draw_text( |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
122 MLK_ALIGN_NONE, |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
123 MLK__STYLE_FONT(mlk_notify_style.font, MLK_UI_FONT_INTERFACE), |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
124 mlk_notify_style.color, |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
125 n->title, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
126 geo->title_x, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
127 geo->title_y, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
128 0, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
129 0 |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
130 ); |
327
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 static void |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
134 draw_body(const struct geo *geo, const struct mlk_notify *n) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 { |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
136 mlk_ui_draw_text( |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
137 MLK_ALIGN_NONE, |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
138 MLK__STYLE_FONT(mlk_notify_style.font, MLK_UI_FONT_INTERFACE), |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
139 mlk_notify_style.color, |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
140 n->body, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
141 geo->body_x, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
142 geo->body_y, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
143 0, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
144 0 |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
145 ); |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 } |
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 static void |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
149 draw(const struct mlk_notify *n, size_t index) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 struct geo geo; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 /* Compute notification size and widgets. */ |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 geometry(&geo, n, index); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 draw_frame(&geo); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 draw_icon(&geo, n); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 draw_title(&geo, n); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 draw_body(&geo, n); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
162 struct mlk_notify_style mlk_notify_style = { |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
163 .background = MLK_UI_COLOR_BG, |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
164 .border = MLK_UI_COLOR_BORDER, |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
165 .border_size = 2, |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
166 .timeout = 5000, |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
167 .padding = 10, |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
168 .stack = stack, |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
169 .stacksz = MLK_UTIL_SIZE(stack), |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
170 .draw = draw |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
171 }; |
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
172 |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 void |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
174 mlk_notify(const struct mlk_texture *icon, const char *title, const char *body) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 { |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 assert(body); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
178 struct mlk_notify *n; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
180 if (mlk_notify_style.length >= mlk_notify_style.stacksz) { |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
181 memmove(&mlk_notify_style.stack[0], |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
182 &mlk_notify_style.stack[1], |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
183 sizeof (mlk_notify_style.stack[0]) - mlk_notify_style.stacksz - 1); |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
184 n = &mlk_notify_style.stack[mlk_notify_style.length - 1]; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 } else |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
186 n = &mlk_notify_style.stack[mlk_notify_style.length++]; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 memset(n, 0, sizeof (*n)); |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 n->icon = icon; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 n->title = title; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 n->body = body; |
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 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 void |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
195 mlk_notify_clear(void) |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
196 { |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
197 mlk_notify_style.length = 0; |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
198 } |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
199 |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
200 void |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
201 mlk_notify_update(unsigned int ticks) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 { |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
203 struct mlk_notify *n; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
205 for (size_t i = 0; i < mlk_notify_style.length; ++i) { |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
206 n = &mlk_notify_style.stack[i]; |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 n->elapsed += ticks; |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
209 if (n->elapsed >= mlk_notify_style.timeout) |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
210 memmove(n, n + 1, sizeof (*n) * (--mlk_notify_style.length - i)); |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 } |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 |
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 void |
494
35cc5d51bcb2
ui: notify -> mlk_notify
David Demelier <markand@malikania.fr>
parents:
493
diff
changeset
|
215 mlk_notify_draw(void) |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 { |
627
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
217 if (!mlk_notify_style.draw) |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
218 return; |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
219 |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
220 for (size_t i = 0; i < mlk_notify_style.length; ++i) |
29a121241485
ui: improve documentation (notify.h)
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
221 mlk_notify_style.draw(&mlk_notify_style.stack[i], i); |
327
42a6710629f5
ui: implement notifications
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 } |