mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 20:36:50 +03:00
265 lines
5.2 KiB
C
265 lines
5.2 KiB
C
/* Slang interface to the Midnight Commander for Windows NT
|
|
This emulates some features of ncurses on top of slang
|
|
S-lang is not fully consistent between its Unix and non-Unix versions.
|
|
|
|
|
|
This program 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.
|
|
|
|
This program 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|
|
|
#include <config.h>
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
#include "tty.h"
|
|
#include "mad.h"
|
|
#include "color.h"
|
|
#include "util.h"
|
|
#include "mouse.h" /* Gpm_Event is required in key.h */
|
|
#include "key.h" /* define_sequence */
|
|
#include "main.h" /* extern: force_colors */
|
|
#include "win.h" /* do_exit_ca_mode */
|
|
|
|
#ifdef HAVE_SLANG
|
|
|
|
/* {{{ Copied from ../slang/slgetkey.c, removed the DEC_8Bit_HACK, */
|
|
extern unsigned int SLang_Input_Buffer_Len;
|
|
extern unsigned char SLang_Input_Buffer [];
|
|
extern unsigned int SLsys_getkey (void);
|
|
extern int SLsys_input_pending (int);
|
|
|
|
static unsigned int SLang_getkey2 (void)
|
|
{
|
|
unsigned int imax;
|
|
unsigned int ch;
|
|
|
|
if (SLang_Input_Buffer_Len)
|
|
{
|
|
ch = (unsigned int) *SLang_Input_Buffer;
|
|
SLang_Input_Buffer_Len--;
|
|
imax = SLang_Input_Buffer_Len;
|
|
|
|
memcpy ((char *) SLang_Input_Buffer,
|
|
(char *) (SLang_Input_Buffer + 1), imax);
|
|
return(ch);
|
|
}
|
|
else return(SLsys_getkey ());
|
|
}
|
|
|
|
static int SLang_input_pending2 (int tsecs)
|
|
{
|
|
int n;
|
|
unsigned char c;
|
|
if (SLang_Input_Buffer_Len) return (int) SLang_Input_Buffer_Len;
|
|
|
|
n = SLsys_input_pending (tsecs);
|
|
|
|
if (n <= 0) return 0;
|
|
|
|
c = (unsigned char) SLang_getkey2 ();
|
|
SLang_ungetkey_string (&c, 1);
|
|
|
|
return n;
|
|
}
|
|
/* }}} */
|
|
|
|
//??
|
|
static void slang_sigterm ()
|
|
{
|
|
SLsmg_reset_smg ();
|
|
}
|
|
|
|
static int slinterrupt;
|
|
|
|
void enable_interrupt_key(void)
|
|
{
|
|
SLang_set_abort_signal(NULL);
|
|
slinterrupt = 1;
|
|
}
|
|
void disable_interrupt_key(void)
|
|
{
|
|
slinterrupt = 0;
|
|
}
|
|
int got_interrupt ()
|
|
{
|
|
int t;
|
|
int SLKeyboard_Quit=0; //FIXME!!
|
|
t = slinterrupt ? SLKeyboard_Quit : 0;
|
|
// SLKeyboard_Quit = 0;
|
|
return t;
|
|
}
|
|
|
|
/* Only done the first time */
|
|
void slang_init (void)
|
|
{
|
|
SLtt_get_terminfo ();
|
|
SLang_init_tty (XCTRL('c'), 1, 0);
|
|
slang_prog_mode ();
|
|
load_terminfo_keys ();
|
|
}
|
|
|
|
/* Done each time we come back from done mode */
|
|
void slang_prog_mode (void)
|
|
{
|
|
SLsmg_init_smg ();
|
|
SLsmg_touch_lines (0, LINES);
|
|
}
|
|
|
|
/* Called each time we want to shutdown slang screen manager */
|
|
void slang_shell_mode (void)
|
|
{
|
|
|
|
}
|
|
|
|
void slang_shutdown ()
|
|
{
|
|
slang_shell_mode ();
|
|
do_exit_ca_mode ();
|
|
SLang_reset_tty ();
|
|
|
|
/* reset the colors to those that were
|
|
* active when the program was started up
|
|
(not written)
|
|
*/
|
|
}
|
|
|
|
/* keypad routines */
|
|
void slang_keypad (int set)
|
|
{
|
|
// enable keypad strings
|
|
// ?
|
|
}
|
|
|
|
static int no_slang_delay;
|
|
|
|
void set_slang_delay (int v)
|
|
{
|
|
no_slang_delay = v;
|
|
}
|
|
|
|
void hline (int ch, int len)
|
|
{
|
|
int last_x, last_y;
|
|
|
|
last_x = SLsmg_get_column ();
|
|
last_y = SLsmg_get_row ();
|
|
|
|
if (ch == 0)
|
|
ch = ACS_HLINE;
|
|
|
|
if (ch == ACS_HLINE){
|
|
SLsmg_draw_hline (len);
|
|
} else {
|
|
while (len--)
|
|
addch (ch);
|
|
}
|
|
move (last_y, last_x);
|
|
}
|
|
|
|
void vline (int character, int len)
|
|
{
|
|
if (!slow_terminal){
|
|
SLsmg_draw_vline (len);
|
|
} else {
|
|
int last_x, last_y, pos = 0;
|
|
|
|
last_x = SLsmg_get_column ();
|
|
last_y = SLsmg_get_row ();
|
|
|
|
while (len--){
|
|
move (last_y + pos++, last_x);
|
|
addch (' ');
|
|
}
|
|
move (last_x, last_y);
|
|
}
|
|
}
|
|
|
|
void init_pair (int index, char *foreground, char *background)
|
|
{
|
|
SLtt_set_color (index, "", foreground, background);
|
|
}
|
|
|
|
|
|
int has_colors ()
|
|
{
|
|
/* No terminals on NT, make default color */
|
|
if (!disable_colors)
|
|
SLtt_Use_Ansi_Colors = 1;
|
|
|
|
/* Setup emulated colors */
|
|
if (SLtt_Use_Ansi_Colors){
|
|
init_pair (A_REVERSE, "black", "white");
|
|
} else {
|
|
/* SLtt_set_mono (A_BOLD, NULL, SLTT_BOLD_MASK);
|
|
SLtt_set_mono (A_REVERSE, NULL, SLTT_REV_MASK);
|
|
SLtt_set_mono (A_BOLD|A_REVERSE, NULL, SLTT_BOLD_MASK | SLTT_REV_MASK);
|
|
*/ }
|
|
return SLtt_Use_Ansi_Colors;
|
|
}
|
|
|
|
void attrset (int color)
|
|
{
|
|
if (!SLtt_Use_Ansi_Colors){
|
|
SLsmg_set_color (color);
|
|
return;
|
|
}
|
|
|
|
if (color & A_BOLD){
|
|
if (color == A_BOLD)
|
|
SLsmg_set_color (A_BOLD);
|
|
else
|
|
SLsmg_set_color ((color & (~A_BOLD)) + 8);
|
|
return;
|
|
}
|
|
|
|
if (color == A_REVERSE)
|
|
SLsmg_set_color (A_REVERSE);
|
|
else
|
|
SLsmg_set_color (color);
|
|
}
|
|
|
|
void load_terminfo_keys ()
|
|
{
|
|
}
|
|
|
|
int getch ()
|
|
{
|
|
if (no_slang_delay)
|
|
if (SLang_input_pending2 (0) == 0)
|
|
return -1;
|
|
|
|
return SLang_getkey2 ();
|
|
}
|
|
|
|
extern int slow_terminal;
|
|
|
|
#else
|
|
|
|
/* Non slang builds do not understand got_interrupt */
|
|
int got_interrupt ()
|
|
{
|
|
return 0;
|
|
}
|
|
#endif /* HAVE_SLANG */
|
|
|
|
void mc_refresh (void)
|
|
{
|
|
/* if (!we_are_background) (no background mode in win32) */
|
|
refresh ();
|
|
}
|
|
|
|
void slang_set_raw_mode (void)
|
|
{
|
|
return;
|
|
}
|
|
|