plugin/windows: Fixed scrolling and last line displaying in TTY console
This commit is contained in:
parent
8850d42246
commit
d1b942cea5
@ -43,8 +43,6 @@ namespace hex {
|
|||||||
std::vector<u32> m_wrapPositions;
|
std::vector<u32> m_wrapPositions;
|
||||||
bool m_transmitting = false;
|
bool m_transmitting = false;
|
||||||
|
|
||||||
bool m_needsScrolling = false;
|
|
||||||
|
|
||||||
constexpr static std::array BaudRates = {
|
constexpr static std::array BaudRates = {
|
||||||
"110",
|
"110",
|
||||||
"300",
|
"300",
|
||||||
|
@ -99,11 +99,14 @@ namespace hex {
|
|||||||
for (u32 i = clipper.DisplayStart + 1; i < clipper.DisplayEnd; i++) {
|
for (u32 i = clipper.DisplayStart + 1; i < clipper.DisplayEnd; i++) {
|
||||||
ImGui::TextUnformatted(this->m_receiveDataBuffer.data() + this->m_wrapPositions[i - 1], this->m_receiveDataBuffer.data() + this->m_wrapPositions[i]);
|
ImGui::TextUnformatted(this->m_receiveDataBuffer.data() + this->m_wrapPositions[i - 1], this->m_receiveDataBuffer.data() + this->m_wrapPositions[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this->m_receiveDataBuffer.empty() && !this->m_wrapPositions.empty())
|
||||||
|
if (clipper.DisplayEnd >= this->m_wrapPositions.size() - 1)
|
||||||
|
ImGui::TextUnformatted(this->m_receiveDataBuffer.data() + this->m_wrapPositions.back());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->m_shouldAutoScroll && this->m_needsScrolling) {
|
if (this->m_shouldAutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) {
|
||||||
ImGui::SetScrollHereY(0.0F);
|
ImGui::SetScrollHereY(0.0F);
|
||||||
this->m_needsScrolling = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
@ -195,19 +198,28 @@ namespace hex {
|
|||||||
overlapped.hEvent = ::CreateEvent(nullptr, true, false, nullptr);
|
overlapped.hEvent = ::CreateEvent(nullptr, true, false, nullptr);
|
||||||
ON_SCOPE_EXIT { ::CloseHandle(&overlapped); };
|
ON_SCOPE_EXIT { ::CloseHandle(&overlapped); };
|
||||||
|
|
||||||
|
auto addByte = [this](char byte) {
|
||||||
|
if (byte >= 0x20 && byte <= 0x7E) {
|
||||||
|
this->m_receiveDataBuffer.back() = byte;
|
||||||
|
this->m_receiveDataBuffer.push_back(0x00);
|
||||||
|
} else if (byte == '\n' || byte == '\r') {
|
||||||
|
if (this->m_receiveDataBuffer.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
u32 wrapPos = this->m_receiveDataBuffer.size() - 1;
|
||||||
|
|
||||||
|
if (this->m_wrapPositions.empty() || this->m_wrapPositions.back() != wrapPos)
|
||||||
|
this->m_wrapPositions.push_back(wrapPos);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
while (!token.stop_requested()) {
|
while (!token.stop_requested()) {
|
||||||
DWORD bytesRead = 0;
|
DWORD bytesRead = 0;
|
||||||
|
|
||||||
char byte;
|
char byte;
|
||||||
if (!waitingOnRead) {
|
if (!waitingOnRead) {
|
||||||
if (::ReadFile(this->m_portHandle, &byte, sizeof(char), &bytesRead, &overlapped)) {
|
if (::ReadFile(this->m_portHandle, &byte, sizeof(char), &bytesRead, &overlapped)) {
|
||||||
if (byte >= 0x20 && byte <= 0x7E) {
|
addByte(byte);
|
||||||
this->m_receiveDataBuffer.back() = byte;
|
|
||||||
this->m_receiveDataBuffer.push_back(0x00);
|
|
||||||
this->m_needsScrolling = true;
|
|
||||||
} else if (byte == '\n' || byte == '\r') {
|
|
||||||
this->m_wrapPositions.push_back(this->m_receiveDataBuffer.size() - 1);
|
|
||||||
}
|
|
||||||
} else if (::GetLastError() == ERROR_IO_PENDING) {
|
} else if (::GetLastError() == ERROR_IO_PENDING) {
|
||||||
waitingOnRead = true;
|
waitingOnRead = true;
|
||||||
}
|
}
|
||||||
@ -216,11 +228,7 @@ namespace hex {
|
|||||||
switch (res) {
|
switch (res) {
|
||||||
case WAIT_OBJECT_0:
|
case WAIT_OBJECT_0:
|
||||||
if (::GetOverlappedResult(this->m_portHandle, &overlapped, &bytesRead, false)) {
|
if (::GetOverlappedResult(this->m_portHandle, &overlapped, &bytesRead, false)) {
|
||||||
if (byte >= 0x20 && byte <= 0x7E) {
|
addByte(byte);
|
||||||
this->m_receiveDataBuffer.back() = byte;
|
|
||||||
this->m_receiveDataBuffer.push_back(0x00);
|
|
||||||
this->m_needsScrolling = true;
|
|
||||||
}
|
|
||||||
waitingOnRead = false;
|
waitingOnRead = false;
|
||||||
}
|
}
|
||||||
default: break;
|
default: break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user