summaryrefslogtreecommitdiff
path: root/src/wayclock.cc
blob: 9b71cc484fcf84dcd3651a30f99f73a45fde97d0 (plain)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131


#include "events.h"
#include "glad.h"
#include "graphics.h"
#include "rendering.h"
#include "text.h"
#include "utils.h"
#include "window.h"

#define WAYC_APP_NAME "Wayclock"
#define WAYC_APP_WIDTH 1280
#define WAYC_APP_HEIGHT 1080
#define WAYC_FONT "assets/AdwaitaMono-Regular.ttf"
#define WAYC_ATLAS_WIDTH 512
#define WAYC_ATLAS_HEIGHT 512
#define WAYC_FONT_SIZE 48
#define WAYC_CLEAR_COLOR vec4{0.1f, 0.2f, 0.2f, 1.0f}

struct app_s {
  struct renderer_s* renderer;
  struct font_context_s* fctx;
  struct font_s* font;
  struct atlas_s* atlas;
};

void wayc_frame(struct app_s* app, struct window_s* window,
                struct eventloop_s* loop) {
  wayc_notnull(window);
  wayc_notnull(loop);
  wayc_notnull(app);

  struct renderer_s* renderer = app->renderer;

  wayc_renderer_begin(renderer);
  wayc_renderer_end(renderer);
}

void wayc_handle(u8* user, struct eventloop_s* loop, struct event_s* event) {
  wayc_notnull(loop);
  wayc_notnull(event);

  struct app_s* app = (struct app_s*)user;
  struct renderer_s* renderer = app->renderer;

  struct window_s* window = event->window;
  union event_data_u data = event->data;

  switch (event->kind) {
    case EVENT_KIND_CLOSE:
      wayc_eventloop_unregister(loop, window->id);
      break;
    case EVENT_KIND_RESIZE: {
      struct event_resize_s resize = data.resize;
      wayc_renderer_resize(renderer, resize.width, resize.height);
    } break;
    case EVENT_KIND_FRAME:
      wayc_frame(app, window, loop);
      break;
    default:
      break;
  }
}

int main() {
  struct font_context_s fctx;
  if (wayc_font_context_init(&fctx) != FONT_CONTEXT_ERROR_NONE)
    wayc_panic("Failed to initialize font context");

  wayc_defer(wayc_font_context_deinit(&fctx));

  struct font_s font;
  if (wayc_font_init(&font, &fctx, WAYC_FONT_SIZE, WAYC_FONT) !=
      FONT_ERROR_NONE)
    wayc_panic("Failed to load font");

  wayc_defer(wayc_font_deinit(&font));

  struct eventloop_s loop;
  if (wayc_eventloop_init(&loop, wayc_handle) != EVENTLOOP_ERROR_NONE)
    wayc_panic("Failed to initialize event loop");

  wayc_defer(wayc_eventloop_deinit(&loop));

  struct graphics_s graphics;
  if (wayc_graphics_init(&graphics, &loop.state) != GRAPHICS_ERROR_NONE)
    wayc_panic("Failed to initialize graphics");

  wayc_defer(wayc_graphics_deinit(&graphics));

  struct window_s window;
  if (wayc_window_init(&window, WAYC_APP_NAME, &loop) != WINDOW_ERROR_NONE)
    wayc_panic("Failed to initialize window");

  window_id_t winid = wayc_eventloop_register(&loop, &window);
  window.id = winid;

  wayc_defer({
    wayc_eventloop_unregister(&loop, winid);
    wayc_window_deinit(&window);
  });

  struct renderer_s renderer;
  if (wayc_renderer_init(&renderer, &window, &graphics, WAYC_APP_WIDTH,
                         WAYC_APP_HEIGHT,
                         WAYC_CLEAR_COLOR) != RENDERER_ERROR_NONE)
    wayc_panic("Failed to initialize renderer");

  wayc_defer(wayc_renderer_deinit(&renderer));

  wayc_renderer_use(&renderer);
  glClearColor(0.1f, 0.2f, 0.2f, 1.0f);

  struct atlas_s atlas;
  if (!wayc_atlas_init(&atlas, IMAGE_FORMAT_RED, WAYC_ATLAS_WIDTH,
                       WAYC_ATLAS_HEIGHT))
    wayc_panic("Failed to initialize atlas");

  wayc_defer(wayc_atlas_deinit(&atlas));

  wayc_window_redraw(&window, &loop);

  struct app_s app = {&renderer, &fctx, &font, &atlas};

  while (wayc_eventloop_running(&loop)) {
    wayc_eventloop_update(&loop, (u8*)&app);
    wayc_window_redraw(&window, &loop);
  }

  return 0;
}