From 06591f671f52bd49495fe1d3cc6b6b89deda0e25 Mon Sep 17 00:00:00 2001 From: Joseph Pranevich Date: Fri, 25 Dec 1998 08:48:56 +0000 Subject: [PATCH] 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. --- console/interface.c | 100 ++++++++++++++++++++++++++++++++++++-------- include/console.h | 10 ++++- include/options.h | 1 + loader/main.c | 4 -- misc/main.c | 13 +++++- 5 files changed, 104 insertions(+), 24 deletions(-) diff --git a/console/interface.c b/console/interface.c index 0e20550c7dd..252350d5aef 100644 --- a/console/interface.c +++ b/console/interface.c @@ -7,14 +7,14 @@ may be provided here in the future. */ #include +#include +#include #include "windows.h" #include "console.h" #include "config.h" -/* I did this without realizing that CONSOLE_* was actually used by - the Win32 console driver. I will definately have to rename these - functions to avoid the name clash... */ +static int pop_driver(char **, char **, int *); 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... */ driver.console_out = stdout; 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) driver.init(); @@ -110,25 +129,25 @@ int CONSOLE_CheckForKeystroke(char *scan, char *ascii) void CONSOLE_GetKeystroke(char *scan, char *ascii) { if (driver.getKeystroke) - return driver.getKeystroke(scan, ascii); + driver.getKeystroke(scan, ascii); } void CONSOLE_GetCursorPosition(char *row, char *col) { if (driver.getCursorPosition) - return driver.getCursorPosition(row, col); + driver.getCursorPosition(row, col); } void CONSOLE_GetCharacterAtCursor(char *ch, int *fg, int *bg, int *a) { if (driver.getCharacterAtCursor) - return driver.getCharacterAtCursor(ch, fg, bg, a); + driver.getCharacterAtCursor(ch, fg, bg, a); } void CONSOLE_Refresh() { if (driver.refresh) - return driver.refresh(); + driver.refresh(); } /* This function is only at the CONSOLE level. */ @@ -153,7 +172,11 @@ int CONSOLE_GetRefresh() void CONSOLE_ClearScreen() { if (driver.clearScreen) - return driver.clearScreen(); + { + driver.clearScreen(); + if (!driver.norefresh) + CONSOLE_Refresh(); + } } char CONSOLE_GetCharacter() @@ -165,3 +188,46 @@ char CONSOLE_GetCharacter() else 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; + +} diff --git a/include/console.h b/include/console.h index 0f1fbebaca1..9e1be14cf5f 100644 --- a/include/console.h +++ b/include/console.h @@ -11,6 +11,8 @@ #include "config.h" +#define CONSOLE_DEFAULT_DRIVER "tty" + typedef struct CONSOLE_DRIVER { void (*init)(); @@ -25,6 +27,10 @@ typedef struct CONSOLE_DRIVER int (*checkForKeystroke)(char *, char *); void (*getKeystroke)(char *, char *); + /* Windowing Functions */ + void (*resizeScreen)(int, int); + void (*notifyResizeScreen)(int, int); /* May be rethought later... */ + /* Accellerator Functions (Screen) */ void (*clearWindow)(char, char, char, char, int, int); void (*scrollUpWindow)(char, char, char, char, char, int, int); @@ -46,7 +52,7 @@ typedef struct CONSOLE_DRIVER CONSOLE_device driver; /* Global driver struct */ /* Generic defines */ -void CONSOLE_Init(); +void CONSOLE_Init(char *drivers); void CONSOLE_Close(); void CONSOLE_Write(char out, int fg_color, int bg_color, int attribute); void CONSOLE_MoveCursor(char row, char col); @@ -62,6 +68,8 @@ void CONSOLE_SetRefresh(int); int CONSOLE_GetRefresh(); void CONSOLE_ClearScreen(); char CONSOLE_GetCharacter(); +void CONSOLE_ResizeScreen(); +void CONSOLE_NotifyResizeScreen(); /* Generic Defines */ void GENERIC_Start(); diff --git a/include/options.h b/include/options.h index 2d2f718e436..9a09ecb3673 100644 --- a/include/options.h +++ b/include/options.h @@ -70,6 +70,7 @@ struct options int perfectGraphics; /* Favor correctness over speed for graphics */ int noDGA; /* Disable XFree86 DGA extensions */ char * configFileName; /* Command line config file */ + char * consoleDrivers; /* Console driver list */ }; extern struct options Options; diff --git a/loader/main.c b/loader/main.c index a2f64a83236..4c2d6677e32 100644 --- a/loader/main.c +++ b/loader/main.c @@ -42,7 +42,6 @@ #include "task.h" #include "debug.h" #include "psdrv.h" -#include "console.h" int __winelib = 1; /* Winelib run-time flag */ @@ -81,9 +80,6 @@ BOOL32 MAIN_MainInit(void) /* registry initialisation */ SHELL_LoadRegistry(); - /* Set up text-mode stuff */ - CONSOLE_Init(); - return TRUE; } diff --git a/misc/main.c b/misc/main.c index 6d39dbecdf9..d56195acbab 100644 --- a/misc/main.c +++ b/misc/main.c @@ -95,7 +95,8 @@ struct options Options = FALSE, /* Managed windows */ FALSE, /* Perfect graphics */ FALSE, /* No DGA */ - NULL /* Alternate config file name */ + NULL, /* Alternate config file name */ + NULL /* Console driver list */ }; @@ -120,7 +121,8 @@ static XrmOptionDescRec optionsTable[] = { "-managed", ".managed", XrmoptionNoArg, (caddr_t)"off"}, { "-winver", ".winver", 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])) @@ -132,6 +134,7 @@ static XrmOptionDescRec optionsTable[] = "Options:\n" \ " -backingstore Turn on backing store\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" \ " -debugmsg name Turn debugging-messages on or off\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[] ) Options.configFileName = xstrdup((char *)value.addr); if (MAIN_GetResource( db, ".nodga", &value)) 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); }