esc

Externally Scriptable Editor

git clone git://mccd.space/esc

commit 1aea1035cbc523e5abc7ffffed6e3ba80867be89
parent 45a19884912c41f7cd4d58de675c9eddefb49dbe
Author: Marc Coquand <marc@coquand.email>
Date:   Thu, 19 Feb 2026 14:13:30 +0100

*

Diffstat:
Mmain.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],