Fri, 01 May 2026 20:50:33 +0200
merge
--- a/ui/cocoa/text.m Fri May 01 20:49:35 2026 +0200 +++ b/ui/cocoa/text.m Fri May 01 20:50:33 2026 +0200 @@ -81,7 +81,91 @@ return (__bridge void*)textview; } +void ui_textarea_focus(UIWIDGET textarea) { + textarea = ui_textarea_gettextwidget(textarea); + if(!textarea) { + fprintf(stderr, "Error: ui_textarea_focus: widget is not a textarea\n"); + return; + } + NSTextView *view = (__bridge NSTextView*)textarea; + [view.window makeFirstResponder:view]; +} + +void ui_textarea_set_selection(UIWIDGET textarea, int begin, int end) { + textarea = ui_textarea_gettextwidget(textarea); + if(!textarea) { + fprintf(stderr, "Error: ui_textarea_set_selection: widget is not a textarea\n"); + return; + } + NSTextView *view = (__bridge NSTextView*)textarea; + NSRange range = NSMakeRange(begin, end-begin); + [view setSelectedRange:range]; +} + +void ui_textarea_select_all(UIWIDGET textarea) { + textarea = ui_textarea_gettextwidget(textarea); + if(!textarea) { + fprintf(stderr, "Error: ui_textarea_select_all: widget is not a textarea\n"); + return; + } +} + +void ui_textarea_set_editable(UIWIDGET textarea, UiBool editable) { + textarea = ui_textarea_gettextwidget(textarea); + if(!textarea) { + fprintf(stderr, "Error: ui_textarea_set_editable: widget is not a textarea\n"); + return; + } + NSTextView *view = (__bridge NSTextView*)textarea; + view.editable = editable; +} + +UiBool ui_textarea_is_editable(UIWIDGET textarea) { + textarea = ui_textarea_gettextwidget(textarea); + if(!textarea) { + fprintf(stderr, "Error: ui_textarea_is_editable: widget is not a textarea\n"); + return 0; + } + NSTextView *view = (__bridge NSTextView*)textarea; + return view.isEditable; +} + +void ui_textarea_set_position(UIWIDGET textarea, int pos) { + textarea = ui_textarea_gettextwidget(textarea); + if(!textarea) { + fprintf(stderr, "Error: ui_textarea_set_position: widget is not a textarea\n"); + return; + } + NSTextView *view = (__bridge NSTextView*)textarea; + NSRange range = NSMakeRange(pos, 0); + [view setSelectedRange:range]; +} + +int ui_textarea_get_position(UIWIDGET textarea) { + textarea = ui_textarea_gettextwidget(textarea); + if(!textarea) { + fprintf(stderr, "Error: ui_textarea_get_position: widget is not a textarea\n"); + return 0; + } + NSTextView *view = (__bridge NSTextView*)textarea; + NSRange range = view.selectedRange; + return (int)range.location; +} + +void ui_textarea_scroll_to(UIWIDGET textarea, int pos) { + textarea = ui_textarea_gettextwidget(textarea); + if(!textarea) { + fprintf(stderr, "Error: ui_textarea_scroll_to: widget is not a textarea\n"); + return; + } + NSTextView *view = (__bridge NSTextView*)textarea; + NSRange range = NSMakeRange(pos, 0); + [view scrollRangeToVisible:range]; +} + + +// UiText textarea functions void ui_textarea_save(UiText *text) {
--- a/ui/common/types.c Fri May 01 20:49:35 2026 +0200 +++ b/ui/common/types.c Fri May 01 20:50:33 2026 +0200 @@ -978,7 +978,7 @@ char* ui_text_getsubstr(UiText *text, int begin, int end) { if(text->getsubstr) { - text->getsubstr(text, begin, end); + return text->getsubstr(text, begin, end); } else { return NULL; }