set OpenBSD pitch and duration of the system speaker
This commit is contained in:
parent
5bd46e32ec
commit
bd81fdb069
|
@ -1,3 +1,7 @@
|
||||||
|
2019-08-10 Markus Gans <guru.mail@muenster.de>
|
||||||
|
* Pitch and duration of system speaker can now be changed
|
||||||
|
on OpenBSD
|
||||||
|
|
||||||
2019-08-07 Markus Gans <guru.mail@muenster.de>
|
2019-08-07 Markus Gans <guru.mail@muenster.de>
|
||||||
* Fixes the Cygwin build
|
* Fixes the Cygwin build
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,6 @@ finalcutinclude_HEADERS = \
|
||||||
include/final/fapplication.h \
|
include/final/fapplication.h \
|
||||||
include/final/fbutton.h \
|
include/final/fbutton.h \
|
||||||
include/final/fbuttongroup.h \
|
include/final/fbuttongroup.h \
|
||||||
include/final/fcharmap.h \
|
|
||||||
include/final/fcheckbox.h \
|
include/final/fcheckbox.h \
|
||||||
include/final/fcolorpair.h \
|
include/final/fcolorpair.h \
|
||||||
include/final/fconfig.h \
|
include/final/fconfig.h \
|
||||||
|
|
|
@ -1032,16 +1032,28 @@ void FTerm::setPalette (FColor index, int r, int g, int b)
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
#if defined(__linux__)
|
#if defined(UNIT_TEST)
|
||||||
|
void FTerm::setBeep (int Hz, int ms)
|
||||||
|
{
|
||||||
|
linux->setBeep (Hz, ms);
|
||||||
|
freebsd->setBeep (Hz, ms);
|
||||||
|
openbsd->setBeep (Hz, ms);
|
||||||
|
}
|
||||||
|
#elif defined(__linux__)
|
||||||
void FTerm::setBeep (int Hz, int ms)
|
void FTerm::setBeep (int Hz, int ms)
|
||||||
{
|
{
|
||||||
linux->setBeep (Hz, ms);
|
linux->setBeep (Hz, ms);
|
||||||
}
|
}
|
||||||
#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(UNIT_TEST)
|
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
||||||
void FTerm::setBeep (int Hz, int ms)
|
void FTerm::setBeep (int Hz, int ms)
|
||||||
{
|
{
|
||||||
freebsd->setBeep (Hz, ms);
|
freebsd->setBeep (Hz, ms);
|
||||||
}
|
}
|
||||||
|
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
|
void FTerm::setBeep (int Hz, int ms)
|
||||||
|
{
|
||||||
|
openbsd->setBeep (Hz, ms);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
void FTerm::setBeep (int, int)
|
void FTerm::setBeep (int, int)
|
||||||
{ }
|
{ }
|
||||||
|
@ -1050,10 +1062,16 @@ void FTerm::setBeep (int, int)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FTerm::resetBeep()
|
void FTerm::resetBeep()
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(UNIT_TEST)
|
||||||
linux->resetBeep();
|
linux->resetBeep();
|
||||||
#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(UNIT_TEST)
|
|
||||||
freebsd->resetBeep();
|
freebsd->resetBeep();
|
||||||
|
openbsd->resetBeep();
|
||||||
|
#elif defined(__linux__)
|
||||||
|
linux->resetBeep();
|
||||||
|
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
||||||
|
freebsd->resetBeep();
|
||||||
|
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
|
openbsd->resetBeep();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2327,8 +2345,8 @@ void FTerm::init (bool disable_alt_screen)
|
||||||
if ( init_values.color_change )
|
if ( init_values.color_change )
|
||||||
redefineColorPalette();
|
redefineColorPalette();
|
||||||
|
|
||||||
// Set 200 Hz beep (100 ms)
|
// Set 220 Hz beep (100 ms)
|
||||||
setBeep(200, 100);
|
setBeep(220, 100);
|
||||||
|
|
||||||
// Set FTerm signal handler
|
// Set FTerm signal handler
|
||||||
setSignalHandler();
|
setSignalHandler();
|
||||||
|
|
|
@ -94,11 +94,11 @@ void FTermFreeBSD::setBeep (int Hz, int ms)
|
||||||
if ( ! FTerm::isFreeBSDTerm() )
|
if ( ! FTerm::isFreeBSDTerm() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// range for frequency: 21-32766
|
// Range for frequency: 21-32766
|
||||||
if ( Hz < 21 || Hz > 32766 )
|
if ( Hz < 21 || Hz > 32766 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// range for duration: 0-1999
|
// Range for duration: 0-1999
|
||||||
if ( ms < 0 || ms > 1999 )
|
if ( ms < 0 || ms > 1999 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -115,8 +115,8 @@ void FTermFreeBSD::resetBeep()
|
||||||
if ( ! FTerm::isFreeBSDTerm() )
|
if ( ! FTerm::isFreeBSDTerm() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// default frequency: 1491 Hz
|
// Default frequency: 1491 Hz
|
||||||
// default duration: 50 ms
|
// Default duration: 50 ms
|
||||||
FTerm::putstring (CSI "=800;5B");
|
FTerm::putstring (CSI "=800;5B");
|
||||||
std::fflush(stdout);
|
std::fflush(stdout);
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ void FTermFreeBSD::resetBeep()
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FTermFreeBSD::init()
|
void FTermFreeBSD::init()
|
||||||
{
|
{
|
||||||
// initialize BSD console
|
// Initialize BSD console
|
||||||
|
|
||||||
fsystem = FTerm::getFSystem();
|
fsystem = FTerm::getFSystem();
|
||||||
fterm_data = FTerm::getFTermData();
|
fterm_data = FTerm::getFTermData();
|
||||||
|
@ -134,10 +134,10 @@ void FTermFreeBSD::init()
|
||||||
|
|
||||||
if ( meta_sends_escape )
|
if ( meta_sends_escape )
|
||||||
{
|
{
|
||||||
// save current left alt key mapping
|
// Save current left alt key mapping
|
||||||
saveFreeBSDAltKey();
|
saveFreeBSDAltKey();
|
||||||
|
|
||||||
// map meta key to left alt key
|
// Map meta key to left alt key
|
||||||
setFreeBSDAlt2Meta();
|
setFreeBSDAlt2Meta();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,7 +192,7 @@ bool FTermFreeBSD::saveFreeBSDAltKey()
|
||||||
if ( ret < 0 )
|
if ( ret < 0 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// save current mapping
|
// Save current mapping
|
||||||
bsd_alt_keymap = keymap.key[left_alt].map[0];
|
bsd_alt_keymap = keymap.key[left_alt].map[0];
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,7 +160,7 @@ bool FTermLinux::isLinuxConsole()
|
||||||
char arg = 0;
|
char arg = 0;
|
||||||
int fd_tty = FTerm::getTTYFileDescriptor();
|
int fd_tty = FTerm::getTTYFileDescriptor();
|
||||||
|
|
||||||
// get keyboard type an compare
|
// Get keyboard type an compare
|
||||||
return ( fsystem->isTTY(fd_tty)
|
return ( fsystem->isTTY(fd_tty)
|
||||||
&& fsystem->ioctl(fd_tty, KDGKBTYPE, &arg) == 0
|
&& fsystem->ioctl(fd_tty, KDGKBTYPE, &arg) == 0
|
||||||
&& ((arg == KB_101) || (arg == KB_84)) );
|
&& ((arg == KB_101) || (arg == KB_84)) );
|
||||||
|
@ -169,7 +169,7 @@ bool FTermLinux::isLinuxConsole()
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FTermLinux::init()
|
void FTermLinux::init()
|
||||||
{
|
{
|
||||||
// initialize Linux console
|
// Initialize Linux console
|
||||||
|
|
||||||
if ( ! fsystem )
|
if ( ! fsystem )
|
||||||
fsystem = FTerm::getFSystem();
|
fsystem = FTerm::getFSystem();
|
||||||
|
@ -289,7 +289,7 @@ bool FTermLinux::loadVGAFont()
|
||||||
if ( ret != 0 )
|
if ( ret != 0 )
|
||||||
vga_font = false;
|
vga_font = false;
|
||||||
|
|
||||||
// unicode character mapping
|
// Unicode character mapping
|
||||||
struct unimapdesc unimap;
|
struct unimapdesc unimap;
|
||||||
unimap.entry_ct = uInt16 ( sizeof(fc::unicode_cp437_pairs)
|
unimap.entry_ct = uInt16 ( sizeof(fc::unicode_cp437_pairs)
|
||||||
/ sizeof(unipair) );
|
/ sizeof(unipair) );
|
||||||
|
@ -330,7 +330,7 @@ bool FTermLinux::loadNewFont()
|
||||||
if ( ret != 0 )
|
if ( ret != 0 )
|
||||||
new_font = false;
|
new_font = false;
|
||||||
|
|
||||||
// unicode character mapping
|
// Unicode character mapping
|
||||||
struct unimapdesc unimap;
|
struct unimapdesc unimap;
|
||||||
unimap.entry_ct = uInt16 ( sizeof(fc::unicode_cp437_pairs)
|
unimap.entry_ct = uInt16 ( sizeof(fc::unicode_cp437_pairs)
|
||||||
/ sizeof(unipair) );
|
/ sizeof(unipair) );
|
||||||
|
@ -429,11 +429,11 @@ void FTermLinux::setBeep (int Hz, int ms)
|
||||||
if ( ! FTerm::isLinuxTerm() )
|
if ( ! FTerm::isLinuxTerm() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// range for frequency: 21-32766
|
// Range for frequency: 21-32766
|
||||||
if ( Hz < 21 || Hz > 32766 )
|
if ( Hz < 21 || Hz > 32766 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// range for duration: 0-1999
|
// Range for duration: 0-1999
|
||||||
if ( ms < 0 || ms > 1999 )
|
if ( ms < 0 || ms > 1999 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -449,8 +449,8 @@ void FTermLinux::resetBeep()
|
||||||
if ( ! FTerm::isLinuxTerm() )
|
if ( ! FTerm::isLinuxTerm() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// default frequency: 750 Hz
|
// Default frequency: 750 Hz
|
||||||
// default duration: 125 ms
|
// Default duration: 125 ms
|
||||||
FTerm::putstring ( CSI "10;750]"
|
FTerm::putstring ( CSI "10;750]"
|
||||||
CSI "11;125]" );
|
CSI "11;125]" );
|
||||||
std::fflush(stdout);
|
std::fflush(stdout);
|
||||||
|
@ -550,7 +550,7 @@ bool FTermLinux::getScreenFont()
|
||||||
if ( fd_tty < 0 )
|
if ( fd_tty < 0 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// initialize unused padding bytes in struct
|
// Initialize unused padding bytes in struct
|
||||||
std::memset (&font, 0, sizeof(console_font_op));
|
std::memset (&font, 0, sizeof(console_font_op));
|
||||||
|
|
||||||
font.op = KD_FONT_OP_GET;
|
font.op = KD_FONT_OP_GET;
|
||||||
|
@ -559,7 +559,7 @@ bool FTermLinux::getScreenFont()
|
||||||
font.height = 32;
|
font.height = 32;
|
||||||
font.charcount = 512;
|
font.charcount = 512;
|
||||||
|
|
||||||
// initialize with 0
|
// Initialize with 0
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
static constexpr std::size_t data_size = 4 * 32 * 512;
|
static constexpr std::size_t data_size = 4 * 32 * 512;
|
||||||
|
@ -571,7 +571,7 @@ bool FTermLinux::getScreenFont()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// font operation
|
// Font operation
|
||||||
if ( fsystem )
|
if ( fsystem )
|
||||||
ret = fsystem->ioctl (fd_tty, KDFONTOP, &font);
|
ret = fsystem->ioctl (fd_tty, KDFONTOP, &font);
|
||||||
|
|
||||||
|
@ -602,7 +602,7 @@ bool FTermLinux::getUnicodeMap()
|
||||||
screen_unicode_map.entry_ct = 0;
|
screen_unicode_map.entry_ct = 0;
|
||||||
screen_unicode_map.entries = nullptr;
|
screen_unicode_map.entries = nullptr;
|
||||||
|
|
||||||
// get count
|
// Get count
|
||||||
if ( fsystem )
|
if ( fsystem )
|
||||||
ret = fsystem->ioctl (fd_tty, GIO_UNIMAP, &screen_unicode_map);
|
ret = fsystem->ioctl (fd_tty, GIO_UNIMAP, &screen_unicode_map);
|
||||||
|
|
||||||
|
@ -623,7 +623,7 @@ bool FTermLinux::getUnicodeMap()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get unicode-to-font mapping from kernel
|
// Get unicode-to-font mapping from kernel
|
||||||
if ( fsystem )
|
if ( fsystem )
|
||||||
ret = fsystem->ioctl (fd_tty, GIO_UNIMAP, &screen_unicode_map);
|
ret = fsystem->ioctl (fd_tty, GIO_UNIMAP, &screen_unicode_map);
|
||||||
|
|
||||||
|
@ -641,7 +641,7 @@ FTermLinux::modifier_key& FTermLinux::getModifierKey()
|
||||||
|
|
||||||
char subcode = 6; // Shift state command + return value
|
char subcode = 6; // Shift state command + return value
|
||||||
|
|
||||||
// fill bit field with 0
|
// Fill bit field with 0
|
||||||
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)
|
||||||
|
@ -675,7 +675,7 @@ int FTermLinux::setScreenFont ( uChar fontdata[], uInt count
|
||||||
if ( fd_tty < 0 )
|
if ( fd_tty < 0 )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// initialize unused padding bytes in struct
|
// Initialize unused padding bytes in struct
|
||||||
std::memset (&font, 0x00, sizeof(console_font_op));
|
std::memset (&font, 0x00, sizeof(console_font_op));
|
||||||
|
|
||||||
font.op = KD_FONT_OP_SET;
|
font.op = KD_FONT_OP_SET;
|
||||||
|
@ -693,7 +693,7 @@ int FTermLinux::setScreenFont ( uChar fontdata[], uInt count
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
font.data = new uChar[data_size](); // initialize with 0
|
font.data = new uChar[data_size](); // Initialize with 0
|
||||||
}
|
}
|
||||||
catch (const std::bad_alloc& ex)
|
catch (const std::bad_alloc& ex)
|
||||||
{
|
{
|
||||||
|
@ -707,7 +707,7 @@ int FTermLinux::setScreenFont ( uChar fontdata[], uInt count
|
||||||
, font.height);
|
, font.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
// font operation
|
// Font operation
|
||||||
if ( fsystem )
|
if ( fsystem )
|
||||||
ret = fsystem->ioctl (fd_tty, KDFONTOP, &font);
|
ret = fsystem->ioctl (fd_tty, KDFONTOP, &font);
|
||||||
|
|
||||||
|
@ -744,14 +744,14 @@ int FTermLinux::setUnicodeMap (struct unimapdesc* unimap)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
// clear the unicode-to-font table
|
// Clear the unicode-to-font table
|
||||||
if ( fsystem )
|
if ( fsystem )
|
||||||
ret = fsystem->ioctl (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->ioctl (fd_tty, PIO_UNIMAP, unimap);
|
ret = fsystem->ioctl (fd_tty, PIO_UNIMAP, unimap);
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ bool FTermOpenBSD::isBSDConsole()
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FTermOpenBSD::init()
|
void FTermOpenBSD::init()
|
||||||
{
|
{
|
||||||
// initialize BSD workstation console
|
// Initialize BSD workstation console
|
||||||
|
|
||||||
fsystem = FTerm::getFSystem();
|
fsystem = FTerm::getFSystem();
|
||||||
|
|
||||||
|
@ -70,10 +70,10 @@ void FTermOpenBSD::init()
|
||||||
|
|
||||||
if ( meta_sends_escape )
|
if ( meta_sends_escape )
|
||||||
{
|
{
|
||||||
// save current left alt key mapping
|
// Save current left alt key mapping
|
||||||
saveBSDConsoleEncoding();
|
saveBSDConsoleEncoding();
|
||||||
|
|
||||||
// alt key generate ESC prefix
|
// Alt key generate ESC prefix
|
||||||
setBSDConsoleMetaEsc();
|
setBSDConsoleMetaEsc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,6 +88,52 @@ void FTermOpenBSD::finish()
|
||||||
resetBSDConsoleEncoding();
|
resetBSDConsoleEncoding();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
bool FTermOpenBSD::setBeep (int Hz, int ms)
|
||||||
|
{
|
||||||
|
if ( ! isBSDConsole() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Range for frequency: 21-32766
|
||||||
|
if ( Hz < 21 || Hz > 32766 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Range for duration: 0-1999
|
||||||
|
if ( ms < 0 || ms > 1999 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
wskbd_bell_data bell;
|
||||||
|
bell.which = WSKBD_BELL_DOALL;
|
||||||
|
bell.pitch = Hz;
|
||||||
|
bell.period = ms;
|
||||||
|
bell.volume = 50; // 50% volume
|
||||||
|
|
||||||
|
if ( fsystem && fsystem->ioctl(0, WSKBDIO_SETBELL, &bell) < 0 )
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
bool FTermOpenBSD::resetBeep()
|
||||||
|
{
|
||||||
|
wskbd_bell_data default_bell;
|
||||||
|
|
||||||
|
// Gets the default setting for the bell
|
||||||
|
if ( fsystem
|
||||||
|
&& fsystem->ioctl(0, WSKBDIO_GETDEFAULTBELL, &default_bell) < 0 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
default_bell.which = WSKBD_BELL_DOALL;
|
||||||
|
|
||||||
|
// Sets the bell settings
|
||||||
|
if ( fsystem
|
||||||
|
&& fsystem->ioctl(0, WSKBDIO_SETBELL, &default_bell) < 0 )
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// private methods of FTermOpenBSD
|
// private methods of FTermOpenBSD
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
@ -102,7 +148,7 @@ bool FTermOpenBSD::saveBSDConsoleEncoding()
|
||||||
if ( ret < 0 )
|
if ( ret < 0 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// save current encoding
|
// Save current encoding
|
||||||
bsd_keyboard_encoding = k_encoding;
|
bsd_keyboard_encoding = k_encoding;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -120,7 +166,7 @@ bool FTermOpenBSD::setBSDConsoleEncoding (kbd_t k_encoding)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
bool FTermOpenBSD::setBSDConsoleMetaEsc()
|
bool FTermOpenBSD::setBSDConsoleMetaEsc()
|
||||||
{
|
{
|
||||||
static constexpr kbd_t meta_esc = 0x20; // generate ESC prefix on ALT-key
|
static constexpr kbd_t meta_esc = 0x20; // Generate ESC prefix on ALT-key
|
||||||
|
|
||||||
return setBSDConsoleEncoding (bsd_keyboard_encoding | meta_esc);
|
return setBSDConsoleEncoding (bsd_keyboard_encoding | meta_esc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,22 @@
|
||||||
#if defined(UNIT_TEST)
|
#if defined(UNIT_TEST)
|
||||||
#define WSKBDIO_GETENCODING uInt32(0x4004570F)
|
#define WSKBDIO_GETENCODING uInt32(0x4004570F)
|
||||||
#define WSKBDIO_SETENCODING uInt32(0x80045710)
|
#define WSKBDIO_SETENCODING uInt32(0x80045710)
|
||||||
|
#define WSKBDIO_GETDEFAULTBELL uInt32(0x40105706)
|
||||||
|
#define WSKBDIO_SETBELL uInt32(0x80105703)
|
||||||
|
#define WSKBD_BELL_DOPITCH 0x1 // get/set pitch
|
||||||
|
#define WSKBD_BELL_DOPERIOD 0x2 // get/set period
|
||||||
|
#define WSKBD_BELL_DOVOLUME 0x4 // get/set volume
|
||||||
|
#define WSKBD_BELL_DOALL 0x7 // all of the above
|
||||||
|
|
||||||
typedef uInt32 kbd_t;
|
typedef uInt32 kbd_t;
|
||||||
|
|
||||||
|
struct wskbd_bell_data
|
||||||
|
{
|
||||||
|
uInt which; // values to get/set
|
||||||
|
uInt pitch; // pitch, in Hz
|
||||||
|
uInt period; // period, in milliseconds
|
||||||
|
uInt volume; // percentage of max volume
|
||||||
|
};
|
||||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <dev/wscons/wsconsio.h>
|
#include <dev/wscons/wsconsio.h>
|
||||||
|
@ -87,6 +102,8 @@ class FTermOpenBSD final
|
||||||
// Methods
|
// Methods
|
||||||
static void init();
|
static void init();
|
||||||
static void finish();
|
static void finish();
|
||||||
|
static bool setBeep (int, int);
|
||||||
|
static bool resetBeep();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(UNIT_TEST)
|
#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(UNIT_TEST)
|
||||||
|
|
|
@ -39,6 +39,24 @@
|
||||||
#include <conemu.h>
|
#include <conemu.h>
|
||||||
#include <final/final.h>
|
#include <final/final.h>
|
||||||
|
|
||||||
|
#define CPPUNIT_ASSERT_CSTRING(expected, actual) \
|
||||||
|
check_c_string (expected, actual, CPPUNIT_SOURCELINE())
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void check_c_string ( const char* s1
|
||||||
|
, const char* s2
|
||||||
|
, CppUnit::SourceLine sourceLine )
|
||||||
|
{
|
||||||
|
if ( s1 == 0 && s2 == 0 ) // Strings are equal
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( s1 && s2 && std::strcmp (s1, s2) == 0 ) // Strings are equal
|
||||||
|
return;
|
||||||
|
|
||||||
|
::CppUnit::Asserter::fail ("Strings are not equal", sourceLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
namespace test
|
namespace test
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -1675,38 +1693,47 @@ void FTermLinuxTest::linuxCursorStyleTest()
|
||||||
linux.setCursorStyle (finalcut::fc::default_cursor);
|
linux.setCursorStyle (finalcut::fc::default_cursor);
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?0c" );
|
CPPUNIT_ASSERT ( characters == CSI "?0c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?0c" );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (finalcut::fc::invisible_cursor);
|
linux.setCursorStyle (finalcut::fc::invisible_cursor);
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?1c" );
|
CPPUNIT_ASSERT ( characters == CSI "?1c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::invisible_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::invisible_cursor );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?1c" );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (finalcut::fc::underscore_cursor);
|
linux.setCursorStyle (finalcut::fc::underscore_cursor);
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?2c" );
|
CPPUNIT_ASSERT ( characters == CSI "?2c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?2c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::underscore_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::underscore_cursor );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (finalcut::fc::lower_third_cursor);
|
linux.setCursorStyle (finalcut::fc::lower_third_cursor);
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?3c" );
|
CPPUNIT_ASSERT ( characters == CSI "?3c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?3c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::lower_third_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::lower_third_cursor );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (finalcut::fc::lower_half_cursor);
|
linux.setCursorStyle (finalcut::fc::lower_half_cursor);
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?4c" );
|
CPPUNIT_ASSERT ( characters == CSI "?4c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?4c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::lower_half_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::lower_half_cursor );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (finalcut::fc::two_thirds_cursor);
|
linux.setCursorStyle (finalcut::fc::two_thirds_cursor);
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?5c" );
|
CPPUNIT_ASSERT ( characters == CSI "?5c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?5c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::two_thirds_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::two_thirds_cursor );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (finalcut::fc::full_block_cursor);
|
linux.setCursorStyle (finalcut::fc::full_block_cursor);
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?6c" );
|
CPPUNIT_ASSERT ( characters == CSI "?6c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?6c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::full_block_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::full_block_cursor );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
|
|
||||||
linux.setCursorStyle (finalcut::fc::default_cursor);
|
linux.setCursorStyle (finalcut::fc::default_cursor);
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?0c" );
|
CPPUNIT_ASSERT ( characters == CSI "?0c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?0c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (linux.getCursorStyle());
|
linux.setCursorStyle (linux.getCursorStyle());
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?0c" );
|
CPPUNIT_ASSERT ( characters == CSI "?0c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?0c" );
|
||||||
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor );
|
CPPUNIT_ASSERT ( linux.getCursorStyle() == finalcut::fc::default_cursor );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
data->setCursorHidden (true);
|
data->setCursorHidden (true);
|
||||||
|
@ -1717,6 +1744,7 @@ void FTermLinuxTest::linuxCursorStyleTest()
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (linux.getCursorStyle());
|
linux.setCursorStyle (linux.getCursorStyle());
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?1c" );
|
CPPUNIT_ASSERT ( characters == CSI "?1c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?1c" );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
data->setCursorHidden (true);
|
data->setCursorHidden (true);
|
||||||
linux.setCursorStyle (finalcut::fc::underscore_cursor);
|
linux.setCursorStyle (finalcut::fc::underscore_cursor);
|
||||||
|
@ -1726,6 +1754,7 @@ void FTermLinuxTest::linuxCursorStyleTest()
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (linux.getCursorStyle());
|
linux.setCursorStyle (linux.getCursorStyle());
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?2c" );
|
CPPUNIT_ASSERT ( characters == CSI "?2c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?2c" );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
data->setCursorHidden (true);
|
data->setCursorHidden (true);
|
||||||
linux.setCursorStyle (finalcut::fc::lower_third_cursor);
|
linux.setCursorStyle (finalcut::fc::lower_third_cursor);
|
||||||
|
@ -1735,6 +1764,7 @@ void FTermLinuxTest::linuxCursorStyleTest()
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (linux.getCursorStyle());
|
linux.setCursorStyle (linux.getCursorStyle());
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?3c" );
|
CPPUNIT_ASSERT ( characters == CSI "?3c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?3c" );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
data->setCursorHidden (true);
|
data->setCursorHidden (true);
|
||||||
linux.setCursorStyle (finalcut::fc::lower_half_cursor);
|
linux.setCursorStyle (finalcut::fc::lower_half_cursor);
|
||||||
|
@ -1744,6 +1774,7 @@ void FTermLinuxTest::linuxCursorStyleTest()
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (linux.getCursorStyle());
|
linux.setCursorStyle (linux.getCursorStyle());
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?4c" );
|
CPPUNIT_ASSERT ( characters == CSI "?4c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?4c" );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
data->setCursorHidden (true);
|
data->setCursorHidden (true);
|
||||||
linux.setCursorStyle (finalcut::fc::two_thirds_cursor);
|
linux.setCursorStyle (finalcut::fc::two_thirds_cursor);
|
||||||
|
@ -1753,6 +1784,7 @@ void FTermLinuxTest::linuxCursorStyleTest()
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (linux.getCursorStyle());
|
linux.setCursorStyle (linux.getCursorStyle());
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?5c" );
|
CPPUNIT_ASSERT ( characters == CSI "?5c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?5c" );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
data->setCursorHidden (true);
|
data->setCursorHidden (true);
|
||||||
linux.setCursorStyle (finalcut::fc::full_block_cursor);
|
linux.setCursorStyle (finalcut::fc::full_block_cursor);
|
||||||
|
@ -1762,6 +1794,7 @@ void FTermLinuxTest::linuxCursorStyleTest()
|
||||||
characters.clear();
|
characters.clear();
|
||||||
linux.setCursorStyle (linux.getCursorStyle());
|
linux.setCursorStyle (linux.getCursorStyle());
|
||||||
CPPUNIT_ASSERT ( characters == CSI "?6c" );
|
CPPUNIT_ASSERT ( characters == CSI "?6c" );
|
||||||
|
CPPUNIT_ASSERT_CSTRING ( linux.getCursorStyleString(), CSI "?6c" );
|
||||||
characters.clear();
|
characters.clear();
|
||||||
|
|
||||||
linux.finish();
|
linux.finish();
|
||||||
|
|
|
@ -73,20 +73,22 @@ class FSystemTest : public finalcut::FSystem
|
||||||
virtual ~FSystemTest();
|
virtual ~FSystemTest();
|
||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
uChar inPortByte (uShort) override;
|
uChar inPortByte (uShort) override;
|
||||||
void outPortByte (uChar, uShort) override;
|
void outPortByte (uChar, uShort) override;
|
||||||
int isTTY (int) override;
|
int isTTY (int) override;
|
||||||
int ioctl (int, uLong, ...) override;
|
int ioctl (int, uLong, ...) override;
|
||||||
int open (const char*, int, ...) override;
|
int open (const char*, int, ...) override;
|
||||||
int close (int) override;
|
int close (int) override;
|
||||||
FILE* fopen (const char*, const char*) override;
|
FILE* fopen (const char*, const char*) override;
|
||||||
int fclose (FILE*) override;
|
int fclose (FILE*) override;
|
||||||
int putchar (int) override;
|
int putchar (int) override;
|
||||||
int tputs (const char*, int, int (*)(int)) override;
|
int tputs (const char*, int, int (*)(int)) override;
|
||||||
uid_t getuid() override;
|
uid_t getuid() override;
|
||||||
|
wskbd_bell_data& getBell();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
kbd_t kbdencoding = 512;
|
kbd_t kbdencoding = 512;
|
||||||
|
wskbd_bell_data system_bell;
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
@ -95,6 +97,11 @@ class FSystemTest : public finalcut::FSystem
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
FSystemTest::FSystemTest() // constructor
|
FSystemTest::FSystemTest() // constructor
|
||||||
{
|
{
|
||||||
|
// Initialize bell values
|
||||||
|
system_bell.which = 0;
|
||||||
|
system_bell.pitch = 1500;
|
||||||
|
system_bell.period = 100;
|
||||||
|
system_bell.volume = 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
@ -153,6 +160,43 @@ int FSystemTest::ioctl (int fd, uLong request, ...)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WSKBDIO_GETDEFAULTBELL:
|
||||||
|
{
|
||||||
|
req_string = "WSKBDIO_GETDEFAULTBELL";
|
||||||
|
wskbd_bell_data* spk = static_cast<wskbd_bell_data*>(argp);
|
||||||
|
spk->which = 0;
|
||||||
|
spk->pitch = 1500;
|
||||||
|
spk->period = 100;
|
||||||
|
spk->volume = 50;
|
||||||
|
ret_val = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WSKBDIO_SETBELL:
|
||||||
|
{
|
||||||
|
req_string = "WSKBDIO_SETBELL";
|
||||||
|
wskbd_bell_data* spk = static_cast<wskbd_bell_data*>(argp);
|
||||||
|
|
||||||
|
if ( spk->which & WSKBD_BELL_DOPITCH )
|
||||||
|
system_bell.pitch = spk->pitch;
|
||||||
|
else
|
||||||
|
system_bell.pitch = 1500;
|
||||||
|
|
||||||
|
if ( spk->which & WSKBD_BELL_DOPERIOD )
|
||||||
|
system_bell.period = spk->period;
|
||||||
|
else
|
||||||
|
system_bell.period = 100;
|
||||||
|
|
||||||
|
if ( spk->which & WSKBD_BELL_DOVOLUME )
|
||||||
|
system_bell.volume = spk->volume;
|
||||||
|
else
|
||||||
|
system_bell.volume = 50;
|
||||||
|
|
||||||
|
spk->which = WSKBD_BELL_DOALL;
|
||||||
|
ret_val = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TIOCGWINSZ:
|
case TIOCGWINSZ:
|
||||||
req_string = "TIOCGWINSZ";
|
req_string = "TIOCGWINSZ";
|
||||||
struct winsize* win_size = static_cast<winsize*>(argp);
|
struct winsize* win_size = static_cast<winsize*>(argp);
|
||||||
|
@ -230,6 +274,12 @@ uid_t FSystemTest::getuid()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
wskbd_bell_data& FSystemTest::getBell()
|
||||||
|
{
|
||||||
|
return system_bell;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
|
|
||||||
|
|
||||||
|
@ -441,6 +491,8 @@ void ftermopenbsdTest::openbsdConsoleTest()
|
||||||
unsetenv("KONSOLE_DCOP");
|
unsetenv("KONSOLE_DCOP");
|
||||||
unsetenv("TMUX");
|
unsetenv("TMUX");
|
||||||
|
|
||||||
|
test::FSystemTest* fsystest = static_cast<test::FSystemTest*>(fsys);
|
||||||
|
wskbd_bell_data& speaker = fsystest->getBell();
|
||||||
openbsd.disableMetaSendsEscape();
|
openbsd.disableMetaSendsEscape();
|
||||||
openbsd.init();
|
openbsd.init();
|
||||||
term_detection->detect();
|
term_detection->detect();
|
||||||
|
@ -474,6 +526,34 @@ void ftermopenbsdTest::openbsdConsoleTest()
|
||||||
CPPUNIT_ASSERT ( ! data->hasShadowCharacter() );
|
CPPUNIT_ASSERT ( ! data->hasShadowCharacter() );
|
||||||
CPPUNIT_ASSERT ( ! data->hasHalfBlockCharacter() );
|
CPPUNIT_ASSERT ( ! data->hasHalfBlockCharacter() );
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT ( speaker.pitch == 1500 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.period == 100 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.volume == 50 );
|
||||||
|
openbsd.setBeep (20, 100); // Hz < 21
|
||||||
|
CPPUNIT_ASSERT ( speaker.pitch == 1500 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.period == 100 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.volume == 50 );
|
||||||
|
openbsd.setBeep (32767, 100); // Hz > 32766
|
||||||
|
CPPUNIT_ASSERT ( speaker.pitch == 1500 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.period == 100 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.volume == 50 );
|
||||||
|
openbsd.setBeep (200, -1); // ms < 0
|
||||||
|
CPPUNIT_ASSERT ( speaker.pitch == 1500 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.period == 100 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.volume == 50 );
|
||||||
|
openbsd.setBeep (200, 2000); // ms > 1999
|
||||||
|
CPPUNIT_ASSERT ( speaker.pitch == 1500 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.period == 100 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.volume == 50 );
|
||||||
|
openbsd.setBeep (200, 100); // 200 Hz - 100 ms
|
||||||
|
CPPUNIT_ASSERT ( speaker.pitch == 200 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.period == 100 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.volume == 50 );
|
||||||
|
openbsd.resetBeep();
|
||||||
|
CPPUNIT_ASSERT ( speaker.pitch == 1500 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.period == 100 );
|
||||||
|
CPPUNIT_ASSERT ( speaker.volume == 50 );
|
||||||
|
|
||||||
openbsd.finish();
|
openbsd.finish();
|
||||||
|
|
||||||
closeConEmuStdStreams();
|
closeConEmuStdStreams();
|
||||||
|
|
Loading…
Reference in New Issue