diff --git a/Console/CMakeLists.txt b/Console/CMakeLists.txt index 1dde97ee54..fe7204b72b 100644 --- a/Console/CMakeLists.txt +++ b/Console/CMakeLists.txt @@ -15,15 +15,13 @@ # You should have received a copy of the GNU General Public License # along with Retro68. If not, see . -cmake_minimum_required(VERSION 2.8) - add_library(RetroConsole - Console.cc - Console.h - ConsoleWindow.cc - ConsoleWindow.h - MacUtils.h - InitConsole.cc + retro/Console.cc + retro/Console.h + retro/ConsoleWindow.cc + retro/ConsoleWindow.h + retro/MacUtils.h + retro/InitConsole.cc ) set_target_properties(retrocrt PROPERTIES @@ -34,6 +32,7 @@ set_target_properties(retrocrt if(CMAKE_SYSTEM_NAME MATCHES RetroCarbon) set_target_properties(RetroConsole PROPERTIES OUTPUT_NAME RetroConsoleCarbon) endif() +target_include_directories(RetroConsole PUBLIC .) install(TARGETS RetroConsole DESTINATION lib) diff --git a/Console/Console.cc b/Console/Console.cc deleted file mode 100644 index 4ccfac294f..0000000000 --- a/Console/Console.cc +++ /dev/null @@ -1,353 +0,0 @@ -/* - Copyright 2012 Wolfgang Thaller. - - This file is part of Retro68. - - Retro68 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Retro68 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Retro68. If not, see . -*/ - -#include "Console.h" -#include "MacUtils.h" -#include "Fonts.h" -#include "Processes.h" - -#include - -using namespace Retro; - -Console *Console::currentInstance = NULL; - -Console::Console() - : consolePort(NULL), dirtyRect(), - blinkTicks(0), cursorDrawn(false), cursorVisible(true) -{ -} - -void Console::Init(GrafPtr port, Rect r) -{ - consolePort = port; - bounds = r; - - if(currentInstance == NULL) - currentInstance = (Console*) -1; - PortSetter setport(consolePort); - - InsetRect(&bounds, 2,2); - TextFont(kFontIDMonaco); - TextSize(9); - - cellSizeY = 12; - cellSizeX = CharWidth('M'); - - rows = (bounds.bottom - bounds.top) / cellSizeY; - cols = (bounds.right - bounds.left) / cellSizeX; - - chars = std::vector(rows*cols, ' '); - - onscreen = chars; - - cursorX = cursorY = 0; - currentInstance = this; -} - -Console::Console(GrafPtr port, Rect r) - : consolePort(NULL), dirtyRect(), - blinkTicks(0), cursorDrawn(false), cursorVisible(true) -{ - Init(port, r); -} - -Console::~Console() -{ -} - -Rect Console::CellRect(short x, short y) -{ - return { (short) (bounds.top + y * cellSizeY), (short) (bounds.left + x * cellSizeX), - (short) (bounds.top + (y+1) * cellSizeY), (short) (bounds.left + (x+1) * cellSizeX) }; -} -void Console::DrawCell(short x, short y, bool erase) -{ - Rect r = CellRect(x,y); - - if(cursorDrawn) - { - if(y == cursorY && x == cursorX) - { - erase = true; - cursorDrawn = false; - } - } - - if(erase) - EraseRect(&r); - MoveTo(r.left, r.bottom - 2); - DrawChar(chars[y * cols + x]); -} - -void Console::DrawCells(short x1, short x2, short y, bool erase) -{ - Rect r = { (short) (bounds.top + y * cellSizeY), (short) (bounds.left + x1 * cellSizeX), - (short) (bounds.top + (y+1) * cellSizeY), (short) (bounds.left + x2 * cellSizeX) }; - - if(cursorDrawn) - { - if(y == cursorY && x1 <= cursorX && x2 > cursorX) - { - erase = true; - cursorDrawn = false; - } - } - - if(erase) - EraseRect(&r); - MoveTo(r.left, r.bottom - 2); - DrawText(&chars[y * cols + x1], 0, x2 - x1); -} - -void Console::Draw(Rect r) -{ - PortSetter setport(consolePort); - - short minRow = std::max(0, (r.top - bounds.top) / cellSizeY); - short maxRow = std::min((int)rows, (r.bottom - bounds.top + cellSizeY - 1) / cellSizeY); - - short minCol = std::max(0, (r.left - bounds.left) / cellSizeX); - short maxCol = std::min((int)cols, (r.right - bounds.left + cellSizeX - 1) / cellSizeX); - - EraseRect(&r); - for(short row = minRow; row < maxRow; ++row) - { - DrawCells(minCol, maxCol, row, false); - } - if(cursorDrawn) - { - Rect cursor = CellRect(cursorX, cursorY); - InvertRect(&cursor); - } - onscreen = chars; -} - -void Console::ScrollUp(short n) -{ - cursorY--; - std::copy(chars.begin() + cols, chars.end(), chars.begin()); - std::fill(chars.end() - cols, chars.end(), ' '); - std::copy(onscreen.begin() + cols, onscreen.end(), onscreen.begin()); - std::fill(onscreen.end() - cols, onscreen.end(), ' '); - RgnHandle rgn = NewRgn(); - ScrollRect(&bounds, 0, -cellSizeY, rgn); - DisposeRgn(rgn); - dirtyRect.top = dirtyRect.top > 0 ? dirtyRect.top - 1 : 0; - dirtyRect.bottom = dirtyRect.bottom > 0 ? dirtyRect.bottom - 1 : 0; -} - - -void Console::PutCharNoUpdate(char c) -{ - InvalidateCursor(); - switch(c) - { - case '\r': - cursorX = 0; - break; - case '\n': - cursorY++; - cursorX = 0; - if(cursorY >= rows) - ScrollUp(); - break; - default: - chars[cursorY * cols + cursorX] = c; - if(dirtyRect.right == 0) - { - dirtyRect.right = (dirtyRect.left = cursorX) + 1; - dirtyRect.bottom = (dirtyRect.top = cursorY) + 1; - } - else - { - dirtyRect.left = std::min(dirtyRect.left, cursorX); - dirtyRect.top = std::min(dirtyRect.top, cursorY); - dirtyRect.right = std::max(dirtyRect.right, short(cursorX + 1)); - dirtyRect.bottom = std::max(dirtyRect.bottom, short(cursorY + 1)); - } - - cursorX++; - if(cursorX >= cols) - PutCharNoUpdate('\n'); - } -} - -void Console::Update() -{ - PortSetter setport(consolePort); - - for(short row = dirtyRect.top; row < dirtyRect.bottom; ++row) - { - short start = -1; - bool needclear = false; - for(short col = dirtyRect.left; col < dirtyRect.right; ++col) - { - char old = onscreen[row * cols + col]; - if(chars[row * cols + col] != old) - { - if(start == -1) - start = col; - if(old != ' ') - needclear = true; - onscreen[row * cols + col] = chars[row * cols + col]; - } - else - { - if(start != -1) - DrawCells(start, col, row, needclear); - start = -1; - needclear = false; - } - } - if(start != -1) - DrawCells(start, dirtyRect.right, row, needclear); - } - dirtyRect = Rect(); - - if(cursorVisible != cursorDrawn) - { - Rect r = CellRect(cursorX, cursorY); - if(cursorDrawn) - DrawCell(cursorX, cursorY, true); - else - InvertRect(&r); - cursorDrawn = !cursorDrawn; - } - -#if TARGET_API_MAC_CARBON - QDFlushPortBuffer(consolePort,NULL); -#endif -} - -void Console::putch(char c) -{ - PutCharNoUpdate(c); - Update(); -} - -void Console::write(const char *p, int n) -{ - for(int i = 0; i < n; i++) - Console::currentInstance->PutCharNoUpdate(*p++); - Update(); -} - - -std::string Console::ReadLine() -{ - std::string buffer; - char c; - - do - { - c = WaitNextChar(); - - if(c == '\r') - c = '\n'; - - if(c == '\b') - { - if(buffer.size()) - { - InvalidateCursor(); - cursorX--; - PutCharNoUpdate(' '); - cursorX--; - Update(); - - buffer.resize(buffer.size()-1); - } - - continue; - } - - putch(c); - buffer.append(1,c); - } while(c != '\n'); - return buffer; -} - -void Console::InvalidateCursor() -{ - if(cursorDrawn) - { - PortSetter setport(consolePort); - - DrawCell(cursorX, cursorY, true); - cursorDrawn = false; - } -} - -void Console::Idle() -{ - long ticks = TickCount(); - if(ticks - blinkTicks > 60) - { - cursorVisible = !cursorVisible; - blinkTicks = ticks; - Update(); - } -} - -void Console::Reshape(Rect newBounds) -{ - InsetRect(&newBounds, 2,2); - - bounds = newBounds; - short newRows = (bounds.bottom - bounds.top) / cellSizeY; - short newCols = (bounds.right - bounds.left) / cellSizeX; - - short upshift = 0; - if(cursorY >= newRows) - { - upshift = cursorY - (newRows - 1); - - InvalidateCursor(); - cursorY = newRows - 1; - } - - std::vector newChars(newRows*newCols, ' '); - for(short row = 0; row < newRows && row + upshift < rows; row++) - { - char *src = &chars[(row+upshift) * cols]; - char *dst = &newChars[row * newCols]; - std::copy(src, src + std::min(cols, newCols), dst); - } - chars.swap(newChars); - /*newChars = std::vector(newRows*newCols, ' '); - for(short row = 0; row < newRows && row < rows; row++) - { - char *src = &chars[row * cols]; - char *dst = &newChars[row * newCols]; - std::copy(src, src + std::min(cols, newCols), dst); - } - onscreen.swap(newChars);*/ - onscreen = newChars; - - rows = newRows; - cols = newCols; - - if(upshift) - { - //dirtyRect = Rect { 0, 0, rows, cols }; - //Update(); - Draw(); - } -} diff --git a/Console/ConsoleTest.cc b/Console/ConsoleTest.cc index 66ab24959a..df282fe9aa 100644 --- a/Console/ConsoleTest.cc +++ b/Console/ConsoleTest.cc @@ -1,23 +1,23 @@ -#include "Console.h" +#include "retro/Console.h" #include -namespace Retro +namespace retro { void InitConsole(); } int main() { - Retro::InitConsole(); + retro::InitConsole(); std::string out = "Hello, world.\nEnter \"exit\" to quit.\n"; - Retro::Console::currentInstance->write(out.data(), out.size()); + retro::Console::currentInstance->write(out.data(), out.size()); std::string in; do { - in = Retro::Console::currentInstance->ReadLine(); + in = retro::Console::currentInstance->ReadLine(); out = "You Entered: " + in; - Retro::Console::currentInstance->write(out.data(), out.size()); + retro::Console::currentInstance->write(out.data(), out.size()); } while(in != "exit\n"); return 0; } diff --git a/Console/retro/Console.cc b/Console/retro/Console.cc new file mode 100644 index 0000000000..3fd0a73f0b --- /dev/null +++ b/Console/retro/Console.cc @@ -0,0 +1,403 @@ +/* + Copyright 2012 Wolfgang Thaller. + + This file is part of Retro68. + + Retro68 is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Retro68 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Retro68. If not, see . +*/ + +#include "Console.h" +#include "MacUtils.h" +#include "Fonts.h" +#include "Processes.h" + +#include + +using namespace retro; + +Console *Console::currentInstance = NULL; + +namespace +{ + class FontSetup + { + short saveFont, saveSize; + public: + FontSetup() + { +#if TARGET_API_MAC_CARBON + GrafPtr port; + GetPort(&port); + saveFont = GetPortTextFont(port); + saveSize = GetPortTextSize(port); +#else + saveFont = qd.thePort->txFont; + saveSize = qd.thePort->txSize; +#endif + TextFont(kFontIDMonaco); + TextSize(9); + } + + ~FontSetup() + { + TextFont(saveFont); + TextSize(saveSize); + } + }; +} + +Console::Console() +{ +} + +Console::Console(GrafPtr port, Rect r) +{ + Init(port, r); +} + +Console::~Console() +{ + if(currentInstance == this) + currentInstance = NULL; +} + +void Console::Init(GrafPtr port, Rect r) +{ + consolePort = port; + bounds = r; + + PortSetter setport(consolePort); + FontSetup fontSetup; + + InsetRect(&bounds, 2,2); + + cellSizeY = 12; + cellSizeX = CharWidth('M'); + + rows = (bounds.bottom - bounds.top) / cellSizeY; + cols = (bounds.right - bounds.left) / cellSizeX; + + chars = std::vector(rows*cols, ' '); + + onscreen = chars; + + cursorX = cursorY = 0; +} + +Rect Console::CellRect(short x, short y) +{ + return { (short) (bounds.top + y * cellSizeY), (short) (bounds.left + x * cellSizeX), + (short) (bounds.top + (y+1) * cellSizeY), (short) (bounds.left + (x+1) * cellSizeX) }; +} +void Console::DrawCell(short x, short y, bool erase) +{ + Rect r = CellRect(x,y); + + if(cursorDrawn) + { + if(y == cursorY && x == cursorX) + { + erase = true; + cursorDrawn = false; + } + } + + if(erase) + EraseRect(&r); + MoveTo(r.left, r.bottom - 2); + DrawChar(chars[y * cols + x]); +} + +void Console::DrawCells(short x1, short x2, short y, bool erase) +{ + Rect r = { (short) (bounds.top + y * cellSizeY), (short) (bounds.left + x1 * cellSizeX), + (short) (bounds.top + (y+1) * cellSizeY), (short) (bounds.left + x2 * cellSizeX) }; + + if(cursorDrawn) + { + if(y == cursorY && x1 <= cursorX && x2 > cursorX) + { + erase = true; + cursorDrawn = false; + } + } + + if(erase) + EraseRect(&r); + MoveTo(r.left, r.bottom - 2); + DrawText(&chars[y * cols + x1], 0, x2 - x1); +} + +void Console::Draw(Rect r) +{ + if(!consolePort) + return; + PortSetter setport(consolePort); + FontSetup fontSetup; + + SectRect(&r, &bounds, &r); + + short minRow = std::max(0, (r.top - bounds.top) / cellSizeY); + short maxRow = std::min((int)rows, (r.bottom - bounds.top + cellSizeY - 1) / cellSizeY); + + short minCol = std::max(0, (r.left - bounds.left) / cellSizeX); + short maxCol = std::min((int)cols, (r.right - bounds.left + cellSizeX - 1) / cellSizeX); + + EraseRect(&r); + for(short row = minRow; row < maxRow; ++row) + { + DrawCells(minCol, maxCol, row, false); + } + if(cursorDrawn) + { + Rect cursor = CellRect(cursorX, cursorY); + InvertRect(&cursor); + } + onscreen = chars; +} + +void Console::ScrollUp(short n) +{ + cursorY--; + std::copy(chars.begin() + cols, chars.end(), chars.begin()); + std::fill(chars.end() - cols, chars.end(), ' '); + std::copy(onscreen.begin() + cols, onscreen.end(), onscreen.begin()); + std::fill(onscreen.end() - cols, onscreen.end(), ' '); + RgnHandle rgn = NewRgn(); + ScrollRect(&bounds, 0, -cellSizeY, rgn); + DisposeRgn(rgn); + dirtyRect.top = dirtyRect.top > 0 ? dirtyRect.top - 1 : 0; + dirtyRect.bottom = dirtyRect.bottom > 0 ? dirtyRect.bottom - 1 : 0; +} + + +void Console::PutCharNoUpdate(char c) +{ + InvalidateCursor(); + switch(c) + { + case '\r': + cursorX = 0; + break; + case '\n': + cursorY++; + cursorX = 0; + if(cursorY >= rows) + ScrollUp(); + break; + default: + chars[cursorY * cols + cursorX] = c; + if(dirtyRect.right == 0) + { + dirtyRect.right = (dirtyRect.left = cursorX) + 1; + dirtyRect.bottom = (dirtyRect.top = cursorY) + 1; + } + else + { + dirtyRect.left = std::min(dirtyRect.left, cursorX); + dirtyRect.top = std::min(dirtyRect.top, cursorY); + dirtyRect.right = std::max(dirtyRect.right, short(cursorX + 1)); + dirtyRect.bottom = std::max(dirtyRect.bottom, short(cursorY + 1)); + } + + cursorX++; + if(cursorX >= cols) + PutCharNoUpdate('\n'); + } +} + +void Console::Update() +{ + PortSetter setport(consolePort); + FontSetup fontSetup; + + for(short row = dirtyRect.top; row < dirtyRect.bottom; ++row) + { + short start = -1; + bool needclear = false; + for(short col = dirtyRect.left; col < dirtyRect.right; ++col) + { + char old = onscreen[row * cols + col]; + if(chars[row * cols + col] != old) + { + if(start == -1) + start = col; + if(old != ' ') + needclear = true; + onscreen[row * cols + col] = chars[row * cols + col]; + } + else + { + if(start != -1) + DrawCells(start, col, row, needclear); + start = -1; + needclear = false; + } + } + if(start != -1) + DrawCells(start, dirtyRect.right, row, needclear); + } + dirtyRect = Rect(); + + if(cursorVisible != cursorDrawn) + { + Rect r = CellRect(cursorX, cursorY); + if(cursorDrawn) + DrawCell(cursorX, cursorY, true); + else + InvertRect(&r); + cursorDrawn = !cursorDrawn; + } + +#if TARGET_API_MAC_CARBON + QDFlushPortBuffer(consolePort,NULL); +#endif +} + +void Console::putch(char c) +{ + if(!rows) + return; + PutCharNoUpdate(c); + Update(); +} + +void Console::write(const char *p, int n) +{ + if(!rows) + return; + + for(int i = 0; i < n; i++) + Console::currentInstance->PutCharNoUpdate(*p++); + Update(); +} + + +std::string Console::ReadLine() +{ + if(!consolePort) + return ""; + + std::string buffer; + char c; + + do + { + c = WaitNextChar(); + if(!c) + { + eof = true; + return ""; + } + + if(c == '\r') + c = '\n'; + + if(c == '\b') + { + if(buffer.size()) + { + InvalidateCursor(); + cursorX--; + PutCharNoUpdate(' '); + cursorX--; + Update(); + + buffer.resize(buffer.size()-1); + } + + continue; + } + + putch(c); + buffer.append(1,c); + } while(c != '\n'); + return buffer; +} + +void Console::InvalidateCursor() +{ + if(cursorDrawn) + { + PortSetter setport(consolePort); + + DrawCell(cursorX, cursorY, true); + cursorDrawn = false; + } +} + +void Console::Idle() +{ + long ticks = TickCount(); + if(ticks - blinkTicks > 60) + { + cursorVisible = !cursorVisible; + blinkTicks = ticks; + Update(); + } +} + +void Console::Reshape(Rect newBounds) +{ + if(!consolePort) + return; + + InsetRect(&newBounds, 2,2); + + bounds = newBounds; + short newRows = (bounds.bottom - bounds.top) / cellSizeY; + short newCols = (bounds.right - bounds.left) / cellSizeX; + + short upshift = 0; + if(cursorY >= newRows) + { + upshift = cursorY - (newRows - 1); + + InvalidateCursor(); + cursorY = newRows - 1; + } + + std::vector newChars(newRows*newCols, ' '); + for(short row = 0; row < newRows && row + upshift < rows; row++) + { + char *src = &chars[(row+upshift) * cols]; + char *dst = &newChars[row * newCols]; + std::copy(src, src + std::min(cols, newCols), dst); + } + chars.swap(newChars); + /*newChars = std::vector(newRows*newCols, ' '); + for(short row = 0; row < newRows && row < rows; row++) + { + char *src = &chars[row * cols]; + char *dst = &newChars[row * newCols]; + std::copy(src, src + std::min(cols, newCols), dst); + } + onscreen.swap(newChars);*/ + onscreen = newChars; + + rows = newRows; + cols = newCols; + + if(upshift) + { + //dirtyRect = Rect { 0, 0, rows, cols }; + //Update(); + Draw(); + } +} + +char Console::WaitNextChar() +{ + return 0; +} diff --git a/Console/Console.h b/Console/retro/Console.h similarity index 85% rename from Console/Console.h rename to Console/retro/Console.h index 49cf4ac226..472777ce6c 100644 --- a/Console/Console.h +++ b/Console/retro/Console.h @@ -23,14 +23,17 @@ #include #include -namespace Retro +namespace retro { - class Console { public: + Console(); Console(GrafPtr port, Rect r); ~Console(); + + void Reshape(Rect newBounds); + void Draw(Rect r); void Draw() { Draw(bounds); } void putch(char c); @@ -44,8 +47,10 @@ namespace Retro short GetCols() const { return cols; } void Idle(); + + bool IsEOF() const { return eof; } private: - GrafPtr consolePort; + GrafPtr consolePort = nullptr; Rect bounds; std::vector chars, onscreen; @@ -53,15 +58,16 @@ namespace Retro short cellSizeX; short cellSizeY; - short rows, cols; + short rows = 0, cols = 0; short cursorX, cursorY; - Rect dirtyRect; + Rect dirtyRect = {}; - long blinkTicks; - bool cursorDrawn; - bool cursorVisible; + long blinkTicks = 0; + bool cursorDrawn = false; + bool cursorVisible = true; + bool eof = false; void PutCharNoUpdate(char c); void Update(); @@ -73,13 +79,11 @@ namespace Retro void InvalidateCursor(); - virtual char WaitNextChar() = 0; + virtual char WaitNextChar(); protected: - Console(); void Init(GrafPtr port, Rect r); - void Reshape(Rect newBounds); }; diff --git a/Console/ConsoleWindow.cc b/Console/retro/ConsoleWindow.cc similarity index 79% rename from Console/ConsoleWindow.cc rename to Console/retro/ConsoleWindow.cc index 017f7d74f3..107a7996ad 100644 --- a/Console/ConsoleWindow.cc +++ b/Console/retro/ConsoleWindow.cc @@ -21,7 +21,7 @@ #include "Events.h" #include -using namespace Retro; +using namespace retro; namespace { @@ -30,22 +30,6 @@ namespace ConsoleWindow::ConsoleWindow(Rect r, ConstStr255Param title) { - { - // give MultiFinder a chance to bring the App to front - // see Technote TB 35 - MultiFinder Miscellanea - // "If your application [...] has the canBackground bit set in the - // size resource, then it should call _EventAvail several times - // (or _WaitNextEvent or _GetNextEvent) before putting up the splash - // screen, or the splash screen will come up behind the frontmost - // layer. If the canBackground bit is set, MultiFinder will not move - // your layer to the front until you call _GetNextEvent, - // _WaitNextEvent, or _EventAvail." - - EventRecord event; - for(int i = 0; i < 5; i++) - EventAvail(everyEvent, &event); - } - GrafPtr port; win = NewWindow(NULL, &r, "\pRetro68 Console", true, 0, (WindowPtr)-1, false, 0); diff --git a/Console/ConsoleWindow.h b/Console/retro/ConsoleWindow.h similarity index 98% rename from Console/ConsoleWindow.h rename to Console/retro/ConsoleWindow.h index d2eb81a319..1f27359648 100644 --- a/Console/ConsoleWindow.h +++ b/Console/retro/ConsoleWindow.h @@ -23,7 +23,7 @@ #include "Console.h" -namespace Retro +namespace retro { class ConsoleWindow : public Console { diff --git a/Console/InitConsole.cc b/Console/retro/InitConsole.cc similarity index 64% rename from Console/InitConsole.cc rename to Console/retro/InitConsole.cc index dfd1e74cfa..b7c3f29b4e 100644 --- a/Console/InitConsole.cc +++ b/Console/retro/InitConsole.cc @@ -32,18 +32,19 @@ #include "Console.h" #include "ConsoleWindow.h" -namespace Retro +namespace retro { void InitConsole(); } -using namespace Retro; +using namespace retro; -void Retro::InitConsole() +void retro::InitConsole() { if(Console::currentInstance) return; - + Console::currentInstance = (Console*) -1; + #if !TARGET_API_MAC_CARBON InitGraf(&qd.thePort); InitFonts(); @@ -54,11 +55,26 @@ void Retro::InitConsole() #else Rect r = (*GetMainDevice())->gdRect; #endif + { + // give MultiFinder a chance to bring the App to front + // see Technote TB 35 - MultiFinder Miscellanea + // "If your application [...] has the canBackground bit set in the + // size resource, then it should call _EventAvail several times + // (or _WaitNextEvent or _GetNextEvent) before putting up the splash + // screen, or the splash screen will come up behind the frontmost + // layer. If the canBackground bit is set, MultiFinder will not move + // your layer to the front until you call _GetNextEvent, + // _WaitNextEvent, or _EventAvail." + + EventRecord event; + for(int i = 0; i < 5; i++) + EventAvail(everyEvent, &event); + } r.top += 40; InsetRect(&r, 5,5); - new ConsoleWindow(r, "\pRetro68 Console"); + Console::currentInstance = new ConsoleWindow(r, "\pRetro68 Console"); InitCursor(); } @@ -83,7 +99,9 @@ extern "C" ssize_t _consoleread(int fd, void *buf, size_t count) static std::string consoleBuf; if(consoleBuf.size() == 0) { - consoleBuf = Console::currentInstance->ReadLine() + "\n"; + consoleBuf = Console::currentInstance->ReadLine(); + if(!Console::currentInstance->IsEOF()) + consoleBuf += "\n"; } if(count > consoleBuf.size()) count = consoleBuf.size(); diff --git a/Console/MacUtils.h b/Console/retro/MacUtils.h similarity index 73% rename from Console/MacUtils.h rename to Console/retro/MacUtils.h index 3ed1c8d101..4bff8f907c 100644 --- a/Console/MacUtils.h +++ b/Console/retro/MacUtils.h @@ -20,19 +20,21 @@ #include #include -class PortSetter +namespace retro { - GrafPtr save; -public: - PortSetter(GrafPtr port) - { - ::GetPort(&save); - ::SetPort(port); - } - - ~PortSetter() - { - ::SetPort(save); - } -}; + class PortSetter + { + GrafPtr save; + public: + PortSetter(GrafPtr port) + { + ::GetPort(&save); + ::SetPort(port); + } + ~PortSetter() + { + ::SetPort(save); + } + }; +}