aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwyatt8740 <wyatt8740@users.noreply.github.com>2023-10-01 23:53:17 -0400
committerwyatt8740 <wyatt8740@users.noreply.github.com>2023-10-02 00:00:01 -0400
commit72d9253ab2e5e0630c824c7130a40b7158323bc9 (patch)
treefc12bd36b3eb63ef6aeae213018d4f89981a08f4
parent68254ebe0411236d178ead073d5c176faae732a1 (diff)
downloadquake-pum-72d9253ab2e5e0630c824c7130a40b7158323bc9.tar.gz
Got X11 QuakeWorld to build (no GLQuakeWorld yet!).
Added support for 24-bit color depth (ripped out of WinQuake, which appears to have a newer version of vid_x.c). Also, added SDL audio code (almost directly translated from WinQuake/netquake code).
-rw-r--r--QW/Makefile964
-rw-r--r--QW/client/cvar.h6
-rw-r--r--QW/client/snd_dma.c12
-rw-r--r--QW/client/snd_sdl.c215
-rw-r--r--QW/client/sound.h7
-rw-r--r--QW/client/vid_x.c136
-rw-r--r--QW/vid_x.c1116
7 files changed, 2434 insertions, 22 deletions
diff --git a/QW/Makefile b/QW/Makefile
new file mode 100644
index 0000000..9b71965
--- /dev/null
+++ b/QW/Makefile
@@ -0,0 +1,964 @@
+#
+# QuakeWorld Makefile for Linux 2.0
+#
+# Apr '98 by Zoid <zoid@idsoftware.com>
+#
+# GNU Make required
+#
+# ELF only
+#
+
+# RPM release number
+RPM_RELEASE=1
+
+
+USE_SDL2=1
+
+ifeq ($(USE_SDL2),1)
+SDL_CONFIG ?= sdl2-config
+else
+SDL_CONFIG ?= sdl-config
+endif
+SDL_CFLAGS := $(shell $(SDL_CONFIG) --cflags) -DUSE_SDL2
+# had to tack all the crap on the end because of wayland basically
+SDL_LIBS := $(shell $(SDL_CONFIG) --libs) -lwayland-client -lxkbcommon -lwayland-cursor -ldrm -lwayland-egl -lgbm -lXxf86vm -lXss -lXrandr -lXcursor -lXinerama -lpulse -lasound -lXi
+
+
+VERSION=2.30$(GLIBC)
+
+ifneq (,$(findstring libc6,$(shell if [ -e /lib/libc.so.6* ];then echo libc6;fi)))
+GLIBC=-glibc
+else
+GLIBC=
+endif
+
+ifneq (,$(findstring alpha,$(shell uname -m)))
+ARCH=axp
+RPMARCH=alpha
+else
+ARCH=i386
+RPMARCH=i386
+endif
+
+# Edit this path, or you will probably run into trouble.
+MAINDIR=/home/wyatt/development/Quake-LinuxUpdate/QW
+
+BUILD_DEBUG_DIR=debug$(ARCH)$(GLIBC)
+BUILD_RELEASE_DIR=release$(ARCH)$(GLIBC)
+CLIENT_DIR=$(MAINDIR)/client
+SERVER_DIR=$(MAINDIR)/server
+
+MESA_DIR=/usr/local/src/Mesa-3.0
+
+CC=gcc
+BASE_CFLAGS=-m32 -no-pie -fcommon -Wall -Dstricmp=strcasecmp -I$(CLIENT_DIR) -I$(SERVER_DIR) -I$(SERVER_DIR)/.. -I$(MAINDIR)/sdl2_i386/usr/include/SDL2 -D_REENTRANT $(SDL_CFLAGS)
+# -I/usr/src/linux-headers-3.16-2-common/arch/x86/include -I/usr/src/linux-headers-3.16-2-common/include/ -I/usr/src/linux-headers-3.16-2-amd64/arch/x86/include/generated/
+DEBUG_CFLAGS=$(BASE_CFLAGS) -g
+ifeq ($(ARCH),axp)
+RELEASE_CFLAGS=$(BASE_CFLAGS) -ffast-math -funroll-loops \
+ -fomit-frame-pointer -fexpensive-optimizations
+else
+RELEASE_CFLAGS=$(BASE_CFLAGS) -march=core2 -mtune=core2 -O3
+#RELEASE_CFLAGS=$(BASE_CFLAGS) -m486 -O6 -ffast-math -funroll-loops \
+# -fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \
+# -malign-jumps=2 -malign-functions=2
+endif
+GLCFLAGS=-DGLQUAKE -I/usr/local/src/Mesa-3.0/include -I/usr/include/glide
+
+LDFLAGS=-lm $(shell $(SDL_CONFIG) --libs) -lwayland-client -lxkbcommon -lwayland-cursor -ldrm -lwayland-egl -lgbm -lXxf86vm -lXss -lXrandr -lXcursor -lXinerama -lpulse -lasound -lXi
+SVGALDFLAGS=-lvga
+XLDFLAGS=-L/usr/X11R6/lib -L/usr/lib/i386-linux-gnu -L$(MAINDIR)/sdl2_i386/usr/ -lX11 -lXext -lSDL2 /usr/lib/i386-linux-gnu/libXxf86dga.so.1.0.0
+GL_SVGA_LDFLAGS=-L/usr/X11/lib -L/usr/local/src/Mesa-3.0/lib -lm -lMesaGL -lglide2x -lX11 -lXext -lvga
+GL_X11_LDFLAGS=-L/usr/X11/lib -L/usr/local/src/Mesa-3.0/lib -lm -lGL -lX11 -lXext
+
+DO_CC=$(CC) $(CFLAGS) -o $@ -c $<
+DO_O_CC=$(CC) -O $(CFLAGS) -o $@ -c $<
+DO_GL_CC=$(CC) $(CFLAGS) $(GLCFLAGS) -o $@ -c $<
+DO_SERVER_CC=$(CC) -DSERVERONLY $(CFLAGS) -o $@ -c $<
+
+DO_AS=$(CC) $(CFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<
+DO_GL_AS=$(CC) $(CFLAGS) $(GLCFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<
+
+#############################################################################
+# SETUP AND BUILD
+#############################################################################
+
+ifeq ($(ARCH),axp)
+TARGETS=$(BUILDDIR)/qwsv
+#$(BUILDDIR)/qwcl.x11
+else
+#TARGETS=$(BUILDDIR)/qwsv $(BUILDDIR)/qwcl $(BUILDDIR)/qwcl.x11 $(BUILDDIR)/glqwcl $(BUILDDIR)/glqwcl.glx
+# No OpenGL
+TARGETS=$(BUILDDIR)/qwcl.x11
+#TARGETS=$(BUILDDIR)/qwsv $(BUILDDIR)/qwcl $(BUILDDIR)/qwcl.x11
+endif
+
+build_debug:
+ @-mkdir $(BUILD_DEBUG_DIR) \
+ $(BUILD_DEBUG_DIR)/client \
+ $(BUILD_DEBUG_DIR)/glclient \
+ $(BUILD_DEBUG_DIR)/server
+ $(MAKE) targets BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"
+
+build_release:
+ @-mkdir $(BUILD_RELEASE_DIR) \
+ $(BUILD_RELEASE_DIR)/client \
+ $(BUILD_RELEASE_DIR)/glclient \
+ $(BUILD_RELEASE_DIR)/server
+ $(MAKE) targets BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(RELEASE_CFLAGS)"
+
+all: build_debug build_release
+
+targets: $(TARGETS)
+
+#############################################################################
+# SERVER
+#############################################################################
+
+QWSV_OBJS = \
+ $(BUILDDIR)/server/pr_cmds.o \
+ $(BUILDDIR)/server/pr_edict.o \
+ $(BUILDDIR)/server/pr_exec.o \
+ $(BUILDDIR)/server/sv_init.o \
+ $(BUILDDIR)/server/sv_main.o \
+ $(BUILDDIR)/server/sv_nchan.o \
+ $(BUILDDIR)/server/sv_ents.o \
+ $(BUILDDIR)/server/sv_send.o \
+ $(BUILDDIR)/server/sv_move.o \
+ $(BUILDDIR)/server/sv_phys.o \
+ $(BUILDDIR)/server/sv_user.o \
+ $(BUILDDIR)/server/sv_ccmds.o \
+ $(BUILDDIR)/server/world.o \
+ $(BUILDDIR)/server/sys_unix.o \
+ $(BUILDDIR)/server/model.o \
+ $(BUILDDIR)/server/cmd.o \
+ $(BUILDDIR)/server/common.o \
+ $(BUILDDIR)/server/crc.o \
+ $(BUILDDIR)/server/cvar.o \
+ $(BUILDDIR)/server/mathlib.o \
+ $(BUILDDIR)/server/md4.o \
+ $(BUILDDIR)/server/zone.o \
+ $(BUILDDIR)/server/pmove.o \
+ $(BUILDDIR)/server/pmovetst.o \
+ $(BUILDDIR)/server/net_chan.o \
+ $(BUILDDIR)/server/net_udp.o
+
+$(BUILDDIR)/qwsv : $(QWSV_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(QWSV_OBJS) $(LDFLAGS)
+
+$(BUILDDIR)/server/pr_cmds.o : $(SERVER_DIR)/pr_cmds.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/pr_edict.o : $(SERVER_DIR)/pr_edict.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/pr_exec.o : $(SERVER_DIR)/pr_exec.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_init.o : $(SERVER_DIR)/sv_init.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_main.o : $(SERVER_DIR)/sv_main.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_nchan.o : $(SERVER_DIR)/sv_nchan.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_ents.o : $(SERVER_DIR)/sv_ents.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_send.o : $(SERVER_DIR)/sv_send.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_move.o : $(SERVER_DIR)/sv_move.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_phys.o : $(SERVER_DIR)/sv_phys.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_user.o : $(SERVER_DIR)/sv_user.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sv_ccmds.o : $(SERVER_DIR)/sv_ccmds.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/world.o : $(SERVER_DIR)/world.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/sys_unix.o : $(SERVER_DIR)/sys_unix.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/model.o : $(SERVER_DIR)/model.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/cmd.o : $(CLIENT_DIR)/cmd.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/common.o : $(CLIENT_DIR)/common.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/crc.o : $(CLIENT_DIR)/crc.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/cvar.o : $(CLIENT_DIR)/cvar.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/mathlib.o : $(CLIENT_DIR)/mathlib.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/md4.o : $(CLIENT_DIR)/md4.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/zone.o : $(CLIENT_DIR)/zone.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/pmove.o : $(CLIENT_DIR)/pmove.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/pmovetst.o : $(CLIENT_DIR)/pmovetst.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/net_chan.o : $(CLIENT_DIR)/net_chan.c
+ $(DO_SERVER_CC)
+
+$(BUILDDIR)/server/net_udp.o : $(CLIENT_DIR)/net_udp.c
+ $(DO_SERVER_CC)
+
+#############################################################################
+# CLIENT
+#############################################################################
+
+QWCL_OBJS = \
+ $(BUILDDIR)/client/cl_demo.o \
+ $(BUILDDIR)/client/cl_ents.o \
+ $(BUILDDIR)/client/cl_input.o \
+ $(BUILDDIR)/client/cl_main.o \
+ $(BUILDDIR)/client/cl_parse.o \
+ $(BUILDDIR)/client/cl_pred.o \
+ $(BUILDDIR)/client/cl_tent.o \
+ $(BUILDDIR)/client/cl_cam.o \
+ $(BUILDDIR)/client/cmd.o \
+ $(BUILDDIR)/client/common.o \
+ $(BUILDDIR)/client/console.o \
+ $(BUILDDIR)/client/crc.o \
+ $(BUILDDIR)/client/cvar.o \
+ $(BUILDDIR)/client/d_edge.o \
+ $(BUILDDIR)/client/d_fill.o \
+ $(BUILDDIR)/client/d_init.o \
+ $(BUILDDIR)/client/d_modech.o \
+ $(BUILDDIR)/client/d_part.o \
+ $(BUILDDIR)/client/d_polyse.o \
+ $(BUILDDIR)/client/d_scan.o \
+ $(BUILDDIR)/client/d_sky.o \
+ $(BUILDDIR)/client/d_sprite.o \
+ $(BUILDDIR)/client/d_surf.o \
+ $(BUILDDIR)/client/d_vars.o \
+ $(BUILDDIR)/client/d_zpoint.o \
+ $(BUILDDIR)/client/draw.o \
+ $(BUILDDIR)/client/keys.o \
+ $(BUILDDIR)/client/mathlib.o \
+ $(BUILDDIR)/client/md4.o \
+ $(BUILDDIR)/client/menu.o \
+ $(BUILDDIR)/client/model.o \
+ $(BUILDDIR)/client/net_chan.o \
+ $(BUILDDIR)/client/net_udp.o \
+ $(BUILDDIR)/client/nonintel.o \
+ $(BUILDDIR)/client/pmove.o \
+ $(BUILDDIR)/client/pmovetst.o \
+ $(BUILDDIR)/client/r_aclip.o \
+ $(BUILDDIR)/client/r_alias.o \
+ $(BUILDDIR)/client/r_bsp.o \
+ $(BUILDDIR)/client/r_draw.o \
+ $(BUILDDIR)/client/r_edge.o \
+ $(BUILDDIR)/client/r_efrag.o \
+ $(BUILDDIR)/client/r_light.o \
+ $(BUILDDIR)/client/r_main.o \
+ $(BUILDDIR)/client/r_misc.o \
+ $(BUILDDIR)/client/r_part.o \
+ $(BUILDDIR)/client/r_sky.o \
+ $(BUILDDIR)/client/r_sprite.o \
+ $(BUILDDIR)/client/r_surf.o \
+ $(BUILDDIR)/client/r_vars.o \
+ $(BUILDDIR)/client/sbar.o \
+ $(BUILDDIR)/client/screen.o \
+ $(BUILDDIR)/client/skin.o \
+ $(BUILDDIR)/client/snd_dma.o \
+ $(BUILDDIR)/client/snd_mem.o \
+ $(BUILDDIR)/client/snd_mix.o \
+ $(BUILDDIR)/client/view.o \
+ $(BUILDDIR)/client/wad.o \
+ $(BUILDDIR)/client/zone.o \
+ $(BUILDDIR)/client/cd_linux.o \
+ $(BUILDDIR)/client/sys_linux.o \
+ $(BUILDDIR)/client/snd_sdl.o \
+
+# $(BUILDDIR)/client/snd_linux.o
+
+ifeq ($(ARCH),i386)
+ QWCL_AS_OBJS = \
+ $(BUILDDIR)/client/d_copy.o \
+ $(BUILDDIR)/client/d_draw.o \
+ $(BUILDDIR)/client/d_draw16.o \
+ $(BUILDDIR)/client/d_parta.o \
+ $(BUILDDIR)/client/d_polysa.o \
+ $(BUILDDIR)/client/d_scana.o \
+ $(BUILDDIR)/client/d_spr8.o \
+ $(BUILDDIR)/client/d_varsa.o \
+ $(BUILDDIR)/client/math.o \
+ $(BUILDDIR)/client/r_aclipa.o \
+ $(BUILDDIR)/client/r_aliasa.o \
+ $(BUILDDIR)/client/r_drawa.o \
+ $(BUILDDIR)/client/r_edgea.o \
+ $(BUILDDIR)/client/r_varsa.o \
+ $(BUILDDIR)/client/snd_mixa.o \
+ $(BUILDDIR)/client/surf16.o \
+ $(BUILDDIR)/client/surf8.o \
+ $(BUILDDIR)/client/sys_dosa.o
+else
+ QWCL_AS_OBJS=
+endif
+
+QWCL_SVGA_OBJS = $(BUILDDIR)/client/vid_svgalib.o
+QWCL_X11_OBJS = $(BUILDDIR)/client/vid_x.o
+
+#$(QWCL_SVGA_OBJS)
+$(BUILDDIR)/qwcl : $(QWCL_OBJS) $(QWCL_AS_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(QWCL_OBJS) $(QWCL_AS_OBJS) \
+ $(LDFLAGS)
+
+$(BUILDDIR)/qwcl.x11 : $(QWCL_OBJS) $(QWCL_AS_OBJS) $(QWCL_X11_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(QWCL_OBJS) $(QWCL_AS_OBJS) $(QWCL_X11_OBJS) \
+ $(LDFLAGS) $(XLDFLAGS)
+
+$(BUILDDIR)/client/cl_demo.o : $(CLIENT_DIR)/cl_demo.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cl_ents.o : $(CLIENT_DIR)/cl_ents.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cl_input.o : $(CLIENT_DIR)/cl_input.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cl_main.o : $(CLIENT_DIR)/cl_main.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cl_parse.o : $(CLIENT_DIR)/cl_parse.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cl_pred.o : $(CLIENT_DIR)/cl_pred.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cl_tent.o : $(CLIENT_DIR)/cl_tent.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cl_cam.o : $(CLIENT_DIR)/cl_cam.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cmd.o : $(CLIENT_DIR)/cmd.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/common.o : $(CLIENT_DIR)/common.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/console.o : $(CLIENT_DIR)/console.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/crc.o : $(CLIENT_DIR)/crc.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cvar.o : $(CLIENT_DIR)/cvar.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_edge.o : $(CLIENT_DIR)/d_edge.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_fill.o : $(CLIENT_DIR)/d_fill.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_init.o : $(CLIENT_DIR)/d_init.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_modech.o : $(CLIENT_DIR)/d_modech.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_part.o : $(CLIENT_DIR)/d_part.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_polyse.o : $(CLIENT_DIR)/d_polyse.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_scan.o : $(CLIENT_DIR)/d_scan.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_sky.o : $(CLIENT_DIR)/d_sky.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_sprite.o : $(CLIENT_DIR)/d_sprite.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_surf.o : $(CLIENT_DIR)/d_surf.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_vars.o : $(CLIENT_DIR)/d_vars.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_zpoint.o : $(CLIENT_DIR)/d_zpoint.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/draw.o : $(CLIENT_DIR)/draw.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/keys.o : $(CLIENT_DIR)/keys.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/mathlib.o : $(CLIENT_DIR)/mathlib.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/md4.o : $(CLIENT_DIR)/md4.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/menu.o : $(CLIENT_DIR)/menu.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/model.o : $(CLIENT_DIR)/model.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/net_chan.o : $(CLIENT_DIR)/net_chan.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/net_udp.o : $(CLIENT_DIR)/net_udp.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/nonintel.o : $(CLIENT_DIR)/nonintel.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/pmove.o : $(CLIENT_DIR)/pmove.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/pmovetst.o : $(CLIENT_DIR)/pmovetst.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_aclip.o : $(CLIENT_DIR)/r_aclip.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_alias.o : $(CLIENT_DIR)/r_alias.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_bsp.o : $(CLIENT_DIR)/r_bsp.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_draw.o : $(CLIENT_DIR)/r_draw.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_edge.o : $(CLIENT_DIR)/r_edge.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_efrag.o : $(CLIENT_DIR)/r_efrag.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_light.o : $(CLIENT_DIR)/r_light.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_main.o : $(CLIENT_DIR)/r_main.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_misc.o : $(CLIENT_DIR)/r_misc.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_part.o : $(CLIENT_DIR)/r_part.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_sky.o : $(CLIENT_DIR)/r_sky.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_sprite.o : $(CLIENT_DIR)/r_sprite.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_surf.o : $(CLIENT_DIR)/r_surf.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/r_vars.o : $(CLIENT_DIR)/r_vars.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/sbar.o : $(CLIENT_DIR)/sbar.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/screen.o : $(CLIENT_DIR)/screen.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/skin.o : $(CLIENT_DIR)/skin.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/snd_dma.o : $(CLIENT_DIR)/snd_dma.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/snd_mem.o : $(CLIENT_DIR)/snd_mem.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/snd_mix.o : $(CLIENT_DIR)/snd_mix.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/view.o : $(CLIENT_DIR)/view.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/wad.o : $(CLIENT_DIR)/wad.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/zone.o : $(CLIENT_DIR)/zone.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/cd_linux.o : $(CLIENT_DIR)/cd_linux.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/sys_linux.o : $(CLIENT_DIR)/sys_linux.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/snd_linux.o : $(CLIENT_DIR)/snd_linux.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/snd_sdl.o : $(CLIENT_DIR)/snd_sdl.c
+ $(DO_CC)
+
+$(BUILDDIR)/client/d_copy.o : $(CLIENT_DIR)/d_copy.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/d_draw.o : $(CLIENT_DIR)/d_draw.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/d_draw16.o : $(CLIENT_DIR)/d_draw16.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/d_parta.o : $(CLIENT_DIR)/d_parta.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/d_polysa.o : $(CLIENT_DIR)/d_polysa.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/d_scana.o : $(CLIENT_DIR)/d_scana.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/d_spr8.o : $(CLIENT_DIR)/d_spr8.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/d_varsa.o : $(CLIENT_DIR)/d_varsa.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/math.o : $(CLIENT_DIR)/math.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/r_aclipa.o : $(CLIENT_DIR)/r_aclipa.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/r_aliasa.o : $(CLIENT_DIR)/r_aliasa.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/r_drawa.o : $(CLIENT_DIR)/r_drawa.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/r_edgea.o : $(CLIENT_DIR)/r_edgea.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/r_varsa.o : $(CLIENT_DIR)/r_varsa.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/snd_mixa.o : $(CLIENT_DIR)/snd_mixa.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/surf16.o : $(CLIENT_DIR)/surf16.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/surf8.o : $(CLIENT_DIR)/surf8.s
+ $(DO_AS)
+
+$(BUILDDIR)/client/sys_dosa.o : $(CLIENT_DIR)/sys_dosa.s
+ $(DO_AS)
+
+# $(BUILDDIR)/client/vid_svgalib.o : $(CLIENT_DIR)/vid_svgalib.c
+# $(DO_O_CC)
+
+$(BUILDDIR)/client/vid_x.o : $(CLIENT_DIR)/vid_x.c
+ $(DO_CC)
+
+#############################################################################
+# GL CLIENT
+#############################################################################
+
+GLQWCL_OBJS = \
+ $(BUILDDIR)/glclient/cl_demo.o \
+ $(BUILDDIR)/glclient/cl_ents.o \
+ $(BUILDDIR)/glclient/cl_input.o \
+ $(BUILDDIR)/glclient/cl_main.o \
+ $(BUILDDIR)/glclient/cl_parse.o \
+ $(BUILDDIR)/glclient/cl_pred.o \
+ $(BUILDDIR)/glclient/cl_tent.o \
+ $(BUILDDIR)/glclient/cl_cam.o \
+ $(BUILDDIR)/glclient/cmd.o \
+ $(BUILDDIR)/glclient/common.o \
+ $(BUILDDIR)/glclient/console.o \
+ $(BUILDDIR)/glclient/crc.o \
+ $(BUILDDIR)/glclient/cvar.o \
+ $(BUILDDIR)/glclient/keys.o \
+ $(BUILDDIR)/glclient/mathlib.o \
+ $(BUILDDIR)/glclient/md4.o \
+ $(BUILDDIR)/glclient/menu.o \
+ $(BUILDDIR)/glclient/net_chan.o \
+ $(BUILDDIR)/glclient/net_udp.o \
+ $(BUILDDIR)/glclient/nonintel.o \
+ $(BUILDDIR)/glclient/pmove.o \
+ $(BUILDDIR)/glclient/pmovetst.o \
+ $(BUILDDIR)/glclient/r_part.o \
+ $(BUILDDIR)/glclient/sbar.o \
+ $(BUILDDIR)/glclient/skin.o \
+ $(BUILDDIR)/glclient/snd_dma.o \
+ $(BUILDDIR)/glclient/snd_mem.o \
+ $(BUILDDIR)/glclient/snd_mix.o \
+ $(BUILDDIR)/glclient/view.o \
+ $(BUILDDIR)/glclient/wad.o \
+ $(BUILDDIR)/glclient/zone.o \
+ $(BUILDDIR)/glclient/cd_linux.o \
+ $(BUILDDIR)/glclient/sys_linux.o \
+ $(BUILDDIR)/glclient/snd_sdl.o \
+ \
+ $(BUILDDIR)/glclient/gl_draw.o \
+ $(BUILDDIR)/glclient/gl_mesh.o \
+ $(BUILDDIR)/glclient/gl_model.o \
+ $(BUILDDIR)/glclient/gl_ngraph.o \
+ $(BUILDDIR)/glclient/gl_refrag.o \
+ $(BUILDDIR)/glclient/gl_rlight.o \
+ $(BUILDDIR)/glclient/gl_rmain.o \
+ $(BUILDDIR)/glclient/gl_rmisc.o \
+ $(BUILDDIR)/glclient/gl_rsurf.o \
+ $(BUILDDIR)/glclient/gl_screen.o \
+ $(BUILDDIR)/glclient/gl_warp.o \
+ \
+ $(BUILDDIR)/glclient/math.o \
+ $(BUILDDIR)/glclient/snd_mixa.o \
+ $(BUILDDIR)/glclient/sys_dosa.o
+
+
+# $(BUILDDIR)/glclient/snd_linux.o
+
+GLQWCL_SVGA_OBJS = $(BUILDDIR)/glclient/gl_vidlinux.o
+GLQWCL_X11_OBJS = $(BUILDDIR)/glclient/gl_vidlinuxglx.o
+
+# $(GLQWCL_SVGA_OBJS)
+#$(GL_SVGA_LDFLAGS)
+#$(GL_SVGA_LDFLAGS)
+$(BUILDDIR)/glqwcl : $(GLQWCL_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(GLQWCL_OBJS) $(LDFLAGS)
+
+$(BUILDDIR)/glqwcl.glx : $(GLQWCL_OBJS) $(GLQWCL_X11_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(GLQWCL_OBJS) $(GLQWCL_X11_OBJS) $(LDFLAGS) $(GL_X11_LDFLAGS)
+
+$(BUILDDIR)/glclient/cl_demo.o : $(CLIENT_DIR)/cl_demo.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cl_ents.o : $(CLIENT_DIR)/cl_ents.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cl_input.o : $(CLIENT_DIR)/cl_input.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cl_main.o : $(CLIENT_DIR)/cl_main.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cl_parse.o : $(CLIENT_DIR)/cl_parse.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cl_pred.o : $(CLIENT_DIR)/cl_pred.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cl_tent.o : $(CLIENT_DIR)/cl_tent.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cl_cam.o : $(CLIENT_DIR)/cl_cam.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cmd.o : $(CLIENT_DIR)/cmd.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/common.o : $(CLIENT_DIR)/common.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/console.o : $(CLIENT_DIR)/console.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/crc.o : $(CLIENT_DIR)/crc.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cvar.o : $(CLIENT_DIR)/cvar.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/keys.o : $(CLIENT_DIR)/keys.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/mathlib.o : $(CLIENT_DIR)/mathlib.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/md4.o : $(CLIENT_DIR)/md4.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/menu.o : $(CLIENT_DIR)/menu.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/net_chan.o : $(CLIENT_DIR)/net_chan.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/net_udp.o : $(CLIENT_DIR)/net_udp.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/nonintel.o : $(CLIENT_DIR)/nonintel.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/pmove.o : $(CLIENT_DIR)/pmove.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/pmovetst.o : $(CLIENT_DIR)/pmovetst.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/r_part.o : $(CLIENT_DIR)/r_part.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/sbar.o : $(CLIENT_DIR)/sbar.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/screen.o : $(CLIENT_DIR)/screen.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/skin.o : $(CLIENT_DIR)/skin.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/snd_dma.o : $(CLIENT_DIR)/snd_dma.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/snd_mem.o : $(CLIENT_DIR)/snd_mem.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/snd_mix.o : $(CLIENT_DIR)/snd_mix.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/view.o : $(CLIENT_DIR)/view.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/wad.o : $(CLIENT_DIR)/wad.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/zone.o : $(CLIENT_DIR)/zone.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/cd_linux.o : $(CLIENT_DIR)/cd_linux.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/sys_linux.o : $(CLIENT_DIR)/sys_linux.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/snd_linux.o : $(CLIENT_DIR)/snd_linux.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/snd_sdl.o : $(CLIENT_DIR)/snd_sdl.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_draw.o : $(CLIENT_DIR)/gl_draw.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_mesh.o : $(CLIENT_DIR)/gl_mesh.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_model.o : $(CLIENT_DIR)/gl_model.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_ngraph.o : $(CLIENT_DIR)/gl_ngraph.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_refrag.o : $(CLIENT_DIR)/gl_refrag.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_rlight.o : $(CLIENT_DIR)/gl_rlight.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_rmain.o : $(CLIENT_DIR)/gl_rmain.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_rmisc.o : $(CLIENT_DIR)/gl_rmisc.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_rsurf.o : $(CLIENT_DIR)/gl_rsurf.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_screen.o : $(CLIENT_DIR)/gl_screen.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_vidlinux.o : $(CLIENT_DIR)/gl_vidlinux.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_vidlinuxglx.o : $(CLIENT_DIR)/gl_vidlinuxglx.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/gl_warp.o : $(CLIENT_DIR)/gl_warp.c
+ $(DO_GL_CC)
+
+$(BUILDDIR)/glclient/math.o : $(CLIENT_DIR)/math.s
+ $(DO_GL_AS)
+
+$(BUILDDIR)/glclient/snd_mixa.o : $(CLIENT_DIR)/snd_mixa.s
+ $(DO_GL_AS)
+
+$(BUILDDIR)/glclient/sys_dosa.o : $(CLIENT_DIR)/sys_dosa.s
+ $(DO_GL_AS)
+
+#############################################################################
+# RPM
+#############################################################################
+
+# Make RPMs. You need to be root to make this work
+RPMROOT=/usr/src/redhat
+RPM = rpm
+RPMFLAGS = -bb
+INSTALLDIR = /usr/local/games/quake
+
+ifeq ($(ARCH),axp)
+rpm: rpm-qwsv
+tar: tar-qwsv
+else
+rpm: rpm-qwcl rpm-qwsv
+tar: tar-qwcl tar-qwsv
+endif
+
+QWCL_RPMDIR=/var/tmp/qwcl-$(VERSION)
+TDFXGL_DIR=/home/zoid/3dfxgl
+
+QWPROGS = \
+ $(MAINDIR)/progs/buttons.qc \
+ $(MAINDIR)/progs/client.qc \
+ $(MAINDIR)/progs/combat.qc \
+ $(MAINDIR)/progs/defs.qc \
+ $(MAINDIR)/progs/doors.qc \
+ $(MAINDIR)/progs/items.qc \
+ $(MAINDIR)/progs/misc.qc \
+ $(MAINDIR)/progs/models.qc \
+ $(MAINDIR)/progs/plats.qc \
+ $(MAINDIR)/progs/player.qc \
+ $(MAINDIR)/progs/progdefs.h \
+ $(MAINDIR)/progs/progs.src \
+ $(MAINDIR)/progs/qwprogs.dat \
+ $(MAINDIR)/progs/server.qc \
+ $(MAINDIR)/progs/spectate.qc \
+ $(MAINDIR)/progs/sprites.qc \
+ $(MAINDIR)/progs/subs.qc \
+ $(MAINDIR)/progs/triggers.qc \
+ $(MAINDIR)/progs/weapons.qc \
+ $(MAINDIR)/progs/world.qc
+
+rpm-qwcl: qwcl.spec \
+ $(BUILD_RELEASE_DIR)/qwcl \
+ $(BUILD_RELEASE_DIR)/glqwcl \
+ $(BUILD_RELEASE_DIR)/glqwcl.glx \
+ $(BUILD_RELEASE_DIR)/qwcl.x11
+ touch $(RPMROOT)/SOURCES/qwcl-$(VERSION).tar.gz
+ if [ ! -d archives ];then mkdir archives;fi
+ $(MAKE) copyfiles-qwcl DESTDIR=$(QWCL_RPMDIR)/$(INSTALLDIR)
+ cp qwcl.spec $(RPMROOT)/SPECS/qwcl.spec
+ cp $(MAINDIR)/quake.gif $(RPMROOT)/SOURCES/quake.gif
+ cd $(RPMROOT)/SPECS; $(RPM) $(RPMFLAGS) qwcl.spec
+ cp $(RPMROOT)/RPMS/$(RPMARCH)/qwcl-$(VERSION)-$(RPM_RELEASE).$(RPMARCH).rpm archives/.
+ rm -rf $(QWCL_RPMDIR)
+
+tar-qwcl: $(BUILD_RELEASE_DIR)/qwcl \
+ $(BUILD_RELEASE_DIR)/glqwcl \
+ $(BUILD_RELEASE_DIR)/glqwcl.glx \
+ $(BUILD_RELEASE_DIR)/qwcl.x11
+ if [ ! -d archives ];then mkdir archives;fi
+ $(MAKE) copyfiles-qwcl DESTDIR=$(QWCL_RPMDIR)/$(INSTALLDIR)
+ cd $(QWCL_RPMDIR)/$(INSTALLDIR); tar czvf qwcl-$(VERSION)-$(RPMARCH)-unknown-linux2.0.tar.gz *
+ mv $(QWCL_RPMDIR)/$(INSTALLDIR)/*.tar.gz archives/.
+ rm -rf $(QWCL_RPMDIR)
+
+copyfiles-qwcl:
+ -mkdirhier $(DESTDIR)
+ -mkdirhier $(DESTDIR)/qw
+ -mkdirhier $(DESTDIR)/qw/skins
+ cp $(BUILD_RELEASE_DIR)/qwcl $(DESTDIR)/.
+ strip $(DESTDIR)/qwcl
+ chmod 4755 $(DESTDIR)/qwcl
+ cp $(BUILD_RELEASE_DIR)/qwcl.x11 $(DESTDIR)/.
+ strip $(DESTDIR)/qwcl.x11
+ chmod 755 $(DESTDIR)/qwcl.x11
+ cp $(BUILD_RELEASE_DIR)/glqwcl $(DESTDIR)/.
+ strip $(DESTDIR)/glqwcl
+ chmod 4755 $(DESTDIR)/glqwcl
+ cp $(BUILD_RELEASE_DIR)/glqwcl.glx $(DESTDIR)/.
+ strip $(DESTDIR)/glqwcl.glx
+ chmod 4755 $(DESTDIR)/glqwcl.glx
+ cp $(TDFXGL_DIR)/release$(ARCH)/lib3dfxgl.so $(DESTDIR)/.
+ chmod 755 $(DESTDIR)/lib3dfxgl.so
+ cp $(MAINDIR)/glqwcl.3dfxgl $(DESTDIR)/.
+ chmod 755 $(DESTDIR)/glqwcl.3dfxgl
+ cp $(MAINDIR)/docs/README.qwcl $(DESTDIR)/.
+ chmod 644 $(DESTDIR)/README.qwcl
+ cp $(MAINDIR)/fixskins.sh $(DESTDIR)/qw/skins/.
+ chmod 755 $(DESTDIR)/qw/skins/fixskins.sh
+ cp $(MESA_DIR)/lib/libMesaGL.so.2.6 $(DESTDIR)
+ chmod 755 $(DESTDIR)/libMesaGL.so.2.6
+ cd $(DESTDIR); ln -sf libMesaGL.so.2.6 libMesaGL.so.2
+ cd $(DESTDIR); ln -sf libMesaGL.so.2 libMesaGL.so
+ cd $(DESTDIR); ln -sf libMesaGL.so libGL.so
+
+qwcl.spec : $(MAINDIR)/qwcl.spec.sh $(BUILD_RELEASE_DIR)/qwcl
+ sh $< $(VERSION) $(RPM_RELEASE) $(INSTALLDIR) > $@
+
+QWSV_RPMDIR=/var/tmp/qwsv-$(VERSION)
+rpm-qwsv: qwsv.spec $(BUILD_RELEASE_DIR)/qwsv $(QWPROGS)
+ touch $(RPMROOT)/SOURCES/qwsv-$(VERSION).tar.gz
+ if [ ! -d archives ];then mkdir archives;fi
+ $(MAKE) copyfiles-qwsv DESTDIR=$(QWSV_RPMDIR)/$(INSTALLDIR)
+ cp qwsv.spec $(RPMROOT)/SPECS/qwsv.spec
+ cp $(MAINDIR)/quake.gif $(RPMROOT)/SOURCES/quake.gif
+ cd $(RPMROOT)/SPECS; $(RPM) $(RPMFLAGS) qwsv.spec
+ cp $(RPMROOT)/RPMS/$(RPMARCH)/qwsv-$(VERSION)-$(RPM_RELEASE).$(RPMARCH).rpm archives/.
+ rm -rf $(QWSV_RPMDIR)
+
+tar-qwsv: $(BUILD_RELEASE_DIR)/qwsv $(QWPROGS)
+ if [ ! -d archives ];then mkdir archives;fi
+ $(MAKE) copyfiles-qwsv DESTDIR=$(QWSV_RPMDIR)/$(INSTALLDIR)
+ cd $(QWSV_RPMDIR)/$(INSTALLDIR); tar czvf qwsv-$(VERSION)-$(RPMARCH)-unknown-linux2.0.tar.gz *
+ mv $(QWSV_RPMDIR)/$(INSTALLDIR)/*.tar.gz archives/.
+ rm -rf $(QWSV_RPMDIR)
+
+copyfiles-qwsv:
+ -mkdirhier $(DESTDIR)
+ -mkdirhier $(DESTDIR)/qw
+ -mkdirhier $(DESTDIR)/qw/skins
+ cp $(BUILD_RELEASE_DIR)/qwsv $(DESTDIR)/.
+ strip $(DESTDIR)/qwsv
+ chmod 755 $(DESTDIR)/qwsv
+ cp $(MAINDIR)/docs/README.qwsv $(DESTDIR)/.
+ chmod 644 $(DESTDIR)/README.qwsv
+ cp $(QWPROGS) $(DESTDIR)/qw/.
+ cd $(DESTDIR)/qw; chmod 644 *
+ chmod 755 $(DESTDIR)/qw/skins
+ cp $(MAINDIR)/fixskins.sh $(DESTDIR)/qw/skins/.
+ chmod 755 $(DESTDIR)/qw/skins/fixskins.sh
+
+qwsv.spec : $(MAINDIR)/qwsv.spec.sh $(BUILD_RELEASE_DIR)/qwsv
+ sh $< $(VERSION) $(RPM_RELEASE) $(INSTALLDIR) > $@
+
+#############################################################################
+# MISC
+#############################################################################
+
+clean: clean-debug clean-release
+
+clean-debug:
+ $(MAKE) clean2 BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"
+
+clean-release:
+ $(MAKE) clean2 BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(DEBUG_CFLAGS)"
+
+clean2:
+ -rm -f $(QWSV_OBJS) \
+ $(QWCL_OBJS) \
+ $(QWCL_AS_OBJS) \
+ $(QWCL_SVGA_OBJS) \
+ $(QWCL_X11_OBJS) \
+ $(GLQWCL_OBJS) \
+
diff --git a/QW/client/cvar.h b/QW/client/cvar.h
index bc72791..58b4e41 100644
--- a/QW/client/cvar.h
+++ b/QW/client/cvar.h
@@ -53,6 +53,12 @@ Cvars are restricted from having the same names as commands to keep this
interface from being ambiguous.
*/
+/* for sdl */
+#if defined(USE_SDL2)
+#define CVAR_NONE 0
+#endif
+/* sdl end */
+
typedef struct cvar_s
{
char *name;
diff --git a/QW/client/snd_dma.c b/QW/client/snd_dma.c
index 4168315..8554836 100644
--- a/QW/client/snd_dma.c
+++ b/QW/client/snd_dma.c
@@ -77,6 +77,11 @@ cvar_t volume = {"volume", "0.7", true};
cvar_t nosound = {"nosound", "0"};
cvar_t precache = {"precache", "1"};
cvar_t loadas8bit = {"loadas8bit", "0"};
+/* for sdl */
+#if defined(USE_SDL2)
+cvar_t sndspeed = {"sndspeed", "11025", CVAR_NONE};
+cvar_t snd_mixspeed = {"snd_mixspeed", "44100", CVAR_NONE};
+#endif
cvar_t bgmbuffer = {"bgmbuffer", "4096"};
cvar_t ambient_level = {"ambient_level", "0.3"};
cvar_t ambient_fade = {"ambient_fade", "100"};
@@ -146,8 +151,13 @@ void S_Startup (void)
if (!fakedma)
{
+#if defined(USE_SDL2)
+ /* Since I borrowed a lot of the SDL2 code from Quakespasm, I
+ found this to be the easiest way to retrofit it: */
+ rc = SNDDMA_Init(&sn);
+#else
rc = SNDDMA_Init();
-
+#endif
if (!rc)
{
#ifndef _WIN32
diff --git a/QW/client/snd_sdl.c b/QW/client/snd_sdl.c
new file mode 100644
index 0000000..a65758c
--- /dev/null
+++ b/QW/client/snd_sdl.c
@@ -0,0 +1,215 @@
+/*
+ * snd_sdl.c - SDL audio driver for Hexen II: Hammer of Thyrion (uHexen2)
+ * based on implementations found in the quakeforge and ioquake3 projects.
+ *
+ * Copyright (C) 1999-2005 Id Software, Inc.
+ * Copyright (C) 2005-2012 O.Sezer <sezero@users.sourceforge.net>
+ * Copyright (C) 2010-2014 QuakeSpasm developers
+ *
+ * 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 lat er 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.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "quakedef.h"
+
+#if defined(SDL_FRAMEWORK) || defined(NO_SDL_CONFIG)
+#if defined(USE_SDL2)
+#include <SDL2/SDL.h>
+#else
+#include <SDL/SDL.h>
+#endif
+#else
+#include "SDL.h"
+#endif
+
+static int buffersize;
+
+
+static void SDLCALL paint_audio (void *unused, Uint8 *stream, int len)
+{
+ int pos, tobufend;
+ int len1, len2;
+
+ if (!shm)
+ { /* shouldn't happen, but just in case */
+ memset(stream, 0, len);
+ return;
+ }
+
+ pos = (shm->samplepos * (shm->samplebits / 8));
+ if (pos >= buffersize)
+ shm->samplepos = pos = 0;
+
+ tobufend = buffersize - pos; /* bytes to buffer's end. */
+ len1 = len;
+ len2 = 0;
+
+ if (len1 > tobufend)
+ {
+ len1 = tobufend;
+ len2 = len - len1;
+ }
+
+ memcpy(stream, shm->buffer + pos, len1);
+
+ if (len2 <= 0)
+ {
+ shm->samplepos += (len1 / (shm->samplebits / 8));
+ }
+ else
+ { /* wraparound? */
+ memcpy(stream + len1, shm->buffer, len2);
+ shm->samplepos = (len2 / (shm->samplebits / 8));
+ }
+
+ if (shm->samplepos >= buffersize)
+ shm->samplepos = 0;
+}
+
+qboolean SNDDMA_Init (dma_t *dma)
+{
+ SDL_AudioSpec desired;
+ int tmp, val;
+ char drivername[128];
+
+ if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
+ {
+ Con_Printf("Couldn't init SDL audio: %s\n", SDL_GetError());
+ return false;
+ }
+
+ /* Set up the desired format */
+/* desired.freq = snd_mixspeed.value;*/
+ desired.freq = 44100;
+ desired.format = (loadas8bit.value) ? AUDIO_U8 : AUDIO_S16SYS;
+ desired.channels = 2; /* = desired_channels; */
+ if (desired.freq <= 11025)
+ desired.samples = 256;
+ else if (desired.freq <= 22050)
+ desired.samples = 512;
+ else if (desired.freq <= 44100)
+ desired.samples = 1024;
+ else if (desired.freq <= 56000)
+ desired.samples = 2048; /* for 48 kHz */
+ else
+ desired.samples = 4096; /* for 96 kHz */
+ desired.callback = paint_audio;
+ desired.userdata = NULL;
+
+ /* Open the audio device */
+ if (SDL_OpenAudio(&desired, NULL) == -1)
+ {
+ Con_Printf("Couldn't open SDL audio: %s\n", SDL_GetError());
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
+ return false;
+ }
+ /* i think i'm just zeroing dma mem here */
+ memset ((void *) dma, 0, sizeof(dma_t));
+ /*shm = dma;*/
+ shm = &sn;
+
+ /* Fill the audio DMA information block */
+ /* Since we passed NULL as the 'obtained' spec to SDL_OpenAudio(),
+ * SDL will convert to hardware format for us if needed, hence we
+ * directly use the desired values here. */
+ shm->samplebits = (desired.format & 0xFF); /* first byte of format is bits */
+/* shm->signed8 = (desired.format == AUDIO_S8);*/
+ shm->speed = desired.freq;
+ shm->channels = desired.channels;
+ tmp = (desired.samples * desired.channels) * 10;
+ if (tmp & (tmp - 1))
+ { /* make it a power of two */
+ val = 1;
+ while (val < tmp)
+ val <<= 1;
+
+ tmp = val;
+ }
+ shm->samples = tmp;
+ shm->samplepos = 0;
+ shm->submission_chunk = 1;
+
+ Con_Printf ("SDL audio spec : %d Hz, %d samples, %d channels\n",
+ desired.freq, desired.samples, desired.channels);
+#if defined(USE_SDL2)
+ {
+ const char *driver = SDL_GetCurrentAudioDriver();
+ const char *device = SDL_GetAudioDeviceName(0, SDL_FALSE);
+ snprintf(drivername, sizeof(drivername), "%s - %s",
+ driver != NULL ? driver : "(UNKNOWN)",
+ device != NULL ? device : "(UNKNOWN)");
+ }
+#else
+ if (SDL_AudioDriverName(drivername, sizeof(drivername)) == NULL)
+ strcpy(drivername, "(UNKNOWN)");
+#endif
+ buffersize = shm->samples * (shm->samplebits / 8);
+ Con_Printf ("SDL audio driver: %s, %d bytes buffer\n", drivername, buffersize);
+
+ shm->buffer = (unsigned char *) calloc (1, buffersize);
+// if (!shm->buffer)
+ if (!shm->buffer || shm->buffer == (unsigned char *)-1)
+ {
+ SDL_CloseAudio();
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
+ shm = NULL;
+ Con_Printf ("Failed allocating memory for SDL audio\n");
+ return false;
+ }
+
+ SDL_PauseAudio(0);
+
+ return true;
+}
+
+int SNDDMA_GetDMAPos (void)
+{
+ return shm->samplepos;
+}
+
+void SNDDMA_Shutdown (void)
+{
+ if (shm)
+ {
+ Con_Printf ("Shutting down SDL sound\n");
+ SDL_CloseAudio();
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
+ if (shm->buffer)
+ free (shm->buffer);
+ shm->buffer = NULL;
+ shm = NULL;
+ }
+}
+
+void SNDDMA_LockBuffer (void)
+{
+ SDL_LockAudio ();
+}
+
+void SNDDMA_Submit (void)
+{
+ SDL_UnlockAudio();
+}
+
+void SNDDMA_BlockSound (void)
+{
+ SDL_PauseAudio(1);
+}
+
+void SNDDMA_UnblockSound (void)
+{
+ SDL_PauseAudio(0);
+}
+
diff --git a/QW/client/sound.h b/QW/client/sound.h
index 941e620..c1e90fa 100644
--- a/QW/client/sound.h
+++ b/QW/client/sound.h
@@ -111,9 +111,14 @@ channel_t *SND_PickChannel(int entnum, int entchannel);
// spatializes a channel
void SND_Spatialize(channel_t *ch);
+#if defined(USE_SDL2)
+/* Probably the easiest way to retrofit quakespasm's SDL2 audio code into
+ Id Quake. */
+qboolean SNDDMA_Init(dma_t *dma);
+#else
// initializes cycling through a DMA buffer and returns information on it
qboolean SNDDMA_Init(void);
-
+#endif
// gets the current DMA position
int SNDDMA_GetDMAPos(void);
diff --git a/QW/client/vid_x.c b/QW/client/vid_x.c
index 891fb3b..c96545c 100644
--- a/QW/client/vid_x.c
+++ b/QW/client/vid_x.c
@@ -21,7 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define _BSD
-typedef unsigned short PIXEL;
#include <ctype.h>
#include <sys/time.h>
@@ -50,7 +49,6 @@ float old_windowed_mouse;
int VGA_width, VGA_height, VGA_rowbytes, VGA_bufferrowbytes, VGA_planar;
byte *VGA_pagebase;
-
qboolean mouse_avail;
int mouse_buttons=3;
int mouse_oldbuttonstate;
@@ -112,7 +110,10 @@ void (*vid_menudrawfn)(void);
void (*vid_menukeyfn)(int key);
void VID_MenuKey (int key);
-static PIXEL st2d_8to16table[256];
+typedef unsigned short PIXEL16;
+typedef unsigned long PIXEL24;
+static PIXEL16 st2d_8to16table[256];
+static PIXEL24 st2d_8to24table[256];
static int shiftmask_fl=0;
static long r_shift,g_shift,b_shift;
static unsigned long r_mask,g_mask,b_mask;
@@ -129,9 +130,36 @@ void shiftmask_init()
shiftmask_fl=1;
}
-PIXEL xlib_rgb(int r,int g,int b)
+PIXEL16 xlib_rgb16(int r,int g,int b)
+{
+ PIXEL16 p;
+ if(shiftmask_fl==0) shiftmask_init();
+ p=0;
+
+ if(r_shift>0) {
+ p=(r<<(r_shift))&r_mask;
+ } else if(r_shift<0) {
+ p=(r>>(-r_shift))&r_mask;
+ } else p|=(r&r_mask);
+
+ if(g_shift>0) {
+ p|=(g<<(g_shift))&g_mask;
+ } else if(g_shift<0) {
+ p|=(g>>(-g_shift))&g_mask;
+ } else p|=(g&g_mask);
+
+ if(b_shift>0) {
+ p|=(b<<(b_shift))&b_mask;
+ } else if(b_shift<0) {
+ p|=(b>>(-b_shift))&b_mask;
+ } else p|=(b&b_mask);
+
+ return p;
+}
+
+PIXEL24 xlib_rgb24(int r,int g,int b)
{
- PIXEL p;
+ PIXEL24 p;
if(shiftmask_fl==0) shiftmask_init();
p=0;
@@ -160,16 +188,71 @@ void st2_fixup( XImage *framebuf, int x, int y, int width, int height)
{
int xi,yi;
unsigned char *src;
- PIXEL *dest;
+ PIXEL16 *dest;
+ register int count, n;
if( (x<0)||(y<0) )return;
for (yi = y; yi < (y+height); yi++) {
src = &framebuf->data [yi * framebuf->bytes_per_line];
- dest = (PIXEL*)src;
- for(xi = (x+width-1); xi >= x; xi--) {
- dest[xi] = st2d_8to16table[src[xi]];
+
+ // Duff's Device
+ count = width;
+ n = (count + 7) / 8;
+ dest = ((PIXEL16 *)src) + x+width - 1;
+ src += x+width - 1;
+
+ switch (count % 8) {
+ case 0: do { *dest-- = st2d_8to16table[*src--];
+ case 7: *dest-- = st2d_8to16table[*src--];
+ case 6: *dest-- = st2d_8to16table[*src--];
+ case 5: *dest-- = st2d_8to16table[*src--];
+ case 4: *dest-- = st2d_8to16table[*src--];
+ case 3: *dest-- = st2d_8to16table[*src--];
+ case 2: *dest-- = st2d_8to16table[*src--];
+ case 1: *dest-- = st2d_8to16table[*src--];
+ } while (--n > 0);
}
+
+// for(xi = (x+width-1); xi >= x; xi--) {
+// dest[xi] = st2d_8to16table[src[xi]];
+// }
+ }
+}
+
+void st3_fixup( XImage *framebuf, int x, int y, int width, int height)
+{
+ int xi,yi;
+ unsigned char *src;
+ PIXEL24 *dest;
+ register int count, n;
+
+ if( (x<0)||(y<0) )return;
+
+ for (yi = y; yi < (y+height); yi++) {
+ src = &framebuf->data [yi * framebuf->bytes_per_line];
+
+ // Duff's Device
+ count = width;
+ n = (count + 7) / 8;
+ dest = ((PIXEL24 *)src) + x+width - 1;
+ src += x+width - 1;
+
+ switch (count % 8) {
+ case 0: do { *dest-- = st2d_8to24table[*src--];
+ case 7: *dest-- = st2d_8to24table[*src--];
+ case 6: *dest-- = st2d_8to24table[*src--];
+ case 5: *dest-- = st2d_8to24table[*src--];
+ case 4: *dest-- = st2d_8to24table[*src--];
+ case 3: *dest-- = st2d_8to24table[*src--];
+ case 2: *dest-- = st2d_8to24table[*src--];
+ case 1: *dest-- = st2d_8to24table[*src--];
+ } while (--n > 0);
+ }
+
+// for(xi = (x+width-1); xi >= x; xi--) {
+// dest[xi] = st2d_8to16table[src[xi]];
+// }
}
}
@@ -367,8 +450,6 @@ void VID_Init (unsigned char *palette)
XVisualInfo template;
int num_visuals;
int template_mask;
-
- S_Init();
ignorenext=0;
vid.width = 320;
@@ -517,20 +598,17 @@ void VID_Init (unsigned char *palette)
if (x_visinfo->class != TrueColor)
XFreeColormap(x_disp, tmpcmap);
-
}
if (x_visinfo->depth == 8)
{
-
- // create and upload the palette
+ // create and upload the palette
if (x_visinfo->class == PseudoColor)
{
x_cmap = XCreateColormap(x_disp, x_win, x_vis, AllocAll);
VID_SetPalette(palette);
XSetWindowColormap(x_disp, x_win, x_cmap);
}
-
}
// inviso cursor
@@ -610,9 +688,10 @@ void VID_SetPalette(unsigned char *palette)
int i;
XColor colors[256];
- for(i=0;i<256;i++)
- st2d_8to16table[i]= xlib_rgb(palette[i*3],
- palette[i*3+1],palette[i*3+2]);
+ for(i=0;i<256;i++) {
+ st2d_8to16table[i]= xlib_rgb16(palette[i*3], palette[i*3+1],palette[i*3+2]);
+ st2d_8to24table[i]= xlib_rgb24(palette[i*3], palette[i*3+1],palette[i*3+2]);
+ }
if (x_visinfo->class == PseudoColor && x_visinfo->depth == 8)
{
@@ -881,6 +960,7 @@ void GetEvent(void)
void VID_Update (vrect_t *rects)
{
+ vrect_t full;
// if the window changes dimension, skip this frame
@@ -906,15 +986,27 @@ void VID_Update (vrect_t *rects)
return;
}
+ // force full update if not 8bit
+ if (x_visinfo->depth != 8) {
+ extern int scr_fullupdate;
+
+ scr_fullupdate = 0;
+ }
+
+
if (doShm)
{
while (rects)
{
- if (x_visinfo->depth != 8)
+ if (x_visinfo->depth == 16)
st2_fixup( x_framebuffer[current_framebuffer],
rects->x, rects->y, rects->width,
rects->height);
+ else if (x_visinfo->depth == 24)
+ st3_fixup( x_framebuffer[current_framebuffer],
+ rects->x, rects->y, rects->width,
+ rects->height);
if (!XShmPutImage(x_disp, x_win, x_gc,
x_framebuffer[current_framebuffer], rects->x, rects->y,
rects->x, rects->y, rects->width, rects->height, True))
@@ -932,10 +1024,14 @@ void VID_Update (vrect_t *rects)
{
while (rects)
{
- if (x_visinfo->depth != 8)
+ if (x_visinfo->depth == 16)
st2_fixup( x_framebuffer[current_framebuffer],
rects->x, rects->y, rects->width,
rects->height);
+ else if (x_visinfo->depth == 24)
+ st3_fixup( x_framebuffer[current_framebuffer],
+ rects->x, rects->y, rects->width,
+ rects->height);
XPutImage(x_disp, x_win, x_gc, x_framebuffer[0], rects->x,
rects->y, rects->x, rects->y, rects->width, rects->height);
rects = rects->pnext;
diff --git a/QW/vid_x.c b/QW/vid_x.c
new file mode 100644
index 0000000..891fb3b
--- /dev/null
+++ b/QW/vid_x.c
@@ -0,0 +1,1116 @@
+/*
+Copyright (C) 1996-1997 Id Software, Inc.
+
+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.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+// vid_x.c -- general x video driver
+
+#define _BSD
+
+typedef unsigned short PIXEL;
+
+#include <ctype.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/keysym.h>
+#include <X11/extensions/XShm.h>
+
+#include "quakedef.h"
+#include "d_local.h"
+
+cvar_t _windowed_mouse = {"_windowed_mouse","0", true};
+cvar_t m_filter = {"m_filter","0", true};
+float old_windowed_mouse;
+
+// not used
+int VGA_width, VGA_height, VGA_rowbytes, VGA_bufferrowbytes, VGA_planar;
+byte *VGA_pagebase;
+
+
+qboolean mouse_avail;
+int mouse_buttons=3;
+int mouse_oldbuttonstate;
+int mouse_buttonstate;
+float mouse_x, mouse_y;
+float old_mouse_x, old_mouse_y;
+int p_mouse_x;
+int p_mouse_y;
+int ignorenext;
+int bits_per_pixel;
+
+typedef struct
+{
+ int input;
+ int output;
+} keymap_t;
+
+viddef_t vid; // global video state
+unsigned short d_8to16table[256];
+
+int num_shades=32;
+
+int d_con_indirect = 0;
+
+int vid_buffersize;
+
+static qboolean doShm;
+static Display *x_disp;
+static Colormap x_cmap;
+static Window x_win;
+static GC x_gc;
+static Visual *x_vis;
+static XVisualInfo *x_visinfo;
+//static XImage *x_image;
+
+static int x_shmeventtype;
+//static XShmSegmentInfo x_shminfo;
+
+static qboolean oktodraw = false;
+
+int XShmQueryExtension(Display *);
+int XShmGetEventBase(Display *);
+
+int current_framebuffer;
+static XImage *x_framebuffer[2] = { 0, 0 };
+static XShmSegmentInfo x_shminfo[2];
+
+static int verbose=0;
+
+static byte current_palette[768];
+
+static long X11_highhunkmark;
+static long X11_buffersize;
+
+int vid_surfcachesize;
+void *vid_surfcache;
+
+void (*vid_menudrawfn)(void);
+void (*vid_menukeyfn)(int key);
+void VID_MenuKey (int key);
+
+static PIXEL st2d_8to16table[256];
+static int shiftmask_fl=0;
+static long r_shift,g_shift,b_shift;
+static unsigned long r_mask,g_mask,b_mask;
+
+void shiftmask_init()
+{
+ unsigned int x;
+ r_mask=x_vis->red_mask;
+ g_mask=x_vis->green_mask;
+ b_mask=x_vis->blue_mask;
+ for(r_shift=-8,x=1;x<r_mask;x=x<<1)r_shift++;
+ for(g_shift=-8,x=1;x<g_mask;x=x<<1)g_shift++;
+ for(b_shift=-8,x=1;x<b_mask;x=x<<1)b_shift++;
+ shiftmask_fl=1;
+}
+
+PIXEL xlib_rgb(int r,int g,int b)
+{
+ PIXEL p;
+ if(shiftmask_fl==0) shiftmask_init();
+ p=0;
+
+ if(r_shift>0) {
+ p=(r<<(r_shift))&r_mask;
+ } else if(r_shift<0) {
+ p=(r>>(-r_shift))&r_mask;
+ } else p|=(r&r_mask);
+
+ if(g_shift>0) {
+ p|=(g<<(g_shift))&g_mask;
+ } else if(g_shift<0) {
+ p|=(g>>(-g_shift))&g_mask;
+ } else p|=(g&g_mask);
+
+ if(b_shift>0) {
+ p|=(b<<(b_shift))&b_mask;
+ } else if(b_shift<0) {
+ p|=(b>>(-b_shift))&b_mask;
+ } else p|=(b&b_mask);
+
+ return p;
+}
+
+void st2_fixup( XImage *framebuf, int x, int y, int width, int height)
+{
+ int xi,yi;
+ unsigned char *src;
+ PIXEL *dest;
+
+ if( (x<0)||(y<0) )return;
+
+ for (yi = y; yi < (y+height); yi++) {
+ src = &framebuf->data [yi * framebuf->bytes_per_line];
+ dest = (PIXEL*)src;
+ for(xi = (x+width-1); xi >= x; xi--) {
+ dest[xi] = st2d_8to16table[src[xi]];
+ }
+ }
+}
+
+
+// ========================================================================
+// Tragic death handler
+// ========================================================================
+
+void TragicDeath(int signal_num)
+{
+ XAutoRepeatOn(x_disp);
+ XCloseDisplay(x_disp);
+ Sys_Error("This death brought to you by the number %d\n", signal_num);
+}
+
+// ========================================================================
+// makes a null cursor
+// ========================================================================
+
+static Cursor CreateNullCursor(Display *display, Window root)
+{
+ Pixmap cursormask;
+ XGCValues xgc;
+ GC gc;
+ XColor dummycolour;
+ Cursor cursor;
+
+ cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/);
+ xgc.function = GXclear;
+ gc = XCreateGC(display, cursormask, GCFunction, &xgc);
+ XFillRectangle(display, cursormask, gc, 0, 0, 1, 1);
+ dummycolour.pixel = 0;
+ dummycolour.red = 0;
+ dummycolour.flags = 04;
+ cursor = XCreatePixmapCursor(display, cursormask, cursormask,
+ &dummycolour,&dummycolour, 0,0);
+ XFreePixmap(display,cursormask);
+ XFreeGC(display,gc);
+ return cursor;
+}
+
+void ResetFrameBuffer(void)
+{
+ int mem;
+ int pwidth;
+
+ if (x_framebuffer[0])
+ {
+ free(x_framebuffer[0]->data);
+ free(x_framebuffer[0]);
+ }
+
+ if (d_pzbuffer)
+ {
+ D_FlushCaches ();
+ Hunk_FreeToHighMark (X11_highhunkmark);
+ d_pzbuffer = NULL;
+ }
+ X11_highhunkmark = Hunk_HighMark ();
+
+// alloc an extra line in case we want to wrap, and allocate the z-buffer
+ X11_buffersize = vid.width * vid.height * sizeof (*d_pzbuffer);
+
+ vid_surfcachesize = D_SurfaceCacheForRes (vid.width, vid.height);
+
+ X11_buffersize += vid_surfcachesize;
+
+ d_pzbuffer = Hunk_HighAllocName (X11_buffersize, "video");
+ if (d_pzbuffer == NULL)
+ Sys_Error ("Not enough memory for video mode\n");
+
+ vid_surfcache = (byte *) d_pzbuffer
+ + vid.width * vid.height * sizeof (*d_pzbuffer);
+
+ D_InitCaches(vid_surfcache, vid_surfcachesize);
+
+ pwidth = x_visinfo->depth / 8;
+ if (pwidth == 3) pwidth = 4;
+ mem = ((vid.width*pwidth+7)&~7) * vid.height;
+
+ x_framebuffer[0] = XCreateImage( x_disp,
+ x_vis,
+ x_visinfo->depth,
+ ZPixmap,
+ 0,
+ malloc(mem),
+ vid.width, vid.height,
+ 32,
+ 0);
+
+ if (!x_framebuffer[0])
+ Sys_Error("VID: XCreateImage failed\n");
+
+ vid.buffer = (byte*) (x_framebuffer[0]);
+ vid.conbuffer = vid.buffer;
+
+}
+
+void ResetSharedFrameBuffers(void)
+{
+
+ int size;
+ int key;
+ int minsize = getpagesize();
+ int frm;
+
+ if (d_pzbuffer)
+ {
+ D_FlushCaches ();
+ Hunk_FreeToHighMark (X11_highhunkmark);
+ d_pzbuffer = NULL;
+ }
+
+ X11_highhunkmark = Hunk_HighMark ();
+
+// alloc an extra line in case we want to wrap, and allocate the z-buffer
+ X11_buffersize = vid.width * vid.height * sizeof (*d_pzbuffer);
+
+ vid_surfcachesize = D_SurfaceCacheForRes (vid.width, vid.height);
+
+ X11_buffersize += vid_surfcachesize;
+
+ d_pzbuffer = Hunk_HighAllocName (X11_buffersize, "video");
+ if (d_pzbuffer == NULL)
+ Sys_Error ("Not enough memory for video mode\n");
+
+ vid_surfcache = (byte *) d_pzbuffer
+ + vid.width * vid.height * sizeof (*d_pzbuffer);
+
+ D_InitCaches(vid_surfcache, vid_surfcachesize);
+
+ for (frm=0 ; frm<2 ; frm++)
+ {
+
+ // free up old frame buffer memory
+
+ if (x_framebuffer[frm])
+ {
+ XShmDetach(x_disp, &x_shminfo[frm]);
+ free(x_framebuffer[frm]);
+ shmdt(x_shminfo[frm].shmaddr);
+ }
+
+ // create the image
+
+ x_framebuffer[frm] = XShmCreateImage( x_disp,
+ x_vis,
+ x_visinfo->depth,
+ ZPixmap,
+ 0,
+ &x_shminfo[frm],
+ vid.width,
+ vid.height );
+
+ // grab shared memory
+
+ size = x_framebuffer[frm]->bytes_per_line
+ * x_framebuffer[frm]->height;
+ if (size < minsize)
+ Sys_Error("VID: Window must use at least %d bytes\n", minsize);
+
+ key = random();
+ x_shminfo[frm].shmid = shmget((key_t)key, size, IPC_CREAT|0777);
+ if (x_shminfo[frm].shmid==-1)
+ Sys_Error("VID: Could not get any shared memory\n");
+
+ // attach to the shared memory segment
+ x_shminfo[frm].shmaddr =
+ (void *) shmat(x_shminfo[frm].shmid, 0, 0);
+
+ printf("VID: shared memory id=%d, addr=0x%lx\n", x_shminfo[frm].shmid,
+ (long) x_shminfo[frm].shmaddr);
+
+ x_framebuffer[frm]->data = x_shminfo[frm].shmaddr;
+
+ // get the X server to attach to it
+
+ if (!XShmAttach(x_disp, &x_shminfo[frm]))
+ Sys_Error("VID: XShmAttach() failed\n");
+ XSync(x_disp, 0);
+ shmctl(x_shminfo[frm].shmid, IPC_RMID, 0);
+
+ }
+
+}
+
+// Called at startup to set up translation tables, takes 256 8 bit RGB values
+// the palette data will go away after the call, so it must be copied off if
+// the video driver will need it again
+
+void VID_Init (unsigned char *palette)
+{
+
+ int pnum, i;
+ XVisualInfo template;
+ int num_visuals;
+ int template_mask;
+
+ S_Init();
+
+ ignorenext=0;
+ vid.width = 320;
+ vid.height = 200;
+ vid.maxwarpwidth = WARP_WIDTH;
+ vid.maxwarpheight = WARP_HEIGHT;
+ vid.numpages = 2;
+ vid.colormap = host_colormap;
+ // vid.cbits = VID_CBITS;
+ // vid.grades = VID_GRADES;
+ vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
+
+ srandom(getpid());
+
+ verbose=COM_CheckParm("-verbose");
+
+// open the display
+ x_disp = XOpenDisplay(0);
+ if (!x_disp)
+ {
+ if (getenv("DISPLAY"))
+ Sys_Error("VID: Could not open display [%s]\n",
+ getenv("DISPLAY"));
+ else
+ Sys_Error("VID: Could not open local display\n");
+ }
+
+// catch signals so i can turn on auto-repeat
+
+ {
+ struct sigaction sa;
+ sigaction(SIGINT, 0, &sa);
+ sa.sa_handler = TragicDeath;
+ sigaction(SIGINT, &sa, 0);
+ sigaction(SIGTERM, &sa, 0);
+ }
+
+ XAutoRepeatOff(x_disp);
+
+// for debugging only
+ XSynchronize(x_disp, True);
+
+// check for command-line window size
+ if ((pnum=COM_CheckParm("-winsize")))
+ {
+ if (pnum >= com_argc-2)
+ Sys_Error("VID: -winsize <width> <height>\n");
+ vid.width = Q_atoi(com_argv[pnum+1]);
+ vid.height = Q_atoi(com_argv[pnum+2]);
+ if (!vid.width || !vid.height)
+ Sys_Error("VID: Bad window width/height\n");
+ }
+ if ((pnum=COM_CheckParm("-width"))) {
+ if (pnum >= com_argc-1)
+ Sys_Error("VID: -width <width>\n");
+ vid.width = Q_atoi(com_argv[pnum+1]);
+ if (!vid.width)
+ Sys_Error("VID: Bad window width\n");
+ }
+ if ((pnum=COM_CheckParm("-height"))) {
+ if (pnum >= com_argc-1)
+ Sys_Error("VID: -height <height>\n");
+ vid.height = Q_atoi(com_argv[pnum+1]);
+ if (!vid.height)
+ Sys_Error("VID: Bad window height\n");
+ }
+
+ template_mask = 0;
+
+// specify a visual id
+ if ((pnum=COM_CheckParm("-visualid")))
+ {
+ if (pnum >= com_argc-1)
+ Sys_Error("VID: -visualid <id#>\n");
+ template.visualid = Q_atoi(com_argv[pnum+1]);
+ template_mask = VisualIDMask;
+ }
+
+// If not specified, use default visual
+ else
+ {
+ int screen;
+ screen = XDefaultScreen(x_disp);
+ template.visualid =
+ XVisualIDFromVisual(XDefaultVisual(x_disp, screen));
+ template_mask = VisualIDMask;
+ }
+
+// pick a visual- warn if more than one was available
+ x_visinfo = XGetVisualInfo(x_disp, template_mask, &template, &num_visuals);
+ if (num_visuals > 1)
+ {
+ printf("Found more than one visual id at depth %d:\n", template.depth);
+ for (i=0 ; i<num_visuals ; i++)
+ printf(" -visualid %d\n", (int)(x_visinfo[i].visualid));
+ }
+ else if (num_visuals == 0)
+ {
+ if (template_mask == VisualIDMask)
+ Sys_Error("VID: Bad visual id %d\n", template.visualid);
+ else
+ Sys_Error("VID: No visuals at depth %d\n", template.depth);
+ }
+
+ if (verbose)
+ {
+ printf("Using visualid %d:\n", (int)(x_visinfo->visualid));
+ printf(" screen %d\n", x_visinfo->screen);
+ printf(" red_mask 0x%x\n", (int)(x_visinfo->red_mask));
+ printf(" green_mask 0x%x\n", (int)(x_visinfo->green_mask));
+ printf(" blue_mask 0x%x\n", (int)(x_visinfo->blue_mask));
+ printf(" colormap_size %d\n", x_visinfo->colormap_size);
+ printf(" bits_per_rgb %d\n", x_visinfo->bits_per_rgb);
+ }
+
+ x_vis = x_visinfo->visual;
+
+// setup attributes for main window
+ {
+ int attribmask = CWEventMask | CWColormap | CWBorderPixel;
+ XSetWindowAttributes attribs;
+ Colormap tmpcmap;
+
+ tmpcmap = XCreateColormap(x_disp, XRootWindow(x_disp,
+ x_visinfo->screen), x_vis, AllocNone);
+
+ attribs.event_mask = StructureNotifyMask | KeyPressMask
+ | KeyReleaseMask | ExposureMask | PointerMotionMask |
+ ButtonPressMask | ButtonReleaseMask;
+ attribs.border_pixel = 0;
+ attribs.colormap = tmpcmap;
+
+// create the main window
+ x_win = XCreateWindow( x_disp,
+ XRootWindow(x_disp, x_visinfo->screen),
+ 0, 0, // x, y
+ vid.width, vid.height,
+ 0, // borderwidth
+ x_visinfo->depth,
+ InputOutput,
+ x_vis,
+ attribmask,
+ &attribs );
+ XStoreName( x_disp,x_win,"xquake");
+
+
+ if (x_visinfo->class != TrueColor)
+ XFreeColormap(x_disp, tmpcmap);
+
+ }
+
+ if (x_visinfo->depth == 8)
+ {
+
+ // create and upload the palette
+ if (x_visinfo->class == PseudoColor)
+ {
+ x_cmap = XCreateColormap(x_disp, x_win, x_vis, AllocAll);
+ VID_SetPalette(palette);
+ XSetWindowColormap(x_disp, x_win, x_cmap);
+ }
+
+ }
+
+// inviso cursor
+ XDefineCursor(x_disp, x_win, CreateNullCursor(x_disp, x_win));
+
+// create the GC
+ {
+ XGCValues xgcvalues;
+ int valuemask = GCGraphicsExposures;
+ xgcvalues.graphics_exposures = False;
+ x_gc = XCreateGC(x_disp, x_win, valuemask, &xgcvalues );
+ }
+
+// map the window
+ XMapWindow(x_disp, x_win);
+
+// wait for first exposure event
+ {
+ XEvent event;
+ do
+ {
+ XNextEvent(x_disp, &event);
+ if (event.type == Expose && !event.xexpose.count)
+ oktodraw = true;
+ } while (!oktodraw);
+ }
+// now safe to draw
+
+// even if MITSHM is available, make sure it's a local connection
+ if (XShmQueryExtension(x_disp))
+ {
+ char *displayname;
+ doShm = true;
+ displayname = (char *) getenv("DISPLAY");
+ if (displayname)
+ {
+ char *d = displayname;
+ while (*d && (*d != ':')) d++;
+ if (*d) *d = 0;
+ if (!(!strcasecmp(displayname, "unix") || !*displayname))
+ doShm = false;
+ }
+ }
+
+ if (doShm)
+ {
+ x_shmeventtype = XShmGetEventBase(x_disp) + ShmCompletion;
+ ResetSharedFrameBuffers();
+ }
+ else
+ ResetFrameBuffer();
+
+ current_framebuffer = 0;
+ vid.rowbytes = x_framebuffer[0]->bytes_per_line;
+ vid.buffer = x_framebuffer[0]->data;
+ vid.direct = 0;
+ vid.conbuffer = x_framebuffer[0]->data;
+ vid.conrowbytes = vid.rowbytes;
+ vid.conwidth = vid.width;
+ vid.conheight = vid.height;
+ vid.aspect = ((float)vid.height / (float)vid.width) * (320.0 / 240.0);
+
+// XSynchronize(x_disp, False);
+
+}
+
+void VID_ShiftPalette(unsigned char *p)
+{
+ VID_SetPalette(p);
+}
+
+
+
+void VID_SetPalette(unsigned char *palette)
+{
+
+ int i;
+ XColor colors[256];
+
+ for(i=0;i<256;i++)
+ st2d_8to16table[i]= xlib_rgb(palette[i*3],
+ palette[i*3+1],palette[i*3+2]);
+
+ if (x_visinfo->class == PseudoColor && x_visinfo->depth == 8)
+ {
+ if (palette != current_palette)
+ memcpy(current_palette, palette, 768);
+ for (i=0 ; i<256 ; i++)
+ {
+ colors[i].pixel = i;
+ colors[i].flags = DoRed|DoGreen|DoBlue;
+ colors[i].red = palette[i*3] * 257;
+ colors[i].green = palette[i*3+1] * 257;
+ colors[i].blue = palette[i*3+2] * 257;
+ }
+ XStoreColors(x_disp, x_cmap, colors, 256);
+ }
+
+}
+
+// Called at shutdown
+
+void VID_Shutdown (void)
+{
+ Con_Printf("VID_Shutdown\n");
+ XAutoRepeatOn(x_disp);
+ XCloseDisplay(x_disp);
+}
+
+int XLateKey(XKeyEvent *ev)
+{
+
+ int key;
+ char buf[64];
+ KeySym keysym;
+
+ key = 0;
+
+ XLookupString(ev, buf, sizeof buf, &keysym, 0);
+
+ switch(keysym)
+ {
+ case XK_KP_Page_Up:
+ case XK_Page_Up: key = K_PGUP; break;
+
+ case XK_KP_Page_Down:
+ case XK_Page_Down: key = K_PGDN; break;
+
+ case XK_KP_Home:
+ case XK_Home: key = K_HOME; break;
+
+ case XK_KP_End:
+ case XK_End: key = K_END; break;
+
+ case XK_KP_Left:
+ case XK_Left: key = K_LEFTARROW; break;
+
+ case XK_KP_Right:
+ case XK_Right: key = K_RIGHTARROW; break;
+
+ case XK_KP_Down:
+ case XK_Down: key = K_DOWNARROW; break;
+
+ case XK_KP_Up:
+ case XK_Up: key = K_UPARROW; break;
+
+ case XK_Escape: key = K_ESCAPE; break;
+
+ case XK_KP_Enter:
+ case XK_Return: key = K_ENTER; break;
+
+ case XK_Tab: key = K_TAB; break;
+
+ case XK_F1: key = K_F1; break;
+
+ case XK_F2: key = K_F2; break;
+
+ case XK_F3: key = K_F3; break;
+
+ case XK_F4: key = K_F4; break;
+
+ case XK_F5: key = K_F5; break;
+
+ case XK_F6: key = K_F6; break;
+
+ case XK_F7: key = K_F7; break;
+
+ case XK_F8: key = K_F8; break;
+
+ case XK_F9: key = K_F9; break;
+
+ case XK_F10: key = K_F10; break;
+
+ case XK_F11: key = K_F11; break;
+
+ case XK_F12: key = K_F12; break;
+
+ case XK_BackSpace: key = K_BACKSPACE; break;
+
+ case XK_KP_Delete:
+ case XK_Delete: key = K_DEL; break;
+
+ case XK_Pause: key = K_PAUSE; break;
+
+ case XK_Shift_L:
+ case XK_Shift_R: key = K_SHIFT; break;
+
+ case XK_Execute:
+ case XK_Control_L:
+ case XK_Control_R: key = K_CTRL; break;
+
+ case XK_Alt_L:
+ case XK_Meta_L:
+ case XK_Alt_R:
+ case XK_Meta_R: key = K_ALT; break;
+
+ case XK_KP_Begin: key = K_AUX30; break;
+
+ case XK_Insert:
+ case XK_KP_Insert: key = K_INS; break;
+
+ case XK_KP_Multiply: key = '*'; break;
+ case XK_KP_Add: key = '+'; break;
+ case XK_KP_Subtract: key = '-'; break;
+ case XK_KP_Divide: key = '/'; break;
+
+#if 0
+ case 0x021: key = '1';break;/* [!] */
+ case 0x040: key = '2';break;/* [@] */
+ case 0x023: key = '3';break;/* [#] */
+ case 0x024: key = '4';break;/* [$] */
+ case 0x025: key = '5';break;/* [%] */
+ case 0x05e: key = '6';break;/* [^] */
+ case 0x026: key = '7';break;/* [&] */
+ case 0x02a: key = '8';break;/* [*] */
+ case 0x028: key = '9';;break;/* [(] */
+ case 0x029: key = '0';break;/* [)] */
+ case 0x05f: key = '-';break;/* [_] */
+ case 0x02b: key = '=';break;/* [+] */
+ case 0x07c: key = '\'';break;/* [|] */
+ case 0x07d: key = '[';break;/* [}] */
+ case 0x07b: key = ']';break;/* [{] */
+ case 0x022: key = '\'';break;/* ["] */
+ case 0x03a: key = ';';break;/* [:] */
+ case 0x03f: key = '/';break;/* [?] */
+ case 0x03e: key = '.';break;/* [>] */
+ case 0x03c: key = ',';break;/* [<] */
+#endif
+
+ default:
+ key = *(unsigned char*)buf;
+ if (key >= 'A' && key <= 'Z')
+ key = key - 'A' + 'a';
+// fprintf(stdout, "case 0x0%x: key = ___;break;/* [%c] */\n", keysym);
+ break;
+ }
+
+ return key;
+}
+
+struct
+{
+ int key;
+ int down;
+} keyq[64];
+int keyq_head=0;
+int keyq_tail=0;
+
+int config_notify=0;
+int config_notify_width;
+int config_notify_height;
+
+void GetEvent(void)
+{
+ XEvent x_event;
+ int b;
+
+ XNextEvent(x_disp, &x_event);
+ switch(x_event.type) {
+ case KeyPress:
+ keyq[keyq_head].key = XLateKey(&x_event.xkey);
+ keyq[keyq_head].down = true;
+ keyq_head = (keyq_head + 1) & 63;
+ break;
+ case KeyRelease:
+ keyq[keyq_head].key = XLateKey(&x_event.xkey);
+ keyq[keyq_head].down = false;
+ keyq_head = (keyq_head + 1) & 63;
+ break;
+
+ case MotionNotify:
+ if (_windowed_mouse.value) {
+ mouse_x = (float) ((int)x_event.xmotion.x - (int)(vid.width/2));
+ mouse_y = (float) ((int)x_event.xmotion.y - (int)(vid.height/2));
+//printf("m: x=%d,y=%d, mx=%3.2f,my=%3.2f\n",
+// x_event.xmotion.x, x_event.xmotion.y, mouse_x, mouse_y);
+
+ /* move the mouse to the window center again */
+ XSelectInput(x_disp,x_win,StructureNotifyMask|KeyPressMask
+ |KeyReleaseMask|ExposureMask
+ |ButtonPressMask
+ |ButtonReleaseMask);
+ XWarpPointer(x_disp,None,x_win,0,0,0,0,
+ (vid.width/2),(vid.height/2));
+ XSelectInput(x_disp,x_win,StructureNotifyMask|KeyPressMask
+ |KeyReleaseMask|ExposureMask
+ |PointerMotionMask|ButtonPressMask
+ |ButtonReleaseMask);
+ } else {
+ mouse_x = (float) (x_event.xmotion.x-p_mouse_x);
+ mouse_y = (float) (x_event.xmotion.y-p_mouse_y);
+ p_mouse_x=x_event.xmotion.x;
+ p_mouse_y=x_event.xmotion.y;
+ }
+ break;
+
+ case ButtonPress:
+ b=-1;
+ if (x_event.xbutton.button == 1)
+ b = 0;
+ else if (x_event.xbutton.button == 2)
+ b = 2;
+ else if (x_event.xbutton.button == 3)
+ b = 1;
+ if (b>=0)
+ mouse_buttonstate |= 1<<b;
+ break;
+
+ case ButtonRelease:
+ b=-1;
+ if (x_event.xbutton.button == 1)
+ b = 0;
+ else if (x_event.xbutton.button == 2)
+ b = 2;
+ else if (x_event.xbutton.button == 3)
+ b = 1;
+ if (b>=0)
+ mouse_buttonstate &= ~(1<<b);
+ break;
+
+ case ConfigureNotify:
+//printf("config notify\n");
+ config_notify_width = x_event.xconfigure.width;
+ config_notify_height = x_event.xconfigure.height;
+ config_notify = 1;
+ break;
+
+ default:
+ if (doShm && x_event.type == x_shmeventtype)
+ oktodraw = true;
+ }
+
+ if (old_windowed_mouse != _windowed_mouse.value) {
+ old_windowed_mouse = _windowed_mouse.value;
+
+ if (!_windowed_mouse.value) {
+ /* ungrab the pointer */
+ XUngrabPointer(x_disp,CurrentTime);
+ } else {
+ /* grab the pointer */
+ XGrabPointer(x_disp,x_win,True,0,GrabModeAsync,
+ GrabModeAsync,x_win,None,CurrentTime);
+ }
+ }
+}
+
+// flushes the given rectangles from the view buffer to the screen
+
+void VID_Update (vrect_t *rects)
+{
+
+// if the window changes dimension, skip this frame
+
+ if (config_notify)
+ {
+ fprintf(stderr, "config notify\n");
+ config_notify = 0;
+ vid.width = config_notify_width & ~7;
+ vid.height = config_notify_height;
+ if (doShm)
+ ResetSharedFrameBuffers();
+ else
+ ResetFrameBuffer();
+ vid.rowbytes = x_framebuffer[0]->bytes_per_line;
+ vid.buffer = x_framebuffer[current_framebuffer]->data;
+ vid.conbuffer = vid.buffer;
+ vid.conwidth = vid.width;
+ vid.conheight = vid.height;
+ vid.conrowbytes = vid.rowbytes;
+ vid.recalc_refdef = 1; // force a surface cache flush
+ Con_CheckResize();
+ Con_Clear_f();
+ return;
+ }
+
+ if (doShm)
+ {
+
+ while (rects)
+ {
+ if (x_visinfo->depth != 8)
+ st2_fixup( x_framebuffer[current_framebuffer],
+ rects->x, rects->y, rects->width,
+ rects->height);
+ if (!XShmPutImage(x_disp, x_win, x_gc,
+ x_framebuffer[current_framebuffer], rects->x, rects->y,
+ rects->x, rects->y, rects->width, rects->height, True))
+ Sys_Error("VID_Update: XShmPutImage failed\n");
+ oktodraw = false;
+ while (!oktodraw) GetEvent();
+ rects = rects->pnext;
+ }
+ current_framebuffer = !current_framebuffer;
+ vid.buffer = x_framebuffer[current_framebuffer]->data;
+ vid.conbuffer = vid.buffer;
+ XSync(x_disp, False);
+ }
+ else
+ {
+ while (rects)
+ {
+ if (x_visinfo->depth != 8)
+ st2_fixup( x_framebuffer[current_framebuffer],
+ rects->x, rects->y, rects->width,
+ rects->height);
+ XPutImage(x_disp, x_win, x_gc, x_framebuffer[0], rects->x,
+ rects->y, rects->x, rects->y, rects->width, rects->height);
+ rects = rects->pnext;
+ }
+ XSync(x_disp, False);
+ }
+
+}
+
+static int dither;
+
+void VID_DitherOn(void)
+{
+ if (dither == 0)
+ {
+ vid.recalc_refdef = 1;
+ dither = 1;
+ }
+}
+
+void VID_DitherOff(void)
+{
+ if (dither)
+ {
+ vid.recalc_refdef = 1;
+ dither = 0;
+ }
+}
+
+int Sys_OpenWindow(void)
+{
+ return 0;
+}
+
+void Sys_EraseWindow(int window)
+{
+}
+
+void Sys_DrawCircle(int window, int x, int y, int r)
+{
+}
+
+void Sys_DisplayWindow(int window)
+{
+}
+
+void Sys_SendKeyEvents(void)
+{
+// get events from x server
+ if (x_disp)
+ {
+ while (XPending(x_disp)) GetEvent();
+ while (keyq_head != keyq_tail)
+ {
+ Key_Event(keyq[keyq_tail].key, keyq[keyq_tail].down);
+ keyq_tail = (keyq_tail + 1) & 63;
+ }
+ }
+}
+
+#if 0
+char *Sys_ConsoleInput (void)
+{
+
+ static char text[256];
+ int len;
+ fd_set readfds;
+ int ready;
+ struct timeval timeout;
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 0;
+ FD_ZERO(&readfds);
+ FD_SET(0, &readfds);
+ ready = select(1, &readfds, 0, 0, &timeout);
+
+ if (ready>0)
+ {
+ len = read (0, text, sizeof(text));
+ if (len >= 1)
+ {
+ text[len-1] = 0; // rip off the /n and terminate
+ return text;
+ }
+ }
+
+ return 0;
+
+}
+#endif
+
+void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height)
+{
+// direct drawing of the "accessing disk" icon isn't supported under Linux
+}
+
+void D_EndDirectRect (int x, int y, int width, int height)
+{
+// direct drawing of the "accessing disk" icon isn't supported under Linux
+}
+
+void IN_Init (void)
+{
+ Cvar_RegisterVariable (&_windowed_mouse);
+ Cvar_RegisterVariable (&m_filter);
+ if ( COM_CheckParm ("-nomouse") )
+ return;
+ mouse_x = mouse_y = 0.0;
+ mouse_avail = 1;
+}
+
+void IN_Shutdown (void)
+{
+ mouse_avail = 0;
+}
+
+void IN_Commands (void)
+{
+ int i;
+
+ if (!mouse_avail) return;
+
+ for (i=0 ; i<mouse_buttons ; i++) {
+ if ( (mouse_buttonstate & (1<<i)) && !(mouse_oldbuttonstate & (1<<i)) )
+ Key_Event (K_MOUSE1 + i, true);
+
+ if ( !(mouse_buttonstate & (1<<i)) && (mouse_oldbuttonstate & (1<<i)) )
+ Key_Event (K_MOUSE1 + i, false);
+ }
+ mouse_oldbuttonstate = mouse_buttonstate;
+}
+
+void IN_Move (usercmd_t *cmd)
+{
+ if (!mouse_avail)
+ return;
+
+ if (m_filter.value) {
+ mouse_x = (mouse_x + old_mouse_x) * 0.5;
+ mouse_y = (mouse_y + old_mouse_y) * 0.5;
+ }
+
+ old_mouse_x = mouse_x;
+ old_mouse_y = mouse_y;
+
+ mouse_x *= sensitivity.value;
+ mouse_y *= sensitivity.value;
+
+ if ( (in_strafe.state & 1) || (lookstrafe.value && (in_mlook.state & 1) ))
+ cmd->sidemove += m_side.value * mouse_x;
+ else
+ cl.viewangles[YAW] -= m_yaw.value * mouse_x;
+ if (in_mlook.state & 1)
+ V_StopPitchDrift ();
+
+ if ( (in_mlook.state & 1) && !(in_strafe.state & 1)) {
+ cl.viewangles[PITCH] += m_pitch.value * mouse_y;
+ if (cl.viewangles[PITCH] > 80)
+ cl.viewangles[PITCH] = 80;
+ if (cl.viewangles[PITCH] < -70)
+ cl.viewangles[PITCH] = -70;
+ } else {
+ if ((in_strafe.state & 1) && noclip_anglehack)
+ cmd->upmove -= m_forward.value * mouse_y;
+ else
+ cmd->forwardmove -= m_forward.value * mouse_y;
+ }
+ mouse_x = mouse_y = 0.0;
+}
+
+void VID_LockBuffer (void)
+{
+}
+
+void VID_UnlockBuffer (void)
+{
+}
+