|
|
1.1 root 1: // in_next.m
2:
3: #import <AppKit/AppKit.h>
4: #import <drivers/event_status_driver.h>
5: #include "../client/client.h"
6:
7: float mousex, mousey;
8:
9: float mouse_center_x = 160;
10: float mouse_center_y = 100;
11:
12: void PSsetmouse (float x, float y);
13: void PSshowcursor (void);
14: void PShidecursor (void);
15: void PScurrentmouse (int win, float *x, float *y);
16:
17: extern NSView *vid_view_i;
18: extern NSWindow *vid_window_i;
19:
20: qboolean mlooking;
21: qboolean mouseinitialized;
22: int mouse_buttons;
23: int mouse_oldbuttonstate;
24: int mouseactive;
25: int mousereset;
26: int mx_accum, my_accum;
27: int window_center_x, window_center_y;
28: int old_mouse_x, old_mouse_y;
29:
30: cvar_t in_mouse = {"in_mouse", "0", CVAR_ARCHIVE};
31: cvar_t m_filter = {"m_filter", "0", CVAR_ARCHIVE};
32: cvar_t freelook = {"in_freelook", "0", CVAR_ARCHIVE};
33:
34:
35: /*
36: ===========
37: IN_ActivateMouse
38:
39: Called when the window gains focus or changes in some way
40: ===========
41: */
42: void IN_ActivateMouse (void)
43: {
44: NSRect r;
45:
46: if (!mouseinitialized)
47: return;
48: if (!in_mouse.value)
49: return;
50:
51: r = [vid_window_i frame];
52: window_center_x = r.size.width / 2;
53: window_center_y = r.size.height / 2;
54:
55: if (!mouseactive)
56: PShidecursor ();
57:
58: mouseactive = true;
59: mousereset = true;
60: }
61:
62:
63: /*
64: ===========
65: IN_DeactivateMouse
66:
67: Called when the window loses focus
68: ===========
69: */
70: void IN_DeactivateMouse (void)
71: {
72: if (!mouseinitialized)
73: return;
74:
75: if (mouseactive)
76: PSshowcursor ();
77:
78: mouseactive = false;
79: }
80:
81:
82: /*
83: ===========
84: IN_StartupMouse
85: ===========
86: */
87: void IN_StartupMouse (void)
88: {
89: if ( COM_CheckParm ("-nomouse") )
90: return;
91:
92: mouseinitialized = true;
93:
94: mouse_buttons = 3;
95:
96: IN_ActivateMouse ();
97: }
98:
99: /*
100: ===========
101: IN_MouseEvent
102: ===========
103: */
104: void IN_MouseEvent (int mstate)
105: {
106: int i;
107:
108: if (!mouseactive)
109: return;
110:
111: // perform button actions
112: for (i=0 ; i<mouse_buttons ; i++)
113: {
114: if ( (mstate & (1<<i)) &&
115: !(mouse_oldbuttonstate & (1<<i)) )
116: {
117: Key_Event (K_MOUSE1 + i, true);
118: }
119:
120: if ( !(mstate & (1<<i)) &&
121: (mouse_oldbuttonstate & (1<<i)) )
122: {
123: Key_Event (K_MOUSE1 + i, false);
124: }
125: }
126:
127: mouse_oldbuttonstate = mstate;
128: }
129:
130:
131:
132: /*
133: ===========
134: IN_Accumulate
135: ===========
136: */
137: void IN_Accumulate (void)
138: {
139: int dx, dy;
140: static int old_x, old_y;
141:
142: if (!mouseinitialized)
143: return;
144:
145: if (in_mouse.modified)
146: {
147: in_mouse.modified = false;
148: IN_DeactivateMouse ();
149: IN_ActivateMouse ();
150: }
151:
152: if (!mouseactive)
153: return;
154:
155: // [vid_view_i lockFocus];
156:
157: if (mousereset)
158: { // we haven't centered cursor yet
159: mousereset = false;
160: }
161: else
162: {
163: NSPoint p;
164:
165: PScurrentmouse ([vid_window_i windowNumber], &mousex, &mousey);
166:
167: p.x = mousex;
168: p.y = mousey;
169: p = [vid_view_i convertPoint:p fromView: nil];
170:
171: mousex = p.x;
172: mousey = p.y;
173:
174: dx = mousex - old_x;
175: dy = old_y - mousey;
176:
177: if (!dx && !dy)
178: return;
179: mx_accum += dx;
180: my_accum += dy;
181: }
182:
183: // force the mouse to the center, so there's room to move
184: PSsetmouse (window_center_x, window_center_y);
185: PScurrentmouse ([vid_window_i windowNumber], &mousex, &mousey);
186: // PSsetmouse (window_center_x, window_center_y);
187: old_x = window_center_x;
188: old_y = window_center_y;
189:
190: // [vid_view_i unlockFocus];
191: }
192:
193:
194: /*
195: ===========
196: IN_MouseMove
197: ===========
198: */
199: void IN_MouseMove (usercmd_t *cmd)
200: {
201: int mx, my;
202: int mouse_x, mouse_y;
203:
204: IN_Accumulate ();
205:
206: mx = mx_accum;
207: my = my_accum;
208:
209: mx_accum = 0;
210: my_accum = 0;
211:
212: if (m_filter.value)
213: {
214: mouse_x = (mx + old_mouse_x) * 0.5;
215: mouse_y = (my + old_mouse_y) * 0.5;
216: }
217: else
218: {
219: mouse_x = mx;
220: mouse_y = my;
221: }
222:
223: old_mouse_x = mx;
224: old_mouse_y = my;
225:
226: if (!mx && !my)
227: return;
228:
229: if (!mouseactive)
230: return;
231:
232: mouse_x *= sensitivity.value;
233: mouse_y *= sensitivity.value;
234:
235: // add mouse X/Y movement to cmd
236: if ( (in_strafe.state & 1) || (lookstrafe.value && mlooking ))
237: cmd->sidemove += m_side.value * mouse_x;
238: else
239: cl.viewangles[YAW] -= m_yaw.value * mouse_x;
240:
241: if ( (mlooking || freelook.value) && !(in_strafe.state & 1))
242: {
243: cl.viewangles[PITCH] += m_pitch.value * mouse_y;
244: if (cl.viewangles[PITCH] > 80)
245: cl.viewangles[PITCH] = 80;
246: if (cl.viewangles[PITCH] < -70)
247: cl.viewangles[PITCH] = -70;
248: }
249: else
250: {
251: cmd->forwardmove -= m_forward.value * mouse_y;
252: }
253:
254: }
255:
256: void IN_ShowMouse (void)
257: {
258: PSshowcursor ();
259: }
260:
261: void IN_HideMouse (void)
262: {
263: PShidecursor ();
264: }
265:
266: NXEventHandle eventhandle;
267: NXMouseScaling oldscaling, newscaling;
268: NXMouseButton oldbutton;
269:
270: /*
271: =============
272: IN_Init
273: =============
274: */
275: void IN_Init (void)
276: {
277: Cvar_RegisterVariable (&in_mouse);
278: Cvar_RegisterVariable (&m_filter);
279: Cvar_RegisterVariable (&freelook);
280:
281: Cmd_AddCommand ("showmouse", IN_ShowMouse);
282: Cmd_AddCommand ("hidemouse", IN_HideMouse);
283:
284: IN_StartupMouse ();
285:
286: // open the event status driver
287: eventhandle = NXOpenEventStatus();
288: NXGetMouseScaling (eventhandle, &oldscaling);
289: NXSetMouseScaling (eventhandle, &newscaling);
290: oldbutton = NXMouseButtonEnabled (eventhandle);
291: NXEnableMouseButton (eventhandle, 2);
292: }
293:
294: /*
295: =============
296: IN_Shutdown
297: =============
298: */
299: void IN_Shutdown (void)
300: {
301: IN_DeactivateMouse ();
302:
303: // put mouse scaling back the way it was
304: NXSetMouseScaling (eventhandle, &oldscaling);
305: NXEnableMouseButton (eventhandle, oldbutton);
306: NXCloseEventStatus (eventhandle);
307: }
308:
309: void IN_Move (usercmd_t *cmd)
310: {
311: IN_MouseMove (cmd);
312: }
313:
314: void IN_Commands (void)
315: {
316: }
317:
318:
319: /*
320: =========================================================================
321:
322: VIEW CENTERING
323:
324: =========================================================================
325: */
326:
327: void V_StopPitchDrift (void)
328: {
329: cl.laststop = cl.time;
330: cl.nodrift = true;
331: cl.pitchvel = 0;
332: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.