예제 #1
0
파일: i_video.c 프로젝트: CaptainHIT/prboom
static void I_GetEvent(SDL_Event *Event)
{
  event_t event;

  switch (Event->type) {
  case SDL_KEYDOWN:
    event.type = ev_keydown;
    event.data1 = I_TranslateKey(&Event->key.keysym);
    D_PostEvent(&event);
    break;

  case SDL_KEYUP:
  {
    event.type = ev_keyup;
    event.data1 = I_TranslateKey(&Event->key.keysym);
    D_PostEvent(&event);
  }
  break;

  case SDL_MOUSEBUTTONDOWN:
  case SDL_MOUSEBUTTONUP:
  if (mouse_enabled) // recognise clicks even if the pointer isn't grabbed
  {
    event.type = ev_mouse;
    event.data1 = I_SDLtoDoomMouseState(SDL_GetMouseState(NULL, NULL));
    event.data2 = event.data3 = 0;
    D_PostEvent(&event);
  }
  break;

  case SDL_MOUSEMOTION:
  if (mouse_currently_grabbed) {
    event.type = ev_mouse;
    event.data1 = I_SDLtoDoomMouseState(Event->motion.state);
    event.data2 = Event->motion.xrel << 5;
    event.data3 = -Event->motion.yrel << 5;
    D_PostEvent(&event);
  }
  break;


  case SDL_QUIT:
    S_StartSound(NULL, sfx_swtchn);
    M_QuitDOOM(0);

  default:
    break;
  }
}
예제 #2
0
void D_DoomDeinit(void)
{
  lprintf(LO_INFO,"D_DoomDeinit:\n");
  //Deinit
  M_QuitDOOM(0);
  Z_Close();
#ifdef HAVE_NET
  D_QuitNetGame();
  I_ShutdownNetwork();
#endif
  M_SaveDefaults ();
  W_Exit();
  I_ShutdownSound();
  I_ShutdownMusic();
  p_checksum_cleanup();
}
예제 #3
0
static void I_GetEvent(void)
{
  // CPhipps - make this local
  XEvent	X_event;

  // put event-grabbing stuff in here
  XNextEvent(X_display, &X_event);
  switch (X_event.type) {
  case KeyPress:
    event.type = ev_keydown;
    event.data1 = I_XTranslateKey(&X_event);
    D_PostEvent(&event);
    // fprintf(stderr, "k");
    break;
  case KeyRelease:
    event.type = ev_keyup;
    event.data1 = I_XTranslateKey(&X_event);
    D_PostEvent(&event);
    // fprintf(stderr, "ku");
    break;
#ifndef POLL_POINTER
  case ButtonPress:
    event.data2 = event.data3 = 0;
    event.type = ev_mouse;
    buttons = event.data1 =
      (X_event.xbutton.state & Button1Mask ? 1 : 0)
      | (X_event.xbutton.state & Button2Mask ? 2 : 0)
      | (X_event.xbutton.state & Button3Mask ? 4 : 0)
      | (X_event.xbutton.button == Button1 ? 1 : 0)
      | (X_event.xbutton.button == Button2 ? 2 : 0)
      | (X_event.xbutton.button == Button3 ? 4 : 0);
    D_PostEvent(&event);
    break;
  case ButtonRelease:
    event.data2 = event.data3 = 0;
    event.type = ev_mouse;
    event.data1 =
      (X_event.xbutton.state & Button1Mask ? 1 : 0)
      | (X_event.xbutton.state & Button2Mask ? 2 : 0)
      | (X_event.xbutton.state & Button3Mask ? 4 : 0);
    // suggest parentheses around arithmetic in operand of |
    buttons = event.data1 =
      event.data1
      ^ (X_event.xbutton.button == Button1 ? 1 : 0)
      ^ (X_event.xbutton.button == Button2 ? 2 : 0)
      ^ (X_event.xbutton.button == Button3 ? 4 : 0);
    D_PostEvent(&event);
    break;
  case MotionNotify:
    event.type = ev_mouse;
    buttons =
      (X_event.xmotion.state & Button1Mask ? 1 : 0)
      | (X_event.xmotion.state & Button2Mask ? 2 : 0)
      | (X_event.xmotion.state & Button3Mask ? 4 : 0);
    newmouse.x = X_event.xmotion.x;
    newmouse.y = X_event.xmotion.y;
    
    break;
#endif	
#ifdef MONITOR_VISIBILITY
  case VisibilityNotify:
    vis_flag = X_event.xvisibility.state;
    break;
#endif
  case ClientMessage:
    // CPhipps - allow WM quit
    if (X_event.xclient.data.l[0] == X_deletewin) {
      S_StartSound(NULL, sfx_swtchn);
      M_QuitDOOM(0);
    }
    break;
  case Expose:
  case ConfigureNotify:
    break;
    
  default:
#ifdef HAVE_LIBXEXT
    if (doShm && X_event.type == X_shmeventtype) shmFinished = true;
#endif
    break;
  }
}
예제 #4
0
static void I_GetEvent(void)
{
  event_t event;

  SDL_Event SDLEvent;
  SDL_Event *Event = &SDLEvent;

  static int mwheeluptic = 0, mwheeldowntic = 0;

while (SDL_PollEvent(Event))
{
  switch (Event->type) {
  case SDL_KEYDOWN:
#ifdef MACOSX
    if (Event->key.keysym.mod & KMOD_META)
    {
      // Switch windowed<->fullscreen if pressed <Command-F>
      if (Event->key.keysym.sym == SDLK_f)
      {
        V_ToggleFullscreen();
        break;
      }
    }
#else
    if (Event->key.keysym.mod & KMOD_LALT)
    {
      // Prevent executing action on Alt-Tab
      if (Event->key.keysym.sym == SDLK_TAB)
      {
        break;
      }
      // Switch windowed<->fullscreen if pressed Alt-Enter
      else if (Event->key.keysym.sym == SDLK_RETURN)
      {
        V_ToggleFullscreen();
        break;
      }
    }
#endif
    event.type = ev_keydown;
    event.data1 = I_TranslateKey(&Event->key.keysym);
    D_PostEvent(&event);
    break;

  case SDL_KEYUP:
  {
    event.type = ev_keyup;
    event.data1 = I_TranslateKey(&Event->key.keysym);
    D_PostEvent(&event);
  }
  break;

  case SDL_MOUSEBUTTONDOWN:
  case SDL_MOUSEBUTTONUP:
  if (mouse_enabled && window_focused)
  {
    event.type = ev_mouse;
    event.data1 = I_SDLtoDoomMouseState(SDL_GetMouseState(NULL, NULL));
    event.data2 = event.data3 = 0;

    if (Event->type == SDL_MOUSEBUTTONDOWN)
    {
      switch(Event->button.button)
      {
      case SDL_BUTTON_WHEELUP:
        event.type = ev_keydown;
        event.data1 = KEYD_MWHEELUP;
        mwheeluptic = gametic;
        break;
      case SDL_BUTTON_WHEELDOWN:
        event.type = ev_keydown;
        event.data1 = KEYD_MWHEELDOWN;
        mwheeldowntic = gametic;
        break;
      }
    }

    D_PostEvent(&event);
  }
  break;

  //e6y: new mouse code
  case SDL_ACTIVEEVENT:
    UpdateFocus();
    break;
  
  case SDL_VIDEORESIZE:
    ApplyWindowResize(Event);
    break;

  case SDL_QUIT:
    S_StartSound(NULL, sfx_swtchn);
    M_QuitDOOM(0);

  default:
    break;
  }
}

  if(mwheeluptic && mwheeluptic + 1 < gametic)
  {
    event.type = ev_keyup;
    event.data1 = KEYD_MWHEELUP;
    D_PostEvent(&event);
    mwheeluptic = 0;
  }

  if(mwheeldowntic && mwheeldowntic + 1 < gametic)
  {
    event.type = ev_keyup;
    event.data1 = KEYD_MWHEELDOWN;
    D_PostEvent(&event);
    mwheeldowntic = 0;
  }
}
void I_GetEvent(void)
{
    SDL_Event sdlevent;
    event_t event;

    // possibly not needed
    
    SDL_PumpEvents();

    // put event-grabbing stuff in here
    
    while (SDL_PollEvent(&sdlevent))
    {
        // ignore mouse events when the window is not focused

        if (!window_focused 
         && (sdlevent.type == SDL_MOUSEMOTION
          || sdlevent.type == SDL_MOUSEBUTTONDOWN
          || sdlevent.type == SDL_MOUSEBUTTONUP))
        {
            continue;
        }

        if (screensaver_mode && sdlevent.type == SDL_QUIT)
        {
            I_Quit();
        }

        // process event
        
        switch (sdlevent.type)
        {
            case SDL_KEYDOWN:
                event.type = ev_keydown;
                event.data1 = TranslateKey(&sdlevent.key.keysym);

                // If Vanilla keyboard mapping enabled, the keyboard
                // scan code is used to give the character typed.
                // This does not change depending on keyboard layout.
                // If you have a German keyboard, pressing 'z' will
                // give 'y', for example.  It is desirable to be able
                // to fix this so that people with non-standard 
                // keyboard mappings can type properly.  If vanilla
                // mode is disabled, use the properly translated 
                // version.

                if (vanilla_keyboard_mapping)
                {
                    event.data2 = event.data1;
                }
                else
                {
                    event.data2 = sdlevent.key.keysym.unicode;
                }

                if (event.data1 != 0)
                {
                    D_PostEvent(&event);
                }
                break;

            case SDL_KEYUP:
                event.type = ev_keyup;
                event.data1 = TranslateKey(&sdlevent.key.keysym);

                if (event.data1 != 0)
                {
                    D_PostEvent(&event);
                }
                break;

                /*
            case SDL_MOUSEMOTION:
                event.type = ev_mouse;
                event.data1 = MouseButtonState();
                event.data2 = AccelerateMouse(sdlevent.motion.xrel);
                event.data3 = -AccelerateMouse(sdlevent.motion.yrel);
                D_PostEvent(&event);
                break;
                */

            case SDL_MOUSEBUTTONDOWN:
		if (usemouse && !nomouse)
		{
                    event.type = ev_mouse;
                    event.data1 = MouseButtonState();
                    event.data2 = event.data3 = 0;
                    D_PostEvent(&event);
		}
                break;

            case SDL_MOUSEBUTTONUP:
		if (usemouse && !nomouse)
		{
                    event.type = ev_mouse;
                    event.data1 = MouseButtonState();
                    event.data2 = event.data3 = 0;
                    D_PostEvent(&event);
		}
                break;

            case SDL_QUIT:
                // bring up the "quit doom?" prompt
                S_StartSound(NULL,sfx_swtchn);
                M_QuitDOOM(0);
                break;

            case SDL_ACTIVEEVENT:
                // need to update our focus state
                UpdateFocus();
                break;

            case SDL_VIDEOEXPOSE:
                palette_to_set = true;
                break;

            default:
                break;
        }
    }
}