Commit db31151b authored by Andreas Mohr's avatar Andreas Mohr Committed by Alexandre Julliard

Implemented set cursor shape functionality.

parent e921e466
...@@ -36,11 +36,10 @@ static void scroll_window(int direction, char lines, char row1, ...@@ -36,11 +36,10 @@ static void scroll_window(int direction, char lines, char row1,
#define SCROLL_UP 1 #define SCROLL_UP 1
#define SCROLL_DOWN 2 #define SCROLL_DOWN 2
/* FIXME: is row or column first? */
static void BIOS_GetCursorPos(BIOSDATA*data,unsigned page,unsigned*X,unsigned*Y) static void BIOS_GetCursorPos(BIOSDATA*data,unsigned page,unsigned*X,unsigned*Y)
{ {
*X = data->VideoCursorPos[page*2]; *X = data->VideoCursorPos[page*2]; /* column */
*Y = data->VideoCursorPos[page*2+1]; *Y = data->VideoCursorPos[page*2+1]; /* row */
} }
static void BIOS_SetCursorPos(BIOSDATA*data,unsigned page,unsigned X,unsigned Y) static void BIOS_SetCursorPos(BIOSDATA*data,unsigned page,unsigned X,unsigned Y)
...@@ -365,7 +364,9 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context ) ...@@ -365,7 +364,9 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
break; break;
case 0x01: /* SET CURSOR SHAPE */ case 0x01: /* SET CURSOR SHAPE */
FIXME("Set Cursor Shape - Not Supported\n"); TRACE("Set Cursor Shape start %d end %d options %d\n", CH_reg(context) & 0x1f, CL_reg(context) & 0x1f, CH_reg(context) & 0xe0);
data->VideoCursorType = CX_reg(context); /* direct copy */
VGA_SetCursorShape(CH_reg(context), CL_reg(context));
break; break;
case 0x02: /* SET CURSOR POSITION */ case 0x02: /* SET CURSOR POSITION */
......
...@@ -473,6 +473,21 @@ void VGA_GetAlphaMode(unsigned*Xres,unsigned*Yres) ...@@ -473,6 +473,21 @@ void VGA_GetAlphaMode(unsigned*Xres,unsigned*Yres)
if (Yres) *Yres=info.dwSize.Y; if (Yres) *Yres=info.dwSize.Y;
} }
void VGA_SetCursorShape(unsigned char start_options, unsigned char end)
{
CONSOLE_CURSOR_INFO cci;
/* standard cursor settings:
* 0x0607 == CGA, 0x0b0c == monochrome, 0x0d0e == EGA/VGA */
/* calculate percentage from bottom - assuming VGA (bottom 0x0e) */
cci.dwSize = ((end & 0x1f) - (start_options & 0x1f))/0x0e * 100;
if (!cci.dwSize) cci.dwSize++; /* NULL cursor would make SCCI() fail ! */
cci.bVisible = ((start_options & 0x60) != 0x20); /* invisible ? */
SetConsoleCursorInfo(VGA_AlphaConsole(),&cci);
}
void VGA_SetCursorPos(unsigned X,unsigned Y) void VGA_SetCursorPos(unsigned X,unsigned Y)
{ {
COORD pos; COORD pos;
......
...@@ -40,6 +40,7 @@ void VGA_Unlock(void); ...@@ -40,6 +40,7 @@ void VGA_Unlock(void);
/* text mode */ /* text mode */
int VGA_SetAlphaMode(unsigned Xres,unsigned Yres); int VGA_SetAlphaMode(unsigned Xres,unsigned Yres);
void VGA_GetAlphaMode(unsigned*Xres,unsigned*Yres); void VGA_GetAlphaMode(unsigned*Xres,unsigned*Yres);
void VGA_SetCursorShape(unsigned char start_options,unsigned char end);
void VGA_SetCursorPos(unsigned X,unsigned Y); void VGA_SetCursorPos(unsigned X,unsigned Y);
void VGA_GetCursorPos(unsigned*X,unsigned*Y); void VGA_GetCursorPos(unsigned*X,unsigned*Y);
void VGA_WriteChars(unsigned X,unsigned Y,unsigned ch,int attr,int count); void VGA_WriteChars(unsigned X,unsigned Y,unsigned ch,int attr,int count);
......
...@@ -60,7 +60,7 @@ typedef struct ...@@ -60,7 +60,7 @@ typedef struct
WORD VideoColumns; /* 4a: Number of columns */ WORD VideoColumns; /* 4a: Number of columns */
WORD VideoPageSize; /* 4c: Video page size in bytes */ WORD VideoPageSize; /* 4c: Video page size in bytes */
WORD VideoPageStartAddr; /* 4e: Video page start address */ WORD VideoPageStartAddr; /* 4e: Video page start address */
BYTE VideoCursorPos[16]; /* 50: Cursor position for 8 pages */ BYTE VideoCursorPos[16]; /* 50: Cursor position for 8 pages, column/row order */
WORD VideoCursorType; /* 60: Video cursor type */ WORD VideoCursorType; /* 60: Video cursor type */
BYTE VideoCurPage; /* 62: Video current page */ BYTE VideoCurPage; /* 62: Video current page */
WORD VideoCtrlAddr WINE_PACKED; /* 63: Video controller address */ WORD VideoCtrlAddr WINE_PACKED; /* 63: Video controller address */
......
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