diff --git a/ChangeLog b/ChangeLog index cb8b40d2..1d8da23e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2017-04-06 Markus Gans + * Change cursor style on a FreeBSD console + 2017-04-05 Markus Gans * Replace non-printable characters for Tera Term and Cygwin terminal directly at start-up. Special cases diff --git a/src/fc.h b/src/fc.h index bd4d3b51..c63600e3 100644 --- a/src/fc.h +++ b/src/fc.h @@ -929,7 +929,7 @@ class fc }; // Linux console and framebuffer cursor style - enum consoleCursorStyle + enum linuxConsoleCursorStyle { default_cursor = 0, invisible_cursor = 1, @@ -940,6 +940,14 @@ class fc full_block_cursor = 6 }; + // BSD console cursor style + enum bsdConsoleCursorStyle + { + normal_cursor = 0, + blink_cursor = 1, + destructive_cursor = 3 + }; + // KDE konsole cursor style enum kdeKonsoleCursorShape { diff --git a/src/flabel.cpp b/src/flabel.cpp index 28ea33d8..747235ac 100644 --- a/src/flabel.cpp +++ b/src/flabel.cpp @@ -229,10 +229,13 @@ void FLabel::onAccel (FAccelEvent* ev) FApplication::queueEvent(focused_widget, &out); accel_widget->setFocus(); + if ( focused_widget ) focused_widget->redraw(); accel_widget->redraw(); + FFocusEvent in (fc::FocusIn_Event); + FApplication::sendEvent(accel_widget, &in); if ( getStatusBar() ) { diff --git a/src/flineedit.cpp b/src/flineedit.cpp index 1a6bc9fe..8835cd09 100644 --- a/src/flineedit.cpp +++ b/src/flineedit.cpp @@ -554,7 +554,7 @@ void FLineEdit::onAccel (FAccelEvent* ev) if ( focused_widget ) focused_widget->redraw(); - + redraw(); if ( getStatusBar() ) diff --git a/src/fterm.cpp b/src/fterm.cpp index d836d280..7244f30d 100644 --- a/src/fterm.cpp +++ b/src/fterm.cpp @@ -109,7 +109,8 @@ bool FTermcap::no_utf8_acs_chars = false; int FTermcap::max_color = 1; int FTermcap::tabstop = 8; int FTermcap::attr_without_color = 0; -fc::consoleCursorStyle FTerm::console_cursor_style; +fc::linuxConsoleCursorStyle FTerm::linux_console_cursor_style; +fc::bsdConsoleCursorStyle FTerm::bsd_console_cursor_style; #if defined(__linux__) console_font_op FTerm::screen_font; @@ -217,13 +218,21 @@ FTerm::modifier_key& FTerm::getModifierKey() return mod_key; } -#endif //---------------------------------------------------------------------- -fc::consoleCursorStyle FTerm::getConsoleCursor() +fc::linuxConsoleCursorStyle FTerm::getLinuxConsoleCursorStyle() { - return console_cursor_style; + return linux_console_cursor_style; } +#endif + +#if defined(BSD) +//---------------------------------------------------------------------- +fc::bsdConsoleCursorStyle FTerm::getBSDConsoleCursorStyle() +{ + return bsd_console_cursor_style; +} +#endif //---------------------------------------------------------------------- bool FTerm::isKeyTimeout (timeval* time, register long timeout) @@ -252,14 +261,17 @@ bool FTerm::isNormal (char_data*& ch) return opti_attr->isNormal(ch); } +#if defined(__linux__) //---------------------------------------------------------------------- -void FTerm::setConsoleCursor (fc::consoleCursorStyle style, bool hidden) +void FTerm::setLinuxConsoleCursorStyle ( fc::linuxConsoleCursorStyle style + , bool hidden ) { // Set cursor style in linux console + if ( ! linux_terminal ) return; - console_cursor_style = style; + linux_console_cursor_style = style; if ( hidden ) return; @@ -267,6 +279,26 @@ void FTerm::setConsoleCursor (fc::consoleCursorStyle style, bool hidden) putstringf (CSI "?%dc", style); std::fflush(stdout); } +#endif + +#if defined(BSD) +//---------------------------------------------------------------------- +void FTerm::setBSDConsoleCursorStyle ( fc::bsdConsoleCursorStyle style + , bool hidden ) +{ + // Set cursor style in a BSD console + + if ( ! isBSDConsole() ) + return; + + bsd_console_cursor_style = style; + + if ( hidden ) + return; + + ioctl(0, CONS_CURSORTYPE, &style); +} +#endif //---------------------------------------------------------------------- void FTerm::setTTY (termios& t) @@ -812,6 +844,7 @@ void FTerm::detectTermSize() void FTerm::setTermSize (int term_width, int term_height) { // Set xterm size to {term_width} x {term_height} + if ( xterm_terminal ) { putstringf (CSI "8;%d;%dt", term_height, term_width); @@ -823,6 +856,7 @@ void FTerm::setTermSize (int term_width, int term_height) void FTerm::setKDECursor (fc::kdeKonsoleCursorShape style) { // Set cursor style in KDE konsole + if ( kde_konsole ) { oscPrefix(); @@ -958,6 +992,12 @@ const FString FTerm::getXTermColorName (int color) void FTerm::setXTermCursorStyle (fc::xtermCursorStyle style) { // Set the xterm cursor style + +#if defined(BSD) + if ( isBSDConsole() ) + return; +#endif + if ( (xterm_terminal || mintty_terminal) && ! (gnome_terminal || kde_konsole) ) { @@ -3563,13 +3603,17 @@ void FTerm::init() } closeConsole(); - setConsoleCursor(fc::underscore_cursor, true); + setLinuxConsoleCursorStyle (fc::underscore_cursor, true); } if ( linux_terminal && getFramebuffer_bpp() >= 4 ) FTermcap::max_color = 16; #endif +#if defined(BSD) + setBSDConsoleCursorStyle (fc::destructive_cursor, true); +#endif + t.c_lflag |= uInt(ICANON | ECHO); tcsetattr(stdin_no, TCSADRAIN, &t); } @@ -3809,12 +3853,13 @@ void FTerm::finish() if ( linux_terminal ) { setBlinkAsIntensity (false); - setConsoleCursor(fc::default_cursor, false); + setLinuxConsoleCursorStyle (fc::default_cursor, false); } #endif #if defined(BSD) resetBSDAlt2Meta(); + setBSDConsoleCursorStyle (fc::normal_cursor, false); #endif if ( kde_konsole ) diff --git a/src/fterm.h b/src/fterm.h index 0769fec7..e49e78db 100644 --- a/src/fterm.h +++ b/src/fterm.h @@ -43,6 +43,7 @@ #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #include #if defined(BSD) + #include #include #endif #endif @@ -120,14 +121,23 @@ class FTerm static int getLineNumber(); static int getColumnNumber(); static const FString getKeyName (int); + #if defined(__linux__) static modifier_key& getModifierKey(); #endif + static char* getTermType(); static char* getTermName(); static int getTabstop(); static int getMaxColor(); - static fc::consoleCursorStyle getConsoleCursor(); + +#if defined(__linux__) + static fc::linuxConsoleCursorStyle getLinuxConsoleCursorStyle(); +#endif + +#if defined(BSD) + static fc::bsdConsoleCursorStyle getBSDConsoleCursorStyle(); +#endif #if DEBUG static const FString& getAnswerbackString(); @@ -166,7 +176,17 @@ class FTerm // Mutators static bool setCursorOptimisation (bool); static void setXTermDefaultColors (bool); - static void setConsoleCursor (fc::consoleCursorStyle, bool); + +#if defined(__linux__) + static void setLinuxConsoleCursorStyle ( fc::linuxConsoleCursorStyle + , bool ); +#endif + +#if defined(BSD) + static void setBSDConsoleCursorStyle ( fc::bsdConsoleCursorStyle + , bool ); +#endif + static void setTTY (termios&); static void noHardwareEcho(); static bool setRawMode (bool); @@ -427,7 +447,8 @@ class FTerm static bool resize_term; static struct termios term_init; - static fc::consoleCursorStyle console_cursor_style; + static fc::linuxConsoleCursorStyle linux_console_cursor_style; + static fc::bsdConsoleCursorStyle bsd_console_cursor_style; static struct console_font_op screen_font; static struct unimapdesc screen_unicode_map; static uChar bsd_alt_keymap; diff --git a/src/fvterm.cpp b/src/fvterm.cpp index 5704033f..e495fdf9 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -138,8 +138,15 @@ bool FVTerm::hideCursor (bool on) flush_out(); +#if defined(__linux__) if ( ! hidden_cursor && isLinuxTerm() ) - setConsoleCursor (getConsoleCursor(), false); + setLinuxConsoleCursorStyle (getLinuxConsoleCursorStyle(), false); +#endif + +#if defined(BSD) + if ( ! hidden_cursor ) + setBSDConsoleCursorStyle (getBSDConsoleCursorStyle(), false); +#endif return hidden_cursor; } @@ -710,7 +717,14 @@ void FVTerm::setInsertCursorStyle (bool on) { setXTermCursorStyle(fc::blinking_underline); setKDECursor(fc::UnderlineCursor); - setConsoleCursor(fc::underscore_cursor, isCursorHidden()); + +#if defined(__linux__) + setLinuxConsoleCursorStyle (fc::underscore_cursor, isCursorHidden()); +#endif + +#if defined(BSD) + setBSDConsoleCursorStyle (fc::destructive_cursor, isCursorHidden()); +#endif if ( isUrxvtTerminal() ) setXTermCursorColor("rgb:ffff/ffff/ffff"); @@ -719,7 +733,14 @@ void FVTerm::setInsertCursorStyle (bool on) { setXTermCursorStyle(fc::steady_block); setKDECursor(fc::BlockCursor); - setConsoleCursor(fc::full_block_cursor, isCursorHidden()); + +#if defined(__linux__) + setLinuxConsoleCursorStyle (fc::full_block_cursor, isCursorHidden()); +#endif + +#if defined(BSD) + setBSDConsoleCursorStyle (fc::normal_cursor, isCursorHidden()); +#endif if ( isUrxvtTerminal() ) setXTermCursorColor("rgb:eeee/0000/0000");