Change cursor style on a FreeBSD console

This commit is contained in:
Markus Gans 2017-04-06 01:31:21 +02:00
parent 7f134ccada
commit 0a581cb58b
7 changed files with 117 additions and 16 deletions

View File

@ -1,3 +1,6 @@
2017-04-06 Markus Gans <guru.mail@muenster.de>
* Change cursor style on a FreeBSD console
2017-04-05 Markus Gans <guru.mail@muenster.de> 2017-04-05 Markus Gans <guru.mail@muenster.de>
* Replace non-printable characters for Tera Term and * Replace non-printable characters for Tera Term and
Cygwin terminal directly at start-up. Special cases Cygwin terminal directly at start-up. Special cases

View File

@ -929,7 +929,7 @@ class fc
}; };
// Linux console and framebuffer cursor style // Linux console and framebuffer cursor style
enum consoleCursorStyle enum linuxConsoleCursorStyle
{ {
default_cursor = 0, default_cursor = 0,
invisible_cursor = 1, invisible_cursor = 1,
@ -940,6 +940,14 @@ class fc
full_block_cursor = 6 full_block_cursor = 6
}; };
// BSD console cursor style
enum bsdConsoleCursorStyle
{
normal_cursor = 0,
blink_cursor = 1,
destructive_cursor = 3
};
// KDE konsole cursor style // KDE konsole cursor style
enum kdeKonsoleCursorShape enum kdeKonsoleCursorShape
{ {

View File

@ -229,10 +229,13 @@ void FLabel::onAccel (FAccelEvent* ev)
FApplication::queueEvent(focused_widget, &out); FApplication::queueEvent(focused_widget, &out);
accel_widget->setFocus(); accel_widget->setFocus();
if ( focused_widget ) if ( focused_widget )
focused_widget->redraw(); focused_widget->redraw();
accel_widget->redraw(); accel_widget->redraw();
FFocusEvent in (fc::FocusIn_Event);
FApplication::sendEvent(accel_widget, &in);
if ( getStatusBar() ) if ( getStatusBar() )
{ {

View File

@ -554,7 +554,7 @@ void FLineEdit::onAccel (FAccelEvent* ev)
if ( focused_widget ) if ( focused_widget )
focused_widget->redraw(); focused_widget->redraw();
redraw(); redraw();
if ( getStatusBar() ) if ( getStatusBar() )

View File

@ -109,7 +109,8 @@ bool FTermcap::no_utf8_acs_chars = false;
int FTermcap::max_color = 1; int FTermcap::max_color = 1;
int FTermcap::tabstop = 8; int FTermcap::tabstop = 8;
int FTermcap::attr_without_color = 0; 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__) #if defined(__linux__)
console_font_op FTerm::screen_font; console_font_op FTerm::screen_font;
@ -217,13 +218,21 @@ FTerm::modifier_key& FTerm::getModifierKey()
return mod_key; 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) bool FTerm::isKeyTimeout (timeval* time, register long timeout)
@ -252,14 +261,17 @@ bool FTerm::isNormal (char_data*& ch)
return opti_attr->isNormal(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 // Set cursor style in linux console
if ( ! linux_terminal ) if ( ! linux_terminal )
return; return;
console_cursor_style = style; linux_console_cursor_style = style;
if ( hidden ) if ( hidden )
return; return;
@ -267,6 +279,26 @@ void FTerm::setConsoleCursor (fc::consoleCursorStyle style, bool hidden)
putstringf (CSI "?%dc", style); putstringf (CSI "?%dc", style);
std::fflush(stdout); 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) void FTerm::setTTY (termios& t)
@ -812,6 +844,7 @@ void FTerm::detectTermSize()
void FTerm::setTermSize (int term_width, int term_height) void FTerm::setTermSize (int term_width, int term_height)
{ {
// Set xterm size to {term_width} x {term_height} // Set xterm size to {term_width} x {term_height}
if ( xterm_terminal ) if ( xterm_terminal )
{ {
putstringf (CSI "8;%d;%dt", term_height, term_width); 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) void FTerm::setKDECursor (fc::kdeKonsoleCursorShape style)
{ {
// Set cursor style in KDE konsole // Set cursor style in KDE konsole
if ( kde_konsole ) if ( kde_konsole )
{ {
oscPrefix(); oscPrefix();
@ -958,6 +992,12 @@ const FString FTerm::getXTermColorName (int color)
void FTerm::setXTermCursorStyle (fc::xtermCursorStyle style) void FTerm::setXTermCursorStyle (fc::xtermCursorStyle style)
{ {
// Set the xterm cursor style // Set the xterm cursor style
#if defined(BSD)
if ( isBSDConsole() )
return;
#endif
if ( (xterm_terminal || mintty_terminal) if ( (xterm_terminal || mintty_terminal)
&& ! (gnome_terminal || kde_konsole) ) && ! (gnome_terminal || kde_konsole) )
{ {
@ -3563,13 +3603,17 @@ void FTerm::init()
} }
closeConsole(); closeConsole();
setConsoleCursor(fc::underscore_cursor, true); setLinuxConsoleCursorStyle (fc::underscore_cursor, true);
} }
if ( linux_terminal && getFramebuffer_bpp() >= 4 ) if ( linux_terminal && getFramebuffer_bpp() >= 4 )
FTermcap::max_color = 16; FTermcap::max_color = 16;
#endif #endif
#if defined(BSD)
setBSDConsoleCursorStyle (fc::destructive_cursor, true);
#endif
t.c_lflag |= uInt(ICANON | ECHO); t.c_lflag |= uInt(ICANON | ECHO);
tcsetattr(stdin_no, TCSADRAIN, &t); tcsetattr(stdin_no, TCSADRAIN, &t);
} }
@ -3809,12 +3853,13 @@ void FTerm::finish()
if ( linux_terminal ) if ( linux_terminal )
{ {
setBlinkAsIntensity (false); setBlinkAsIntensity (false);
setConsoleCursor(fc::default_cursor, false); setLinuxConsoleCursorStyle (fc::default_cursor, false);
} }
#endif #endif
#if defined(BSD) #if defined(BSD)
resetBSDAlt2Meta(); resetBSDAlt2Meta();
setBSDConsoleCursorStyle (fc::normal_cursor, false);
#endif #endif
if ( kde_konsole ) if ( kde_konsole )

View File

@ -43,6 +43,7 @@
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
#include <sys/param.h> #include <sys/param.h>
#if defined(BSD) #if defined(BSD)
#include <sys/consio.h>
#include <sys/kbio.h> #include <sys/kbio.h>
#endif #endif
#endif #endif
@ -120,14 +121,23 @@ class FTerm
static int getLineNumber(); static int getLineNumber();
static int getColumnNumber(); static int getColumnNumber();
static const FString getKeyName (int); static const FString getKeyName (int);
#if defined(__linux__) #if defined(__linux__)
static modifier_key& getModifierKey(); static modifier_key& getModifierKey();
#endif #endif
static char* getTermType(); static char* getTermType();
static char* getTermName(); static char* getTermName();
static int getTabstop(); static int getTabstop();
static int getMaxColor(); 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 #if DEBUG
static const FString& getAnswerbackString(); static const FString& getAnswerbackString();
@ -166,7 +176,17 @@ class FTerm
// Mutators // Mutators
static bool setCursorOptimisation (bool); static bool setCursorOptimisation (bool);
static void setXTermDefaultColors (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 setTTY (termios&);
static void noHardwareEcho(); static void noHardwareEcho();
static bool setRawMode (bool); static bool setRawMode (bool);
@ -427,7 +447,8 @@ class FTerm
static bool resize_term; static bool resize_term;
static struct termios term_init; 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 console_font_op screen_font;
static struct unimapdesc screen_unicode_map; static struct unimapdesc screen_unicode_map;
static uChar bsd_alt_keymap; static uChar bsd_alt_keymap;

View File

@ -138,8 +138,15 @@ bool FVTerm::hideCursor (bool on)
flush_out(); flush_out();
#if defined(__linux__)
if ( ! hidden_cursor && isLinuxTerm() ) if ( ! hidden_cursor && isLinuxTerm() )
setConsoleCursor (getConsoleCursor(), false); setLinuxConsoleCursorStyle (getLinuxConsoleCursorStyle(), false);
#endif
#if defined(BSD)
if ( ! hidden_cursor )
setBSDConsoleCursorStyle (getBSDConsoleCursorStyle(), false);
#endif
return hidden_cursor; return hidden_cursor;
} }
@ -710,7 +717,14 @@ void FVTerm::setInsertCursorStyle (bool on)
{ {
setXTermCursorStyle(fc::blinking_underline); setXTermCursorStyle(fc::blinking_underline);
setKDECursor(fc::UnderlineCursor); 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() ) if ( isUrxvtTerminal() )
setXTermCursorColor("rgb:ffff/ffff/ffff"); setXTermCursorColor("rgb:ffff/ffff/ffff");
@ -719,7 +733,14 @@ void FVTerm::setInsertCursorStyle (bool on)
{ {
setXTermCursorStyle(fc::steady_block); setXTermCursorStyle(fc::steady_block);
setKDECursor(fc::BlockCursor); 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() ) if ( isUrxvtTerminal() )
setXTermCursorColor("rgb:eeee/0000/0000"); setXTermCursorColor("rgb:eeee/0000/0000");