diff --git a/src/dlangui/platforms/common/platform.d b/src/dlangui/platforms/common/platform.d index 1e2b3d80..f21d5307 100644 --- a/src/dlangui/platforms/common/platform.d +++ b/src/dlangui/platforms/common/platform.d @@ -849,15 +849,21 @@ class Window { /// system timer interval expired - notify queue protected void onTimer() { + //Log.d("window.onTimer"); bool res = _timerQueue.notify(); + //Log.d("window.onTimer after notify"); if (res) { // check if update needed and redraw if so + //Log.d("before update"); update(false); + //Log.d("after update"); } + //Log.d("schedule next timer"); long nextInterval = _timerQueue.nextIntervalMillis(); if (nextInterval > 0) { scheduleSystemTimer(nextInterval); } + //Log.d("schedule next timer done"); } /// set timer for destination widget - destination.onTimer() will be called after interval expiration; returns timer id diff --git a/src/dlangui/platforms/windows/winapp.d b/src/dlangui/platforms/windows/winapp.d index 0f1448d0..e01311d3 100644 --- a/src/dlangui/platforms/windows/winapp.d +++ b/src/dlangui/platforms/windows/winapp.d @@ -319,7 +319,7 @@ class Win32Window : Window { } private long _nextExpectedTimerTs; - private UINT_PTR _timerId; + private UINT_PTR _timerId = 1; /// schedule timer for interval in milliseconds - call window.onTimer when finished override protected void scheduleSystemTimer(long intervalMillis) { @@ -329,13 +329,20 @@ class Win32Window : Window { if (_timerId && _nextExpectedTimerTs && _nextExpectedTimerTs < nextts + 10) return; // don't reschedule timer, timer event will be received soon if (_hwnd) { - _timerId = SetTimer(_hwnd, _timerId, cast(uint)intervalMillis, null); + //_timerId = + SetTimer(_hwnd, _timerId, cast(uint)intervalMillis, null); _nextExpectedTimerTs = nextts; } } void handleTimer(UINT_PTR timerId) { - onTimer(); + //Log.d("handleTimer id=", timerId); + if (timerId == _timerId) { + KillTimer(_hwnd, timerId); + //_timerId = 0; + _nextExpectedTimerTs = 0; + onTimer(); + } } diff --git a/src/dlangui/widgets/editors.d b/src/dlangui/widgets/editors.d index 18ca385c..e4f9b79d 100644 --- a/src/dlangui/widgets/editors.d +++ b/src/dlangui/widgets/editors.d @@ -681,7 +681,8 @@ class EditableContent { // update highlight if necessary updateTokenProps(rangeAfter.start.line, rangeAfter.end.line + 1); // call listeners - contentChangeListeners(this, op, rangeBefore, rangeAfter, source); + if (contentChangeListeners.assigned) + contentChangeListeners(this, op, rangeBefore, rangeAfter, source); } /// return text for specified range @@ -2405,6 +2406,13 @@ class EditBox : EditWidgetBase { FontRef font = font(); _lineHeight = font.height; _numVisibleLines = (_clientRect.height + _lineHeight - 1) / _lineHeight; + if (_firstVisibleLine >= _content.length) { + _firstVisibleLine = _content.length - _numVisibleLines + 1; + if (_firstVisibleLine < 0) + _firstVisibleLine = 0; + _caretPos.line = _content.length - 1; + _caretPos.pos = 0; + } if (_firstVisibleLine + _numVisibleLines > _content.length) _numVisibleLines = _content.length - _firstVisibleLine; _visibleLines.length = _numVisibleLines; @@ -2942,13 +2950,15 @@ class LogWidget : EditBox { super(ID); _scrollLock = true; enabled = false; - fontSize = 12; + fontSize = 15; fontFace = "Consolas,Lucida Console,Courier New"; fontFamily = FontFamily.MonoSpace; } /// append lines to the end of text void appendLines(dstring[] lines...) { - lines ~= ""d; // append new line after last line + if (lines.length == 0) + return; + //lines ~= ""d; // append new line after last line content.appendLines(lines); if (_maxLines > 0 && lineCount > _maxLines) { TextRange range;