diff --git a/DemoApp.cpp b/DemoApp.cpp index 21a088a..5752dad 100644 --- a/DemoApp.cpp +++ b/DemoApp.cpp @@ -35,18 +35,19 @@ namespace krikkel::NCurses { windowManager = new VerticalTilingWindowManager(Root_Window, &ncursesMutex); + topWindowManager + = new HorizontalTilingWindowManager(new Window(), &ncursesMutex); - dummyWindowTop = new Window(windowManager); + windowManager->addWindow(topWindowManager); ptyWindow = new PtyWindow(&ncursesMutex, 0, 0, 0, 0); windowManager->addWindow(ptyWindow); dummyWindowBottom = new Window(windowManager); windowManager->updateLayout(); windowManager->refresh(); - topWindowManager - = new HorizontalTilingWindowManager(dummyWindowTop, &ncursesMutex); dummyWindowTopLeft = new Window(topWindowManager); dummyWindowTopRight = new Window(topWindowManager); + topWindowManager->updateLayout(); topWindowManager->refresh(); } @@ -93,10 +94,10 @@ namespace krikkel::NCurses windowManager->updateLayout(); break; case KEY_F(1): - if(dummyWindowTop->isHidden()) - windowManager->showWindow(dummyWindowTop); + if(topWindowManager->isHidden()) + windowManager->showWindow(topWindowManager); else - windowManager->hideWindow(dummyWindowTop); + windowManager->hideWindow(topWindowManager); windowManager->updateLayout(); windowManager->refresh(); break; diff --git a/DemoApp.hpp b/DemoApp.hpp index 2cdabbf..1d2470a 100644 --- a/DemoApp.hpp +++ b/DemoApp.hpp @@ -24,7 +24,7 @@ namespace krikkel::NCurses private: VerticalTilingWindowManager *windowManager; HorizontalTilingWindowManager *topWindowManager; - Window *dummyWindowTop, *dummyWindowBottom, *dummyWindowTopLeft, + Window *dummyWindowBottom, *dummyWindowTopLeft, *dummyWindowTopRight; PtyWindow *ptyWindow; std::recursive_mutex ncursesMutex; diff --git a/HorizontalTilingWindowManager.cpp b/HorizontalTilingWindowManager.cpp index e055c73..d429f61 100644 --- a/HorizontalTilingWindowManager.cpp +++ b/HorizontalTilingWindowManager.cpp @@ -19,16 +19,17 @@ namespace krikkel::NCurses void HorizontalTilingWindowManager::updateLayout() { + scoped_lock lock(*ncursesMutex); + size_t stackSize = visibleStack.size(); if(stackSize == 0) { - rootWindow->clear(); + clear(); return; } - scoped_lock lock(*ncursesMutex); - int availableWidth = rootWindow->width(); - int availableHeight = rootWindow->height(); + int availableWidth = width(); + int availableHeight = height(); int windowWidth = availableWidth / stackSize - 1; if((windowWidth + 1) * stackSize < availableWidth) @@ -43,8 +44,8 @@ namespace krikkel::NCurses resizeWindow(*it++, availableHeight, windowWidth, 0, x); x += windowWidth; { - rootWindow->move(0, x++); - rootWindow->vline(availableHeight); + move(0, x++); + vline(availableHeight); } } resizeWindow(*it, availableHeight, availableWidth - x, 0, x); diff --git a/TilingWindowManager.cpp b/TilingWindowManager.cpp index 1e0abf0..e4a7e56 100644 --- a/TilingWindowManager.cpp +++ b/TilingWindowManager.cpp @@ -12,10 +12,9 @@ namespace krikkel::NCurses using std::list; using std::recursive_mutex; using std::scoped_lock; - using std::find; TilingWindowManager::TilingWindowManager(NCursesWindow *rootWindow, recursive_mutex *ncursesMutex) - : rootWindow(new Window(*rootWindow)), ncursesMutex(ncursesMutex) + : Window(*rootWindow), ncursesMutex(ncursesMutex) {} void TilingWindowManager::addWindow(Window *window) @@ -50,18 +49,29 @@ namespace krikkel::NCurses } } - void TilingWindowManager::refresh() + int TilingWindowManager::resize(int rows, int cols) + { + int result = Window::resize(rows, cols); + updateLayout(); + return result; + } + + int TilingWindowManager::refresh() { scoped_lock lock(*ncursesMutex); - rootWindow->refresh(); + int result = Window::refresh(); + for(Window *window : visibleStack) + // @todo there are return values; compound them? window->refresh(); + + return result; } SingleUserInput TilingWindowManager::readSingleUserInput() { - return rootWindow->readSingleUserInput(); + return Window::readSingleUserInput(); } void TilingWindowManager::resizeWindow(Window *window, uint16_t height, uint16_t width, uint16_t y, uint16_t x) diff --git a/VerticalTilingWindowManager.cpp b/VerticalTilingWindowManager.cpp index 53a1348..d186140 100644 --- a/VerticalTilingWindowManager.cpp +++ b/VerticalTilingWindowManager.cpp @@ -19,16 +19,17 @@ namespace krikkel::NCurses void VerticalTilingWindowManager::updateLayout() { + scoped_lock lock(*ncursesMutex); + size_t stackSize = visibleStack.size(); if(stackSize == 0) { - rootWindow->clear(); + clear(); return; } - scoped_lock lock(*ncursesMutex); - int availableWidth = rootWindow->width(); - int availableHeight = rootWindow->height(); + int availableWidth = width(); + int availableHeight = height(); int windowHeight = availableHeight / stackSize - 1; if((windowHeight + 1) * stackSize < availableHeight) @@ -43,8 +44,8 @@ namespace krikkel::NCurses resizeWindow(*it++, windowHeight, availableWidth, y, 0); y += windowHeight; { - rootWindow->move(y++, 0); - rootWindow->hline(availableWidth); + move(y++, 0); + hline(availableWidth); } } resizeWindow(*it, availableHeight - y, availableWidth, y, 0); diff --git a/Window.cpp b/Window.cpp index 1f721b2..d7e1b1a 100644 --- a/Window.cpp +++ b/Window.cpp @@ -7,6 +7,9 @@ namespace krikkel::NCurses { + Window::Window() : NCursesWindow(0, 0, 0, 0) + {} + Window::Window(TilingWindowManager *windowManager) : NCursesWindow(0, 0, 0, 0) { diff --git a/include/kNCurses/TilingWindowManager.hpp b/include/kNCurses/TilingWindowManager.hpp index 7c336ae..94be308 100644 --- a/include/kNCurses/TilingWindowManager.hpp +++ b/include/kNCurses/TilingWindowManager.hpp @@ -6,21 +6,21 @@ #ifndef C51BA18F_0915_43B9_BD5D_129F0CDBC1CD #define C51BA18F_0915_43B9_BD5D_129F0CDBC1CD -#include +#include "Window.hpp" #include #include namespace krikkel::NCurses { - class Window; class SingleUserInput; - class TilingWindowManager + class TilingWindowManager : public Window { public: TilingWindowManager(NCursesWindow *rootWindow, std::recursive_mutex *ncursesMutex); void addWindow(Window *window); - void refresh(); + int resize(int rows, int cols) override; + int refresh() override; virtual void updateLayout() = 0; void hideWindow(Window *window); @@ -28,7 +28,6 @@ namespace krikkel::NCurses SingleUserInput readSingleUserInput(); protected: - Window *rootWindow; std::recursive_mutex *ncursesMutex; std::list stack, visibleStack; diff --git a/include/kNCurses/Window.hpp b/include/kNCurses/Window.hpp index a8ae8b2..d5638a5 100644 --- a/include/kNCurses/Window.hpp +++ b/include/kNCurses/Window.hpp @@ -43,6 +43,7 @@ namespace krikkel::NCurses friend class TilingWindowManager; public: + Window(); Window(TilingWindowManager *windowManager); Window(const NCursesWindow &window); Window(int lines, int columns, int y, int x);