From 111f0ba3f4a4f14d39c8e3f7c00f13e852f47a51 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 31 Oct 2021 12:50:05 +0100 Subject: Start on syntax highlighting, output correct key button event --- include/mgl/graphics/text.h | 23 +++++++++- include/mgl/mgl.h | 3 +- include/mgl/window/event.h | 54 +++++++++++++++++++++- include/mgl/window/key.h | 109 ++++++++++++++++++++++++++++++++++++++++++++ include/mgl/window/window.h | 3 ++ 5 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 include/mgl/window/key.h (limited to 'include') diff --git a/include/mgl/graphics/text.h b/include/mgl/graphics/text.h index 2c2eeaf..9169ab0 100644 --- a/include/mgl/graphics/text.h +++ b/include/mgl/graphics/text.h @@ -1,28 +1,47 @@ #ifndef MGL_TEXT_H #define MGL_TEXT_H +/* + TODO: Do not render text outside the window and start from the visible part. + Support 64-bit text length on 32-bit systems, and use mmap to optimize loading very large files, + and munmap the text parts that are not visible on the screen. +*/ + #include "../system/vec.h" #include "color.h" +#include +#include typedef struct mgl_font mgl_font; typedef struct mgl_context mgl_context; +typedef struct { + /* Optional */ + void (*before_syntax_highlight)(void *userdata); + /* Return true if the text format should be changed. Optional */ + bool (*syntax_highlight)(void *userdata, const char *str, size_t size, mgl_color *color); + void *userdata; +} mgl_text_options; + typedef struct { mgl_font *font; /* nullable */ const char *text; /* nullable */ + size_t text_size; mgl_color color; mgl_vec2f position; + mgl_text_options options; } mgl_text; /* Note: keeps a reference to |text|. |text| needs to be valid as long as |self| is used. |font| and |text| may be NULL. + |load_options| can be NULL, in which case the default options are used. */ -int mgl_text_init(mgl_text *self, mgl_font *font, const char *text, float x, float y); +int mgl_text_init(mgl_text *self, mgl_font *font, const char *str, size_t str_size, mgl_text_options *options); void mgl_text_deinit(mgl_text *self); /* Note: keeps a reference to |text|. |text| needs to be valid as long as |self| is used. |text| may be NULL. */ -void mgl_text_set_string(mgl_text *self, const char *str); +void mgl_text_set_string(mgl_text *self, const char *str, size_t str_size); /* |font| may be NULL */ void mgl_text_set_font(mgl_text *self, mgl_font *font); void mgl_text_set_position(mgl_text *self, mgl_vec2f position); diff --git a/include/mgl/mgl.h b/include/mgl/mgl.h index 8e5e2a4..b9d007e 100644 --- a/include/mgl/mgl.h +++ b/include/mgl/mgl.h @@ -9,8 +9,9 @@ typedef struct mgl_context mgl_context; struct mgl_context { mgl_connection connection; - _XVisualInfo *visual_info; mgl_gl gl; + _XVisualInfo *visual_info; + unsigned long wm_delete_window_atom; }; /* diff --git a/include/mgl/window/event.h b/include/mgl/window/event.h index 2aea478..020d5c9 100644 --- a/include/mgl/window/event.h +++ b/include/mgl/window/event.h @@ -1,10 +1,62 @@ #ifndef MGL_EVENT_H #define MGL_EVENT_H +#include "key.h" +#include + typedef struct mgl_event mgl_event; +typedef struct { + int width; + int height; +} mgl_size_event; + +typedef struct { + int code; /* mgl_key */ + bool alt; + bool control; + bool shift; + bool system; +} mgl_key_event; + +typedef struct { + int x; /* relative to left of the window */ + int y; /* relative to the top of the window */ +} mgl_mouse_move_event; + +typedef enum { + MGL_BUTTON_UNKNOWN, + MGL_BUTTON_LEFT, + MGL_BUTTON_RIGHT, + MGL_BUTTON_MIDDLE, + MGL_BUTTON_XBUTTON1, + MGL_BUTTON_XBUTTON2 +} mgl_mouse_button; + +typedef struct { + int button; /* mgl_mouse_button */ + int x; /* relative to left of the window */ + int y; /* relative to top of the window */ +} mgl_mouse_button_event; + +typedef enum { + MGL_EVENT_UNKNOWN, + MGL_EVENT_RESIZED, + MGL_EVENT_KEY_PRESSED, + MGL_EVENT_KEY_RELEASED, + MGL_EVENT_MOUSE_BUTTON_PRESSED, + MGL_EVENT_MOUSE_BUTTON_RELEASED, + MGL_EVENT_MOUSE_MOVED +} mgl_event_type; + struct mgl_event { - int type; + int type; /* mgl_event_type */ + union { + mgl_size_event size; + mgl_key_event key; + mgl_mouse_button_event mouse_button; + mgl_mouse_move_event mouse_move; + }; }; #endif /* MGL_EVENT_H */ diff --git a/include/mgl/window/key.h b/include/mgl/window/key.h new file mode 100644 index 0000000..90a3366 --- /dev/null +++ b/include/mgl/window/key.h @@ -0,0 +1,109 @@ +#ifndef _MGL_KEY_H_ +#define _MGL_KEY_H_ + +typedef enum { + MGL_KEY_UNKNOWN, + MGL_KEY_A, + MGL_KEY_B, + MGL_KEY_C, + MGL_KEY_D, + MGL_KEY_E, + MGL_KEY_F, + MGL_KEY_G, + MGL_KEY_H, + MGL_KEY_I, + MGL_KEY_J, + MGL_KEY_K, + MGL_KEY_L, + MGL_KEY_M, + MGL_KEY_N, + MGL_KEY_O, + MGL_KEY_P, + MGL_KEY_Q, + MGL_KEY_R, + MGL_KEY_S, + MGL_KEY_T, + MGL_KEY_U, + MGL_KEY_V, + MGL_KEY_W, + MGL_KEY_X, + MGL_KEY_Y, + MGL_KEY_Z, + MGL_KEY_NUM0, + MGL_KEY_NUM1, + MGL_KEY_NUM2, + MGL_KEY_NUM3, + MGL_KEY_NUM4, + MGL_KEY_NUM5, + MGL_KEY_NUM6, + MGL_KEY_NUM7, + MGL_KEY_NUM8, + MGL_KEY_NUM9, + MGL_KEY_ESCAPE, + MGL_KEY_LCONTROL, + MGL_KEY_LSHIFT, + MGL_KEY_LALT, + MGL_KEY_LSYSTEM, + MGL_KEY_RCONTROL, + MGL_KEY_RSHIFT, + MGL_KEY_RALT, + MGL_KEY_RSYSTEM, + MGL_KEY_MENU, + MGL_KEY_LBRACKET, + MGL_KEY_RBRACKET, + MGL_KEY_SEMICOLON, + MGL_KEY_COMMA, + MGL_KEY_PERIOD, + MGL_KEY_QUOTE, + MGL_KEY_SLASH, + MGL_KEY_BACKSLASH, + MGL_KEY_TILDE, + MGL_KEY_EQUAL, + MGL_KEY_HYPHEN, + MGL_KEY_SPACE, + MGL_KEY_ENTER, + MGL_KEY_BACKSPACE, + MGL_KEY_TAB, + MGL_KEY_PAGEUP, + MGL_KEY_PAGEDOWN, + MGL_KEY_END, + MGL_KEY_HOME, + MGL_KEY_INSERT, + MGL_KEY_DELETE, + MGL_KEY_ADD, + MGL_KEY_SUBTRACT, + MGL_KEY_MULTIPLY, + MGL_KEY_DIVIDE, + MGL_KEY_LEFT, + MGL_KEY_RIGHT, + MGL_KEY_UP, + MGL_KEY_DOWN, + MGL_KEY_NUMPAD0, + MGL_KEY_NUMPAD1, + MGL_KEY_NUMPAD2, + MGL_KEY_NUMPAD3, + MGL_KEY_NUMPAD4, + MGL_KEY_NUMPAD5, + MGL_KEY_NUMPAD6, + MGL_KEY_NUMPAD7, + MGL_KEY_NUMPAD8, + MGL_KEY_NUMPAD9, + MGL_KEY_F1, + MGL_KEY_F2, + MGL_KEY_F3, + MGL_KEY_F4, + MGL_KEY_F5, + MGL_KEY_F6, + MGL_KEY_F7, + MGL_KEY_F8, + MGL_KEY_F9, + MGL_KEY_F10, + MGL_KEY_F11, + MGL_KEY_F12, + MGL_KEY_F13, + MGL_KEY_F14, + MGL_KEY_F15, + MGL_KEY_PAUSE +} mgl_key; + +#endif /* _MGL_KEY_H_ */ diff --git a/include/mgl/window/window.h b/include/mgl/window/window.h index b30583b..297ccb9 100644 --- a/include/mgl/window/window.h +++ b/include/mgl/window/window.h @@ -5,6 +5,8 @@ #include "../system/vec.h" #include +/* Vsync is automatically set for windows created, if supported by the system */ + typedef struct __GLXcontextRec *GLXContext; typedef struct mgl_event mgl_event; /* x11 window handle. TODO: Add others when wayland, etc is added */ @@ -16,6 +18,7 @@ struct mgl_window { mgl_window_handle window; GLXContext glx_context; mgl_vec2i size; + /* relative to the top left of the window. only updates when the cursor is inside the window */ mgl_vec2i cursor_position; }; -- cgit v1.2.3