| /* generic.c */ | |
| /* 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. */ | |
| /* 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 <stdio.h> | |
| #include "console.h" | |
| #include "config.h" | |
| #include "debug.h" | |
| void GENERIC_Start() | |
| { | |
| /* Here, we only want to add a driver if there is not one already | |
| defined. */ | |
| TRACE(console, "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; | |
| char x, y; | |
| int old_refresh; | |
| TRACE(console, "GENERIC_ClearWindow()\n"); | |
| /* 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++) | |
| { | |
| CONSOLE_MoveCursor(x, col1); | |
| for (y = col1; y < col2; y++) | |
| { | |
| CONSOLE_Write(' ', 0, bg_color, attribute); | |
| } | |
| } | |
| CONSOLE_MoveCursor(trow, tcol); | |
| CONSOLE_SetRefresh(old_refresh); | |
| TRACE(console, "GENERIC_ClearWindow() completed.\n"); | |
| } | |
| /* These are in-progress. I just haven't finished them yet... */ | |
| void GENERIC_ScrollUpWindow(char row1, char col1, char row2, char col2, | |
| char lines, int bg_color, int attribute) | |
| { | |
| char trow, tcol; | |
| int x, y; | |
| char ch; | |
| int bg, fg, attr; | |
| int old_refresh; | |
| TRACE(console, "GENERIC_ScrollUpWindow()\n"); | |
| /* Abort if we have only partial functionality */ | |
| if (!(driver.getCursorPosition && driver.moveCursor && driver.write | |
| && driver.getCharacterAtCursor && driver.clearWindow)) | |
| return; | |
| old_refresh = CONSOLE_GetRefresh(); | |
| CONSOLE_SetRefresh(FALSE); | |
| CONSOLE_GetCursorPosition(&trow, &tcol); | |
| for (x = row1 + lines; x < row2; x++) | |
| { | |
| for (y = col1; y < col2; y++) | |
| { | |
| CONSOLE_MoveCursor(x, y); | |
| CONSOLE_GetCharacterAtCursor(&ch, &fg, &bg, &attr); | |
| CONSOLE_MoveCursor(x - lines, y); | |
| CONSOLE_Write(ch, fg, bg, attr); | |
| } | |
| } | |
| CONSOLE_ClearWindow(row2 - lines, col1, row2, col2, bg_color, | |
| attribute); | |
| CONSOLE_MoveCursor(trow, tcol); | |
| CONSOLE_SetRefresh(old_refresh); | |
| TRACE(console, "GENERIC_ScrollUpWindow() completed.\n"); | |
| } | |
| void GENERIC_ScrollDownWindow(char row1, char col1, char row2, char col2, | |
| char lines, int bg_color, int attribute) | |
| { | |
| char trow, tcol; | |
| int x, y; | |
| char ch; | |
| int bg, fg, attr; | |
| int old_refresh; | |
| TRACE(console, "GENERIC_ScrollDownWindow()\n"); | |
| /* Abort if we have only partial functionality */ | |
| if (!(driver.getCursorPosition && driver.moveCursor && driver.write | |
| && driver.getCharacterAtCursor && driver.clearWindow)) | |
| return; | |
| old_refresh = CONSOLE_GetRefresh(); | |
| CONSOLE_SetRefresh(FALSE); | |
| CONSOLE_GetCursorPosition(&trow, &tcol); | |
| for (x = row2 - lines; x > row1; x--) | |
| { | |
| for (y = col1; y < col2; y++) | |
| { | |
| CONSOLE_MoveCursor(x, y); | |
| CONSOLE_GetCharacterAtCursor(&ch, &fg, &bg, &attr); | |
| CONSOLE_MoveCursor(x + lines, y); | |
| CONSOLE_Write(ch, fg, bg, attr); | |
| } | |
| } | |
| CONSOLE_ClearWindow(row1, col1, row1 + lines, col2, bg_color, | |
| attribute); | |
| CONSOLE_MoveCursor(trow, tcol); | |
| CONSOLE_SetRefresh(old_refresh); | |
| TRACE(console, "GENERIC_ScrollDownWindow() completed.\n"); | |
| } | |
| char GENERIC_GetCharacter() | |
| { | |
| /* Keep getting keys until we get one with a char value */ | |
| char ch = (char) 0, scan; | |
| while (!ch) | |
| { | |
| CONSOLE_GetKeystroke(&ch, &scan); | |
| } | |
| return ch; | |
| } | |