Fixes problem with scroll bar view after first draw

This commit is contained in:
Markus Gans 2019-06-12 11:37:34 +02:00
parent b9ef1200e8
commit 52c5b412f7
15 changed files with 108 additions and 63 deletions

View File

@ -1,3 +1,6 @@
2019-06-12 Markus Gans <guru.mail@muenster.de>
* Fixes problem with scroll bar view after first draw
2019-06-02 Markus Gans <guru.mail@muenster.de> 2019-06-02 Markus Gans <guru.mail@muenster.de>
* Avoid drawing the scroll bars if the widget is non-visible * Avoid drawing the scroll bars if the widget is non-visible

View File

@ -110,10 +110,6 @@ void SegmentView::hexEncoding()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void SegmentView::get7Segment (const wchar_t c) void SegmentView::get7Segment (const wchar_t c)
{ {
sevenSegment& s = code[c];
constexpr char h[2]{' ', '_'};
constexpr char v[2]{' ', '|'};
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
line[i].clear(); line[i].clear();
@ -157,10 +153,17 @@ void SegmentView::get7Segment (const wchar_t c)
default: default:
// Hexadecimal digit from 0 up to f // Hexadecimal digit from 0 up to f
if ( code.find(c) != code.end() )
{
sevenSegment& s = code[c];
constexpr char h[2]{' ', '_'};
constexpr char v[2]{' ', '|'};
line[0] << ' ' << h[s.a] << ' '; line[0] << ' ' << h[s.a] << ' ';
line[1] << v[s.f] << h[s.g] << v[s.b]; line[1] << v[s.f] << h[s.g] << v[s.b];
line[2] << v[s.e] << h[s.d] << v[s.c]; line[2] << v[s.e] << h[s.d] << v[s.c];
} }
}
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@ -832,8 +832,16 @@ void FListBox::draw()
if ( isMonochron() ) if ( isMonochron() )
setReverse(false); setReverse(false);
if ( ! hbar->isShown() && isHorizontallyScrollable() )
hbar->show();
else
vbar->redraw(); vbar->redraw();
if ( ! vbar->isShown() && isVerticallyScrollable() )
vbar->show();
else
hbar->redraw(); hbar->redraw();
drawList(); drawList();
if ( flags.focus && getStatusBar() ) if ( flags.focus && getStatusBar() )

View File

@ -1491,8 +1491,16 @@ void FListView::draw()
if ( isMonochron() ) if ( isMonochron() )
setReverse(false); setReverse(false);
if ( ! hbar->isShown() && isHorizontallyScrollable() )
hbar->show();
else
vbar->redraw(); vbar->redraw();
if ( ! vbar->isShown() && isVerticallyScrollable() )
vbar->show();
else
hbar->redraw(); hbar->redraw();
drawList(); drawList();
if ( flags.focus && getStatusBar() ) if ( flags.focus && getStatusBar() )

View File

@ -75,6 +75,8 @@ void FScrollView::setScrollWidth (std::size_t width)
hbar->setMaximum (int(width - getViewportWidth())); hbar->setMaximum (int(width - getViewportWidth()));
hbar->setPageSize (int(width), int(getViewportWidth())); hbar->setPageSize (int(width), int(getViewportWidth()));
hbar->calculateSliderValues(); hbar->calculateSliderValues();
if ( isShown() )
setHorizontalScrollBarVisibility(); setHorizontalScrollBarVisibility();
} }
@ -102,6 +104,8 @@ void FScrollView::setScrollHeight (std::size_t height)
vbar->setMaximum (int(height - getViewportHeight())); vbar->setMaximum (int(height - getViewportHeight()));
vbar->setPageSize (int(height), int(getViewportHeight())); vbar->setPageSize (int(height), int(getViewportHeight()));
vbar->calculateSliderValues(); vbar->calculateSliderValues();
if ( isShown() )
setVerticalScrollBarVisibility(); setVerticalScrollBarVisibility();
} }
@ -143,12 +147,16 @@ void FScrollView::setScrollSize (const FSize& size)
hbar->setMaximum (int(width - getViewportWidth())); hbar->setMaximum (int(width - getViewportWidth()));
hbar->setPageSize (int(width), int(getViewportWidth())); hbar->setPageSize (int(width), int(getViewportWidth()));
hbar->calculateSliderValues(); hbar->calculateSliderValues();
setHorizontalScrollBarVisibility();
vbar->setMaximum (int(height - getViewportHeight())); vbar->setMaximum (int(height - getViewportHeight()));
vbar->setPageSize (int(height), int(getViewportHeight())); vbar->setPageSize (int(height), int(getViewportHeight()));
vbar->calculateSliderValues(); vbar->calculateSliderValues();
if ( isShown() )
{
setHorizontalScrollBarVisibility();
setVerticalScrollBarVisibility(); setVerticalScrollBarVisibility();
}
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -296,6 +304,8 @@ bool FScrollView::setBorder (bool enable)
void FScrollView::setHorizontalScrollBarMode (fc::scrollBarMode mode) void FScrollView::setHorizontalScrollBarMode (fc::scrollBarMode mode)
{ {
hMode = mode; hMode = mode;
if ( isShown() )
setHorizontalScrollBarVisibility(); setHorizontalScrollBarVisibility();
} }
@ -303,6 +313,8 @@ void FScrollView::setHorizontalScrollBarMode (fc::scrollBarMode mode)
void FScrollView::setVerticalScrollBarMode (fc::scrollBarMode mode) void FScrollView::setVerticalScrollBarMode (fc::scrollBarMode mode)
{ {
vMode = mode; vMode = mode;
if ( isShown() )
setVerticalScrollBarVisibility(); setVerticalScrollBarVisibility();
} }
@ -428,6 +440,13 @@ void FScrollView::draw()
setViewportPrint(); setViewportPrint();
copy2area(); copy2area();
if ( ! hbar->isShown() )
setHorizontalScrollBarVisibility();
if ( ! vbar->isShown() )
setVerticalScrollBarVisibility();
vbar->redraw(); vbar->redraw();
hbar->redraw(); hbar->redraw();
} }
@ -639,7 +658,6 @@ void FScrollView::adjustSize()
hbar->setWidth (width - 2, false); hbar->setWidth (width - 2, false);
hbar->setValue (xoffset); hbar->setValue (xoffset);
hbar->resize(); hbar->resize();
setHorizontalScrollBarVisibility();
vbar->setMaximum (int(getScrollHeight() - getViewportHeight())); vbar->setMaximum (int(getScrollHeight() - getViewportHeight()));
vbar->setPageSize (int(getScrollHeight()), int(getViewportHeight())); vbar->setPageSize (int(getScrollHeight()), int(getViewportHeight()));
@ -647,7 +665,12 @@ void FScrollView::adjustSize()
vbar->setHeight (height - 2, false); vbar->setHeight (height - 2, false);
vbar->setValue (yoffset); vbar->setValue (yoffset);
vbar->resize(); vbar->resize();
if ( isShown() )
{
setHorizontalScrollBarVisibility();
setVerticalScrollBarVisibility(); setVerticalScrollBarVisibility();
}
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -814,9 +837,6 @@ void FScrollView::calculateScrollbarPos()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FScrollView::setHorizontalScrollBarVisibility() void FScrollView::setHorizontalScrollBarVisibility()
{ {
if ( ! isShown() )
return;
switch ( hMode ) switch ( hMode )
{ {
case fc::Auto: case fc::Auto:
@ -839,9 +859,6 @@ void FScrollView::setHorizontalScrollBarVisibility()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FScrollView::setVerticalScrollBarVisibility() void FScrollView::setVerticalScrollBarVisibility()
{ {
if ( ! isShown() )
return;
switch ( vMode ) switch ( vMode )
{ {
case fc::Auto: case fc::Auto:

View File

@ -515,7 +515,7 @@ void FTerm::detectTermSize()
auto& term_geometry = data->getTermGeometry(); auto& term_geometry = data->getTermGeometry();
if ( fsys ) if ( fsys )
ret = fsys->ioControl (fd, TIOCGWINSZ, &win_size); ret = fsys->ioctl (fd, TIOCGWINSZ, &win_size);
else else
ret = -1; ret = -1;
@ -962,7 +962,7 @@ void FTerm::init_global_values (bool disable_alt_screen)
// Preset to false // Preset to false
data->setNewFont(false); data->setNewFont(false);
// Sets alternative screen usage // Sets alternate screen usage
data->useAlternateScreen(! disable_alt_screen); data->useAlternateScreen(! disable_alt_screen);
// Initialize xterm object // Initialize xterm object
@ -1693,6 +1693,8 @@ inline void FTerm::disableApplicationEscKey()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FTerm::useAlternateScreenBuffer() void FTerm::useAlternateScreenBuffer()
{ {
// Switch to the alternate screen
if ( ! hasAlternateScreen() ) if ( ! hasAlternateScreen() )
return; return;
@ -1714,6 +1716,8 @@ void FTerm::useAlternateScreenBuffer()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FTerm::useNormalScreenBuffer() void FTerm::useNormalScreenBuffer()
{ {
// Switch to the normal screen
if ( ! hasAlternateScreen() ) if ( ! hasAlternateScreen() )
return; return;
@ -1880,6 +1884,7 @@ void FTerm::init (bool disable_alt_screen)
// Enter 'keyboard_transmit' mode // Enter 'keyboard_transmit' mode
enableKeypad(); enableKeypad();
// Switch to the alternate screen
useAlternateScreenBuffer(); useAlternateScreenBuffer();
// Enable alternate charset // Enable alternate charset
@ -2032,6 +2037,7 @@ void FTerm::finish()
if ( isXTerminal() ) if ( isXTerminal() )
xterm->metaSendsESC(false); xterm->metaSendsESC(false);
// Switch to the normal screen
useNormalScreenBuffer(); useNormalScreenBuffer();
// leave 'keyboard_transmit' mode // leave 'keyboard_transmit' mode

View File

@ -61,7 +61,7 @@ void FTermFreeBSD::setCursorStyle (CursorStyle style, bool hidden)
if ( hidden ) if ( hidden )
return; return;
fsysten->ioControl (0, CONS_CURSORTYPE, &style); fsysten->ioctl (0, CONS_CURSORTYPE, &style);
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -71,7 +71,7 @@ bool FTermFreeBSD::isFreeBSDConsole()
keymap_t keymap; keymap_t keymap;
if ( fsysten && fsysten->ioControl(0, GIO_KEYMAP, &keymap) == 0 ) if ( fsysten && fsysten->ioctl(0, GIO_KEYMAP, &keymap) == 0 )
return true; return true;
else else
return false; return false;
@ -149,7 +149,7 @@ bool FTermFreeBSD::saveFreeBSDAltKey()
keymap_t keymap; keymap_t keymap;
if ( fsystem ) if ( fsystem )
ret = fsysten->ioControl (0, GIO_KEYMAP, &keymap); ret = fsysten->ioctl (0, GIO_KEYMAP, &keymap);
if ( ret < 0 ) if ( ret < 0 )
return false; return false;
@ -169,7 +169,7 @@ bool FTermFreeBSD::setFreeBSDAltKey (uInt key)
keymap_t keymap; keymap_t keymap;
if ( fsystem ) if ( fsystem )
ret = fsysten->ioControl (0, GIO_KEYMAP, &keymap); ret = fsysten->ioctl (0, GIO_KEYMAP, &keymap);
if ( ret < 0 ) if ( ret < 0 )
return false; return false;
@ -178,7 +178,7 @@ bool FTermFreeBSD::setFreeBSDAltKey (uInt key)
keymap.key[left_alt].map[0] = key; keymap.key[left_alt].map[0] = key;
if ( (keymap.n_keys > 0) if ( (keymap.n_keys > 0)
&& fsystem && (fsysten->ioControl(0, PIO_KEYMAP, &keymap) < 0) ) && fsystem && (fsysten->ioctl(0, PIO_KEYMAP, &keymap) < 0) )
return false; return false;
else else
return true; return true;

View File

@ -230,7 +230,10 @@ uInt FTermios::getBaudRate()
outspeed[B115200] = 115200; // 115,200 baud outspeed[B115200] = 115200; // 115,200 baud
outspeed[B230400] = 230400; // 230,400 baud outspeed[B230400] = 230400; // 230,400 baud
if ( outspeed.find(cfgetospeed(&term_init)) != outspeed.end() )
return outspeed[cfgetospeed(&term_init)]; return outspeed[cfgetospeed(&term_init)];
return 0;
} }
} // namespace finalcut } // namespace finalcut

View File

@ -144,7 +144,7 @@ bool FTermLinux::isLinuxConsole()
// get keyboard type an compare // get keyboard type an compare
return ( fsystem->isTTY(fd_tty) return ( fsystem->isTTY(fd_tty)
&& fsystem->ioControl(fd_tty, KDGKBTYPE, &arg) == 0 && fsystem->ioctl(fd_tty, KDGKBTYPE, &arg) == 0
&& ((arg == KB_101) || (arg == KB_84)) ); && ((arg == KB_101) || (arg == KB_84)) );
} }
@ -496,8 +496,8 @@ int FTermLinux::getFramebuffer_bpp()
return -1; return -1;
} }
if ( ! fsystem->ioControl(fd, FBIOGET_VSCREENINFO, &fb_var) if ( ! fsystem->ioctl(fd, FBIOGET_VSCREENINFO, &fb_var)
&& ! fsystem->ioControl(fd, FBIOGET_FSCREENINFO, &fb_fix) ) && ! fsystem->ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix) )
{ {
fsystem->close(fd); fsystem->close(fd);
return int(fb_var.bits_per_pixel); return int(fb_var.bits_per_pixel);
@ -543,7 +543,7 @@ bool FTermLinux::getScreenFont()
// font operation // font operation
if ( fsystem ) if ( fsystem )
ret = fsystem->ioControl (fd_tty, KDFONTOP, &font); ret = fsystem->ioctl (fd_tty, KDFONTOP, &font);
if ( ret == 0 ) if ( ret == 0 )
{ {
@ -571,7 +571,7 @@ bool FTermLinux::getUnicodeMap()
// get count // get count
if ( fsystem ) if ( fsystem )
ret = fsystem->ioControl (fd_tty, GIO_UNIMAP, &screen_unicode_map); ret = fsystem->ioctl (fd_tty, GIO_UNIMAP, &screen_unicode_map);
if ( ret != 0 ) if ( ret != 0 )
{ {
@ -592,7 +592,7 @@ bool FTermLinux::getUnicodeMap()
// get unicode-to-font mapping from kernel // get unicode-to-font mapping from kernel
if ( fsystem ) if ( fsystem )
ret = fsystem->ioControl (fd_tty, GIO_UNIMAP, &screen_unicode_map); ret = fsystem->ioctl (fd_tty, GIO_UNIMAP, &screen_unicode_map);
if ( ret != 0 ) if ( ret != 0 )
return false; return false;
@ -612,7 +612,7 @@ FTermLinux::modifier_key& FTermLinux::getModifierKey()
std::memset (&mod_key, 0x00, sizeof(mod_key)); std::memset (&mod_key, 0x00, sizeof(mod_key));
// TIOCLINUX, subcode = 6 (TIOCL_GETSHIFTSTATE) // TIOCLINUX, subcode = 6 (TIOCL_GETSHIFTSTATE)
if ( fsystem && fsystem->ioControl(0, TIOCLINUX, &subcode) >= 0 ) if ( fsystem && fsystem->ioctl(0, TIOCLINUX, &subcode) >= 0 )
{ {
if ( subcode & (1 << KG_SHIFT) ) if ( subcode & (1 << KG_SHIFT) )
mod_key.shift = true; mod_key.shift = true;
@ -676,7 +676,7 @@ int FTermLinux::setScreenFont ( uChar fontdata[], uInt count
// font operation // font operation
if ( fsystem ) if ( fsystem )
ret = fsystem->ioControl (fd_tty, KDFONTOP, &font); ret = fsystem->ioctl (fd_tty, KDFONTOP, &font);
if ( ret != 0 && errno != ENOSYS && errno != EINVAL ) if ( ret != 0 && errno != ENOSYS && errno != EINVAL )
{ {
@ -713,14 +713,14 @@ int FTermLinux::setUnicodeMap (struct unimapdesc* unimap)
{ {
// clear the unicode-to-font table // clear the unicode-to-font table
if ( fsystem ) if ( fsystem )
ret = fsystem->ioControl (fd_tty, PIO_UNIMAPCLR, &advice); ret = fsystem->ioctl (fd_tty, PIO_UNIMAPCLR, &advice);
if ( ret != 0 ) if ( ret != 0 )
return -1; return -1;
// put the new unicode-to-font mapping in kernel // put the new unicode-to-font mapping in kernel
if ( fsystem ) if ( fsystem )
ret = fsystem->ioControl (fd_tty, PIO_UNIMAP, unimap); ret = fsystem->ioctl (fd_tty, PIO_UNIMAP, unimap);
if ( ret != 0 ) if ( ret != 0 )
advice.advised_hashlevel++; advice.advised_hashlevel++;
@ -840,7 +840,7 @@ int FTermLinux::setBlinkAsIntensity (bool enable)
return -1; return -1;
// Enable access to VGA I/O ports (from 0x3B4 with num = 0x2C) // Enable access to VGA I/O ports (from 0x3B4 with num = 0x2C)
if ( fsystem->ioControl(fd_tty, KDENABIO, 0) < 0 ) if ( fsystem->ioctl(fd_tty, KDENABIO, 0) < 0 )
return -1; // error on KDENABIO return -1; // error on KDENABIO
if ( enable ) if ( enable )
@ -849,7 +849,7 @@ int FTermLinux::setBlinkAsIntensity (bool enable)
setAttributeMode (getAttributeMode() | 0x08); // set bit 3 setAttributeMode (getAttributeMode() | 0x08); // set bit 3
// Disable access to VGA I/O ports // Disable access to VGA I/O ports
if ( fsystem->ioControl(fd_tty, KDDISABIO, 0) < 0 ) if ( fsystem->ioctl(fd_tty, KDDISABIO, 0) < 0 )
return -1; // error on KDDISABIO return -1; // error on KDDISABIO
return 0; return 0;
@ -869,7 +869,7 @@ bool FTermLinux::setVGAPalette (FColor index, int r, int g, int b)
cmap.color[index].blue = uChar(b); cmap.color[index].blue = uChar(b);
} }
if ( fsystem && fsystem->ioControl (0, PIO_CMAP, &cmap) ) if ( fsystem && fsystem->ioctl (0, PIO_CMAP, &cmap) )
return false; return false;
else else
return true; return true;
@ -880,7 +880,7 @@ bool FTermLinux::saveVGAPalette()
{ {
// Save the current vga color map // Save the current vga color map
if ( fsystem && fsystem->ioControl (0, GIO_CMAP, &saved_color_map) ) if ( fsystem && fsystem->ioctl (0, GIO_CMAP, &saved_color_map) )
has_saved_palette = false; has_saved_palette = false;
else else
has_saved_palette = true; has_saved_palette = true;
@ -898,7 +898,7 @@ bool FTermLinux::resetVGAPalette()
if ( has_saved_palette ) if ( has_saved_palette )
{ {
if ( fsystem->ioControl (0, PIO_CMAP, &saved_color_map) ) if ( fsystem->ioctl (0, PIO_CMAP, &saved_color_map) )
return false; return false;
} }
else else
@ -922,7 +922,7 @@ bool FTermLinux::resetVGAPalette()
cmap.color[index].blue = defaultColor[index].blue; cmap.color[index].blue = defaultColor[index].blue;
} }
if ( fsystem->ioControl (0, PIO_CMAP, &cmap) ) if ( fsystem->ioctl (0, PIO_CMAP, &cmap) )
return false; return false;
} }

View File

@ -47,7 +47,7 @@ bool FTermOpenBSD::isBSDConsole()
static kbd_t kbdencoding; static kbd_t kbdencoding;
if ( fsystem if ( fsystem
&& fsysten->ioControl(0, WSKBDIO_GETENCODING, &kbdencoding) == 0 ) && fsysten->ioctl(0, WSKBDIO_GETENCODING, &kbdencoding) == 0 )
return true; return true;
else else
return false; return false;
@ -92,7 +92,7 @@ bool FTermOpenBSD::saveBSDConsoleEncoding()
int ret = -1; int ret = -1;
if ( fsystem ) if ( fsystem )
ret = fsysten->ioControl (0, WSKBDIO_GETENCODING, &k_encoding); ret = fsysten->ioctl (0, WSKBDIO_GETENCODING, &k_encoding);
if ( ret < 0 ) if ( ret < 0 )
return false; return false;
@ -106,7 +106,7 @@ bool FTermOpenBSD::saveBSDConsoleEncoding()
bool FTermOpenBSD::setBSDConsoleEncoding (kbd_t k_encoding) bool FTermOpenBSD::setBSDConsoleEncoding (kbd_t k_encoding)
{ {
if ( fsysten if ( fsysten
&& fsysten->ioControl(0, WSKBDIO_SETENCODING, &k_encoding) < 0 ) && fsysten->ioctl(0, WSKBDIO_SETENCODING, &k_encoding) < 0 )
return false; return false;
else else
return true; return true;

View File

@ -2797,7 +2797,7 @@ inline void FVTerm::characterFilter (charData*& next_char)
{ {
FTerm::characterSub& sub_map = fterm->getCharSubstitutionMap(); FTerm::characterSub& sub_map = fterm->getCharSubstitutionMap();
if ( sub_map[next_char->encoded_code] ) if ( sub_map.find(next_char->encoded_code) != sub_map.end() )
next_char->encoded_code = sub_map[next_char->encoded_code]; next_char->encoded_code = sub_map[next_char->encoded_code];
} }

View File

@ -511,7 +511,6 @@ class FMouseControl
// Data Member // Data Member
std::map<FMouse::mouse_type, FMouse*> mouse_protocol{}; std::map<FMouse::mouse_type, FMouse*> mouse_protocol{};
std::map<FMouse::mouse_type, FMouse*>::iterator iter{};
FPoint zero_point{0, 0}; FPoint zero_point{0, 0};
bool use_gpm_mouse{false}; bool use_gpm_mouse{false};
bool use_xterm_mouse{false}; bool use_xterm_mouse{false};

View File

@ -60,7 +60,7 @@ class FSystem
virtual uChar inPortByte (uShort) = 0; virtual uChar inPortByte (uShort) = 0;
virtual void outPortByte (uChar, uShort) = 0; virtual void outPortByte (uChar, uShort) = 0;
virtual int isTTY (int) = 0; virtual int isTTY (int) = 0;
virtual int ioControl (int, uLong, ...) = 0; virtual int ioctl (int, uLong, ...) = 0;
virtual int open (const char*, int, ...) = 0; virtual int open (const char*, int, ...) = 0;
virtual int close (int) = 0; virtual int close (int) = 0;
virtual FILE* fopen (const char*, const char*) = 0; virtual FILE* fopen (const char*, const char*) = 0;

View File

@ -99,7 +99,7 @@ class FSystemImpl : public FSystem
return ::isatty(fd); return ::isatty(fd);
} }
virtual int ioControl (int fd, uLong request, ...) virtual int ioctl (int fd, uLong request, ...)
{ {
va_list args; va_list args;
va_start (args, request); va_start (args, request);

View File

@ -159,13 +159,6 @@ class FTermDetection final
// Methods // Methods
static void detect(); static void detect();
// Data Members
#if DEBUG
static char termtype_256color[256];
static char termtype_Answerback[256];
static char termtype_SecDA[256];
#endif
private: private:
// Methods // Methods
static void deallocation(); static void deallocation();
@ -201,6 +194,11 @@ class FTermDetection final
static char* secDA_Analysis_vte (char[]); static char* secDA_Analysis_vte (char[]);
// Data Members // Data Members
#if DEBUG
static char termtype_256color[256];
static char termtype_Answerback[256];
static char termtype_SecDA[256];
#endif
static char termtype[256]; static char termtype[256];
static char ttytypename[256]; static char ttytypename[256];
static bool decscusr_support; static bool decscusr_support;