summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorMole Shang <[email protected]>2023-07-25 09:27:26 +0800
committerMole Shang <[email protected]>2023-08-05 23:19:46 +0800
commited8f6df90b0c39835198d5b7af4bbd391362f180 (patch)
tree907ba31bac854eb5dc8a2781825e24c049b10580 /src/main.c
downloadhinata-ed8f6df90b0c39835198d5b7af4bbd391362f180.tar.gz
hinata-ed8f6df90b0c39835198d5b7af4bbd391362f180.tar.bz2
hinata-ed8f6df90b0c39835198d5b7af4bbd391362f180.zip
hinata: initial commit
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..d60112e
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,163 @@
+#include <GL/glew.h>
+#include <GLFW/glfw3.h>
+#include <curl/curl.h>
+#include <nfd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_VERTEX_BUFFER 512 * 1024
+#define MAX_ELEMENT_BUFFER 128 * 1024
+#define NK_INCLUDE_FIXED_TYPES
+#define NK_INCLUDE_STANDARD_IO
+#define NK_INCLUDE_STANDARD_VARARGS
+#define NK_INCLUDE_DEFAULT_ALLOCATOR
+#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
+#define NK_INCLUDE_FONT_BAKING
+#define NK_INCLUDE_DEFAULT_FONT
+#define NK_IMPLEMENTATION
+#define NK_GLFW_GL3_IMPLEMENTATION
+#define NK_KEYSTATE_BASED_INPUT
+#include "nuklear.h"
+#include "nuklear_glfw_gl3.h"
+
+#include "constants.h"
+#include "unifont.h"
+#include "logger.h"
+#include "main.h"
+#include "process_url.h"
+#include "style.h"
+#include "ui.h"
+
+extern int win_width, win_height;
+extern void load_ui(struct ui_struct *);
+static void error_callback(int e, const char *d) {
+ printf("Error %d: %s\n", e, d);
+}
+
+int main(void) {
+ struct ui_struct ui;
+
+ /* Curl */
+ curl_init();
+
+ /* GLFW */
+ struct nk_glfw glfw = {0};
+ static GLFWwindow *win;
+ glfwSetErrorCallback(error_callback);
+ if (!glfwInit()) {
+ fprintf(stdout, "[GFLW] failed to init!\n");
+ exit(EXIT_FAILURE);
+ }
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+#ifdef __APPLE__
+ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
+#endif
+
+ win = glfwCreateWindow(win_width, win_height, APP_NAME, NULL, NULL);
+
+ if (!win) {
+ // Window creation failed
+ fprintf(stdout, "[GLFW] failed to create window. Does this platform "
+ "support OpenGL 3.3+?\n");
+ printf("GL_VERSION_3_3: %s",
+ glewIsSupported("GL_VERSION_3_3") ? "yes" : "no");
+ exit(EXIT_FAILURE);
+ }
+
+ glfwMakeContextCurrent(win);
+
+ /* Glew */
+ glewExperimental = GL_TRUE;
+ GLenum err;
+ if ((err = glewInit()) != GLEW_OK) {
+ /* Problem: glewInit failed, something is seriously wrong. */
+ fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
+ exit(EXIT_FAILURE);
+ }
+
+ /* Native File Dialog */
+ NFD_Init();
+
+ /* Logger setup */
+ struct logger *logger = setup_logger();
+ // Put it in ui_struct
+ ui.logger = logger;
+
+ /* UI stat */
+ status_t stat = {0};
+ stat.is_done = true;
+ ui.stat = &stat;
+
+ /* create context */
+ ui.ctx = nk_glfw3_init(&glfw, win, NK_GLFW3_INSTALL_CALLBACKS);
+
+ /* Font */
+ ui.logger->font_height = 24;
+ {
+ struct nk_font_atlas *atlas;
+ struct nk_font_config cfg = nk_font_config(0);
+ /* NOTICE: Some CJK fonts may have incorrect glyph indexes.
+ https://github.com/Immediate-Mode-UI/Nuklear/issues/399
+ https://github.com/Immediate-Mode-UI/Nuklear/issues/542
+ FIX: https://github.com/Immediate-Mode-UI/Nuklear/pull/531
+ */
+ cfg.range = nk_font_chinese_glyph_ranges();
+ // const nk_rune ranges[] = {0x4E00, 0x9FAF, 0x0020, 0x00FF, 0x3000,
+ // 0x30FF, 0x31F0, 0x31FF, 0xFF00, 0xFFEF,
+ //
+ // 0};
+ // cfg.range = ranges;
+ cfg.oversample_h = 1;
+ cfg.oversample_v = 1;
+ nk_glfw3_font_stash_begin(&glfw, &atlas);
+ atlas->default_font = nk_font_atlas_add_compressed_base85(
+ atlas, unifont_compressed_data_base85, ui.logger->font_height, &cfg);
+ nk_glfw3_font_stash_end(&glfw);
+ }
+
+ /* TextEdit */
+ struct nk_text_edit text_edit;
+ nk_textedit_init_default(&text_edit);
+
+ logger->text_edit = &text_edit;
+
+ /* Scrollbar */
+ struct nk_scroll scrollbar = {0};
+ logger->scrollbar = &scrollbar;
+
+ /* Theming */
+ set_style(ui.ctx, THEME_DARK);
+
+ while (!glfwWindowShouldClose(win)) {
+ /* Input */
+ glfwPollEvents();
+ nk_glfw3_new_frame(&glfw);
+
+ /* Response to window resize */
+ glfwGetWindowSize(win, &win_width, &win_height);
+ nk_window_set_bounds(ui.ctx, APP_NAME,
+ nk_rect(0, 0, win_width, win_height));
+
+ /* GUI */
+ if (nk_begin(ui.ctx, APP_NAME, nk_rect(0, 0, win_width, win_height),
+ NK_WINDOW_BORDER | NK_WINDOW_MOVABLE | NK_WINDOW_TITLE)) {
+ load_ui(&ui);
+ }
+ nk_end(ui.ctx);
+
+ /* Draw */
+ glfwGetWindowSize(win, &win_width, &win_height);
+ glViewport(0, 0, win_width, win_height);
+ glClear(GL_COLOR_BUFFER_BIT);
+ nk_glfw3_render(&glfw, NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER,
+ MAX_ELEMENT_BUFFER);
+ glfwSwapBuffers(win);
+ }
+ NFD_Quit();
+ curl_cleanup(&stat);
+ nk_glfw3_shutdown(&glfw);
+ glfwTerminate();
+ return 0;
+}