]> git.webhop.me Git - input.git/commitdiff
port code from martii for a smoother rendering & better RC handling
authorGetAway <get-away@t-online.de>
Sun, 18 Dec 2016 21:23:42 +0000 (22:23 +0100)
committersvenhoefer <svenhoefer@svenhoefer.com>
Sun, 18 Dec 2016 21:34:38 +0000 (22:34 +0100)
12 files changed:
current.h [new file with mode: 0644]
gfx.c
gfx.h
input.c
input.h
inputd.c
inputd.h
io.c
io.h
readme.txt [new file with mode: 0644]
text.c
text.h

diff --git a/current.h b/current.h
new file mode 100644 (file)
index 0000000..ba13dbd
--- /dev/null
+++ b/current.h
@@ -0,0 +1,3 @@
+#define __plugin__ "input"
+
+#include "input.h"
diff --git a/gfx.c b/gfx.c
index 23c826bb9f338ad127f66dc1d80d4cdd29431e83..f84aaf002dd0aa7aea6001015fab77c1c8fdddc7 100644 (file)
--- a/gfx.c
+++ b/gfx.c
@@ -1,32 +1,44 @@
+#include <math.h>
+
+#include "current.h"
 #include "input.h"
 
 char circle[] =
 {
-       0,0,0,0,0,1,1,0,0,0,0,0,
-       0,0,0,1,1,1,1,1,1,0,0,0,
-       0,0,1,1,1,1,1,1,1,1,0,0,
-       0,1,1,1,1,1,1,1,1,1,1,0,
-       0,1,1,1,1,1,1,1,1,1,1,0,
-       1,1,1,1,1,1,1,1,1,1,1,1,
-       1,1,1,1,1,1,1,1,1,1,1,1,
-       0,1,1,1,1,1,1,1,1,1,1,0,
-       0,1,1,1,1,1,1,1,1,1,1,0,
-       0,0,1,1,1,1,1,1,1,1,0,0,
-       0,0,0,1,1,1,1,1,1,0,0,0,
-       0,0,0,0,0,1,1,0,0,0,0,0
+       0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,
+       0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,0,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+       0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,0,
+       0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0
 };
 
-void RenderBox(int sx, int sy, int ex, int ey, int rad, int col)
+size_t GetCircleHeight()
 {
-       int F,R=rad,ssx=startx+sx,ssy=starty+sy,dxx=ex-sx,dyy=ey-sy,rx,ry,wx,wy,count;
+       return sqrt(sizeof(circle));
+}
+
+void RenderBox(int _sx, int _sy, int _ex, int _ey, int rad, int col)
+{
+       int F,R=rad,ssx=startx+_sx,ssy=starty+_sy,dxx=_ex-_sx,dyy=_ey-_sy,rx,ry,wx,wy,count;
+
+       uint32_t *pos = lbb + ssx + stride * ssy;
+       uint32_t *pos0, *pos1, *pos2, *pos3, *i;
+       uint32_t pix = bgra[col];
 
-       unsigned char *pos=(lbb+(ssx<<2)+fix_screeninfo.line_length*ssy);
-       unsigned char *pos0, *pos1, *pos2, *pos3, *i;
-       unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]};
-               
        if (dxx<0) 
        {
-               printf("[input] RenderBox called with dx < 0 (%d)\n", dxx);
+               fprintf(stderr, "[%s] RenderBox called with dx < 0 (%d)\n",__plugin__ , dxx);
                dxx=0;
        }
 
@@ -64,10 +76,11 @@ void RenderBox(int sx, int sy, int ex, int ey, int rad, int col)
                rx=R-ssx;
                ry=R-ssy;
 
-               pos0=pos+((dyy-ry)*fix_screeninfo.line_length);
-               pos1=pos+(ry*fix_screeninfo.line_length);
-               pos2=pos+(rx*fix_screeninfo.line_length);
-               pos3=pos+((dyy-rx)*fix_screeninfo.line_length);
+               pos0=pos+(dyy-ry)*stride;
+               pos1=pos+ry*stride;
+               pos2=pos+rx*stride;
+               pos3=pos+(dyy-rx)*stride;
+
                while (ssx <= ssy)
                {
                        rx=R-ssx;
@@ -75,18 +88,18 @@ void RenderBox(int sx, int sy, int ex, int ey, int rad, int col)
                        wx=rx<<1;
                        wy=ry<<1;
 
-                       for(i=pos0+(rx<<2); i<pos0+((rx+dxx-wx)<<2);i+=4)
-                               memcpy(i, pix, 4);
-                       for(i=pos1+(rx<<2); i<pos1+((rx+dxx-wx)<<2);i+=4)
-                               memcpy(i, pix, 4);
-                       for(i=pos2+(ry<<2); i<pos2+((ry+dxx-wy)<<2);i+=4)
-                               memcpy(i, pix, 4);
-                       for(i=pos3+(ry<<2); i<pos3+((ry+dxx-wy)<<2);i+=4)
-                               memcpy(i, pix, 4);
+                       for(i=pos0+rx; i<pos0+rx+dxx-wx;i++)
+                               *i = pix;
+                       for(i=pos1+rx; i<pos1+rx+dxx-wx;i++)
+                               *i = pix;
+                       for(i=pos2+ry; i<pos2+ry+dxx-wy;i++)
+                               *i = pix;
+                       for(i=pos3+ry; i<pos3+ry+dxx-wy;i++)
+                               *i = pix;
 
                        ssx++;
-                       pos2-=fix_screeninfo.line_length;
-                       pos3+=fix_screeninfo.line_length;
+                       pos2-=stride;
+                       pos3+=stride;
                        if (F<0)
                        {
                                F+=(ssx<<1)-1;
@@ -95,18 +108,18 @@ void RenderBox(int sx, int sy, int ex, int ey, int rad, int col)
                        { 
                                F+=((ssx-ssy)<<1);
                                ssy--;
-                               pos0-=fix_screeninfo.line_length;
-                               pos1+=fix_screeninfo.line_length;
+                               pos0-=stride;
+                               pos1+=stride;
                        }
                }
-               pos+=R*fix_screeninfo.line_length;
+               pos+=R*stride;
        }
 
        for (count=R; count<(dyy-R); count++)
        {
-               for(i=pos; i<pos+(dxx<<2);i+=4)
-                       memcpy(i, pix, 4);
-               pos+=fix_screeninfo.line_length;
+               for(i=pos; i<pos+dxx;i++)
+                       *i = pix;
+               pos+=stride;
        }
 }
 
@@ -114,15 +127,18 @@ void RenderBox(int sx, int sy, int ex, int ey, int rad, int col)
  * RenderCircle
  ******************************************************************************/
 
-void RenderCircle(int sx, int sy, char col)
+void RenderCircle(int _sx, int _sy, int col)
 {
        int x, y;
-       unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]};
-       //render
+       uint32_t pix = bgra[col];
+       uint32_t *p = lbb + startx + _sx;
+       int s = stride * (starty + _sy /*+ y*/);
+       int h = GetCircleHeight();
 
-               for(y = 0; y < 12; y++)
-               {
-                       for(x = 0; x < 12; x++) if(circle[x + y*12]) memcpy(lbb + (startx + sx + x)*4 + fix_screeninfo.line_length*(starty + sy + y), pix, 4);
-               }
+       for(y = 0; y < h * h; y += h, s += stride)
+               for(x = 0; x < h; x++)
+                       switch(circle[x + y]) {
+                               case 1: *(p + x + s) = pix; break;
+                               case 2: *(p + x + s) = 0xFFFFFFFF; break;
+                       }
 }
-
diff --git a/gfx.h b/gfx.h
index f3a9466811662237d771fade318ce3b047b10443..d674c2304adf81222ef4a817174960238e3a33cc 100644 (file)
--- a/gfx.h
+++ b/gfx.h
@@ -1,8 +1,8 @@
 #ifndef __GFX_H__
-
 #define __GFX_H__
 
-void RenderBox(int sx, int sy, int ex, int ey, int mode, int color);
-void RenderCircle(int sx, int sy, char col);
+void RenderBox(int sx, int sy, int ex, int ey, int rad, int col);
+void RenderCircle(int _sx, int _sy, int col);
+size_t GetCircleHeight();
 
 #endif
diff --git a/input.c b/input.c
index 1a9e96d81b1677a953a03d613aa1159428e50a97..4ba17903ac3b0fe0eff3ed7d6f317fe72131da87 100644 (file)
--- a/input.c
+++ b/input.c
@@ -2,7 +2,9 @@
 #include <stdio.h>
 #include <time.h>
 #include <signal.h>
-#include "input.h"
+
+#include "current.h"
+
 #include "text.h"
 #include "io.h"
 #include "gfx.h"
@@ -10,7 +12,7 @@
 
 #define NCF_FILE       "/var/tuxbox/config/neutrino.conf"
 #define BUFSIZE        1024
-#define I_VERSION      1.11
+#define I_VERSION      1.42
 
 //#define FONT "/usr/share/fonts/md_khmurabi_10.ttf"
 #define FONT2 "/share/fonts/pakenham.ttf"
@@ -28,8 +30,10 @@ unsigned char rd[] = {       0x00,   0x00,   0xFF,   0x00,   0xFF,   0x00,   0xFF,   0x00,
                                            0xFF,       0x00,   0x00,   0x00,   0xFF,   0x00,   0xFF,   0xFF};
 unsigned char tr[] = { 0xFF,   0xFF,   0xFF,   0xA0,   0xFF,   0xA0,   0xFF,   0xFF,
                                                0xFF,   0xFF,   0x00,   0xFF,   0xFF,   0xFF,   0xFF,   0xFF};
+uint32_t bgra[20];
 
 void TrimString(char *strg);
+void closedown(void);
 
 // OSD stuff
 static char menucoltxt[][25]={"Content_Selected_Text","Content_Selected","Content_Text","Content","Content_inactive_Text","Content_inactive","Head_Text","Head"};
@@ -37,40 +41,40 @@ static char spres[][5]={"","_crt","_lcd"};
 
 char *buffer=NULL;
 
-//static void ShowInfo(void);
-
 // Misc
-char NOMEM[]="input <Out of memory>\n";
-char TMP_FILE[]="/tmp/input.tmp";
-unsigned char *lfb = 0, *lbb = 0, *obb = 0;
-unsigned char nstr[512]="",rstr[512]="";
-unsigned char *trstr;
-unsigned char rc,sc[8]={'a','o','u','A','O','U','z','d'}, tc[8]={0xE4,0xF6,0xFC,0xC4,0xD6,0xDC,0xDF,0xB0};
-int radius=10;
+const char NOMEM[]="input <Out of memory>\n";
+const char TMP_FILE[]="/tmp/input.tmp";
+uint32_t *lfb = NULL, *lbb = NULL, *obb = NULL;
+char nstr[512]={0};
+char *trstr=NULL;
+const char sc[8]={'a','o','u','A','O','U','z','d'}, tc[8]={0xE4,0xF6,0xFC,0xC4,0xD6,0xDC,0xDF,0xB0};
+int radius;
+int stride;
+
 
 static void quit_signal(int sig)
 {
        char *txt=NULL;
        switch (sig)
        {
-               case SIGINT:  txt=strdup("SIGINT");  break;
-               case SIGTERM: txt=strdup("SIGTERM"); break;
-               case SIGQUIT: txt=strdup("SIGQUIT"); break;
-               case SIGSEGV: txt=strdup("SIGSEGV"); break;
+               case SIGINT:  txt=strdup("SIGINT");  break;  // 2
+               case SIGQUIT: txt=strdup("SIGQUIT"); break;  // 3
+               case SIGSEGV: txt=strdup("SIGSEGV"); break;  // 11
+               case SIGTERM: txt=strdup("SIGTERM"); break;  // 15
                default:
                        txt=strdup("UNKNOWN"); break;
        }
 
-       printf("input Version %.2f killed, signal %s(%d)\n", I_VERSION, txt, sig);
-       put_instance(get_instance()-1);
+       printf("%s Version %.2f killed, signal %s(%d)\n", __plugin__, I_VERSION, txt, sig);
        free(txt);
+       closedown();
        exit(1);
 }
 
 int Read_Neutrino_Cfg(char *entry)
 {
 FILE *nfh;
-char tstr [512], *cfptr=NULL;
+char tstr [512]={0}, *cfptr=NULL;
 int rv=-1;
 
        if((nfh=fopen(NCF_FILE,"r"))!=NULL)
@@ -136,8 +140,9 @@ char *pt1=strg, *pt2=strg;
 
 int Transform_Msg(char *msg)
 {
-int found=0,i;
-char *sptr=msg, *tptr=msg;
+unsigned i;
+int found=0;
+char *sptr=msg, *tptr=msg, rc;
 
        while(*sptr)
        {
@@ -149,7 +154,7 @@ char *sptr=msg, *tptr=msg;
                {
                        rc=*(sptr+1);
                        found=0;
-                       for(i=0; i<sizeof(sc) && !found; i++)
+                       for(i=0; i<sizeof(sc)/sizeof(sc[0]) && !found; i++)
                        {
                                if(rc==sc[i])
                                {
@@ -197,12 +202,10 @@ void ShowUsage(void)
 
 int main (int argc, char **argv)
 {
-int tv,cols=25,debounce=25,tmo=0,index, spr;
-char ttl[]="Eingabe";
+int tv,cols=25,tmo=0,ix, spr;
+const char ttl[]="Eingabe";
 int dloop=1,keys=0,frame=1,mask=0,bhelp=0;
-char *title=NULL, *format=NULL, *defstr=NULL, *aptr, *rptr; 
-unsigned int alpha;
-//FILE *fh;
+char rstr[512]={0}, *title=NULL, *format=NULL, *defstr=NULL, *aptr=NULL, *rptr=NULL;
 
                if(argc==1)
                {
@@ -306,12 +309,12 @@ unsigned int alpha;
                        switch (dloop)
                        {
                                case 1:
-                                       printf("input <param error: %s>\n",aptr);
+                                       fprintf(stderr, "%s <param error: %s>\n",__plugin__,aptr);
                                        return 0;
                                        break;
                                
                                case 2:
-                                       printf("input <unknown command: %s>\n\n",aptr);
+                                       fprintf(stderr, "%s <unknown command: %s>\n\n",__plugin__ ,aptr);
                                        ShowUsage();
                                        return 0;
                                        break;
@@ -319,17 +322,17 @@ unsigned int alpha;
                }
                if(!format)
                {
-                       printf("input <missing format string>\n");
+                       fprintf(stderr, "%s <missing format string>\n", __plugin__);
                        return 0;
        }
                if(!title)
                {
-                       title=ttl;
+                       title=strdup(ttl);
                }
 
                if((buffer=calloc(BUFSIZE+1, sizeof(char)))==NULL)
                {
-                       printf(NOMEM);
+                       fprintf(stderr, NOMEM);
                        return 0;
                }
 
@@ -350,34 +353,37 @@ unsigned int alpha;
                if((ey=Read_Neutrino_Cfg(buffer))<0)
                        ey=620;
 
-               for(index=CMCST; index<=CMH; index++)
+               for(ix=CMCST; ix<=CMH; ix++)
                {
-                       sprintf(rstr,"menu_%s_alpha",menucoltxt[index]);
+                       sprintf(rstr,"menu_%s_alpha",menucoltxt[ix]);
                        if((tv=Read_Neutrino_Cfg(rstr))>=0)
-                               tr[index]=255-(float)tv*2.55;
+                               tr[ix]=255-(float)tv*2.55;
 
-                       sprintf(rstr,"menu_%s_blue",menucoltxt[index]);
+                       sprintf(rstr,"menu_%s_blue",menucoltxt[ix]);
                        if((tv=Read_Neutrino_Cfg(rstr))>=0)
-                               bl[index]=(float)tv*2.55;
+                               bl[ix]=(float)tv*2.55;
 
-                       sprintf(rstr,"menu_%s_green",menucoltxt[index]);
+                       sprintf(rstr,"menu_%s_green",menucoltxt[ix]);
                        if((tv=Read_Neutrino_Cfg(rstr))>=0)
-                               gn[index]=(float)tv*2.55;
+                               gn[ix]=(float)tv*2.55;
 
-                       sprintf(rstr,"menu_%s_red",menucoltxt[index]);
+                       sprintf(rstr,"menu_%s_red",menucoltxt[ix]);
                        if((tv=Read_Neutrino_Cfg(rstr))>=0)
-                               rd[index]=(float)tv*2.55;
+                               rd[ix]=(float)tv*2.55;
                }
+               for (ix = 0; ix <= RED; ix++)
+                       bgra[ix] = (tr[ix] << 24) | (rd[ix] << 16) | (gn[ix] << 8) | bl[ix];
+
 
                if(Read_Neutrino_Cfg("rounded_corners")>0)
-                       radius=10;
+                       radius=11;
                else
                        radius=0;
 
                fb = open(FB_DEVICE, O_RDWR);
                if(fb == -1)
                {
-                       perror("input <open framebuffer device>");
+                       perror(__plugin__ " <open framebuffer device>");
                        exit(1);
                }
 
@@ -385,7 +391,7 @@ unsigned int alpha;
 
                if((trstr=malloc(BUFSIZE))==NULL)
                {
-                       printf(NOMEM);
+                       fprintf(stderr, NOMEM);
                        return -1;
                }
 
@@ -393,17 +399,18 @@ unsigned int alpha;
 
                if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
                {
-                       perror("input <FBIOGET_FSCREENINFO>\n");
+                       perror(__plugin__ " <FBIOGET_FSCREENINFO>\n");
                        return -1;
                }
                if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1)
                {
-                       perror("input <FBIOGET_VSCREENINFO>\n");
+                       perror(__plugin__ " <FBIOGET_VSCREENINFO>\n");
                        return -1;
                }
-               if(!(lfb = (unsigned char*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)))
+
+               if(!(lfb = (uint32_t*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)))
                {
-                       perror("input <mapping of Framebuffer>\n");
+                       perror(__plugin__ " <mapping of Framebuffer>\n");
                        return -1;
                }
 
@@ -411,14 +418,14 @@ unsigned int alpha;
 
                if((error = FT_Init_FreeType(&library)))
                {
-                       printf("input <FT_Init_FreeType failed with Errorcode 0x%.2X>", error);
+                       fprintf(stderr, "%s <FT_Init_FreeType failed with Errorcode 0x%.2X>",__plugin__ , error);
                        munmap(lfb, fix_screeninfo.smem_len);
                        return -1;
                }
 
                if((error = FTC_Manager_New(library, 1, 2, 0, &MyFaceRequester, NULL, &manager)))
                {
-                       printf("input <FTC_Manager_New failed with Errorcode 0x%.2X>\n", error);
+                       fprintf(stderr, "%s <FTC_Manager_New failed with Errorcode 0x%.2X>\n",__plugin__ , error);
                        FT_Done_FreeType(library);
                        munmap(lfb, fix_screeninfo.smem_len);
                        return -1;
@@ -426,7 +433,7 @@ unsigned int alpha;
 
                if((error = FTC_SBitCache_New(manager, &cache)))
                {
-                       printf("input <FTC_SBitCache_New failed with Errorcode 0x%.2X>\n", error);
+                       fprintf(stderr, "%s <FTC_SBitCache_New failed with Errorcode 0x%.2X>\n",__plugin__ , error);
                        FTC_Manager_Done(manager);
                        FT_Done_FreeType(library);
                        munmap(lfb, fix_screeninfo.smem_len);
@@ -437,7 +444,7 @@ unsigned int alpha;
                {
                        if((error = FTC_Manager_LookupFace(manager, FONT2, &face)))
                        {
-                               printf("input <FTC_Manager_LookupFace failed with Errorcode 0x%.2X>\n", error);
+                               fprintf(stderr, "%s <FTC_Manager_LookupFace failed with Errorcode 0x%.2X>\n",__plugin__ , error);
                                FTC_Manager_Done(manager);
                                FT_Done_FreeType(library);
                                munmap(lfb, fix_screeninfo.smem_len);
@@ -451,51 +458,57 @@ unsigned int alpha;
 
                use_kerning = FT_HAS_KERNING(face);
 
-               desc.flags = FT_LOAD_MONOCHROME;
+               desc.flags = FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT;
 
        //init backbuffer
 
-               if(!(lbb = malloc(fix_screeninfo.line_length*var_screeninfo.yres)))
+               if(!(lbb = malloc(var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t))))
                {
-                       perror("input <allocating of Backbuffer>\n");
+                       perror(__plugin__ " <allocating of Backbuffer>\n");
                        FTC_Manager_Done(manager);
                        FT_Done_FreeType(library);
                        munmap(lfb, fix_screeninfo.smem_len);
                        return -1;
                }
-               if(!(obb = malloc(fix_screeninfo.line_length*var_screeninfo.yres)))
+               stride = fix_screeninfo.line_length/sizeof(uint32_t);
+
+               if(!(obb = malloc(var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t))))
                {
-                       perror("input <allocating of Backbuffer>\n");
+                       perror(__plugin__ " <allocating of Backbuffer>\n");
                        FTC_Manager_Done(manager);
                        FT_Done_FreeType(library);
                        free(lbb);
                        munmap(lfb, fix_screeninfo.smem_len);
                        return 0;
                }
+               memcpy(lbb, lfb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+               memcpy(obb, lfb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
 
-               memcpy(lbb, lfb, fix_screeninfo.line_length*var_screeninfo.yres);
-               memcpy(obb, lfb, fix_screeninfo.line_length*var_screeninfo.yres);
-
-               startx = sx /*+ (((ex-sx) - 620)/2)*/;
-               starty = sy /* + (((ey-sy) - 505)/2)*/;
+               startx = sx;
+               starty = sy;
 
        signal(SIGINT, quit_signal);
-       signal(SIGTERM, quit_signal);
        signal(SIGQUIT, quit_signal);
+       signal(SIGTERM, quit_signal);
        signal(SIGSEGV, quit_signal);
 
        //main loop
        put_instance(instance=get_instance()+1);
-       printf("%s\n",inputd(format, title, defstr, keys, frame, mask, bhelp, cols, tmo, debounce));
+       printf("%s", inputd(format, title, defstr, keys, frame, mask, bhelp, cols, tmo));
+       closedown();
+       return 1;
+}
+
+/******************************************************************************
+ * input close
+ ******************************************************************************/
+void closedown(void)
+{
        put_instance(get_instance()-1);
        
-       //cleanup
-
        // clear Display
-//     memset(lbb, 0, var_screeninfo.xres*var_screeninfo.yres);
-//     memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres);
-       
-       memcpy(lfb, obb, fix_screeninfo.line_length*var_screeninfo.yres);
+       memcpy(lfb, obb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+       munmap(lfb, fix_screeninfo.smem_len);
 
        free(buffer);
 
@@ -504,12 +517,7 @@ unsigned int alpha;
 
        free(lbb);
        free(obb);
-       munmap(lfb, fix_screeninfo.smem_len);
 
        close(fb);
        CloseRC();
-
-
-       return 1;
 }
-
diff --git a/input.h b/input.h
index d53dcc0969ecdd222c7dfba2dc6bcb0d84d51f8c..6c1a9ae1ad147ba663f4868bc52c5463f4b0a4a3 100644 (file)
--- a/input.h
+++ b/input.h
@@ -1,7 +1,8 @@
 #ifndef __INPUT_H__
-
 #define __INPUT_H__
 
+//#include <config.h>
+#define _FILE_OFFSET_BITS 64
 #include <errno.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/un.h>
+#include <stdint.h>
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
 #include FT_CACHE_H
 #include FT_CACHE_SMALL_BITMAPS_H
 
-//freetype stuff
+#define BUFSIZE 1024
 
 enum {LEFT, CENTER, RIGHT};
 enum {SMALL, MED, BIG};
@@ -106,20 +108,22 @@ enum {FILL, GRID};
 enum {CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH, WHITE, BLUE1, GTRANSP, CMS, ORANGE, GREEN, YELLOW, RED};
 #define TRANSP 0
 
-extern unsigned char *lfb, *lbb, *obb;
-extern unsigned char rd[], gn[], bl[], tr[];
+extern uint32_t *lfb, *lbb, *obb;
+extern uint32_t bgra[];
+extern int stride;
 
 struct fb_fix_screeninfo fix_screeninfo;
 struct fb_var_screeninfo var_screeninfo;
 
 int startx, starty, sx, ex, sy, ey;
-extern unsigned char sc[8], tc[8];
+
 extern char *butmsg[3];
 extern int buttons,selection;
+extern const char sc[8], tc[8];
 
+#ifndef FB_DEVICE
 #define FB_DEVICE      "/dev/fb/0"
-
-#define BUFSIZE 1024
+#endif
 
 #endif
 
index 24251b8d4d80de18b3ecf17f666e30bce2d79ac1..2109cab0cf5d523ed79ba66d9e124a92061bef9b 100644 (file)
--- a/inputd.c
+++ b/inputd.c
 #define NUM            '#'
 #define ANUM   '@'
 #define HEX            '^'
-#define ndelay 3
+#define ndelay 2
+#define REPEAT_TIMER 2
 
-char rstr[512],tstr[512], *format, *estr;
-int epos=-1,cpos=0,kpos=0,cnt,first=1,hex=0;
-char kcod[10][13]={"0 _.:,;$@()#","1-+*/", "2abcä", "3def", "4ghi", "5jkl", "6mnoö", "7pqrsß", "8tuvü", "9wxyz"};
-char hcod[10][13]={"0","1", "2abc", "3def", "4", "5", "6", "7", "8", "9"};
+char rstr[512]={0},tstr[512]={0}, *format=NULL, *estr=NULL;
+unsigned int kpos=0;
+int epos=-1,cpos=0,cnt,first=1,hex=0;
+const char kcod[10][13]={"0 _.:,;$@()#","1-+*/", "2abcä", "3def", "4ghi", "5jkl", "6mnoö", "7pqrsß", "8tuvü", "9wxyz"};
+const char hcod[10][13]={"0","1", "2abc", "3def", "4", "5", "6", "7", "8", "9"};
 unsigned rc;
 extern int radius;
-char INST_FILE[]="/tmp/rc.locked";
+extern int rcvalue;
+const char INST_FILE[]="/tmp/rc.locked";
 int instance=0;
 int rclocked=0;
+int rcvalue=0;
 
 int get_instance(void)
 {
@@ -67,7 +71,7 @@ FILE *fh;
 
 int IsAlpha(char ch)
 {
-       char uml[]="AÖÜaöü";
+       const char uml[]="ÄÖÜäöü";
        return (((ch>='A')&&(ch<='Z')) || ((ch>='a')&&(ch<='z')) || strchr(uml,ch));
 }
 
@@ -238,14 +242,15 @@ void SetCode(int code)
 
 int ReTransform_Msg(char *msg)
 {
-int found=0,i;
+unsigned i;
+int found=0;
 char *sptr=msg, *tptr=tstr;
 
        *tptr=0;
        while(*sptr)
        {
                found=0;
-               for(i=0; i<sizeof(tc) && !found; i++)
+               for(i=0; i<sizeof(tc)/sizeof(tc[0]) && !found; i++)
                {
                        rc=*sptr;
                        if(rc==tc[i])
@@ -263,14 +268,17 @@ char *sptr=msg, *tptr=tstr;
        return strlen(rstr);
 }
 
-char *inputd(char *form, char *title, char *defstr, int keys, int frame, int mask, int bhelp, int cols, int tmo, int debounce)
+char *inputd(char *form, char *title, char *defstr, int keys, int frame, int mask, int bhelp, int cols, int tmo)
 {
-int exs,eys,wxs,wxw,wys,wyw,i,j,xp,yp;
+int i,j;
+int exs,eys,wxs,wxw,wys,wyw,xp,yp;
 char trnd[2]={0,0},tch;
-int act_key=-1, last_key=-1, b_key=-1, run=1, ipos=0;
+int act_key=-1, last_key=-1, run=1, ipos=0, count=0;
 time_t t1,t2,tm1;
-char knum[12][2]={"1","2","3","4","5","6","7","8","9"," ","0"};
-char kalp[12][5]={"+-*/","abcä","def","ghi","jkl","mnoö","pqrs","tuvü","wxyz","","_,.;"};
+ // only for num block
+const char knum[12][2]={"1","2","3","4","5","6","7","8","9"," ","0"};
+const char kalp[12][5]={"+-*/","abcä","def","ghi","jkl","mnoö","pqrs","tuvü","wxyz","","_,.;"};
+
 
        epos=-1;
        cpos=0;
@@ -285,10 +293,10 @@ char kalp[12][5]={"+-*/","abc
        {
                cols=1;
        }
+
        format=form;
        estr=strdup(form);
        cnt=strlen(form);
-       
        i=GetStringLen(title, BIG)+10;
        j=((cnt>cols)?cols:cnt)*exsz;
        if(j>i)
@@ -319,7 +327,7 @@ char kalp[12][5]={"+-*/","abc
 
        *estr=0;
        *rstr=0;
-               
+
        j=0;
        for(i=0; i<strlen(format); i++)
        {
@@ -346,10 +354,11 @@ char kalp[12][5]={"+-*/","abc
        }
        estr[i]=0;
 
-       RenderBox(wxs-2, wys-hsz-2, wxs+wxw+2, wys+wyw+2, radius, CMH);
+       // title
+       RenderBox(wxs-2, wys-hsz-2, wxs+wxw+2, wys+wyw+2, radius , CMH);
        RenderBox(wxs, wys-hsz, wxs+wxw, wys+wyw, radius, CMC);
        RenderBox(wxs, wys-hsz, wxs+wxw, wys, radius, CMH);
-       RenderString(title, wxs, wys-15, wxw, CENTER, BIG, CMHT);
+       RenderString(title, wxs, wys-7, wxw, CENTER, BIG, CMHT);
        if(keys)
        {
                int bxs=wxs+(wxw-(3*bxsz))/2;
@@ -357,21 +366,21 @@ char kalp[12][5]={"+-*/","abc
                
                for(i=0; i<11; i++)
                {
-                       if(i!=9)
+                       if(i!=9) //num fields
                        {
                                RenderBox(bxs+(i%3)*bxsz, bys+(i/3)*bysz, bxs+((i%3)+1)*bxsz, bys+((i/3)+1)*bysz, radius, CMS);
                                RenderBox(bxs+(i%3)*bxsz+2, bys+(i/3)*bysz+2, bxs+((i%3)+1)*bxsz-2, bys+((i/3)+1)*bysz-2, radius, CMC);
-                               RenderString(knum[i], bxs+(i%3)*bxsz, bys+(i/3)*bysz+bysz/2, bxsz, CENTER, MED, CMCIT);
-                               RenderString(kalp[i], bxs+(i%3)*bxsz, bys+(i/3)*bysz+bysz-8, bxsz, CENTER, SMALL, CMCIT);
+                               RenderString(knum[i], bxs+(i%3)*bxsz, bys+(i/3)*bysz+bysz/2+8, bxsz, CENTER, MED, CMCIT);
+                               RenderString(kalp[i], bxs+(i%3)*bxsz, bys+(i/3)*bysz+bysz-2, bxsz, CENTER, SMALL, CMCIT);
                                
                        }
                }       
-               RenderCircle(bxs,wys+wyw-ybrd-8,RED);
-               RenderString("Groß/Klein",bxs+15,wys+wyw-ybrd+5,3*bxsz,LEFT,SMALL,CMCIT);
-               RenderCircle(bxs+3*bxsz-GetStringLen("löschen",SMALL)-15,wys+wyw-ybrd-8,YELLOW);
-               RenderString("löschen",bxs,wys+wyw-ybrd+5,3*bxsz,RIGHT,SMALL,CMCIT);
+               RenderCircle(bxs,wys+wyw-ybrd-11,RED);
+               RenderString("Groß/Klein",bxs+20,wys+wyw-ybrd+10,3*bxsz,LEFT,SMALL,CMCIT);
+               RenderCircle(bxs+3*bxsz-GetStringLen("löschen",SMALL)-15,wys+wyw-ybrd-11,YELLOW);
+               RenderString("löschen",bxs+5,wys+wyw-ybrd+10,3*bxsz,RIGHT,SMALL,CMCIT);
        }
-       
+
        while(run)
        {
                for(i=0; i<cnt; i++)
@@ -380,46 +389,44 @@ char kalp[12][5]={"+-*/","abc
                        yp=i/cols;
                        if(frame && IsInput(format[i]))
                        {
-                               RenderBox(exs+xp*exsz, eys+5+yp*eysz, exs+(xp+1)*exsz, eys+(yp+1)*eysz, radius, CMS);
+                               RenderBox(exs+xp*exsz, eys+5+yp*eysz, exs+(xp+1)*exsz, eys+(yp+1)*eysz, 0/*radius*/, CMS);
                        }
-                       RenderBox(exs+xp*exsz+1, eys+5+yp*eysz+1, exs+(xp+1)*exsz-1, eys+(yp+1)*eysz-1, radius, (epos==i)?CMCS:CMC);
+                       RenderBox(exs+xp*exsz+1, eys+5+yp*eysz+1, exs+(xp+1)*exsz-1, eys+(yp+1)*eysz-1, 0/*radius*/, (epos==i)?CMCS:CMC);
+
                        *trnd=(mask && format[i]==NUM && IsNum(estr[i]))?'*':estr[i];
-                       RenderString(trnd, exs+xp*exsz+2, eys+yp*eysz+tys, exsz-2, CENTER, MED, (epos==i)?CMCST:(IsInput(format[i]))?CMCT:CMCIT);
+                       RenderString(trnd, exs+xp*exsz+2, eys+yp*eysz+tys+7, exsz-2, CENTER, MED, (epos==i)?CMCST:(IsInput(format[i]))?CMCT:CMCIT);
                }
-               memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+               memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
                
-//             sleep(1);
-
                time(&t1);
                i=-1;
                while(i==-1)
                {
-                       i=GetRCCode();
-                       if(i!=-1)
+                       i=GetRCCode(1000);
+                       if (i != KEY_UP && i != KEY_DOWN && i != KEY_LEFT && i != KEY_RIGHT)
                        {
-                               tmo=0;
-                               if(i==b_key)
+                               if (rcvalue == 2 && count < 3)
                                {
-                                       usleep(debounce*1000);
-                                       while((i=GetRCCode())!=-1);
+                                       count++;
+                                       i = -1;
                                }
-                               b_key=i;
                        }
                        time(&t2);
                        if(tmo)
                        {
-                               if((t2-tm1)>=tmo)
+                               //printf("t2-t1 = %f %i\n", difftime(t2, t1), tmo);
+                               if((t2-t1)>=tmo)
                                {
                                        i=KEY_EXIT;
                                }
                        }
-                       if((((format[epos]!=NUM) && (format[epos]!=HEX)) || ((format[epos]==HEX)&&(strlen(hcod[cpos])>1))) && ((t2-t1)>ndelay) && last_key>=0)
+                       if((((format[epos]!=NUM) && (format[epos]!=HEX)) || ((format[epos]==HEX)&&(strlen(hcod[cpos])>1))) && ((t2-t1)>=ndelay) && last_key>=0)
                        {
                                act_key=i=-2;
-                               b_key=-3;
                                NextPos();
                        }
                }
+               count=0;
                act_key=i;
                
                switch(act_key)
@@ -507,21 +514,8 @@ char kalp[12][5]={"+-*/","abc
                        break;
                        
                        case KEY_MUTE:
-                               memset(lfb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres);
-                               usleep(500000L);
-                               while(GetRCCode()!=-1)
-                               {
-                                       usleep(100000L);
-                               }
-                               while(GetRCCode()!=KEY_MUTE)
-                               {
-                                       usleep(500000L);
-                               }
-                               while((act_key=GetRCCode())!=-1)
-                               {
-                                       usleep(100000L);
-                               }
-//                             knew=1;
+                               memset(lfb, TRANSP, var_screeninfo.xres*var_screeninfo.yres*sizeof(uint32_t));
+                               while(GetRCCode(300)!=KEY_MUTE);
                        break;
 
                        case KEY_UP:
@@ -622,8 +616,8 @@ char kalp[12][5]={"+-*/","abc
                }
                rstr[j]=0;
                free(estr);
-       }       
+       }
        ReTransform_Msg(rstr);
-       return tstr;
+       return rstr;
 }
 
index 99aac1997f261606e03c3c4beb1ae9f7ed9fb844..5e7561a4f7f3f01bf32c45f8830b9e1592c1fe8a 100644 (file)
--- a/inputd.h
+++ b/inputd.h
@@ -1,11 +1,10 @@
 #ifndef __INPUTD_H__
-
 #define __INPUTD_H__
 
 extern int instance;
 int get_instance(void);
 void put_instance(int pval);
-char *inputd(char *format, char *title, char *defstr, int keys, int frame, int mask, int bhelp, int cols, int tmo, int debounce);
+char *inputd(char *format, char *title, char *defstr, int keys, int frame, int mask, int bhelp, int cols, int tmo);
 
 #endif
 
diff --git a/io.c b/io.c
index b4cdaa29dc55e08be985f158c8bc6144e4b2fd36..6614899cec9fee9016f9baa89142551c5efae6f1 100644 (file)
--- a/io.c
+++ b/io.c
@@ -3,7 +3,6 @@
 #include <errno.h>
 #include <locale.h>
 #include <fcntl.h>
-#include <stdio.h>
 #include <ctype.h>
 #include <time.h>
 #include <stdlib.h>
 #include <sys/dir.h>
 #include <sys/stat.h>
 #include <linux/input.h>
+#include <poll.h>
+#include <stdint.h>
 
+#include "current.h"
 #include "io.h"
 
-#define RC_DEVICE      "/dev/input/nevis_ir"
-
 extern int instance;
+extern int get_instance(void);
+extern int rcvalue;
 struct input_event ev;
 static unsigned short rccode=-1;
 static int rc;
 
+
 int InitRC(void)
 {
-       rc = open(RC_DEVICE, O_RDONLY);
+       rc = open(RC_DEVICE, O_RDONLY | O_CLOEXEC);
        if(rc == -1)
        {
-               perror("msgbox <open remote control>");
+               perror(__plugin__ " <open remote control>");
                exit(1);
        }
        fcntl(rc, F_SETFL, O_NONBLOCK | O_SYNC);
@@ -51,6 +54,7 @@ int RCKeyPressed(void)
        {
                if(ev.value)
                {
+                       rcvalue=ev.value;
                        rccode=ev.code;
                        return 1;
                }
@@ -59,19 +63,65 @@ int RCKeyPressed(void)
        return 0;
 }
 
+void ClearRC(void)
+{
+       struct pollfd pfd;
+       pfd.fd = rc;
+       pfd.events = POLLIN;
+       pfd.revents = 0;
+
+       do
+               poll(&pfd, 1, 300);
+       while(read(rc, &ev, sizeof(ev)) == sizeof(ev));
+}
 
-int GetRCCode(void)
+int GetRCCode(int timeout_in_ms)
 {
-       int rv;
-       
-       if(!RCKeyPressed() || (get_instance()>instance))
+       int rv = -1;
+
+       if (get_instance()>instance)
        {
-               return -1;
+               return rv;
        }
-       rv=rccode;
-       while(RCKeyPressed());
-       
-       return rv;
-}
 
+       if (timeout_in_ms) {
+               struct pollfd pfd;
+               struct timeval tv;
+               uint64_t ms_now, ms_final;
+
+               pfd.fd = rc;
+               pfd.events = POLLIN;
+               pfd.revents = 0;
+
+               gettimeofday( &tv, NULL );
+               ms_now = tv.tv_usec/1000 + tv.tv_sec * 1000;
+               if (timeout_in_ms > 0)
+                       ms_final = ms_now + timeout_in_ms;
+               else
+                       ms_final = UINT64_MAX;
+               while (ms_final > ms_now) {
+                       switch(poll(&pfd, 1, timeout_in_ms)) {
+                               case -1:
+                                       perror("GetRCCode: poll() failed");
+                               case 0:
+                                       return -1;
+                               default:
+                                       ;
+                       }
+                       if(RCKeyPressed()) {
+                               rv = rccode;
+                               while(RCKeyPressed());
+                               return rv;
+                       }
 
+                       gettimeofday( &tv, NULL );
+                       ms_now = tv.tv_usec/1000 + tv.tv_sec * 1000;
+                       if (timeout_in_ms > 0)
+                               timeout_in_ms = (int)(ms_final - ms_now);
+               }
+       } else if(RCKeyPressed()) {
+               rv = rccode;
+               while(RCKeyPressed());
+       }
+       return rv;
+}
diff --git a/io.h b/io.h
index d7914d4f4e97f11216121e42e03dc12704738ca8..2cb93f8d93d55ad582d79db6d098774ccc3ab2f4 100644 (file)
--- a/io.h
+++ b/io.h
@@ -1,5 +1,4 @@
 #ifndef __IO_H__
-
 #define __IO_H__
 
 #define RC_DEVICE      "/dev/input/nevis_ir"
@@ -7,5 +6,7 @@
 int InitRC(void);
 int CloseRC(void);
 int RCKeyPressed(void);
+int GetRCCode(int);
+void ClearRC(void);
 
 #endif
diff --git a/readme.txt b/readme.txt
new file mode 100644 (file)
index 0000000..878ca9c
--- /dev/null
@@ -0,0 +1,159 @@
+Was ist input?
+----------------------------------
+Input ist ein Editor, welcher aus Scripten heraus aufgerufen werden kann, und das Ergeb-
+nis der Eingaben durch den Nutzer Ã¼ber die Kommandozeile an das Script zurückgibt.
+Dabei ist beim Aufruf sowohl die Festlegung des Aussehens der Eingabemaske als auch des
+Typs der zu editierenden Daten möglich. Die zu editierenden Felder können bei Bedarf
+auch mit Defaultwerten vorbelegt werden.
+
+Installation
+----------------------------------
+Es wird nur die Datei "input" benötigt. Abhängig vom Image-Typ ist diese entweder in
+/bin/ (bei JFFS-Only) oder /var/bin/ (bei CRAMFS und SQUASHFS) zu kopieren und mit den
+Rechten 755 zu versehen. Nun kann sie aus eigenen Scripten heraus verwendet werden. Eine
+spezielle Busybox ist für die Verwendung von "input" nicht erforderlich.
+
+
+Anwendung
+----------------------------------
+Der Aufruf der Eingabemaske erfolgt Ã¼ber die Ausführung von "input" mit entsprechenden Kom-
+mandozeilenparametern. Wichtig dabei ist, daß das aufrufende Script Ã¼ber die Plugin-Verwal-
+tung von Neutrino gestartet wurde, und in der .cfg des Scriptes die Einträge "needfb=1" und
+"needrc=1" stehen. Anderenfalls würde Neutrino parallel zum Editor auf die Tastendrücke der
+Fernbedienung reagieren. Beim Aufruf aus dem FlexMenü ist das Script mit den Zeichen "&" oder
+"§" vor dem Anzeigenamen aufzurufen. Im Folgenden werden die möglichen Parameter beschrieben.
+Die Aufrufzeile sieht so aus:
+
+input l='Layout' [t='Title'] [d='Default'] [k=Keys] [f=Frames] [c=Columns] [o=Timeout] [m=Mask] [h=BreakOnHelp]
+
+Layout:
+Der Layoutstring, welcher festlegt, welche Felder an welcher Stelle und in welchem Format
+editierbar sein sollen. Eingabefelder werden durch '#' für reine Zifferneingaben und '@'
+für alphanumerische Eingaben definiert. Sollen nur Hexadezimalzeichen eingebbar sein, ist
+als Definitionszeichen das Zeichen '^' zu verwenden. Alle anderen Zeichen werden auf dem
+Bildschirm zwar dargestellt, sind aber nicht editierbar.
+In einer Zeile können maximal 25 Zeichen dargestellt werden. Ist der Layoutstring länger als
+der Parameter "c" oder länger als 25 Zeichen, werden die nächsten Zeichen auf einer weiteren
+Zeile dargestellt. Damit ist die Darstellunge mehrzeiliger Eingabemasken möglich.
+
+Title:
+Die Ãœberschrift des Editorfensters. Wird dieser Parameter nicht Ã¼bergeben, wird standardmäßig
+der Text "Eingabe" verwendet.
+
+Default:
+Die Editorfelder können vorbelegt werden. Dabei werden die Zeichen des Defaultstrings der
+Reihe nach den Eingabefeldern zugewiesen. Der Defaulstring enthält also keine Füllzeichen
+wie der Formatstring sondern nur die reinen Daten.
+
+Keys:
+Dieser Parameter kann 0 oder 1 sein. Bei 1 wird im Editorfenster die Tastenbelegung für die
+Eingabe von alphanumerischen Zeichen zusätzlich mit angezeigt. Mit 0 wird diese Anzeige un-
+terdrückt. Defaultwert ist 0.
+
+Frames:
+Dieser Parameter kann 0 oder 1 sein. Bei 1 werden Rahmen um die Eingabefelder gezeichnet,
+bei 0 werden diese Felder ohne Rahmen dargestellt. Defaultwert ist 1.
+
+Columns:
+Mit diesem Parameter wird die Anzahl der Zeichen pro Zeile festgelegt. Somit können auch
+schmalere Fenster mehrzeilig dargestellt werden. Zulässig sind Werte von 1 bis 25.
+Defaultwert ist 25.
+
+Timeout:
+Gerade für PIN-Abfragen kann dieser Parameter verwendet werden. Er legt die Zeit fest, nach
+welcher der Eingabedialog abgebrochen werden soll, wenn keine Taste gedrückt wurde. Damit
+können Eingaben automatisch abgebrochen werden, wenn der Nutzer nicht reagiert. Dieser Timeout
+wird mit dem ersten Drücken einer Taste unterbrochen, da dann ja ein Nutzer da ist. Das heißt
+nach dem ersten Drücken einer Taste wird die Eingabe nicht mehr angebrochen, wenn innerhalb der
+Timeout-Zeit keine weitere Taste gedrückt wurde. Ein Wert von 0 für diesen Parameter deaktiviert
+den Timeout gänzlich. Defaultwert ist 0.
+
+Mask:
+Dieser Parameter kann 0 oder 1 sein. Bei 1 werden in numerischen Eingabefeldern nicht die
+eingegebenen Zahlen angezeigt, sondern das Zeichen "*". Das kann für die verdeckte Eingabe
+von PIN-Nummern verwendet werden. Defaultwert ist 0.
+
+BreakOnHelp
+Dieser Parameter kann 0 oder 1 sein. Bei 1 wird in Anlehnung an des LCD-Menü bei Drücken der
+"?"-Taste die Eingabe abgebrochen und statt des Ergebnisstrings das Zeichen "?" zurückgeliefert.
+Das kann z.B. bei der PIN-Eingabe vom Script als Aufforderung ausgewertet werden, daß der User
+die PIN Ã¤ndern möchte. Defaultwert ist 0.
+
+Rückgabewert:
+input gibt die editierten Felder wieder ohne Füllzeichen Ã¼ber die Kommandozeile zurück. Dieser
+Datenstring kann dann vom Script ausgewertet werden. Dabei ist zu beachten, daß die Kommandozeile
+mehrfache Leerzeichen zusammenfasst. Also würde ein Text "X X" als "X X" beim Script ankom-
+men. Das ist leider kommandozeilenbedingt und nicht zu verhindern.
+
+Bedienung
+----------------------------------
+Mittels der Links-/Rechts-Tasten kann zwischen den einzelnen Eingabefeldern gewechselt werden.
+Bei mehrzeiligen Eingabemasken kann mittels der Hoch-/Runter-Tasten auch zwischen den Zeilen
+gewechselt werden.
+Bei numerischen Eingabefeldern wird die Ziffer bei Druck auf eine Zifferntaste Ã¼bernommen und
+sofort zum nächsten Eingabefeld gewechselt. Bei alphanumerischen Feldern kann wie beim Handy
+durch mehrfachen Druck der selben Taste durch die möglichen Buchstaben, Ziffern und Sonderzei-
+chen geblättert werden. Der Druck auf eine andere als die bisher gedrückte Taste wird sofort
+zum nächsten Feld gewechselt und der neue Wert dort Ã¼bernommen. Wird in einem alphanumerischen
+Feld nach Drücken einer Taste für 3 Sekunden keine weitere Taste betätigt, geht der Editor au-
+tomatisch zum nächsten Eingabefeld. Damit ist die Eingabe zweier gleicher Buchstaben hinterein-
+ander möglich, ohne erst die Cursortasten benutzen zu müssen.
+Die rote Taste schaltet in alphanumerischen Eingabefeldern zwischen Groß- und Kleinschreibung
+um. Die gelbe Taste löscht alle Eingabefelder.
+Mit der Volume-Plus-Taste wird an der aktuellen Kursorposition ein Zeichen eingefügt. Der Rest
+des Eingabefeldes rückt nach rechts. Das letzte Zeichen des Feldes verschwindet.
+Mit der Volume-Minus-Taste wird das Zeichen an der aktuellen Kursorposition gelöscht. Der Rest
+des Eingabefeldes rückt nach links.
+Um das Plugin kurz auszublenden und das Fernsehbild zu sehen, kann die Mute-Taste gedrückt werden.
+Das Plugin blendet dann alle grafischen Anzeigen aus und wartet so lange, bis wieder die Mute-
+Taste gedrückt wird um anschließend ganz normal fortzusetzen. In der Zwischenzeit werden alle
+anderen Tastendrücke ignoriert.
+Mit "OK" werden die Ã„nderungen Ã¼bernommen und der Editor geschlossen. Die "HOME"-Taste bricht
+den Vorgang ab, beendet den Editor und liefert einen Leerstring an das Script zurück.
+Wenn mit dem Parameter "h=1" erlaubt, wird die Bearbeitung bei Drücken der "?"-Taste abgebrochen
+und statt des Ergebnisstrings ein "?" zurückgegeben.
+
+Beispiele
+----------------------------------
+Das Bild "small.png" ist ein Screenshot des Aufrufes:
+
+input l="####" t="PIN"
+
+Der Editor würde bei Eingabe von "1234" auch "1234" Ã¼ber die Kommandozeile zurückliefern.
+Um diesen Wert einer Variablen zuzuordnen ( in diesem Fall "$pin", sollte der Aufruf so aussehen:
+
+pin=`input l="####" t="PIN"`
+
+Nun kann $pin wie gewohnt ausgewertet werden. Aber darauf achten: Bricht der User mit der "HOME"-
+Taste ab, ist $pin leer.
+
+Das Bild "big.png" ergibt sich mit folgendem Aufruf:
+
+input l='Date: ##.##.####Time: ##:##:##' t='Datum und Uhrzeit ~andern' d='27022005164523' c=16 k=1
+
+Der Rückgabewert bei Drücken der "OK"-Taste würde so aussehen: "27022005164523"
+
+
+Sonderzeichen Ã¼ber die Kommandozeile
+------------------------------------
+Da Linux keine Ãœbergabe von Sonder- und Steuerzeichen Ã¼ber die Kommandozeile unterstützt, können
+die wichtigsten Sonderzeichen Ã¼ber die Nutzung des Formatsteuerzeichens sowohl aus Scripten als
+auch von der Kommandozeile dargestellt werden. Aktuell werden folgende Sonder- und Steuerzeichen
+unterstützt:
+
+~a Ã¤
+~o Ã¶
+~u Ã¼
+~A Ã„
+~O Ã–
+~U Ãœ
+~z ÃŸ
+~d Â° (degree)
+
+Diese Steuerzeichen werden sowohl beim Titel, dem Format als auch dem Defaultstring ausgewertet.
+Auch der Rückgabestring enthält die Umlaute als Steuerzeichen. Damit ist im Script ein leichteres
+Ersetzen der Umlaute bei der Auswertung möglich.
+
+
+Wird "input" mit falschen oder völlig ohne Parameter aufgerufen, wird im Log eine Liste der
+unterstützten Parameter ausgegeben.
diff --git a/text.c b/text.c
index 8c9aaf1f74eaf955eb77579ae7ba53e3b87f72d4..1919952a92136c0a0bb5e1a78797eb4bcba6e632 100644 (file)
--- a/text.c
+++ b/text.c
@@ -11,13 +11,13 @@ int TABULATOR=300;
  * MyFaceRequester
  ******************************************************************************/
 
-FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface)
+FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library lib, FT_Pointer request_data __attribute__((unused)), FT_Face *aface)
 {
        FT_Error result;
 
-       result = FT_New_Face(library, face_id, 0, aface);
+       result = FT_New_Face(lib, face_id, 0, aface);
 
-       if(result) printf("msgbox <Font \"%s\" failed>\n", (char*)face_id);
+       if(result) fprintf(stderr, "msgbox <Font \"%s\" failed>\n", (char*)face_id);
 
        return result;
 }
@@ -26,110 +26,185 @@ FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer requ
  * RenderChar
  ******************************************************************************/
 
-int RenderChar(FT_ULong currentchar, int sx, int sy, int ex, int color)
+struct colors_struct
 {
-//     unsigned char pix[4]={oldcmap.red[col],oldcmap.green[col],oldcmap.blue[col],oldcmap.transp[col]};
-//     unsigned char pix[4]={0x80,0x80,0x80,0x80};
-       unsigned char pix[4]={bl[color],gn[color],rd[color],tr[color]};
-       int row, pitch, bit, x = 0, y = 0;
-       FT_UInt glyphindex;
-       FT_Vector kerning;
-       FT_Error error;
+       uint32_t fgcolor, bgcolor;
+       uint32_t colors[256];
+};
 
-       currentchar=currentchar & 0xFF;
+#define COLORS_LRU_SIZE 16
+static struct colors_struct *colors_lru_array[COLORS_LRU_SIZE] = { NULL };
 
-       //load char
-
-               if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar)))
-               {
-//                     printf("msgbox <FT_Get_Char_Index for Char \"%c\" failed\n", (int)currentchar);
-                       return 0;
+static uint32_t *lookup_colors(uint32_t fgcolor, uint32_t bgcolor)
+{
+       struct colors_struct *cs;
+       int i = 0, j;
+       for (i = 0; i < COLORS_LRU_SIZE; i++)
+               if (colors_lru_array[i] && colors_lru_array[i]->fgcolor == fgcolor && colors_lru_array[i]->bgcolor == bgcolor) {
+                       cs = colors_lru_array[i];
+                       for (j = i; j > 0; j--)
+                               colors_lru_array[j] = colors_lru_array[j - 1];
+                       colors_lru_array[0] = cs;
+                       return cs->colors;
                }
+       i--;
+       cs = colors_lru_array[i];
+       if (!cs)
+               cs = (struct colors_struct *) calloc(1, sizeof(struct colors_struct));
+       for (j = i; j > 0; j--)
+               colors_lru_array[j] = colors_lru_array[j - 1];
+       cs->fgcolor = fgcolor;
+       cs->bgcolor = bgcolor;
+
+       int ro = var_screeninfo.red.offset;
+       int go = var_screeninfo.green.offset;
+       int bo = var_screeninfo.blue.offset;
+       int to = var_screeninfo.transp.offset;
+       int rm = (1 << var_screeninfo.red.length) - 1;
+       int gm = (1 << var_screeninfo.green.length) - 1;
+       int bm = (1 << var_screeninfo.blue.length) - 1;
+       int tm = (1 << var_screeninfo.transp.length) - 1;
+       int fgr = ((int)fgcolor >> ro) & rm;
+       int fgg = ((int)fgcolor >> go) & gm;
+       int fgb = ((int)fgcolor >> bo) & bm;
+       int fgt = ((int)fgcolor >> to) & tm;
+       int deltar = (((int)bgcolor >> ro) & rm) - fgr;
+       int deltag = (((int)bgcolor >> go) & gm) - fgg;
+       int deltab = (((int)bgcolor >> bo) & bm) - fgb;
+       int deltat = (((int)bgcolor >> to) & tm) - fgt;
+       for (i = 0; i < 256; i++)
+               cs->colors[255 - i] =
+                       (((fgr + deltar * i / 255) & rm) << ro) |
+                       (((fgg + deltag * i / 255) & gm) << go) |
+                       (((fgb + deltab * i / 255) & bm) << bo) |
+                       (((fgt + deltat * i / 255) & tm) << to);
+
+       colors_lru_array[0] = cs;
+       return cs->colors;
+}
 
+int RenderChar(FT_ULong currentchar, int _sx, int _sy, int _ex, int color)
+{
+       int row, pitch;
+       FT_UInt glyphindex;
+       FT_Vector kerning;
+       FT_Error err;
 
-               if((error = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, NULL)))
+       if (currentchar == '\r') // display \r in windows edited files
+       {
+               if(color != -1)
                {
-//                     printf("msgbox <FTC_SBitCache_Lookup for Char \"%c\" failed with Errorcode 0x%.2X>\n", (int)currentchar, error);
-                       return 0;
+                       if (_sx + 10 < _ex)
+                               RenderBox(_sx, _sy - 10, _sx + 10, _sy, GRID, color);
+                       else
+                               return -1;
                }
+               return 10;
+       }
 
-// no kerning used
-/*
-               if(use_kerning)
-               {
-                       FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning);
+       if (currentchar == '\t')
+       {
+               /* simulate horizontal TAB */
+               return 15;
+       }
 
-                       prev_glyphindex = glyphindex;
-                       kerning.x >>= 6;
-               }
-               else
-*/
-                       kerning.x = 0;
+       //load char
 
-       //render char
+       if(!(glyphindex = FT_Get_Char_Index(face, currentchar)))
+       {
+               fprintf(stderr, "input <FT_Get_Char_Index for Char \"%c\" failed\n", (int)currentchar);
+               return 0;
+       }
 
-               if(color != -1) /* don't render char, return charwidth only */
-               {
-                       if(sx + sbit->xadvance >= ex) return -1; /* limit to maxwidth */
+       if((err = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, NULL)))
+       {
+               fprintf(stderr, "input <FTC_SBitCache_Lookup for Char \"%c\" failed with Errorcode 0x%.2X>\n", (int)currentchar, error);
+               return 0;
+       }
 
-                       for(row = 0; row < sbit->height; row++)
-                       {
-                               for(pitch = 0; pitch < sbit->pitch; pitch++)
-                               {
-                                       for(bit = 7; bit >= 0; bit--)
-                                       {
-                                               if(pitch*8 + 7-bit >= sbit->width) break; /* render needed bits only */
+       int _d = 0;
+       if (1)
+       {
+               FT_UInt _i = FT_Get_Char_Index(face, 'g');
+               FTC_SBit _g;
+               FTC_SBitCache_Lookup(cache, &desc, _i, &_g, NULL);
+               _d = _g->height - _g->top;
+               _d += 1;
+       }
 
-                                               if((sbit->buffer[row * sbit->pitch + pitch]) & 1<<bit) memcpy(lbb + (startx + sx + sbit->left + kerning.x + x)*4 + fix_screeninfo.line_length*(starty + sy - sbit->top + y),pix,4);
+       if(use_kerning)
+       {
+               FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning);
 
-                                               x++;
-                                       }
-                               }
+               prev_glyphindex = glyphindex;
+               kerning.x >>= 6;
+       } else
+               kerning.x = 0;
 
-                               x = 0;
-                               y++;
-                       }
+       //render char
 
+       if(color != -1) /* don't render char, return charwidth only */
+       {
+               if (_sx + sbit->xadvance >= _ex)
+                       return -1; /* limit to maxwidth */
+               uint32_t bgcolor = *(lbb + (sy + _sy - sbit->top) * stride + (sx + _sx));
+               uint32_t fgcolor = bgra[color];
+               uint32_t *colors = lookup_colors(fgcolor, bgcolor);
+               uint32_t *p = lbb + (sx + _sx + sbit->left + kerning.x) + stride * (sy + _sy - sbit->top - _d);
+               uint32_t *r = p + (_ex - _sx);  /* end of usable box */
+               for(row = 0; row < sbit->height; row++)
+               {
+                       uint32_t *q = p;
+                       uint8_t *s = sbit->buffer + row * sbit->pitch;
+                       for(pitch = 0; pitch < sbit->width; pitch++)
+                       {
+                               if (*s)
+                                       *q = colors[*s];
+                               q++, s++;
+                               if (q > r)      /* we are past _ex */
+                                       break;
+                       }
+                       p += stride;
+                       r += stride;
                }
+       }
 
        //return charwidth
 
-               return sbit->xadvance + kerning.x;
+       return sbit->xadvance + kerning.x;
 }
 
 /******************************************************************************
  * GetStringLen
  ******************************************************************************/
 
-int GetStringLen(unsigned char *string, int size)
+int GetStringLen(char *string, size_t size)
 {
-int i, found;
-int stringlen = 0;
+       int stringlen = 0;
 
        //reset kerning
 
-               prev_glyphindex = 0;
+       prev_glyphindex = 0;
 
        //calc len
 
-               switch (size)
-               {
-                       case SMALL: desc.width = desc.height = FSIZE_SMALL; break;
-                       case MED:   desc.width = desc.height = FSIZE_MED; break;
-                       case BIG:   desc.width = desc.height = FSIZE_BIG; break;
-                       default:    desc.width = desc.height = size; break;
-               }
-               
-               while(*string != '\0')
-               {
-                       stringlen += RenderChar(*string, -1, -1, -1, -1);
-                       string++;
-               }
+       switch (size)
+       {
+               case SMALL: desc.width = desc.height = FSIZE_SMALL; break;
+               case MED:   desc.width = desc.height = FSIZE_MED; break;
+               case BIG:   desc.width = desc.height = FSIZE_BIG; break;
+               default:    desc.width = desc.height = size; break;
+       }
+
+       while(*string != '\0')
+       {
+               stringlen += RenderChar(*string, -1, -1, -1, -1);
+               string++;
+       }
 
        return stringlen;
 }
 
-
 void CatchTabs(char *text)
 {
        int i;
@@ -138,7 +213,7 @@ void CatchTabs(char *text)
        while((tptr=strstr(tptr,"~T"))!=NULL)
        {
                *(++tptr)='t';
-               for(i=0; i<3; i++)
+               for(i=0; i<4; i++)
                {
                        if(*(++tptr))
                        {
@@ -152,140 +227,140 @@ void CatchTabs(char *text)
  * RenderString
  ******************************************************************************/
 
-int RenderString(char *string, int sx, int sy, int maxwidth, int layout, int size, int color)
+int RenderString(const char *string, int _sx, int _sy, int maxwidth, int layout, int size, int color)
 {
-       int stringlen = 0, ex = 0, charwidth = 0, i = 0, found = 0;
-       char rstr[BUFSIZE]={0}, *rptr=rstr, rc=' ';
-       int varcolor=color;
+unsigned i = 0;
+int stringlen = 0, _ex = 0, charwidth = 0, found = 0;
+char rstr[BUFSIZE]={0}, *rptr=rstr, rc=' ';
+int varcolor=color;
 
        //set size
        
-               strcpy(rstr,string);
+       strcpy(rstr,string);
 
-               switch (size)
-               {
-                       case SMALL: desc.width = desc.height = FSIZE_SMALL; break;
-                       case MED:   desc.width = desc.height = FSIZE_MED; break;
-                       case BIG:   desc.width = desc.height = FSIZE_BIG; break;
-                       default:    desc.width = desc.height = size; break;
-               }
-               TABULATOR=3*size;
+       switch (size)
+       {
+               case SMALL: desc.width = desc.height = FSIZE_SMALL; break;
+               case MED:   desc.width = desc.height = FSIZE_MED; break;
+               case BIG:   desc.width = desc.height = FSIZE_BIG; break;
+               default:    desc.width = desc.height = size; break;
+       }
+       TABULATOR=3*size;
        //set alignment
 
-               stringlen = GetStringLen(rstr, size);
+       stringlen = GetStringLen(rstr, size);
 
-               if(layout != LEFT)
+       if(layout != LEFT)
+       {
+               switch(layout)
                {
-                       switch(layout)
-                       {
-                               case CENTER:    if(stringlen < maxwidth) sx += (maxwidth - stringlen)/2;
-                                               break;
+                       case CENTER: if(stringlen < maxwidth) _sx += (maxwidth - stringlen)/2;
+                               break;
 
-                               case RIGHT:     if(stringlen < maxwidth) sx += maxwidth - stringlen;
-                       }
+                       case RIGHT:     if(stringlen < maxwidth) _sx += maxwidth - stringlen;
                }
+       }
 
        //reset kerning
 
-               prev_glyphindex = 0;
+       prev_glyphindex = 0;
 
        //render string
 
-               ex = sx + maxwidth;
+       _ex = _sx + maxwidth;
 
-               while(*rptr != '\0')
+       while(*rptr != '\0')
+       {
+               if(*rptr=='~')
                {
-                       if(*rptr=='~')
+                       ++rptr;
+                       rc=*rptr;
+                       found=0;
+                       for(i=0; i<sizeof(sc)/sizeof(sc[0]) && !found; i++)
                        {
-                               ++rptr;
-                               rc=*rptr;
-                               found=0;
-                               for(i=0; i<sizeof(sc) && !found; i++)
-                               {
-                                       if(rc==sc[i])
-                                       {
-                                               rc=tc[i];
-                                               found=1;
-                                       }
-                               }
-                               if(found)
+                               if(rc==sc[i])
                                {
-                                       if((charwidth = RenderChar(rc, sx, sy, ex, varcolor)) == -1) return sx; /* string > maxwidth */
-                                       sx += charwidth;
+                                       rc=tc[i];
+                                       found=1;
                                }
-                               else
+                       }
+                       if(found)
+                       {
+                               if((charwidth = RenderChar(rc, _sx, _sy, _ex, varcolor)) == -1) return _sx; /* string > maxwidth */
+                               _sx += charwidth;
+                       }
+                       else
+                       {
+                               switch(*rptr)
                                {
-                                       switch(*rptr)
-                                       {
-                                               case 'R': varcolor=RED; break;
-                                               case 'G': varcolor=GREEN; break;
-                                               case 'Y': varcolor=YELLOW; break;
-                                               case 'B': varcolor=BLUE1; break;
-                                               case 'S': varcolor=color; break;
-                                               case 't':                               
-                                                       sx=TABULATOR*((int)(sx/TABULATOR)+1);
-                                                       break;
-                                               case 'T':
-                                                       if(sscanf(rptr+1,"%3d",&i)==1)
-                                                       {
-                                                               rptr+=3;
-                                                               sx=i;
-                                                       }
+                                       case 'R': varcolor=RED; break;
+                                       case 'G': varcolor=GREEN; break;
+                                       case 'Y': varcolor=YELLOW; break;
+                                       case 'B': varcolor=BLUE1; break;
+                                       case 'S': varcolor=color; break;
+                                       case 't':
+                                               _sx=TABULATOR*((int)(_sx/TABULATOR)+1);
                                                break;
-                                       }
+                                       case 'T':
+                                               if(sscanf(rptr+1,"%4d",&i)==1)
+                                               {
+                                                       rptr+=4;
+                                                       _sx=i;
+                                               }
+                                       break;
                                }
                        }
-                       else
+               }
+               else
+               {
+                       int uml = 0;
+                       switch(*rptr)    /* skip Umlauts */
+                       {
+                               case '\xc4':
+                               case '\xd6':
+                               case '\xdc':
+                               case '\xe4':
+                               case '\xf6':
+                               case '\xfc':
+                               case '\xdf': uml=1; break;
+                       }
+                       if (uml == 0)
                        {
-                               int uml = 0;
-                               switch(*rptr)    /* skip Umlauts */
+                               // UTF8_to_Latin1 encoding
+                               if (((*rptr) & 0xf0) == 0xf0)      /* skip (can't be encoded in Latin1) */
                                {
-                                       case '\xc4':
-                                       case '\xd6':
-                                       case '\xdc':
-                                       case '\xe4':
-                                       case '\xf6':
-                                       case '\xfc':
-                                       case '\xdf': uml=1; break;
+                                       rptr++;
+                                       if ((*rptr) == 0)
+                                               *rptr='\x3f'; // ? question mark
+                                       rptr++;
+                                       if ((*rptr) == 0)
+                                               *rptr='\x3f';
+                                       rptr++;
+                                       if ((*rptr) == 0)
+                                               *rptr='\x3f';
                                }
-                               if (uml == 0)
+                               else if (((*rptr) & 0xe0) == 0xe0) /* skip (can't be encoded in Latin1) */
                                {
-                                       // UTF8_to_Latin1 encoding
-                                       if (((*rptr) & 0xf0) == 0xf0)      /* skip (can't be encoded in Latin1) */
-                                       {
-                                               rptr++;
-                                               if ((*rptr) == 0)
-                                                       *rptr='\x3f'; // ? question mark
-                                               rptr++;
-                                               if ((*rptr) == 0)
-                                                       *rptr='\x3f';
-                                               rptr++;
-                                               if ((*rptr) == 0)
-                                                       *rptr='\x3f';
-                                       }
-                                       else if (((*rptr) & 0xe0) == 0xe0) /* skip (can't be encoded in Latin1) */
-                                       {
-                                               rptr++;
-                                               if ((*rptr) == 0)
-                                                       *rptr='\x3f';
-                                               rptr++;
-                                               if ((*rptr) == 0)
-                                                       *rptr='\x3f';
-                                       }
-                                       else if (((*rptr) & 0xc0) == 0xc0)
-                                       {
-                                               char c = (((*rptr) & 3) << 6);
-                                               rptr++;
-                                               if ((*rptr) == 0)
-                                                       *rptr='\x3f';
-                                               *rptr = (c | ((*rptr) & 0x3f));
-                                       }
+                                       rptr++;
+                                       if ((*rptr) == 0)
+                                               *rptr='\x3f';
+                                       rptr++;
+                                       if ((*rptr) == 0)
+                                               *rptr='\x3f';
+                               }
+                               else if (((*rptr) & 0xc0) == 0xc0)
+                               {
+                                       char c = (((*rptr) & 3) << 6);
+                                       rptr++;
+                                       if ((*rptr) == 0)
+                                               *rptr='\x3f';
+                                       *rptr = (c | ((*rptr) & 0x3f));
                                }
-                               if((charwidth = RenderChar(*rptr, sx, sy, ex, varcolor)) == -1) return sx; /* string > maxwidth */
-                               sx += charwidth;
                        }
-                       rptr++;
+                       if((charwidth = RenderChar(*rptr, _sx, _sy, _ex, varcolor)) == -1) return _sx; /* string > maxwidth */
+                       _sx += charwidth;
                }
+               rptr++;
+       }
        return stringlen;
 }
-
diff --git a/text.h b/text.h
index 6b1ded5a5c10c372cf532828be8388a3150abced..0043013f49f1bcf42d7353bbf285408f6710e104 100644 (file)
--- a/text.h
+++ b/text.h
@@ -1,5 +1,4 @@
 #ifndef __TEXT_H__
-
 #define __TEXT_H__
 
 #include "input.h"
@@ -9,8 +8,8 @@ extern int FSIZE_MED;
 extern int FSIZE_SMALL;
 
 FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface);
-int RenderString(char *string, int sx, int sy, int maxwidth, int layout, int size, int color);
-int GetStringLen(unsigned char *string, int size);
+int RenderString(const char *string, int _sx, int _sy, int maxwidth, int layout, int size, int color);
+int GetStringLen(char *string, size_t size);
 void CatchTabs(char *text);
 
 #endif