mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-01-04 19:01:31 +11:00
9602716ed2
* Rename EventsLoop and associated types to EventLoop * Rename WindowEvent::Refresh to WindowEvent::Redraw * Remove second thread from win32 backend * Update run_forever to hijack thread * Replace windows Mutex with parking_lot Mutex * Implement new ControlFlow and associated events * Add StartCause::Init support, timer example * Add ability to send custom user events * Fully invert windows control flow so win32 calls into winit's callback * Add request_redraw * Rename platform to platform_impl * Rename os to platform, add Ext trait postfixes * Add platform::desktop module with EventLoopExt::run_return * Re-organize into module structure * Improve documentation * Small changes to examples * Improve docs for run and run_return * Change instances of "events_loop" to "event_loop" * Rename MonitorId to MonitorHandle * Add CHANGELOG entry * Improve WaitUntil timer precision * When SendEvent is called during event closure, buffer events * Fix resize lag when waiting in some situations * Update send test and errors that broke some examples/APIs * Improve clarity/fix typos in docs * Fix unreachable panic after setting ControlFlow to Poll during some RedrawRequested events. * Fix crash when running in release mode * Remove crossbeam dependency and make drop events work again * Remove serde implementations from ControlFlow * Fix 1.24.1 build * Fix freeze when setting decorations * Replace &EventLoop in callback with &EventLoopWindowTarget * Document and implement Debug for EventLoopWindowTarget * Fix some deadlocks that could occur when changing window state * Fix thread executor not executing closure when called from non-loop thread * Fix buffered events not getting dispatched * Fix crash with runner refcell not getting dropped * Address review feedback * Fix CHANGELOG typo * Catch panics in user callback
73 lines
2.2 KiB
Rust
73 lines
2.2 KiB
Rust
use std::collections::HashMap;
|
|
use std::ffi::{CStr, CString};
|
|
use std::fmt::Debug;
|
|
use std::os::raw::*;
|
|
|
|
use parking_lot::Mutex;
|
|
|
|
use super::*;
|
|
|
|
type AtomCache = HashMap<CString, ffi::Atom>;
|
|
|
|
lazy_static! {
|
|
static ref ATOM_CACHE: Mutex<AtomCache> = Mutex::new(HashMap::with_capacity(2048));
|
|
}
|
|
|
|
impl XConnection {
|
|
pub fn get_atom<T: AsRef<CStr> + Debug>(&self, name: T) -> ffi::Atom {
|
|
let name = name.as_ref();
|
|
let mut atom_cache_lock = ATOM_CACHE.lock();
|
|
let cached_atom = (*atom_cache_lock).get(name).cloned();
|
|
if let Some(atom) = cached_atom {
|
|
atom
|
|
} else {
|
|
let atom = unsafe { (self.xlib.XInternAtom)(
|
|
self.display,
|
|
name.as_ptr() as *const c_char,
|
|
ffi::False,
|
|
) };
|
|
if atom == 0 {
|
|
let msg = format!(
|
|
"`XInternAtom` failed, which really shouldn't happen. Atom: {:?}, Error: {:#?}",
|
|
name,
|
|
self.check_errors(),
|
|
);
|
|
panic!(msg);
|
|
}
|
|
/*println!(
|
|
"XInternAtom name:{:?} atom:{:?}",
|
|
name,
|
|
atom,
|
|
);*/
|
|
(*atom_cache_lock).insert(name.to_owned(), atom);
|
|
atom
|
|
}
|
|
}
|
|
|
|
pub unsafe fn get_atom_unchecked(&self, name: &[u8]) -> ffi::Atom {
|
|
debug_assert!(CStr::from_bytes_with_nul(name).is_ok());
|
|
let name = CStr::from_bytes_with_nul_unchecked(name);
|
|
self.get_atom(name)
|
|
}
|
|
|
|
// Note: this doesn't use caching, for the sake of simplicity.
|
|
// If you're dealing with this many atoms, you'll usually want to cache them locally anyway.
|
|
pub unsafe fn get_atoms(&self, names: &[*mut c_char]) -> Result<Vec<ffi::Atom>, XError> {
|
|
let mut atoms = Vec::with_capacity(names.len());
|
|
(self.xlib.XInternAtoms)(
|
|
self.display,
|
|
names.as_ptr() as *mut _,
|
|
names.len() as c_int,
|
|
ffi::False,
|
|
atoms.as_mut_ptr(),
|
|
);
|
|
self.check_errors()?;
|
|
atoms.set_len(names.len());
|
|
/*println!(
|
|
"XInternAtoms atoms:{:?}",
|
|
atoms,
|
|
);*/
|
|
Ok(atoms)
|
|
}
|
|
}
|