mirror of https://github.com/MidnightCommander/mc
268 lines
5.3 KiB
C
268 lines
5.3 KiB
C
/* Slang interface to the Midnight Commander for Win32
|
|
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|
|
|
#include <config.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "../src/global.h"
|
|
#include "../src/tty.h"
|
|
#include "../src/color.h"
|
|
#include "../src/util.h"
|
|
#include "../src/mouse.h" /* Gpm_Event is required in key.h */
|
|
#include "../src/key.h" /* define_sequence */
|
|
#include "../src/main.h" /* extern: force_colors */
|
|
#include "../src/win.h" /* do_exit_ca_mode */
|
|
|
|
#ifdef HAVE_SLANG
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
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_pending (0) == 0)
|
|
return -1;
|
|
|
|
return SLang_getkey ();
|
|
}
|
|
|
|
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 yet) */
|
|
refresh ();
|
|
}
|
|
|
|
void slang_set_raw_mode (void)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int max_index = 0;
|
|
|
|
void
|
|
init_pair (int index, char *foreground, char *background)
|
|
{
|
|
|
|
SLtt_set_color (index, "", foreground, background);
|
|
if (index > max_index)
|
|
max_index = index;
|
|
}
|
|
|
|
int
|
|
alloc_color_pair (char *foreground, char *background)
|
|
{
|
|
init_pair (++max_index, foreground, background);
|
|
return max_index;
|
|
}
|
|
|
|
int
|
|
try_alloc_color_pair (char *fg, char *bg)
|
|
{
|
|
static struct colors_avail {
|
|
struct colors_avail *next;
|
|
char *fg, *bg;
|
|
int index;
|
|
} *p, c =
|
|
{
|
|
0, 0, 0, 0
|
|
};
|
|
|
|
c.index = NORMAL_COLOR;
|
|
p = &c;
|
|
for (;;) {
|
|
if (((fg && p->fg) ? !strcmp (fg, p->fg) : fg == p->fg) != 0
|
|
&& ((bg && p->bg) ? !strcmp (bg, p->bg) : bg == p->bg) != 0)
|
|
return p->index;
|
|
if (!p->next)
|
|
break;
|
|
p = p->next;
|
|
}
|
|
p->next = malloc (sizeof (c));
|
|
p = p->next;
|
|
p->next = 0;
|
|
p->fg = fg ? strdup (fg) : 0;
|
|
p->bg = bg ? strdup (bg) : 0;
|
|
if (!fg)
|
|
fg = "white";
|
|
if (!bg)
|
|
bg = "blue";
|
|
p->index = alloc_color_pair (fg, bg);
|
|
return p->index;
|
|
}
|