/** * @author Christian Burger (christian@krikkel.de) */ #include #include #include #include namespace krikkel::NCurses { using std::list; using std::recursive_mutex; using std::scoped_lock; TilingWindowManager::TilingWindowManager(NCursesWindow *rootWindow, recursive_mutex *ncursesMutex) : Window(*rootWindow), ncursesMutex(ncursesMutex) {} void TilingWindowManager::addWindow(Window *window) { stack.push_back(window); visibleStack.push_back(window); } void TilingWindowManager::hideWindow(Window *window) { visibleStack.remove(window); window->hidden = true; } void TilingWindowManager::showWindow(Window *window) { if(!window->hidden) return; list::iterator currentVisibleWindow = visibleStack.begin(); for(Window *currentWindow : stack) { if(currentWindow == window) { visibleStack.insert(currentVisibleWindow, window); window->hidden = false; break; } if(currentWindow != (*currentVisibleWindow)) continue; ++currentVisibleWindow; } } int TilingWindowManager::resize(int rows, int cols) { int result = Window::resize(rows, cols); updateLayout(); return result; } int TilingWindowManager::refresh() { scoped_lock lock(*ncursesMutex); int result = Window::refresh(); for(Window *window : visibleStack) // @todo there are return values; compound them? window->refresh(); return result; } SingleUserInput TilingWindowManager::readSingleUserInput() { return Window::readSingleUserInput(); } void TilingWindowManager::resizeWindow(Window *window, uint16_t height, uint16_t width, uint16_t y, uint16_t x) { window->resize(height, width); window->mvwin(y, x); } }