Added console support.
[wine] / console / generic.c
1 /* generic.c */
2
3 /* This is a driver to implement, when possible, "high-level"
4    routines using only low level calls. This is to make it possible
5    to have accelerated functions for the individual drivers...
6    or to simply not bother with them. */
7
8 /* When creating new drivers, you need to assign all the functions that
9    that driver supports into the driver struct. If it is a supplementary
10    driver, it should make sure to perserve the old values. */
11
12 #include <stdio.h>
13 #include "console.h"
14 #include "config.h"
15 #include "debug.h"
16
17 void GENERIC_Start()
18 {
19    /* Here, we only want to add a driver if there is not one already
20       defined. */
21
22    TRACE(console, "GENERIC_Start\n");
23
24    if (!driver.clearWindow)
25       driver.clearWindow = GENERIC_ClearWindow;
26
27    if (!driver.scrollUpWindow)
28       driver.scrollUpWindow = GENERIC_ScrollUpWindow;
29
30    if (!driver.scrollDownWindow)
31       driver.scrollDownWindow = GENERIC_ScrollDownWindow;
32
33    if (!driver.getCharacter)
34       driver.getCharacter = GENERIC_GetCharacter;
35 }
36
37 void GENERIC_ClearWindow(char row1, char col1, char row2, char col2, 
38    int bg_color, int attribute)
39 {
40    char trow, tcol;
41    char x, y;
42    int old_refresh;
43
44    TRACE(console, "GENERIC_ClearWindow()\n");
45    /* Abort if we have only partial functionality */
46    if (!(driver.getCursorPosition && driver.moveCursor && driver.write))
47       return;
48
49    old_refresh = CONSOLE_GetRefresh();
50    CONSOLE_SetRefresh(FALSE);
51
52    CONSOLE_GetCursorPosition(&trow, &tcol);
53    
54    for (x = row1; x < row2; x++)
55    {
56       CONSOLE_MoveCursor(x, col1);
57
58       for (y = col1; y < col2; y++)
59       {
60          CONSOLE_Write(' ', 0, bg_color, attribute);
61       }
62    }
63    CONSOLE_MoveCursor(trow, tcol);
64
65    CONSOLE_SetRefresh(old_refresh);
66
67    TRACE(console, "GENERIC_ClearWindow() completed.\n");
68 }      
69
70 /* These are in-progress. I just haven't finished them yet... */
71 void GENERIC_ScrollUpWindow(char row1, char col1, char row2, char col2, 
72    char lines, int bg_color, int attribute)
73 {
74    char trow, tcol;
75    int x, y;
76    char ch;
77    int bg, fg, attr;
78    int old_refresh;
79
80    TRACE(console, "GENERIC_ScrollUpWindow()\n");
81
82    /* Abort if we have only partial functionality */
83    if (!(driver.getCursorPosition && driver.moveCursor && driver.write
84       && driver.getCharacterAtCursor && driver.clearWindow))
85       return;
86
87    old_refresh = CONSOLE_GetRefresh();
88    CONSOLE_SetRefresh(FALSE);
89
90    CONSOLE_GetCursorPosition(&trow, &tcol);
91    
92    for (x = row1 + lines; x < row2; x++)
93    {
94       for (y = col1; y < col2; y++)
95       {
96          CONSOLE_MoveCursor(x, y);
97          CONSOLE_GetCharacterAtCursor(&ch, &fg, &bg, &attr);
98          CONSOLE_MoveCursor(x - lines, y);
99          CONSOLE_Write(ch, fg, bg, attr);
100       }
101    }         
102    CONSOLE_ClearWindow(row2 - lines, col1, row2, col2, bg_color,
103       attribute);         
104    CONSOLE_MoveCursor(trow, tcol);
105
106    CONSOLE_SetRefresh(old_refresh);
107
108    TRACE(console, "GENERIC_ScrollUpWindow() completed.\n");
109 }
110
111 void GENERIC_ScrollDownWindow(char row1, char col1, char row2, char col2, 
112    char lines, int bg_color, int attribute)
113 {
114    char trow, tcol;
115    int x, y;
116    char ch;
117    int bg, fg, attr;
118    int old_refresh;
119
120    TRACE(console, "GENERIC_ScrollDownWindow()\n");
121
122    /* Abort if we have only partial functionality */
123    if (!(driver.getCursorPosition && driver.moveCursor && driver.write
124       && driver.getCharacterAtCursor && driver.clearWindow))
125       return;
126
127    old_refresh = CONSOLE_GetRefresh();
128    CONSOLE_SetRefresh(FALSE);
129
130    CONSOLE_GetCursorPosition(&trow, &tcol);
131    
132    for (x = row2 - lines; x > row1; x--)
133    {
134       for (y = col1; y < col2; y++)
135       {
136          CONSOLE_MoveCursor(x, y);
137          CONSOLE_GetCharacterAtCursor(&ch, &fg, &bg, &attr);
138          CONSOLE_MoveCursor(x + lines, y);
139          CONSOLE_Write(ch, fg, bg, attr);
140       }
141    }         
142    CONSOLE_ClearWindow(row1, col1, row1 + lines, col2, bg_color,
143       attribute); 
144    CONSOLE_MoveCursor(trow, tcol);
145
146    CONSOLE_SetRefresh(old_refresh);
147
148    TRACE(console, "GENERIC_ScrollDownWindow() completed.\n");
149
150 }
151
152 char GENERIC_GetCharacter()
153 {
154    /* Keep getting keys until we get one with a char value */
155    char ch = (char) 0, scan;
156    
157    while (!ch)
158    {
159       CONSOLE_GetKeystroke(&ch, &scan);
160    }
161    return ch;
162 }
163