bscreensaver/xcb-xembed/src/lib.rs
Brian J. Tarricone 2e86445c3d Initial import. Most things seem working.
This includes an abortive attempt to do a gtk4 dialog (which I don't
think is possible, as gtk4 doesn't allow embedding toplevels anymore),
and an iced dialog, which I just never started writing.
2022-05-03 17:05:06 -07:00

97 lines
2.1 KiB
Rust

use bitflags::bitflags;
use std::{
error::Error as StdError,
fmt,
};
pub mod embedder;
pub(crate) const XEMBED_VERSION: u32 = 0;
pub(crate) const XEMBED_INFO_ATOM_NAME: &str = "_XEMBED_INFO";
pub(crate) const XEMBED_MESSAGE_ATOM_NAME: &str = "_XEMBED";
#[allow(dead_code)]
pub(crate) enum XEmbedMessage {
EmbeddedNotify = 0,
WindowActivate = 1,
WindowDeactivate = 2,
RequestFocus = 3,
FocusIn = 4,
FocusOut = 5,
FocusNext = 6,
FocusPrev = 7,
ModalityOn = 10,
ModalityOff = 11,
RegisterAccelerator = 12,
UnregisterAccelerator = 13,
ActivateAccelerator = 14,
}
pub enum XEmbedFocus {
Current = 0,
First = 1,
Last = 2,
}
bitflags! {
struct XEmbedFlags: u32 {
const MAPPED = (1 << 0);
}
struct XEmbedModifier: u32 {
const SHIFT = (1 << 0);
const CONTROL = (1 << 1);
const ALT = (1 << 2);
const SUPER = (1 << 3);
const HYPER = (1 << 4);
}
struct XEmbedAcceleratorFlags: u32 {
const OVERLOADED = (1 << 0);
}
}
#[derive(Debug)]
pub enum Error {
ProtocolError(String),
Xcb(xcb::Error),
ClientDestroyed,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ProtocolError(reason) => write!(f, "XEMBED: Protocol error: {}", reason),
Self::Xcb(err) => write!(f, "XEMBED: {}", err),
Self::ClientDestroyed => write!(f, "XEMBED: client destroyed"),
}
}
}
impl StdError for Error {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
match self {
Self::Xcb(err) => Some(err),
_ => None,
}
}
}
impl From<xcb::Error> for Error {
fn from(error: xcb::Error) -> Self {
Self::Xcb(error)
}
}
impl From<xcb::ProtocolError> for Error {
fn from(error: xcb::ProtocolError) -> Self {
Self::Xcb(xcb::Error::Protocol(error))
}
}
impl From<xcb::ConnError> for Error {
fn from(error: xcb::ConnError) -> Self {
Self::Xcb(xcb::Error::Connection(error))
}
}