Skip to content

Commit 68a0f0d

Browse files
committed
feat: DPI awareness
1 parent 6e5dac2 commit 68a0f0d

File tree

9 files changed

+166
-151
lines changed

9 files changed

+166
-151
lines changed

lib/css/src/computed.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -1079,8 +1079,7 @@ static void compute_absolute_width(const css_computed_style_t *parent,
10791079
s->type_bits.width = CSS_WIDTH_FIT_CONTENT;
10801080
break;
10811081
}
1082-
if (is_css_display_block(parent) &&
1083-
compute_content_box_fixed_width(parent, &parent_value)) {
1082+
if (compute_content_box_fixed_width(parent, &parent_value)) {
10841083
value = parent_value - s->margin_left - s->margin_right;
10851084
if (s->type_bits.box_sizing ==
10861085
CSS_BOX_SIZING_CONTENT_BOX) {

lib/platform/src/events.c

+119-119
Original file line numberDiff line numberDiff line change
@@ -15,173 +15,173 @@
1515
#include "events.h"
1616

1717
static struct app_events_t {
18-
/** list_t<app_event_t> */
19-
list_t queue;
18+
/** list_t<app_event_t> */
19+
list_t queue;
2020

21-
/** list_t<app_listener_t> */
22-
list_t listeners;
21+
/** list_t<app_listener_t> */
22+
list_t listeners;
2323

24-
app_event_dispatcher_t dispatcher;
24+
app_event_dispatcher_t dispatcher;
2525
} app_events;
2626

2727
int app_touch_event_init(app_event_t *e, touch_point_t *points, int n_points)
2828
{
29-
e->type = APP_EVENT_TOUCH;
30-
e->touch.n_points = n_points;
31-
e->touch.points = malloc(sizeof(touch_point_t) * n_points);
32-
if (!e->touch.points) {
33-
return -ENOMEM;
34-
}
35-
for (n_points -= 1; n_points >= 0; --n_points) {
36-
e->touch.points[n_points] = points[n_points];
37-
}
38-
return 0;
29+
e->type = APP_EVENT_TOUCH;
30+
e->touch.n_points = n_points;
31+
e->touch.points = malloc(sizeof(touch_point_t) * n_points);
32+
if (!e->touch.points) {
33+
return -ENOMEM;
34+
}
35+
for (n_points -= 1; n_points >= 0; --n_points) {
36+
e->touch.points[n_points] = points[n_points];
37+
}
38+
return 0;
3939
}
4040

4141
int app_composition_event_init(app_event_t *e, const wchar_t *text, size_t len)
4242
{
43-
if (len == 0) {
44-
len = wcslen(text);
45-
}
46-
e->type = APP_EVENT_COMPOSITION;
47-
e->text.length = len;
48-
e->text.text = malloc(sizeof(wchar_t) * (len + 1));
49-
if (!e->text.text) {
50-
return -ENOMEM;
51-
}
52-
wcscpy(e->text.text, text);
53-
return 0;
43+
if (len == 0) {
44+
len = wcslen(text);
45+
}
46+
e->type = APP_EVENT_COMPOSITION;
47+
e->text.length = len;
48+
e->text.text = malloc(sizeof(wchar_t) * (len + 1));
49+
if (!e->text.text) {
50+
return -ENOMEM;
51+
}
52+
wcscpy(e->text.text, text);
53+
return 0;
5454
}
5555

5656
int app_event_copy(app_event_t *dest, app_event_t *src)
5757
{
58-
switch (src->type) {
59-
case APP_EVENT_TOUCH:
60-
return app_touch_event_init(dest, src->touch.points,
61-
src->touch.n_points);
62-
case APP_EVENT_TEXTINPUT:
63-
return app_composition_event_init(dest, src->text.text, 0);
64-
default:
65-
*dest = *src;
66-
break;
67-
}
68-
return 0;
58+
switch (src->type) {
59+
case APP_EVENT_TOUCH:
60+
return app_touch_event_init(dest, src->touch.points,
61+
src->touch.n_points);
62+
case APP_EVENT_TEXTINPUT:
63+
return app_composition_event_init(dest, src->text.text, 0);
64+
default:
65+
*dest = *src;
66+
break;
67+
}
68+
return 0;
6969
}
7070

7171
void app_event_destroy(app_event_t *e)
7272
{
73-
switch (e->type) {
74-
case APP_EVENT_TOUCH:
75-
if (e->touch.points) {
76-
free(e->touch.points);
77-
}
78-
e->touch.points = NULL;
79-
e->touch.n_points = 0;
80-
break;
81-
case APP_EVENT_COMPOSITION:
82-
if (e->text.text) {
83-
free(e->text.text);
84-
}
85-
e->text.text = NULL;
86-
e->text.length = 0;
87-
break;
88-
default:
89-
break;
90-
}
91-
e->type = APP_EVENT_NONE;
73+
switch (e->type) {
74+
case APP_EVENT_TOUCH:
75+
if (e->touch.points) {
76+
free(e->touch.points);
77+
}
78+
e->touch.points = NULL;
79+
e->touch.n_points = 0;
80+
break;
81+
case APP_EVENT_COMPOSITION:
82+
if (e->text.text) {
83+
free(e->text.text);
84+
}
85+
e->text.text = NULL;
86+
e->text.length = 0;
87+
break;
88+
default:
89+
break;
90+
}
91+
e->type = APP_EVENT_NONE;
9292
}
9393

9494
int app_post_event(app_event_t *e)
9595
{
96-
app_event_t *ev;
97-
98-
ev = malloc(sizeof(app_event_t));
99-
if (!ev) {
100-
return -ENOMEM;
101-
}
102-
app_event_copy(ev, e);
103-
list_append(&app_events.queue, ev);
104-
return 0;
96+
app_event_t *ev;
97+
98+
ev = malloc(sizeof(app_event_t));
99+
if (!ev) {
100+
return -ENOMEM;
101+
}
102+
app_event_copy(ev, e);
103+
list_append(&app_events.queue, ev);
104+
return 0;
105105
}
106106

107107
int app_add_event_listener(int event_type, app_event_handler_t handler,
108-
void *data)
108+
void *data)
109109
{
110-
app_event_listener_t *listener;
111-
112-
listener = malloc(sizeof(app_event_listener_t));
113-
if (!listener) {
114-
return -ENOMEM;
115-
}
116-
listener->handler = handler;
117-
listener->data = data;
118-
listener->type = event_type;
119-
list_append(&app_events.listeners, listener);
120-
return 0;
110+
app_event_listener_t *listener;
111+
112+
listener = malloc(sizeof(app_event_listener_t));
113+
if (!listener) {
114+
return -ENOMEM;
115+
}
116+
listener->handler = handler;
117+
listener->data = data;
118+
listener->type = event_type;
119+
list_append(&app_events.listeners, listener);
120+
return 0;
121121
}
122122

123123
int app_remove_event_listener(int event_type, app_event_handler_t handler)
124124
{
125-
list_node_t *node, *prev;
126-
app_event_listener_t *listener;
127-
128-
for (list_each(node, &app_events.listeners)) {
129-
prev = node->prev;
130-
listener = node->data;
131-
if (listener->handler == handler &&
132-
listener->type == event_type) {
133-
list_delete_node(&app_events.listeners, node);
134-
free(listener);
135-
node = prev;
136-
return 0;
137-
}
138-
}
139-
return -1;
125+
list_node_t *node, *prev;
126+
app_event_listener_t *listener;
127+
128+
for (list_each(node, &app_events.listeners)) {
129+
prev = node->prev;
130+
listener = node->data;
131+
if (listener->handler == handler &&
132+
listener->type == event_type) {
133+
list_delete_node(&app_events.listeners, node);
134+
free(listener);
135+
node = prev;
136+
return 0;
137+
}
138+
}
139+
return -1;
140140
}
141141

142142
int app_process_event(app_event_t *e)
143143
{
144-
int count = 0;
145-
list_node_t *node;
146-
app_event_listener_t *listener;
147-
148-
for (list_each(node, &app_events.listeners)) {
149-
listener = node->data;
150-
if (listener->type == e->type) {
151-
listener->handler(e, listener->data);
152-
++count;
153-
}
154-
}
155-
if (app_events.dispatcher) {
156-
app_events.dispatcher(e);
157-
}
158-
return count;
144+
int count = 0;
145+
list_node_t *node;
146+
app_event_listener_t *listener;
147+
148+
for (list_each(node, &app_events.listeners)) {
149+
listener = node->data;
150+
if (listener->type == e->type) {
151+
listener->handler(e, listener->data);
152+
++count;
153+
}
154+
}
155+
if (app_events.dispatcher) {
156+
app_events.dispatcher(e);
157+
}
158+
return count;
159159
}
160160

161161
void app_process_events(void)
162162
{
163-
app_event_t *e;
164-
165-
while ((e = list_get(&app_events.queue, 0)) != NULL) {
166-
list_delete(&app_events.queue, 0);
167-
app_process_event(e);
168-
app_event_destroy(e);
169-
free(e);
170-
}
163+
app_event_t *e;
164+
165+
while ((e = list_get(&app_events.queue, 0)) != NULL) {
166+
list_delete(&app_events.queue, 0);
167+
app_process_event(e);
168+
app_event_destroy(e);
169+
free(e);
170+
}
171171
}
172172

173173
void app_set_event_dispatcher(app_event_dispatcher_t dispatcher)
174174
{
175-
app_events.dispatcher = dispatcher;
175+
app_events.dispatcher = dispatcher;
176176
}
177177

178178
void app_init_events(void)
179179
{
180-
list_create(&app_events.queue);
180+
list_create(&app_events.queue);
181181
}
182182

183183
void app_destroy_events(void)
184184
{
185-
app_set_event_dispatcher(NULL);
186-
list_destroy(&app_events.queue, free);
185+
app_set_event_dispatcher(NULL);
186+
list_destroy(&app_events.queue, free);
187187
}

lib/platform/src/windows/win32_app.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,12 @@ void *app_window_get_handle(app_window_t *wnd)
239239

240240
unsigned app_window_get_dpi(app_window_t *wnd)
241241
{
242-
return GetDpiForWindow(wnd->hwnd);
242+
UINT dpi = GetDpiForWindow(wnd->hwnd);
243+
if (dpi == 0) {
244+
logger_error("[win32-app] GetDpiForWindow failed, hwnd: %p\n", wnd->hwnd);
245+
dpi = GetDpiForSystem();
246+
}
247+
return dpi;
243248
}
244249

245250
static void convert_client_size_to_window_size(app_window_t *wnd, int *width,

lib/ui-server/src/server.c

+13-7
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,10 @@ float ui_server_get_window_scale(app_window_t *window)
145145
if (conn) {
146146
return css_metrics_actual_scale(&conn->updater->metrics);
147147
}
148-
return app_window_get_dpi(window) / 96.f;
148+
if (window) {
149+
return app_window_get_dpi(window) / 96.f;
150+
}
151+
return 1.f;
149152
}
150153

151154
static void ui_server_on_window_close(app_event_t *e, void *arg)
@@ -192,8 +195,7 @@ static void ui_server_on_window_paint(app_event_t *e, void *arg)
192195
continue;
193196
}
194197
ui_rect_from_pd_rect(
195-
&rect,
196-
&e->paint.rect,
198+
&rect, &e->paint.rect,
197199
css_metrics_actual_scale(&conn->updater->metrics));
198200
ui_widget_mark_dirty_rect(conn->widget, &rect,
199201
UI_BOX_TYPE_GRAPH_BOX);
@@ -718,10 +720,14 @@ void ui_server_update(void)
718720
list_node_t *node;
719721
float dpi = 1.f * ui_metrics.dpi;
720722

721-
for (list_each(node, &ui_server.connections)) {
722-
conn = node->data;
723-
ui_metrics.dpi = 1.f * app_window_get_dpi(conn->window);
724-
ui_updater_update(conn->updater, conn->widget);
723+
if (ui_server.connections.length > 0) {
724+
for (list_each(node, &ui_server.connections)) {
725+
conn = node->data;
726+
ui_metrics.dpi = 1.f * app_window_get_dpi(conn->window);
727+
ui_updater_update(conn->updater, conn->widget);
728+
}
729+
} else {
730+
ui_update();
725731
}
726732
ui_metrics.dpi = dpi;
727733
}

lib/ui/src/ui_tree.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* LICENSE.TXT file in the root directory of this source tree.
1010
*/
1111

12+
#include <stdio.h>
13+
#include <locale.h>
1214
#include <assert.h>
1315
#include <string.h>
1416
#include <css/selector.h>
@@ -367,9 +369,6 @@ ui_widget_t *ui_widget_at(ui_widget_t *widget, int ix, int iy)
367369
return target == widget ? NULL : target;
368370
}
369371

370-
#include <locale.h>
371-
#include <stdio.h>
372-
373372
static void _ui_print_tree(ui_widget_t *w, int depth, const wchar_t *prefix)
374373
{
375374
ui_widget_t *child;
@@ -421,7 +420,9 @@ static void _ui_print_tree(ui_widget_t *w, int depth, const wchar_t *prefix)
421420
void ui_print_tree(ui_widget_t *w)
422421
{
423422
css_selector_node_t *node;
423+
char *ctype = setlocale(LC_CTYPE, NULL);
424424

425+
setlocale(LC_CTYPE, "");
425426
w = w ? w : ui_root();
426427
node = ui_widget_create_selector_node(w);
427428
logger_error("%s, xy:(%g,%g), size:(%g,%g), visible: %s\n",
@@ -430,4 +431,5 @@ void ui_print_tree(ui_widget_t *w)
430431
ui_widget_is_visible(w) ? "true" : "false");
431432
css_selector_node_destroy(node);
432433
_ui_print_tree(w, 0, L" ");
434+
setlocale(LC_CTYPE, ctype);
433435
}

lib/ui/src/ui_updater.c

+1
Original file line numberDiff line numberDiff line change
@@ -538,5 +538,6 @@ void ui_init_updater(void)
538538
void ui_destroy_updater(void)
539539
{
540540
dict_destroy(ui_style_cache);
541+
list_destroy_ex(&ui_updaters, free, false);
541542
ui_style_cache = NULL;
542543
}

0 commit comments

Comments
 (0)