1 /***************************************************************************
2 * Copyright (C) 2008-2016 by Andrzej Rybczak *
3 * electricityispower@gmail.com *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
27 using Global::myScreen
;
28 using Global::myLockedScreen
;
29 using Global::myInactiveScreen
;
31 void drawSeparator(int x
)
33 color_set(Config
.main_color
.pairNumber(), nullptr);
34 mvvline(Global::MainStartY
, x
, 0, Global::MainHeight
);
39 void genericMouseButtonPressed(NC::Window
&w
, MEVENT me
)
41 if (me
.bstate
& BUTTON5_PRESSED
)
43 if (Config
.mouse_list_scroll_whole_page
)
44 w
.scroll(NC::Scroll::PageDown
);
46 for (size_t i
= 0; i
< Config
.lines_scrolled
; ++i
)
47 w
.scroll(NC::Scroll::Down
);
49 else if (me
.bstate
& BUTTON4_PRESSED
)
51 if (Config
.mouse_list_scroll_whole_page
)
52 w
.scroll(NC::Scroll::PageUp
);
54 for (size_t i
= 0; i
< Config
.lines_scrolled
; ++i
)
55 w
.scroll(NC::Scroll::Up
);
59 void scrollpadMouseButtonPressed(NC::Scrollpad
&w
, MEVENT me
)
61 if (me
.bstate
& BUTTON5_PRESSED
)
63 for (size_t i
= 0; i
< Config
.lines_scrolled
; ++i
)
64 w
.scroll(NC::Scroll::Down
);
66 else if (me
.bstate
& BUTTON4_PRESSED
)
68 for (size_t i
= 0; i
< Config
.lines_scrolled
; ++i
)
69 w
.scroll(NC::Scroll::Up
);
73 /***********************************************************************/
75 void BaseScreen::getWindowResizeParams(size_t &x_offset
, size_t &width
, bool adjust_locked_screen
)
79 if (myLockedScreen
&& myInactiveScreen
)
81 size_t locked_width
= COLS
*Config
.locked_screen_width_part
;
82 if (myLockedScreen
== this)
86 width
= COLS
-locked_width
-1;
87 x_offset
= locked_width
+1;
89 if (adjust_locked_screen
)
91 myLockedScreen
->resize();
92 myLockedScreen
->refresh();
93 drawSeparator(x_offset
-1);
99 bool BaseScreen::lock()
101 assert(myLockedScreen
== nullptr);
104 myLockedScreen
= this;
111 void BaseScreen::unlock()
113 if (myInactiveScreen
&& myInactiveScreen
!= myLockedScreen
)
114 myScreen
= myInactiveScreen
;
115 if (myScreen
!= myLockedScreen
)
116 myLockedScreen
->switchTo();
118 myInactiveScreen
= 0;
121 /***********************************************************************/
123 void applyToVisibleWindows(std::function
<void(BaseScreen
*)> f
)
125 if (myLockedScreen
&& myScreen
->isMergable())
127 if (myScreen
== myLockedScreen
)
129 if (myInactiveScreen
)
138 void updateInactiveScreen(BaseScreen
*screen_to_be_set
)
140 if (myInactiveScreen
&& myLockedScreen
!= myInactiveScreen
&& myLockedScreen
== screen_to_be_set
)
142 // if we're here, the following conditions are (or at least should be) met:
143 // 1. screen is split (myInactiveScreen is not null)
144 // 2. current screen (myScreen) is not splittable, ie. is stacked on top of split screens
145 // 3. current screen was activated while master screen was active
146 // 4. we are returning to master screen
147 // in such case we want to keep slave screen visible, so we never set it to null
148 // as in "else" case. we also need to refresh it and redraw separator between
149 // them as stacked screen probably has overwritten part ot it.
150 myInactiveScreen
->refresh();
151 drawSeparator(COLS
*Config
.locked_screen_width_part
);
155 if (myLockedScreen
== screen_to_be_set
)
156 myInactiveScreen
= 0;
158 myInactiveScreen
= myLockedScreen
;
162 bool isVisible(BaseScreen
*screen
)
165 if (myLockedScreen
&& myScreen
->isMergable())
166 return screen
== myScreen
|| screen
== myInactiveScreen
|| screen
== myLockedScreen
;
168 return screen
== myScreen
;