Commit 06591f67 authored by Joseph Pranevich's avatar Joseph Pranevich Committed by Alexandre Julliard

Add support for selection of console mode drivers to use using the

-console option. Currently "tty", "ncurses", and "xterm" are supported. Add stubs for resizing the screen on mode changes.
parent c65f4a47
...@@ -7,14 +7,14 @@ ...@@ -7,14 +7,14 @@
may be provided here in the future. */ may be provided here in the future. */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "windows.h" #include "windows.h"
#include "console.h" #include "console.h"
#include "config.h" #include "config.h"
/* I did this without realizing that CONSOLE_* was actually used by static int pop_driver(char **, char **, int *);
the Win32 console driver. I will definately have to rename these
functions to avoid the name clash... */
void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute) void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute)
{ {
...@@ -26,20 +26,39 @@ void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute) ...@@ -26,20 +26,39 @@ void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute)
} }
} }
void CONSOLE_Init() void CONSOLE_Init(char *drivers)
{ {
/* When this function is called 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.
*/
char *single;
int length;
/* Suitable defaults... */ /* Suitable defaults... */
driver.console_out = stdout; driver.console_out = stdout;
driver.console_in = stdin; driver.console_in = stdin;
/* Eventually, this will be a command-line choice */
#ifndef WINE_NCURSES
TTY_Start();
#else
NCURSES_Start();
#endif
GENERIC_Start();
/*XTERM_Start();*/ 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();
}
GENERIC_Start();
if (driver.init) if (driver.init)
driver.init(); driver.init();
...@@ -110,25 +129,25 @@ int CONSOLE_CheckForKeystroke(char *scan, char *ascii) ...@@ -110,25 +129,25 @@ int CONSOLE_CheckForKeystroke(char *scan, char *ascii)
void CONSOLE_GetKeystroke(char *scan, char *ascii) void CONSOLE_GetKeystroke(char *scan, char *ascii)
{ {
if (driver.getKeystroke) if (driver.getKeystroke)
return driver.getKeystroke(scan, ascii); driver.getKeystroke(scan, ascii);
} }
void CONSOLE_GetCursorPosition(char *row, char *col) void CONSOLE_GetCursorPosition(char *row, char *col)
{ {
if (driver.getCursorPosition) if (driver.getCursorPosition)
return driver.getCursorPosition(row, col); driver.getCursorPosition(row, col);
} }
void CONSOLE_GetCharacterAtCursor(char *ch, int *fg, int *bg, int *a) void CONSOLE_GetCharacterAtCursor(char *ch, int *fg, int *bg, int *a)
{ {
if (driver.getCharacterAtCursor) if (driver.getCharacterAtCursor)
return driver.getCharacterAtCursor(ch, fg, bg, a); driver.getCharacterAtCursor(ch, fg, bg, a);
} }
void CONSOLE_Refresh() void CONSOLE_Refresh()
{ {
if (driver.refresh) if (driver.refresh)
return driver.refresh(); driver.refresh();
} }
/* This function is only at the CONSOLE level. */ /* This function is only at the CONSOLE level. */
...@@ -153,7 +172,11 @@ int CONSOLE_GetRefresh() ...@@ -153,7 +172,11 @@ int CONSOLE_GetRefresh()
void CONSOLE_ClearScreen() void CONSOLE_ClearScreen()
{ {
if (driver.clearScreen) if (driver.clearScreen)
return driver.clearScreen(); {
driver.clearScreen();
if (!driver.norefresh)
CONSOLE_Refresh();
}
} }
char CONSOLE_GetCharacter() char CONSOLE_GetCharacter()
...@@ -165,3 +188,46 @@ char CONSOLE_GetCharacter() ...@@ -165,3 +188,46 @@ char CONSOLE_GetCharacter()
else else
return (char) 0; /* Sure, this will probably break programs... */ return (char) 0; /* Sure, this will probably break programs... */
} }
void CONSOLE_ResizeScreen(int x, int y)
{
if (driver.resizeScreen)
driver.resizeScreen(x, y);
}
void CONSOLE_NotifyResizeScreen(int x, int y)
{
if (driver.resizeScreen)
driver.resizeScreen(x, y);
}
/* 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] != NULL) && (*drivers[0] != '+'))
{
(*drivers)++;
(*length)++;
}
while (*drivers[0] == '+')
(*drivers)++;
if (*length)
return TRUE;
else
return FALSE;
}
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "config.h" #include "config.h"
#define CONSOLE_DEFAULT_DRIVER "tty"
typedef struct CONSOLE_DRIVER typedef struct CONSOLE_DRIVER
{ {
void (*init)(); void (*init)();
...@@ -25,6 +27,10 @@ typedef struct CONSOLE_DRIVER ...@@ -25,6 +27,10 @@ typedef struct CONSOLE_DRIVER
int (*checkForKeystroke)(char *, char *); int (*checkForKeystroke)(char *, char *);
void (*getKeystroke)(char *, char *); void (*getKeystroke)(char *, char *);
/* Windowing Functions */
void (*resizeScreen)(int, int);
void (*notifyResizeScreen)(int, int); /* May be rethought later... */
/* Accellerator Functions (Screen) */ /* Accellerator Functions (Screen) */
void (*clearWindow)(char, char, char, char, int, int); void (*clearWindow)(char, char, char, char, int, int);
void (*scrollUpWindow)(char, char, char, char, char, int, int); void (*scrollUpWindow)(char, char, char, char, char, int, int);
...@@ -46,7 +52,7 @@ typedef struct CONSOLE_DRIVER ...@@ -46,7 +52,7 @@ typedef struct CONSOLE_DRIVER
CONSOLE_device driver; /* Global driver struct */ CONSOLE_device driver; /* Global driver struct */
/* Generic defines */ /* Generic defines */
void CONSOLE_Init(); void CONSOLE_Init(char *drivers);
void CONSOLE_Close(); void CONSOLE_Close();
void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute); void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute);
void CONSOLE_MoveCursor(char row, char col); void CONSOLE_MoveCursor(char row, char col);
...@@ -62,6 +68,8 @@ void CONSOLE_SetRefresh(int); ...@@ -62,6 +68,8 @@ void CONSOLE_SetRefresh(int);
int CONSOLE_GetRefresh(); int CONSOLE_GetRefresh();
void CONSOLE_ClearScreen(); void CONSOLE_ClearScreen();
char CONSOLE_GetCharacter(); char CONSOLE_GetCharacter();
void CONSOLE_ResizeScreen();
void CONSOLE_NotifyResizeScreen();
/* Generic Defines */ /* Generic Defines */
void GENERIC_Start(); void GENERIC_Start();
......
...@@ -70,6 +70,7 @@ struct options ...@@ -70,6 +70,7 @@ struct options
int perfectGraphics; /* Favor correctness over speed for graphics */ int perfectGraphics; /* Favor correctness over speed for graphics */
int noDGA; /* Disable XFree86 DGA extensions */ int noDGA; /* Disable XFree86 DGA extensions */
char * configFileName; /* Command line config file */ char * configFileName; /* Command line config file */
char * consoleDrivers; /* Console driver list */
}; };
extern struct options Options; extern struct options Options;
......
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
#include "task.h" #include "task.h"
#include "debug.h" #include "debug.h"
#include "psdrv.h" #include "psdrv.h"
#include "console.h"
int __winelib = 1; /* Winelib run-time flag */ int __winelib = 1; /* Winelib run-time flag */
...@@ -81,9 +80,6 @@ BOOL32 MAIN_MainInit(void) ...@@ -81,9 +80,6 @@ BOOL32 MAIN_MainInit(void)
/* registry initialisation */ /* registry initialisation */
SHELL_LoadRegistry(); SHELL_LoadRegistry();
/* Set up text-mode stuff */
CONSOLE_Init();
return TRUE; return TRUE;
} }
......
...@@ -95,7 +95,8 @@ struct options Options = ...@@ -95,7 +95,8 @@ struct options Options =
FALSE, /* Managed windows */ FALSE, /* Managed windows */
FALSE, /* Perfect graphics */ FALSE, /* Perfect graphics */
FALSE, /* No DGA */ FALSE, /* No DGA */
NULL /* Alternate config file name */ NULL, /* Alternate config file name */
NULL /* Console driver list */
}; };
...@@ -120,7 +121,8 @@ static XrmOptionDescRec optionsTable[] = ...@@ -120,7 +121,8 @@ static XrmOptionDescRec optionsTable[] =
{ "-managed", ".managed", XrmoptionNoArg, (caddr_t)"off"}, { "-managed", ".managed", XrmoptionNoArg, (caddr_t)"off"},
{ "-winver", ".winver", XrmoptionSepArg, (caddr_t)NULL }, { "-winver", ".winver", XrmoptionSepArg, (caddr_t)NULL },
{ "-config", ".config", XrmoptionSepArg, (caddr_t)NULL }, { "-config", ".config", XrmoptionSepArg, (caddr_t)NULL },
{ "-nodga", ".nodga", XrmoptionNoArg, (caddr_t)"off"} { "-nodga", ".nodga", XrmoptionNoArg, (caddr_t)"off"},
{ "-console", ".console", XrmoptionSepArg, (caddr_t)NULL }
}; };
#define NB_OPTIONS (sizeof(optionsTable) / sizeof(optionsTable[0])) #define NB_OPTIONS (sizeof(optionsTable) / sizeof(optionsTable[0]))
...@@ -132,6 +134,7 @@ static XrmOptionDescRec optionsTable[] = ...@@ -132,6 +134,7 @@ static XrmOptionDescRec optionsTable[] =
"Options:\n" \ "Options:\n" \
" -backingstore Turn on backing store\n" \ " -backingstore Turn on backing store\n" \
" -config name Specify config file to use\n" \ " -config name Specify config file to use\n" \
" -console driver Select which driver(s) to use for the console\n" \
" -debug Enter debugger before starting application\n" \ " -debug Enter debugger before starting application\n" \
" -debugmsg name Turn debugging-messages on or off\n" \ " -debugmsg name Turn debugging-messages on or off\n" \
" -depth n Change the depth to use for multiple-depth screens\n" \ " -depth n Change the depth to use for multiple-depth screens\n" \
...@@ -877,6 +880,12 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) ...@@ -877,6 +880,12 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
Options.configFileName = xstrdup((char *)value.addr); Options.configFileName = xstrdup((char *)value.addr);
if (MAIN_GetResource( db, ".nodga", &value)) if (MAIN_GetResource( db, ".nodga", &value))
Options.noDGA = TRUE; Options.noDGA = TRUE;
if (MAIN_GetResource( db, ".console", &value))
Options.consoleDrivers = xstrdup((char *)value.addr);
else
Options.consoleDrivers = CONSOLE_DEFAULT_DRIVER;
CONSOLE_Init(Options.consoleDrivers);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment