Only pass mouse/keyboard to dethrace when the current window is DethRace (#404)
This is useful when opening a 2nd SDL window to avoid events of the other window leaking into carmageddon (and the reverse).
This commit is contained in:
parent
a25ee50e94
commit
cd64d99512
|
@ -39,11 +39,15 @@ option(DETHRACE_WERROR "Treat warnings as errors")
|
||||||
option(DETHRACE_FIX_BUGS "Fix Dethrace bugs" ON)
|
option(DETHRACE_FIX_BUGS "Fix Dethrace bugs" ON)
|
||||||
|
|
||||||
function(add_compile_flag_if_supported TARGET FLAG)
|
function(add_compile_flag_if_supported TARGET FLAG)
|
||||||
|
cmake_parse_arguments(ARGS "" "" "LANGUAGES" ${ARGN})
|
||||||
|
if(NOT ARGS_LANGUAGES)
|
||||||
|
set(ARGS_LANGUAGES C CXX)
|
||||||
|
endif()
|
||||||
string(MAKE_C_IDENTIFIER "${FLAG}" FLAG_TO_IDENTIFIER)
|
string(MAKE_C_IDENTIFIER "${FLAG}" FLAG_TO_IDENTIFIER)
|
||||||
set(HAVE_FLAG_VARIABLE_NAME "HAVE_${FLAG_TO_IDENTIFIER}")
|
set(HAVE_FLAG_VARIABLE_NAME "HAVE_${FLAG_TO_IDENTIFIER}")
|
||||||
check_c_compiler_flag("${FLAG}" "${HAVE_FLAG_VARIABLE_NAME}")
|
check_c_compiler_flag("${FLAG}" "${HAVE_FLAG_VARIABLE_NAME}")
|
||||||
if(${HAVE_FLAG_VARIABLE_NAME})
|
if(${HAVE_FLAG_VARIABLE_NAME})
|
||||||
target_compile_options("${TARGET}" PRIVATE "${FLAG}")
|
target_compile_options("${TARGET}" PRIVATE "$<$<COMPILE_LANGUAGE:${ARGS_LANGUAGES}>:${FLAG}>")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,7 @@ if(NOT MSVC)
|
||||||
-Wextra
|
-Wextra
|
||||||
-Wno-unused-parameter
|
-Wno-unused-parameter
|
||||||
)
|
)
|
||||||
add_compile_flags_if_supported(harness
|
add_compile_flag_if_supported(harness -Wstrict-prototypes LANGUAGES C)
|
||||||
-Wstrict-prototypes
|
|
||||||
)
|
|
||||||
else()
|
else()
|
||||||
target_compile_definitions(harness PRIVATE -D_CRT_SECURE_NO_WARNINGS)
|
target_compile_definitions(harness PRIVATE -D_CRT_SECURE_NO_WARNINGS)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -90,6 +90,9 @@ static int get_and_handle_message(MSG_* msg) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
|
if (event.key.windowID != SDL_GetWindowID(window)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (event.key.keysym.sym == SDLK_RETURN) {
|
if (event.key.keysym.sym == SDLK_RETURN) {
|
||||||
if (event.key.type == SDL_KEYDOWN) {
|
if (event.key.type == SDL_KEYDOWN) {
|
||||||
if ((event.key.keysym.mod & (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_GUI))) {
|
if ((event.key.keysym.mod & (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_GUI))) {
|
||||||
|
@ -115,6 +118,15 @@ static int get_and_handle_message(MSG_* msg) {
|
||||||
directinput_key_state[dinput_key] = (event.type == SDL_KEYDOWN ? 0x80 : 0);
|
directinput_key_state[dinput_key] = (event.type == SDL_KEYDOWN ? 0x80 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SDL_WINDOWEVENT:
|
||||||
|
if (event.window.event == SDL_WINDOWEVENT_CLOSE) {
|
||||||
|
if (SDL_GetWindowID(window) == event.window.windowID) {
|
||||||
|
msg->message = WM_QUIT;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
msg->message = WM_QUIT;
|
msg->message = WM_QUIT;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -128,6 +140,11 @@ static void get_keyboard_state(unsigned int count, uint8_t* buffer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_mouse_buttons(int* pButton1, int* pButton2) {
|
static int get_mouse_buttons(int* pButton1, int* pButton2) {
|
||||||
|
if (SDL_GetMouseFocus() != window) {
|
||||||
|
*pButton1 = 0;
|
||||||
|
*pButton2 = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int state = SDL_GetMouseState(NULL, NULL);
|
int state = SDL_GetMouseState(NULL, NULL);
|
||||||
*pButton1 = state & SDL_BUTTON_LMASK;
|
*pButton1 = state & SDL_BUTTON_LMASK;
|
||||||
*pButton2 = state & SDL_BUTTON_RMASK;
|
*pButton2 = state & SDL_BUTTON_RMASK;
|
||||||
|
@ -136,6 +153,9 @@ static int get_mouse_buttons(int* pButton1, int* pButton2) {
|
||||||
|
|
||||||
static int get_mouse_position(int* pX, int* pY) {
|
static int get_mouse_position(int* pX, int* pY) {
|
||||||
float lX, lY;
|
float lX, lY;
|
||||||
|
if (SDL_GetMouseFocus() != window) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
SDL_GetMouseState(pX, pY);
|
SDL_GetMouseState(pX, pY);
|
||||||
SDL_RenderWindowToLogical(renderer, *pX, *pY, &lX, &lY);
|
SDL_RenderWindowToLogical(renderer, *pX, *pY, &lX, &lY);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue