source: trunk/src/user32/winmouse.cpp@ 4697

Last change on this file since 4697 was 4697, checked in by sandervl, 25 years ago

ReleaseCapture fix (endless loop in MultiEdit)

File size: 4.4 KB
Line 
1/* $Id: winmouse.cpp,v 1.11 2000-11-25 13:53:54 sandervl Exp $ */
2/*
3 * Mouse handler for DINPUT
4 *
5 * Copyright 1999 Sander van Leeuwen
6 *
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11#include <os2win.h>
12#include <misc.h>
13#include "win32wbase.h"
14#include "win32wnd.h"
15#include <win\mouse.h>
16#include "winmouse.h"
17#include "oslibmsg.h"
18#include "pmwindow.h"
19#include "oslibwin.h"
20
21#define DBG_LOCALLOG DBG_winmouse
22#include "dbglocal.h"
23
24LPMOUSE_EVENT_PROC mouseHandler = NULL;
25WNDPROC keyboardHandler = NULL;
26
27//******************************************************************************
28//******************************************************************************
29VOID WIN32API MOUSE_Enable(LPMOUSE_EVENT_PROC lpMouseEventProc)
30{
31 if(lpMouseEventProc == (LPMOUSE_EVENT_PROC)-1)
32 {
33 mouseHandler = NULL;
34 }
35 else mouseHandler = lpMouseEventProc;
36}
37//******************************************************************************
38//******************************************************************************
39VOID WIN32API KEYBOARD_Enable(WNDPROC handler)
40{
41 keyboardHandler = handler;
42}
43//******************************************************************************
44//******************************************************************************
45BOOL DInputKeyBoardHandler(MSG *msg)
46{
47 if(!ISKDB_CAPTURED())
48 return FALSE;
49
50 return keyboardHandler(msg->hwnd, msg->message, msg->wParam, msg->lParam);
51}
52//******************************************************************************
53//******************************************************************************
54BOOL DInputMouseHandler(HWND hwnd, ULONG msg, ULONG x, ULONG y)
55{
56 WINE_MOUSEEVENT mouseEvent;
57 DWORD dwFlags = MOUSEEVENTF_ABSOLUTE;
58
59 if(!ISMOUSE_CAPTURED())
60 return FALSE;
61
62 mouseEvent.magic = WINE_MOUSEEVENT_MAGIC;
63 mouseEvent.hWnd = hwnd;
64 mouseEvent.time = OSLibWinQueryMsgTime();
65 mouseEvent.keyState = 0; //not used in dinput right now
66 switch(msg)
67 {
68 case WM_NCLBUTTONDOWN:
69 case WM_LBUTTONDOWN:
70 dwFlags |= MOUSEEVENTF_LEFTDOWN;
71 break;
72 case WM_NCLBUTTONUP:
73 case WM_LBUTTONUP:
74 dwFlags |= MOUSEEVENTF_LEFTUP;
75 break;
76 case WM_NCRBUTTONUP:
77 case WM_RBUTTONUP:
78 dwFlags |= MOUSEEVENTF_RIGHTUP;
79 break;
80 case WM_NCRBUTTONDOWN:
81 case WM_RBUTTONDOWN:
82 dwFlags |= MOUSEEVENTF_RIGHTDOWN;
83 break;
84 case WM_NCMBUTTONUP:
85 case WM_MBUTTONUP:
86 dwFlags |= MOUSEEVENTF_MIDDLEUP;
87 break;
88 case WM_NCMBUTTONDOWN:
89 case WM_MBUTTONDOWN:
90 dwFlags |= MOUSEEVENTF_MIDDLEDOWN;
91 break;
92 case WM_MOUSEMOVE:
93 case WM_NCMOUSEMOVE:
94 dwFlags |= MOUSEEVENTF_MOVE;
95 break;
96 default:
97 //TODO: handle double clicks???
98 return FALSE;
99 }
100
101 x = (((long)x << 16) + ScreenWidth-1) / ScreenWidth;
102 y = (((long)y << 16) + ScreenHeight-1) / ScreenHeight;
103
104 return mouseHandler(dwFlags, x, y, 0, (DWORD)&mouseEvent);
105}
106//******************************************************************************
107//******************************************************************************
108HWND WIN32API GetCapture(void)
109{
110 HWND hwnd;
111
112 hwnd = Win32Window::OS2ToWin32Handle(OSLibWinQueryCapture());
113 dprintf(("USER32: GetCapture returned %x", hwnd));
114 return hwnd;
115}
116//******************************************************************************
117//******************************************************************************
118HWND WIN32API SetCapture(HWND hwnd)
119{
120 HWND hwndPrev = GetCapture();
121 BOOL rc;
122
123 if(hwnd == 0) {
124 ReleaseCapture();
125 return hwndPrev;
126 }
127 if(hwndPrev != NULL) {
128 //SvL: WinSetCapture returns an error if mouse is already captured
129 ReleaseCapture();
130 }
131 rc = OSLibWinSetCapture(Win32Window::Win32ToOS2Handle(hwnd));
132 dprintf(("USER32: SetCapture %x (prev %x) returned %d", hwnd, hwndPrev, rc));
133 if(hwndPrev) {
134 SendMessageA(hwndPrev, WM_CAPTURECHANGED, 0L, hwnd);
135 }
136 return hwndPrev;
137}
138//******************************************************************************
139//******************************************************************************
140BOOL WIN32API ReleaseCapture(void)
141{
142 HWND hwndPrev;
143 BOOL ret;
144
145 dprintf(("USER32: ReleaseCapture"));
146 hwndPrev = GetCapture();
147 ret = OSLibWinSetCapture(0);
148 if(hwndPrev) {
149 SendMessageA(hwndPrev, WM_CAPTURECHANGED, 0L, 0L);
150 }
151 return ret;
152}
153//******************************************************************************
154//******************************************************************************
Note: See TracBrowser for help on using the repository browser.