public void Input(byte[] data, int offset, int length) { _manipulator.Load(GetDocument().CurrentLine, 0); _manipulator.CaretColumn = GetDocument().CaretColumn; _manipulator.DefaultDecoration = _currentdecoration; _decoder.Input(this, data, offset, length); GetDocument().ReplaceCurrentLine(_manipulator.Export()); GetDocument().CaretColumn = _manipulator.CaretColumn; }
public void OnReception(ByteDataFragment data) { try { bool pass_to_terminal = true; if (_modalTerminalTask != null) { bool show_input = _modalTerminalTask.ShowInputInTerminal; _modalTerminalTask.OnReception(data); if (!show_input) { pass_to_terminal = false; //入力を見せない(XMODEMとか)のときはターミナルに与えない } } //バイナリログの出力 _logService.BinaryLogger.Write(data); if (pass_to_terminal) { TerminalDocument document = _document; lock (document) { //_invalidateParam.Reset(); //ここから旧Input() _manipulator.Load(GetDocument().CurrentLine, 0); _manipulator.CaretColumn = GetDocument().CaretColumn; _manipulator.DefaultDecoration = _currentdecoration; //処理本体 _decoder.OnReception(data); GetDocument().ReplaceCurrentLine(_manipulator.Export()); GetDocument().CaretColumn = _manipulator.CaretColumn; //ここまで //右端にキャレットが来たときは便宜的に次行の頭にもっていく if (document.CaretColumn == document.TerminalWidth) { document.CurrentLineNumber++; //これによって次行の存在を保証 document.CaretColumn = 0; } CheckDiscardDocument(); AdjustTransientScrollBar(); //現在行が下端に見えるようなScrollBarValueを計算 int n = document.CurrentLineNumber - document.TerminalHeight + 1 - document.FirstLineNumber; if (n < 0) { n = 0; } //Debug.WriteLine(String.Format("E={0} C={1} T={2} H={3} LC={4} MAX={5} n={6}", _transientScrollBarEnabled, _tag.Document.CurrentLineNumber, _tag.Document.TopLineNumber, _tag.Connection.TerminalHeight, _transientScrollBarLargeChange, _transientScrollBarMaximum, n)); if (IsAutoScrollMode(n)) { _scrollBarValues.Value = n; document.TopLineNumber = n + document.FirstLineNumber; } else { _scrollBarValues.Value = document.TopLineNumber - document.FirstLineNumber; } //Invalidateをlockの外に出す。このほうが安全と思われた //受信スレッド内ではマークをつけるのみ。タイマーで行うのはIntelliSenseに副作用あるので一時停止 //_promptRecognizer.SetContentUpdateMark(); _promptRecognizer.Recognize(); } if (_afterExitLockActions.Count > 0) { Control main = _session.OwnerWindow.AsControl(); foreach (AfterExitLockDelegate action in _afterExitLockActions) { main.Invoke(action); } _afterExitLockActions.Clear(); } } if (_modalTerminalTask != null) { _modalTerminalTask.NotifyEndOfPacket(); } _session.NotifyViewsDataArrived(); } catch (Exception ex) { RuntimeUtil.ReportException(ex); } }