3 #include "../../drivers/input/include/mouse.h"
6 BOOLEAN SafetySwitch
= FALSE
, SafetySwitch2
= FALSE
, MouseEnabled
= FALSE
;
8 UINT mouse_width
= 0, mouse_height
= 0;
10 INT
MouseSafetyOnDrawStart(PSURFOBJ SurfObj
, PSURFGDI SurfGDI
, LONG HazardX1
, LONG HazardY1
, LONG HazardX2
, LONG HazardY2
)
15 if(SurfObj
== NULL
) return 0;
17 if((SurfObj
->iType
!= STYPE_DEVICE
) || (MouseEnabled
== FALSE
)) return 0;
19 if(HazardX1
> HazardX2
) { tmp
= HazardX2
; HazardX2
= HazardX1
; HazardX1
= tmp
; }
20 if(HazardY1
> HazardY2
) { tmp
= HazardY2
; HazardY2
= HazardY1
; HazardY1
= tmp
; }
22 if( (mouse_x
+ mouse_width
>= HazardX1
) && (mouse_x
<= HazardX2
) &&
23 (mouse_y
+ mouse_height
>= HazardY1
) && (mouse_y
<= HazardY2
) )
25 SurfGDI
->MovePointer(SurfObj
, -1, -1, &MouseRect
);
29 // Mouse is not allowed to move if GDI is busy drawing
35 INT
MouseSafetyOnDrawEnd(PSURFOBJ SurfObj
, PSURFGDI SurfGDI
)
39 if(SurfObj
== NULL
) return 0;
41 if((SurfObj
->iType
!= STYPE_DEVICE
) || (MouseEnabled
== FALSE
)) return 0;
43 if(SafetySwitch
== TRUE
)
45 SurfGDI
->MovePointer(SurfObj
, mouse_x
, mouse_y
, &MouseRect
);
49 SafetySwitch2
= FALSE
;
54 VOID
MouseGDICallBack(PMOUSE_INPUT_DATA Data
, ULONG InputCount
)
57 LONG mouse_cx
= 0, mouse_cy
= 0;
58 /* HDC hDC = RetrieveDisplayHDC();
59 PDC dc = DC_HandleToPtr(hDC);
60 PSURFOBJ SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
61 PSURFGDI SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
64 PDEVICE_OBJECT ClassDeviceObject
= NULL
;
65 PFILE_OBJECT FileObject
= NULL
;
67 UNICODE_STRING ClassName
;
68 IO_STATUS_BLOCK ioStatus
;
72 // Compile the total mouse movement change
73 for (i
=0; i
<InputCount
; i
++)
75 mouse_cx
+= Data
[i
].LastX
;
76 mouse_cy
+= Data
[i
].LastY
;
79 if((mouse_cx
!= 0) || (mouse_cy
!= 0))
84 if(mouse_x
< 0) mouse_x
= 0;
85 if(mouse_y
< 0) mouse_y
= 0;
86 if(mouse_x
> 620) mouse_x
= 620;
87 if(mouse_y
> 460) mouse_y
= 460;
89 if((SafetySwitch
== FALSE
) && (SafetySwitch2
== FALSE
)) ;
90 /* SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect); */
94 NTSTATUS
ConnectMouseClassDriver()
96 PDEVICE_OBJECT ClassDeviceObject
= NULL
;
97 PFILE_OBJECT FileObject
= NULL
;
99 UNICODE_STRING ClassName
= UNICODE_STRING_INITIALIZER(L
"\\Device\\MouseClass");
100 IO_STATUS_BLOCK ioStatus
;
103 GDI_INFORMATION GDIInformation
;
105 status
= IoGetDeviceObjectPointer(&ClassName
, FILE_READ_ATTRIBUTES
, &FileObject
, &ClassDeviceObject
);
107 if(status
!= STATUS_SUCCESS
)
109 DbgPrint("Win32k: Could not connect to mouse class driver\n");
113 // Connect our callback to the class driver
115 KeInitializeEvent(&event
, NotificationEvent
, FALSE
);
117 GDIInformation
.CallBack
= MouseGDICallBack
;
119 irp
= IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_MOUSE_CONNECT
,
120 ClassDeviceObject
, &GDIInformation
, sizeof(CLASS_INFORMATION
), NULL
, 0, TRUE
, &event
, &ioStatus
);
122 status
= IoCallDriver(ClassDeviceObject
, irp
);
124 if (status
== STATUS_PENDING
) {
125 KeWaitForSingleObject(&event
, Suspended
, KernelMode
, FALSE
, NULL
);
127 ioStatus
.Status
= status
;
130 return ioStatus
.Status
;
135 HDC hDC = RetrieveDisplayHDC();
136 PDC dc = DC_HandleToPtr(hDC);
137 PSURFOBJ SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
138 PSURFGDI SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
149 // Draw a test mouse cursor
153 // Draw transparent colored rectangle
154 Brush.iSolidColor = 5;
155 for (i = 0; i < 17; i++)
156 EngLineTo(SurfObj, NULL, &Brush, 0, i, 17, i, NULL, 0);
158 // Draw white interior
159 Brush.iSolidColor = 15;
160 for (i = 1; i < 16; i++)
161 EngLineTo(SurfObj, NULL, &Brush, 0, i-1, 16-i, i-1, NULL, 0);
163 // Draw black outline
164 Brush.iSolidColor = 0;
165 EngLineTo(SurfObj, NULL, &Brush, 0, 0, 15, 0, NULL, 0);
166 EngLineTo(SurfObj, NULL, &Brush, 0, 16, 15, 0, NULL, 0);
167 EngLineTo(SurfObj, NULL, &Brush, 0, 15, 0, 0, NULL, 0);
169 // Create the bitmap for the mouse cursor data
172 hMouseSurf = EngCreateBitmap(MouseSize, 16, BMF_4BPP, 0, NULL);
173 MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
175 // Capture the cursor we drew in the mouse cursor buffer
180 MouseRect.bottom = 16;
181 MouseRect.right = 16;
182 EngBitBlt(MouseSurf, SurfObj, NULL, NULL, NULL, &MouseRect, &ZeroPoint, NULL, NULL, NULL, 0);
183 SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 50, 50, &MouseRect, 0);
185 // Connect the mouse class driver to the GDI
188 ConnectMouseClassDriver();