From 662f5796c5b3b8bfa8d64f5e16d9a087a6bd07db Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Wed, 8 Oct 2025 18:42:01 +0000 Subject: [PATCH] wip git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@233 b9cfdab3-6d41-4d17-bbe4-086880011989 --- include/Mw/LowLevel.h | 4 ++++ include/Mw/Widget/Text.h | 2 +- src/backend/x11.c | 11 ++++++--- src/widget/menu.c | 2 +- src/widget/text.c | 49 +++++++++++++++++++++++++++++++++++++--- 5 files changed, 60 insertions(+), 8 deletions(-) diff --git a/include/Mw/LowLevel.h b/include/Mw/LowLevel.h index 4aebbe6..4e92368 100644 --- a/include/Mw/LowLevel.h +++ b/include/Mw/LowLevel.h @@ -36,6 +36,10 @@ typedef void* MwLLPixmap; #define MwLLDispatch(x, y, z) \ if(x->handler != NULL && x->handler->y != NULL) x->handler->y(x, z) +enum MwLLKey { + MwLLKeyBackSpace = (1 << 31) | 1 +}; + struct _MwLLHandler { void (*draw)(MwLL handle, void* data); void (*up)(MwLL handle, void* data); diff --git a/include/Mw/Widget/Text.h b/include/Mw/Widget/Text.h index 4be8ba6..953dc39 100644 --- a/include/Mw/Widget/Text.h +++ b/include/Mw/Widget/Text.h @@ -2,7 +2,7 @@ /*! * %file Mw/Widget/Text.h * %brief Text widget - * %prop MwNchecked + * %prop MwNtext */ #ifndef __MW_WIDGET_TEXT_H__ #define __MW_WIDGET_TEXT_H__ diff --git a/src/backend/x11.c b/src/backend/x11.c index f1bea80..60c5ba3 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -182,9 +182,12 @@ void MwLLNextEvent(MwLL handle) { MwLLDispatch(handle, move, &p); } else if(ev.type == KeyPress) { - int n; + int n = -1; KeySym sym = XLookupKeysym(&ev.xkey, 0); char* str = XKeysymToString(sym); + + if(strcmp(str, "space") == 0) str = " "; + /* HACK: this is bad, you can guess why */ if(strlen(str) == 1) { char s = str == NULL ? 0 : str[0]; @@ -194,9 +197,11 @@ void MwLLNextEvent(MwLL handle) { } else { n = s; } - - MwLLDispatch(handle, key, &n); + } else if(strcmp(str, "BackSpace") == 0) { + n = MwLLKeyBackSpace; } + + if(n != -1) MwLLDispatch(handle, key, &n); } if(render) { int x, y; diff --git a/src/widget/menu.c b/src/widget/menu.c index 88d1280..fe199ee 100644 --- a/src/widget/menu.c +++ b/src/widget/menu.c @@ -85,7 +85,7 @@ static void destroy(MwWidget handle) { } \ \ r.x = p.x - 5; \ - r.y = p.y - 5; \ + r.y = p.y - th / 2 - 5; \ r.width = tw + 10; \ r.height = th + 10; \ \ diff --git a/src/widget/text.c b/src/widget/text.c index 83c739e..0cffe60 100644 --- a/src/widget/text.c +++ b/src/widget/text.c @@ -10,8 +10,10 @@ static int create(MwWidget handle) { } static void draw(MwWidget handle) { - MwRect r; - MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); + MwRect r; + MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); + MwLLColor text = MwParseColor(handle, MwGetText(handle, MwNforeground)); + const char* str = MwGetText(handle, MwNtext); r.x = 0; r.y = 0; @@ -20,12 +22,53 @@ static void draw(MwWidget handle) { MwDrawFrame(handle, &r, base, (handle->pressed || MwGetInteger(handle, MwNchecked)) ? 1 : 0); MwDrawRect(handle, &r, base); + if(str != NULL) { + int h = MwTextHeight(handle, "M"); + MwPoint p; + p.x = (r.height - h) / 2; + p.y = r.height / 2; + + /* limit so there isn't a crazy padding */ + if(p.x > 4) p.x = 4; + + MwDrawText(handle, &p, str, 0, MwALIGNMENT_BEGINNING, text); + } + + MwLLFreeColor(text); MwLLFreeColor(base); } static void key(MwWidget handle, int code) { - printf("%c\n", code); + const char* str = MwGetText(handle, MwNtext); + char* out; + char buf[2]; + if(str == NULL) str = ""; + + if(code == MwLLKeyBackSpace) { + if(strlen(str) == 0) return; + out = malloc(strlen(str) + 1); + + strcpy(out, str); + out[strlen(out) - 1] = 0; + + MwSetText(handle, MwNtext, out); + + free(out); + } else { + buf[0] = code; + buf[1] = 0; + + out = malloc(strlen(str) + 1 + 1); + strcpy(out, str); + strcat(out, buf); + + MwSetText(handle, MwNtext, out); + + free(out); + } + + MwForceRender(handle); } MwClassRec MwTextClassRec = {