Fix overflow errors and allow small terminal sizes (#473)
* In #259 users request the ability to have ncmpcpp remain open when the terminal has a small size. Previously ncmpcpp would exit when there were less than 30 columns or 5 rows. * After removing this constraint, ncmpcpp would freeze when terminal sizes went below those thresholds. * Upon debugging, it became clear that ncmpcpp wasn't frozen, it was stuck in a very long for loop because it thought the display was unreasonably large (resulting from integer overflow). * Preventing that overflow allows ncmpcpp to handle small sizes gracefully. No other changes to the rendering code were necessary. Fixes #259
This commit is contained in:
@@ -124,18 +124,6 @@ size_t HeaderHeight;
|
|||||||
size_t FooterHeight;
|
size_t FooterHeight;
|
||||||
size_t FooterStartY;
|
size_t FooterStartY;
|
||||||
|
|
||||||
void validateScreenSize()
|
|
||||||
{
|
|
||||||
using Global::MainHeight;
|
|
||||||
|
|
||||||
if (COLS < 30 || MainHeight < 5)
|
|
||||||
{
|
|
||||||
NC::destroyScreen();
|
|
||||||
std::cout << "Screen is too small to handle ncmpcpp correctly\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void initializeScreens()
|
void initializeScreens()
|
||||||
{
|
{
|
||||||
myHelp = new Help;
|
myHelp = new Help;
|
||||||
@@ -221,8 +209,6 @@ void resizeScreen(bool reload_main_window)
|
|||||||
|
|
||||||
MainHeight = std::max(LINES-(Config.design == Design::Alternative ? 7 : 4), 0);
|
MainHeight = std::max(LINES-(Config.design == Design::Alternative ? 7 : 4), 0);
|
||||||
|
|
||||||
validateScreenSize();
|
|
||||||
|
|
||||||
if (!Config.header_visibility)
|
if (!Config.header_visibility)
|
||||||
MainHeight += 2;
|
MainHeight += 2;
|
||||||
if (!Config.statusbar_visibility)
|
if (!Config.statusbar_visibility)
|
||||||
|
|||||||
@@ -682,13 +682,16 @@ void Window::moveTo(size_t new_x, size_t new_y)
|
|||||||
|
|
||||||
void Window::adjustDimensions(size_t width, size_t height)
|
void Window::adjustDimensions(size_t width, size_t height)
|
||||||
{
|
{
|
||||||
|
// NOTE: when dimensions get small, integer overflow will cause calls to
|
||||||
|
// `Menu<T>::refresh()` to run for a very long time.
|
||||||
|
|
||||||
if (m_border)
|
if (m_border)
|
||||||
{
|
{
|
||||||
width -= 2;
|
width -= width >= 2 ? 2 : 0;
|
||||||
height -= 2;
|
height -= height >= 2 ? 2 : 0;
|
||||||
}
|
}
|
||||||
if (!m_title.empty())
|
if (!m_title.empty())
|
||||||
height -= 2;
|
height -= height >= 2 ? 2 : 0;
|
||||||
m_height = height;
|
m_height = height;
|
||||||
m_width = width;
|
m_width = width;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user