void reset_buf(char *s) { buf.i = buf.wc = buf.wbreak = buf.wbeg = 0; buf.inword = FALSE; if (s != NULL) { int i, len = strlen(s); for (i = 0; i < len; i++) insert_ch(s[i]); } }
void append_buf(char c) { if (c == '\n') { break_at(buf.i); reset_buf(""); } else { insert_ch(c); if (buf.i > WRAP_SIZE) { char save[BUFSIZ] = ""; if (buf.inword) { // TODO Handle words too long to wrap strncpy(save, buf.s + buf.wbeg, buf.i - buf.wbeg); buf.wc--; } break_at(buf.wbreak); reset_buf(save); } } }
int process_menu(uint8_t scancode) { static union _modifier_state modifier_state; static uint8_t last_scancode; uint8_t ret=0; //Nur Flanke auswerten if(last_scancode==0xff && scancode!=0xff) { //Taste gedrückt? if(scancode!=0xff) { #ifndef AVR caca_printf(cv,1,4,"8x8 scancode(0..63) = %i ",scancode); #endif //Wandlung von 8x8 Keycode auf ASCII oder Modifier uint8_t c=characters[scancode]; uint8_t printable_char=0; //Prüfen ob ASCII Zeichen if(c) { //printf("%c %i\n",c,c); if(modifier_state.SHIFT || modifier_state.CAPS) { //alternative Belegung switch(c) { case '1': c='!'; break; case '2': c='"'; break; case '3': c='^'; break; case '4': c='$'; break; case '5': c='%'; break; case '6': c='&'; break; case '7': c='/'; break; case '8': c='('; break; case '9': c=')'; break; case '0': c='='; break; case '\\': c='?'; break; case '+': c='*'; break; case '#': c='\''; break; case '<': c='>'; break; case ',': c=';'; break; case '.': c=':'; break; case '@': c='|'; break; default: c = toupper(c); break; } } //Ist es auf dem LCD anzeigbar? if(isprint(c)) { //Shift zurücksetzen modifier_state.SHIFT=0; printable_char=c; } else { //Andere Funktion mit ASCII Zeichen wie \b, \r, \t if(c=='\b') { if(cursor_x>0) { cursor_viewport_calc(_LEFT, &cursor_x,&cursor_y,&viewport_x,&viewport_y, 0); delete_ch(cursor_x, cursor_y); } } else if(c=='\r') { cursor_viewport_calc(_DOWN, &cursor_x,&cursor_y,&viewport_x,&viewport_y, 0); cursor_x=get_line_end(cursor_y); cursor_viewport_calc(0, &cursor_x,&cursor_y,&viewport_x,&viewport_y, 0); } //else if(c=='\t') // TODO? ; } } else /*muss ein Modifier, Cursor, Funktionstaste oder ähnlich sein*/ { //printf("Not an ASCII char. scancode=%i\n",scancode); switch(scancode) { case _SHIFT: modifier_state.SHIFT=1; break; case _CAPS : modifier_state.CAPS=!modifier_state.CAPS; break; case _ALT : modifier_state.ALT=!modifier_state.ALT; break; case _STRG : modifier_state.STRG=1; break; case _ENTF :if(modifier_state.SHIFT) modifier_state.OVERWRITE=!modifier_state.OVERWRITE; else delete_ch(cursor_x, cursor_y); break; case _ENDE : cursor_x=(modifier_state.SHIFT)?0:get_line_end(cursor_y); modifier_state.SHIFT=0; break; case _ESC : clr_text_buffer(); cursor_x=0; cursor_y=0; break; default: break; } //Nur wenn nicht SHIFT, sonst könnten es //Cursortasten -_{} oder F3, F4 [] sein if(!modifier_state.SHIFT) { switch(scancode) { case _F1: if(font_size>3) font_size--; updated_settings=1; break; case _F2: if(font_size<9) font_size++; updated_settings=1; break; case _F4: strncpy(font_name,strcmp(font_name,"rowmans")? "rowmans": "scripts", 10); updated_settings=1; break; default: break; } cursor_viewport_calc(scancode, &cursor_x,&cursor_y,&viewport_x,&viewport_y, modifier_state.ALT); } else switch(scancode) { case _DOWN: printable_char='-'; break; case _LEFT: printable_char='_'; break; case _UP: printable_char='{'; break; case _RIGHT: printable_char='}'; break; case _F3: printable_char='['; break; case _F4: printable_char=']'; break; default: break; } if(printable_char) //Shift zurücksetzen modifier_state.SHIFT=0; } if(isprint(printable_char)) { //Einfügen oder Überschreiben? if(modifier_state.OVERWRITE) text_buffer[cursor_y][cursor_x]=printable_char; else insert_ch(cursor_x, cursor_y, printable_char); //Ein Zeichen weiter rechts cursor_viewport_calc(_RIGHT, &cursor_x,&cursor_y,&viewport_x,&viewport_y, 0); } ret=1; } } last_scancode=scancode; #ifndef AVR if(scancode!=0xff) { char line0[LCD_WIDTH+1]; char line1[LCD_WIDTH+1]; strncpy(line0,text_buffer[viewport_y]+viewport_x,LCD_WIDTH); strncpy(line1,text_buffer[viewport_y+1]+viewport_x,LCD_WIDTH); line0[LCD_WIDTH]=0; line1[LCD_WIDTH]=0; draw_lcd(line0, line1, viewport_x, viewport_y, cursor_x, cursor_y); } #endif return ret; }