Enlightenment CVS committal

Author  : codewarrior
Project : e17
Module  : proto

Dir     : e17/proto/enterminus/src/bin


Modified Files:
        handlers.c main.c smart.c term.c term.h ui.c 


Log Message:
- utf8 + updating, thanks Jerome Wilson 

===================================================================
RCS file: /cvs/e/e17/proto/enterminus/src/bin/handlers.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- handlers.c  27 Oct 2005 07:34:46 -0000      1.14
+++ handlers.c  11 Apr 2006 00:24:45 -0000      1.15
@@ -9,13 +9,20 @@
    char buf[512];
    int len;
    unsigned char c;
+   Term_Char *c2;
    Term_Event_Title_Change *e;
    Ecore_Event *event;
 
-   c = term_tcanvas_data_pop(term);
+   if((c2 = term_tcanvas_data_pop(term)))
+      c = c2->car[0];/* FIXME we'll wrap c for now, the code will be reworked*/
+   else
+      c = 0;
    for (len = 0; c != '\007' && len < 512; len++) {
       buf[len] = c;
-      c = term_tcanvas_data_pop(term);
+      if((c2 = term_tcanvas_data_pop(term)))
+        c = c2->car[0];/* FIXME we'll wrap c for now, the code will be 
reworked*/
+      else
+        c = 0;
    }
    buf[len] = 0;
 
@@ -42,16 +49,23 @@
    int i;
    int questionmark;
    unsigned char c;
+   Term_Char *c2;
 
    for (pos = 0; pos < NPAR; pos++)
      args[pos] = 0;
 
-   c = term_tcanvas_data_pop(term);
+   if((c2 = term_tcanvas_data_pop(term)))
+      c = c2->car[0];
+   else
+      c = 0;
    switch(c) {
       case '[': /* CSI */
         digit = 0;
         questionmark = 0;
-        c = term_tcanvas_data_pop(term);
+        if((c2 = term_tcanvas_data_pop(term)))
+            c = c2->car[0];
+        else
+           c = 0;
         while (isdigit(c) || c == ';' || c == '?')     {
            if (c == ';') {
               args[narg] = 0;
@@ -68,7 +82,10 @@
                  args[narg - 1] += c - '0';
               }
            }
-           c = term_tcanvas_data_pop(term);
+           if((c2 = term_tcanvas_data_pop(term)))
+              c = c2->car[0];
+           else
+              c = 0;
         }
 
         switch(c) {
@@ -453,14 +470,20 @@
         break;
       case ']': /* xterm sequence */
         digit = 0;
-        c = term_tcanvas_data_pop(term);
+        if((c2 = term_tcanvas_data_pop(term)))
+           c = c2->car[0];
+        else
+           c = 0;
         while (isdigit(c)) {
            if (!digit)
               narg++;
            digit = 1;
            args[narg - 1] *= 10;
            args[narg - 1] += c - '0';
-           c = term_tcanvas_data_pop(term);
+           if((c2 = term_tcanvas_data_pop(term)))
+              c = c2->car[0];
+           else
+              c = 0;
         }
         if (c != ';' || !narg) {
            DPRINT((stderr, "Invalid xterm sequence\n"));
@@ -541,12 +564,28 @@
    if (buf) {
       write(term->cmd_fd.sys, buf, strlen(buf));
    } else {
-      if (write(term->cmd_fd.sys, ev->string, 1) < 0) {
-        DPRINT((stderr, "Error writing to process: %m\n"));
-        //exit(2);
+      unsigned char *st = NULL;
+      int size = 1;
+      
+      if(ev->string)
+      {
+        st = strdup(ev->string);
+        /* Find the size of data to send borrowed from evas!!*/
+        if(st[0] < 0x80)
+           size = 1;
+        else if((st[0] & 0xe0) == 0xc0)
+           size = 2;
+        else if((st[0] & 0xf0) == 0xe0)
+           size = 3;    
+        else
+           size = 4;
       }
+      
+      if (write(term->cmd_fd.sys, st, size) < 0) {
+           DPRINT((stderr, "Error writing to process: %m\n"));
+           //exit(2);
+           }
    }
-
    return;
 
    /* extra stuff, clean up later */
===================================================================
RCS file: /cvs/e/e17/proto/enterminus/src/bin/main.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- main.c      28 Feb 2005 12:16:39 -0000      1.8
+++ main.c      11 Apr 2006 00:24:45 -0000      1.9
@@ -12,6 +12,11 @@
    Evas        *evas;   /* evas       */
    Evas_Object *term;   /* terminal   */
 
+   /* Let's initialize some stuff*/
+   /*edje_init();*//* hold off for now */
+   ecore_init();
+   ecore_evas_init();/* We NEED this to get the UTF-8 stuff!!*/
+   
    ee = ecore_evas_software_x11_new(0, 0, 0, 0, 0, 0);
    ecore_evas_show(ee);
    evas = ecore_evas_get(ee);
===================================================================
RCS file: /cvs/e/e17/proto/enterminus/src/bin/smart.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- smart.c     28 Feb 2005 12:44:59 -0000      1.11
+++ smart.c     11 Apr 2006 00:24:45 -0000      1.12
@@ -226,7 +226,9 @@
       if (size > 0)
         for (j = term->cols; j < num_chars_w; j++) {
            gt = &term->tcanvas->grid[i][j];
-           gt->c = ' ';
+           gt->uc = (char*)malloc(sizeof(char));
+           gt->uc[0] = ' ';
+           gt->nbc = 1;
            gt->changed = 0;
         }
    }
===================================================================
RCS file: /cvs/e/e17/proto/enterminus/src/bin/term.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -3 -r1.20 -r1.21
--- term.c      27 Oct 2005 07:34:16 -0000      1.20
+++ term.c      11 Apr 2006 00:24:45 -0000      1.21
@@ -38,18 +38,28 @@
 }
 
 void
-term_tcanvas_glyph_push(Term *term, char c)
+term_tcanvas_glyph_push(Term *term, Term_Char *c)
 {
    Term_TGlyph *gl;
-   int pos;
+   int pos,i;
 
+   if(!c)
+      return;
+   
    pos = term->tcanvas->pos + term->cur_row;
    if (pos >= term->tcanvas->size)
       pos -= term->tcanvas->size;
 
    gl = &term->tcanvas->grid[pos][term->cur_col];
    gl->changed = 1;
-   gl->c = c;
+   gl->nbc = c->nbchar;
+   gl->uc  = malloc(gl->nbc * sizeof(char));   
+   for(i = 0; i < gl->nbc; i++)
+   {
+      gl->uc[i] = c->car[i];
+   }
+   /*gl->c = c->car[0];* we can prolly do away with this later ('gl->c' that 
is)*/
+   
    gl->fg = term->tcanvas->cur_fg;
    gl->bg = term->tcanvas->cur_bg;
    term->tcanvas->changed_rows[pos] = 1;
@@ -67,19 +77,76 @@
    return;
 }
 
-char
+Term_Char *
 term_tcanvas_data_pop(Term *term)
 {
+   unsigned char d, d2, d3, d4;
+   Term_Char *ret=NULL;
+   
    if (term->data_ptr >= term->data_len)
-      return 0;
-   return term->data[term->data_ptr++];
+      return NULL;
+
+   ret = malloc(sizeof(Term_Char));
+   d = term->data[term->data_ptr++];
+
+   if (!d)
+      return NULL;
+
+   /* Below borrowed from evas   :)*/
+   if (d < 0x80)
+   {
+       /* 1 Byte */
+       ret->nbchar = 1;
+       ret->car[0] = d;        
+       if(term->debug)
+       printf("r = %c\n",ret->car[0]);
+       return ret;
+   }
+   if ((d & 0xe0) == 0xc0)
+   {
+      /* 2 bytes */
+     if (((d2 = term->data[term->data_ptr++]) & 0xc0) != 0x80)
+       return NULL;
+     ret->nbchar = 2;
+     ret->car[0] = d;
+     ret->car[1] = d2; 
+   }
+   else if ((d & 0xf0) == 0xe0)
+   {
+       /* 3 bytes */
+     if (((d2 = term->data[term->data_ptr++]) & 0xc0) != 0x80 ||
+          ((d3 = term->data[term->data_ptr++]) & 0xc0) != 0x80)
+         return NULL;
+       ret->nbchar = 3;
+       ret->car[0] = d;
+       ret->car[1] = d2;
+       ret->car[2] = d3;
+   }
+   else
+   {
+       /* 4 bytes */
+       if (((d2 = term->data[term->data_ptr++]) & 0xc0) != 0x80 ||
+           ((d3 = term->data[term->data_ptr++]) & 0xc0) != 0x80 ||
+           ((d4 = term->data[term->data_ptr++]) & 0xc0) != 0x80)
+          return NULL;
+       ret->nbchar = 3;
+       ret->car[0] = d;
+       ret->car[1] = d2;
+       ret->car[2] = d3;
+       ret->car[3] = d4;
+   }
+   
+   if(term->debug)
+   printf(" Car is %s len %d\n",ret->car,ret->nbchar);
+   return ret;
+   /*return term->data[term->data_ptr++];*/
 }
 
 /* look for new characters on the terminal device */
 int
 term_tcanvas_data(void *data, Ecore_Fd_Handler *fd_handler)
 {
-   char c;
+   Term_Char *c;
    Term *term;
 
    term = data;
@@ -87,11 +154,15 @@
    term->data_len = read(term->cmd_fd.sys, &term->data[0], sizeof(term->data));
    if (term->data_len > 0) {
       while ((c = term_tcanvas_data_pop(term))) {
-        //printf("%c",c);
-        switch(c) {
+        if(c->nbchar == 1)
+        switch(c->car[0]) {
            case '\007': /* Bell */
+              if(term->debug)
+              printf("BELL?\n");
               break;
            case '\010': /* backspace */
+              if(term->debug)
+              printf("backspace ? \n");
               term->cur_col--;
               /* FIXME!!! */
               if (term->cur_col < 0)
@@ -99,11 +170,17 @@
               //term_tcanvas_glyph_push(term, ' ');
               break;
            case '\011': /* tab */
+              if(term->debug)
+              printf("TAB\n");
               break;
            case '\033': /* escape */
+              if(term->debug)
+              printf("Escape seq\n");
               term_handler_escape_seq(term);
               break;
            case '\n': /* newline */
+              if(term->debug)
+              printf("NEWLINE\n");
               term->cur_col = 0;
               term->cur_row++;
               if (term->cur_row >= term->rows) {
@@ -121,21 +198,30 @@
 
                  for (j = 0; j < term->cols; j++) {
                     gl = &term->tcanvas->grid[pos][j];
-                    gl->c = ' ';
+                    if(!gl->uc)
+                       gl->uc = malloc(sizeof(char));
+                    gl->uc[0] = ' ';
+                    gl->nbc = 1;
                     gl->changed = 1;
                  }
               }
               break;
            case '\r': /* carriage return */
+              if(term->debug)
+                 printf("RETURN\n");
               term->cur_col = 0;
               break;
            default:
               term_tcanvas_glyph_push(term, c);
               break;
         }
+        else if(c->nbchar > 1)
+              term_tcanvas_glyph_push(term, c);
+        
       }
    }
-   //printf("Exiting TCanvas Data handler\n");
+   if(term->debug)
+   printf("Exiting TCanvas Data handler data_len %d,\n", term->data_len);
    return 1;
 }
 
@@ -157,7 +243,8 @@
       canvas->grid[i] = calloc(term->cols, sizeof(Term_TGlyph));
       for (j = 0; j < term->cols; j++) {
         gl = &canvas->grid[i][j];
-        gl->c = '\0';
+       // gl->c = '\0';
+        
         gl->changed = 0;
       }
    }
===================================================================
RCS file: /cvs/e/e17/proto/enterminus/src/bin/term.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- term.h      27 Oct 2005 07:33:43 -0000      1.15
+++ term.h      11 Apr 2006 00:24:45 -0000      1.16
@@ -57,10 +57,20 @@
    int               sys;
    Ecore_Fd_Handler *ecore;
 };
+
+/* Use UTF-8 internally :) */
+struct _Term_Char {
+   int nbchar;
+   char car[6];
+};
+typedef struct _Term_Char Term_Char;
+
 typedef struct _Term_Fd Term_Fd;
 
 struct _Term_TGlyph {
-   char c;
+   /*char c;*/
+   char *uc;/* NEW */
+   int  nbc;/* NEW */
    int  bg;
    int  fg;
    int  changed;
@@ -116,7 +126,7 @@
    Term_Cursor    cursor;
    Term_Font      font;
    Term_EGlyph  **grid;
-
+   int           debug;/* Temp */
    Term_Fd        cmd_fd;
    Term_Fd        slave;
    char           data[512];
@@ -145,10 +155,10 @@
 Term           *term_init(Evas_Object *o);
 Term_TCanvas   *term_tcanvas_new(Term *term);
 int             term_tcanvas_data(void *data, Ecore_Fd_Handler *fd_handler);
-void            term_tcanvas_glyph_push(Term *term, char c);
+void            term_tcanvas_glyph_push(Term *term, Term_Char *c);
 void            term_tcanvas_fg_color_set(Term *term, int c);
 void            term_tcanvas_bg_color_set(Term *term, int c);
-char            term_tcanvas_data_pop(Term *term);
+Term_Char      *term_tcanvas_data_pop(Term *term);
 int             term_font_get_width(Term *term);
 int             term_font_get_height(Term *term);
 
===================================================================
RCS file: /cvs/e/e17/proto/enterminus/src/bin/ui.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -3 -r1.27 -r1.28
--- ui.c        2 Mar 2005 10:27:55 -0000       1.27
+++ ui.c        11 Apr 2006 00:24:45 -0000      1.28
@@ -40,13 +40,29 @@
 void
 term_update_glyph(Term *term, Term_TGlyph *tgl, Term_EGlyph *gl, int i, int j)
 {
-   char c[2];
+   char *cc=NULL;
 
+   /*
    c[0] = tgl->c;
    c[1] = '\0';
+   */
+   if(tgl->uc)
+   {
+      int ord;
+      cc = (char*)malloc((tgl->nbc + 1) * sizeof(char));
+      cc[tgl->nbc]='\0';
+      for(ord=0;ord < tgl->nbc;ord++)
+      {
+        cc[ord]=tgl->uc[ord];
+      }      
+   }
    evas_object_text_font_set(gl->text, term->font.face, term->font.size);
-   evas_object_text_text_set(gl->text, c);
+   evas_object_text_text_set(gl->text, cc);
 
+   /*TODO break this out to the api */
+   evas_object_text_style_set(gl->text, EVAS_TEXT_STYLE_SOFT_SHADOW);
+   evas_object_text_shadow_color_set (gl->text, 100, 100, 100, 150);
+   
    /* this is just temp, move it into its own function later */
    switch (tgl->fg) {
       case 0:
@@ -116,7 +132,7 @@
            continue;
 
         /* unsure as to why this is here, I dont think we need it */
-        if (tgl->c == '\033') {
+        if ((tgl->nbc > 0) && (tgl->uc[0] == '\033')) {
            printf("Got escape in term_redraw()!\n");
            continue;
         }
@@ -267,8 +283,10 @@
         if (x >= term->tcanvas->size)
            x = 0;
         tgl = &term->tcanvas->grid[x][j];
-        if (tgl->c != ' ') {
-           tgl->c = ' ';
+        if ((tgl->nbc >= 1) && (tgl->uc[0] != ' ')) {
+           tgl->uc = (char*)realloc(tgl->uc ,1);
+           tgl->uc[0] = ' ';
+           tgl->nbc = 1;
            tgl->changed = 1;
            term->tcanvas->changed_rows[x] = 1;
         }
@@ -316,7 +334,8 @@
            term->tcanvas->changed_rows[i] = 1;
            for (j = 0; j < term->cols; j++) {
               tgl = &term->tcanvas->grid[i][j];
-              tgl->c = ' ';
+              tgl->uc = (char*)realloc(tgl->uc ,1); /* Is this EVIL? */
+              tgl->uc[0] = ' ';
               tgl->changed = 1;
            }
         }




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to