Removed obsolete console driver.
This commit is contained in:
parent
13f92d3cdd
commit
7746e82122
|
@ -1 +0,0 @@
|
||||||
Makefile
|
|
|
@ -1,22 +0,0 @@
|
||||||
DEFS = @DLLFLAGS@ -D__WINE__
|
|
||||||
TOPSRCDIR = @top_srcdir@
|
|
||||||
TOPOBJDIR = ..
|
|
||||||
SRCDIR = @srcdir@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
MODULE = console
|
|
||||||
|
|
||||||
C_SRCS = \
|
|
||||||
generic.c \
|
|
||||||
interface.c \
|
|
||||||
ncurses.c \
|
|
||||||
tty.c \
|
|
||||||
xterm.c
|
|
||||||
|
|
||||||
all: $(MODULE).o
|
|
||||||
|
|
||||||
@MAKE_RULES@
|
|
||||||
|
|
||||||
$(MODULE).o: $(OBJS) Makefile.in $(TOPSRCDIR)/Make.rules.in
|
|
||||||
$(LDCOMBINE) $(OBJS) -o $@
|
|
||||||
|
|
||||||
### Dependencies:
|
|
|
@ -1,201 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 1999 - Joseph Pranevich
|
|
||||||
*
|
|
||||||
* This is a driver to implement, when possible, "high-level"
|
|
||||||
* routines using only low level calls. This is to make it possible
|
|
||||||
* to have accelerated functions for the individual drivers...
|
|
||||||
* or to simply not bother with them.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library 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
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* When creating new drivers, you need to assign all the functions that
|
|
||||||
that driver supports into the driver struct. If it is a supplementary
|
|
||||||
driver, it should make sure to preserve the old values. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "console.h"
|
|
||||||
#include "wine/debug.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(console);
|
|
||||||
|
|
||||||
static void GENERIC_MoveLine(char row1, char row2, char col1, char col2);
|
|
||||||
static void GENERIC_ClearLine(char row, char col1, char col2, int bgcolor,
|
|
||||||
int attribute);
|
|
||||||
void GENERIC_Start(void)
|
|
||||||
{
|
|
||||||
/* Here, we only want to add a driver if there is not one already
|
|
||||||
defined. */
|
|
||||||
|
|
||||||
TRACE("GENERIC_Start\n");
|
|
||||||
|
|
||||||
if (!driver.clearWindow)
|
|
||||||
driver.clearWindow = GENERIC_ClearWindow;
|
|
||||||
|
|
||||||
if (!driver.scrollUpWindow)
|
|
||||||
driver.scrollUpWindow = GENERIC_ScrollUpWindow;
|
|
||||||
|
|
||||||
if (!driver.scrollDownWindow)
|
|
||||||
driver.scrollDownWindow = GENERIC_ScrollDownWindow;
|
|
||||||
|
|
||||||
if (!driver.getCharacter)
|
|
||||||
driver.getCharacter = GENERIC_GetCharacter;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GENERIC_ClearWindow(char row1, char col1, char row2, char col2,
|
|
||||||
int bg_color, int attribute)
|
|
||||||
{
|
|
||||||
char trow, tcol, x;
|
|
||||||
int old_refresh;
|
|
||||||
|
|
||||||
/* Abort if we have only partial functionality */
|
|
||||||
if (!(driver.getCursorPosition && driver.moveCursor && driver.write))
|
|
||||||
return;
|
|
||||||
|
|
||||||
old_refresh = CONSOLE_GetRefresh();
|
|
||||||
CONSOLE_SetRefresh(FALSE);
|
|
||||||
|
|
||||||
CONSOLE_GetCursorPosition(&trow, &tcol);
|
|
||||||
|
|
||||||
for (x = row1; x <= row2; x++)
|
|
||||||
GENERIC_ClearLine(x, col1, col2, bg_color, attribute);
|
|
||||||
|
|
||||||
CONSOLE_MoveCursor(trow, tcol);
|
|
||||||
|
|
||||||
CONSOLE_SetRefresh(old_refresh);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GENERIC_ScrollUpWindow(char row1, char col1, char row2, char col2,
|
|
||||||
char lines, int bg_color, int attribute)
|
|
||||||
{
|
|
||||||
/* Scroll Up Window: Characters go down */
|
|
||||||
|
|
||||||
char trow, tcol, x;
|
|
||||||
int old_refresh;
|
|
||||||
|
|
||||||
TRACE("Scroll Up %d lines from %d to %d.\n", lines, row1,
|
|
||||||
row2);
|
|
||||||
|
|
||||||
/* Abort if we have only partial functionality */
|
|
||||||
if (!(driver.getCursorPosition && driver.moveCursor && driver.write
|
|
||||||
&& driver.getCharacterAtCursor && driver.clearWindow))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Save initial state... */
|
|
||||||
old_refresh = CONSOLE_GetRefresh();
|
|
||||||
CONSOLE_SetRefresh(FALSE);
|
|
||||||
CONSOLE_GetCursorPosition(&trow, &tcol);
|
|
||||||
|
|
||||||
for (x = row1 + lines; x <= row2; x++)
|
|
||||||
{
|
|
||||||
GENERIC_MoveLine(x, x - lines, col1, col2);
|
|
||||||
GENERIC_ClearLine(x, col1, col2, bg_color, attribute);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restore State */
|
|
||||||
CONSOLE_MoveCursor(trow, tcol);
|
|
||||||
CONSOLE_SetRefresh(old_refresh);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GENERIC_ScrollDownWindow(char row1, char col1, char row2, char col2,
|
|
||||||
char lines, int bg_color, int attribute)
|
|
||||||
{
|
|
||||||
/* Scroll Down Window: Characters go up */
|
|
||||||
|
|
||||||
char trow, tcol, x;
|
|
||||||
int old_refresh;
|
|
||||||
|
|
||||||
/* Abort if we have only partial functionality */
|
|
||||||
if (!(driver.getCursorPosition && driver.moveCursor && driver.write
|
|
||||||
&& driver.getCharacterAtCursor && driver.clearWindow))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Save initial state... */
|
|
||||||
old_refresh = CONSOLE_GetRefresh();
|
|
||||||
CONSOLE_SetRefresh(FALSE);
|
|
||||||
CONSOLE_GetCursorPosition(&trow, &tcol);
|
|
||||||
|
|
||||||
for (x = row2; x >= row1 + lines; x--)
|
|
||||||
{
|
|
||||||
GENERIC_MoveLine(x, x + lines, col1, col2);
|
|
||||||
GENERIC_ClearLine(x, col1, col1, bg_color, attribute);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restore State */
|
|
||||||
CONSOLE_MoveCursor(trow, tcol);
|
|
||||||
CONSOLE_SetRefresh(old_refresh);
|
|
||||||
}
|
|
||||||
|
|
||||||
char GENERIC_GetCharacter()
|
|
||||||
{
|
|
||||||
/* Keep getting keys until we get one with a char value */
|
|
||||||
char ch = (char) 0, scan;
|
|
||||||
|
|
||||||
while (!ch)
|
|
||||||
{
|
|
||||||
CONSOLE_GetKeystroke(&scan, &ch);
|
|
||||||
}
|
|
||||||
return ch;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GENERIC_ClearLine(char row, char col1, char col2, int bgcolor,
|
|
||||||
int attribute)
|
|
||||||
{
|
|
||||||
/* This function is here to simplify the logic of the scroll and clear
|
|
||||||
functions but may be useful elsewhere. If it can be used from
|
|
||||||
outside here, it should be made non-static */
|
|
||||||
|
|
||||||
char x;
|
|
||||||
|
|
||||||
TRACE("Clear Line: %d from %d to %d (unused: bgcolor %d, attrib %d).\n", row, col1, col2, bgcolor, attribute);
|
|
||||||
|
|
||||||
for (x = col1; x <= col2; x++)
|
|
||||||
{
|
|
||||||
CONSOLE_MoveCursor(row, x);
|
|
||||||
CONSOLE_Write(' ', 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assume that the calling function will make sure that the cursor is
|
|
||||||
repositioned properly. If this becomes non-static, that will need to be
|
|
||||||
changed. */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GENERIC_MoveLine(char row1, char row2, char col1, char col2)
|
|
||||||
{
|
|
||||||
/* This function is here to simplify the logic of the scroll and clear
|
|
||||||
functions but may be useful elsewhere. If it can be used from
|
|
||||||
outside here, it should be made non-static */
|
|
||||||
|
|
||||||
char x;
|
|
||||||
int bg_color, fg_color, attribute;
|
|
||||||
char ch;
|
|
||||||
|
|
||||||
TRACE("Move Line: Move %d to %d.\n", row1, row2);
|
|
||||||
|
|
||||||
for (x = col1; x <= col2; x++)
|
|
||||||
{
|
|
||||||
CONSOLE_MoveCursor(row1, x);
|
|
||||||
CONSOLE_GetCharacterAtCursor(&ch, &fg_color, &bg_color, &attribute);
|
|
||||||
CONSOLE_MoveCursor(row2, x);
|
|
||||||
CONSOLE_Write(ch, fg_color, bg_color, attribute);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assume that the calling function will make sure that the cursor is
|
|
||||||
repositioned properly. If this becomes non-static, that will need to be
|
|
||||||
changed. */
|
|
||||||
}
|
|
|
@ -1,376 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 1999 - Joseph Pranevich
|
|
||||||
*
|
|
||||||
* The primary purpose of this function is to provide CONSOLE_*
|
|
||||||
* routines that immediately call the appropriate driver handler.
|
|
||||||
* This cleans up code in the individual modules considerably.
|
|
||||||
* This could be done using a macro, but additional functionality
|
|
||||||
* may be provided here in the future.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library 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
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; 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 <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "windef.h"
|
|
||||||
#include "console.h"
|
|
||||||
#include "options.h"
|
|
||||||
|
|
||||||
CONSOLE_device driver;
|
|
||||||
|
|
||||||
static int pop_driver(char **, char **, int *);
|
|
||||||
|
|
||||||
static int console_initialized = FALSE;
|
|
||||||
|
|
||||||
static int CONSOLE_Init(void)
|
|
||||||
{
|
|
||||||
char buffer[256];
|
|
||||||
char *single, *drivers = buffer;
|
|
||||||
int length;
|
|
||||||
char initial_rows[5];
|
|
||||||
char initial_columns[5];
|
|
||||||
|
|
||||||
/* Suitable defaults... */
|
|
||||||
driver.console_out = stdout;
|
|
||||||
driver.console_in = stdin;
|
|
||||||
|
|
||||||
/* drivers should be a string that consists of driver names
|
|
||||||
followed by plus (+) signs to denote additions.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
drivers = tty Load just the tty driver
|
|
||||||
drivers = ncurses+xterm Load ncurses then xterm
|
|
||||||
|
|
||||||
The "default" value is just tty.
|
|
||||||
*/
|
|
||||||
PROFILE_GetWineIniString( "console", "Drivers", CONSOLE_DEFAULT_DRIVER,
|
|
||||||
buffer, sizeof(buffer) );
|
|
||||||
|
|
||||||
while (pop_driver(&drivers, &single, &length))
|
|
||||||
{
|
|
||||||
if (!strncmp(single, "tty", length))
|
|
||||||
TTY_Start();
|
|
||||||
#ifdef WINE_NCURSES
|
|
||||||
else if (!strncmp(single, "ncurses", length))
|
|
||||||
NCURSES_Start();
|
|
||||||
#endif /* WINE_NCURSES */
|
|
||||||
else if (!strncmp(single, "xterm", length))
|
|
||||||
XTERM_Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read in generic configuration */
|
|
||||||
/* This is primarily to work around a limitation in nxterm where
|
|
||||||
this information is not correctly passed to the ncurses layer
|
|
||||||
through the terminal. At least, I'm not doing it correctly if there
|
|
||||||
is a way. But this serves as a generic way to do the same anyway. */
|
|
||||||
|
|
||||||
/* We are setting this to 80x25 here which is *not* the default for
|
|
||||||
most xterm variants... It is however the standard VGA resolution */
|
|
||||||
|
|
||||||
/* FIXME: We need to be able to be able to specify that the window's
|
|
||||||
dimensions should be used. This is required for correct emulation
|
|
||||||
of Win32's console and Win32's DOS emulation */
|
|
||||||
|
|
||||||
PROFILE_GetWineIniString("console", "InitialRows",
|
|
||||||
"24", initial_rows, 5);
|
|
||||||
PROFILE_GetWineIniString("console", "InitialColumns",
|
|
||||||
"80", initial_columns, 5);
|
|
||||||
|
|
||||||
sscanf(initial_rows, "%d", &driver.y_res);
|
|
||||||
sscanf(initial_columns, "%d", &driver.x_res);
|
|
||||||
|
|
||||||
GENERIC_Start();
|
|
||||||
|
|
||||||
if (driver.init)
|
|
||||||
driver.init();
|
|
||||||
|
|
||||||
/* Not all terminals let our programs know the proper resolution
|
|
||||||
if the resolution is set on the command-line... */
|
|
||||||
CONSOLE_NotifyResizeScreen(driver.x_res, driver.y_res);
|
|
||||||
|
|
||||||
atexit(CONSOLE_Close);
|
|
||||||
|
|
||||||
/* For now, always return TRUE */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.write)
|
|
||||||
{
|
|
||||||
driver.write(out, fg_color, bg_color, attribute);
|
|
||||||
if (!driver.norefresh)
|
|
||||||
CONSOLE_Refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_Close(void)
|
|
||||||
{
|
|
||||||
if (driver.close)
|
|
||||||
driver.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_MoveCursor(char row, char col)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.moveCursor)
|
|
||||||
{
|
|
||||||
driver.moveCursor(row, col);
|
|
||||||
if (!driver.norefresh)
|
|
||||||
CONSOLE_Refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_ClearWindow(char row1, char col1, char row2, char col2,
|
|
||||||
int bg_color, int attribute)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.clearWindow)
|
|
||||||
{
|
|
||||||
driver.clearWindow(row1, col1, row2, col2, bg_color, attribute);
|
|
||||||
if (!driver.norefresh)
|
|
||||||
CONSOLE_Refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_ScrollUpWindow(char row1, char col1, char row2, char col2,
|
|
||||||
char lines, int bg_color, int attribute)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.scrollUpWindow)
|
|
||||||
{
|
|
||||||
driver.scrollUpWindow(row1, col1, row2, col2, lines, bg_color,
|
|
||||||
attribute);
|
|
||||||
if (!driver.norefresh)
|
|
||||||
CONSOLE_Refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_ScrollDownWindow(char row1, char col1, char row2, char col2,
|
|
||||||
char lines, int bg_color, int attribute)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.scrollDownWindow)
|
|
||||||
{
|
|
||||||
driver.scrollDownWindow(row1, col1, row2, col2, lines, bg_color,
|
|
||||||
attribute);
|
|
||||||
if (!driver.norefresh)
|
|
||||||
CONSOLE_Refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int CONSOLE_CheckForKeystroke(char *scan, char *ascii)
|
|
||||||
/* These functions need to go through a conversion layer. Scancodes
|
|
||||||
should *not* be determined by the driver, rather they should have
|
|
||||||
a conv_* function in int16.c. Yuck. */
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.checkForKeystroke)
|
|
||||||
return driver.checkForKeystroke(scan, ascii);
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_GetKeystroke(char *scan, char *ascii)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.getKeystroke)
|
|
||||||
driver.getKeystroke(scan, ascii);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_GetCursorPosition(char *row, char *col)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.getCursorPosition)
|
|
||||||
driver.getCursorPosition(row, col);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_GetCharacterAtCursor(char *ch, int *fg, int *bg, int *a)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.getCharacterAtCursor)
|
|
||||||
driver.getCharacterAtCursor(ch, fg, bg, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_Refresh()
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.refresh)
|
|
||||||
driver.refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
int CONSOLE_AllocColor(int color)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.allocColor)
|
|
||||||
return driver.allocColor(color);
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_ClearScreen()
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.clearScreen)
|
|
||||||
{
|
|
||||||
driver.clearScreen();
|
|
||||||
if (!driver.norefresh)
|
|
||||||
CONSOLE_Refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char CONSOLE_GetCharacter()
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
/* I'm not sure if we need this really. This is a function that can be
|
|
||||||
accelerated that returns the next *non extended* keystroke */
|
|
||||||
if (driver.getCharacter)
|
|
||||||
return driver.getCharacter();
|
|
||||||
else
|
|
||||||
return (char) 0; /* Sure, this will probably break programs... */
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_ResizeScreen(int x, int y)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.resizeScreen)
|
|
||||||
driver.resizeScreen(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_NotifyResizeScreen(int x, int y)
|
|
||||||
{
|
|
||||||
if (driver.notifyResizeScreen)
|
|
||||||
driver.notifyResizeScreen(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_SetBackgroundColor(int fg, int bg)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.setBackgroundColor)
|
|
||||||
driver.setBackgroundColor(fg, bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_GetBackgroundColor(int *fg, int *bg)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
if (driver.getBackgroundColor)
|
|
||||||
driver.getBackgroundColor(fg, bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CONSOLE_WriteRawString(char *str)
|
|
||||||
{
|
|
||||||
if (!console_initialized)
|
|
||||||
console_initialized = CONSOLE_Init();
|
|
||||||
|
|
||||||
/* This is a special function that is only for internal use and
|
|
||||||
does not actually call any of the console drivers. It's
|
|
||||||
primary purpose is to provide a way for higher-level drivers
|
|
||||||
to write directly to the underlying terminal without worry that
|
|
||||||
there will be any retranslation done by the assorted drivers. Care
|
|
||||||
should be taken to ensure that this only gets called when the thing
|
|
||||||
written does not actually produce any output or a CONSOLE_Redraw()
|
|
||||||
is called immediately afterwards.
|
|
||||||
CONSOLE_Redraw() is not yet implemented.
|
|
||||||
*/
|
|
||||||
fprintf(driver.console_out, "%s", str);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function is only at the CONSOLE level. */
|
|
||||||
/* Admittably, calling the variable norefresh might be a bit dumb...*/
|
|
||||||
void CONSOLE_SetRefresh(int setting)
|
|
||||||
{
|
|
||||||
if (setting)
|
|
||||||
driver.norefresh = FALSE;
|
|
||||||
else
|
|
||||||
driver.norefresh = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function is only at the CONSOLE level. */
|
|
||||||
int CONSOLE_GetRefresh()
|
|
||||||
{
|
|
||||||
if (driver.norefresh)
|
|
||||||
return FALSE;
|
|
||||||
else
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Utility functions... */
|
|
||||||
|
|
||||||
int pop_driver(char **drivers, char **single, int *length)
|
|
||||||
{
|
|
||||||
/* Take the string in drivers and extract the first "driver" entry */
|
|
||||||
/* Advance the pointer in drivers to the next entry, put the origional
|
|
||||||
pointer in single, and put the length in length. */
|
|
||||||
/* Return TRUE if we found one */
|
|
||||||
|
|
||||||
if (!*drivers)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
*single = *drivers;
|
|
||||||
*length = 0;
|
|
||||||
|
|
||||||
while ((*drivers[0] != '\0') && (*drivers[0] != '+'))
|
|
||||||
{
|
|
||||||
(*drivers)++;
|
|
||||||
(*length)++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (*drivers[0] == '+')
|
|
||||||
(*drivers)++;
|
|
||||||
|
|
||||||
if (*length)
|
|
||||||
return TRUE;
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,300 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 1999 - Joseph Pranevich
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library 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
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; 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 "console.h" /* Must define WINE_NCURSES */
|
|
||||||
|
|
||||||
#ifdef WINE_NCURSES
|
|
||||||
|
|
||||||
/* This is the console driver for systems that support the ncurses
|
|
||||||
interface.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Actually, this should work for curses, as well. But there may be
|
|
||||||
individual functions that are unsupported in plain curses or other
|
|
||||||
variants. Those should be detected and special-cased by autoconf.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* When creating new drivers, you need to assign all the functions that
|
|
||||||
that driver supports into the driver struct. If it is a supplementary
|
|
||||||
driver, it should make sure to perserve the old values.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "wine/debug.h"
|
|
||||||
#include "options.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(console);
|
|
||||||
|
|
||||||
#undef ERR /* Use ncurses's err() */
|
|
||||||
#ifdef HAVE_NCURSES_H
|
|
||||||
# include <ncurses.h>
|
|
||||||
#else
|
|
||||||
# ifdef HAVE_CURSES_H
|
|
||||||
# include <curses.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SCREEN *ncurses_screen;
|
|
||||||
|
|
||||||
static int get_color_pair(int fg_color, int bg_color);
|
|
||||||
|
|
||||||
const char *color_names[] = {"null", "black", "blue", "green",
|
|
||||||
"cyan", "magenta", "brown", "red", "light gray", "dark gray",
|
|
||||||
"light blue", "light green", "light red", "light magenta",
|
|
||||||
"light cyan", "yellow", "white"};
|
|
||||||
|
|
||||||
void NCURSES_Start()
|
|
||||||
{
|
|
||||||
/* This should be the root driver so we can ignore anything
|
|
||||||
already in the struct. */
|
|
||||||
|
|
||||||
driver.norefresh = FALSE;
|
|
||||||
|
|
||||||
driver.init = NCURSES_Init;
|
|
||||||
driver.write = NCURSES_Write;
|
|
||||||
driver.close = NCURSES_Close;
|
|
||||||
driver.moveCursor = NCURSES_MoveCursor;
|
|
||||||
driver.getCursorPosition = NCURSES_GetCursorPosition;
|
|
||||||
driver.getCharacterAtCursor = NCURSES_GetCharacterAtCursor;
|
|
||||||
driver.clearScreen = NCURSES_ClearScreen;
|
|
||||||
driver.allocColor = NCURSES_AllocColor;
|
|
||||||
#ifdef HAVE_GETBKGD
|
|
||||||
driver.setBackgroundColor = NCURSES_SetBackgroundColor;
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_RESIZETERM
|
|
||||||
driver.notifyResizeScreen = NCURSES_NotifyResizeScreen;
|
|
||||||
#endif /* HAVE_RESIZETERM */
|
|
||||||
|
|
||||||
driver.checkForKeystroke = NCURSES_CheckForKeystroke;
|
|
||||||
driver.getKeystroke = NCURSES_GetKeystroke;
|
|
||||||
|
|
||||||
driver.refresh = NCURSES_Refresh;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_Init()
|
|
||||||
{
|
|
||||||
char terminal_type[80];
|
|
||||||
|
|
||||||
PROFILE_GetWineIniString("console", "TerminalType",
|
|
||||||
"xterm", terminal_type, 79);
|
|
||||||
|
|
||||||
ncurses_screen = newterm(terminal_type, driver.console_out,
|
|
||||||
driver.console_in);
|
|
||||||
set_term(ncurses_screen);
|
|
||||||
start_color();
|
|
||||||
raw();
|
|
||||||
noecho();
|
|
||||||
nonl();
|
|
||||||
intrflush(stdscr, FALSE);
|
|
||||||
keypad(stdscr, TRUE);
|
|
||||||
nodelay(stdscr, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_Write(char output, int fg, int bg, int attribute)
|
|
||||||
{
|
|
||||||
char row, col;
|
|
||||||
int pair;
|
|
||||||
|
|
||||||
if (!fg)
|
|
||||||
fg = COLOR_WHITE; /* Default */
|
|
||||||
|
|
||||||
if (!bg)
|
|
||||||
bg = COLOR_BLACK; /* Default */
|
|
||||||
|
|
||||||
pair = get_color_pair(fg, bg);
|
|
||||||
|
|
||||||
if (waddch(stdscr, output | COLOR_PAIR(pair)) == ERR)
|
|
||||||
{
|
|
||||||
NCURSES_GetCursorPosition(&row, &col);
|
|
||||||
FIXME("NCURSES: waddch() failed at %d, %d.\n", row, col);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_Close()
|
|
||||||
{
|
|
||||||
endwin();
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_GetKeystroke(char *scan, char *ascii)
|
|
||||||
{
|
|
||||||
while (!NCURSES_CheckForKeystroke(scan, ascii))
|
|
||||||
{} /* Wait until keystroke is detected */
|
|
||||||
|
|
||||||
/* When it is detected, we will already have the right value
|
|
||||||
in scan and ascii, but we need to take this keystroke
|
|
||||||
out of the buffer. */
|
|
||||||
wgetch(stdscr);
|
|
||||||
}
|
|
||||||
|
|
||||||
int NCURSES_CheckForKeystroke(char *scan, char *ascii)
|
|
||||||
{
|
|
||||||
/* We don't currently support scan codes here */
|
|
||||||
/* FIXME */
|
|
||||||
int temp;
|
|
||||||
temp = wgetch(stdscr);
|
|
||||||
if (temp == ERR)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ungetch(temp); /* Keystroke not removed from buffer */
|
|
||||||
*ascii = (char) temp;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_MoveCursor(char row, char col)
|
|
||||||
{
|
|
||||||
if (wmove(stdscr, row, col) == ERR)
|
|
||||||
FIXME("NCURSES: wmove() failed to %d, %d.\n", row, col);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_GetCursorPosition(char *row, char *col)
|
|
||||||
{
|
|
||||||
int trow, tcol;
|
|
||||||
|
|
||||||
getyx(stdscr, trow, tcol); /* MACRO, no need to pass pointer */
|
|
||||||
|
|
||||||
*row = (char) trow;
|
|
||||||
*col = (char) tcol;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_GetCharacterAtCursor(char *ch, int *fg_color, int
|
|
||||||
*bg_color, int *attribute)
|
|
||||||
{
|
|
||||||
/* If any of the pointers are NULL, ignore them */
|
|
||||||
/* We will eventually have to convert the color data */
|
|
||||||
if (ch)
|
|
||||||
*ch = (char) winch(stdscr);
|
|
||||||
if (fg_color)
|
|
||||||
*fg_color = WINE_WHITE;
|
|
||||||
if (bg_color)
|
|
||||||
*bg_color = WINE_BLACK;
|
|
||||||
if (attribute)
|
|
||||||
*attribute = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_Refresh()
|
|
||||||
{
|
|
||||||
wrefresh(stdscr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_ClearScreen()
|
|
||||||
{
|
|
||||||
werase(stdscr);
|
|
||||||
}
|
|
||||||
|
|
||||||
int NCURSES_AllocColor(int color)
|
|
||||||
{
|
|
||||||
/* Currently support only internal colors */
|
|
||||||
switch (color)
|
|
||||||
{
|
|
||||||
case WINE_BLACK: return COLOR_BLACK;
|
|
||||||
case WINE_WHITE: return COLOR_WHITE;
|
|
||||||
case WINE_RED: return COLOR_RED;
|
|
||||||
case WINE_GREEN: return COLOR_GREEN;
|
|
||||||
case WINE_YELLOW: return COLOR_YELLOW;
|
|
||||||
case WINE_BLUE: return COLOR_BLUE;
|
|
||||||
case WINE_MAGENTA: return COLOR_MAGENTA;
|
|
||||||
case WINE_CYAN: return COLOR_CYAN;
|
|
||||||
}
|
|
||||||
|
|
||||||
FIXME("Unable to allocate color %d (%s)\n", color,
|
|
||||||
color_names[color]);
|
|
||||||
|
|
||||||
/* Don't allocate a color... yet */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NCURSES_SetBackgroundColor(int fg, int bg)
|
|
||||||
{
|
|
||||||
int pair;
|
|
||||||
|
|
||||||
pair = get_color_pair(fg, bg);
|
|
||||||
|
|
||||||
wbkgd(stdscr, COLOR_PAIR(pair));
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_GETBKGD
|
|
||||||
void NCURSES_GetBackgroundColor(int *fg, int *bg)
|
|
||||||
{
|
|
||||||
chtype background;
|
|
||||||
short pair, sfg, sbg;
|
|
||||||
|
|
||||||
background = getbkgd(stdscr);
|
|
||||||
|
|
||||||
pair = (!A_CHARTEXT & background);
|
|
||||||
|
|
||||||
pair_content(pair, &sfg, &sbg);
|
|
||||||
|
|
||||||
*fg = sfg;
|
|
||||||
*bg = sbg;
|
|
||||||
}
|
|
||||||
#endif /* HAVE_GETBKGD */
|
|
||||||
|
|
||||||
#ifdef HAVE_RESIZETERM
|
|
||||||
|
|
||||||
void NCURSES_NotifyResizeScreen(int x, int y)
|
|
||||||
{
|
|
||||||
/* Note: This function gets called *after* another driver in the chain
|
|
||||||
calls ResizeScreen(). It is meant to resize the ncurses internal
|
|
||||||
data structures to know about the new window dimensions. */
|
|
||||||
|
|
||||||
TRACE("Terminal resized to y: %d, x: %d\n", y, x);
|
|
||||||
|
|
||||||
resizeterm(y, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* HAVE_RESIZETERM */
|
|
||||||
|
|
||||||
static int get_color_pair(int fg_color, int bg_color)
|
|
||||||
{
|
|
||||||
/* ncurses internally uses "color pairs" in addition to the "pallet" */
|
|
||||||
/* This isn't the best way to do this. Or even close */
|
|
||||||
|
|
||||||
static int current = 0;
|
|
||||||
static int fg[255]; /* 16 x 16 is enough */
|
|
||||||
static int bg[255];
|
|
||||||
int x;
|
|
||||||
|
|
||||||
/* The first pair is hardwired into ncurses */
|
|
||||||
fg[0] = COLOR_WHITE;
|
|
||||||
bg[0] = COLOR_BLACK;
|
|
||||||
|
|
||||||
for (x = 0; x <= current; x++)
|
|
||||||
{
|
|
||||||
if ((fg_color == fg[x]) && (bg_color == bg[x]))
|
|
||||||
{
|
|
||||||
TRACE("Color pair: already allocated\n");
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Need to allocate new color */
|
|
||||||
current++;
|
|
||||||
fg[current] = fg_color;
|
|
||||||
bg[current] = bg_color;
|
|
||||||
TRACE("Color pair: allocated.\n");
|
|
||||||
return init_pair(current, fg_color, bg_color);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* WINE_NCURSES */
|
|
|
@ -1,57 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 1999 - Joseph Pranevich
|
|
||||||
*
|
|
||||||
* This is the console driver for TTY-based consoles, i.e. consoles
|
|
||||||
* without cursor placement, etc. It's also a pretty decent starting
|
|
||||||
* point for other drivers.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library 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
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* When creating new drivers, you need to assign all the functions that
|
|
||||||
that driver supports into the driver struct. If it is a supplementary
|
|
||||||
driver, it should make sure to perserve the old values. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "console.h"
|
|
||||||
#include "windef.h"
|
|
||||||
void TTY_Start()
|
|
||||||
{
|
|
||||||
/* This should be the root driver so we can ignore anything
|
|
||||||
already in the struct. */
|
|
||||||
|
|
||||||
driver.norefresh = FALSE;
|
|
||||||
|
|
||||||
driver.write = TTY_Write;
|
|
||||||
driver.getKeystroke = TTY_GetKeystroke;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TTY_Write(char output, int fg, int bg, int attribute)
|
|
||||||
{
|
|
||||||
/* We can discard all extended information. */
|
|
||||||
fprintf(driver.console_out, "%c", output);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TTY_GetKeystroke(char *scan, char *ch)
|
|
||||||
{
|
|
||||||
/* All we have are character input things, nothing for extended */
|
|
||||||
/* This is just the TTY driver, after all. We'll cope. */
|
|
||||||
*ch = fgetc(driver.console_in);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
188
console/xterm.c
188
console/xterm.c
|
@ -1,188 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 1999 - Joseph Pranevich
|
|
||||||
*
|
|
||||||
* This "driver" is designed to go on top of an existing driver
|
|
||||||
* to provide support for features only present if using an
|
|
||||||
* xterm or compatible program for your console output.
|
|
||||||
* Currently, it supports resizing and separating debug messages from
|
|
||||||
* program output.
|
|
||||||
* It does not currently support changing the title bar.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library 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
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "wine/port.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <termios.h>
|
|
||||||
#ifdef HAVE_LIBUTIL_H
|
|
||||||
# include <libutil.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_PTY_H
|
|
||||||
# include <pty.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "console.h"
|
|
||||||
#include "options.h"
|
|
||||||
#include "wine/debug.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(console);
|
|
||||||
|
|
||||||
char console_xterm_prog[80];
|
|
||||||
|
|
||||||
static BOOL wine_create_console(FILE **master, FILE **slave, pid_t *pid);
|
|
||||||
|
|
||||||
/* The console -- I chose to keep the master and slave
|
|
||||||
* (UNIX) file descriptors around in case they are needed for
|
|
||||||
* ioctls later. The pid is needed to destroy the xterm on close
|
|
||||||
*/
|
|
||||||
typedef struct _XTERM_CONSOLE {
|
|
||||||
FILE *master; /* xterm side of pty */
|
|
||||||
FILE *slave; /* wine side of pty */
|
|
||||||
pid_t pid; /* xterm's pid, -1 if no xterm */
|
|
||||||
} XTERM_CONSOLE;
|
|
||||||
|
|
||||||
static XTERM_CONSOLE xterm_console;
|
|
||||||
|
|
||||||
CONSOLE_device chain;
|
|
||||||
FILE *old_in, *old_out;
|
|
||||||
|
|
||||||
void XTERM_Start(void)
|
|
||||||
{
|
|
||||||
/* Here, this is a supplementary driver so we should remember to call
|
|
||||||
the chain. */
|
|
||||||
chain.init = driver.init;
|
|
||||||
driver.init = XTERM_Init;
|
|
||||||
|
|
||||||
chain.close = driver.close;
|
|
||||||
driver.close = XTERM_Close;
|
|
||||||
|
|
||||||
chain.resizeScreen = driver.resizeScreen;
|
|
||||||
driver.resizeScreen = XTERM_ResizeScreen;
|
|
||||||
|
|
||||||
/* Read in driver configuration */
|
|
||||||
PROFILE_GetWineIniString("console", "XtermProg",
|
|
||||||
"xterm", console_xterm_prog, 79);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void XTERM_Init()
|
|
||||||
{
|
|
||||||
wine_create_console(&xterm_console.master, &xterm_console.slave,
|
|
||||||
&xterm_console.pid);
|
|
||||||
|
|
||||||
old_in = driver.console_in;
|
|
||||||
driver.console_in = xterm_console.slave;
|
|
||||||
|
|
||||||
old_out = driver.console_out;
|
|
||||||
driver.console_out = xterm_console.slave;
|
|
||||||
|
|
||||||
/* Then call the chain... */
|
|
||||||
if (chain.init)
|
|
||||||
chain.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XTERM_Close()
|
|
||||||
{
|
|
||||||
/* Call the chain first... */
|
|
||||||
if (chain.close)
|
|
||||||
chain.close();
|
|
||||||
|
|
||||||
driver.console_in = old_in;
|
|
||||||
driver.console_out = old_out;
|
|
||||||
|
|
||||||
/* make sure a xterm exists to kill */
|
|
||||||
if (xterm_console.pid != -1) {
|
|
||||||
kill(xterm_console.pid, SIGTERM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XTERM_ResizeScreen(int x, int y)
|
|
||||||
{
|
|
||||||
char temp[100];
|
|
||||||
|
|
||||||
/* Call the chain first, there shoudln't be any... */
|
|
||||||
if (chain.resizeScreen)
|
|
||||||
chain.resizeScreen(x, y);
|
|
||||||
|
|
||||||
sprintf(temp, "\x1b[8;%d;%dt", y, x);
|
|
||||||
CONSOLE_WriteRawString(temp);
|
|
||||||
|
|
||||||
CONSOLE_NotifyResizeScreen(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static BOOL wine_create_console(FILE **master, FILE **slave, pid_t *pid)
|
|
||||||
{
|
|
||||||
/* There is definately a bug in this routine that causes a lot
|
|
||||||
of garbage to be written to the screen, but I can't find it...
|
|
||||||
*/
|
|
||||||
struct termios term;
|
|
||||||
char buf[1024];
|
|
||||||
char c = '\0';
|
|
||||||
int status = 0;
|
|
||||||
int i;
|
|
||||||
int tmaster, tslave;
|
|
||||||
char xterm_resolution[10];
|
|
||||||
|
|
||||||
sprintf(xterm_resolution, "%dx%d", driver.x_res,
|
|
||||||
driver.y_res);
|
|
||||||
|
|
||||||
if (tcgetattr(0, &term) < 0) return FALSE;
|
|
||||||
term.c_lflag |= ICANON;
|
|
||||||
term.c_lflag &= ~ECHO;
|
|
||||||
if (openpty(&tmaster, &tslave, NULL, &term, NULL) < 0)
|
|
||||||
return FALSE;
|
|
||||||
*master = fdopen(tmaster, "r+");
|
|
||||||
*slave = fdopen(tslave, "r+");
|
|
||||||
|
|
||||||
if ((*pid=fork()) == 0) {
|
|
||||||
tcsetattr(fileno(*slave), TCSADRAIN, &term);
|
|
||||||
sprintf(buf, "-Sxx%d", fileno(*master));
|
|
||||||
execlp(console_xterm_prog, console_xterm_prog, buf, "-fg",
|
|
||||||
"white", "-bg", "black", "-g",
|
|
||||||
xterm_resolution, NULL);
|
|
||||||
ERR("error creating xterm (file not found?)\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* most xterms like to print their window ID when used with -S;
|
|
||||||
* read it and continue before the user has a chance...
|
|
||||||
* NOTE: this is the reason we started xterm with ECHO off,
|
|
||||||
* we'll turn it back on below
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i=0; c!='\n'; (status=fread(&c, 1, 1, *slave)), i++) {
|
|
||||||
if (status == -1 && c == '\0') {
|
|
||||||
/* wait for xterm to be created */
|
|
||||||
usleep(100);
|
|
||||||
}
|
|
||||||
if (i > 10000) {
|
|
||||||
WARN("can't read xterm WID\n");
|
|
||||||
kill(*pid, SIGKILL);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
term.c_lflag |= ECHO;
|
|
||||||
tcsetattr(fileno(*master), TCSADRAIN, &term);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
|
@ -4,7 +4,6 @@ SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = winedos.dll
|
MODULE = winedos.dll
|
||||||
IMPORTS = user32.dll kernel32.dll ntdll.dll
|
IMPORTS = user32.dll kernel32.dll ntdll.dll
|
||||||
EXTRALIBS = @CURSESLIBS@ @UTILLIBS@
|
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
dosaspi.c \
|
dosaspi.c \
|
||||||
|
@ -26,15 +25,6 @@ C_SRCS = \
|
||||||
vga.c \
|
vga.c \
|
||||||
xms.c
|
xms.c
|
||||||
|
|
||||||
EXTRA_OBJS = \
|
|
||||||
$(TOPOBJDIR)/console/console.o
|
|
||||||
|
|
||||||
SUBDIRS = \
|
|
||||||
$(TOPOBJDIR)/console
|
|
||||||
|
|
||||||
@MAKE_DLL_RULES@
|
@MAKE_DLL_RULES@
|
||||||
|
|
||||||
$(EXTRA_OBJS): dummy
|
|
||||||
@cd `dirname $@` && $(MAKE) `basename $@`
|
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
#include "miscemu.h"
|
#include "miscemu.h"
|
||||||
#include "vga.h"
|
#include "vga.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
#include "console.h"
|
|
||||||
#include "dosexe.h"
|
#include "dosexe.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(int);
|
WINE_DEFAULT_DEBUG_CHANNEL(int);
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include "dosexe.h"
|
#include "dosexe.h"
|
||||||
#include "miscemu.h"
|
#include "miscemu.h"
|
||||||
#include "msdos.h"
|
#include "msdos.h"
|
||||||
#include "console.h"
|
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
|
|
||||||
#include "winnt.h"
|
#include "winnt.h"
|
||||||
|
|
||||||
#include "console.h"
|
|
||||||
#include "miscemu.h"
|
#include "miscemu.h"
|
||||||
#include "dosexe.h"
|
#include "dosexe.h"
|
||||||
|
|
||||||
|
|
|
@ -1,170 +0,0 @@
|
||||||
/*
|
|
||||||
* Include file for definitions pertaining to Wine's text-console
|
|
||||||
* interface.
|
|
||||||
*
|
|
||||||
* Copyright 1998 - Joseph Pranevich
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library 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
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __WINE_CONSOLE_H
|
|
||||||
#define __WINE_CONSOLE_H
|
|
||||||
|
|
||||||
#ifndef __WINE_CONFIG_H
|
|
||||||
# error You must include config.h to use this header
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* Can we compile with curses/ncurses? */
|
|
||||||
#if ( (defined(HAVE_LIBNCURSES) || defined(HAVE_LIBCURSES)) && \
|
|
||||||
(defined(HAVE_CURSES_H) || defined(HAVE_NCURSES_H)) \
|
|
||||||
)
|
|
||||||
# define WINE_NCURSES
|
|
||||||
#else
|
|
||||||
# undef WINE_NCURSES
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CONSOLE_DEFAULT_DRIVER "tty"
|
|
||||||
|
|
||||||
typedef struct CONSOLE_DRIVER
|
|
||||||
{
|
|
||||||
void (*init)(void);
|
|
||||||
void (*close)(void);
|
|
||||||
void (*write)(char, int, int, int);
|
|
||||||
void (*moveCursor)(char, char);
|
|
||||||
void (*getCursorPosition)(char *, char *);
|
|
||||||
void (*getCharacterAtCursor)(char *, int *, int *, int *);
|
|
||||||
void (*clearScreen)(void);
|
|
||||||
|
|
||||||
/* Color-control functions */
|
|
||||||
int (*allocColor)(int color);
|
|
||||||
void (*setBackgroundColor)(int fg, int bg);
|
|
||||||
void (*getBackgroundColor)(int *fg, int *bg);
|
|
||||||
|
|
||||||
/* Keyboard Functions */
|
|
||||||
int (*checkForKeystroke)(char *, char *);
|
|
||||||
void (*getKeystroke)(char *, char *);
|
|
||||||
|
|
||||||
/* Windowing Functions */
|
|
||||||
void (*resizeScreen)(int, int);
|
|
||||||
void (*notifyResizeScreen)(int, int); /* May be rethought later... */
|
|
||||||
|
|
||||||
/* Accelerator Functions (Screen) */
|
|
||||||
void (*clearWindow)(char, char, char, char, int, int);
|
|
||||||
void (*scrollUpWindow)(char, char, char, char, char, int, int);
|
|
||||||
void (*scrollDownWindow)(char, char, char, char, char, int, int);
|
|
||||||
|
|
||||||
/* Accelerator Functions (Keyboard) */
|
|
||||||
char (*getCharacter)(void);
|
|
||||||
|
|
||||||
/* Other functions */
|
|
||||||
void (*refresh)(void);
|
|
||||||
|
|
||||||
/* Other data */
|
|
||||||
int norefresh;
|
|
||||||
FILE *console_out;
|
|
||||||
FILE *console_in;
|
|
||||||
int x_res;
|
|
||||||
int y_res;
|
|
||||||
|
|
||||||
} CONSOLE_device;
|
|
||||||
|
|
||||||
extern CONSOLE_device driver; /* Global driver struct */
|
|
||||||
|
|
||||||
/* Generic defines */
|
|
||||||
void CONSOLE_Close(void);
|
|
||||||
void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute);
|
|
||||||
void CONSOLE_MoveCursor(char row, char col);
|
|
||||||
void CONSOLE_ClearWindow(char, char, char, char, int, int);
|
|
||||||
void CONSOLE_ScrollUpWindow(char, char, char, char, char, int, int);
|
|
||||||
void CONSOLE_ScrollDownWindow(char, char, char, char, char, int, int);
|
|
||||||
int CONSOLE_CheckForKeystroke(char *, char*);
|
|
||||||
void CONSOLE_GetKeystroke(char *, char *);
|
|
||||||
void CONSOLE_GetCursorPosition(char *, char *);
|
|
||||||
void CONSOLE_GetCharacterAtCursor(char *, int *, int *, int *);
|
|
||||||
void CONSOLE_Refresh(void);
|
|
||||||
void CONSOLE_SetRefresh(int);
|
|
||||||
int CONSOLE_GetRefresh(void);
|
|
||||||
void CONSOLE_ClearScreen(void);
|
|
||||||
char CONSOLE_GetCharacter(void);
|
|
||||||
void CONSOLE_ResizeScreen(int, int);
|
|
||||||
void CONSOLE_NotifyResizeScreen(int, int);
|
|
||||||
void CONSOLE_WriteRawString(char *);
|
|
||||||
int CONSOLE_AllocColor(int);
|
|
||||||
void CONSOLE_SetBackgroundColor(int fg, int bg);
|
|
||||||
void CONSOLE_GetBackgroundColor(int *fg, int *bg);
|
|
||||||
|
|
||||||
/* Generic Defines */
|
|
||||||
void GENERIC_Start(void);
|
|
||||||
void GENERIC_ClearWindow(char, char, char, char, int, int);
|
|
||||||
void GENERIC_ScrollUpWindow(char, char, char, char, char, int, int);
|
|
||||||
void GENERIC_ScrollDownWindow(char, char, char, char, char, int, int);
|
|
||||||
char GENERIC_GetCharacter(void);
|
|
||||||
|
|
||||||
/* TTY specific defines */
|
|
||||||
void TTY_Write(char out, int fg_color, int bg_color, int attribute);
|
|
||||||
void TTY_Start(void);
|
|
||||||
void TTY_GetKeystroke(char *, char *);
|
|
||||||
|
|
||||||
#ifdef WINE_NCURSES
|
|
||||||
|
|
||||||
/* ncurses defines */
|
|
||||||
void NCURSES_Write(char out, int fg_color, int bg_color, int attribute);
|
|
||||||
void NCURSES_Start(void);
|
|
||||||
void NCURSES_Init(void);
|
|
||||||
void NCURSES_Close(void);
|
|
||||||
int NCURSES_CheckForKeystroke(char *, char *);
|
|
||||||
void NCURSES_GetKeystroke(char *, char *);
|
|
||||||
void NCURSES_MoveCursor(char ,char);
|
|
||||||
void NCURSES_GetCursorPosition(char *, char *);
|
|
||||||
void NCURSES_GetCharacterAtCursor(char *, int *, int *, int *);
|
|
||||||
void NCURSES_Refresh(void);
|
|
||||||
void NCURSES_ClearScreen(void);
|
|
||||||
void NCURSES_NotifyResizeScreen(int x, int y);
|
|
||||||
int NCURSES_AllocColor(int);
|
|
||||||
void NCURSES_SetBackgroundColor(int fg, int bg);
|
|
||||||
void NCURSES_GetBackgroundColor(int *fg, int *bg);
|
|
||||||
|
|
||||||
#endif /* WINE_NCURSES */
|
|
||||||
|
|
||||||
/* Xterm specific defines */
|
|
||||||
void XTERM_Start(void);
|
|
||||||
void XTERM_Close(void);
|
|
||||||
void XTERM_Init(void);
|
|
||||||
void XTERM_ResizeScreen(int x, int y);
|
|
||||||
|
|
||||||
/* Color defines */
|
|
||||||
/* These will eventually be hex triples for dynamic allocation */
|
|
||||||
/* Triplets added by A.C. and commented out until the support */
|
|
||||||
/* code can be written into the console routines. */
|
|
||||||
#define WINE_BLACK 1 /* 0x000000 */
|
|
||||||
#define WINE_BLUE 2 /* 0x0000ff */
|
|
||||||
#define WINE_GREEN 3 /* 0x008000 */
|
|
||||||
#define WINE_CYAN 4 /* 0x00eeee */
|
|
||||||
#define WINE_MAGENTA 5 /* 0xcd00cd */
|
|
||||||
#define WINE_BROWN 6 /* 0xcd3333 */
|
|
||||||
#define WINE_RED 7 /* 0xff0000 */
|
|
||||||
#define WINE_LIGHT_GRAY 8 /* 0xc0c0c0 */
|
|
||||||
#define WINE_DARK_GRAY 9 /* 0x808080 */
|
|
||||||
#define WINE_LIGHT_BLUE 10 /* 0x98f5ff */
|
|
||||||
#define WINE_LIGHT_GREEN 11 /* 0x00ff00 */
|
|
||||||
#define WINE_LIGHT_RED 12 /* 0xee6363 */
|
|
||||||
#define WINE_LIGHT_MAGENTA 13 /* 0xff00ff */
|
|
||||||
#define WINE_LIGHT_CYAN 14 /* 0x00ffff */
|
|
||||||
#define WINE_YELLOW 15 /* 0xffff00 */
|
|
||||||
#define WINE_WHITE 16 /* 0xffffff */
|
|
||||||
|
|
||||||
#endif /* CONSOLE_H */
|
|
Loading…
Reference in New Issue