From b0e9c29a0599314fb5b2b494b507124f87122a4b Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sat, 25 Jan 2025 12:43:37 +0100 Subject: [PATCH] SDL code tweaks (#177) * SDL code tweaks * more * more * more * more * more --- parallel-rdp/interface.cpp | 7 ++- src/main.rs | 2 +- src/netplay.rs | 21 ++++++--- src/ui.rs | 10 ++++ src/ui/gui.rs | 54 +++++++++------------- src/ui/input.rs | 95 ++++++++++++++++++-------------------- 6 files changed, 99 insertions(+), 90 deletions(-) diff --git a/parallel-rdp/interface.cpp b/parallel-rdp/interface.cpp index 3b8acc9..df9d276 100644 --- a/parallel-rdp/interface.cpp +++ b/parallel-rdp/interface.cpp @@ -157,7 +157,12 @@ bool sdl_event_filter(void *userdata, SDL_Event *event) void rdp_init(void *_window, GFX_INFO _gfx_info, bool _upscale, bool _integer_scaling, bool _fullscreen) { window = (SDL_Window *)_window; - SDL_AddEventWatch(sdl_event_filter, nullptr); + bool result = SDL_AddEventWatch(sdl_event_filter, nullptr); + if (!result) + { + printf("Could not add event watch.\n"); + return; + } gfx_info = _gfx_info; fullscreen = _fullscreen; diff --git a/src/main.rs b/src/main.rs index 9df8fe7..7902a9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -120,7 +120,7 @@ async fn main() { } } if args.list_controllers { - let controllers = gui::get_controller_names(); + let controllers = gui::get_controller_names(&device.ui); for (i, controller) in controllers.iter().enumerate() { println!("Controller {}: {}", i, controller); } diff --git a/src/netplay.rs b/src/netplay.rs index 57cceca..afcd5f7 100644 --- a/src/netplay.rs +++ b/src/netplay.rs @@ -220,15 +220,22 @@ pub fn init( gui_ctx: egui::Context, ) -> Netplay { peer_addr.set_port(session.port.unwrap() as u16); - let udp_socket = if peer_addr.is_ipv4() { - std::net::UdpSocket::bind((std::net::Ipv4Addr::UNSPECIFIED, 0)) - .expect("couldn't bind to address") + let udp_socket; + if peer_addr.is_ipv4() { + udp_socket = std::net::UdpSocket::bind((std::net::Ipv4Addr::UNSPECIFIED, 0)) + .expect("couldn't bind to address"); + socket2::SockRef::from(&udp_socket) + .set_tos(CS4 << 2) + .unwrap(); } else { - std::net::UdpSocket::bind((std::net::Ipv6Addr::UNSPECIFIED, 0)) - .expect("couldn't bind to address") + udp_socket = std::net::UdpSocket::bind((std::net::Ipv6Addr::UNSPECIFIED, 0)) + .expect("couldn't bind to address"); + #[cfg(not(target_os = "windows"))] + socket2::SockRef::from(&udp_socket) + .set_tclass_v6(CS4 << 2) + .unwrap(); }; - let socket_ref = socket2::SockRef::from(&udp_socket); - socket_ref.set_tos(CS4 << 2).unwrap(); + udp_socket.connect(peer_addr).unwrap(); udp_socket.set_nonblocking(true).unwrap(); diff --git a/src/ui.rs b/src/ui.rs index 15a75b9..bfd3e12 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -22,11 +22,14 @@ pub struct Ui { pub pak_audio_stream: *mut sdl3_sys::audio::SDL_AudioStream, pub audio_freq: f64, pub audio_device: u32, + pub num_joysticks: i32, + pub joysticks: *mut sdl3_sys::joystick::SDL_JoystickID, } impl Drop for Ui { fn drop(&mut self) { unsafe { + sdl3_sys::stdinc::SDL_free(self.joysticks as *mut std::ffi::c_void); sdl3_sys::init::SDL_Quit(); } write_config(self); @@ -50,6 +53,11 @@ pub fn sdl_init(flag: sdl3_sys::init::SDL_InitFlags) { impl Ui { pub fn new(config_dir: std::path::PathBuf) -> Ui { sdl_init(sdl3_sys::init::SDL_INIT_GAMEPAD); + let mut num_joysticks = 0; + let joysticks = unsafe { sdl3_sys::joystick::SDL_GetJoysticks(&mut num_joysticks) }; + if joysticks.is_null() { + panic!("Could not get joystick list"); + } let config_file_path = config_dir.join("config.json"); let config_file = std::fs::read(config_file_path.clone()); @@ -113,6 +121,8 @@ impl Ui { pak_audio_stream: std::ptr::null_mut(), audio_freq: 0.0, audio_device: 0, + num_joysticks, + joysticks, } } } diff --git a/src/ui/gui.rs b/src/ui/gui.rs index dee758a..4b00dbb 100644 --- a/src/ui/gui.rs +++ b/src/ui/gui.rs @@ -46,43 +46,35 @@ fn get_input_profiles(game_ui: &ui::Ui) -> Vec { profiles } -pub fn get_controller_names() -> Vec { +pub fn get_controller_names(game_ui: &ui::Ui) -> Vec { let mut controllers: Vec = vec![]; - let mut joystick_count = 0; - let joysticks = unsafe { sdl3_sys::joystick::SDL_GetJoysticks(&mut joystick_count) }; - if !joysticks.is_null() { - for offset in 0..joystick_count as isize { - let name = unsafe { - std::ffi::CStr::from_ptr(sdl3_sys::joystick::SDL_GetJoystickNameForID( - *(joysticks.offset(offset)), - )) - }; - controllers.push(name.to_string_lossy().to_string()); - } - unsafe { sdl3_sys::stdinc::SDL_free(joysticks as *mut std::ffi::c_void) }; + for offset in 0..game_ui.num_joysticks as isize { + let name = unsafe { + std::ffi::CStr::from_ptr(sdl3_sys::joystick::SDL_GetJoystickNameForID( + *(game_ui.joysticks.offset(offset)), + )) + }; + controllers.push(name.to_string_lossy().to_string()); } + controllers } -pub fn get_controller_paths() -> Vec { +pub fn get_controller_paths(game_ui: &ui::Ui) -> Vec { let mut controller_paths: Vec = vec![]; - let mut joystick_count = 0; - let joysticks = unsafe { sdl3_sys::joystick::SDL_GetJoysticks(&mut joystick_count) }; - if !joysticks.is_null() { - for offset in 0..joystick_count as isize { - let path = unsafe { - std::ffi::CStr::from_ptr(sdl3_sys::joystick::SDL_GetJoystickPathForID( - *(joysticks.offset(offset)), - )) - .to_string_lossy() - .to_string() - }; - controller_paths.push(path); - } - unsafe { sdl3_sys::stdinc::SDL_free(joysticks as *mut std::ffi::c_void) }; + for offset in 0..game_ui.num_joysticks as isize { + let path = unsafe { + std::ffi::CStr::from_ptr(sdl3_sys::joystick::SDL_GetJoystickPathForID( + *(game_ui.joysticks.offset(offset)), + )) + .to_string_lossy() + .to_string() + }; + controller_paths.push(path); } + controller_paths } @@ -95,7 +87,7 @@ impl GopherEguiApp { ) -> GopherEguiApp { add_japanese_font(&cc.egui_ctx); let game_ui = ui::Ui::new(config_dir.clone()); - let controller_paths = get_controller_paths(); + let controller_paths = get_controller_paths(&game_ui); let mut selected_controller = [-1, -1, -1, -1]; for (pos, item) in game_ui @@ -122,7 +114,7 @@ impl GopherEguiApp { profile_name: "".to_string(), selected_profile: game_ui.config.input.input_profile_binding.clone(), selected_controller, - controller_names: get_controller_names(), + controller_names: get_controller_names(&game_ui), input_profiles: get_input_profiles(&game_ui), controller_enabled: game_ui.config.input.controller_enabled, upscale: game_ui.config.video.upscale, @@ -141,7 +133,7 @@ impl GopherEguiApp { } fn save_config(game_ui: &mut ui::Ui, save_config_items: SaveConfig) { - let controller_paths = get_controller_paths(); + let controller_paths = get_controller_paths(game_ui); for (pos, item) in save_config_items.selected_controller.iter().enumerate() { if *item != -1 { game_ui.config.input.controller_assignment[pos] = diff --git a/src/ui/input.rs b/src/ui/input.rs index 0846820..df17579 100644 --- a/src/ui/input.rs +++ b/src/ui/input.rs @@ -373,22 +373,17 @@ pub fn get(ui: &mut ui::Ui, channel: usize) -> (u32, bool) { } pub fn assign_controller(ui: &mut ui::Ui, controller: i32, port: usize) { - let mut joystick_count = 0; - let joysticks = unsafe { sdl3_sys::joystick::SDL_GetJoysticks(&mut joystick_count) }; - if !joysticks.is_null() { - if controller < joystick_count { - let path = unsafe { - std::ffi::CStr::from_ptr(sdl3_sys::joystick::SDL_GetJoystickPathForID( - *(joysticks.offset(controller as isize)), - )) - .to_string_lossy() - .to_string() - }; - ui.config.input.controller_assignment[port - 1] = Some(path); - } else { - println!("Invalid controller number") - } - unsafe { sdl3_sys::stdinc::SDL_free(joysticks as *mut std::ffi::c_void) }; + if controller < ui.num_joysticks { + let path = unsafe { + std::ffi::CStr::from_ptr(sdl3_sys::joystick::SDL_GetJoystickPathForID( + *(ui.joysticks.offset(controller as isize)), + )) + .to_string_lossy() + .to_string() + }; + ui.config.input.controller_assignment[port - 1] = Some(path); + } else { + println!("Invalid controller number") } } @@ -433,25 +428,20 @@ pub fn configure_input_profile(ui: &mut ui::Ui, profile: String, dinput: bool) { let mut open_joysticks: Vec<*mut sdl3_sys::joystick::SDL_Joystick> = Vec::new(); let mut open_controllers: Vec<*mut sdl3_sys::gamepad::SDL_Gamepad> = Vec::new(); - let mut joystick_count = 0; - let joysticks = unsafe { sdl3_sys::joystick::SDL_GetJoysticks(&mut joystick_count) }; - if !joysticks.is_null() { - for offset in 0..joystick_count as isize { - if !dinput { - let controller = - unsafe { sdl3_sys::gamepad::SDL_OpenGamepad(*joysticks.offset(offset)) }; - if !controller.is_null() { - open_controllers.push(controller); - } - } else { - let joystick = - unsafe { sdl3_sys::joystick::SDL_OpenJoystick(*joysticks.offset(offset)) }; - if !joystick.is_null() { - open_joysticks.push(joystick); - } + for offset in 0..ui.num_joysticks as isize { + if !dinput { + let controller = + unsafe { sdl3_sys::gamepad::SDL_OpenGamepad(*ui.joysticks.offset(offset)) }; + if !controller.is_null() { + open_controllers.push(controller); + } + } else { + let joystick = + unsafe { sdl3_sys::joystick::SDL_OpenJoystick(*ui.joysticks.offset(offset)) }; + if !joystick.is_null() { + open_joysticks.push(joystick); } } - unsafe { sdl3_sys::stdinc::SDL_free(joysticks as *mut std::ffi::c_void) }; } let title = std::ffi::CString::new("configure input profile").unwrap(); @@ -709,6 +699,9 @@ pub fn get_default_profile() -> ui::config::InputProfile { pub fn init(ui: &mut ui::Ui) { ui.keyboard_state = unsafe { sdl3_sys::keyboard::SDL_GetKeyboardState(std::ptr::null_mut()) }; + if ui.keyboard_state.is_null() { + panic!("Could not get keyboard state"); + } let mut taken = [false; 4]; for i in 0..4 { @@ -717,25 +710,21 @@ pub fn init(ui: &mut ui::Ui) { let mut joystick_id = 0; let assigned_path = controller_assignment.as_ref().unwrap(); - let mut joystick_count = 0; - let joysticks = unsafe { sdl3_sys::joystick::SDL_GetJoysticks(&mut joystick_count) }; - if !joysticks.is_null() { - for offset in 0..joystick_count as isize { - let path = unsafe { - std::ffi::CStr::from_ptr(sdl3_sys::joystick::SDL_GetJoystickPathForID( - *(joysticks.offset(offset)), - )) - .to_string_lossy() - .to_string() - }; - if path == *assigned_path && !taken[offset as usize] { - joystick_id = unsafe { *(joysticks.offset(offset)) }; - taken[offset as usize] = true; - break; - } + for offset in 0..ui.num_joysticks as isize { + let path = unsafe { + std::ffi::CStr::from_ptr(sdl3_sys::joystick::SDL_GetJoystickPathForID( + *(ui.joysticks.offset(offset)), + )) + .to_string_lossy() + .to_string() + }; + if path == *assigned_path && !taken[offset as usize] { + joystick_id = unsafe { *(ui.joysticks.offset(offset)) }; + taken[offset as usize] = true; + break; } - unsafe { sdl3_sys::stdinc::SDL_free(joysticks as *mut std::ffi::c_void) }; } + if joystick_id != 0 { let profile_name = ui.config.input.input_profile_binding[i].clone(); let profile = ui.config.input.input_profiles.get(&profile_name).unwrap(); @@ -748,6 +737,9 @@ pub fn init(ui: &mut ui::Ui) { ui.controllers[i].game_controller = gamepad; let properties = unsafe { sdl3_sys::gamepad::SDL_GetGamepadProperties(gamepad) }; + if properties == 0 { + println!("could not get gamepad properties"); + } ui.controllers[i].rumble = unsafe { sdl3_sys::properties::SDL_GetBooleanProperty( properties, @@ -764,6 +756,9 @@ pub fn init(ui: &mut ui::Ui) { ui.controllers[i].joystick = joystick; let properties = unsafe { sdl3_sys::joystick::SDL_GetJoystickProperties(joystick) }; + if properties == 0 { + println!("could not get joystick properties"); + } ui.controllers[i].rumble = unsafe { sdl3_sys::properties::SDL_GetBooleanProperty( properties,