mirror of
https://github.com/0PandaDEV/Qopy.git
synced 2025-04-21 21:24:05 +02:00

Fixes #10 Implement platform-specific focus management to prevent the underlying window from losing focus when the shortcut is pressed. * **src-tauri/src/api/hotkeys.rs** - Add platform-specific modules for Windows, macOS, and Linux to manage focus between windows. - Modify the `setup` function to use platform-specific APIs to manage focus between windows. - Replace `window.set_focus()` with `platform::manage_focus(&window)`. * **src-tauri/src/api/tray.rs** - Add platform-specific modules for Windows, macOS, and Linux to manage focus between windows when the tray menu is used. - Modify the `setup` function to use platform-specific APIs to manage focus between windows. - Replace `window_clone_for_tray.set_focus()` with `platform::manage_focus(&window_clone_for_tray)`. * **app.vue** - Add `manageFocus` function to handle platform-specific focus management. - Call `manageFocus` function when the `change_keybind` event is triggered. * **src-tauri/src/main.rs** - Remove logic to hide the window when it loses focus. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/0PandaDEV/Qopy/issues/10?shareId=XXXX-XXXX-XXXX-XXXX).
90 lines
3 KiB
Rust
90 lines
3 KiB
Rust
use crate::api::database::get_keybind;
|
|
use crate::utils::commands::center_window_on_current_monitor;
|
|
use rdev::{listen, EventType, Key};
|
|
use tauri::Manager;
|
|
|
|
#[cfg(target_os = "windows")]
|
|
mod platform {
|
|
use std::ptr::null_mut;
|
|
use winapi::um::winuser::{AttachThreadInput, GetForegroundWindow, GetWindowThreadProcessId, SetForegroundWindow};
|
|
|
|
pub fn manage_focus(window: &tauri::Window) {
|
|
unsafe {
|
|
let foreground_window = GetForegroundWindow();
|
|
let current_thread_id = GetWindowThreadProcessId(foreground_window, null_mut());
|
|
let target_thread_id = GetWindowThreadProcessId(window.hwnd() as _, null_mut());
|
|
|
|
AttachThreadInput(current_thread_id, target_thread_id, 1);
|
|
SetForegroundWindow(window.hwnd() as _);
|
|
AttachThreadInput(current_thread_id, target_thread_id, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(target_os = "macos")]
|
|
mod platform {
|
|
use cocoa::appkit::NSWindow;
|
|
use cocoa::base::id;
|
|
use objc::runtime::YES;
|
|
|
|
pub fn manage_focus(window: &tauri::Window) {
|
|
unsafe {
|
|
let ns_window: id = window.ns_window().unwrap() as _;
|
|
ns_window.makeKeyAndOrderFront_(YES);
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(target_os = "linux")]
|
|
mod platform {
|
|
use x11::xlib::{Display, XSetInputFocus, XDefaultRootWindow, XOpenDisplay, XCloseDisplay, RevertToParent};
|
|
|
|
pub fn manage_focus(window: &tauri::Window) {
|
|
unsafe {
|
|
let display: *mut Display = XOpenDisplay(null_mut());
|
|
let root_window = XDefaultRootWindow(display);
|
|
XSetInputFocus(display, root_window, RevertToParent, 0);
|
|
XCloseDisplay(display);
|
|
}
|
|
}
|
|
}
|
|
|
|
fn key_to_string(key: &Key) -> String {
|
|
format!("{:?}", key)
|
|
}
|
|
|
|
#[warn(dead_code)]
|
|
pub fn setup(app_handle: tauri::AppHandle) {
|
|
std::thread::spawn(move || {
|
|
let keybind = tauri::async_runtime::block_on(async { get_keybind(app_handle.clone()).await.unwrap_or_default() });
|
|
|
|
println!("Listening for keybind: {:?}", keybind);
|
|
|
|
let mut pressed_keys = vec![false; keybind.len()];
|
|
|
|
listen(move |event| {
|
|
match event.event_type {
|
|
EventType::KeyPress(key) => {
|
|
if let Some(index) = keybind.iter().position(|k| k == &key_to_string(&key)) {
|
|
pressed_keys[index] = true;
|
|
}
|
|
}
|
|
EventType::KeyRelease(key) => {
|
|
if let Some(index) = keybind.iter().position(|k| k == &key_to_string(&key)) {
|
|
pressed_keys[index] = false;
|
|
}
|
|
}
|
|
_ => {}
|
|
}
|
|
|
|
if pressed_keys.iter().all(|&k| k) {
|
|
pressed_keys.iter_mut().for_each(|k| *k = false);
|
|
let window = app_handle.get_webview_window("main").unwrap();
|
|
window.show().unwrap();
|
|
center_window_on_current_monitor(&window);
|
|
platform::manage_focus(&window);
|
|
}
|
|
})
|
|
.unwrap();
|
|
});
|
|
}
|