123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- // in_next.m
- #import <AppKit/AppKit.h>
- #import <drivers/event_status_driver.h>
- #include "../client/client.h"
- float mousex, mousey;
- float mouse_center_x = 160;
- float mouse_center_y = 100;
- void PSsetmouse (float x, float y);
- void PSshowcursor (void);
- void PShidecursor (void);
- void PScurrentmouse (int win, float *x, float *y);
- extern NSView *vid_view_i;
- extern NSWindow *vid_window_i;
- qboolean mlooking;
- qboolean mouseinitialized;
- int mouse_buttons;
- int mouse_oldbuttonstate;
- int mouseactive;
- int mousereset;
- int mx_accum, my_accum;
- int window_center_x, window_center_y;
- int old_mouse_x, old_mouse_y;
- cvar_t in_mouse = {"in_mouse", "0", CVAR_ARCHIVE};
- cvar_t m_filter = {"m_filter", "0", CVAR_ARCHIVE};
- cvar_t freelook = {"in_freelook", "0", CVAR_ARCHIVE};
- /*
- ===========
- IN_ActivateMouse
- Called when the window gains focus or changes in some way
- ===========
- */
- void IN_ActivateMouse (void)
- {
- NSRect r;
-
- if (!mouseinitialized)
- return;
- if (!in_mouse.value)
- return;
- r = [vid_window_i frame];
- window_center_x = r.size.width / 2;
- window_center_y = r.size.height / 2;
- if (!mouseactive)
- PShidecursor ();
-
- mouseactive = true;
- mousereset = true;
- }
- /*
- ===========
- IN_DeactivateMouse
- Called when the window loses focus
- ===========
- */
- void IN_DeactivateMouse (void)
- {
- if (!mouseinitialized)
- return;
- if (mouseactive)
- PSshowcursor ();
- mouseactive = false;
- }
- /*
- ===========
- IN_StartupMouse
- ===========
- */
- void IN_StartupMouse (void)
- {
- if ( COM_CheckParm ("-nomouse") )
- return;
- mouseinitialized = true;
- mouse_buttons = 3;
- IN_ActivateMouse ();
- }
- /*
- ===========
- IN_MouseEvent
- ===========
- */
- void IN_MouseEvent (int mstate)
- {
- int i;
- if (!mouseactive)
- return;
- // perform button actions
- for (i=0 ; i<mouse_buttons ; i++)
- {
- if ( (mstate & (1<<i)) &&
- !(mouse_oldbuttonstate & (1<<i)) )
- {
- Key_Event (K_MOUSE1 + i, true);
- }
- if ( !(mstate & (1<<i)) &&
- (mouse_oldbuttonstate & (1<<i)) )
- {
- Key_Event (K_MOUSE1 + i, false);
- }
- }
- mouse_oldbuttonstate = mstate;
- }
- /*
- ===========
- IN_Accumulate
- ===========
- */
- void IN_Accumulate (void)
- {
- int dx, dy;
- static int old_x, old_y;
- if (!mouseinitialized)
- return;
- if (in_mouse.modified)
- {
- in_mouse.modified = false;
- IN_DeactivateMouse ();
- IN_ActivateMouse ();
- }
- if (!mouseactive)
- return;
- // [vid_view_i lockFocus];
- if (mousereset)
- { // we haven't centered cursor yet
- mousereset = false;
- }
- else
- {
- NSPoint p;
- PScurrentmouse ([vid_window_i windowNumber], &mousex, &mousey);
- p.x = mousex;
- p.y = mousey;
- p = [vid_view_i convertPoint:p fromView: nil];
- mousex = p.x;
- mousey = p.y;
-
- dx = mousex - old_x;
- dy = old_y - mousey;
- if (!dx && !dy)
- return;
- mx_accum += dx;
- my_accum += dy;
- }
- // force the mouse to the center, so there's room to move
- PSsetmouse (window_center_x, window_center_y);
- PScurrentmouse ([vid_window_i windowNumber], &mousex, &mousey);
- // PSsetmouse (window_center_x, window_center_y);
- old_x = window_center_x;
- old_y = window_center_y;
- // [vid_view_i unlockFocus];
- }
- /*
- ===========
- IN_MouseMove
- ===========
- */
- void IN_MouseMove (usercmd_t *cmd)
- {
- int mx, my;
- int mouse_x, mouse_y;
-
- IN_Accumulate ();
- mx = mx_accum;
- my = my_accum;
- mx_accum = 0;
- my_accum = 0;
- if (m_filter.value)
- {
- mouse_x = (mx + old_mouse_x) * 0.5;
- mouse_y = (my + old_mouse_y) * 0.5;
- }
- else
- {
- mouse_x = mx;
- mouse_y = my;
- }
- old_mouse_x = mx;
- old_mouse_y = my;
- if (!mx && !my)
- return;
- if (!mouseactive)
- return;
- mouse_x *= sensitivity.value;
- mouse_y *= sensitivity.value;
- // add mouse X/Y movement to cmd
- if ( (in_strafe.state & 1) || (lookstrafe.value && mlooking ))
- cmd->sidemove += m_side.value * mouse_x;
- else
- cl.viewangles[YAW] -= m_yaw.value * mouse_x;
- if ( (mlooking || freelook.value) && !(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
- {
- cmd->forwardmove -= m_forward.value * mouse_y;
- }
- }
- void IN_ShowMouse (void)
- {
- PSshowcursor ();
- }
- void IN_HideMouse (void)
- {
- PShidecursor ();
- }
- NXEventHandle eventhandle;
- NXMouseScaling oldscaling, newscaling;
- NXMouseButton oldbutton;
- /*
- =============
- IN_Init
- =============
- */
- void IN_Init (void)
- {
- Cvar_RegisterVariable (&in_mouse);
- Cvar_RegisterVariable (&m_filter);
- Cvar_RegisterVariable (&freelook);
- Cmd_AddCommand ("showmouse", IN_ShowMouse);
- Cmd_AddCommand ("hidemouse", IN_HideMouse);
-
- IN_StartupMouse ();
- // open the event status driver
- eventhandle = NXOpenEventStatus();
- NXGetMouseScaling (eventhandle, &oldscaling);
- NXSetMouseScaling (eventhandle, &newscaling);
- oldbutton = NXMouseButtonEnabled (eventhandle);
- NXEnableMouseButton (eventhandle, 2);
- }
- /*
- =============
- IN_Shutdown
- =============
- */
- void IN_Shutdown (void)
- {
- IN_DeactivateMouse ();
- // put mouse scaling back the way it was
- NXSetMouseScaling (eventhandle, &oldscaling);
- NXEnableMouseButton (eventhandle, oldbutton);
- NXCloseEventStatus (eventhandle);
- }
- void IN_Move (usercmd_t *cmd)
- {
- IN_MouseMove (cmd);
- }
- void IN_Commands (void)
- {
- }
- /*
- =========================================================================
- VIEW CENTERING
- =========================================================================
- */
- void V_StopPitchDrift (void)
- {
- cl.laststop = cl.time;
- cl.nodrift = true;
- cl.pitchvel = 0;
- }
|