SDL code tweaks (#177)

* SDL code tweaks

* more

* more

* more

* more

* more
This commit is contained in:
Logan McNaughton 2025-01-25 12:43:37 +01:00 committed by GitHub
parent 02c8661b4e
commit b0e9c29a05
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 99 additions and 90 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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();

View File

@ -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,
}
}
}

View File

@ -46,43 +46,35 @@ fn get_input_profiles(game_ui: &ui::Ui) -> Vec<String> {
profiles
}
pub fn get_controller_names() -> Vec<String> {
pub fn get_controller_names(game_ui: &ui::Ui) -> Vec<String> {
let mut controllers: Vec<String> = 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<String> {
pub fn get_controller_paths(game_ui: &ui::Ui) -> Vec<String> {
let mut controller_paths: Vec<String> = 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] =

View File

@ -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,