blob: b65a25da728447685e028a0925869dd1da41c0f6 [file] [log] [blame]
Ulrich Weigandbf844a41998-11-08 12:21:35 +00001/*
2 * MOUSE driver
3 *
4 * Copyright 1998 Ulrich Weigand
5 *
6 */
7
Ulrich Weigand24dd5d91999-09-20 18:49:02 +00008#include <string.h>
9
Alexandre Julliard359f497e1999-07-04 16:02:24 +000010#include "debugtools.h"
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000011#include "callback.h"
12#include "builtin16.h"
Patrik Stridvallb87fe2e1999-04-01 08:16:08 +000013#include "mouse.h"
Jeremy Whited3e22d92000-02-10 19:03:02 +000014#include "windef.h"
15#include "wingdi.h"
Patrik Stridvallb87fe2e1999-04-01 08:16:08 +000016#include "winuser.h"
Andreas Mohra2da8681999-12-06 01:20:00 +000017#include "wine/winbase16.h"
Patrik Stridvall8d8703c1999-02-04 14:05:38 +000018
Alexandre Julliard28c3a1b2000-03-20 18:21:19 +000019DEFAULT_DEBUG_CHANNEL(event);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000020
Alexandre Julliard2b5d5642000-06-08 04:57:22 +000021#include "pshpack1.h"
22typedef struct _MOUSEINFO
23{
24 BYTE msExist;
25 BYTE msRelative;
26 WORD msNumButtons;
27 WORD msRate;
28 WORD msXThreshold;
29 WORD msYThreshold;
30 WORD msXRes;
31 WORD msYRes;
32 WORD msMouseCommPort;
33} MOUSEINFO, *LPMOUSEINFO;
34#include "poppack.h"
35
Patrik Stridvall8d8703c1999-02-04 14:05:38 +000036/**********************************************************************/
37
Ulrich Weigandbf844a41998-11-08 12:21:35 +000038static LPMOUSE_EVENT_PROC DefMouseEventProc = NULL;
39
40/***********************************************************************
41 * MOUSE_Inquire (MOUSE.1)
42 */
43WORD WINAPI MOUSE_Inquire(LPMOUSEINFO mouseInfo)
44{
45 mouseInfo->msExist = TRUE;
46 mouseInfo->msRelative = FALSE;
47 mouseInfo->msNumButtons = 2;
48 mouseInfo->msRate = 34; /* the DDK says so ... */
49 mouseInfo->msXThreshold = 0;
50 mouseInfo->msYThreshold = 0;
51 mouseInfo->msXRes = 0;
52 mouseInfo->msYRes = 0;
53 mouseInfo->msMouseCommPort = 0;
54
55 return sizeof(MOUSEINFO);
56}
57
58/***********************************************************************
59 * MOUSE_Enable (MOUSE.2)
60 */
61VOID WINAPI MOUSE_Enable(LPMOUSE_EVENT_PROC lpMouseEventProc)
62{
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000063 THUNK_Free( (FARPROC)DefMouseEventProc );
Ulrich Weigandbf844a41998-11-08 12:21:35 +000064 DefMouseEventProc = lpMouseEventProc;
Alexandre Julliard42d20f92000-08-10 01:16:19 +000065 USER_Driver.pInitMouse( lpMouseEventProc );
Ulrich Weigandbf844a41998-11-08 12:21:35 +000066}
67
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000068static VOID WINAPI MOUSE_CallMouseEventProc( FARPROC16 proc,
69 DWORD dwFlags, DWORD dx, DWORD dy,
70 DWORD cButtons, DWORD dwExtraInfo )
71{
72 CONTEXT86 context;
73
74 memset( &context, 0, sizeof(context) );
Alexandre Julliardd8fab2e2000-09-25 23:53:07 +000075 context.SegCs = SELECTOROF( proc );
76 context.Eip = OFFSETOF( proc );
77 context.Eax = (WORD)dwFlags;
78 context.Ebx = (WORD)dx;
79 context.Ecx = (WORD)dy;
80 context.Edx = (WORD)cButtons;
81 context.Esi = LOWORD( dwExtraInfo );
82 context.Edi = HIWORD( dwExtraInfo );
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000083
Alexandre Julliarde296bf32000-11-29 19:39:30 +000084 wine_call_to_16_regs_short( &context, 0 );
Ulrich Weigand24dd5d91999-09-20 18:49:02 +000085}
86
87VOID WINAPI WIN16_MOUSE_Enable( FARPROC16 proc )
88{
89 LPMOUSE_EVENT_PROC thunk =
90 (LPMOUSE_EVENT_PROC)THUNK_Alloc( proc, (RELAY)MOUSE_CallMouseEventProc );
91
92 MOUSE_Enable( thunk );
93}
94
Ulrich Weigandbf844a41998-11-08 12:21:35 +000095/***********************************************************************
96 * MOUSE_Disable (MOUSE.3)
97 */
98VOID WINAPI MOUSE_Disable(VOID)
99{
Ulrich Weigand24dd5d91999-09-20 18:49:02 +0000100 THUNK_Free( (FARPROC)DefMouseEventProc );
Ulrich Weigandbf844a41998-11-08 12:21:35 +0000101 DefMouseEventProc = 0;
Alexandre Julliard42d20f92000-08-10 01:16:19 +0000102 USER_Driver.pInitMouse( 0 );
Ulrich Weigandbf844a41998-11-08 12:21:35 +0000103}