The USER module requires all display drivers to provide cursor support. A display driver must provide the following functions.
Function | Description |
CheckCursor | Draws the cursor if drawing is not disabled. |
InquireCursor | Retrieves information about the cursor. |
MoveCursor | Moves the cursor to a specified position on the display. |
SetCursor | Sets the cursor shape. |
When Windows first starts, USER calls the InquireCursor function to retrieve information about the cursor. It then sets a system timer to call the CheckCursor function on each timer interrupt and enables the mouse driver, allowing the Windows mouse-event routine to call MoveCursor at each mouse interrupt occurrence. USER and Windows applications subsequently set the shape of the cursor using SetCursor.
Because USER calls MoveCursor on each mouse interrupt, MoveCursor should set a semaphore to prevent the function from being called before it can complete the current call. The function should set the semaphore using a noninterruptable instruction such as the xchg instruction. Once the semaphore is set, MoveCursor should retrieve the x and y coordinates of the current call, set a flag to indicate that the cursor is being redrawn, and clear the semaphore. Whenever MoveCursor is called, it should check this flag before continuing the request.
The CheckCursor function is called on each timer interrupt. The function should determine whether the cursor needs redrawing and whether drawing is enabled. If so, the function should redraw the cursor.
For displays that do not have hardware cursor, the display driver should exclude the cursor from the screen before carrying out drawing operations in functions such as BitBlt, Output, and ExtTextOut. The driver should check the current x and y coordinates and exclude the cursor if any part of the cursor lies within the drawing region as specified in the following.
Operation | Region |
Bit-block transfer | Destination rectangle |
Ellipse | Bounding rectangle |
Other line drawing | Bounding rectangle |
Polygon | Clip rectangle |
Polyline | Clip rectangle |
Scan line | Whole scan line |
Text | Bounding rectangle and/or opaquing rectangle |