use alloc::string::ToString;
use protocol::Database;
use tiny_std::UnixStr;
use crate::con::{SocketIo, XcbState};
use crate::helpers::resource_manager::protocol::work_around_constant_limitations;
use crate::proto::xproto::{GetPropertyReply, GetPropertyTypeEnum};
use crate::Error;
pub mod protocol;
#[inline]
fn send_request<IO, XS>(io: &mut IO, state: &mut XS) -> Result<GetPropertyReply, Error>
where
IO: SocketIo,
XS: XcbState,
{
let window = state.setup().roots[0].root;
let cookie = crate::connection::xproto::get_property(
io,
state,
0,
window,
work_around_constant_limitations::ATOM_RESOURCE_MANAGER,
GetPropertyTypeEnum(work_around_constant_limitations::ATOM_STRING),
0,
100_000_000,
false,
)?;
cookie.reply(io, state)
}
pub fn new_from_resource_manager<IO, XS>(
io: &mut IO,
state: &mut XS,
) -> Result<Option<Database>, Error>
where
IO: SocketIo,
XS: XcbState,
{
Ok(Database::new_from_get_property_reply(&send_request(
io, state,
)?)?)
}
pub fn new_from_default<IO, XS>(
io: &mut IO,
state: &mut XS,
home_dir: Option<&UnixStr>,
xenvironment: Option<&UnixStr>,
) -> Result<Database, Error>
where
IO: SocketIo,
XS: XcbState,
{
Ok(Database::new_from_default(
&send_request(io, state)?,
tiny_std::unix::host_name::host_name().unwrap_or_else(|_| "localhost".to_string()),
home_dir,
xenvironment,
)?)
}