snapkitty
compilers
c
python
nasm
File size: 1,594 Bytes
9abace2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*

 * Sovereign IDE — Win32 Application Entry

 * Owns the message loop, DPI awareness, and top-level window creation.

 */

#include "application.h"
#include "window.h"
#include "../../core/events.h"
#include "../../core/arena.h"
#include "../../core/strings.h"

#include <shellscalingapi.h>

static struct {
    HINSTANCE hinstance;
    bool      running;
    Arena     frame_arena;
} g_app;

static void app_set_dpi_awareness(void) {
    SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
}

void app_init(HINSTANCE hinstance) {
    g_app.hinstance = hinstance;
    g_app.running = true;

    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    app_set_dpi_awareness();
    arena_init_default(&g_app.frame_arena);
    strings_init();
    events_init();
}

int app_run(void) {
    MSG msg = {0};
    while (g_app.running) {
        while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                g_app.running = false;
                break;
            }
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }

        arena_reset(&g_app.frame_arena);
    }

    return (int)msg.wParam;
}

void app_request_quit(void) {
    PostQuitMessage(0);
    g_app.running = false;
}

void app_shutdown(void) {
    strings_shutdown();
    arena_destroy(&g_app.frame_arena);
    CoUninitialize();
}

HINSTANCE app_get_hinstance(void) {
    return g_app.hinstance;
}

Arena *app_frame_arena(void) {
    return &g_app.frame_arena;
}