#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlatformSyncMode {
X11,
OpenGL,
Auto,
}
pub struct PlatformSync {
enabled: bool,
mode: PlatformSyncMode,
frame: u64,
}
impl PlatformSync {
pub fn new() -> Self {
let mode = Self::detect_mode();
#[cfg(debug_assertions)]
println!(
"[PLATFORM SYNC] Detectado modo: {:?} (Termux-X11 compatible)",
mode
);
Self {
enabled: true,
mode,
frame: 0,
}
}
fn detect_mode() -> PlatformSyncMode {
if std::env::var("DISPLAY").is_ok() {
PlatformSyncMode::X11
} else {
PlatformSyncMode::OpenGL
}
}
pub fn sync(&mut self) {
if !self.enabled {
return;
}
self.frame += 1;
match self.mode {
PlatformSyncMode::X11 => {
self.xflush();
self.xsync();
}
PlatformSyncMode::OpenGL => {
self.gl_flush();
}
PlatformSyncMode::Auto => {
self.xflush();
self.gl_flush();
}
}
}
fn xflush(&self) {
#[cfg(debug_assertions)]
eprintln!("[PLATFORM SYNC] XFlush: stub (SDL2/raylib manejan internamente)");
}
fn xsync(&self) {
#[cfg(debug_assertions)]
eprintln!("[PLATFORM SYNC] XSync: stub (SDL2/raylib manejan internamente)");
}
fn gl_flush(&self) {
}
pub fn enable(&mut self) {
self.enabled = true;
}
pub fn disable(&mut self) {
self.enabled = false;
}
pub fn set_mode(&mut self, mode: PlatformSyncMode) {
self.mode = mode;
}
pub fn mode(&self) -> PlatformSyncMode {
self.mode
}
pub fn frame_count(&self) -> u64 {
self.frame
}
}
impl Default for PlatformSync {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_platform_sync_new() {
let sync = PlatformSync::new();
assert!(sync.enabled);
assert_eq!(sync.frame, 0);
}
#[test]
fn test_platform_sync_enable_disable() {
let mut sync = PlatformSync::new();
sync.disable();
assert!(!sync.enabled);
sync.enable();
assert!(sync.enabled);
}
#[test]
fn test_platform_sync_sync_disabled() {
let mut sync = PlatformSync::new();
sync.disable();
sync.sync(); assert_eq!(sync.frame, 0);
}
#[test]
fn test_platform_sync_mode() {
let mut sync = PlatformSync::new();
sync.set_mode(PlatformSyncMode::OpenGL);
assert_eq!(sync.mode(), PlatformSyncMode::OpenGL);
sync.set_mode(PlatformSyncMode::X11);
assert_eq!(sync.mode(), PlatformSyncMode::X11);
}
#[test]
fn test_platform_sync_default() {
let sync = PlatformSync::default();
assert!(sync.enabled);
}
}