Example #1
0
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();
}
Example #2
0
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();

}
Example #3
0
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();
	}
}
Example #4
0
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();
	 }
}
Example #5
0
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;
	}
}
Example #6
0
File: keyf.c Project: smorimura/ne
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;
}