Difference between revisions of "Unit Mouse"
(29 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
---- | ---- | ||
− | '''Ultibo Mouse | + | '''Ultibo Mouse Interface unit''' |
− | This unit provides | + | '''Mouse Devices''' |
+ | |||
+ | This unit provides the Mouse device interface and mouse API to be used by both drivers and applications. | ||
+ | |||
+ | The API includes functions to create, register, locate, read, write, control and configure each connected mouse device. | ||
+ | |||
+ | The API supports a global mouse buffer so multiple devices can feed data into a common buffer as well as a buffer per device to allow each device to be used for a specific purpose. For example an application with two separate displays may choose to have a mouse or pointing device to control each one individually. | ||
=== Constants === | === Constants === | ||
Line 25: | Line 31: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Mouse device type | + | <div style="font-size: 14px; padding-left: 12px;">'''Mouse device type''' <code> MOUSE_TYPE_* </code></div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
Line 50: | Line 56: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Mouse device state | + | <div style="font-size: 14px; padding-left: 12px;">'''Mouse device state''' <code> MOUSE_STATE_* </code></div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
Line 75: | Line 81: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Mouse device flag | + | <div style="font-size: 14px; padding-left: 12px;">'''Mouse device flag''' <code> MOUSE_FLAG_* </code></div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
Line 86: | Line 92: | ||
|- | |- | ||
| <code>MOUSE_FLAG_DIRECT_READ = $00000002;</code> | | <code>MOUSE_FLAG_DIRECT_READ = $00000002;</code> | ||
− | | If set device writes mouse data to its local buffer | + | | If set device writes mouse data to its local buffer which must be read using MouseDeviceRead |
|- | |- | ||
| <code>MOUSE_FLAG_SWAP_BUTTONS = $00000004;</code> | | <code>MOUSE_FLAG_SWAP_BUTTONS = $00000004;</code> | ||
Line 93: | Line 99: | ||
| <code>MOUSE_FLAG_PEEK_BUFFER = $00000008;</code> | | <code>MOUSE_FLAG_PEEK_BUFFER = $00000008;</code> | ||
| Peek at the buffer to see if any data is available, don't remove it. (Used only in Flags parameter of MouseReadEx) | | Peek at the buffer to see if any data is available, don't remove it. (Used only in Flags parameter of MouseReadEx) | ||
+ | |- | ||
+ | | <code>MOUSE_FLAG_SWAP_XY = $00000010;</code> | ||
+ | | If set swap the X and Y coordinates | ||
+ | |- | ||
+ | | <code>MOUSE_FLAG_INVERT_X = $00000020;</code> | ||
+ | | If set invert the X coordinate | ||
+ | |- | ||
+ | | <code>MOUSE_FLAG_INVERT_Y = $00000040;</code> | ||
+ | | If set invert the Y coordinate | ||
+ | |- | ||
+ | | <code>MOUSE_FLAG_SWAP_MAX_XY = $00000080;</code> | ||
+ | | If set swap the maximum X and Y values | ||
|- | |- | ||
|colspan="2"| | |colspan="2"| | ||
Line 98: | Line 116: | ||
|colspan="2"|''Flags supported by MOUSE_CONTROL_GET/SET/CLEAR_FLAG'' | |colspan="2"|''Flags supported by MOUSE_CONTROL_GET/SET/CLEAR_FLAG'' | ||
|- | |- | ||
− | | <code>MOUSE_FLAG_MASK = MOUSE_FLAG_NON_BLOCK or MOUSE_FLAG_DIRECT_READ or MOUSE_FLAG_SWAP_BUTTONS;</code> | + | |colspan="2"|<code>MOUSE_FLAG_MASK = MOUSE_FLAG_NON_BLOCK or MOUSE_FLAG_DIRECT_READ or MOUSE_FLAG_SWAP_BUTTONS or MOUSE_FLAG_SWAP_XY or MOUSE_FLAG_INVERT_X or MOUSE_FLAG_INVERT_Y or MOUSE_FLAG_SWAP_MAX_XY;</code> |
− | + | ||
|- | |- | ||
|} | |} | ||
Line 105: | Line 122: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Mouse device control code | + | <div style="font-size: 14px; padding-left: 12px;">'''Mouse device control code''' <code> MOUSE_CONTROL_* </code></div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
Line 120: | Line 137: | ||
| <code>MOUSE_CONTROL_FLUSH_BUFFER = 4;</code> | | <code>MOUSE_CONTROL_FLUSH_BUFFER = 4;</code> | ||
| Flush Buffer | | Flush Buffer | ||
+ | |- | ||
+ | | <code>MOUSE_CONTROL_GET_SAMPLE_RATE = 5;</code> | ||
+ | | Get Sample Rate | ||
+ | |- | ||
+ | | <code>MOUSE_CONTROL_SET_SAMPLE_RATE = 6;</code> | ||
+ | | Set Sample Rate | ||
+ | |- | ||
+ | | <code>MOUSE_CONTROL_GET_MAX_X = 7;</code> | ||
+ | | Get Maximum X value (Only applies to Absolute X values) | ||
+ | |- | ||
+ | | <code>MOUSE_CONTROL_GET_MAX_Y = 8;</code> | ||
+ | | Get Maximum Y value (Only applies to Absolute Y values) | ||
+ | |- | ||
+ | | <code>MOUSE_CONTROL_GET_MAX_WHEEL = 9;</code> | ||
+ | | Get Maximum Wheel value (Only applies to Absolute Wheel values) | ||
+ | |- | ||
+ | | <code>MOUSE_CONTROL_GET_MAX_BUTTONS = 10;</code> | ||
+ | | Get Maximum Buttons mask (eg MOUSE_LEFT_BUTTON or MOUSE_RIGHT_BUTTON etc) | ||
+ | |- | ||
+ | | <code>MOUSE_CONTROL_GET_ROTATION = 11;</code> | ||
+ | | Get Rotation value (0, 90, 180, 270) (Only where supported by the driver) | ||
+ | |- | ||
+ | | <code>MOUSE_CONTROL_SET_ROTATION = 12;</code> | ||
+ | | Set Rotation value (0, 90, 180, 270) (Only where supported by the driver) | ||
|- | |- | ||
|} | |} | ||
Line 125: | Line 166: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Mouse buffer size | + | <div style="font-size: 14px; padding-left: 12px;">'''Mouse buffer size''' <code> MOUSE_BUFFER_* </code></div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
Line 136: | Line 177: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Mouse data definition | + | <div style="font-size: 14px; padding-left: 12px;">'''Mouse sampling rate''' <code> MOUSE_SAMPLE_* </code></div> |
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>MOUSE_SAMPLE_RATE = 100;</code> | ||
+ | | 100 samples/sec | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Mouse data definition''' <code> MOUSE_LEFT_*, MOUSE_RIGHT_* </code></div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
Line 175: | Line 227: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Mouse logging | + | <div style="font-size: 14px; padding-left: 12px;">'''Mouse rotation''' <code> MOUSE_ROTATION_* </code></div> |
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>MOUSE_ROTATION_0 = FRAMEBUFFER_ROTATION_0;</code> | ||
+ | | No rotation | ||
+ | |- | ||
+ | | <code>MOUSE_ROTATION_90 = FRAMEBUFFER_ROTATION_90;</code> | ||
+ | | 90 degree rotation | ||
+ | |- | ||
+ | | <code>MOUSE_ROTATION_180 = FRAMEBUFFER_ROTATION_180;</code> | ||
+ | | 180 degree rotation | ||
+ | |- | ||
+ | | <code>MOUSE_ROTATION_270 = FRAMEBUFFER_ROTATION_270;</code> | ||
+ | | 270 degree rotation | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Mouse logging''' <code> MOUSE_LOG_* </code></div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
Line 184: | Line 256: | ||
| <code>MOUSE_LOG_LEVEL_INFO = LOG_LEVEL_INFO;</code> | | <code>MOUSE_LOG_LEVEL_INFO = LOG_LEVEL_INFO;</code> | ||
| Mouse informational messages, such as a device being attached or detached | | Mouse informational messages, such as a device being attached or detached | ||
+ | |- | ||
+ | | <code>MOUSE_LOG_LEVEL_WARN = LOG_LEVEL_WARN;</code> | ||
+ | | Mouse warning messages | ||
|- | |- | ||
| <code>MOUSE_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;</code> | | <code>MOUSE_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;</code> | ||
Line 199: | Line 274: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | | | + | |colspan="2"|Note: The following constants are duplicated with the USBMouse unit for backwards compatibility |
− | | | + | |
|- | |- | ||
− | | | + | |} |
− | + | </div></div> | |
− | + | <br /> | |
− | + | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | |
− | + | <div style="font-size: 14px; padding-left: 12px;">'''USB HID types''' <code> USB_HID_* </code></div> | |
− | | | + | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> |
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
|colspan="2"|''HID Interface Subclass types (See USB HID v1.11 specification)'' | |colspan="2"|''HID Interface Subclass types (See USB HID v1.11 specification)'' | ||
+ | |- | ||
+ | | <code>USB_HID_SUBCLASS_NONE = 0;</code> | ||
+ | | Section 4.2 | ||
|- | |- | ||
| <code>USB_HID_SUBCLASS_BOOT = 1;</code> | | <code>USB_HID_SUBCLASS_BOOT = 1;</code> | ||
Line 217: | Line 295: | ||
|- | |- | ||
|colspan="2"|''HID Interface Protocol types (See USB HID v1.11 specification)'' | |colspan="2"|''HID Interface Protocol types (See USB HID v1.11 specification)'' | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_PROTOCOL_NONE = 0;</code> | ||
+ | | Section 4.3 | ||
|- | |- | ||
| <code>USB_HID_BOOT_PROTOCOL_KEYBOARD = 1;</code> | | <code>USB_HID_BOOT_PROTOCOL_KEYBOARD = 1;</code> | ||
Line 223: | Line 304: | ||
| <code>USB_HID_BOOT_PROTOCOL_MOUSE = 2;</code> | | <code>USB_HID_BOOT_PROTOCOL_MOUSE = 2;</code> | ||
| Section 4.3 | | Section 4.3 | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | |colspan="2"|''HID Class Descriptor Types (See USB HID v1.11 specification)'' | ||
+ | |- | ||
+ | | <code>USB_HID_DESCRIPTOR_TYPE_HID = $21;</code> | ||
+ | | Section 7.1 | ||
+ | |- | ||
+ | | <code>USB_HID_DESCRIPTOR_TYPE_REPORT = $22;</code> | ||
+ | | Section 7.1 | ||
+ | |- | ||
+ | | <code>USB_HID_DESCRIPTOR_TYPE_PHYSICAL_DESCRIPTOR = $23;</code> | ||
+ | | Section 7.1 | ||
|- | |- | ||
|colspan="2"| | |colspan="2"| | ||
Line 312: | Line 406: | ||
---- | ---- | ||
− | '' | + | |
+ | '''Mouse data''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PMouseData = ^TMouseData;</code> | ||
+ | |||
+ | <code>TMouseData = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Buttons:Word;</code> | ||
+ | | The bitmap of current button values (eg MOUSE_LEFT_BUTTON or MOUSE_RIGHT_BUTTON) | ||
+ | |- | ||
+ | | <code>OffsetX:SmallInt;</code> | ||
+ | | The X offset of the mouse pointer (May be negative, read as absolute if Buttons includes MOUSE_ABSOLUTE_X) | ||
+ | |- | ||
+ | | <code>OffsetY:SmallInt;</code> | ||
+ | | The Y offset of the mouse pointer (May be negative, read as absolute if Buttons includes MOUSE_ABSOLUTE_Y) | ||
+ | |- | ||
+ | | <code>OffsetWheel:SmallInt;</code> | ||
+ | | The X offset of the mouse pointer (May be negative, read as absolute if Buttons includes MOUSE_ABSOLUTE_WHEEL) | ||
+ | |- | ||
+ | | <code>MaximumX:Word;</code> | ||
+ | | The maximum X value of the mouse (Only applicable if Buttons includes MOUSE_ABSOLUTE_X, otherwise must be 0) | ||
+ | |- | ||
+ | | <code>MaximumY:Word;</code> | ||
+ | | The maximum Y value of the mouse (Only applicable if Buttons includes MOUSE_ABSOLUTE_Y, otherwise must be 0) | ||
+ | |- | ||
+ | | <code>MaximumWheel:Word;</code> | ||
+ | | The maximum Wheel value of the mouse (Only applicable if Buttons includes MOUSE_ABSOLUTE_WHEEL, otherwise must be 0) | ||
+ | |- | ||
+ | | <code>Reserved:Word;</code> | ||
+ | | Reserved field (Round structure to 16 bytes) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''Mouse buffer''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PMouseBuffer = ^TMouseBuffer;</code> | ||
+ | |||
+ | <code>TMouseBuffer = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Wait:TSemaphoreHandle;</code> | ||
+ | | Buffer ready semaphore | ||
+ | |- | ||
+ | | <code>Start:LongWord;</code> | ||
+ | | Index of first buffer ready | ||
+ | |- | ||
+ | | <code>Count:LongWord;</code> | ||
+ | | Number of entries ready in buffer | ||
+ | |- | ||
+ | | <code>Buffer:array[0..(MOUSE_BUFFER_SIZE - 1)] of TMouseData; </code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''Mouse properties''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PMouseProperties = ^TMouseProperties;</code> | ||
+ | |||
+ | <code>TMouseProperties = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Flags:LongWord;</code> | ||
+ | | Device flags (eg MOUSE_FLAG_SWAP_BUTTONS) | ||
+ | |- | ||
+ | | <code>Rotation:LongWord;</code> | ||
+ | | Screen Rotation (eg MOUSE_ROTATION_180) | ||
+ | |- | ||
+ | | <code>MaxX:LongWord;</code> | ||
+ | | Maximum (absolute) X value for the mouse device | ||
+ | |- | ||
+ | | <code>MaxY:LongWord;</code> | ||
+ | | Maximum (absolute) Y value for the mouse device | ||
+ | |- | ||
+ | | <code>MaxWheel:LongWord;</code> | ||
+ | | Maximum (absolute) wheel value for the mouse device | ||
+ | |- | ||
+ | | <code>MaxButtons:LongWord;</code> | ||
+ | | Maximum buttons mask (eg MOUSE_LEFT_BUTTON or MOUSE_RIGHT_BUTTON etc) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''Mouse enumeration callback''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TMouseEnumerate = function(Mouse:PMouseDevice; Data:Pointer):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Mouse notification callback''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TMouseNotification = function(Device:PDevice; Data:Pointer; Notification:LongWord):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Mouse device read''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TMouseDeviceRead = function(Mouse:PMouseDevice; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Mouse device update''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TMouseDeviceUpdate = function(Mouse:PMouseDevice):LongWord; stdcall;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Mouse device control''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TMouseDeviceControl = function(Mouse:PMouseDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Mouse device get properties''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TMouseDeviceGetProperties = function(Mouse:PMouseDevice; Properties:PMouseProperties):LongWord; stdcall;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Mouse device types''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PMouseDevice = ^TMouseDevice;</code> | ||
+ | |||
+ | <code>TMouseDevice = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Device Properties'' | ||
+ | |- | ||
+ | | <code>Device:TDevice;</code> | ||
+ | | The Device entry for this Mouse | ||
+ | |- | ||
+ | |colspan="2"|''Mouse Properties'' | ||
+ | |- | ||
+ | | <code>MouseId:LongWord;</code> | ||
+ | | Unique Id of this Mouse in the Mouse table | ||
+ | |- | ||
+ | | <code>MouseState:LongWord;</code> | ||
+ | | Mouse state (eg MOUSE_STATE_ATTACHED) | ||
+ | |- | ||
+ | | <code>MouseRate:LongWord;</code> | ||
+ | | Mouse sample rate (Samples per second) | ||
+ | |- | ||
+ | | <code>DeviceRead:TMouseDeviceRead;</code> | ||
+ | | A Device specific DeviceRead method implementing a standard Mouse device interface (Or nil if the default method is suitable) | ||
+ | |- | ||
+ | | <code>DeviceUpdate:TMouseDeviceUpdate;</code> | ||
+ | | A Device specific DeviceUpdate method implementing a standard Mouse device interface (Or nil if the default method is suitable) | ||
+ | |- | ||
+ | | <code>DeviceControl:TMouseDeviceControl;</code> | ||
+ | | A Device specific DeviceControl method implementing a standard Mouse device interface (Or nil if the default method is suitable) | ||
+ | |- | ||
+ | | <code>DeviceGetProperties:TMouseDeviceGetProperties;</code> | ||
+ | | A Device specific DeviceGetProperties method implementing a standard Mouse device interface (Or nil if the default method is suitable) | ||
+ | |- | ||
+ | |colspan="2"|''Driver Properties'' | ||
+ | |- | ||
+ | | <code>Lock:TMutexHandle;</code> | ||
+ | | Mouse lock | ||
+ | |- | ||
+ | | <code>Buffer:TMouseBuffer;</code> | ||
+ | | Mouse input buffer | ||
+ | |- | ||
+ | | <code>Properties:TMouseProperties;</code> | ||
+ | | Device properties | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>ReceiveCount:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ReceiveErrors:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BufferOverruns:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''Internal Properties'' | ||
+ | |- | ||
+ | | <code>Prev:PMouseDevice;</code> | ||
+ | | Previous entry in Mouse table | ||
+ | |- | ||
+ | | <code>Next:PMouseDevice;</code> | ||
+ | | Next entry in Mouse table | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''USB HID descriptor''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PUSBHIDDescriptor = ^TUSBHIDDescriptor;</code> | ||
+ | |||
+ | <code>TUSBHIDDescriptor = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>bLength:Byte;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>bDescriptorType:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>bcdHID:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>bCountryCode:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>bNumDescriptors:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>bHIDDescriptorType:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>wHIDDescriptorLength:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''Note: Up to two optional bHIDDescriptorType/wHIDDescriptorLength pairs after the Report descriptor details'' | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Public variables === | === Public variables === | ||
Line 323: | Line 666: | ||
|- | |- | ||
| <code>MOUSE_DEFAULT_LOG_LEVEL:LongWord = MOUSE_LOG_LEVEL_DEBUG;</code> | | <code>MOUSE_DEFAULT_LOG_LEVEL:LongWord = MOUSE_LOG_LEVEL_DEBUG;</code> | ||
− | | style="width: | + | | style="width: 40%;"|Minimum level for Mouse messages. Only messages with level greater than or equal to this will be printed. |
|- | |- | ||
|} | |} | ||
Line 329: | Line 672: | ||
|- | |- | ||
| <code>MOUSE_LOG_ENABLED:Boolean;</code> | | <code>MOUSE_LOG_ENABLED:Boolean;</code> | ||
− | | style="width: | + | | style="width: 40%;"| |
|- | |- | ||
|} | |} | ||
Line 342: | Line 685: | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
<pre style="border: 0; padding-bottom:0px;">procedure MouseInit;</pre> | <pre style="border: 0; padding-bottom:0px;">procedure MouseInit;</pre> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Initialize the mouse unit | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Initialize the mouse unit and device table</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| Called only during system startup | | Called only during system startup | ||
|- | |- | ||
Line 361: | Line 704: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if packets are ready, ERROR_NO_MORE_ITEMS if not or another error code on failure | | ERROR_SUCCESS if packets are ready, ERROR_NO_MORE_ITEMS if not or another error code on failure | ||
|- | |- | ||
Line 368: | Line 711: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function MouseRead(Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;</pre> | + | <pre style="border: 0; padding-bottom:0px;">function MouseRead(Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord; inline;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Read mouse data packets from the global mouse buffer</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Read mouse data packets from the global mouse buffer</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| Pointer to a buffer to copy the mouse data packets to | | Pointer to a buffer to copy the mouse data packets to | ||
|- | |- | ||
− | ! | + | ! Size |
| The size of the buffer in bytes (Must be at least TMouseData or greater) | | The size of the buffer in bytes (Must be at least TMouseData or greater) | ||
|- | |- | ||
− | ! | + | ! Count |
− | | The number of mouse data packets copied to the | + | | The number of mouse data packets copied to the bufferm |
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 394: | Line 737: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| Pointer to a buffer to copy the mouse data packets to | | Pointer to a buffer to copy the mouse data packets to | ||
|- | |- | ||
− | ! | + | ! Size |
| The size of the buffer in bytes (Must be at least TMouseData or greater) | | The size of the buffer in bytes (Must be at least TMouseData or greater) | ||
|- | |- | ||
− | ! | + | ! Flags |
| The flags for the behaviour of the read (eg MOUSE_FLAG_NON_BLOCK) | | The flags for the behaviour of the read (eg MOUSE_FLAG_NON_BLOCK) | ||
|- | |- | ||
− | ! | + | ! Count |
| The number of mouse data packets copied to the buffer | | The number of mouse data packets copied to the buffer | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 418: | Line 761: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| Pointer to a buffer to copy the mouse data packets from | | Pointer to a buffer to copy the mouse data packets from | ||
|- | |- | ||
− | ! | + | ! Size |
| The size of the buffer in bytes (Must be at least TMouseData or greater) | | The size of the buffer in bytes (Must be at least TMouseData or greater) | ||
|- | |- | ||
− | ! | + | ! Count |
| The number of mouse data packets to copy from the buffer | | The number of mouse data packets to copy from the buffer | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 439: | Line 782: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 451: | Line 794: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mouse |
| The mouse device to read from | | The mouse device to read from | ||
|- | |- | ||
− | ! | + | ! Buffer |
| Pointer to a buffer to copy the mouse data packets to | | Pointer to a buffer to copy the mouse data packets to | ||
|- | |- | ||
− | ! | + | ! Size |
| The size of the buffer in bytes (Must be at least TMouseData or greater) | | The size of the buffer in bytes (Must be at least TMouseData or greater) | ||
|- | |- | ||
− | ! | + | ! Count |
| The number of mouse data packets copied to the buffer | | The number of mouse data packets copied to the buffer | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 470: | Line 813: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceControl(Mouse:PMouseDevice; Request:Integer; Argument1: | + | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceUpdate(Mouse:PMouseDevice):LongWord;</pre> |
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Request the specified mouse device to update the current configuration</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Mouse | ||
+ | | The mouse device to update | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | ! Note | ||
+ | | Items updated can include rotation, maximum X, Y and wheel and flags (If supported) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceControl(Mouse:PMouseDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;</pre> | ||
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a control request on the specified mouse device</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a control request on the specified mouse device</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mouse |
| The mouse device to control | | The mouse device to control | ||
|- | |- | ||
− | ! | + | ! Request |
| The request code for the operation (eg MOUSE_CONTROL_GET_FLAG) | | The request code for the operation (eg MOUSE_CONTROL_GET_FLAG) | ||
|- | |- | ||
− | ! | + | ! Argument1 |
| The first argument for the operation (Dependent on request code) | | The first argument for the operation (Dependent on request code) | ||
|- | |- | ||
− | ! | + | ! Argument2 |
| The second argument for the operation (Dependent on request code) | | The second argument for the operation (Dependent on request code) | ||
|- | |- | ||
− | ! ''' | + | ! Return |
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceGetProperties(Mouse:PMouseDevice; Properties:PMouseProperties):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the properties for the specified mouse device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Mouse | ||
+ | | The mouse device to get properties from | ||
+ | |- | ||
+ | ! Properties | ||
+ | | Pointer to a TMouseProperties structure to fill in | ||
+ | |- | ||
+ | ! Return | ||
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 499: | Line 878: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mouse |
| The mouse to set the state for | | The mouse to set the state for | ||
|- | |- | ||
− | ! | + | ! State |
| The new state to set and notify | | The new state to set and notify | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 517: | Line 896: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| Pointer to new Mouse device entry or nil if mouse could not be created | | Pointer to new Mouse device entry or nil if mouse could not be created | ||
|- | |- | ||
Line 529: | Line 908: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Size |
| Size in bytes to allocate for new mouse (Including the mouse device entry) | | Size in bytes to allocate for new mouse (Including the mouse device entry) | ||
|- | |- | ||
− | ! | + | ! Return |
| Pointer to new Mouse device entry or nil if mouse could not be created | | Pointer to new Mouse device entry or nil if mouse could not be created | ||
|- | |- | ||
Line 544: | Line 923: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mouse |
| The mouse device to destroy | | The mouse device to destroy | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 559: | Line 938: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mouse |
| The mouse device to register | | The mouse device to register | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 574: | Line 953: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mouse |
| The mouse device to deregister | | The mouse device to deregister | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 589: | Line 968: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! MouseId |
| The ID number of the mouse to find | | The ID number of the mouse to find | ||
|- | |- | ||
− | ! | + | ! Return |
| Pointer to mouse device entry or nil if not found | | Pointer to mouse device entry or nil if not found | ||
|- | |- | ||
Line 604: | Line 983: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Name |
| The name of the mouse to find (eg Mouse0) | | The name of the mouse to find (eg Mouse0) | ||
|- | |- | ||
− | ! | + | ! Return |
| Pointer to mouse device entry or nil if not found | | Pointer to mouse device entry or nil if not found | ||
|- | |- | ||
Line 619: | Line 998: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Description |
| The description of the mouse to find (eg USB HID Mouse) | | The description of the mouse to find (eg USB HID Mouse) | ||
|- | |- | ||
− | ! | + | ! Return |
| Pointer to mouse device entry or nil if not found | | Pointer to mouse device entry or nil if not found | ||
|- | |- | ||
Line 634: | Line 1,013: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Callback |
| The callback function to call for each mouse in the table | | The callback function to call for each mouse in the table | ||
|- | |- | ||
− | ! | + | ! Data |
| A private data pointer to pass to callback for each mouse in the table | | A private data pointer to pass to callback for each mouse in the table | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure | | ERROR_SUCCESS if completed or another error code on failure | ||
|- | |- | ||
Line 652: | Line 1,031: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mouse |
| The mouse device to notify changes for (Optional, pass nil for all mice) | | The mouse device to notify changes for (Optional, pass nil for all mice) | ||
|- | |- | ||
− | ! | + | ! Callback |
| The function to call when a notification event occurs | | The function to call when a notification event occurs | ||
|- | |- | ||
− | ! | + | ! Data |
| A private data pointer to pass to callback when a notification event occurs | | A private data pointer to pass to callback when a notification event occurs | ||
|- | |- | ||
− | ! | + | ! Notification |
| The events to register for notification of (eg DEVICE_NOTIFICATION_REGISTER) | | The events to register for notification of (eg DEVICE_NOTIFICATION_REGISTER) | ||
|- | |- | ||
− | ! | + | ! Flags |
| The flags to control the notification (eg NOTIFIER_FLAG_WORKER) | | The flags to control the notification (eg NOTIFIER_FLAG_WORKER) | ||
|- | |- | ||
Line 679: | Line 1,058: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 691: | Line 1,070: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 703: | Line 1,082: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 710: | Line 1,089: | ||
<br /> | <br /> | ||
− | ''' | + | '''Mouse helper functions''' |
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function MouseGetCount:LongWord;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the current mouse count</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 725: | Line 1,104: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceCheck(Mouse:PMouseDevice):PMouseDevice;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Check if the supplied Mouse is in the mouse table</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 737: | Line 1,116: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceTypeToString(MouseType:LongWord):String;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | | + | | None documented |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
Line 755: | Line 1,128: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceStateToString(MouseState:LongWord):String;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | | + | | None documented |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
Line 773: | Line 1,140: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;"> | + | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceRotationToString(Rotation:LongWord):String;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Return a string describing the supplied mouse rotation value</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | | + | | None documented |
|- | |- | ||
|} | |} | ||
Line 785: | Line 1,152: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;"> | + | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceStateToNotification(State:LongWord):LongWord;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Convert a Mouse state value into the notification code for device notifications</div> |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 815: | Line 1,164: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function MouseDeviceResolveRotation(ARotation:LongWord):LongWord;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Resolve a value of 0, 90, 180 or 270 to a mouse rotation constant (eg MOUSE_ROTATION_180)</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | | + | | Also accepts passing the mouse rotation constant values directly |
|- | |- | ||
|} | |} | ||
Line 827: | Line 1,176: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">function | + | <pre style="border: 0; padding-bottom:0px;">function MouseInsertData(Mouse:PMouseDevice; Data:PMouseData; Signal:Boolean):LongWord;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Insert a TMouseData entry into the mouse buffer (Direct or Global)</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mouse |
− | | | + | | The mouse device to insert data for |
|- | |- | ||
− | + | ! Data | |
− | + | | The TMouseData entry to insert | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | ! | + | ! Signal |
− | | | + | | If True then signal that new data is available in the buffer |
|- | |- | ||
− | | | + | ! Return |
− | + | | ERROR_SUCCESS if completed or another error code on failure | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | ! | + | ! Note |
− | | | + | | Caller must hold the mouse lock |
|- | |- | ||
|} | |} | ||
Line 868: | Line 1,205: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 875: | Line 1,212: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">procedure MouseLogInfo(Mouse:PMouseDevice; const AText:String);</pre> | + | <pre style="border: 0; padding-bottom:0px;">procedure MouseLogInfo(Mouse:PMouseDevice; const AText:String); inline;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 887: | Line 1,224: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">procedure | + | <pre style="border: 0; padding-bottom:0px;">procedure MouseLogWarn(Mouse:PMouseDevice; const AText:String); inline;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 899: | Line 1,236: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;">procedure | + | <pre style="border: 0; padding-bottom:0px;">procedure MouseLogError(Mouse:PMouseDevice; const AText:String); inline;</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 910: | Line 1,247: | ||
</div></div> | </div></div> | ||
<br /> | <br /> | ||
− | |||
− | |||
− | |||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
− | <pre style="border: 0; padding-bottom:0px;"> | + | <pre style="border: 0; padding-bottom:0px;">procedure MouseLogDebug(Mouse:PMouseDevice;const AText:String); inline;</pre> |
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
− | | | + | | None documented |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} |
Latest revision as of 03:41, 15 December 2022
Return to Unit Reference
Description
Ultibo Mouse Interface unit
Mouse Devices
This unit provides the Mouse device interface and mouse API to be used by both drivers and applications.
The API includes functions to create, register, locate, read, write, control and configure each connected mouse device.
The API supports a global mouse buffer so multiple devices can feed data into a common buffer as well as a buffer per device to allow each device to be used for a specific purpose. For example an application with two separate displays may choose to have a mouse or pointing device to control each one individually.
Constants
MOUSE_*
MOUSE_NAME_PREFIX = 'Mouse';
|
Name prefix for Mouse Devices |
MOUSE_TYPE_*
MOUSE_TYPE_NONE = 0;
|
|
MOUSE_TYPE_USB = 1;
|
|
MOUSE_TYPE_PS2 = 2;
|
|
MOUSE_TYPE_SERIAL = 3;
|
|
MOUSE_TYPE_MAX = 3;
|
MOUSE_STATE_*
MOUSE_STATE_DETACHED = 0;
|
|
MOUSE_STATE_DETACHING = 1;
|
|
MOUSE_STATE_ATTACHING = 2;
|
|
MOUSE_STATE_ATTACHED = 3;
|
|
MOUSE_STATE_MAX = 3;
|
MOUSE_FLAG_*
MOUSE_FLAG_NONE = $00000000;
|
|
MOUSE_FLAG_NON_BLOCK = $00000001;
|
If set device reads are non blocking (Also supported in Flags parameter of MouseReadEx) |
MOUSE_FLAG_DIRECT_READ = $00000002;
|
If set device writes mouse data to its local buffer which must be read using MouseDeviceRead |
MOUSE_FLAG_SWAP_BUTTONS = $00000004;
|
If set left and right mouse buttons will be swapped in mouse data |
MOUSE_FLAG_PEEK_BUFFER = $00000008;
|
Peek at the buffer to see if any data is available, don't remove it. (Used only in Flags parameter of MouseReadEx) |
MOUSE_FLAG_SWAP_XY = $00000010;
|
If set swap the X and Y coordinates |
MOUSE_FLAG_INVERT_X = $00000020;
|
If set invert the X coordinate |
MOUSE_FLAG_INVERT_Y = $00000040;
|
If set invert the Y coordinate |
MOUSE_FLAG_SWAP_MAX_XY = $00000080;
|
If set swap the maximum X and Y values |
Flags supported by MOUSE_CONTROL_GET/SET/CLEAR_FLAG | |
MOUSE_FLAG_MASK = MOUSE_FLAG_NON_BLOCK or MOUSE_FLAG_DIRECT_READ or MOUSE_FLAG_SWAP_BUTTONS or MOUSE_FLAG_SWAP_XY or MOUSE_FLAG_INVERT_X or MOUSE_FLAG_INVERT_Y or MOUSE_FLAG_SWAP_MAX_XY;
|
MOUSE_CONTROL_*
MOUSE_CONTROL_GET_FLAG = 1;
|
Get Flag |
MOUSE_CONTROL_SET_FLAG = 2;
|
Set Flag |
MOUSE_CONTROL_CLEAR_FLAG = 3;
|
Clear Flag |
MOUSE_CONTROL_FLUSH_BUFFER = 4;
|
Flush Buffer |
MOUSE_CONTROL_GET_SAMPLE_RATE = 5;
|
Get Sample Rate |
MOUSE_CONTROL_SET_SAMPLE_RATE = 6;
|
Set Sample Rate |
MOUSE_CONTROL_GET_MAX_X = 7;
|
Get Maximum X value (Only applies to Absolute X values) |
MOUSE_CONTROL_GET_MAX_Y = 8;
|
Get Maximum Y value (Only applies to Absolute Y values) |
MOUSE_CONTROL_GET_MAX_WHEEL = 9;
|
Get Maximum Wheel value (Only applies to Absolute Wheel values) |
MOUSE_CONTROL_GET_MAX_BUTTONS = 10;
|
Get Maximum Buttons mask (eg MOUSE_LEFT_BUTTON or MOUSE_RIGHT_BUTTON etc) |
MOUSE_CONTROL_GET_ROTATION = 11;
|
Get Rotation value (0, 90, 180, 270) (Only where supported by the driver) |
MOUSE_CONTROL_SET_ROTATION = 12;
|
Set Rotation value (0, 90, 180, 270) (Only where supported by the driver) |
MOUSE_BUFFER_*
MOUSE_BUFFER_SIZE = 512;
|
MOUSE_SAMPLE_*
MOUSE_SAMPLE_RATE = 100;
|
100 samples/sec |
MOUSE_LEFT_*, MOUSE_RIGHT_*
Values for TMouseData.Buttons | |
MOUSE_LEFT_BUTTON = $0001;
|
The Left mouse button is pressed |
MOUSE_RIGHT_BUTTON = $0002;
|
The Right mouse button is pressed |
MOUSE_MIDDLE_BUTTON = $0004;
|
The Middle mouse button is pressed |
MOUSE_SIDE_BUTTON = $0008;
|
The Side mouse button is pressed |
MOUSE_EXTRA_BUTTON = $0010;
|
The Extra mouse button is pressed |
MOUSE_TOUCH_BUTTON = $0020;
|
The Touch screen is being touched |
MOUSE_ABSOLUTE_X = $0040;
|
The OffsetX value is absolute not relative |
MOUSE_ABSOLUTE_Y = $0080;
|
The OffsetY value is absolute not relative |
MOUSE_ABSOLUTE_WHEEL = $0100;
|
The OffsetWheel value is absolute not relative |
MOUSE_ROTATION_*
MOUSE_ROTATION_0 = FRAMEBUFFER_ROTATION_0;
|
No rotation |
MOUSE_ROTATION_90 = FRAMEBUFFER_ROTATION_90;
|
90 degree rotation |
MOUSE_ROTATION_180 = FRAMEBUFFER_ROTATION_180;
|
180 degree rotation |
MOUSE_ROTATION_270 = FRAMEBUFFER_ROTATION_270;
|
270 degree rotation |
MOUSE_LOG_*
MOUSE_LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG;
|
Mouse debugging messages |
MOUSE_LOG_LEVEL_INFO = LOG_LEVEL_INFO;
|
Mouse informational messages, such as a device being attached or detached |
MOUSE_LOG_LEVEL_WARN = LOG_LEVEL_WARN;
|
Mouse warning messages |
MOUSE_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;
|
Mouse error messages |
MOUSE_LOG_LEVEL_NONE = LOG_LEVEL_NONE;
|
No Mouse messages |
USBMOUSE_*
Note: The following constants are duplicated with the USBMouse unit for backwards compatibility |
USB_HID_*
HID Interface Subclass types (See USB HID v1.11 specification) | |
USB_HID_SUBCLASS_NONE = 0;
|
Section 4.2 |
USB_HID_SUBCLASS_BOOT = 1;
|
Section 4.2 |
HID Interface Protocol types (See USB HID v1.11 specification) | |
USB_HID_BOOT_PROTOCOL_NONE = 0;
|
Section 4.3 |
USB_HID_BOOT_PROTOCOL_KEYBOARD = 1;
|
Section 4.3 |
USB_HID_BOOT_PROTOCOL_MOUSE = 2;
|
Section 4.3 |
HID Class Descriptor Types (See USB HID v1.11 specification) | |
USB_HID_DESCRIPTOR_TYPE_HID = $21;
|
Section 7.1 |
USB_HID_DESCRIPTOR_TYPE_REPORT = $22;
|
Section 7.1 |
USB_HID_DESCRIPTOR_TYPE_PHYSICAL_DESCRIPTOR = $23;
|
Section 7.1 |
HID Request types | |
USB_HID_REQUEST_GET_REPORT = $01;
|
|
USB_HID_REQUEST_GET_IDLE = $02;
|
|
USB_HID_REQUEST_GET_PROTOCOL = $03;
|
Section 7.2 |
USB_HID_REQUEST_SET_REPORT = $09;
|
|
USB_HID_REQUEST_SET_IDLE = $0A;
|
|
USB_HID_REQUEST_SET_PROTOCOL = $0B;
|
Section 7.2 |
HID Protocol types | |
USB_HID_PROTOCOL_BOOT = 0;
|
Section 7.2.5 |
USB_HID_PROTOCOL_REPORT = 1;
|
Section 7.2.5 |
HID Report types | |
USB_HID_REPORT_INPUT = 1;
|
Section 7.2.1 |
USB_HID_REPORT_OUTPUT = 2;
|
Section 7.2.1 |
USB_HID_REPORT_FEATURE = 3;
|
Section 7.2.1 |
HID Report IDs | |
USB_HID_REPORTID_NONE = 0;
|
Section 7.2.1 |
HID Boot Protocol Button bits | |
USB_HID_BOOT_LEFT_BUTTON = (1 shl 0);
|
|
USB_HID_BOOT_RIGHT_BUTTON = (1 shl 1);
|
|
USB_HID_BOOT_MIDDLE_BUTTON = (1 shl 2);
|
|
USB_HID_BOOT_SIDE_BUTTON = (1 shl 3);
|
|
USB_HID_BOOT_EXTRA_BUTTON = (1 shl 4);
|
|
HID Boot Protocol Report data | |
USB_HID_BOOT_REPORT_SIZE = 3;
|
Appendix B of HID Device Class Definition 1.11 |
USB_HID_BOOT_DATA_SIZE = 8;
|
Allocate more than the minimum to allow for extra data |
Type definitions
Mouse data
PMouseData = ^TMouseData;
TMouseData = record
Buttons:Word;
|
The bitmap of current button values (eg MOUSE_LEFT_BUTTON or MOUSE_RIGHT_BUTTON) |
OffsetX:SmallInt;
|
The X offset of the mouse pointer (May be negative, read as absolute if Buttons includes MOUSE_ABSOLUTE_X) |
OffsetY:SmallInt;
|
The Y offset of the mouse pointer (May be negative, read as absolute if Buttons includes MOUSE_ABSOLUTE_Y) |
OffsetWheel:SmallInt;
|
The X offset of the mouse pointer (May be negative, read as absolute if Buttons includes MOUSE_ABSOLUTE_WHEEL) |
MaximumX:Word;
|
The maximum X value of the mouse (Only applicable if Buttons includes MOUSE_ABSOLUTE_X, otherwise must be 0) |
MaximumY:Word;
|
The maximum Y value of the mouse (Only applicable if Buttons includes MOUSE_ABSOLUTE_Y, otherwise must be 0) |
MaximumWheel:Word;
|
The maximum Wheel value of the mouse (Only applicable if Buttons includes MOUSE_ABSOLUTE_WHEEL, otherwise must be 0) |
Reserved:Word;
|
Reserved field (Round structure to 16 bytes) |
Mouse buffer
PMouseBuffer = ^TMouseBuffer;
TMouseBuffer = record
Wait:TSemaphoreHandle;
|
Buffer ready semaphore |
Start:LongWord;
|
Index of first buffer ready |
Count:LongWord;
|
Number of entries ready in buffer |
Buffer:array[0..(MOUSE_BUFFER_SIZE - 1)] of TMouseData;
|
Mouse properties
PMouseProperties = ^TMouseProperties;
TMouseProperties = record
Flags:LongWord;
|
Device flags (eg MOUSE_FLAG_SWAP_BUTTONS) |
Rotation:LongWord;
|
Screen Rotation (eg MOUSE_ROTATION_180) |
MaxX:LongWord;
|
Maximum (absolute) X value for the mouse device |
MaxY:LongWord;
|
Maximum (absolute) Y value for the mouse device |
MaxWheel:LongWord;
|
Maximum (absolute) wheel value for the mouse device |
MaxButtons:LongWord;
|
Maximum buttons mask (eg MOUSE_LEFT_BUTTON or MOUSE_RIGHT_BUTTON etc) |
Mouse enumeration callback
TMouseEnumerate = function(Mouse:PMouseDevice; Data:Pointer):LongWord;
|
Mouse notification callback
TMouseNotification = function(Device:PDevice; Data:Pointer; Notification:LongWord):LongWord;
|
Mouse device read
TMouseDeviceRead = function(Mouse:PMouseDevice; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;
|
Mouse device update
TMouseDeviceUpdate = function(Mouse:PMouseDevice):LongWord; stdcall;
|
Mouse device control
TMouseDeviceControl = function(Mouse:PMouseDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;
|
Mouse device get properties
TMouseDeviceGetProperties = function(Mouse:PMouseDevice; Properties:PMouseProperties):LongWord; stdcall;
|
Mouse device types
PMouseDevice = ^TMouseDevice;
TMouseDevice = record
Device Properties | |
Device:TDevice;
|
The Device entry for this Mouse |
Mouse Properties | |
MouseId:LongWord;
|
Unique Id of this Mouse in the Mouse table |
MouseState:LongWord;
|
Mouse state (eg MOUSE_STATE_ATTACHED) |
MouseRate:LongWord;
|
Mouse sample rate (Samples per second) |
DeviceRead:TMouseDeviceRead;
|
A Device specific DeviceRead method implementing a standard Mouse device interface (Or nil if the default method is suitable) |
DeviceUpdate:TMouseDeviceUpdate;
|
A Device specific DeviceUpdate method implementing a standard Mouse device interface (Or nil if the default method is suitable) |
DeviceControl:TMouseDeviceControl;
|
A Device specific DeviceControl method implementing a standard Mouse device interface (Or nil if the default method is suitable) |
DeviceGetProperties:TMouseDeviceGetProperties;
|
A Device specific DeviceGetProperties method implementing a standard Mouse device interface (Or nil if the default method is suitable) |
Driver Properties | |
Lock:TMutexHandle;
|
Mouse lock |
Buffer:TMouseBuffer;
|
Mouse input buffer |
Properties:TMouseProperties;
|
Device properties |
Statistics Properties | |
ReceiveCount:LongWord;
|
|
ReceiveErrors:LongWord;
|
|
BufferOverruns:LongWord;
|
|
Internal Properties | |
Prev:PMouseDevice;
|
Previous entry in Mouse table |
Next:PMouseDevice;
|
Next entry in Mouse table |
USB HID descriptor
PUSBHIDDescriptor = ^TUSBHIDDescriptor;
TUSBHIDDescriptor = packed record
bLength:Byte;
|
|
bDescriptorType:Byte;
|
|
bcdHID:Word;
|
|
bCountryCode:Byte;
|
|
bNumDescriptors:Byte;
|
|
bHIDDescriptorType:Byte;
|
|
wHIDDescriptorLength:Word;
|
|
Note: Up to two optional bHIDDescriptorType/wHIDDescriptorLength pairs after the Report descriptor details |
Public variables
Mouse logging
MOUSE_DEFAULT_LOG_LEVEL:LongWord = MOUSE_LOG_LEVEL_DEBUG;
|
Minimum level for Mouse messages. Only messages with level greater than or equal to this will be printed. |
MOUSE_LOG_ENABLED:Boolean;
|
Function declarations
Initialization functions
procedure MouseInit;
Note | Called only during system startup |
---|
Mouse functions
function MousePeek:LongWord;
Return | ERROR_SUCCESS if packets are ready, ERROR_NO_MORE_ITEMS if not or another error code on failure |
---|
function MouseRead(Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord; inline;
Buffer | Pointer to a buffer to copy the mouse data packets to |
---|---|
Size | The size of the buffer in bytes (Must be at least TMouseData or greater) |
Count | The number of mouse data packets copied to the bufferm |
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseReadEx(Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;
Buffer | Pointer to a buffer to copy the mouse data packets to |
---|---|
Size | The size of the buffer in bytes (Must be at least TMouseData or greater) |
Flags | The flags for the behaviour of the read (eg MOUSE_FLAG_NON_BLOCK) |
Count | The number of mouse data packets copied to the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseWrite(Buffer:Pointer; Size,Count:LongWord):LongWord;
Buffer | Pointer to a buffer to copy the mouse data packets from |
---|---|
Size | The size of the buffer in bytes (Must be at least TMouseData or greater) |
Count | The number of mouse data packets to copy from the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseFlush:LongWord;
Return | ERROR_SUCCESS if completed or another error code on failure |
---|
function MouseDeviceRead(Mouse:PMouseDevice; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;
Mouse | The mouse device to read from |
---|---|
Buffer | Pointer to a buffer to copy the mouse data packets to |
Size | The size of the buffer in bytes (Must be at least TMouseData or greater) |
Count | The number of mouse data packets copied to the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseDeviceUpdate(Mouse:PMouseDevice):LongWord;
Mouse | The mouse device to update |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Items updated can include rotation, maximum X, Y and wheel and flags (If supported) |
function MouseDeviceControl(Mouse:PMouseDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;
Mouse | The mouse device to control |
---|---|
Request | The request code for the operation (eg MOUSE_CONTROL_GET_FLAG) |
Argument1 | The first argument for the operation (Dependent on request code) |
Argument2 | The second argument for the operation (Dependent on request code) |
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseDeviceGetProperties(Mouse:PMouseDevice; Properties:PMouseProperties):LongWord;
Mouse | The mouse device to get properties from |
---|---|
Properties | Pointer to a TMouseProperties structure to fill in |
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseDeviceSetState(Mouse:PMouseDevice; State:LongWord):LongWord;
Mouse | The mouse to set the state for |
---|---|
State | The new state to set and notify |
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseDeviceCreate:PMouseDevice;
Return | Pointer to new Mouse device entry or nil if mouse could not be created |
---|
function MouseDeviceCreateEx(Size:LongWord):PMouseDevice;
Size | Size in bytes to allocate for new mouse (Including the mouse device entry) |
---|---|
Return | Pointer to new Mouse device entry or nil if mouse could not be created |
function MouseDeviceDestroy(Mouse:PMouseDevice):LongWord;
Mouse | The mouse device to destroy |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseDeviceRegister(Mouse:PMouseDevice):LongWord;
Mouse | The mouse device to register |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseDeviceDeregister(Mouse:PMouseDevice):LongWord;
Mouse | The mouse device to deregister |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseDeviceFind(MouseId:LongWord):PMouseDevice;
MouseId | The ID number of the mouse to find |
---|---|
Return | Pointer to mouse device entry or nil if not found |
function MouseDeviceFindByName(const Name:String):PMouseDevice; inline;
Name | The name of the mouse to find (eg Mouse0) |
---|---|
Return | Pointer to mouse device entry or nil if not found |
function MouseDeviceFindByDescription(const Description:String):PMouseDevice; inline;
Description | The description of the mouse to find (eg USB HID Mouse) |
---|---|
Return | Pointer to mouse device entry or nil if not found |
function MouseDeviceEnumerate(Callback:TMouseEnumerate; Data:Pointer):LongWord;
Callback | The callback function to call for each mouse in the table |
---|---|
Data | A private data pointer to pass to callback for each mouse in the table |
Return | ERROR_SUCCESS if completed or another error code on failure |
function MouseDeviceNotification(Mouse:PMouseDevice; Callback:TMouseNotification; Data:Pointer; Notification,Flags:LongWord):LongWord;
Mouse | The mouse device to notify changes for (Optional, pass nil for all mice) |
---|---|
Callback | The function to call when a notification event occurs |
Data | A private data pointer to pass to callback when a notification event occurs |
Notification | The events to register for notification of (eg DEVICE_NOTIFICATION_REGISTER) |
Flags | The flags to control the notification (eg NOTIFIER_FLAG_WORKER) |
RTL console functions
function SysConsoleHideMouse(AUserData:Pointer):Boolean;
Note | None documented |
---|
function SysConsoleShowMouse(X,Y:LongWord; AUserData:Pointer):Boolean;
Note | None documented |
---|
function SysConsoleReadMouse(var X,Y,Buttons:LongWord; AUserData:Pointer):Boolean;
Note | None documented |
---|
Mouse helper functions
function MouseGetCount:LongWord;
Note | None documented |
---|
function MouseDeviceCheck(Mouse:PMouseDevice):PMouseDevice;
Note | None documented |
---|
function MouseDeviceTypeToString(MouseType:LongWord):String;
Note | None documented |
---|
function MouseDeviceStateToString(MouseState:LongWord):String;
Note | None documented |
---|
function MouseDeviceRotationToString(Rotation:LongWord):String;
Note | None documented |
---|
function MouseDeviceStateToNotification(State:LongWord):LongWord;
Note | None documented |
---|
function MouseDeviceResolveRotation(ARotation:LongWord):LongWord;
Note | Also accepts passing the mouse rotation constant values directly |
---|
function MouseInsertData(Mouse:PMouseDevice; Data:PMouseData; Signal:Boolean):LongWord;
Mouse | The mouse device to insert data for |
---|---|
Data | The TMouseData entry to insert |
Signal | If True then signal that new data is available in the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Caller must hold the mouse lock |
procedure MouseLog(Level:LongWord; Mouse:PMouseDevice; const AText:String);
Note | None documented |
---|
procedure MouseLogInfo(Mouse:PMouseDevice; const AText:String); inline;
Note | None documented |
---|
procedure MouseLogWarn(Mouse:PMouseDevice; const AText:String); inline;
Note | None documented |
---|
procedure MouseLogError(Mouse:PMouseDevice; const AText:String); inline;
Note | None documented |
---|
procedure MouseLogDebug(Mouse:PMouseDevice;const AText:String); inline;
Note | None documented |
---|
Return to Unit Reference