Пример #1
0
//
// UpdateGrab (From chocolate-doom)
//
static void UpdateGrab(void)
{
	bool grab = MouseShouldBeGrabbed();

	if (grab && !mousegrabbed)
	{
		SetCursorState(false);
		SDL_WM_GrabInput(SDL_GRAB_ON);
		
		// Warp the mouse back to the middle of the screen
		if(screen)
			SDL_WarpMouse(screen->width/ 2, screen->height / 2);
		
		// eat all pending input from outside the game
		SDL_Event ev;
		while (SDL_PollEvent(&ev));
	}
	else if (!grab && mousegrabbed)
	{
		SetCursorState(true);
		SDL_WM_GrabInput(SDL_GRAB_OFF);
	}

	mousegrabbed = grab;
}
Пример #2
0
//
// UpdateGrab (From chocolate-doom)
//
static void UpdateGrab(void)
{
	bool grab = MouseShouldBeGrabbed();

	if (grab && !mousegrabbed)
	{
		SetCursorState(false);
		SDL_WM_GrabInput(SDL_GRAB_ON);
		
		// Warp the mouse back to the middle of the screen
		if(screen)
			SDL_WarpMouse(screen->width/ 2, screen->height / 2);
	
		I_FlushInput();	
	}
	else if (!grab && mousegrabbed)
	{
		SetCursorState(true);
		SDL_WM_GrabInput(SDL_GRAB_OFF);
	}

	#if defined WIN32 && !defined _XBOX
    if (Args.CheckParm ("-gdi"))
	{
        if (grab)
            FixGDIMouseInput();
        else
            RestoreGDIMouseSettings();
    }
    #endif

	mousegrabbed = grab;
}
Пример #3
0
void CMouseBehaviour::UpdateCursor (void)
{
	if (   m_bCursorOn
	    && m_bHasMoved)
	{
		m_bHasMoved = FALSE;

		SetCursorState (m_nPosX, m_nPosY, TRUE);
	}
}
Пример #4
0
boolean CMouseBehaviour::ShowCursor (boolean bShow)
{
	boolean bResult = m_bCursorOn;
	m_bCursorOn = bShow;

	assert (m_nPosX < m_nScreenWidth);
	assert (m_nPosY < m_nScreenHeight);
	SetCursorState (m_nPosX, m_nPosY, m_bCursorOn);

	return bResult;
}
Пример #5
0
//
// I_ResumeMouse
//
void I_ResumeMouse (void)
{
   if(havefocus)
   {
      GrabMouse();
      SetCursorState(false);

      // denis - disable key repeats as they mess with the mouse in XP
      SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL);
   }
   mousepaused = false;
}
Пример #6
0
void I_PauseMouse (void)
{
   // denis - disable key repeats as they mess with the mouse in XP
   SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);

   if (fullscreen)
    return;
   
   UngrabMouse();
   SetCursorState(true);
   
   mousepaused = true;
}
Пример #7
0
//
// UpdateGrab (From chocolate-doom)
//
static void UpdateGrab(void)
{
    bool grab;

    grab = MouseShouldBeGrabbed();

    if (grab && !mousegrabbed)
    {
	   if(screen)
		  SDL_WarpMouse(screen->width/ 2, screen->height / 2);

        SetCursorState(false);
        SDL_WM_GrabInput(SDL_GRAB_ON);
        flushmouse = true;
    }
    else if (!grab && mousegrabbed)
    {
        SetCursorState(true);
        SDL_WM_GrabInput(SDL_GRAB_OFF);
    }

    mousegrabbed = grab;
}
Пример #8
0
boolean CMouseBehaviour::SetCursor (unsigned nPosX, unsigned nPosY)
{
	assert (m_nScreenWidth > 0);
	assert (m_nScreenHeight > 0);
	if (   nPosX >= m_nScreenWidth
	    || nPosY >= m_nScreenHeight)
	{
		return FALSE;
	}

	m_nPosX = nPosX;
	m_nPosY = nPosY;

	if (!m_bCursorOn)
	{
		return TRUE;
	}

	return SetCursorState (m_nPosX, m_nPosY, TRUE);
}
Пример #9
0
//
// I_GetEvent
//
void I_GetEvent (void)
{
   event_t event;
   event_t mouseevent = {ev_mouse, 0, 0, 0};
   static int mbuttons = 0;
   int sendmouseevent = 0;

   SDL_Event ev;
   
   if (!(SDL_GetAppState()&SDL_APPINPUTFOCUS) && havefocus)
   {
      havefocus = false;
      UngrabMouse();
      SetCursorState(true);
   }
   else if((SDL_GetAppState()&SDL_APPINPUTFOCUS) && !havefocus)
   {
      havefocus = true;
      if(!mousepaused)
         I_ResumeMouse();
   }

   while(SDL_PollEvent(&ev))
   {
      event.data1 = event.data2 = event.data3 = 0;
      switch(ev.type)
      {
         case SDL_QUIT:
            AddCommandString("quit");
            break;
         case SDL_KEYDOWN:
            event.type = ev_keydown;
            event.data1 = ev.key.keysym.sym;
            if(event.data1 >= SDLK_KP0 && event.data1 <= SDLK_KP9)
               event.data2 = event.data3 = '0' + (event.data1 - SDLK_KP0);
            else if(event.data1 == SDLK_KP_PERIOD)
               event.data2 = event.data3 = '.';
            else if(event.data1 == SDLK_KP_DIVIDE)
               event.data2 = event.data3 = '/';
            else if(event.data1 == SDLK_KP_ENTER)
               event.data2 = event.data3 = '\r';
            else if ( (ev.key.keysym.unicode & 0xFF80) == 0 ) 
               event.data2 = event.data3 = ev.key.keysym.unicode;
            else
               event.data2 = event.data3 = 0;

#ifdef WIN32
            // SoM: Ignore the tab portion of alt-tab presses
            if(event.data1 == SDLK_TAB && SDL_GetModState() & (KMOD_LALT | KMOD_RALT))
               event.data1 = event.data2 = event.data3 = 0;
            else
#endif
            D_PostEvent(&event);
            break;
         case SDL_KEYUP:
            event.type = ev_keyup;
            event.data1 = ev.key.keysym.sym;
            if ( (ev.key.keysym.unicode & 0xFF80) == 0 ) 
               event.data2 = event.data3 = ev.key.keysym.unicode;
            else
               event.data2 = event.data3 = 0;
            D_PostEvent(&event);
            break;
         case SDL_MOUSEMOTION:
            if(flushmouse)
            {
               flushmouse = false;
               break;
            }
			// denis - ignore artificially inserted events (see SDL_WarpMouse below)
			if(ev.motion.x == screen->width/2 &&
			   ev.motion.y == screen->height/2)
			{
				break;
			}
            mouseevent.data2 += AccelerateMouse(ev.motion.xrel);
            mouseevent.data3 -= AccelerateMouse(ev.motion.yrel);
            sendmouseevent = 1;
            break;
         case SDL_MOUSEBUTTONDOWN:
            if(nomouse)
		break;
            event.type = ev_keydown;
            if(ev.button.button == SDL_BUTTON_LEFT)
            {
               event.data1 = KEY_MOUSE1;
               mbuttons |= 1;
            }
            else if(ev.button.button == SDL_BUTTON_RIGHT)
            {
               event.data1 = KEY_MOUSE2;
               mbuttons |= 2;
            }
            else if(ev.button.button == SDL_BUTTON_MIDDLE)
            {
               event.data1 = KEY_MOUSE3;
               mbuttons |= 4;
            }
            else if(ev.button.button == SDL_BUTTON_WHEELUP)
               event.data1 = KEY_MWHEELUP;
            else if(ev.button.button == SDL_BUTTON_WHEELDOWN)
               event.data1 = KEY_MWHEELDOWN;

			D_PostEvent(&event);
            break; 
         case SDL_MOUSEBUTTONUP:
            if(nomouse)
		break;
            event.type = ev_keyup;
            if(ev.button.button == SDL_BUTTON_LEFT)
            {
               event.data1 = KEY_MOUSE1;
               mbuttons &= ~1;
            }
            else if(ev.button.button == SDL_BUTTON_RIGHT)
            {
               event.data1 = KEY_MOUSE2;
               mbuttons &= ~2;
            }
            else if(ev.button.button == SDL_BUTTON_MIDDLE)
            {
               event.data1 = KEY_MOUSE3;
               mbuttons &= ~4;
            }
            else if(ev.button.button == SDL_BUTTON_WHEELUP)
               event.data1 = KEY_MWHEELUP;
            else if(ev.button.button == SDL_BUTTON_WHEELDOWN)
               event.data1 = KEY_MWHEELDOWN;

			D_PostEvent(&event);
            break;
      };
   }

   if(!nomouse)
   {
       if(sendmouseevent)
       {
          mouseevent.data1 = mbuttons;
          D_PostEvent(&mouseevent);
       }
       
       if(mousegrabbed && screen)
       {
          SDL_WarpMouse(screen->width/ 2, screen->height / 2);
       }
   }
}