On X11, cache the XRandR extension version
This commit is contained in:
parent
5e106b4dbb
commit
1893b0ec42
2 changed files with 26 additions and 5 deletions
|
|
@ -234,7 +234,8 @@ impl XConnection {
|
||||||
|
|
||||||
fn query_monitor_list(&self) -> Result<Vec<MonitorHandle>, X11Error> {
|
fn query_monitor_list(&self) -> Result<Vec<MonitorHandle>, X11Error> {
|
||||||
let root = self.default_root();
|
let root = self.default_root();
|
||||||
let resources = ScreenResources::from_connection(self.xcb_connection(), root)?;
|
let resources =
|
||||||
|
ScreenResources::from_connection(self.xcb_connection(), root, self.randr_version())?;
|
||||||
|
|
||||||
// Pipeline all of the get-crtc requests.
|
// Pipeline all of the get-crtc requests.
|
||||||
let mut crtc_cookies = Vec::with_capacity(resources.crtcs().len());
|
let mut crtc_cookies = Vec::with_capacity(resources.crtcs().len());
|
||||||
|
|
@ -343,10 +344,9 @@ impl ScreenResources {
|
||||||
pub(crate) fn from_connection(
|
pub(crate) fn from_connection(
|
||||||
conn: &impl x11rb::connection::Connection,
|
conn: &impl x11rb::connection::Connection,
|
||||||
root: &x11rb::protocol::xproto::Screen,
|
root: &x11rb::protocol::xproto::Screen,
|
||||||
|
(major_version, minor_version): (u32, u32),
|
||||||
) -> Result<Self, X11Error> {
|
) -> Result<Self, X11Error> {
|
||||||
let version = conn.randr_query_version(1, 3)?.reply()?;
|
if (major_version == 1 && minor_version >= 3) || major_version > 1 {
|
||||||
|
|
||||||
if (version.major_version == 1 && version.minor_version >= 3) || version.major_version > 1 {
|
|
||||||
let reply = conn
|
let reply = conn
|
||||||
.randr_get_screen_resources_current(root.root)?
|
.randr_get_screen_resources_current(root.root)?
|
||||||
.reply()?;
|
.reply()?;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,12 @@ use std::{
|
||||||
use crate::window::CursorIcon;
|
use crate::window::CursorIcon;
|
||||||
|
|
||||||
use super::{atoms::Atoms, ffi, monitor::MonitorHandle};
|
use super::{atoms::Atoms, ffi, monitor::MonitorHandle};
|
||||||
use x11rb::{connection::Connection, protocol::xproto, resource_manager, xcb_ffi::XCBConnection};
|
use x11rb::{
|
||||||
|
connection::Connection,
|
||||||
|
protocol::{randr::ConnectionExt as _, xproto},
|
||||||
|
resource_manager,
|
||||||
|
xcb_ffi::XCBConnection,
|
||||||
|
};
|
||||||
|
|
||||||
/// A connection to an X server.
|
/// A connection to an X server.
|
||||||
pub(crate) struct XConnection {
|
pub(crate) struct XConnection {
|
||||||
|
|
@ -47,6 +52,9 @@ pub(crate) struct XConnection {
|
||||||
/// The resource database.
|
/// The resource database.
|
||||||
database: RwLock<resource_manager::Database>,
|
database: RwLock<resource_manager::Database>,
|
||||||
|
|
||||||
|
/// RandR version.
|
||||||
|
randr_version: (u32, u32),
|
||||||
|
|
||||||
pub latest_error: Mutex<Option<XError>>,
|
pub latest_error: Mutex<Option<XError>>,
|
||||||
pub cursor_cache: Mutex<HashMap<Option<CursorIcon>, ffi::Cursor>>,
|
pub cursor_cache: Mutex<HashMap<Option<CursorIcon>, ffi::Cursor>>,
|
||||||
}
|
}
|
||||||
|
|
@ -104,6 +112,13 @@ impl XConnection {
|
||||||
let database = resource_manager::new_from_default(&xcb)
|
let database = resource_manager::new_from_default(&xcb)
|
||||||
.map_err(|e| XNotSupported::XcbConversionError(Arc::new(e)))?;
|
.map_err(|e| XNotSupported::XcbConversionError(Arc::new(e)))?;
|
||||||
|
|
||||||
|
// Load the RandR version.
|
||||||
|
let randr_version = xcb
|
||||||
|
.randr_query_version(1, 3)
|
||||||
|
.expect("failed to request XRandR version")
|
||||||
|
.reply()
|
||||||
|
.expect("failed to query XRandR version");
|
||||||
|
|
||||||
Ok(XConnection {
|
Ok(XConnection {
|
||||||
xlib,
|
xlib,
|
||||||
xcursor,
|
xcursor,
|
||||||
|
|
@ -117,6 +132,7 @@ impl XConnection {
|
||||||
monitor_handles: Mutex::new(None),
|
monitor_handles: Mutex::new(None),
|
||||||
database: RwLock::new(database),
|
database: RwLock::new(database),
|
||||||
cursor_cache: Default::default(),
|
cursor_cache: Default::default(),
|
||||||
|
randr_version: (randr_version.major_version, randr_version.minor_version),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -131,6 +147,11 @@ impl XConnection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn randr_version(&self) -> (u32, u32) {
|
||||||
|
self.randr_version
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the underlying XCB connection.
|
/// Get the underlying XCB connection.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn xcb_connection(&self) -> &XCBConnection {
|
pub fn xcb_connection(&self) -> &XCBConnection {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue