Get mouse cursor working under VMware

svn path=/trunk/; revision=4286
This commit is contained in:
Gé van Geldorp 2003-03-11 00:21:41 +00:00
parent aee47209b1
commit ab42b89f19
7 changed files with 145 additions and 100 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: pointer.c,v 1.13 2003/01/25 23:06:32 ei Exp $
/* $Id: pointer.c,v 1.14 2003/03/11 00:21:40 gvg Exp $
*
* PROJECT: ReactOS VGA16 display driver
* FILE: drivers/dd/vga/display/objects/pointer.c
@ -76,9 +76,10 @@ VGADDI_BltPointerToVGA(ULONG StartX, ULONG StartY, ULONG SizeX,
/* Write the mask. */
Video = (PUCHAR)vidmem + StartY * 80 + (StartX >> 3);
Src = MaskBits;
for (i = 0; i < SizeY; i++, Video+=80, Src+=MaskPitch)
Src = MaskBits + SizeY * MaskPitch;
for (i = 0; i < SizeY; i++, Video+=80)
{
Src -= MaskPitch;
SrcValue = (*Src) >> (StartX % 8);
(VOID)READ_REGISTER_UCHAR(Video);
WRITE_REGISTER_UCHAR(Video, SrcValue);
@ -101,7 +102,7 @@ VGADDI_BltPointerToVGA(ULONG StartX, ULONG StartY, ULONG SizeX,
for (i = StartY; i < EndY; i++)
{
Video = (PUCHAR)vidmem + i * 80 + (Left >> 3);
Src = MaskBits + (i - StartY) * MaskPitch;
Src = MaskBits + (EndY - i - 1) * MaskPitch;
for (j = 0; j < Length; j++, Video++, Src++)
{
if ((StartX % 8) != 0)
@ -127,9 +128,10 @@ VGADDI_BltPointerToVGA(ULONG StartX, ULONG StartY, ULONG SizeX,
WRITE_PORT_UCHAR((PUCHAR)GRA_D, Mask);
Video = (PUCHAR)vidmem + StartY * 80 + (EndX >> 3);
Src = MaskBits + (SizeX >> 3) - 1;
for (i = StartY; i < EndY; i++, Video+=80, Src+=MaskPitch)
Src = MaskBits + SizeY * MaskPitch + (SizeX >> 3) - 1;
for (i = StartY; i < EndY; i++, Video+=80)
{
Src -= MaskPitch;
SrcValue = (Src[0] << (8 - (StartX % 8)));
(VOID)READ_REGISTER_UCHAR(Video);
WRITE_REGISTER_UCHAR(Video, SrcValue);
@ -279,6 +281,8 @@ DrvSetPointerShape(PSURFOBJ pso,
/* Show the cursor */
VGADDI_ShowCursor(ppdev);
return SPS_ACCEPT_EXCLUDE;
}
VOID
@ -303,7 +307,7 @@ VOID
VGADDI_ShowCursor(PPDEV ppdev)
{
ULONG i, j, cx, cy;
PUCHAR AndMask;
PUCHAR XorMask;
ULONG SizeX;
if (ppdev->pPointerAttributes->Enable != 0)
@ -326,20 +330,20 @@ VGADDI_ShowCursor(PPDEV ppdev)
ppdev->pPointerAttributes->Height);
/* Display the cursor. */
AndMask = ppdev->pPointerAttributes->Pixels +
XorMask = ppdev->pPointerAttributes->Pixels +
ppdev->pPointerAttributes->WidthInBytes *
ppdev->pPointerAttributes->Height;
VGADDI_BltPointerToVGA(ppdev->xyCursor.x,
ppdev->xyCursor.y,
ppdev->pPointerAttributes->Width,
ppdev->pPointerAttributes->Height,
AndMask,
ppdev->pPointerAttributes->Pixels,
VGA_AND);
VGADDI_BltPointerToVGA(ppdev->xyCursor.x,
ppdev->xyCursor.y,
ppdev->pPointerAttributes->Width,
ppdev->pPointerAttributes->Height,
ppdev->pPointerAttributes->Pixels,
XorMask,
VGA_XOR);
/* Save the new cursor location. */

View file

@ -1,6 +1,9 @@
#ifndef __WIN32K_MISC_H
#define __WIN32K_MISC_H
/* Process context in which miniport driver is opened/used */
extern PEPROCESS W32kDeviceProcess;
BOOLEAN
STDCALL
W32kInitialize (VOID);

View file

@ -9,6 +9,7 @@
*/
#include <ddk/ntddk.h>
#include <win32k/misc.h>
#define NDEBUG
#include <debug.h>
@ -32,16 +33,21 @@ EngDeviceIoControl(HANDLE hDevice,
KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
/* Switch to process context in which hDevice is valid */
KeAttachProcess(W32kDeviceProcess);
Status = ObReferenceObjectByHandle(hDevice,
FILE_READ_DATA | FILE_WRITE_DATA,
IoFileObjectType,
KernelMode,
(PVOID *)&FileObject,
NULL);
if (!NT_SUCCESS(Status))
{
return(Status);
}
KeDetachProcess();
if (!NT_SUCCESS(Status))
{
return(Status);
}
Irp = IoBuildDeviceIoControlRequest(dwIoControlCode,
FileObject->DeviceObject,

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: mouse.c,v 1.19 2003/03/09 15:00:51 jfilby Exp $
/* $Id: mouse.c,v 1.20 2003/03/11 00:21:41 gvg Exp $
*
* PROJECT: ReactOS kernel
* PURPOSE: Mouse
@ -33,6 +33,8 @@
#include <win32k/dc.h>
#include "objects.h"
#include "include/msgqueue.h"
#include "include/object.h"
#include "include/winsta.h"
#define NDEBUG
#include <debug.h>
@ -44,73 +46,74 @@ static BOOLEAN SafetySwitch2 = FALSE;
static BOOLEAN MouseEnabled = FALSE;
static LONG mouse_x, mouse_y;
static UINT mouse_width = 0, mouse_height = 0;
static ULONG PointerStatus;
static UCHAR DefaultCursor[256] = {
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0x00, 0x00,
0x00, 0xC0, 0x00, 0x00,
0x01, 0x80, 0x00, 0x00,
0x01, 0x80, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00,
0x43, 0x00, 0x00, 0x00,
0x66, 0x00, 0x00, 0x00,
0x76, 0x00, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x00,
0x7F, 0xC0, 0x00, 0x00,
0x7F, 0x80, 0x00, 0x00,
0x7F, 0x00, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x00,
0x7C, 0x00, 0x00, 0x00,
0x78, 0x00, 0x00, 0x00,
0x70, 0x00, 0x00, 0x00,
0x60, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x3F, 0xFF, 0xFF,
0xFE, 0x1F, 0xFF, 0xFF,
0xFE, 0x1F, 0xFF, 0xFF,
0xFC, 0x3F, 0xFF, 0xFF,
0x7C, 0x3F, 0xFF, 0xFF,
0x38, 0x7F, 0xFF, 0xFF,
0x18, 0x7F, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF,
0x00, 0x0F, 0xFF, 0xFF,
0x00, 0x1F, 0xFF, 0xFF,
0x00, 0x3F, 0xFF, 0xFF,
0x00, 0x7F, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF,
0x01, 0xFF, 0xFF, 0xFF,
0x03, 0xFF, 0xFF, 0xFF,
0x07, 0xFF, 0xFF, 0xFF,
0x0F, 0xFF, 0xFF, 0xFF,
0x3F, 0xFF, 0xFF, 0xFF,
0x1F, 0xFF, 0xFF, 0xFF,
0x3F, 0xFF, 0xFF, 0xFF};
0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0xFF, 0xFF, 0xFF,
0x03, 0xFF, 0xFF, 0xFF,
0x01, 0xFF, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF,
0x00, 0x7F, 0xFF, 0xFF,
0x00, 0x3F, 0xFF, 0xFF,
0x00, 0x1F, 0xFF, 0xFF,
0x00, 0x0F, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF,
0x18, 0x7F, 0xFF, 0xFF,
0x38, 0x7F, 0xFF, 0xFF,
0x7C, 0x3F, 0xFF, 0xFF,
0xFC, 0x3F, 0xFF, 0xFF,
0xFE, 0x1F, 0xFF, 0xFF,
0xFE, 0x1F, 0xFF, 0xFF,
0xFF, 0x3F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00,
0x60, 0x00, 0x00, 0x00,
0x70, 0x00, 0x00, 0x00,
0x78, 0x00, 0x00, 0x00,
0x7C, 0x00, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x00,
0x7F, 0x00, 0x00, 0x00,
0x7F, 0x80, 0x00, 0x00,
0x7F, 0xC0, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x00,
0x76, 0x00, 0x00, 0x00,
0x76, 0x00, 0x00, 0x00,
0x43, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00,
0x01, 0x80, 0x00, 0x00,
0x01, 0x80, 0x00, 0x00,
0x00, 0xC0, 0x00, 0x00,
0x00, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00};
/* FUNCTIONS *****************************************************************/
@ -125,6 +128,7 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
RECTL MouseRect;
LONG tmp;
/* Mouse is not allowed to move if GDI is busy drawing */
SafetySwitch2 = TRUE;
@ -138,6 +142,12 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
return(FALSE);
}
if (SPS_ACCEPT_NOEXCLUDE == PointerStatus)
{
/* Hardware cursor, no need to remove it */
return(FALSE);
}
if (HazardX1 > HazardX2)
{
tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp;
@ -167,11 +177,20 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
if (SurfObj == NULL)
{
SafetySwitch2 = FALSE;
return(FALSE);
}
if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
{
SafetySwitch2 = FALSE;
return(FALSE);
}
if (SPS_ACCEPT_NOEXCLUDE == PointerStatus)
{
/* Hardware cursor, it wasn't removed so need to restore it */
SafetySwitch2 = FALSE;
return(FALSE);
}
@ -200,15 +219,9 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
PSURFGDI SurfGDI;
RECTL MouseRect;
MSG Msg;
ULONG j;
LARGE_INTEGER LargeTickCount;
ULONG TickCount;
static ULONG ButtonsDown = 0;
const UINT MouseButtonDownMessage[3] =
{WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDOWN};
const UINT MouseButtonUpMessage[3] =
{WM_RBUTTONUP, WM_MBUTTONUP, WM_LBUTTONUP};
const ULONG MouseButtonFlag[3] = {MK_RBUTTON, MK_MBUTTON, MK_LBUTTON};
KeQueryTickCount(&LargeTickCount);
TickCount = LargeTickCount.u.LowPart;
@ -219,8 +232,8 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
}
dc = DC_HandleToPtr(hDC);
SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface);
SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
DC_ReleasePtr( hDC );
/* Compile the total mouse movement change and dispatch button events. */
@ -309,8 +322,8 @@ EnableMouse(HDC hDisplayDC)
dc = DC_HandleToPtr(hDisplayDC);
if( dc ){
SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface);
SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
DC_ReleasePtr( hDisplayDC );
/* Create the default mouse cursor. */
@ -318,16 +331,23 @@ EnableMouse(HDC hDisplayDC)
mouse_height = 32;
MouseSize.cx = 32;
MouseSize.cy = 64;
hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, BMF_TOPDOWN, DefaultCursor);
MouseSurf = (PSURFOBJ)AccessUserObject((ULONG) hMouseSurf);
/* Tell the display driver to set the pointer shape. */
SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 320, 240,
&MouseRect, 0);
#if 0
mouse_x = SurfObj->sizlBitmap.cx / 2;
mouse_y = SurfObj->sizlBitmap.cy / 2;
#else
mouse_x = 320;
mouse_y = 240;
#endif
PointerStatus = SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL,
0, 0, mouse_x, mouse_y, &MouseRect,
SPS_CHANGE);
mouse_x = 320;
mouse_y = 240;
MouseEnabled = TRUE;
MouseEnabled = (SPS_ACCEPT_EXCLUDE == PointerStatus ||
SPS_ACCEPT_NOEXCLUDE == PointerStatus);
}
else{
MouseEnabled = FALSE;

View file

@ -214,6 +214,7 @@ EngCreateBitmap(IN SIZEL Size,
SurfObj->sizlBitmap = Size;
SurfObj->iBitmapFormat = Format;
SurfObj->iType = STYPE_BITMAP;
SurfObj->fjBitmap = Flags & (BMF_TOPDOWN | BMF_NOZEROINIT);
SurfObj->pvScan0 = SurfObj->pvBits;
InitializeFuncs(SurfGDI, Format);

View file

@ -1,4 +1,4 @@
/* $Id: dllmain.c,v 1.30 2002/09/17 23:43:28 dwelch Exp $
/* $Id: dllmain.c,v 1.31 2003/03/11 00:21:41 gvg Exp $
*
* Entry Point for win32k.sys
*/
@ -17,7 +17,7 @@
#include <include/class.h>
#include <include/window.h>
//#define NDEBUG
#define NDEBUG
#include <win32k/debug1.h>
extern SSDT Win32kSSDT[];
@ -94,12 +94,16 @@ DllMain (
return STATUS_SUCCESS;
}
PEPROCESS W32kDeviceProcess;
BOOLEAN
STDCALL
W32kInitialize (VOID)
{
DPRINT("in W32kInitialize\n");
W32kDeviceProcess = PsGetCurrentProcess();
InitGdiObjectHandleTable ();
// Create surface used to draw the internal font onto

View file

@ -1,4 +1,4 @@
/* $Id: driver.c,v 1.23 2003/02/25 23:08:53 gvg Exp $
/* $Id: driver.c,v 1.24 2003/03/11 00:21:41 gvg Exp $
*
* GDI Driver support routines
* (mostly swiped from Wine)
@ -11,6 +11,7 @@
#include <ddk/ntddk.h>
#include <windows.h>
#include <win32k/driver.h>
#include <win32k/misc.h>
#include <wchar.h>
#include <ddk/winddi.h>
#include <ddk/ntddvid.h>
@ -67,7 +68,7 @@ PGD_ENABLEDRIVER DRIVER_FindDDIDriver(LPCWSTR Name)
GRAPHICS_DRIVER *Driver = DriverList;
NTSTATUS Status;
WCHAR *FullName;
WCHAR *p;
LPCWSTR p;
BOOL PathSeparatorFound;
BOOL DotFound;
UINT Size;
@ -226,6 +227,9 @@ HANDLE DRIVER_FindMPDriver(LPCWSTR Name)
HANDLE DisplayHandle;
NTSTATUS Status;
/* Switch to process context in which handle is to be valid */
KeAttachProcess(W32kDeviceProcess);
RtlInitUnicodeStringFromLiteral(&DeviceName, L"\\??\\DISPLAY1");
InitializeObjectAttributes(&ObjectAttributes,
&DeviceName,
@ -238,6 +242,9 @@ HANDLE DRIVER_FindMPDriver(LPCWSTR Name)
&Iosb,
0,
FILE_SYNCHRONOUS_IO_ALERT);
KeDetachProcess();
if (!NT_SUCCESS(Status))
{
DPRINT("ZwOpenFile() failed (Status %lx)\n", Status);