summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clients/client.rs8
-rw-r--r--src/clients/hints.rs1
-rw-r--r--src/clients/mod.rs14
-rw-r--r--src/focus.rs14
-rw-r--r--src/keys.rs1
-rw-r--r--src/main.rs60
6 files changed, 37 insertions, 61 deletions
diff --git a/src/clients/client.rs b/src/clients/client.rs
index 3648f0c..3b33b5f 100644
--- a/src/clients/client.rs
+++ b/src/clients/client.rs
@@ -3,7 +3,7 @@ use xcb::{
ChangeProperty, ChangeWindowAttributes, ConfigWindow, ConfigureNotifyEvent,
ConfigureWindow, Cw, EventMask, MapWindow, SendEvent, SendEventDest, Window,
},
- VoidCookie, VoidCookieChecked, Xid,
+ VoidCookieChecked, Xid,
};
use crate::{config::BORDER_WIDTH, conn_info::Connection};
@@ -43,7 +43,6 @@ impl Client {
}
/// Send a configure configure notify event with the current geometry.
- /// This function does not check for success, so `conn.flush()` should be called after.
pub fn configure_notify(&self, conn: &Connection<'_>) {
conn.send_request(&SendEvent {
destination: SendEventDest::Window(self.window),
@@ -64,7 +63,6 @@ impl Client {
}
/// Set this client's geometry, also updating the X11 window if needed.
- /// This function does not check for success, so `conn.flush()` should be called after.
pub fn set_geom(
&mut self,
conn: &Connection<'_>,
@@ -99,7 +97,6 @@ impl Client {
}
/// Set the border colour of the X11 window to the given value (see `crate::colours::Colours`)
- /// This function does not check for success, so `conn.flush()` should be called after.
pub fn set_border(&self, conn: &Connection<'_>, colour: u32) {
conn.send_request(&ChangeWindowAttributes {
window: self.window(),
@@ -108,7 +105,6 @@ impl Client {
}
/// Ensure this client is currently mapped / visible
- /// This function does not check for success, so `conn.flush()` should be called after.
pub fn ensure_mapped(&mut self, conn: &Connection<'_>) {
if !self.mapped {
conn.send_request(&MapWindow {
@@ -124,7 +120,6 @@ impl Client {
}
/// Set the event mask for this window
- /// This function does not check for success, so `conn.flush()` should be called after.
pub fn set_event_mask(
&self,
conn: &Connection<'_>,
@@ -137,7 +132,6 @@ impl Client {
}
/// Sync the non-geometry related properties with EWMH hints
- /// This function does not check for success, so `conn.flush()` should be called after.
pub fn sync_properties(&mut self, conn: &Connection<'_>, focused: bool) {
let Some(mut hints) = hints::Xwm::get(conn, self.window) else {
return;
diff --git a/src/clients/hints.rs b/src/clients/hints.rs
index 0250401..dd5bcf7 100644
--- a/src/clients/hints.rs
+++ b/src/clients/hints.rs
@@ -60,7 +60,6 @@ impl Xwm {
}
/// Set these WM hints on the given window.
- /// This function does not check for success, so `conn.flush()` should be called after.
pub fn apply(&self, conn: &Connection<'_>, window: Window) {
conn.send_request(&ChangeProperty {
mode: PropMode::Replace,
diff --git a/src/clients/mod.rs b/src/clients/mod.rs
index 70e3798..c7df881 100644
--- a/src/clients/mod.rs
+++ b/src/clients/mod.rs
@@ -30,7 +30,6 @@ impl WM<'_> {
// - Border width
// - Size and position if floating
c.configure_notify(&self.conn);
- self.conn.flush()?;
} else {
// Configure it as requested, and sort the rest when we actually map the window
self.conn.send_and_check_request(&ConfigureWindow {
@@ -53,17 +52,13 @@ impl WM<'_> {
pub(crate) fn handle_configure_notify(&mut self, e: &ConfigureNotifyEvent) -> Result<()> {
if e.window() == self.conn.root() {
self.clients.update_geometry(&self.conn)?;
- self.conn.flush()?;
}
Ok(())
}
/// Removing destroyed windows from the client list and rearrange.
- pub(crate) fn handle_destroy_notify(&mut self, e: &DestroyNotifyEvent) -> Result<()> {
+ pub(crate) fn handle_destroy_notify(&mut self, e: &DestroyNotifyEvent) {
self.clients.unmanage(&self.conn, e.window(), true);
- self.conn.flush()?;
-
- Ok(())
}
/// Map a window, starting to manage it if needed.
@@ -85,13 +80,11 @@ impl WM<'_> {
// Start managing, and map window
self.clients.manage(&self.conn, e.window());
- self.conn.flush()?;
-
Ok(())
}
/// When a window is unmapped, either stop managing it or update its state.
- pub(crate) fn handle_unmap_notify(&mut self, e: &UnmapNotifyEvent) -> Result<()> {
+ pub(crate) fn handle_unmap_notify(&mut self, e: &UnmapNotifyEvent) {
if let Some(c) = self.clients.find_client_mut(e.window()) {
if e.is_from_send_event() {
let cookie = c.set_withdrawn(&self.conn, true);
@@ -100,10 +93,7 @@ impl WM<'_> {
} else {
self.clients.unmanage(&self.conn, e.window(), false);
}
- self.conn.flush()?;
}
-
- Ok(())
}
}
diff --git a/src/focus.rs b/src/focus.rs
index 0c9512f..65bf65e 100644
--- a/src/focus.rs
+++ b/src/focus.rs
@@ -1,33 +1,27 @@
use xcb::x::{EnterNotifyEvent, FocusInEvent, NotifyDetail, NotifyMode};
-use crate::{error::Result, WM};
+use crate::WM;
impl WM<'_> {
/// When a new window is entered, focus it.
- pub fn handle_enter_notify(&mut self, e: &EnterNotifyEvent) -> Result<()> {
+ pub fn handle_enter_notify(&mut self, e: &EnterNotifyEvent) {
if (e.mode() != NotifyMode::Normal || e.detail() == NotifyDetail::Inferior)
&& e.event() != self.conn.root()
{
- return Ok(());
+ return;
}
if let Some((mon, pos)) = self.clients.find_client_pos(e.event()) {
self.clients.refocus(&self.conn, mon, pos);
- self.conn.flush()?;
}
-
- Ok(())
}
/// When a new window requests focus, focus it.
- pub fn handle_focus_in(&mut self, e: &FocusInEvent) -> Result<()> {
+ pub fn handle_focus_in(&mut self, e: &FocusInEvent) {
if !self.clients.is_focused(e.event()) {
if let Some((mon, pos)) = self.clients.find_client_pos(e.event()) {
self.clients.refocus(&self.conn, mon, pos);
- self.conn.flush()?;
}
}
-
- Ok(())
}
}
diff --git a/src/keys.rs b/src/keys.rs
index 08cd46d..3103f41 100644
--- a/src/keys.rs
+++ b/src/keys.rs
@@ -71,7 +71,6 @@ fn grab_keys(conn: &mut Connection<'_>) -> Result<()> {
}
// Ensure all requests succeeded
- conn.flush()?;
Ok(())
}
diff --git a/src/main.rs b/src/main.rs
index 7758cac..54d893c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -47,42 +47,42 @@ impl<'a> WM<'a> {
pub fn event_loop(&mut self) -> Result<()> {
loop {
- match self.conn.wait_for_event()? {
- // 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)?,
-
- // See clients/mod.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)?,
-
- // // 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)?,
-
- // // See below
- Event::X(x::Event::PropertyNotify(e)) => self.handle_property_notify(&e)?,
- _ => {}
+ match self.conn.wait_for_event() {
+ Ok(x) => match x {
+ // 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)?,
+
+ // See clients/mod.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),
+
+ // // 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),
+
+ // // See below
+ Event::X(x::Event::PropertyNotify(e)) => self.handle_property_notify(&e),
+ _ => {}
+ },
+ Err(e) => {
+ eprintln!("error in event loop: {e:#?}\ncontinuing anyway");
+ }
};
+ self.conn.flush()?;
}
}
/// Handle a property notify event, by doing *todo*
- fn handle_property_notify(&mut self, e: &PropertyNotifyEvent) -> Result<()> {
- match e.atom() {
- x::ATOM_WM_HINTS => {
- let focused = self.clients.is_focused(e.window());
- if let Some(c) = self.clients.find_client_mut(e.window()) {
- c.sync_properties(&self.conn, focused);
- self.conn.flush()?;
- }
-
- Ok(())
+ fn handle_property_notify(&mut self, e: &PropertyNotifyEvent) {
+ if x::ATOM_WM_HINTS == e.atom() {
+ let focused = self.clients.is_focused(e.window());
+ if let Some(c) = self.clients.find_client_mut(e.window()) {
+ c.sync_properties(&self.conn, focused);
}
- _ => Ok(()),
}
}
}