esc
Externally Scriptable Editor
git clone git://mccd.space/esc
| Log | Files | Refs | README |
commit 1aea1035cbc523e5abc7ffffed6e3ba80867be89 parent 45a19884912c41f7cd4d58de675c9eddefb49dbe Author: Marc Coquand <marc@coquand.email> Date: Thu, 19 Feb 2026 14:13:30 +0100 * Diffstat:
| M | main.c | | | 51 | +++++++++++++++++++++++++++++++++++++++++++++------ |
1 file changed, 45 insertions(+), 6 deletions(-)
diff --git a/main.c b/main.c
@@ -5,10 +5,49 @@
#include <stdlib.h>
#include <string.h>
-#define MAX_TEXT_LEN 999999
+int get_idx_from_coords(const char *buffer, float mx, float my, float scroll_x,
+ float scroll_y, int char_width, float line_height) {
+ int target_col =
+ (int)((mx - 20.0f + scroll_x + (char_width / 2.0f)) / char_width);
+ int target_row = (int)((my - 20.0f + scroll_y) / line_height);
+
+ if (target_col < 0)
+ target_col = 0;
+ if (target_row < 0)
+ target_row = 0;
+
+ int current_row = 0, current_col = 0;
+ const char *ptr = buffer;
+ const char *last_ptr = buffer;
+
+ while (*ptr != '\0') {
+ if (current_row == target_row && current_col == target_col)
+ break;
+
+ last_ptr = ptr;
+ Uint32 codepoint = SDL_StepUTF8(&ptr, NULL);
+
+ if (codepoint == '\n') {
+ if (current_row == target_row) {
+ ptr = last_ptr;
+ break;
+ }
+ current_row++;
+ current_col = 0;
+ } else {
+ current_col++;
+ }
+
+ if (current_row > target_row) {
+ ptr = last_ptr;
+ break;
+ }
+ }
+ return (int)(ptr - buffer);
+}
int main(int argc, char *argv[]) {
- // 1. SET HINT BEFORE INIT
+ // Otherwise wayland just wouldn't load.
SDL_SetHintWithPriority(SDL_HINT_VIDEO_DRIVER, "wayland",
SDL_HINT_OVERRIDE);
@@ -16,7 +55,7 @@ int main(int argc, char *argv[]) {
TTF_Init();
SDL_Window *window = SDL_CreateWindow(
- "Sharp Text Editor", 800, 600,
+ "oi", 800, 600,
SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIGH_PIXEL_DENSITY);
SDL_Renderer *renderer = SDL_CreateRenderer(window, NULL);
SDL_SetRenderLogicalPresentation(renderer, 800, 600,
@@ -38,6 +77,8 @@ int main(int argc, char *argv[]) {
int cursor_idx = 0;
SDL_StartTextInput(window);
+ int selection_idx = 0;
+ bool is_selecting = false;
while (running) {
SDL_Event event;
@@ -146,9 +187,7 @@ int main(int argc, char *argv[]) {
1);
text_length -= char_size;
cursor_idx = prev_idx;
- } else if (key == SDLK_RETURN &&
- text_length <
- MAX_TEXT_LEN - 1) {
+ } else if (key == SDLK_RETURN) {
memmove(
&text_buffer[cursor_idx +
1],