📄 win_sys.c
字号:
FILE_ATTRIBUTE_NORMAL,
NULL );
if( mouse2filehandle == INVALID_HANDLE_VALUE )
{
int e=GetLastError();
if( e==5 )
CONS_Printf("\2Can't open %s : Access denied\n"
"The port is probably already used by one other device (mouse, modem,...)\n",cv_mouse2port.string);
else
CONS_Printf("\2Can't open %s : error %d\n",cv_mouse2port.string,e);
mouse2filehandle=0;
return;
}
}
// getevent when somthing happens
//SetCommMask( mouse2filehandle, EV_RXCHAR ) ;
// buffers
SetupComm( mouse2filehandle, MOUSECOMBUFFERSIZE, MOUSECOMBUFFERSIZE ) ;
// purge buffers
PurgeComm( mouse2filehandle, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
// setup port to 1200 7N1
dcb.DCBlength = sizeof( DCB ) ;
GetCommState( mouse2filehandle, &dcb ) ;
dcb.BaudRate = CBR_1200;
dcb.ByteSize = 7;
dcb.Parity = NOPARITY ;
dcb.StopBits = ONESTOPBIT ;
dcb.fDtrControl = DTR_CONTROL_ENABLE ;
dcb.fRtsControl = RTS_CONTROL_ENABLE ;
dcb.fBinary = TRUE ;
dcb.fParity = TRUE ;
SetCommState( mouse2filehandle, &dcb ) ;
I_AddExitFunc (I_ShutdownMouse2);
}
// judgecutor:
//
#define MAX_MOUSE_BTNS 3
static int center_x, center_y;
static int old_mparms[3], new_mparms[3] = {0, 0, 1};
static boolean restore_mouse = FALSE;
static int old_mouse_state = 0;
extern boolean nodinput;
unsigned int MSHWheelMessage = 0;
static void I_DoStartupSysMouse()
{
boolean valid;
RECT w_rect;
valid = SystemParametersInfo(SPI_GETMOUSE, 0, old_mparms, 0);
if (valid)
{
new_mparms[2] = old_mparms[2];
restore_mouse = SystemParametersInfo(SPI_SETMOUSE, 0, new_mparms, 0);
}
if (bAppFullScreen)
{
w_rect.top = 0;
w_rect.left = 0;
}
else
{
w_rect.top = windowPosY;
w_rect.left = windowPosX;
}
w_rect.bottom = w_rect.top + VIDHEIGHT;
w_rect.right = w_rect.left + VIDWIDTH;
center_x = w_rect.left + (VIDWIDTH >> 1);
center_y = w_rect.top + (VIDHEIGHT >> 1);
SetCursor(NULL);
SetCursorPos(center_x, center_y);
SetCapture(hWndMain);
ClipCursor(&w_rect);
}
static void I_ShutdownSysMouse()
{
if (restore_mouse)
SystemParametersInfo(SPI_SETMOUSE, 0, old_mparms, 0);
//SetCursor(LoadCursor(NULL, IDC_WAIT));
ClipCursor(NULL);
ReleaseCapture();
}
void I_RestartSysMouse()
{
if (nodinput)
{
I_ShutdownSysMouse();
I_DoStartupSysMouse();
}
}
void I_GetSysMouseEvents(int mouse_state)
{
int i;
event_t event;
int xmickeys = 0, ymickeys = 0;
POINT c_pos;
for (i = 0; i < MAX_MOUSE_BTNS; i++)
{
// check if button pressed
if ((mouse_state & (1 << i)) && !(old_mouse_state & ( 1 << i)))
{
event.type = ev_keydown;
event.data1 = KEY_MOUSE1 + i;
D_PostEvent(&event);
}
// check if button released
if (!(mouse_state & ( 1 << i)) && (old_mouse_state & (1 << i)))
{
event.type = ev_keyup;
event.data1 = KEY_MOUSE1 + i;
D_PostEvent(&event);
}
}
old_mouse_state = mouse_state;
// proceed mouse movements
GetCursorPos(&c_pos);
xmickeys = c_pos.x - center_x;
ymickeys = c_pos.y - center_y;
if (xmickeys || ymickeys)
{
event.type = ev_mouse;
event.data1 = 0;
event.data2 = xmickeys;
event.data3 = -ymickeys;
D_PostEvent (&event);
SetCursorPos(center_x, center_y);
}
}
// This is called just before entering the main game loop,
// when we are going fullscreen and the loading screen has finished.
void I_DoStartupMouse (void)
{
DIPROPDWORD dip;
// mouse detection may be skipped by setting usemouse false
if (cv_usemouse.value == 0 || M_CheckParm("-nomouse")) {
mouse_enabled = false;
return;
}
if (nodinput)
{
CONS_Printf("\tMouse will not use DirectInput.\n");
// System mouse input will be initiated by VID_SetMode
//I_DoStartupSysMouse();
I_AddExitFunc(I_ShutdownMouse);
//if (!GetSystemMetrics(SM_MOUSEWHEELPRESENT))
MSHWheelMessage = RegisterWindowMessage(MSH_MOUSEWHEEL);
}
else if (lpDIM==NULL) // acquire the mouse only once
{
CreateDevice2 (lpDI, &GUID_SysMouse, &lpDIM, NULL);
if (lpDIM)
{
if (FAILED( lpDIM->lpVtbl->SetDataFormat (lpDIM, &c_dfDIMouse) ))
I_Error ("Couldn't set mouse data format");
// create buffer for buffered data
dip.diph.dwSize = sizeof(dip);
dip.diph.dwHeaderSize = sizeof(dip.diph);
dip.diph.dwObj = 0;
dip.diph.dwHow = DIPH_DEVICE;
dip.dwData = DI_MOUSE_BUFFERSIZE;
if (FAILED( lpDIM->lpVtbl->SetProperty (lpDIM, DIPROP_BUFFERSIZE, &dip.diph)))
I_Error ("Couldn't set mouse buffer size");
if (FAILED( lpDIM->lpVtbl->SetCooperativeLevel (lpDIM, hWndMain, DISCL_EXCLUSIVE | DISCL_FOREGROUND)))
I_Error ("Couldn't set mouse coop level");
//BP: acquire it latter
//if (FAILED( lpDIM->lpVtbl->Acquire (lpDIM) ))
// I_Error ("Couldn't acquire mouse");
}
else
I_Error ("Couldn't create mouse input");
}
if( lpDIM )
I_AddExitFunc (I_ShutdownMouse);
// if re-enabled while running, just set mouse_enabled true again,
// do not acquire the mouse more than once
mouse_enabled = true;
}
//
// Shutdown Mouse DirectInput device
//
static void I_ShutdownMouse (void)
{
int i;
event_t event;
CONS_Printf ("I_ShutdownMouse()\n");
if (lpDIM)
{
lpDIM->lpVtbl->Unacquire (lpDIM);
lpDIM->lpVtbl->Release (lpDIM);
lpDIM = NULL;
}
// emulate the up of all mouse buttons
for(i=0;i<MOUSEBUTTONS;i++)
{
event.type=ev_keyup;
event.data1=KEY_MOUSE1+i;
D_PostEvent(&event);
}
if (nodinput)
I_ShutdownSysMouse();
mouse_enabled = false;
}
//
// Get buffered data from the mouse
//
static void I_GetMouseEvents (void)
{
DIDEVICEOBJECTDATA rgdod[DI_MOUSE_BUFFERSIZE];
DWORD dwItems;
DWORD d;
HRESULT hr;
//DIMOUSESTATE diMState;
event_t event;
int xmickeys,ymickeys;
if(mouse2filehandle)
{
//mouse movement
static byte lastbuttons2=0;
I_PoolMouse2();
// post key event for buttons
if (handlermouse2buttons!=lastbuttons2)
{
int i,j=1,k;
k=(handlermouse2buttons ^ lastbuttons2); // only changed bit to 1
lastbuttons2=handlermouse2buttons;
for(i=0;i<MOUSEBUTTONS;i++,j<<=1)
if(k & j)
{
if(handlermouse2buttons & j)
event.type=ev_keydown;
else
event.type=ev_keyup;
event.data1=KEY_2MOUSE1+i;
D_PostEvent(&event);
}
}
if ((handlermouse2x!=0)||(handlermouse2y!=0))
{
event.type=ev_mouse2;
event.data1=0;
// event.data1=buttons; // not needed
event.data2=handlermouse2x<<1;
event.data3=-handlermouse2y<<1;
handlermouse2x=0;
handlermouse2y=0;
D_PostEvent(&event);
}
}
if (!mouse_enabled || nodinput)
return;
getBufferedData:
dwItems = DI_MOUSE_BUFFERSIZE;
hr = lpDIM->lpVtbl->GetDeviceData (lpDIM, sizeof(DIDEVICEOBJECTDATA),
rgdod,
&dwItems,
0 );
// If data stream was interrupted, reacquire the device and try again.
if (hr==DIERR_INPUTLOST || hr==DIERR_NOTACQUIRED)
{
hr = lpDIM->lpVtbl->Acquire (lpDIM);
if (SUCCEEDED(hr))
goto getBufferedData;
}
// We got buffered input, act on it
if (SUCCEEDED(hr))
{
xmickeys = 0;
ymickeys = 0;
// dwItems contains number of elements read (could be 0)
for (d = 0; d < dwItems; d++)
{
if (rgdod[d].dwOfs >= DIMOFS_BUTTON0 &&
rgdod[d].dwOfs < DIMOFS_BUTTON0+MOUSEBUTTONS)
{
if (rgdod[d].dwData & 0x80) // Button down
event.type = ev_keydown;
else
event.type = ev_keyup; // Button up
event.data1 = rgdod[d].dwOfs - DIMOFS_BUTTON0 + KEY_MOUSE1;
D_PostEvent(&event);
}
else if (rgdod[d].dwOfs == DIMOFS_X) {
xmickeys += rgdod[d].dwData;
}
else if (rgdod[d].dwOfs == DIMOFS_Y) {
ymickeys += rgdod[d].dwData;
}
else if (rgdod[d].dwOfs == DIMOFS_Z)
{
// z-axes the wheel
if( (int)rgdod[d].dwData>0 )
event.data1 = KEY_MOUSEWHEELUP;
else
event.data1 = KEY_MOUSEWHEELDOWN;
event.type = ev_keydown;
D_PostEvent(&event);
}
}
if (xmickeys || ymickeys)
{
event.type = ev_mouse;
event.data1 = 0;
event.data2 = xmickeys;
event.data3 = -ymickeys;
D_PostEvent (&event);
}
}
}
// ===========================================================================================
// DIRECT INPUT JOYSTICK
// ===========================================================================================
// public for game control code
JoyType_t Joystick;
// private
static BYTE iJoyNum; // used by enumeration
// ------------------
// SetDIDwordProperty ( HELPER )
// Set a DWORD property on a DirectInputDevice.
// ------------------
static HRESULT SetDIDwordProperty( LPDIRECTINPUTDEVICE pdev,
REFGUID guidProperty,
DWORD dwObject,
DWORD dwHow,
DWORD dwValue)
{
DIPROPDWORD dipdw;
dipdw.diph.dwSize = sizeof(dipdw);
dipdw.diph.dwHeaderSize = sizeof(dipdw.diph);
dipdw.diph.dwObj = dwObject;
dipdw.diph.dwHow = dwHow;
dipdw.dwData = dwValue;
return pdev->lpVtbl->SetProperty( pdev, guidProperty, &dipdw.diph );
}
// ---------------
// DIEnumJoysticks
// There is no such thing as a 'system' joystick, contrary to mouse,
// we must enumerate and choose one joystick device to use
// ---------------
static BOOL CALLBACK DIEnumJoysticks ( LPCDIDEVICEINSTANCE lpddi,
LPVOID pvRef ) //cv_usejoystick
{
LPDIRECTINPUTDEVICE pdev;
DIPROPRANGE diprg;
DIDEVCAPS_DX3 caps;
BOOL bUseThisOne = FALSE;
iJoyNum++;
//faB: if cv holds a string description of joystick, the value from atoi() is 0
// else, the value was probably set by user at console to one of the previsouly
// enumerated joysticks
if ( ((consvar_t *)pvRef)->value == iJoyNum ||
!lstrcmp( ((consvar_t *)pvRef)->string, lpddi->tszProductName ) )
bUseThisOne = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -