keybinds without input-only windows #13
29
src/main.rs
29
src/main.rs
|
@ -142,25 +142,18 @@ async fn main() -> Result<()> {
|
|||
let mut mask = ModMask::new(false, false, true, false, false, false, false, false, false);
|
||||
karx marked this conversation as resolved
|
||||
let mut keyboard_state = KeyboardState::new_async(&mut conn).await?;
|
||||
let keymap = keymap(&mut keyboard_state);
|
||||
let mut request_key = keymap.get(&120).ok_or_else(|| {
|
||||
let mut request_key = *keymap.get(&120).ok_or_else(|| {
|
||||
XcrabError::Custom("At least one letter could not be found in the keymap".to_string())
|
||||
})?;
|
||||
|
||||
println!("got to this part");
|
||||
|
||||
for (&binds, _action) in &CONFIG.binds {
|
||||
println!("started iteration");
|
||||
mask.set_control(binds.mods.control());
|
||||
mask.set_shift(binds.mods.shift());
|
||||
mask.set_One(binds.mods.mod1());
|
||||
mask.set_Four(binds.mods.mod4());
|
||||
for &binds in CONFIG.binds.keys() {
|
||||
for keysym in 97..122_u32 {
|
||||
let keycode = keymap.get(&keysym).ok_or_else(|| {
|
||||
XcrabError::Custom(
|
||||
"At least one letter could not be found in the keymap".to_string(),
|
||||
)
|
||||
})?;
|
||||
if keyboard_state
|
||||
let iter_char = keyboard_state
|
||||
.process_keycode(*keycode, KeyButMask::default())
|
||||
.ok_or_else(|| {
|
||||
XcrabError::Custom(
|
||||
|
@ -170,12 +163,10 @@ async fn main() -> Result<()> {
|
|||
.as_char()
|
||||
.ok_or_else(|| {
|
||||
XcrabError::Custom("The processed Key could not be cast as a char".to_string())
|
||||
})?
|
||||
== binds.key
|
||||
{
|
||||
request_key = keycode;
|
||||
} else {
|
||||
dbg!(binds.key.clone());
|
||||
})?;
|
||||
if iter_char == binds.key {
|
||||
request_key = *keycode;
|
||||
mask.inner = binds.mods.inner;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -186,7 +177,7 @@ async fn main() -> Result<()> {
|
|||
length: 4,
|
||||
grab_window: root,
|
||||
modifiers: mask,
|
||||
key: *request_key,
|
||||
key: request_key,
|
||||
pointer_mode: GrabMode::Async,
|
||||
keyboard_mode: GrabMode::Async,
|
||||
})
|
||||
|
@ -207,7 +198,7 @@ async fn main() -> Result<()> {
|
|||
tokio::select! {
|
||||
biased;
|
||||
Some(s) = recv.recv() => msg_listener::on_recv(s, &mut manager, &mut conn, &result_send).await?,
|
||||
Ok(ev) = conn.wait_for_event_async() => process_event(ev, &mut manager, &mut conn, root,&mut keyboard_state).await?,
|
||||
Ok(ev) = conn.wait_for_event_async() => process_event(ev, &mut manager, &mut conn, root, &mut keyboard_state).await?,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -263,7 +254,7 @@ async fn process_event<Dpy: AsyncDisplay + ?Sized>(
|
|||
if let Some(k) = keyboard_state.process_keycode(ev.detail, ev.state) {
|
||||
if let Some(c) = k.as_char() {
|
||||
for (&bind, action) in &CONFIG.binds {
|
||||
if bind.key == c && bind.mods == ev.state {
|
||||
if bind.key == c && bind.mods.inner == 20 {
|
||||
action.eval(manager, conn).await?;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -242,10 +242,7 @@ impl XcrabWindowManager {
|
|||
};
|
||||
|
||||
if let Some(focus) = self.focused {
|
||||
let focused_key = self.clients.get(&focus).unwrap();
|
||||
let focused = self.rects.get(*focused_key).unwrap();
|
||||
let focused_frame = focused.unwrap_client().frame;
|
||||
req.focus = focused_frame.input;
|
||||
req.focus = focus;
|
||||
}
|
||||
|
||||
conn.exchange_request_async(req).await?;
|
||||
|
@ -640,7 +637,6 @@ pub fn may_not_exist(res: breadx::Result) -> breadx::Result {
|
|||
pub struct FramedWindow {
|
||||
pub frame: Window,
|
||||
pub win: Window,
|
||||
pub input: Window,
|
||||
}
|
||||
|
||||
impl FramedWindow {
|
||||
|
@ -700,27 +696,12 @@ impl FramedWindow {
|
|||
.await,
|
||||
)?;
|
||||
|
||||
self.input
|
||||
.configure_async(
|
||||
conn,
|
||||
ConfigureWindowParameters {
|
||||
x: Some(0),
|
||||
y: Some(0),
|
||||
width,
|
||||
height,
|
||||
border_width: None,
|
||||
..Default::default()
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn map<Dpy: AsyncDisplay + ?Sized>(self, conn: &mut Dpy) -> Result<()> {
|
||||
may_not_exist(self.win.map_async(conn).await)?;
|
||||
self.frame.map_async(conn).await?;
|
||||
self.input.map_async(conn).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -736,10 +717,6 @@ impl FramedWindow {
|
|||
// no longer related to us, remove from save set
|
||||
may_not_exist(self.win.change_save_set_async(conn, SetMode::Delete).await)?;
|
||||
|
||||
self.input.unmap_async(conn).await?;
|
||||
|
||||
self.input.free_async(conn).await?;
|
||||
|
||||
self.frame.free_async(conn).await?;
|
||||
|
||||
Ok(())
|
||||
|
@ -851,21 +828,6 @@ async fn frame<Dpy: AsyncDisplay + ?Sized>(conn: &mut Dpy, win: Window) -> Resul
|
|||
)
|
||||
.await?;
|
||||
|
||||
let input = conn
|
||||
.create_window_async(
|
||||
frame,
|
||||
breadx::WindowClass::InputOnly,
|
||||
None,
|
||||
Some(conn.default_visual_id()),
|
||||
0,
|
||||
0,
|
||||
geometry.width,
|
||||
geometry.height,
|
||||
0,
|
||||
WindowParameters::default(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
frame
|
||||
.set_event_mask_async(
|
||||
conn,
|
||||
|
@ -876,21 +838,9 @@ async fn frame<Dpy: AsyncDisplay + ?Sized>(conn: &mut Dpy, win: Window) -> Resul
|
|||
win.set_event_mask_async(conn, EventMask::BUTTON_PRESS)
|
||||
.await?;
|
||||
|
||||
input
|
||||
.set_event_mask_async(
|
||||
conn,
|
||||
EventMask::BUTTON_PRESS
|
||||
| EventMask::BUTTON_RELEASE
|
||||
| EventMask::KEY_PRESS
|
||||
| EventMask::KEY_RELEASE
|
||||
| EventMask::ENTER_WINDOW
|
||||
| EventMask::LEAVE_WINDOW,
|
||||
)
|
||||
.await?;
|
||||
|
||||
may_not_exist(win.change_save_set_async(conn, SetMode::Insert).await)?;
|
||||
|
||||
may_not_exist(win.reparent_async(conn, frame, 0, 0).await)?;
|
||||
|
||||
Ok(FramedWindow { frame, win, input })
|
||||
Ok(FramedWindow { frame, win })
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue
Why is the third value
true
here?AFAIK the third param is Control, which definitely shouldn't be set by default, unless I'm misunderstanding what this code does
Nevermind, it seems to work anyway, so this is fine. Please see my other comments though.