-
Notifications
You must be signed in to change notification settings - Fork 4
/
main.rs
106 lines (92 loc) · 3.27 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//! My personal penrose config
use anyhow::Context;
use penrose::{
core::{bindings::parse_keybindings_with_xmodmap, Config, WindowManager},
extensions::hooks::{
add_ewmh_hooks, add_named_scratchpads,
manage::{FloatingCentered, SetWorkspace},
NamedScratchPad, SpawnOnStartup,
},
manage_hooks,
x::query::ClassName,
x11rb::RustConn,
};
use penrose_sminez::{
actions::add_sticky_client_state,
bar::status_bar,
bindings::raw_key_bindings,
layouts::{layouts, PerScreenSpacingHook},
INNER_PX, OUTER_PX,
};
use std::collections::HashMap;
use tracing::subscriber::set_global_default;
use tracing_subscriber::{layer::SubscriberExt, FmtSubscriber};
use penrose::{
core::State,
x::{Atom, Prop, XConn, XEvent},
Result,
};
pub fn event_hook<X: XConn>(event: &XEvent, _: &mut State<X>, x: &X) -> Result<bool> {
let unmanaged: [&str; 2] = [
Atom::NetWindowTypeDock.as_ref(),
Atom::NetWindowTypeToolbar.as_ref(),
];
if let XEvent::MapRequest(id) = event {
let p = x.get_prop(*id, Atom::NetWmWindowType.as_ref())?;
if let Some(Prop::Atom(atoms)) = p {
if atoms.iter().any(|a| unmanaged.contains(&a.as_ref())) {
x.map(*id)?;
return Ok(false);
}
};
}
Ok(true)
}
fn main() -> anyhow::Result<()> {
let builder = FmtSubscriber::builder()
.with_env_filter("info")
.with_writer(std::io::stdout)
.with_filter_reloading();
let reload_handle = builder.reload_handle();
let journald_layer = tracing_journald::layer().context("unable to open journald socket")?;
let subscriber = builder.finish().with(journald_layer);
set_global_default(subscriber).context("unable to set a global tracing subscriber")?;
let startup_hook = SpawnOnStartup::boxed("/usr/local/scripts/penrose-startup.sh");
let manage_hook = manage_hooks![
ClassName("floatTerm") => FloatingCentered::new(0.8, 0.6),
ClassName("discord") => SetWorkspace("9"),
];
let layout_hook = PerScreenSpacingHook {
inner_px: INNER_PX,
outer_px: OUTER_PX,
};
let config = add_ewmh_hooks(Config {
default_layouts: layouts(),
floating_classes: vec!["mpv-float".to_owned(), "stalonetray".to_owned()],
manage_hook: Some(manage_hook),
startup_hook: Some(startup_hook),
layout_hook: Some(Box::new(layout_hook)),
event_hook: Some(Box::new(event_hook)),
..Config::default()
});
// Create a new named scratchpad and toggle handle for use in keybindings.
let (nsp, toggle_scratch) = NamedScratchPad::new(
"terminal",
"st -c StScratchpad",
ClassName("StScratchpad"),
FloatingCentered::new(0.8, 0.8),
true,
);
let conn = RustConn::new()?;
let raw_bindings = raw_key_bindings(toggle_scratch, reload_handle);
let key_bindings = parse_keybindings_with_xmodmap(raw_bindings)?;
// Initialise the required state extension and hooks for handling the named scratchpad
let wm = add_sticky_client_state(add_named_scratchpads(
WindowManager::new(config, key_bindings, HashMap::new(), conn)?,
vec![nsp],
));
let bar = status_bar()?;
let wm = bar.add_to(wm);
wm.run()?;
Ok(())
}