void CursorRight(int character) { int rows; /*may be used as the extension of direction keys while(screen.cur_col < screen.row_end[screen.cur_row] && character > 0) { screen.cur_col++; CURSOR_RIGHT(); character--; } */ while(character > 0 && file.cur_index < file.line[file.cur_line].line_end) { if(screen.cur_col < screen.win_width) { if(file.line[file.cur_line].character[file.cur_index] == '\t') screen.cur_col = (screen.cur_col - screen.start_pos + TABLEN ) / TABLEN * TABLEN + screen.start_pos; else screen.cur_col++; CursorMove(); } else { //if the last character is right in the last column,the newline won't occupy a new line. if(screen.cur_row < screen.win_height - 1 && file.cur_index < file.line[file.cur_line].line_end - 1) { screen.cur_col = screen.start_pos; screen.cur_row ++; CursorMove(); } else if(screen.cur_row == screen.win_height - 1) { rows = file.line[file.start_line].line_row - 1; file.start_line++;//not checked,in fact it will cause bugs but I don't want to deal now. display(file.start_line); screen.cur_row -= rows; screen.cur_col = screen.start_pos; CursorMove(); } } character--; } if(file.cur_index < file.line[file.cur_line].line_end) file.cur_index ++; offset(); CheckCursor(); }
void CheckCursor() { getpos(); if(screen.cur_row > screen.last_row) { screen.cur_row = screen.last_row; } if(screen.row_end[screen.cur_row] < screen.cur_col) //not move the cursor to the position where no character exits. { screen.cur_col = screen.row_end[screen.cur_row]; } if(screen.cur_col < screen.start_pos) { screen.cur_col = screen.start_pos; } if(file.line[file.cur_line].character[file.cur_index] == '\t') { screen.cur_col = (screen.cur_col - screen.start_pos + TABLEN ) / TABLEN * TABLEN + screen.start_pos - 1; } CursorMove(); }
void CursorUp(int line) { int rows; if(file.cur_line > 1) { if(file.cur_line > file.start_line) { if(file.line[file.cur_line - 1].line_row < screen.row_offset) { rows = screen.row_rank[screen.cur_row ]; screen.cur_col = screen.win_width; } else { rows = screen.row_rank[screen.cur_row] + file.line[file.cur_line-1].line_row - screen.row_offset; screen.cur_col = screen.col_offset; } while(rows--) screen.cur_row--; } //not preread the former line,may cause bug. else { file.start_line--; display(file.start_line); if(file.line[file.start_line].line_row < screen.row_offset) { screen.cur_row = file.line[file.start_line].line_row; screen.cur_col = screen.win_width; } else { screen.cur_row = screen.row_offset; screen.cur_col = screen.col_offset; } } CursorMove(); getpos(); CheckCursor(); } }
void CursorDown(int line) { int rows; int lines; if(file.cur_line < file.total_line) { if(screen.row_offset > file.line[file.cur_line+1].line_row) { screen.cur_col = screen.win_width; lines = file.line[file.cur_line].line_row - screen.row_rank[screen.cur_row] + file.line[file.cur_line + 1].line_row; } else { screen.cur_col = screen.col_offset; lines = file.line[file.cur_line].line_row - screen.row_rank[screen.cur_row] + screen.row_offset; } while(lines--) { if(screen.cur_row < screen.win_height - 1) { screen.cur_row++; } else { if(file.start_line <= file.total_line) { rows = file.line[file.start_line].line_row; //start_line.row > 1 ,so move back the cursor file.start_line++; display(file.start_line); screen.cur_row = screen.win_height-rows; } } } CursorMove(); getpos(); CheckCursor(); } }
void CScreenDevice::Write (char chChar) { switch (m_nState) { case ScreenStateStart: switch (chChar) { case '\b': CursorLeft (); break; case '\t': Tabulator (); break; case '\n': NewLine (); break; case '\r': CarriageReturn (); break; case '\x1b': m_nState = ScreenStateEscape; break; default: DisplayChar (chChar); break; } break; case ScreenStateEscape: switch (chChar) { case 'M': ReverseScroll (); m_nState = ScreenStateStart; break; case '[': m_nState = ScreenStateBracket; break; default: m_nState = ScreenStateStart; break; } break; case ScreenStateBracket: switch (chChar) { case '?': m_nState = ScreenStateQuestionMark; break; case 'A': CursorUp (); m_nState = ScreenStateStart; break; case 'B': CursorDown (); m_nState = ScreenStateStart; break; case 'C': CursorRight (); m_nState = ScreenStateStart; break; case 'H': CursorHome (); m_nState = ScreenStateStart; break; case 'J': ClearDisplayEnd (); m_nState = ScreenStateStart; break; case 'K': ClearLineEnd (); m_nState = ScreenStateStart; break; case 'L': InsertLines (1); m_nState = ScreenStateStart; break; case 'M': DeleteLines (1); m_nState = ScreenStateStart; break; case 'P': DeleteChars (1); m_nState = ScreenStateStart; break; default: if ('0' <= chChar && chChar <= '9') { m_nParam1 = chChar - '0'; m_nState = ScreenStateNumber1; } else { m_nState = ScreenStateStart; } break; } break; case ScreenStateNumber1: switch (chChar) { case ';': m_nState = ScreenStateSemicolon; break; case 'L': InsertLines (m_nParam1); m_nState = ScreenStateStart; break; case 'M': DeleteLines (m_nParam1); m_nState = ScreenStateStart; break; case 'P': DeleteChars (m_nParam1); m_nState = ScreenStateStart; break; case 'X': EraseChars (m_nParam1); m_nState = ScreenStateStart; break; case 'h': case 'l': if (m_nParam1 == 4) { InsertMode (chChar == 'h'); } m_nState = ScreenStateStart; break; case 'm': SetStandoutMode (m_nParam1); m_nState = ScreenStateStart; break; default: if ('0' <= chChar && chChar <= '9') { m_nParam1 *= 10; m_nParam1 += chChar - '0'; if (m_nParam1 > 99) { m_nState = ScreenStateStart; } } else { m_nState = ScreenStateStart; } break; } break; case ScreenStateSemicolon: if ('0' <= chChar && chChar <= '9') { m_nParam2 = chChar - '0'; m_nState = ScreenStateNumber2; } else { m_nState = ScreenStateStart; } break; case ScreenStateQuestionMark: if ('0' <= chChar && chChar <= '9') { m_nParam1 = chChar - '0'; m_nState = ScreenStateNumber3; } else { m_nState = ScreenStateStart; } break; case ScreenStateNumber2: switch (chChar) { case 'H': CursorMove (m_nParam1, m_nParam2); m_nState = ScreenStateStart; break; case 'r': SetScrollRegion (m_nParam1, m_nParam2); m_nState = ScreenStateStart; break; default: if ('0' <= chChar && chChar <= '9') { m_nParam2 *= 10; m_nParam2 += chChar - '0'; if (m_nParam2 > 199) { m_nState = ScreenStateStart; } } else { m_nState = ScreenStateStart; } break; } break; case ScreenStateNumber3: switch (chChar) { case 'h': case 'l': if (m_nParam1 == 25) { SetCursorMode (chChar == 'h'); } m_nState = ScreenStateStart; break; default: if ('0' <= chChar && chChar <= '9') { m_nParam1 *= 10; m_nParam1 += chChar - '0'; if (m_nParam1 > 99) { m_nState = ScreenStateStart; } } else { m_nState = ScreenStateStart; } break; } break; default: m_nState = ScreenStateStart; break; } }
int get_keyf(int region) { int key1,key2; keydef_t *def; if (region>=MAX_region) return -1; if (km.mode==KM_set) system_msg("KeyMacro設定中"); if (km.mode==KM_do) system_msg("KeyMacro起動中"); key1=km_getkey(); if (key1!=-1) { term_csr_flush(); return key1; } if (region==0) CursorMove(); key1=term_inkey(); key2=-1; def=keydef_get(region, key1, key2); //fprintf(stderr,"%08p: %04x %08x\n",def, key1, key2); if (def!=(void *)-1) { if (def==NULL) { if (key1>0x100 || (iscntrl(key1) && key1!='\t' && key1<0x80)) def=(void *)-1; else key1|=KF_normalcode; } } else { putDoubleKey(key1); if (region==0) CursorMove(); key2=term_inkey(); delDoubleKey(); def=keydef_get(region, key1, key2); } /* 通常の有効なキー */ if (def!=NULL&& def!=(void *)-1&& def->kdm==KDM_func) { key1=def->funcNo; keydef_args=def->args; def=NULL; } if (def==NULL) { km_addkey(key1); return key1; } /* マクロ登録中 */ if (km.mode==KM_set) { km_set(region,def,key1,key2); return -1; } /* 無効なキー */ if (def==(void *)-1) return -1; /* マクロ起動 */ km_macro(def); return -1; }