I've done some work getting the patches from http://starcraft-wine.sourceforge.net/ working with CVS wine. Using the patch I'm including, starcraft works perfectly on my machine, run as root using DGA on a 640x480 XF86 layout. In particular the changes to event.c enable the mouse and keyboard with DGA. The changes to input.c make the mouse acceleration work the same in all directions. The changes to mouse.c enable mouse scrolling around the map. I'm using redhat 9, so the patch also has a change to wineinstall so that the configure is set up for rh9. You'll probably need to drop that if you aren't running rh9. Now, it would be great to get these changes merged into mainline wine. However, I imagine they break other stuff somewhere. I don't really know exactly what the changes mean, as I've mostly been converting an old patch over. I believe that the patch to input.c is simple and straightforward enough to be merged in, even if the others aren't. Any comments as to what needs to happen to get these into wine are greatly appreciated. John
? dlls/x11drv/.mouse.c.swp Index: dlls/x11drv/event.c =================================================================== RCS file: /home/wine/wine/dlls/x11drv/event.c,v retrieving revision 1.18 diff -u -r1.18 event.c --- dlls/x11drv/event.c 23 Jan 2003 01:29:58 -0000 1.18 +++ dlls/x11drv/event.c 10 Apr 2003 02:13:51 -0000 @@ -112,7 +112,7 @@ static int DGAKeyPressEventType; static int DGAKeyReleaseEventType; -static BOOL DGAUsed = FALSE; +BOOL DGAUsed = FALSE; static HWND DGAhwnd = 0; extern void X11DRV_DGAMotionEvent( HWND hwnd, XDGAMotionEvent *event ); @@ -133,18 +133,40 @@ XEvent event; int count = 0; + /* Added to make starcraft work */ +#ifdef HAVE_LIBXXF86DGA2 + Display *display = DGAUsed ? gdi_display : data->display; +#else + Display *display = data->display; +#endif + wine_tsx11_lock(); - while ( XPending( data->display ) ) + /* Changed to make starcraft work */ + while ( XPending( display ) ) { - Bool ignore; - - XNextEvent( data->display, &event ); - ignore = XFilterEvent( &event, None ); + XNextEvent( display, &event ); wine_tsx11_unlock(); - if (!ignore) EVENT_ProcessEvent( &event ); + EVENT_ProcessEvent( &event ); count++; wine_tsx11_lock(); } +/* this is a way in old patch, but I think it is unecessary + not sure why we need a separate loop + + int events; + while ( (events = XPending( display )) ) + { + do + { + XNextEvent( display, &event ); + wine_tsx11_unlock(); + EVENT_ProcessEvent( &event ); + count++; + wine_tsx11_lock(); + } + while ( --events != 0); + } +*/ wine_tsx11_unlock(); return count; } Index: dlls/x11drv/mouse.c =================================================================== RCS file: /home/wine/wine/dlls/x11drv/mouse.c,v retrieving revision 1.11 diff -u -r1.11 mouse.c --- dlls/x11drv/mouse.c 7 Jan 2003 20:36:22 -0000 1.11 +++ dlls/x11drv/mouse.c 10 Apr 2003 02:14:04 -0000 @@ -35,6 +35,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(cursor); +#ifdef HAVE_LIBXXF86DGA2 +extern BOOL DGAUsed; +#endif + /**********************************************************************/ #define NB_BUTTONS 5 /* Windows can handle 3 buttons and the wheel too */ @@ -159,8 +163,13 @@ if (data->cursor_window != win) { +#ifdef HAVE_LIBXXF86DGA2 + Display *display = DGAUsed ? gdi_display : data->display; +#else + Display *display = data->display; +#endif data->cursor_window = win; - if (data->cursor) TSXDefineCursor( data->display, win, data->cursor ); + if (data->cursor) TSXDefineCursor( display, win, data->cursor ); } } @@ -480,18 +489,23 @@ else /* set the same cursor for all top-level windows of the current thread */ { struct x11drv_thread_data *data = x11drv_thread_data(); +#ifdef HAVE_LIBXXF86DGA2 + Display *display = DGAUsed ? gdi_display : data->display; +#else + Display *display = data->display; +#endif wine_tsx11_lock(); - cursor = create_cursor( data->display, lpCursor ); + cursor = create_cursor( display, lpCursor ); if (cursor) { - if (data->cursor) XFreeCursor( data->display, data->cursor ); + if (data->cursor) XFreeCursor( display, data->cursor ); data->cursor = cursor; if (data->cursor_window) { - XDefineCursor( data->display, data->cursor_window, cursor ); + XDefineCursor( display, data->cursor_window, cursor ); /* Make the change take effect immediately */ - XFlush( data->display ); + XFlush( display ); } } wine_tsx11_unlock(); @@ -503,7 +517,11 @@ */ void X11DRV_SetCursorPos( INT x, INT y ) { +#ifdef HAVE_LIBXXF86DGA2 + Display *display = DGAUsed ? gdi_display : thread_display(); +#else Display *display = thread_display(); +#endif TRACE( "warping to (%d,%d)\n", x, y ); @@ -518,7 +536,11 @@ */ void X11DRV_GetCursorPos(LPPOINT pos) { +#ifdef HAVE_LIBXXF86DGA2 + Display *display = DGAUsed ? gdi_display : thread_display(); +#else Display *display = thread_display(); +#endif Window root, child; int rootX, rootY, winX, winY; unsigned int xstate; Index: tools/wineinstall =================================================================== RCS file: /home/wine/wine/tools/wineinstall,v retrieving revision 1.52 diff -u -r1.52 wineinstall --- tools/wineinstall 24 Mar 2003 19:29:38 -0000 1.52 +++ tools/wineinstall 10 Apr 2003 02:14:49 -0000 @@ -20,7 +20,7 @@ # #--- defaults (change these if you are a packager) -CONFARGS="" # configure args, e.g. --prefix=/usr --sysconfdir=/etc +CONFARGS="--with-nptl" # configure args, e.g. --prefix=/usr --sysconfdir=/etc prefix=/usr/local # installation prefix sysconfdir=$prefix/etc # where wine.conf and the global registry are supposed to be bindir=$prefix/bin # where winelib apps will be (or are) installed Index: windows/input.c =================================================================== RCS file: /home/wine/wine/windows/input.c,v retrieving revision 1.90 diff -u -r1.90 input.c --- windows/input.c 8 Jan 2003 00:27:58 -0000 1.90 +++ windows/input.c 10 Apr 2003 02:16:20 -0000 @@ -230,10 +230,10 @@ SystemParametersInfoA(SPI_GETMOUSE, 0, accel, 0); accelMult = 1; - if (mi->dx > accel[0] && accel[2] != 0) + if (labs(mi->dx) > accel[0] && accel[2] != 0) { accelMult = 2; - if ((mi->dx > accel[1]) && (accel[2] == 2)) + if ((labs(mi->dx) > accel[1]) && (accel[2] == 2)) { accelMult = 4; } @@ -241,10 +241,10 @@ posX += (long)mi->dx * accelMult; accelMult = 1; - if (mi->dy > accel[0] && accel[2] != 0) + if (labs(mi->dy) > accel[0] && accel[2] != 0) { accelMult = 2; - if ((mi->dy > accel[1]) && (accel[2] == 2)) + if ((labs(mi->dy) > accel[1]) && (accel[2] == 2)) { accelMult = 4; } @@ -472,7 +472,7 @@ if (!pt) return 0; pt->x = PosX; pt->y = PosY; - if (USER_Driver.pGetCursorPos) USER_Driver.pGetCursorPos( pt ); + //if (USER_Driver.pGetCursorPos) USER_Driver.pGetCursorPos( pt ); return 1; }