2009-06-12 14:55:06 +04:00
|
|
|
/*
|
|
|
|
Interface to the terminal controlling library.
|
|
|
|
Slang wrapper.
|
|
|
|
|
|
|
|
Copyright (C) 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
Written by:
|
|
|
|
Andrew Borodin <aborodin@vmail.ru>, 2009.
|
|
|
|
|
|
|
|
This file is part of the Midnight Commander.
|
|
|
|
|
|
|
|
The Midnight Commander is free software; you can redistribute it
|
|
|
|
and/or modify it under the terms of the GNU General Public License as
|
|
|
|
published by the Free Software Foundation; either version 2 of the
|
|
|
|
License, or (at your option) any later version.
|
|
|
|
|
|
|
|
The Midnight Commander is distributed in the hope that it will be
|
|
|
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
|
|
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
|
|
MA 02110-1301, USA.
|
|
|
|
*/
|
2009-05-10 19:01:15 +04:00
|
|
|
|
|
|
|
/** \file
|
|
|
|
* \brief Source: S-Lang-based tty layer of Midnight Commander
|
2009-02-05 21:28:18 +03:00
|
|
|
*/
|
|
|
|
|
1998-02-27 07:54:42 +03:00
|
|
|
#include <config.h>
|
2005-02-08 12:04:03 +03:00
|
|
|
|
1998-02-27 07:54:42 +03:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2005-02-08 12:04:03 +03:00
|
|
|
#ifdef HAVE_TERMIOS_H
|
|
|
|
#include <termios.h>
|
|
|
|
#endif
|
2009-05-10 19:01:15 +04:00
|
|
|
#include <sys/types.h> /* size_t */
|
2009-08-06 13:17:01 +04:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <signal.h>
|
2005-02-08 12:04:03 +03:00
|
|
|
|
2009-05-08 14:01:05 +04:00
|
|
|
#include "../../src/global.h"
|
|
|
|
|
2009-07-12 14:22:41 +04:00
|
|
|
#include "../../src/tty/tty-internal.h" /* slow_tty */
|
2009-09-14 17:43:03 +04:00
|
|
|
#include "../../src/tty/tty.h"
|
2009-05-14 19:18:03 +04:00
|
|
|
#include "../../src/tty/color-slang.h"
|
2009-05-13 17:05:55 +04:00
|
|
|
#include "../../src/tty/color-internal.h"
|
2009-05-08 14:01:05 +04:00
|
|
|
#include "../../src/tty/mouse.h" /* Gpm_Event is required in key.h */
|
|
|
|
#include "../../src/tty/key.h" /* define_sequence */
|
2009-05-13 17:05:55 +04:00
|
|
|
#include "../../src/tty/win.h"
|
2009-05-08 14:01:05 +04:00
|
|
|
|
2009-05-10 19:01:15 +04:00
|
|
|
#include "../../src/strutil.h" /* str_term_form */
|
1998-02-27 07:54:42 +03:00
|
|
|
|
2009-05-10 19:01:15 +04:00
|
|
|
/*** global variables **************************************************/
|
2009-05-31 16:23:10 +04:00
|
|
|
extern int reset_hp_softkeys;
|
2009-05-10 19:01:15 +04:00
|
|
|
|
|
|
|
/*** file scope macro definitions **************************************/
|
1998-02-27 07:54:42 +03:00
|
|
|
|
|
|
|
/* Taken from S-Lang's slutty.c */
|
|
|
|
#ifdef ultrix /* Ultrix gets _POSIX_VDISABLE wrong! */
|
2009-05-10 19:01:15 +04:00
|
|
|
# define NULL_VALUE -1
|
1998-02-27 07:54:42 +03:00
|
|
|
#else
|
2009-05-10 19:01:15 +04:00
|
|
|
# ifdef _POSIX_VDISABLE
|
|
|
|
# define NULL_VALUE _POSIX_VDISABLE
|
|
|
|
# else
|
|
|
|
# define NULL_VALUE 255
|
|
|
|
# endif
|
|
|
|
#endif /* ultrix */
|
1998-02-27 07:54:42 +03:00
|
|
|
|
|
|
|
#ifndef SA_RESTART
|
2009-05-10 19:01:15 +04:00
|
|
|
# define SA_RESTART 0
|
1998-02-27 07:54:42 +03:00
|
|
|
#endif
|
|
|
|
|
2009-08-09 16:55:02 +04:00
|
|
|
#ifndef SLTT_MAX_SCREEN_COLS
|
|
|
|
#define SLTT_MAX_SCREEN_COLS 512
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef SLTT_MAX_SCREEN_ROWS
|
|
|
|
#define SLTT_MAX_SCREEN_ROWS 512
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2009-05-10 19:01:15 +04:00
|
|
|
/*** file scope type declarations **************************************/
|
|
|
|
|
|
|
|
/*** file scope variables **********************************************/
|
|
|
|
|
1998-02-27 07:54:42 +03:00
|
|
|
/* Various saved termios settings that we control here */
|
|
|
|
static struct termios boot_mode;
|
|
|
|
static struct termios new_mode;
|
|
|
|
|
2009-06-19 21:33:41 +04:00
|
|
|
/* Controls whether we should wait for input in tty_lowlevel_getch */
|
2009-05-31 16:23:10 +04:00
|
|
|
static gboolean no_slang_delay;
|
1998-02-27 07:54:42 +03:00
|
|
|
|
2009-05-10 19:01:15 +04:00
|
|
|
/* This table describes which capabilities we want and which values we
|
|
|
|
* assign to them.
|
|
|
|
*/
|
|
|
|
static const struct {
|
|
|
|
int key_code;
|
|
|
|
const char *key_name;
|
|
|
|
} key_table [] = {
|
|
|
|
{ KEY_F(0), "k0" },
|
|
|
|
{ KEY_F(1), "k1" },
|
|
|
|
{ KEY_F(2), "k2" },
|
|
|
|
{ KEY_F(3), "k3" },
|
|
|
|
{ KEY_F(4), "k4" },
|
|
|
|
{ KEY_F(5), "k5" },
|
|
|
|
{ KEY_F(6), "k6" },
|
|
|
|
{ KEY_F(7), "k7" },
|
|
|
|
{ KEY_F(8), "k8" },
|
|
|
|
{ KEY_F(9), "k9" },
|
|
|
|
{ KEY_F(10), "k;" },
|
|
|
|
{ KEY_F(11), "F1" },
|
|
|
|
{ KEY_F(12), "F2" },
|
|
|
|
{ KEY_F(13), "F3" },
|
|
|
|
{ KEY_F(14), "F4" },
|
|
|
|
{ KEY_F(15), "F5" },
|
|
|
|
{ KEY_F(16), "F6" },
|
|
|
|
{ KEY_F(17), "F7" },
|
|
|
|
{ KEY_F(18), "F8" },
|
|
|
|
{ KEY_F(19), "F9" },
|
|
|
|
{ KEY_F(20), "FA" },
|
|
|
|
{ KEY_IC, "kI" },
|
|
|
|
{ KEY_NPAGE, "kN" },
|
|
|
|
{ KEY_PPAGE, "kP" },
|
|
|
|
{ KEY_LEFT, "kl" },
|
|
|
|
{ KEY_RIGHT, "kr" },
|
|
|
|
{ KEY_UP, "ku" },
|
|
|
|
{ KEY_DOWN, "kd" },
|
|
|
|
{ KEY_DC, "kD" },
|
|
|
|
{ KEY_BACKSPACE, "kb" },
|
|
|
|
{ KEY_HOME, "kh" },
|
|
|
|
{ KEY_END, "@7" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
/*** file scope functions **********************************************/
|
2005-03-19 22:31:23 +03:00
|
|
|
|
2009-05-10 19:01:15 +04:00
|
|
|
/* HP Terminals have capabilities (pfkey, pfloc, pfx) to program function keys.
|
|
|
|
elm 2.4pl15 invoked with the -K option utilizes these softkeys and the
|
|
|
|
consequence is that function keys don't work in MC sometimes...
|
|
|
|
Unfortunately I don't now the one and only escape sequence to turn off.
|
|
|
|
softkeys (elm uses three different capabilities to turn on softkeys and two.
|
|
|
|
capabilities to turn them off)..
|
|
|
|
Among other things elm uses the pair we already use in slang_keypad. That's.
|
|
|
|
the reason why I call slang_reset_softkeys from slang_keypad. In lack of
|
|
|
|
something better the softkeys are programmed to their defaults from the
|
|
|
|
termcap/terminfo database.
|
|
|
|
The escape sequence to program the softkeys is taken from elm and it is.
|
|
|
|
hardcoded because neither slang nor ncurses 4.1 know how to 'printf' this.
|
|
|
|
sequence. -- Norbert
|
|
|
|
*/
|
|
|
|
|
|
|
|
static void
|
|
|
|
slang_reset_softkeys (void)
|
|
|
|
{
|
|
|
|
int key;
|
|
|
|
char *send;
|
|
|
|
static const char display[] = " ";
|
|
|
|
char tmp[BUF_SMALL];
|
|
|
|
|
|
|
|
for (key = 1; key < 9; key++) {
|
|
|
|
g_snprintf (tmp, sizeof (tmp), "k%d", key);
|
|
|
|
send = (char *) SLtt_tgetstr (tmp);
|
|
|
|
if (send != NULL) {
|
|
|
|
g_snprintf (tmp, sizeof (tmp), "\033&f%dk%dd%dL%s%s", key,
|
|
|
|
(int) (sizeof (display) - 1), (int) strlen (send),
|
|
|
|
display, send);
|
|
|
|
SLtt_write_string (tmp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
do_define_key (int code, const char *strcap)
|
|
|
|
{
|
|
|
|
char *seq;
|
|
|
|
|
|
|
|
seq = (char *) SLtt_tgetstr ((char *) strcap);
|
|
|
|
if (seq != NULL)
|
|
|
|
define_sequence (code, seq, MCKEY_NOACTION);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
load_terminfo_keys (void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; key_table [i].key_code; i++)
|
|
|
|
do_define_key (key_table [i].key_code, key_table [i].key_name);
|
2009-02-04 22:37:00 +03:00
|
|
|
}
|
|
|
|
|
2009-09-14 17:43:03 +04:00
|
|
|
static char *
|
|
|
|
mc_tty_normalize_from_utf8 (const char *str)
|
|
|
|
{
|
|
|
|
GIConv conv;
|
|
|
|
GString *buffer;
|
|
|
|
const char *_system_codepage = str_detect_termencoding();
|
|
|
|
|
|
|
|
if (str_isutf8 (_system_codepage))
|
|
|
|
return g_strdup(str);
|
|
|
|
|
|
|
|
conv = g_iconv_open (_system_codepage, "UTF-8");
|
|
|
|
if (conv == INVALID_CONV)
|
|
|
|
return g_strdup(str);
|
|
|
|
|
|
|
|
buffer = g_string_new ("");
|
|
|
|
|
|
|
|
if (str_convert (conv, str, buffer) == ESTR_FAILURE)
|
|
|
|
{
|
|
|
|
g_string_free(buffer, TRUE);
|
|
|
|
str_close_conv (conv);
|
|
|
|
return g_strdup(str);
|
|
|
|
}
|
|
|
|
str_close_conv (conv);
|
|
|
|
|
|
|
|
return g_string_free(buffer, FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------- */
|
2009-05-10 19:01:15 +04:00
|
|
|
/*** public functions **************************************************/
|
2009-09-14 17:43:03 +04:00
|
|
|
/* --------------------------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
int
|
|
|
|
mc_tty_normalize_lines_char(const char *str)
|
|
|
|
{
|
|
|
|
char *str2;
|
|
|
|
int res;
|
|
|
|
|
|
|
|
if (!str)
|
|
|
|
return (int) ' ';
|
|
|
|
str2 = mc_tty_normalize_from_utf8 (str);
|
|
|
|
res = g_utf8_get_char_validated (str2, -1);
|
|
|
|
|
|
|
|
if (res < 0)
|
|
|
|
res = (unsigned char) str2[0];
|
|
|
|
g_free(str2);
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
2009-05-10 19:01:15 +04:00
|
|
|
|
2009-09-14 17:43:03 +04:00
|
|
|
/* --------------------------------------------------------------------------------------------- */
|
2009-06-02 21:40:37 +04:00
|
|
|
void
|
2009-07-12 14:22:41 +04:00
|
|
|
tty_init (gboolean slow, gboolean ugly_lines)
|
2009-06-02 21:40:37 +04:00
|
|
|
{
|
2009-07-12 14:22:41 +04:00
|
|
|
slow_tty = slow;
|
2009-08-24 00:42:28 +04:00
|
|
|
ugly_line_drawing = ugly_lines;
|
2009-06-02 21:40:37 +04:00
|
|
|
|
1998-02-27 07:54:42 +03:00
|
|
|
SLtt_get_terminfo ();
|
2008-12-29 01:45:06 +03:00
|
|
|
SLutf8_enable (-1);
|
2001-06-13 10:53:08 +04:00
|
|
|
/*
|
|
|
|
* If the terminal in not in terminfo but begins with a well-known
|
|
|
|
* string such as "linux" or "xterm" S-Lang will go on, but the
|
|
|
|
* terminal size and several other variables won't be initialized
|
|
|
|
* (as of S-Lang 1.4.4). Detect it and abort. Also detect extremely
|
|
|
|
* small, large and negative screen dimensions.
|
|
|
|
*/
|
2009-05-10 19:01:15 +04:00
|
|
|
if ((COLS < 10) || (LINES < 5)
|
2009-08-09 16:55:02 +04:00
|
|
|
|| (COLS > SLTT_MAX_SCREEN_COLS) || (LINES > SLTT_MAX_SCREEN_ROWS)) {
|
2001-06-13 10:53:08 +04:00
|
|
|
fprintf (stderr,
|
2009-05-10 19:01:15 +04:00
|
|
|
_("Screen size %dx%d is not supported.\n"
|
|
|
|
"Check the TERM environment variable.\n"),
|
|
|
|
COLS, LINES);
|
2001-06-13 10:53:08 +04:00
|
|
|
exit (1);
|
|
|
|
}
|
|
|
|
|
1998-02-27 07:54:42 +03:00
|
|
|
tcgetattr (fileno (stdin), &boot_mode);
|
|
|
|
/* 255 = ignore abort char; XCTRL('g') for abort char = ^g */
|
2009-05-10 19:01:15 +04:00
|
|
|
SLang_init_tty (XCTRL('c'), 1, 0);
|
|
|
|
|
2009-07-12 14:22:41 +04:00
|
|
|
if (ugly_lines)
|
|
|
|
SLtt_Has_Alt_Charset = 0;
|
|
|
|
|
1998-02-27 07:54:42 +03:00
|
|
|
/* If SLang uses fileno(stderr) for terminal input MC will hang
|
|
|
|
if we call SLang_getkey between calls to open_error_pipe and
|
|
|
|
close_error_pipe, e.g. when we do a growing view of an gzipped
|
|
|
|
file. */
|
|
|
|
if (SLang_TT_Read_FD == fileno (stderr))
|
|
|
|
SLang_TT_Read_FD = fileno (stdin);
|
|
|
|
|
|
|
|
if (tcgetattr (SLang_TT_Read_FD, &new_mode) == 0) {
|
|
|
|
#ifdef VDSUSP
|
2009-05-10 19:01:15 +04:00
|
|
|
new_mode.c_cc[VDSUSP] = NULL_VALUE; /* to ignore ^Y */
|
1998-02-27 07:54:42 +03:00
|
|
|
#endif
|
|
|
|
#ifdef VLNEXT
|
2009-05-10 19:01:15 +04:00
|
|
|
new_mode.c_cc[VLNEXT] = NULL_VALUE; /* to ignore ^V */
|
1998-02-27 07:54:42 +03:00
|
|
|
#endif
|
|
|
|
tcsetattr (SLang_TT_Read_FD, TCSADRAIN, &new_mode);
|
|
|
|
}
|
2009-05-10 19:01:15 +04:00
|
|
|
|
2009-05-31 16:23:10 +04:00
|
|
|
tty_reset_prog_mode ();
|
1998-02-27 07:54:42 +03:00
|
|
|
load_terminfo_keys ();
|
|
|
|
SLtt_Blink_Mode = 0;
|
2009-06-08 15:59:04 +04:00
|
|
|
|
2009-08-04 22:06:26 +04:00
|
|
|
tty_start_interrupt_key ();
|
|
|
|
|
2009-06-08 15:59:04 +04:00
|
|
|
/* It's the small part from the previous init_key() */
|
|
|
|
init_key_input_fd ();
|
2009-07-12 14:22:41 +04:00
|
|
|
|
|
|
|
SLsmg_init_smg ();
|
|
|
|
do_enter_ca_mode ();
|
|
|
|
tty_keypad (TRUE);
|
|
|
|
tty_nodelay (FALSE);
|
1998-02-27 07:54:42 +03:00
|
|
|
}
|
|
|
|
|
2009-06-02 21:40:37 +04:00
|
|
|
void
|
|
|
|
tty_shutdown (void)
|
|
|
|
{
|
|
|
|
char *op_cap;
|
|
|
|
|
|
|
|
SLsmg_reset_smg ();
|
|
|
|
tty_reset_shell_mode ();
|
|
|
|
do_exit_ca_mode ();
|
|
|
|
SLang_reset_tty ();
|
|
|
|
|
|
|
|
/* Load the op capability to reset the colors to those that were
|
|
|
|
* active when the program was started up
|
|
|
|
*/
|
|
|
|
op_cap = SLtt_tgetstr ((char *) "op");
|
|
|
|
if (op_cap != NULL){
|
|
|
|
fputs (op_cap, stdout);
|
|
|
|
fflush (stdout);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-05-31 16:23:10 +04:00
|
|
|
/* Done each time we come back from done mode */
|
|
|
|
void
|
|
|
|
tty_reset_prog_mode (void)
|
|
|
|
{
|
|
|
|
tcsetattr (SLang_TT_Read_FD, TCSANOW, &new_mode);
|
|
|
|
SLsmg_init_smg ();
|
|
|
|
SLsmg_touch_lines (0, LINES);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Called each time we want to shutdown slang screen manager */
|
|
|
|
void
|
|
|
|
tty_reset_shell_mode (void)
|
|
|
|
{
|
|
|
|
tcsetattr (SLang_TT_Read_FD, TCSANOW, &boot_mode);
|
|
|
|
}
|
|
|
|
|
1998-02-27 07:54:42 +03:00
|
|
|
void
|
2009-05-19 20:12:29 +04:00
|
|
|
tty_raw_mode (void)
|
1998-02-27 07:54:42 +03:00
|
|
|
{
|
|
|
|
tcsetattr (SLang_TT_Read_FD, TCSANOW, &new_mode);
|
|
|
|
}
|
|
|
|
|
2009-05-19 20:12:29 +04:00
|
|
|
void
|
|
|
|
tty_noraw_mode (void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2009-06-02 21:40:37 +04:00
|
|
|
void
|
|
|
|
tty_noecho (void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
tty_flush_input (void)
|
|
|
|
{
|
|
|
|
return 0; /* OK */
|
|
|
|
}
|
|
|
|
|
1998-02-27 07:54:42 +03:00
|
|
|
void
|
2009-05-31 16:23:10 +04:00
|
|
|
tty_keypad (gboolean set)
|
1998-02-27 07:54:42 +03:00
|
|
|
{
|
2009-05-31 16:23:10 +04:00
|
|
|
char *keypad_string;
|
|
|
|
|
|
|
|
keypad_string = (char *) SLtt_tgetstr ((char *) (set ? "ks" : "ke"));
|
|
|
|
if (keypad_string != NULL)
|
|
|
|
SLtt_write_string (keypad_string);
|
|
|
|
if (set && reset_hp_softkeys)
|
|
|
|
slang_reset_softkeys ();
|
1998-02-27 07:54:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2009-05-31 16:23:10 +04:00
|
|
|
tty_nodelay (gboolean set)
|
1998-02-27 07:54:42 +03:00
|
|
|
{
|
2009-05-31 16:23:10 +04:00
|
|
|
no_slang_delay = set;
|
1998-02-27 07:54:42 +03:00
|
|
|
}
|
|
|
|
|
2009-06-02 08:55:07 +04:00
|
|
|
int
|
|
|
|
tty_baudrate (void)
|
|
|
|
{
|
|
|
|
return SLang_TT_Baud_Rate;
|
|
|
|
}
|
|
|
|
|
2002-11-29 00:35:49 +03:00
|
|
|
int
|
2009-06-19 21:33:41 +04:00
|
|
|
tty_lowlevel_getch (void)
|
1998-02-27 07:54:42 +03:00
|
|
|
{
|
1999-04-13 23:21:03 +04:00
|
|
|
int c;
|
2009-05-10 19:01:15 +04:00
|
|
|
|
2009-08-09 16:55:02 +04:00
|
|
|
if (no_slang_delay && (SLang_input_pending (0) == 0))
|
2009-05-10 19:01:15 +04:00
|
|
|
return -1;
|
1998-02-27 07:54:42 +03:00
|
|
|
|
2009-08-09 16:55:02 +04:00
|
|
|
c = SLang_getkey ();
|
1999-04-13 23:21:03 +04:00
|
|
|
if (c == SLANG_GETKEY_ERROR) {
|
2002-11-29 00:35:49 +03:00
|
|
|
fprintf (stderr,
|
2009-05-10 19:01:15 +04:00
|
|
|
"SLang_getkey returned SLANG_GETKEY_ERROR\n"
|
|
|
|
"Assuming EOF on stdin and exiting\n");
|
2003-02-03 21:00:34 +03:00
|
|
|
exit (1);
|
1999-04-13 23:21:03 +04:00
|
|
|
}
|
2009-05-10 19:01:15 +04:00
|
|
|
|
2002-11-29 00:35:49 +03:00
|
|
|
return c;
|
1998-02-27 07:54:42 +03:00
|
|
|
}
|
2009-05-10 19:01:15 +04:00
|
|
|
|
2009-06-02 21:40:37 +04:00
|
|
|
int
|
|
|
|
tty_reset_screen (void)
|
|
|
|
{
|
|
|
|
SLsmg_reset_smg ();
|
|
|
|
return 0; /* OK */
|
|
|
|
}
|
|
|
|
|
2009-06-02 08:55:07 +04:00
|
|
|
void
|
|
|
|
tty_touch_screen (void)
|
|
|
|
{
|
|
|
|
SLsmg_touch_lines (0, LINES);
|
|
|
|
}
|
|
|
|
|
2009-05-10 19:01:15 +04:00
|
|
|
void
|
|
|
|
tty_gotoyx (int y, int x)
|
|
|
|
{
|
|
|
|
SLsmg_gotorc (y, x);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
tty_getyx (int *py, int *px)
|
|
|
|
{
|
|
|
|
*py = SLsmg_get_row ();
|
2009-05-11 16:13:58 +04:00
|
|
|
*px = SLsmg_get_column ();
|
2009-05-10 19:01:15 +04:00
|
|
|
}
|
|
|
|
|
2009-06-03 23:07:06 +04:00
|
|
|
/* if x < 0 or y < 0, draw line staring from current position */
|
|
|
|
void
|
|
|
|
tty_draw_hline (int y, int x, int ch, int len)
|
|
|
|
{
|
2009-09-10 16:14:18 +04:00
|
|
|
if (ch == ACS_HLINE)
|
2009-09-04 17:31:38 +04:00
|
|
|
ch = mc_tty_ugly_frm[MC_TTY_FRM_thinhoriz];
|
2009-08-24 00:42:28 +04:00
|
|
|
|
2009-06-03 23:07:06 +04:00
|
|
|
if ((y < 0) || (x < 0)) {
|
|
|
|
y = SLsmg_get_row ();
|
|
|
|
x = SLsmg_get_column ();
|
|
|
|
} else
|
|
|
|
SLsmg_gotorc (y, x);
|
|
|
|
|
|
|
|
if (ch == 0)
|
|
|
|
ch = ACS_HLINE;
|
|
|
|
|
|
|
|
if (ch == ACS_HLINE)
|
|
|
|
SLsmg_draw_hline (len);
|
|
|
|
else
|
|
|
|
while (len-- != 0)
|
|
|
|
tty_print_char (ch);
|
|
|
|
|
|
|
|
SLsmg_gotorc (y, x);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if x < 0 or y < 0, draw line staring from current position */
|
|
|
|
void
|
|
|
|
tty_draw_vline (int y, int x, int ch, int len)
|
|
|
|
{
|
2009-09-10 16:14:18 +04:00
|
|
|
if (ch == ACS_VLINE)
|
|
|
|
ch = mc_tty_ugly_frm[MC_TTY_FRM_thinvert];
|
|
|
|
|
2009-06-03 23:07:06 +04:00
|
|
|
if ((y < 0) || (x < 0)) {
|
|
|
|
y = SLsmg_get_row ();
|
|
|
|
x = SLsmg_get_column ();
|
|
|
|
} else
|
|
|
|
SLsmg_gotorc (y, x);
|
|
|
|
|
|
|
|
if (ch == 0)
|
|
|
|
ch = ACS_VLINE;
|
|
|
|
|
|
|
|
if (ch == ACS_VLINE)
|
|
|
|
SLsmg_draw_vline (len);
|
|
|
|
else {
|
|
|
|
int pos = 0;
|
|
|
|
|
|
|
|
while (len-- != 0) {
|
|
|
|
SLsmg_gotorc (y + pos, x);
|
|
|
|
tty_print_char (ch);
|
|
|
|
pos++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SLsmg_gotorc (y, x);
|
|
|
|
}
|
|
|
|
|
2009-05-26 18:56:42 +04:00
|
|
|
void
|
|
|
|
tty_fill_region (int y, int x, int rows, int cols, unsigned char ch)
|
|
|
|
{
|
|
|
|
SLsmg_fill_region (y, x, rows, cols, ch);
|
|
|
|
}
|
|
|
|
|
2009-06-02 08:55:07 +04:00
|
|
|
void
|
|
|
|
tty_set_alt_charset (gboolean alt_charset)
|
|
|
|
{
|
|
|
|
SLsmg_set_char_set ((int) alt_charset);
|
|
|
|
}
|
|
|
|
|
2009-06-08 13:49:46 +04:00
|
|
|
void
|
|
|
|
tty_display_8bit (gboolean what)
|
|
|
|
{
|
|
|
|
SLsmg_Display_Eight_Bit = what ? 128 : 160;
|
|
|
|
}
|
|
|
|
|
2009-05-10 19:01:15 +04:00
|
|
|
void
|
|
|
|
tty_print_char (int c)
|
|
|
|
{
|
2009-05-29 19:30:45 +04:00
|
|
|
SLsmg_write_char ((SLwchar_Type) ((unsigned int) c));
|
2009-05-10 19:01:15 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
tty_print_alt_char (int c)
|
|
|
|
{
|
2009-09-10 16:14:18 +04:00
|
|
|
#define DRAW(x, y) (x == y) \
|
|
|
|
? SLsmg_draw_object (SLsmg_get_row(), SLsmg_get_column(), x) \
|
|
|
|
: SLsmg_write_char ((unsigned int) y)
|
|
|
|
switch (c) {
|
|
|
|
case ACS_VLINE: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_thinvert]); break;
|
|
|
|
case ACS_HLINE: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_thinhoriz]); break;
|
|
|
|
case ACS_LTEE: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_leftmiddle]); break;
|
|
|
|
case ACS_RTEE: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_rightmiddle]); break;
|
|
|
|
case ACS_ULCORNER: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_lefttop]); break;
|
|
|
|
case ACS_LLCORNER: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_leftbottom]); break;
|
|
|
|
case ACS_URCORNER: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_righttop]); break;
|
|
|
|
case ACS_LRCORNER: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_rightbottom]); break;
|
|
|
|
case ACS_PLUS: DRAW (c, mc_tty_ugly_frm[MC_TTY_FRM_centermiddle]); break;
|
|
|
|
default: SLsmg_write_char ((unsigned int) c);
|
2009-08-24 00:42:28 +04:00
|
|
|
}
|
2009-09-10 16:14:18 +04:00
|
|
|
#undef DRAW
|
2009-05-10 19:01:15 +04:00
|
|
|
}
|
|
|
|
|
2009-08-13 09:59:31 +04:00
|
|
|
void
|
|
|
|
tty_print_anychar (int c)
|
|
|
|
{
|
2009-08-22 15:44:50 +04:00
|
|
|
char str[6 + 1];
|
2009-08-13 09:59:31 +04:00
|
|
|
|
|
|
|
if ( c > 255 ) {
|
2009-08-22 15:44:50 +04:00
|
|
|
int res = g_unichar_to_utf8 (c, str);
|
2009-08-13 09:59:31 +04:00
|
|
|
if ( res == 0 ) {
|
|
|
|
str[0] = '.';
|
|
|
|
str[1] = '\0';
|
|
|
|
} else {
|
|
|
|
str[res] = '\0';
|
|
|
|
}
|
|
|
|
SLsmg_write_string ((char *) str_term_form (str));
|
|
|
|
} else {
|
|
|
|
SLsmg_write_char ((SLwchar_Type) ((unsigned int) c));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-05-10 19:01:15 +04:00
|
|
|
void
|
|
|
|
tty_print_string (const char *s)
|
|
|
|
{
|
2009-07-10 22:09:41 +04:00
|
|
|
SLsmg_write_string ((char *) str_term_form (s));
|
2009-05-10 19:01:15 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
tty_printf (const char *fmt, ...)
|
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
|
2009-05-13 12:38:11 +04:00
|
|
|
va_start (args, fmt);
|
2009-07-10 22:09:41 +04:00
|
|
|
SLsmg_vprintf ((char *) fmt, args);
|
2009-05-10 19:01:15 +04:00
|
|
|
va_end (args);
|
|
|
|
}
|
|
|
|
|
|
|
|
char *
|
|
|
|
tty_tgetstr (const char *cap)
|
|
|
|
{
|
2009-07-10 22:09:41 +04:00
|
|
|
return SLtt_tgetstr ((char *) cap);
|
2009-05-10 19:01:15 +04:00
|
|
|
}
|
1998-02-27 07:54:42 +03:00
|
|
|
|
|
|
|
void
|
2009-05-13 12:38:11 +04:00
|
|
|
tty_refresh (void)
|
1998-02-27 07:54:42 +03:00
|
|
|
{
|
2009-08-16 19:27:33 +04:00
|
|
|
SLsmg_refresh ();
|
1998-02-27 07:54:42 +03:00
|
|
|
}
|
2009-05-31 16:23:10 +04:00
|
|
|
|
2009-08-06 13:17:01 +04:00
|
|
|
void
|
|
|
|
tty_setup_sigwinch (void (*handler) (int))
|
|
|
|
{
|
|
|
|
#ifdef SIGWINCH
|
|
|
|
struct sigaction act, oact;
|
|
|
|
act.sa_handler = handler;
|
|
|
|
sigemptyset (&act.sa_mask);
|
|
|
|
act.sa_flags = 0;
|
|
|
|
#ifdef SA_RESTART
|
|
|
|
act.sa_flags |= SA_RESTART;
|
|
|
|
#endif /* SA_RESTART */
|
|
|
|
sigaction (SIGWINCH, &act, &oact);
|
|
|
|
#endif /* SIGWINCH */
|
|
|
|
}
|
|
|
|
|
2009-05-31 16:23:10 +04:00
|
|
|
void
|
|
|
|
tty_beep (void)
|
|
|
|
{
|
|
|
|
SLtt_beep ();
|
|
|
|
}
|