Skip to content

Commit

Permalink
fix: change focus method; remove input simulation to other processes (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
lars-berger authored Oct 1, 2024
1 parent 058bfa7 commit 390d93b
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 22 deletions.
1 change: 0 additions & 1 deletion packages/wm/src/common/events/handle_window_focused.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ use crate::{
containers::{commands::set_focused_descendant, traits::CommonGetters},
user_config::{UserConfig, WindowRuleEvent},
windows::{commands::run_window_rules, traits::WindowGetters},
wm_event::WmEvent,
wm_state::WmState,
workspaces::{commands::focus_workspace, WorkspaceTarget},
};
Expand Down
30 changes: 9 additions & 21 deletions packages/wm/src/common/platform/native_window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@ use windows::{
PROCESS_QUERY_LIMITED_INFORMATION,
},
UI::{
Input::KeyboardAndMouse::{
SendInput, INPUT, INPUT_0, INPUT_KEYBOARD, KEYBDINPUT,
KEYBD_EVENT_FLAGS, VIRTUAL_KEY,
},
Input::KeyboardAndMouse::{SendInput, INPUT, INPUT_MOUSE},
WindowsAndMessaging::{
EnumWindows, GetClassNameW, GetWindow, GetWindowLongPtrW,
GetWindowRect, GetWindowTextW, GetWindowThreadProcessId, IsIconic,
Expand Down Expand Up @@ -284,23 +281,14 @@ impl NativeWindow {
}

pub fn set_foreground(&self) -> anyhow::Result<()> {
let input = INPUT {
r#type: INPUT_KEYBOARD,
Anonymous: INPUT_0 {
ki: KEYBDINPUT {
wVk: VIRTUAL_KEY(1),
wScan: 0,
dwFlags: KEYBD_EVENT_FLAGS(0),
time: 0,
dwExtraInfo: 0,
},
},
};

// Simulate a key press event to activate the window. VK code 1 is a
// left mouse button press and caused the least side effects versus
// other key codes.
unsafe { SendInput(&[input], std::mem::size_of::<INPUT>() as i32) };
let input = [INPUT {
r#type: INPUT_MOUSE,
..Default::default()
}];

// Bypass restriction for setting the foreground window by sending an
// input to our own process first.
unsafe { SendInput(&input, std::mem::size_of::<INPUT>() as i32) };

// Set as the foreground window.
unsafe { SetForegroundWindow(HWND(self.handle)) }.ok()?;
Expand Down

0 comments on commit 390d93b

Please sign in to comment.