1 | //! X11 resource manager library. |
2 | //! |
3 | //! Usage example (please cache the database returned by [`new_from_default`] in real applications |
4 | //! instead of re-opening it whenever a value is needed): |
5 | //! ``` |
6 | //! use x11rb::{connection::Connection, errors::ReplyError, resource_manager::new_from_default}; |
7 | //! fn get_xft_dpi(conn: &impl Connection) -> Result<Option<u32>, ReplyError> { |
8 | //! let db = new_from_default(conn)?; |
9 | //! let value = db.get_value("Xft.dpi" , "" ); |
10 | //! Ok(value.ok().flatten()) |
11 | //! } |
12 | //! ``` |
13 | //! |
14 | //! This functionality is similar to what is available to C code through xcb-util-xrm and Xlib's |
15 | //! `Xrm*` function family. Not all their functionality is available in this library. Please open a |
16 | //! feature request if you need something that is not available. |
17 | //! |
18 | //! The code in this module is only available when the `resource_manager` feature of the library is |
19 | //! enabled. |
20 | |
21 | use crate::connection::Connection; |
22 | use crate::errors::ReplyError; |
23 | use crate::protocol::xproto::GetPropertyReply; |
24 | |
25 | pub use x11rb_protocol::resource_manager::Database; |
26 | |
27 | fn send_request(conn: &impl Connection) -> Result<GetPropertyReply, ReplyError> { |
28 | let mut request: GetPropertyRequest = Database::GET_RESOURCE_DATABASE; |
29 | request.window = conn.setup().roots[0].root; |
30 | conn.send_trait_request_with_reply(request)?.reply() |
31 | } |
32 | |
33 | /// Create a new X11 resource database from the `RESOURCE_MANAGER` property of the first |
34 | /// screen's root window. |
35 | /// |
36 | /// This function returns an error if the `GetProperty` request to get the `RESOURCE_MANAGER` |
37 | /// property fails. It returns `Ok(None)` if the property does not exist, has the wrong format, |
38 | /// or is empty. |
39 | pub fn new_from_resource_manager(conn: &impl Connection) -> Result<Option<Database>, ReplyError> { |
40 | Ok(Database::new_from_get_property_reply(&send_request(conn)?)) |
41 | } |
42 | |
43 | /// Create a new X11 resource database from the default locations. |
44 | /// |
45 | /// The default location is a combination of two places. First, the following places are |
46 | /// searched for data: |
47 | /// - The `RESOURCE_MANAGER` property of the first screen's root window (See |
48 | /// [`new_from_resource_manager`]). |
49 | /// - If not found, the file `$HOME/.Xresources` is loaded. |
50 | /// - If not found, the file `$HOME/.Xdefaults` is loaded. |
51 | /// |
52 | /// The result of the above search of the above search is combined with: |
53 | /// - The contents of the file `$XENVIRONMENT`, if this environment variable is set. |
54 | /// - Otherwise, the contents of `$HOME/.Xdefaults-[hostname]`. |
55 | /// |
56 | /// This function only returns an error if communication with the X11 server fails. All other |
57 | /// errors are ignored. It might be that an empty database is returned. |
58 | /// |
59 | /// The behaviour of this function is mostly equivalent to Xlib's `XGetDefault()`. The |
60 | /// exception is that `XGetDefault()` does not load `$HOME/.Xresources`. |
61 | /// |
62 | /// The behaviour of this function is equivalent to xcb-util-xrm's |
63 | /// `xcb_xrm_database_from_default()`. |
64 | pub fn new_from_default(conn: &impl Connection) -> Result<Database, ReplyError> { |
65 | Ok(Database::new_from_default( |
66 | &send_request(conn)?, |
67 | crate::hostname(), |
68 | )) |
69 | } |
70 | |