示例#1
0
        protected virtual ProcessCharResult ProcessControlChar(char ch)
        {
            if (ch == ControlCode.LF || ch == ControlCode.VT)   //Vertical TabはLFと等しい
            {
                LineFeedRule rule = GetTerminalSettings().LineFeedRule;
                if (rule == LineFeedRule.Normal || rule == LineFeedRule.LFOnly)
                {
                    if (rule == LineFeedRule.LFOnly) //LFのみの動作であるとき
                    {
                        DoCarriageReturn();
                    }
                    DoLineFeed();
                }
                return(ProcessCharResult.Processed);
            }
            else if (ch == ControlCode.CR)
            {
                LineFeedRule rule = GetTerminalSettings().LineFeedRule;
                if (rule == LineFeedRule.Normal || rule == LineFeedRule.CROnly)
                {
                    DoCarriageReturn();
                    if (rule == LineFeedRule.CROnly)
                    {
                        DoLineFeed();
                    }
                }
                return(ProcessCharResult.Processed);
            }
            else if (ch == ControlCode.BEL)
            {
                this.IndicateBell();
                return(ProcessCharResult.Processed);
            }
            else if (ch == ControlCode.BS)
            {
                //行頭で、直前行の末尾が継続であった場合行を戻す
                if (_manipulator.CaretColumn == 0)
                {
                    TerminalDocument doc = GetDocument();
                    int line             = doc.CurrentLineNumber - 1;
                    if (line >= 0 && doc.FindLineOrEdge(line).EOLType == EOLType.Continue)
                    {
                        doc.InvalidatedRegion.InvalidateLine(doc.CurrentLineNumber);
                        doc.CurrentLineNumber = line;
                        if (doc.CurrentLine == null)
                        {
                            _manipulator.Clear(doc.TerminalWidth);
                        }
                        else
                        {
                            _manipulator.Load(doc.CurrentLine, doc.CurrentLine.DisplayLength - 1); //NOTE ここはCharLengthだったが同じだと思って改名した
                        }
                        doc.InvalidatedRegion.InvalidateLine(doc.CurrentLineNumber);
                    }
                }
                else
                {
                    _manipulator.BackCaret();
                }

                return(ProcessCharResult.Processed);
            }
            else if (ch == ControlCode.HT)
            {
                _manipulator.CaretColumn = GetNextTabStop(_manipulator.CaretColumn);
                return(ProcessCharResult.Processed);
            }
            else if (ch == ControlCode.SO)
            {
                return(ProcessCharResult.Processed); //以下2つはCharDecoderの中で処理されているはずなので無視
            }
            else if (ch == ControlCode.SI)
            {
                return(ProcessCharResult.Processed);
            }
            else if (ch == ControlCode.NUL)
            {
                return(ProcessCharResult.Processed); //null charは無視 !!CR NULをCR LFとみなす仕様があるが、CR LF CR NULとくることもあって難しい
            }
            else
            {
                //Debug.WriteLine("Unknown char " + (int)ch);
                //適当なグラフィック表示ほしい
                return(ProcessCharResult.Unsupported);
            }
        }
示例#2
0
        protected virtual ProcessCharResult ProcessControlChar(char ch)
        {
            if (ch == '\n' || ch == 0xB)          //Vertical TabはLFと等しい
            {
                LineFeedRule rule = GetConnection().Param.LineFeedRule;
                if (rule == LineFeedRule.Normal || rule == LineFeedRule.LFOnly)
                {
                    if (rule == LineFeedRule.LFOnly)                  //LFのみの動作であるとき
                    {
                        DoCarriageReturn();
                    }
                    DoLineFeed();
                }
                return(ProcessCharResult.Processed);
            }
            else if (ch == '\r')
            {
                LineFeedRule rule = GetConnection().Param.LineFeedRule;
                if (rule == LineFeedRule.Normal || rule == LineFeedRule.CROnly)
                {
                    DoCarriageReturn();
                    if (rule == LineFeedRule.CROnly)
                    {
                        DoLineFeed();
                    }
                }
                return(ProcessCharResult.Processed);
            }
            else if (ch == 0x07)
            {
                _tag.Receiver.IndicateBell();
                return(ProcessCharResult.Processed);
            }
            else if (ch == 0x08)
            {
                //行頭で、直前行の末尾が継続であった場合行を戻す
                if (_manipulator.CaretColumn == 0)
                {
                    TerminalDocument doc = GetDocument();
                    int line             = doc.CurrentLineNumber - 1;
                    if (line >= 0 && doc.FindLineOrEdge(line).EOLType == EOLType.Continue)
                    {
                        doc.InvalidateLine(doc.CurrentLineNumber);
                        doc.CurrentLineNumber = line;
                        if (doc.CurrentLine == null)
                        {
                            _manipulator.Clear(GetConnection().TerminalWidth);
                        }
                        else
                        {
                            _manipulator.Load(doc.CurrentLine, doc.CurrentLine.CharLength - 1);
                        }
                        doc.InvalidateLine(doc.CurrentLineNumber);
                    }
                }
                else
                {
                    _manipulator.BackCaret();
                }

                return(ProcessCharResult.Processed);
            }
            else if (ch == 0x09)
            {
                _manipulator.CaretColumn = GetNextTabStop(_manipulator.CaretColumn);
                return(ProcessCharResult.Processed);
            }
            else if (ch == 0x0E)
            {
                return(ProcessCharResult.Processed);                //以下2つはCharDecoderの中で処理されているはずなので無視
            }
            else if (ch == 0x0F)
            {
                return(ProcessCharResult.Processed);
            }
            else if (ch == 0x00)
            {
                return(ProcessCharResult.Processed);                //null charは無視 !!CR NULをCR LFとみなす仕様があるが、CR LF CR NULとくることもあって難しい
            }
            else
            {
                //Debug.WriteLine("Unknown char " + (int)ch);
                //適当なグラフィック表示ほしい
                return(ProcessCharResult.Unsupported);
            }
        }