Commit 3ba4be40 authored by Lionel Ulmer's avatar Lionel Ulmer Committed by Alexandre Julliard

- added support of DGA-2.0 events

- fixed the leaving of DGA-2.0 mode
parent 80c924f1
......@@ -3498,6 +3498,35 @@ static HRESULT WINAPI IDirectDraw2Impl_SetCooperativeLevel(
return DD_OK;
}
#ifdef HAVE_LIBXXF86DGA2
static HRESULT WINAPI DGA_IDirectDraw2Impl_SetCooperativeLevel(
LPDIRECTDRAW2 iface,HWND hwnd,DWORD cooplevel
) {
ICOM_THIS(IDirectDraw2Impl,iface);
HRESULT ret;
int evbase, erbase;
ret = IDirectDraw2Impl_SetCooperativeLevel(iface, hwnd, cooplevel);
if (This->e.dga.version != 2) {
return ret;
} else {
if (ret != DD_OK)
return ret;
TSXDGAQueryExtension(display, &evbase, &erbase);
/* Now, start handling of DGA events giving the handle to the DDraw window
as the window for which the event will be reported */
TSXDGASelectInput(display, DefaultScreen(display),
KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask );
X11DRV_EVENT_SetDGAStatus(hwnd, evbase);
return DD_OK;
}
}
#endif
/* Small helper to either use the cooperative window or create a new
* one (for mouse and keyboard input) and drawing in the Xlib implementation.
*/
......@@ -4197,13 +4226,14 @@ static ULONG WINAPI DGA_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) {
if (This->e.dga.version == 2) {
TRACE("Closing access to the FrameBuffer\n");
TSXDGACloseFramebuffer(display, DefaultScreen(display));
TRACE("Going back to normal X mode of operation\n");
TSXDGASetMode(display, DefaultScreen(display), 0);
/* Set the input handling back to absolute */
X11DRV_EVENT_SetInputMehod(X11DRV_INPUT_ABSOLUTE);
/* Ungrab mouse and keyboard */
TSXUngrabPointer(display, CurrentTime);
TSXUngrabKeyboard(display, CurrentTime);
/* Remove the handling of DGA2 events */
X11DRV_EVENT_SetDGAStatus(0, -1);
} else
#endif /* defined(HAVE_LIBXXF86DGA2) */
TSXF86DGADirectVideo(display,DefaultScreen(display),0);
......@@ -4822,7 +4852,11 @@ static ICOM_VTABLE(IDirectDraw) dga_ddvt =
XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus,
XCAST(Initialize)IDirectDraw2Impl_Initialize,
XCAST(RestoreDisplayMode)DGA_IDirectDraw2Impl_RestoreDisplayMode,
#ifdef HAVE_LIBXXF86DGA2
XCAST(SetCooperativeLevel)DGA_IDirectDraw2Impl_SetCooperativeLevel,
#else
XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel,
#endif
DGA_IDirectDrawImpl_SetDisplayMode,
XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank,
};
......@@ -5230,15 +5264,6 @@ static HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnk
(*ilplpDD)->e.dga.version = 2;
TSXGrabPointer(display, DefaultRootWindow(display), True,
PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
TSXGrabKeyboard(display, DefaultRootWindow(display), True, GrabModeAsync,
GrabModeAsync, CurrentTime);
TSXDGAQueryVersion(display,&major,&minor);
TRACE("XDGA is version %d.%d\n",major,minor);
......@@ -5246,15 +5271,9 @@ static HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnk
if (!TSXDGAOpenFramebuffer(display, DefaultScreen(display))) {
ERR("Error opening the frame buffer !!!\n");
TSXUngrabPointer(display, CurrentTime);
TSXUngrabKeyboard(display, CurrentTime);
return DDERR_GENERIC;
}
/* Set the input handling for relative mouse movements */
X11DRV_EVENT_SetInputMehod(X11DRV_INPUT_RELATIVE);
/* List all available modes */
modes = TSXDGAQueryModes(display, DefaultScreen(display), &num_modes);
if (TRACE_ON(ddraw)) {
......@@ -5289,6 +5308,9 @@ static HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnk
/* Now, get the device / mode description */
(*ilplpDD)->e.dga.dev = TSXDGASetMode(display, DefaultScreen(display), mode_to_use);
/* Set the input handling for relative mouse movements */
X11DRV_EVENT_SetInputMehod(X11DRV_INPUT_RELATIVE);
(*ilplpDD)->e.dga.fb_width = (*ilplpDD)->e.dga.dev->mode.imageWidth;
TSXDGASetViewport(display,DefaultScreen(display),0,0, XDGAFlipImmediate);
(*ilplpDD)->e.dga.fb_height = (*ilplpDD)->e.dga.dev->mode.viewportHeight;
......
......@@ -386,6 +386,11 @@ typedef enum {
} INPUT_TYPE;
extern INPUT_TYPE X11DRV_EVENT_SetInputMehod(INPUT_TYPE type);
#ifdef HAVE_LIBXXF86DGA2
void X11DRV_EVENT_SetDGAStatus(HWND hwnd, int event_base) ;
#endif
/* X11 keyboard driver */
extern struct tagKEYBOARD_DRIVER X11DRV_KEYBOARD_Driver;
......
......@@ -18,6 +18,10 @@
#include "ts_xshm.h"
#endif
#ifdef HAVE_LIBXXF86DGA2
#include "ts_xf86dga2.h"
#endif
#include <assert.h>
#include <string.h>
#include "callback.h"
......@@ -111,6 +115,21 @@ static int ShmCompletionType;
extern int XShmGetEventBase( Display * );/* Missing prototype for function in libXext. */
#endif
#ifdef HAVE_LIBXXF86DGA2
static int DGAMotionEventType;
static int DGAButtonPressEventType;
static int DGAButtonReleaseEventType;
static int DGAKeyPressEventType;
static int DGAKeyReleaseEventType;
static BOOL DGAUsed = FALSE;
static HWND DGAhwnd = 0;
static void EVENT_DGAMotionEvent( XDGAMotionEvent *event );
static void EVENT_DGAButtonPressEvent( XDGAButtonEvent *event );
static void EVENT_DGAButtonReleaseEvent( XDGAButtonEvent *event );
#endif
/* Usable only with OLVWM - compile option perhaps?
static void EVENT_EnterNotify( HWND hWnd, XCrossingEvent *event );
*/
......@@ -232,6 +251,38 @@ static void EVENT_ProcessEvent( XEvent *event )
}
#endif
#ifdef HAVE_LIBXXF86DGA2
if (DGAUsed) {
if (event->type == DGAMotionEventType) {
TRACE("DGAMotionEvent received.\n");
EVENT_DGAMotionEvent((XDGAMotionEvent *) event);
return;
}
if (event->type == DGAButtonPressEventType) {
TRACE("DGAButtonPressEvent received.\n");
EVENT_DGAButtonPressEvent((XDGAButtonEvent *) event);
return;
}
if (event->type == DGAButtonReleaseEventType) {
TRACE("DGAButtonReleaseEvent received.\n");
EVENT_DGAButtonReleaseEvent((XDGAButtonEvent *) event);
return;
}
if ((event->type == DGAKeyPressEventType) ||
(event->type == DGAKeyReleaseEventType)) {
/* Out of laziness, use the helper function to do the conversion :-) */
XKeyEvent ke;
TRACE("DGAKeyPress/ReleaseEvent received.\n");
XDGAKeyEventToXKeyEvent((XDGAKeyEvent *) event, &ke);
EVENT_Key( DGAhwnd, &ke );
return;
}
}
#endif
if ( TSXFindContext( display, event->xany.window, winContext,
(char **)&hWnd ) != 0) {
if ( event->type == ClientMessage) {
......@@ -1802,6 +1853,102 @@ INPUT_TYPE X11DRV_EVENT_SetInputMehod(INPUT_TYPE type)
return prev;
}
#ifdef HAVE_LIBXXF86DGA2
/**********************************************************************
* X11DRV_EVENT_SetDGAStatus
*/
void X11DRV_EVENT_SetDGAStatus(HWND hwnd, int event_base)
{
if (event_base < 0) {
DGAUsed = FALSE;
DGAhwnd = 0;
} else {
DGAUsed = TRUE;
DGAhwnd = hwnd;
DGAMotionEventType = event_base + MotionNotify;
DGAButtonPressEventType = event_base + ButtonPress;
DGAButtonReleaseEventType = event_base + ButtonRelease;
DGAKeyPressEventType = event_base + KeyPress;
DGAKeyReleaseEventType = event_base + KeyRelease;
}
}
/* DGA2 event handlers */
static void EVENT_DGAMotionEvent( XDGAMotionEvent *event )
{
MOUSE_SendEvent( MOUSEEVENTF_MOVE,
event->dx, event->dy,
X11DRV_EVENT_XStateToKeyState( event->state ),
event->time - MSG_WineStartTicks,
DGAhwnd );
}
static void EVENT_DGAButtonPressEvent( XDGAButtonEvent *event )
{
static WORD statusCodes[NB_BUTTONS] =
{ MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_RIGHTDOWN };
int buttonNum = event->button - 1;
WORD keystate;
if (buttonNum >= NB_BUTTONS) return;
keystate = X11DRV_EVENT_XStateToKeyState( event->state );
switch (buttonNum)
{
case 0:
keystate |= MK_LBUTTON;
break;
case 1:
keystate |= MK_MBUTTON;
break;
case 2:
keystate |= MK_RBUTTON;
break;
}
MOUSE_SendEvent( statusCodes[buttonNum],
0, 0,
keystate,
event->time - MSG_WineStartTicks,
DGAhwnd );
}
static void EVENT_DGAButtonReleaseEvent( XDGAButtonEvent *event )
{
static WORD statusCodes[NB_BUTTONS] =
{ MOUSEEVENTF_LEFTUP, MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_RIGHTUP };
int buttonNum = event->button - 1;
WORD keystate;
if (buttonNum >= NB_BUTTONS) return;
keystate = X11DRV_EVENT_XStateToKeyState( event->state );
switch (buttonNum)
{
case 0:
keystate &= ~MK_LBUTTON;
break;
case 1:
keystate &= ~MK_MBUTTON;
break;
case 2:
keystate &= ~MK_RBUTTON;
break;
}
MOUSE_SendEvent( statusCodes[buttonNum],
0, 0,
keystate,
event->time - MSG_WineStartTicks,
DGAhwnd );
}
#endif
#ifdef HAVE_LIBXXSHM
/*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment