From 0c18dac007b981d86f9dc7eaaa517725eb2ee4c3 Mon Sep 17 00:00:00 2001 From: asrma7 Date: Sat, 13 Jun 2026 14:56:29 -0400 Subject: [PATCH] Refactor window exit behavior and improve button focus styles --- src/app/mod.rs | 48 +++++++++++++++++++++++++----------------------- src/main.rs | 14 ++++++++++++-- style.css | 5 ++--- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index d5def4b..ff94bf9 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -10,7 +10,7 @@ use glib::object::Cast; use glib::timeout_add_local_once; use glib_macros::{clone, closure}; use gtk4::prelude::{BoxExt, ButtonExt, GObjectPropertyExpressionExt, GtkWindowExt, WidgetExt}; -use gtk4::{EventControllerKey, GestureClick, PropagationPhase}; +use gtk4::{EventControllerKey, EventControllerMotion, GestureClick, PropagationPhase}; use gtk4_layer_shell::{KeyboardMode, LayerShell}; use libadwaita::prelude::AdwApplicationWindowExt; use std::sync::Arc; @@ -18,8 +18,12 @@ use std::time::Duration; use wleave::cli_opt::{ButtonLayout, Protocol}; use wleave::units::{AspectRatio, LengthArgs, LengthDimension}; -fn do_exit(window: &WleaveWindow, _service_mode: bool) { - window.close(); +fn do_exit(window: &WleaveWindow, service_mode: bool) { + if service_mode { + window.set_visible(false); + } else { + window.close(); + } } fn on_option( @@ -34,27 +38,15 @@ fn on_option( let command = command.clone(); - window.connect_hide(clone!( - #[strong] - command, - move |window| { - timeout_add_local_once( - Duration::from_millis(delay_ms.into()), - clone!( - #[strong] - command, - #[weak_allow_none] - window, - move || { - run_command(command); - window.inspect(move |w| do_exit(w, service_mode)); - } - ), - ); - } - )); - window.set_visible(false); + + timeout_add_local_once(Duration::from_millis(delay_ms.into()), move || { + run_command(command); + + if !service_mode { + do_exit(&window, service_mode); + } + }); } fn handle_key( @@ -272,6 +264,16 @@ pub fn create_app(config: &Arc, app: &libadwaita::Application) -> Wle .cursor(&gdk4::Cursor::from_name("pointer", None).expect("pointer cursor not found")) .build(); + let motion_controller = EventControllerMotion::new(); + motion_controller.connect_enter(clone!( + #[weak] + button, + move |_, _, _| { + button.grab_focus(); + } + )); + button.add_controller(motion_controller); + let overlay = gtk4::Overlay::builder().vexpand(true).hexpand(true).build(); if config.show_keybinds { diff --git a/src/main.rs b/src/main.rs index 524b1d2..f0fc0c6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,14 +7,14 @@ mod layout; mod paintable; use clap::Parser; -use glib::clone; +use glib::{clone, object::Cast}; use std::sync::Arc; use tracing::{Level, error}; use tracing_subscriber::EnvFilter; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; -use crate::app::create_app; +use crate::app::{create_app, window::WleaveWindow}; use crate::config::{AppConfig, load_config, load_css, merge_with_args}; use gtk4::gdk::Display; use gtk4::prelude::*; @@ -57,6 +57,16 @@ fn entry_point(config: Arc) -> miette::Result<()> { app.connect_activate(move |app| { let _ = &hold_guard; + if config.service + && let Some(app_window) = app + .windows() + .into_iter() + .find_map(|window| window.downcast::().ok()) + { + app_window.present(); + return; + } + let app_window = create_app(&config, app); app_window.present(); }); diff --git a/style.css b/style.css index 57d9c80..4f1e0ca 100644 --- a/style.css +++ b/style.css @@ -25,12 +25,11 @@ button label.keybind { font-family: monospace; } -button:hover label.keybind, button:focus label.keybind { +button:focus label.keybind { opacity: 1; } -button:focus, -button:hover { +button:focus { background-color: color-mix(in srgb, var(--accent-bg-color), var(--view-bg-color)); }