Hi, Here are a few patches. The first one is to be applied on dlls/dinput/keyboard/main.c. It is ugly but that's the only way I found to get games that use SetEventNotification for keyboard to work. The second one is to be applied on memory/global.c. It is not the best way to get memory size on FreeBSD I guess, but it is still better than 16*1024*1024 :) Thanks for reviewing.
--- global.c Wed May 1 18:51:27 2002 +++ oldglobal.c Wed May 1 19:00:15 2002 @@ -41,6 +41,10 @@ #include "winerror.h" #include "msvcrt/excpt.h" +#ifdef __FreeBSD__ +#include <sys/sysctl.h> +#endif + WINE_DEFAULT_DEBUG_CHANNEL(global); /* Global arena block */ @@ -1524,7 +1528,10 @@ #ifdef linux FILE *f; #endif - +#ifdef __FreeBSD__ + int *tmp; + int size_sys; +#endif if (time(NULL)==cache_lastchecked) { memcpy(lpmem,&cached_memstatus,sizeof(MEMORYSTATUS)); return; @@ -1579,6 +1586,33 @@ / (TotalPhysical / 100); } } else +#elif defined(__FreeBSD__) + sysctlbyname("hw.physmem", NULL, &size_sys, NULL, 0); + tmp = malloc(size_sys * sizeof(int)); + sysctlbyname("hw.physmem", tmp, &size_sys, NULL, 0); + if (tmp && *tmp) + { + lpmem->dwTotalPhys = *tmp; + free(tmp); + sysctlbyname("hw.usermem", NULL, &size_sys, NULL, 0); + tmp = malloc(size_sys * sizeof(int)); + sysctlbyname("hw.usermem", tmp, &size_sys, NULL, 0); + if (tmp && *tmp) + { + lpmem->dwAvailPhys = *tmp; + lpmem->dwTotalPageFile = *tmp; + lpmem->dwAvailPageFile = *tmp; + lpmem->dwMemoryLoad = lpmem->dwTotalPhys - lpmem->dwAvailPhys; + } else + { + lpmem->dwAvailPhys = lpmem->dwTotalPhys; + lpmem->dwTotalPageFile = lpmem->dwTotalPhys; + lpmem->dwAvailPageFile = lpmem->dwTotalPhys; + lpmem->dwMemoryLoad = 0; + } + free(tmp); + + } else #endif { /* FIXME: should do something for other systems */
--- main.c Wed May 1 18:10:43 2002 +++ oldmain.c Wed May 1 18:15:01 2002 @@ -38,6 +38,8 @@ static ICOM_VTABLE(IDirectInputDevice2A) SysKeyboardAvt; static ICOM_VTABLE(IDirectInputDevice7A) SysKeyboard7Avt; +static IDirectInputDevice2A* current_lock = NULL; + typedef struct SysKeyboardAImpl SysKeyboardAImpl; struct SysKeyboardAImpl { @@ -48,6 +50,8 @@ IDirectInputAImpl *dinput; + HANDLE hEvent; + HHOOK hook; /* SysKeyboardAImpl */ BYTE keystate[256]; int acquired; @@ -205,6 +209,16 @@ return DI_OK; } +static LRESULT CALLBACK dinput_keyboard_hook(int code, WPARAM wparam, LPARAM lparam) +{ + SysKeyboardAImpl *This; + if (current_lock) + This = current_lock; + if (This->hEvent) + SetEvent(This->hEvent); + return 1; +} + static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE2A iface) { ICOM_THIS(SysKeyboardAImpl,iface); @@ -215,6 +229,7 @@ This->acquired = 1; } + This->hook = SetWindowsHookExW(WH_KEYBOARD, dinput_keyboard_hook, 0, 0); return DI_OK; } @@ -235,6 +250,17 @@ /****************************************************************************** * GetCapabilities : get the device capablitites */ +static HRESULT WINAPI SysKeyboardAImpl_SetEventNotification(LPDIRECTINPUTDEVICE2A iface, + HANDLE hnd) { + ICOM_THIS(SysKeyboardAImpl,iface); + + TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd); + + This->hEvent = hnd; + current_lock = This; + return DI_OK; +} + static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities( LPDIRECTINPUTDEVICE2A iface, LPDIDEVCAPS lpDIDevCaps) @@ -277,7 +303,7 @@ SysKeyboardAImpl_GetDeviceState, SysKeyboardAImpl_GetDeviceData, IDirectInputDevice2AImpl_SetDataFormat, - IDirectInputDevice2AImpl_SetEventNotification, + SysKeyboardAImpl_SetEventNotification, IDirectInputDevice2AImpl_SetCooperativeLevel, IDirectInputDevice2AImpl_GetObjectInfo, IDirectInputDevice2AImpl_GetDeviceInfo, @@ -315,7 +341,7 @@ XCAST(GetDeviceState)SysKeyboardAImpl_GetDeviceState, XCAST(GetDeviceData)SysKeyboardAImpl_GetDeviceData, XCAST(SetDataFormat)IDirectInputDevice2AImpl_SetDataFormat, - XCAST(SetEventNotification)IDirectInputDevice2AImpl_SetEventNotification, + XCAST(SetEventNotification)SysKeyboardAImpl_SetEventNotification, XCAST(SetCooperativeLevel)IDirectInputDevice2AImpl_SetCooperativeLevel, XCAST(GetObjectInfo)IDirectInputDevice2AImpl_GetObjectInfo, XCAST(GetDeviceInfo)IDirectInputDevice2AImpl_GetDeviceInfo,