mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-01-11 13:31:29 +11:00
unix::WindowExt no longer returns pointers for things that aren't actually pointers (#364)
Fixes #256 `get_xlib_window` and `get_xlib_screen_id` previously returned `Option<*mut c_void>` by casting integer IDs into pointers, which while producing no functionality issues, is semantically incorrect and rather surprising. Worse still, the docs for `get_xlib_window` stated that it was in fact a valid pointer. Additionally, now all `unix::WindowExt` methods return `std::os::raw` types rather than `libc` types; note that the two versions of `c_void` are not interchangeable in the eyes of the compiler, so those wanting the `libc` type will need to explicitly cast. This is a breaking change, and will require some trivial changes to glutin.
This commit is contained in:
parent
8f18dab061
commit
23e4293179
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
- Add support for `Touch` for emscripten backend.
|
- Add support for `Touch` for emscripten backend.
|
||||||
- Added support for `DroppedFile`, `HoveredFile`, and `HoveredFileCancelled` to X11 backend.
|
- Added support for `DroppedFile`, `HoveredFile`, and `HoveredFileCancelled` to X11 backend.
|
||||||
|
- **Breaking:** `unix::WindowExt` no longer returns pointers for things that aren't actually pointers; `get_xlib_window` now returns `Option<std::os::raw::c_ulong>` and `get_xlib_screen_id` returns `Option<std::os::raw::c_int>`. Additionally, methods that previously returned `libc::c_void` have been changed to return `std::os::raw::c_void`, which are not interchangeable types, so users wanting the former will need to explicitly cast.
|
||||||
|
|
||||||
# Version 0.9.0 (2017-12-01)
|
# Version 0.9.0 (2017-12-01)
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd"))]
|
#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd"))]
|
||||||
|
|
||||||
|
use std::os::raw;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use libc;
|
|
||||||
use EventsLoop;
|
use EventsLoop;
|
||||||
use MonitorId;
|
use MonitorId;
|
||||||
use Window;
|
use Window;
|
||||||
|
@ -78,46 +78,44 @@ impl EventsLoopExt for EventsLoop {
|
||||||
|
|
||||||
/// Additional methods on `Window` that are specific to Unix.
|
/// Additional methods on `Window` that are specific to Unix.
|
||||||
pub trait WindowExt {
|
pub trait WindowExt {
|
||||||
/// Returns a pointer to the `Window` object of xlib that is used by this window.
|
/// Returns the ID of the `Window` xlib object that is used by this window.
|
||||||
///
|
///
|
||||||
/// Returns `None` if the window doesn't use xlib (if it uses wayland for example).
|
/// Returns `None` if the window doesn't use xlib (if it uses wayland for example).
|
||||||
///
|
fn get_xlib_window(&self) -> Option<raw::c_ulong>;
|
||||||
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
|
||||||
fn get_xlib_window(&self) -> Option<*mut libc::c_void>;
|
|
||||||
|
|
||||||
/// Returns a pointer to the `Display` object of xlib that is used by this window.
|
/// Returns a pointer to the `Display` object of xlib that is used by this window.
|
||||||
///
|
///
|
||||||
/// Returns `None` if the window doesn't use xlib (if it uses wayland for example).
|
/// Returns `None` if the window doesn't use xlib (if it uses wayland for example).
|
||||||
///
|
///
|
||||||
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
||||||
fn get_xlib_display(&self) -> Option<*mut libc::c_void>;
|
fn get_xlib_display(&self) -> Option<*mut raw::c_void>;
|
||||||
|
|
||||||
fn get_xlib_screen_id(&self) -> Option<*mut libc::c_void>;
|
fn get_xlib_screen_id(&self) -> Option<raw::c_int>;
|
||||||
|
|
||||||
fn get_xlib_xconnection(&self) -> Option<Arc<XConnection>>;
|
fn get_xlib_xconnection(&self) -> Option<Arc<XConnection>>;
|
||||||
|
|
||||||
fn send_xim_spot(&self, x: i16, y: i16);
|
fn send_xim_spot(&self, x: i16, y: i16);
|
||||||
|
|
||||||
/// This function returns the underlying `xcb_connection_t` of an xlib `Display`.
|
/// This function returns the underlying `xcb_connection_t` of an xlib `Display`.
|
||||||
///
|
///
|
||||||
/// Returns `None` if the window doesn't use xlib (if it uses wayland for example).
|
/// Returns `None` if the window doesn't use xlib (if it uses wayland for example).
|
||||||
///
|
///
|
||||||
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
||||||
fn get_xcb_connection(&self) -> Option<*mut libc::c_void>;
|
fn get_xcb_connection(&self) -> Option<*mut raw::c_void>;
|
||||||
|
|
||||||
/// Returns a pointer to the `wl_surface` object of wayland that is used by this window.
|
/// Returns a pointer to the `wl_surface` object of wayland that is used by this window.
|
||||||
///
|
///
|
||||||
/// Returns `None` if the window doesn't use wayland (if it uses xlib for example).
|
/// Returns `None` if the window doesn't use wayland (if it uses xlib for example).
|
||||||
///
|
///
|
||||||
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
||||||
fn get_wayland_surface(&self) -> Option<*mut libc::c_void>;
|
fn get_wayland_surface(&self) -> Option<*mut raw::c_void>;
|
||||||
|
|
||||||
/// Returns a pointer to the `wl_display` object of wayland that is used by this window.
|
/// Returns a pointer to the `wl_display` object of wayland that is used by this window.
|
||||||
///
|
///
|
||||||
/// Returns `None` if the window doesn't use wayland (if it uses xlib for example).
|
/// Returns `None` if the window doesn't use wayland (if it uses xlib for example).
|
||||||
///
|
///
|
||||||
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
/// The pointer will become invalid when the glutin `Window` is destroyed.
|
||||||
fn get_wayland_display(&self) -> Option<*mut libc::c_void>;
|
fn get_wayland_display(&self) -> Option<*mut raw::c_void>;
|
||||||
|
|
||||||
/// Check if the window is ready for drawing
|
/// Check if the window is ready for drawing
|
||||||
///
|
///
|
||||||
|
@ -131,7 +129,7 @@ pub trait WindowExt {
|
||||||
|
|
||||||
impl WindowExt for Window {
|
impl WindowExt for Window {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn get_xlib_window(&self) -> Option<*mut libc::c_void> {
|
fn get_xlib_window(&self) -> Option<raw::c_ulong> {
|
||||||
match self.window {
|
match self.window {
|
||||||
LinuxWindow::X(ref w) => Some(w.get_xlib_window()),
|
LinuxWindow::X(ref w) => Some(w.get_xlib_window()),
|
||||||
_ => None
|
_ => None
|
||||||
|
@ -139,14 +137,14 @@ impl WindowExt for Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn get_xlib_display(&self) -> Option<*mut libc::c_void> {
|
fn get_xlib_display(&self) -> Option<*mut raw::c_void> {
|
||||||
match self.window {
|
match self.window {
|
||||||
LinuxWindow::X(ref w) => Some(w.get_xlib_display()),
|
LinuxWindow::X(ref w) => Some(w.get_xlib_display()),
|
||||||
_ => None
|
_ => None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_xlib_screen_id(&self) -> Option<*mut libc::c_void> {
|
fn get_xlib_screen_id(&self) -> Option<raw::c_int> {
|
||||||
match self.window {
|
match self.window {
|
||||||
LinuxWindow::X(ref w) => Some(w.get_xlib_screen_id()),
|
LinuxWindow::X(ref w) => Some(w.get_xlib_screen_id()),
|
||||||
_ => None
|
_ => None
|
||||||
|
@ -160,7 +158,7 @@ impl WindowExt for Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_xcb_connection(&self) -> Option<*mut libc::c_void> {
|
fn get_xcb_connection(&self) -> Option<*mut raw::c_void> {
|
||||||
match self.window {
|
match self.window {
|
||||||
LinuxWindow::X(ref w) => Some(w.get_xcb_connection()),
|
LinuxWindow::X(ref w) => Some(w.get_xcb_connection()),
|
||||||
_ => None
|
_ => None
|
||||||
|
@ -174,7 +172,7 @@ impl WindowExt for Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn get_wayland_surface(&self) -> Option<*mut libc::c_void> {
|
fn get_wayland_surface(&self) -> Option<*mut raw::c_void> {
|
||||||
use wayland_client::Proxy;
|
use wayland_client::Proxy;
|
||||||
match self.window {
|
match self.window {
|
||||||
LinuxWindow::Wayland(ref w) => Some(w.get_surface().ptr() as *mut _),
|
LinuxWindow::Wayland(ref w) => Some(w.get_surface().ptr() as *mut _),
|
||||||
|
@ -183,7 +181,7 @@ impl WindowExt for Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn get_wayland_display(&self) -> Option<*mut libc::c_void> {
|
fn get_wayland_display(&self) -> Option<*mut raw::c_void> {
|
||||||
use wayland_client::Proxy;
|
use wayland_client::Proxy;
|
||||||
match self.window {
|
match self.window {
|
||||||
LinuxWindow::Wayland(ref w) => Some(w.get_display().ptr() as *mut _),
|
LinuxWindow::Wayland(ref w) => Some(w.get_display().ptr() as *mut _),
|
||||||
|
|
|
@ -5,7 +5,7 @@ use libc;
|
||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
use std::{mem, cmp};
|
use std::{mem, cmp};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::os::raw::{c_int, c_long, c_uchar};
|
use std::os::raw::{c_int, c_long, c_uchar, c_ulong, c_void};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
|
@ -537,13 +537,13 @@ impl Window2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_xlib_display(&self) -> *mut libc::c_void {
|
pub fn get_xlib_display(&self) -> *mut c_void {
|
||||||
self.x.display.display as *mut libc::c_void
|
self.x.display.display as _
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_xlib_screen_id(&self) -> *mut libc::c_void {
|
pub fn get_xlib_screen_id(&self) -> c_int {
|
||||||
self.x.screen_id as *mut libc::c_void
|
self.x.screen_id
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -553,20 +553,20 @@ impl Window2 {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn platform_display(&self) -> *mut libc::c_void {
|
pub fn platform_display(&self) -> *mut libc::c_void {
|
||||||
self.x.display.display as *mut libc::c_void
|
self.x.display.display as _
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_xlib_window(&self) -> *mut libc::c_void {
|
pub fn get_xlib_window(&self) -> c_ulong {
|
||||||
self.x.window as *mut libc::c_void
|
self.x.window
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn platform_window(&self) -> *mut libc::c_void {
|
pub fn platform_window(&self) -> *mut libc::c_void {
|
||||||
self.x.window as *mut libc::c_void
|
self.x.window as _
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_xcb_connection(&self) -> *mut libc::c_void {
|
pub fn get_xcb_connection(&self) -> *mut c_void {
|
||||||
unsafe {
|
unsafe {
|
||||||
(self.x.display.xlib_xcb.XGetXCBConnection)(self.get_xlib_display() as *mut _) as *mut _
|
(self.x.display.xlib_xcb.XGetXCBConnection)(self.get_xlib_display() as *mut _) as *mut _
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue