📄 i_system.c
字号:
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: i_system.c,v 1.15 2001/03/12 21:03:10 metzgermeister Exp $//// Copyright (C) 1993-1996 by id Software, Inc.// Portions Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.////// $Log: i_system.c,v $// Revision 1.15 2001/03/12 21:03:10 metzgermeister// * new symbols for rendererlib added in SDL// * console printout fixed for Linux&SDL// * Crash fixed in Linux SW renderer initialization//// Revision 1.14 2000/10/21 08:43:32 bpereira// no message//// Revision 1.13 2000/10/16 07:53:57 metzgermeister// fixed I_GetFreeMem//// Revision 1.12 2000/10/09 16:22:42 metzgermeister// implemented GetFreeMem//// Revision 1.11 2000/10/02 18:25:47 bpereira// no message//// Revision 1.10 2000/09/10 10:50:21 metzgermeister// make it work again//// Revision 1.9 2000/08/11 19:11:07 metzgermeister// *** empty log message ***//// Revision 1.8 2000/04/25 19:49:46 metzgermeister// support for automatic wad search//// Revision 1.7 2000/04/16 18:38:07 bpereira// no message//// Revision 1.6 2000/04/12 19:31:37 metzgermeister// added use_mouse to menu//// Revision 1.5 2000/04/07 23:12:38 metzgermeister// fixed some minor bugs//// Revision 1.4 2000/03/22 18:52:56 metzgermeister// added I_ShutdownCD to I_Quit//// Revision 1.3 2000/03/06 15:19:58 hurdler// Add Bell Kin's changes//// Revision 1.2 2000/02/27 00:42:11 hurdler// fix CR+LF problem//// Revision 1.1.1.1 2000/02/22 20:32:33 hurdler// Initial import into CVS (v1.29 pr3)////// DESCRIPTION:////-----------------------------------------------------------------------------#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/uio.h>#include <unistd.h>#include <fcntl.h>#include <signal.h>#include <string.h>#include <stdarg.h>#include <sys/time.h>#ifdef LMOUSE2#include <termios.h>#endif// statfs()#include <sys/vfs.h>#ifdef LJOYSTICK // linux joystick 1.x#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <fcntl.h>#include <linux/joystick.h>#endif#include "doomdef.h"#include "m_misc.h"#include "i_video.h"#include "i_sound.h"#include "d_net.h"#include "g_game.h"#include "endtxt.h"#ifdef __GNUG__#pragma implementation "i_system.h"#endif#include "i_system.h"#include "i_joy.h"extern void D_PostEvent(event_t*);extern event_t events[MAXEVENTS];extern int eventhead;extern int eventtail;// Locations for searching the doom3.wad#define DEFAULTWADLOCATION1 "/usr/local/games/legacy"#define DEFAULTWADLOCATION2 "/usr/games/legacy"#define DEFAULTSEARCHPATH1 "/usr/local"#define DEFAULTSEARCHPATH2 "/usr/games"#define WADKEYWORD "doom3.wad"// holds wad pathstatic char returnWadPath[256];#ifdef LJOYSTICKint joyfd = -1;int joyaxes = 0;int joystick_started = 0;int joy_scale = 1;#endifJoyType_t Joystick;#ifdef LMOUSE2int fdmouse2 = -1;int mouse2_started = 0;#endif// dummy 19990119 by Kinbyte keyboard_started = 0;void I_StartupKeyboard (void) {}void I_StartupTimer (void) {}void I_OutputMsg (char *fmt, ...) { va_list argptr; va_start (argptr,fmt); vfprintf (stderr,fmt,argptr); va_end (argptr);}int I_GetKey (void) { // Warning: I_GetKey emties the event queue till next keypress event_t* ev; int rc=0; // return the first keypress from the event queue for ( ; eventtail != eventhead ; eventtail = (++eventtail)&(MAXEVENTS-1) ) { ev = &events[eventtail]; if(ev->type == ev_keydown) { rc = ev->data1; continue; } } return rc; }#ifdef LJOYSTICKvoid I_JoyScale() { joy_scale = (cv_joyscale.value==0)?1:cv_joyscale.value;}void I_GetJoyEvent() { struct js_event jdata; static event_t event = {0,0,0,0}; static int buttons = 0; if(!joystick_started) return; while(read(joyfd,&jdata,sizeof(jdata))!=-1) { switch(jdata.type) { case JS_EVENT_AXIS: event.type = ev_joystick; event.data1 = 0; switch(jdata.number) { case 0: event.data2 = ((jdata.value >> 5)/joy_scale)*joy_scale; D_PostEvent(&event); break; case 1: event.data3 = ((jdata.value >> 5)/joy_scale)*joy_scale; D_PostEvent(&event); default: break; } break; case JS_EVENT_BUTTON: if(jdata.number<JOYBUTTONS) { if(jdata.value) { if(!((buttons >> jdata.number)&1)) { buttons |= 1 << jdata.number; event.type = ev_keydown; event.data1 = KEY_JOY1+jdata.number; D_PostEvent(&event); } } else { if((buttons>>jdata.number)&1) { buttons ^= 1 << jdata.number; event.type = ev_keyup; event.data1 = KEY_JOY1+jdata.number; D_PostEvent(&event); } } } break; } }}void I_ShutdownJoystick() { if(joyfd!=-1) { close(joyfd); joyfd = -1; } joyaxes = 0; joystick_started = 0;}int joy_open(char *fname) { joyfd = open(fname,O_RDONLY|O_NONBLOCK); if(joyfd==-1) { CONS_Printf("Error opening %s!\n",fname); return 0; } ioctl(joyfd,JSIOCGAXES,&joyaxes); if(joyaxes<2) { CONS_Printf("Not enought axes?\n"); joyaxes = 0; joyfd = -1; close(joyfd); return 0; } return joyaxes;}/*int joy_waitb(int fd, int *xpos,int *ypos,int *hxpos,int *hypos) { int i,xps,yps,hxps,hyps; struct js_event jdata; for(i=0;i<1000;i++) { while(read(fd,&jdata,sizeof(jdata))!=-1) { switch(jdata.type) { case JS_EVENT_AXIS: switch(jdata.number) { case 0: // x xps = jdata.value; break; case 1: // y yps = jdata.value; break; case 3: // hat x hxps = jdata.value; break; case 4: // hat y hyps = jdata.value; default: break; } break; case JS_EVENT_BUTTON: break; } } } }*/#endifvoid I_InitJoystick (void) {#ifdef LJOYSTICK I_ShutdownJoystick(); if(!strcmp(cv_usejoystick.string,"0")) return; if(!joy_open(cv_joyport.string)) return; joystick_started = 1; return;#endif}#ifdef LMOUSE2void I_GetMouse2Event() { static unsigned char mdata[5]; static int i = 0,om2b = 0; int di,j,mlp,button; event_t event; const int mswap[8] = {0,4,1,5,2,6,3,7}; if(!mouse2_started) return; for(mlp=0;mlp<20;mlp++) { for(;i<5;i++) { di = read(fdmouse2,mdata+i,1); if(di==-1) return; } if((mdata[0]&0xf8)!=0x80) { for(j=1;j<5;j++) { if((mdata[j]&0xf8)==0x80) { for(i=0;i<5-j;i++) { // shift mdata[i] = mdata[i+j]; } } } if(i<5) continue; } else { button = mswap[~mdata[0]&0x07]; for(j=0;j<MOUSEBUTTONS;j++) { if(om2b&(1<<j)) { if(!(button&(1<<j))) { //keyup event.type = ev_keyup; event.data1 = KEY_2MOUSE1+j; D_PostEvent(&event); om2b ^= 1 << j; } } else { if(button&(1<<j)) { event.type = ev_keydown; event.data1 = KEY_2MOUSE1+j; D_PostEvent(&event); om2b ^= 1 << j; } } } event.data2 = ((signed char)mdata[1])+((signed char)mdata[3]); event.data3 = ((signed char)mdata[2])+((signed char)mdata[4]); if(event.data2&&event.data3) { event.type = ev_mouse2; event.data1 = 0; D_PostEvent(&event); } } i = 0; }}void I_ShutdownMouse2() { if(fdmouse2!=-1) close(fdmouse2); mouse2_started = 0;}#endifvoid I_StartupMouse2 (void) {#ifdef LMOUSE2 struct termios m2tio; int i,dtr,rts; I_ShutdownMouse2(); if(cv_usemouse2.value == 0) return; if((fdmouse2 = open(cv_mouse2port.string,O_RDONLY|O_NONBLOCK|O_NOCTTY))==-1) { CONS_Printf("Error opening %s!\n",cv_mouse2port.string); return; } tcflush(fdmouse2, TCIOFLUSH); m2tio.c_iflag = IGNBRK; m2tio.c_oflag = 0; m2tio.c_cflag = CREAD|CLOCAL|HUPCL|CS8|CSTOPB|B1200; m2tio.c_lflag = 0; m2tio.c_cc[VTIME] = 0; m2tio.c_cc[VMIN] = 1; tcsetattr(fdmouse2, TCSANOW, &m2tio); strupr(cv_mouse2opt.string); for(i=0,rts = dtr = -1;i<strlen(cv_mouse2opt.string);i++) { if(cv_mouse2opt.string[i]=='D') { if(cv_mouse2opt.string[i+1]=='-') { dtr = 0; } else { dtr = 1; } } if(cv_mouse2opt.string[i]=='R') { if(cv_mouse2opt.string[i+1]=='-') { rts = 0; } else { rts = 1; } } } if((dtr!=-1)||(rts!=-1)) { if(!ioctl(fdmouse2, TIOCMGET, &i)) { if(!dtr) { i &= ~TIOCM_DTR; } else { if(dtr>0) i |= TIOCM_DTR; } if(!rts) { i &= ~TIOCM_RTS; } else { if(rts>0) i |= TIOCM_RTS; } ioctl(fdmouse2, TIOCMSET, &i); } } mouse2_started = 1;#endif}// return free and total physical memory in the system#define MEMINFO_FILE "/proc/meminfo"#define MEMTOTAL "MemTotal:"#define MEMFREE "MemFree:"ULONG I_GetFreeMem(ULONG *total){ char buf[1024]; char *memTag; ULONG freeKBytes; ULONG totalKBytes; int n;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -