Ignore:
Timestamp:
Jul 28, 2003, 1:35:32 PM (22 years ago)
Author:
sandervl
Message:

Updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/winmouse.cpp

    r9019 r10185  
    1 /* $Id: winmouse.cpp,v 1.26 2002-08-16 16:49:05 sandervl Exp $ */
     1/* $Id: winmouse.cpp,v 1.27 2003-07-28 11:27:50 sandervl Exp $ */
    22/*
    33 * Win32 mouse functions
     
    4040#include "hook.h"
    4141
     42#include <winkeyboard.h>
     43
    4244#define DBG_LOCALLOG    DBG_winmouse
    4345#include "dbglocal.h"
     
    150152  {
    151153    dprintf(("USER32: SetCapture %x; already set to that window; ignore", hwnd));
     154    //TODO: NT4 SP6 sends this message even now
     155////////    SendMessageA(hwndPrev, WM_CAPTURECHANGED, 0L, hwnd);
    152156    return hwndPrev;
    153157  }
     
    252256  INPUT i;
    253257 
    254   // format input packet
    255258  i.type           = INPUT_MOUSE;
    256259  i.mi.dx          = dx;
     
    292295  // TranslateMessage posts an appropriate
    293296  // WM_CHAR message.
     297
    294298  HWND hwnd = GetForegroundWindow();
    295  
     299   
    296300  LPINPUT piBase = pInputs;
    297301  for (int i = 0;
     
    305309      {
    306310        PMOUSEINPUT p = (PMOUSEINPUT)&piBase->mi;
    307         MSG msg;
    308        
    309         // simulate mouse input message
    310         // @@@PH
     311        MSG msg;
     312        HWND hwndCapture;
     313
     314        hwndCapture = GetCapture();
     315        if(hwndCapture) hwnd = hwndCapture;
     316       
     317        if(p->dwFlags & MOUSEEVENTF_MOVE)
     318        {
     319            if(!(p->dwFlags & MOUSEEVENTF_ABSOLUTE)) {
     320                POINT pt;
     321
     322                if(GetCursorPos(&pt) == TRUE) {
     323                    LONG relx = (LONG)p->dx;
     324                    LONG rely = (LONG)p->dy;
     325
     326                    p->dx = pt.x + relx;
     327                    p->dy = pt.y + rely;
     328                }
     329                else {
     330                    DebugInt3();
     331                    return 0;
     332                }
     333            }
     334            SetCursorPos(p->dx, p->dy);   
     335            OSLibSendWinMessage(hwnd, WM_MOUSEMOVE);
     336        }
     337
     338        if(p->dwFlags & MOUSEEVENTF_LEFTDOWN)
     339        {
     340            KeySetOverlayKeyState(VK_LBUTTON, KEYOVERLAYSTATE_DOWN);
     341            OSLibSendWinMessage(hwnd, WM_LBUTTONDOWN);
     342        }
     343        if(p->dwFlags & MOUSEEVENTF_LEFTUP)
     344        {
     345            KeySetOverlayKeyState(VK_LBUTTON, KEYOVERLAYSTATE_DONTCARE);
     346            OSLibSendWinMessage(hwnd, WM_LBUTTONUP);
     347        }
     348        if(p->dwFlags & MOUSEEVENTF_RIGHTDOWN)
     349        {
     350            KeySetOverlayKeyState(VK_RBUTTON, KEYOVERLAYSTATE_DOWN);
     351            OSLibSendWinMessage(hwnd, WM_RBUTTONDOWN);
     352        }
     353        if(p->dwFlags & MOUSEEVENTF_RIGHTUP)
     354        {
     355            KeySetOverlayKeyState(VK_RBUTTON, KEYOVERLAYSTATE_DONTCARE);
     356            OSLibSendWinMessage(hwnd, WM_RBUTTONUP);
     357        }
     358        if(p->dwFlags & MOUSEEVENTF_MIDDLEDOWN)
     359        {
     360            KeySetOverlayKeyState(VK_MBUTTON, KEYOVERLAYSTATE_DOWN);
     361            OSLibSendWinMessage(hwnd, WM_MBUTTONDOWN);
     362        }
     363        if(p->dwFlags & MOUSEEVENTF_MIDDLEUP)
     364        {
     365            KeySetOverlayKeyState(VK_MBUTTON, KEYOVERLAYSTATE_DONTCARE);
     366            OSLibSendWinMessage(hwnd, WM_MBUTTONUP);
     367        }
    311368      } 
    312369      break;
     
    319376        BOOL fUnicode = (p->dwFlags & KEYEVENTF_UNICODE) == KEYEVENTF_UNICODE;
    320377        DWORD extrainfo = GetMessageExtraInfo();
     378
     379        //TODO: We should really send an OS/2 WM_CHAR message here and let
     380        //      our existing code handle everything (WM_CHAR generation)
     381        //      This is a quick and dirty implementation. Not entirely correct.
    321382       
    322383        // build keyboard message
     
    360421
    361422        SetMessageExtraInfo( (LPARAM)p->dwExtraInfo );
     423
     424        KeySetOverlayKeyState(msg.wParam, (msg.message == WM_KEYDOWN) ? KEYOVERLAYSTATE_DOWN : KEYOVERLAYSTATE_DONTCARE);
    362425       
    363426        if (fUnicode)
     
    365428        else
    366429          SendMessageA(hwnd, msg.message, msg.wParam, msg.lParam);
    367        
     430
     431        if(msg.message == WM_KEYDOWN) {
     432            char keybstate[256];
     433            WORD key = 0;
     434
     435            GetKeyboardState((LPBYTE)&keybstate[0]);
     436            if(ToAscii(p->wVk, p->wScan, (LPBYTE)&keybstate[0], &key, 0) != 0) {
     437                SendMessageA(hwnd, WM_CHAR, key, msg.lParam);
     438            }
     439        }
     440
    368441        //restore extra info
    369442        SetMessageExtraInfo(extrainfo);
     
    656729//******************************************************************************
    657730//******************************************************************************
     731ULONG GetMouseKeyState()
     732{
     733  ULONG keystate = 0;
     734
     735  if(GetKeyState(VK_LBUTTON) & 0x8000)
     736    keystate |= MK_LBUTTON;
     737  if(GetKeyState(VK_RBUTTON) & 0x8000)
     738    keystate |= MK_RBUTTON;
     739  if(GetKeyState(VK_MBUTTON) & 0x8000)
     740    keystate |= MK_MBUTTON;
     741  if(GetKeyState(VK_SHIFT) & 0x8000)
     742    keystate |= MK_SHIFT;
     743  if(GetKeyState(VK_CONTROL) & 0x8000)
     744    keystate |= MK_CONTROL;
     745
     746  return keystate;
     747}
     748//******************************************************************************
     749//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.