Usermode/AxWin4 - Server implementation runnable
[tpg/acess2.git] / Usermode / Applications / axwin3_src / WM / renderers / widget / textinput.c
index 2e21e78..de862bf 100644 (file)
 #include <common.h>
 #include "./common.h"
 #include "./colours.h"
-#include <utf8.h>
+#include <unicode.h>
 #include <string.h>
 
+// TODO: Include a proper keysym header
+#define KEYSYM_LEFTARROW       0x50
+#define KEYSYM_RIGHTARROW      0x4F
+
 struct sTextInputInfo
 {
         int    DrawOfs;        // Byte offset for the leftmost character
@@ -113,6 +117,8 @@ void Widget_TextInput_Init(tElement *Element)
        info = Element->Data = malloc(sizeof(*info));
        info->DrawOfs = 0;
        info->CursorXOfs = 0;
+       info->CursorByteOfs = 0;
+       info->Length = 0;
 
        // No need to explicitly update parent min dims, as the AddElement routine does that    
 }
@@ -128,7 +134,38 @@ int Widget_TextInput_KeyFire(tElement *Element, int KeySym, int Character)
 //     _SysDebug("Key 0x%x fired ('%c')", Character, Character);
        
        if( Character == 0 )
+       {
+               switch(KeySym)
+               {
+               case KEYSYM_LEFTARROW:
+                       if( info->CursorByteOfs > 0 )
+                       {
+                               len = ReadUTF8Rev(Element->Text, info->CursorByteOfs, &cp);
+                               info->CursorByteOfs -= len;
+                               WM_Render_GetTextDims(
+                                       gpTextInput_Font,
+                                       Element->Text+info->CursorByteOfs,
+                                       len, &w, 0
+                                       );
+                               info->CursorXOfs -= w;
+                       }
+                       break;
+               case KEYSYM_RIGHTARROW:
+                       if( info->CursorByteOfs < info->Length )
+                       {
+                               len = ReadUTF8(Element->Text + info->CursorByteOfs, &cp);
+                               WM_Render_GetTextDims(
+                                       gpTextInput_Font,
+                                       Element->Text+info->CursorByteOfs,
+                                       len, &w, 0
+                                       );
+                               info->CursorByteOfs += len;
+                               info->CursorXOfs += w;
+                       }
+                       break;
+               }
                return 0;
+       }
 
        // TODO: Don't hard code
        if(Character > 0x30000000)      return 0;
@@ -178,12 +215,12 @@ int Widget_TextInput_KeyFire(tElement *Element, int KeySym, int Character)
        }
 
        // TODO: Have a Widget_ function to do this instead
-       WM_Invalidate(Element->Window);
+       WM_Invalidate(Element->Window, 1);
        
        return 0;
 }
 
-DEFWIDGETTYPE(ELETYPE_TEXTINPUT,
+DEFWIDGETTYPE(ELETYPE_TEXTINPUT, "TextInput",
        WIDGETTYPE_FLAG_NOCHILDREN,
        .Render = Widget_TextInput_Render,
        .Init = Widget_TextInput_Init,

UCC git Repository :: git.ucc.asn.au