summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs53
1 files changed, 35 insertions, 18 deletions
diff --git a/src/main.rs b/src/main.rs
index f99e19b..6559ad7 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,8 +1,8 @@
use atoms::InternedAtoms;
-use clients::ClientList;
+use clients::ClientState;
use cursors::Cursors;
use error::*;
-use keys::KeyboardState;
+use keys::KeyboardInfo;
use xcb::{
x::{self, ChangeWindowAttributes, PropertyNotifyEvent, Window},
Connection, Event, Extension,
@@ -16,13 +16,10 @@ mod focus;
mod keys;
fn main() -> Result<()> {
- // todo: cli stuff
- let display_name = ":1";
-
cleanup_process_children();
let (conn, screen_num) =
- Connection::connect_with_extensions(Some(display_name), &[], &[Extension::Xinerama])?;
+ Connection::connect_with_extensions(None, &[], &[Extension::Xinerama])?;
let mut wm = WM::new(&conn, screen_num)?;
wm.event_loop()?;
@@ -30,20 +27,35 @@ fn main() -> Result<()> {
Ok(())
}
+/// The window manager's state
struct WM<'a> {
+ /// The open connection to an X server
conn: &'a Connection,
+
+ /// The 'screen' number on the X server
+ /// Note this isn't what you think it is on multi-monitor setups
screen_num: i32,
+ /// The root window
root: Window,
- clients: ClientList,
+ /// WM client state
+ clients: ClientState,
+
+ /// Cached cursors
cursors: Cursors,
+
+ /// Cached atoms
atoms: InternedAtoms,
- keyboard_state: KeyboardState,
+
+ /// Cached keyboard layout information
+ keyboard_state: KeyboardInfo,
}
impl WM<'_> {
- fn new<'a>(conn: &'a Connection, screen_num: i32) -> Result<WM<'a>> {
+ /// Prepare the window manager to run on the given connection and screen number.
+ /// This will fail if another WM is running.
+ fn new(conn: &'_ Connection, screen_num: i32) -> Result<WM<'_>> {
// Fetch root window
let setup = conn.get_setup();
let screen = setup
@@ -64,7 +76,7 @@ impl WM<'_> {
Ok(WM {
atoms: InternedAtoms::new_with(conn)?,
cursors: Cursors::new_with(conn)?,
- keyboard_state: KeyboardState::new_with(conn)?,
+ keyboard_state: KeyboardInfo::new_with(conn)?,
clients: Default::default(),
conn,
screen_num,
@@ -72,8 +84,9 @@ impl WM<'_> {
})
}
+ /// Set the correct properties on the root window
fn setup_root(&mut self) -> Result<()> {
- // TODO: set wm properties
+ // TODO: Set EHWM properties on root window
self.conn
.check_request(self.conn.send_request_checked(&ChangeWindowAttributes {
window: self.root,
@@ -100,42 +113,46 @@ impl WM<'_> {
}
fn event_loop(&mut self) -> Result<()> {
+ // Perform setup
self.update_geometry()?;
self.setup_root()?;
loop {
match self.conn.wait_for_event()? {
- // todo: keybinding related stuff
+ // See keys.rs
Event::X(x::Event::KeyPress(e)) => self.handle_key_press(e)?,
Event::X(x::Event::MappingNotify(e)) => self.handle_mapping_notify(e)?,
- // todo: windows coming and going
+ // See clients.rs
Event::X(x::Event::ConfigureRequest(e)) => self.handle_configure_request(e)?,
Event::X(x::Event::ConfigureNotify(e)) => self.handle_configure_notify(e)?,
Event::X(x::Event::DestroyNotify(e)) => self.handle_destroy_notify(e)?,
Event::X(x::Event::MapRequest(e)) => self.handle_map_request(e)?,
Event::X(x::Event::UnmapNotify(e)) => self.handle_unmap_notify(e)?,
- // todo: focus stuff
+ // See focus.rs
Event::X(x::Event::EnterNotify(e)) => self.handle_enter_notify(e)?,
Event::X(x::Event::FocusIn(e)) => self.handle_focus_in(e)?,
Event::X(x::Event::MotionNotify(e)) => self.handle_motion_notify(e)?,
- // todo: other
+ // See below
Event::X(x::Event::PropertyNotify(e)) => self.handle_property_notify(e)?,
_ => {}
};
}
}
- fn handle_property_notify(&self, e: PropertyNotifyEvent) -> Result<()> {
+ /// Handle a property notify event, by doing *todo*
+ fn handle_property_notify(&self, _e: PropertyNotifyEvent) -> Result<()> {
todo!()
}
}
+/// Cleanup this process' children and set some flags.
+/// This is necessary when used with `startx`
fn cleanup_process_children() {
- // todo: dont transform children into zombies when they terminate
- // todo: cleanup zombies
+ // TODO: dont transform children into zombies when they terminate
+ // TODO: cleanup zombies
}
impl<'a> std::fmt::Debug for WM<'a> {