SDL2窗口以相对鼠标模式启动/输入事件

时间:2017-03-10 11:31:34

标签: c++ mouseevent sdl-2

我在我的应用程序中使用SDL 2.0.5(Win10 x64 vc12),我在其中实现了以下行为:

  • 使用光标逼近窗口的左边缘:将鼠标模式设置为相对
  • 右键单击:切换鼠标相对模式并将鼠标置于中心
  • 跟踪窗口离开/输入事件(想要对它们构建进一步的操作)

完整的代码是

#include <SDL.h>
#include <SDL_syswm.h>
#include <chrono>
#include <iostream>
#include <thread>

SDL_Window *sdl_window = NULL;

int EventFilter(void *userdata, SDL_Event *event) {
  switch (event->type) {
    case SDL_WINDOWEVENT: {
      SDL_WindowEvent e = event->window;
      switch (e.event) {
        case SDL_WINDOWEVENT_ENTER:
          std::cout << "window enter\n";
          break;
        case SDL_WINDOWEVENT_LEAVE:
          std::cout << "window leave\n";
          break;
        default:
          break;
      }
      break;
    }
    case SDL_MOUSEMOTION: {
      SDL_MouseMotionEvent e = event->motion;
      std::cout << e.x << ", " << e.y << std::endl;
      if (e.x < 20) {
        std::cout << "relative mode ON\n";
        SDL_SetRelativeMouseMode(SDL_TRUE);
        SDL_PumpEvents();
        SDL_FlushEvent(SDL_WINDOWEVENT_LEAVE);
      }
      break;
    }
    case SDL_MOUSEBUTTONDOWN: {
      SDL_MouseButtonEvent e = event->button;
      if (e.button == SDL_BUTTON_RIGHT) {
        SDL_SetRelativeMouseMode(SDL_GetRelativeMouseMode() ? SDL_FALSE
                                                            : SDL_TRUE);
        if (!SDL_GetRelativeMouseMode())
          SDL_WarpMouseInWindow(sdl_window, 800 / 2, 600 / 2);
      }
      break;
    }
    default:
      break;
  }
  return 1;
}

int main(int argc, char *argv[]) {
  SDL_Init(SDL_INIT_VIDEO);
  SDL_AddEventWatch(EventFilter, NULL);
  sdl_window = SDL_CreateWindow(
      "test", SDL_WINDOWPOS_CENTERED_DISPLAY(1),
      SDL_WINDOWPOS_CENTERED_DISPLAY(1), 800, 600,
      SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN | SDL_WINDOW_INPUT_FOCUS);

  while (1) {
    SDL_PumpEvents();
    std::this_thread::sleep_for(std::chrono::milliseconds(20));
  }
  return 0;
}

使用当前设置,如果我将光标移动到窗口的左边缘快速,它会用完窗口并报告以下事件:

relative mode ON
window leave

怎么可能?对我来说这似乎是一个无效的状态。设置相对鼠标模式后,它不应该离开窗口。我只能通过不对焦/聚焦我的窗口继续使用我的应用程序,这显然不太理想。

我该如何解决或解决这种情况?任何建议表示赞赏!

正如您所看到的,我在设置相对模式后尝试手动刷新窗口离开事件但没有任何更改。

我还尝试在我的循环中使用SDL_PollEvent,导致状态无效,但以不同的方式:它报告了

relative mode ON
window leave
window enter

之后我还没有收到任何窗口离开/输入事件

0 个答案:

没有答案