aboutsummaryrefslogtreecommitdiffstats
path: root/src/gwin/gwin_textedit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gwin/gwin_textedit.c')
-rw-r--r--src/gwin/gwin_textedit.c60
1 files changed, 16 insertions, 44 deletions
diff --git a/src/gwin/gwin_textedit.c b/src/gwin/gwin_textedit.c
index 99708a0a..5ea8936a 100644
--- a/src/gwin/gwin_textedit.c
+++ b/src/gwin/gwin_textedit.c
@@ -23,9 +23,6 @@ const int FOCUS_BORDER_THICKNESS = 3;
const int CURSOR_PADDING_LEFT = 0;
const int CURSOR_EXTRA_HEIGHT = 1;
-// Some flags
-#define GTEXTEDIT_FLG_BORDER (GWIN_FIRST_CONTROL_FLAG << 0)
-
// Macros to assist in data type conversions
#define gh2obj ((GTexteditObject *)gh)
#define gw2obj ((GTexteditObject *)gw)
@@ -65,7 +62,7 @@ static void _shiftTextRight(char* buffer, size_t bufferSize, size_t index, char
#if GINPUT_NEED_KEYBOARD
- static void _keyboardEvent(GWidgetObject* gw, GEventKeyboard* pke)
+ static void TextEditKeyboard(GWidgetObject* gw, GEventKeyboard* pke)
{
// Only react on KEYDOWN events. Ignore KEYUP events.
if (pke->keystate & GKEYSTATE_KEYUP) {
@@ -116,9 +113,8 @@ static void _shiftTextRight(char* buffer, size_t bufferSize, size_t index, char
// Add a new character
else {
// Prevent buffer overflow
- if (gw2obj->cursorPos >= gw2obj->bufferSize) {
+ if (gw2obj->cursorPos >= gw2obj->maxSize)
return;
- }
// Shift everything right from the cursor by one character. This includes the '\0'. Then inser the new character.
_shiftTextRight(gw2obj->textBuffer, gw2obj->bufferSize, gw2obj->cursorPos++, pke->c[0]);
@@ -152,7 +148,7 @@ static const gwidgetVMT texteditVMT = {
#endif
#if GINPUT_NEED_KEYBOARD
{
- _keyboardEvent // Process keyboard key down events
+ TextEditKeyboard // Process keyboard key down events
},
#endif
#if GINPUT_NEED_TOGGLE
@@ -174,50 +170,33 @@ static const gwidgetVMT texteditVMT = {
#endif
};
-GHandle gwinGTexteditCreate(GDisplay* g, GTexteditObject* widget, GWidgetInit* pInit, size_t bufSize)
+GHandle gwinGTexteditCreate(GDisplay* g, GTexteditObject* wt, GWidgetInit* pInit, size_t maxSize)
{
uint16_t flags = 0;
// Create the underlying widget
- if (!(widget = (GTexteditObject*)_gwidgetCreate(g, &widget->w, pInit, &texteditVMT))) {
+ if (!(wt = (GTexteditObject*)_gwidgetCreate(g, &wt->w, pInit, &texteditVMT)))
return 0;
- }
// Allocate the text buffer
- widget->bufferSize = bufSize;
- widget->textBuffer = gfxAlloc(widget->bufferSize);
- if (widget->textBuffer == 0) {
+ wt->maxSize = maxSize;
+ wt->textBuffer = gfxAlloc(widget->maxSize);
+ if (wt->textBuffer == 0)
return 0;
- }
// Initialize the text buffer
size_t i = 0;
for (i = 0; i < bufSize; i++) {
- widget->textBuffer[i] = '\0';
+ wt->textBuffer[i] = '\0';
}
// Set text and cursor position
- strncpy(widget->textBuffer, gwinGetText((GHandle)widget), widget->bufferSize); // FixMe: pInit->text leads to a segfault
- widget->cursorPos = strlen(widget->textBuffer);
+ strncpy(wt->textBuffer, gwinGetText((GHandle)wt), wt->maxSize); // FixMe: pInit->text leads to a segfault
+ wt->cursorPos = strlen(wt->textBuffer);
- widget->w.g.flags |= flags | GTEXTEDIT_FLG_BORDER;;
- gwinSetVisible(&widget->w.g, pInit->g.show);
-
- return (GHandle)widget;
-}
-
-void gwinTexteditSetBorder(GHandle gh, bool_t border)
-{
- // Is it a valid handle?
- if (gh->vmt != (gwinVMT*)&texteditVMT) {
- return;
- }
+ gwinSetVisible(&wt->w.g, pInit->g.show);
- if (border) {
- gh2obj->w.g.flags |= GTEXTEDIT_FLG_BORDER;
- } else {
- gh2obj->w.g.flags &=~ GTEXTEDIT_FLG_BORDER;
- }
+ return (GHandle)wt;
}
static void gwinTexteditDefaultDraw(GWidgetObject* gw, void* param)
@@ -238,18 +217,11 @@ static void gwinTexteditDefaultDraw(GWidgetObject* gw, void* param)
gdispGFillArea(gw->g.display, gw->g.x, gw->g.y, gw->g.width, gw->g.height, gw->pstyle->background);
gdispGFillStringBox(gw->g.display, gw->g.x + TEXT_PADDING_LEFT, gw->g.y, gw->g.width, gw->g.height, gw->text, gw->g.font, textColor, gw->pstyle->background, justifyLeft);
- // Render border (if supposed to)
- if (gw2obj->w.g.flags & GTEXTEDIT_FLG_BORDER) {
- gdispGDrawBox(gw->g.display, gw->g.x, gw->g.y, gw->g.width, gw->g.height, (gw->g.flags & GWIN_FLG_SYSENABLED) ? gw->pstyle->enabled.edge : gw->pstyle->disabled.edge);
- }
+ // Render border (always)
+ gdispGDrawBox(gw->g.display, gw->g.x, gw->g.y, gw->g.width, gw->g.height, (gw->g.flags & GWIN_FLG_SYSENABLED) ? gw->pstyle->enabled.edge : gw->pstyle->disabled.edge);
// Render highlighted border of focused
- if (gwinGetFocus() == (GHandle)gw) {
- int i = 0;
- for (i = 0; i < FOCUS_BORDER_THICKNESS; i++) {
- gdispGDrawBox(gw->g.display, gw->g.x+i, gw->g.y+i, gw->g.width-2*i, gw->g.height-2*i, gw->pstyle->focus);
- }
- }
+ _gwidgetDrawFocusRect(gw, 0, 0, gw->g.width-1, gw->g.height-1);
// Render cursor (if focused)
if (gwinGetFocus() == (GHandle)gw) {