shithub: qk1

Download patch

ref: 0f42d9aeb91c01f8932e7130f3345111485f2202
parent: 26e253158ac93bbc14cc381780f9b37ea7858bd1
author: Konstantinn Bonnet <qu7uux@gmail.com>
date: Sat Feb 14 14:34:31 EST 2015

fix mouselook somewhat, and free it

- rework mouse event handling: grabout+insetrect didn't keep the mouse inside
the window much, making it kind of unplayable w/ mouse, this attempts to
remedy that
- add m_freelook as a quick hack allowing to look freely in all directions
without +mlook.
- _windowed_mouse -> m_windowed; ungrab when unset and vice versa

--- a/README
+++ b/README
@@ -22,8 +22,8 @@
 	- tested on 386 and amd64 only
 
 
-some cvars useful for workarounds
----------------------------------
+some params useful for workarounds
+----------------------------------
 	-nosound
 	-nostdout
 	-mem %d
@@ -41,6 +41,7 @@
 	- Sys_Warn added again for print(2) stuff in *_9.c that uses %r, kind of stupid
 	since Con_Printf was often used there, and it outputs to both fd=1 and console,
 	so needs fixing
+	- m_freelook, as a quick hack to have (reversible) free mouse look
 
 
 bugs present in linux/x11 (w/ my tweaks in early commits)
--- a/in_9.c
+++ b/in_9.c
@@ -6,13 +6,14 @@
 #include <keyboard.h>
 #include "quakedef.h"
 
-cvar_t _windowed_mouse = {"_windowed_mouse","0", true};
+cvar_t m_windowed = {"m_windowed","0", true};
 cvar_t m_filter = {"m_filter","0", true};
-float old_windowed_mouse;
+cvar_t m_freelook = {"m_freelook", "0", true};
+float oldm_windowed;
 qboolean mouse_avail;
 int mouse_buttons = 3;
 int mouse_buttonstate, mouse_oldbuttonstate;
-float mouse_x, mouse_y, old_mouse_x, old_mouse_y, p_mouse_x, p_mouse_y;
+float mouse_x, mouse_y, old_mouse_x, old_mouse_y;
 
 struct {
 	int key;
@@ -31,9 +32,10 @@
 
 void Sys_SendKeyEvents(void)
 {
-	if(old_windowed_mouse != _windowed_mouse.value){
-		old_windowed_mouse = _windowed_mouse.value;
-		if(!_windowed_mouse.value)
+	/* FIXME: sloppy */
+	if(oldm_windowed != m_windowed.value){
+		oldm_windowed = m_windowed.value;
+		if(!m_windowed.value)
 			IN_Grabm(0);
 		else
 			IN_Grabm(1);
@@ -80,10 +82,10 @@
 		cmd->sidemove += m_side.value * mouse_x;
 	else
 		cl.viewangles[YAW] -= m_yaw.value * mouse_x;
-	if(in_mlook.state & 1)
+	if(m_freelook.value || in_mlook.state & 1)
 		V_StopPitchDrift();
    
-	if(in_mlook.state & 1 && ~in_strafe.state & 1){
+	if(m_freelook.value || 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;
@@ -232,19 +234,11 @@
 			//m.buttons = atoi(buf+1+2*12);
 			b = atoi(buf+1+2*12);
 
-			/* FIXME: does not work well */
-			if(_windowed_mouse.value){
-				if(!ptinrect(m, grabout)){
-					fprint(fd, "m%d %d", center.x, center.y);
-					m = center;
-					p_mouse_x = center.x;
-					p_mouse_y = center.y;
-				}
-			}
-			mouse_x = (float)(m.x - p_mouse_x);
-			mouse_y = (float)(m.y - p_mouse_y);
-			p_mouse_x = m.x;
-			p_mouse_y = m.y;
+			/* FIXME: cursor can still get out */
+			mouse_x += (float)(m.x - center.x);
+			mouse_y += (float)(m.y - center.y);
+			if(m_windowed.value)
+				fprint(fd, "m%d %d", center.x, center.y);
 
 			mouse_buttonstate = b&1 | (b&2)<<1 | (b&4)>>1;
 			break;
@@ -297,10 +291,12 @@
 {
 	int pid;
 
-	Cvar_RegisterVariable(&_windowed_mouse);
+	Cvar_RegisterVariable(&m_windowed);
 	Cvar_RegisterVariable(&m_filter);
+	Cvar_RegisterVariable(&m_freelook);
 	notify(sucks);
-	IN_Grabm(1);
+	if(m_windowed.value)
+		IN_Grabm(1);
 	if((pid = rfork(RFPROC|RFMEM|RFFDG)) == 0){
 		kproc();
 		exits(nil);
@@ -308,12 +304,13 @@
 	kpid = pid;
 	if(COM_CheckParm("-nomouse"))
 		return;
-	/* FIXME: notify(catch) if crash -> disable mouse */
 	if((pid = rfork(RFPROC|RFMEM|RFFDG)) == 0){
 		mproc();
 		exits(nil);
 	}
 	mpid = pid;
-	p_mouse_x = p_mouse_y = mouse_x = mouse_y = 0.0;
+	mouse_x = mouse_y = 0.0;
+	/* FIXME: both kind of do the same thing */
+	//mouse_avail = mouseactive = 1;
 	mouse_avail = 1;
 }
--- a/vid_9.c
+++ b/vid_9.c
@@ -31,7 +31,6 @@
 void (*vid_menudrawfn)(void);
 void (*vid_menukeyfn)(int key);
 
-
 void shiftmask_init (void)
 {
 	uint x;
@@ -205,6 +204,13 @@
 // the palette data will go away after the call, so it must be copied off if
 // the video driver will need it again
 
+void resetscr(void)
+{
+	ResetFrameBuffer();
+	center = addpt(screen->r.min, Pt(Dx(screen->r)/2, Dy(screen->r)/2));
+	grabout = insetrect(screen->r, Dx(screen->r)/8);
+}
+
 void VID_Init (unsigned char *palette)
 {
 	int pnum;
@@ -259,9 +265,7 @@
 
 	if(screen->chan == CMAP8)
 		VID_SetPalette(palette);
-	ResetFrameBuffer();
-	center = addpt(screen->r.min, Pt(Dx(screen->r)/2, Dy(screen->r)/2));
-	grabout = insetrect(screen->r, Dx(screen->r)/8);
+	resetscr();
 	vid.rowbytes = Dx(screen->r) * screen->depth/8;
 	vid.buffer = framebuf;
 	vid.direct = 0;
@@ -323,9 +327,7 @@
 			Sys_Error("VID_Update:getwindow");
 		vid.width = Dx(screen->r);
 		vid.height = Dy(screen->r);
-		ResetFrameBuffer();
-		center = addpt(screen->r.min, Pt(Dx(screen->r)/2, Dy(screen->r)/2));
-		grabout = insetrect(screen->r, Dx(screen->r)/8);
+		resetscr();
 		vid.rowbytes = vid.width * screen->depth/8;
 		vid.buffer = framebuf;
 		vid.conbuffer = framebuf;