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