From 08adcbfdc87be5f5c10c716969618589a9d98181 Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Sat, 25 Aug 2012 19:09:32 +0200 Subject: [PATCH] screen: make behavior of locked screens more sensible in a certain case --- src/screen.cpp | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/screen.cpp b/src/screen.cpp index 34363e42..47ffc58d 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -27,6 +27,17 @@ using Global::myScreen; using Global::myLockedScreen; using Global::myInactiveScreen; +namespace +{ + void DrawScreenSeparator(int x) + { + attron(COLOR_PAIR(Config.main_color)); + mvvline(Global::MainStartY, x, 0, Global::MainHeight); + attroff(COLOR_PAIR(Config.main_color)); + refresh(); + } +} + void ApplyToVisibleWindows(void (BasicScreen::*f)()) { if (myLockedScreen && myScreen->isMergable()) @@ -42,9 +53,28 @@ void ApplyToVisibleWindows(void (BasicScreen::*f)()) (myScreen->*f)(); } -void UpdateInactiveScreen(BasicScreen *screen) +void UpdateInactiveScreen(BasicScreen *screen_to_be_set) { - myInactiveScreen = myLockedScreen == screen ? 0 : myLockedScreen; + if (myInactiveScreen && myLockedScreen != myInactiveScreen && myLockedScreen == screen_to_be_set) + { + // if we're here, the following conditions are (or at least should be) met: + // 1. screen is split (myInactiveScreen is not null) + // 2. current screen (myScreen) is not splittable, ie. is stacked on top of split screens + // 3. current screen was activated while master screen was active + // 4. we are returning to master screen + // in such case we want to keep slave screen visible, so we never set it to null + // as in "else" case. we also need to refresh it and redraw separator between + // them as stacked screen probably has overwritten part ot it. + myInactiveScreen->Refresh(); + DrawScreenSeparator(COLS*Config.locked_screen_width_part); + } + else + { + if (myLockedScreen == screen_to_be_set) + myInactiveScreen = 0; + else + myInactiveScreen = myLockedScreen; + } } bool isVisible(BasicScreen *screen) @@ -74,11 +104,7 @@ void BasicScreen::GetWindowResizeParams(size_t &x_offset, size_t &width, bool ad { myLockedScreen->Resize(); myLockedScreen->Refresh(); - - attron(COLOR_PAIR(Config.main_color)); - mvvline(Global::MainStartY, x_offset-1, 0, Global::MainHeight); - attroff(COLOR_PAIR(Config.main_color)); - refresh(); + DrawScreenSeparator(x_offset-1); } } }