mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-04-19 23:31:25 +02:00
feat(config): add animation options
This commit is contained in:
@@ -129,9 +129,9 @@ pub enum SocketMessage {
|
|||||||
WatchConfiguration(bool),
|
WatchConfiguration(bool),
|
||||||
CompleteConfiguration,
|
CompleteConfiguration,
|
||||||
AltFocusHack(bool),
|
AltFocusHack(bool),
|
||||||
Animate(bool),
|
Animation(bool),
|
||||||
AnimateDuration(u64),
|
AnimationDuration(u64),
|
||||||
AnimateEase(EaseEnum),
|
AnimationEase(EaseEnum),
|
||||||
ActiveWindowBorder(bool),
|
ActiveWindowBorder(bool),
|
||||||
ActiveWindowBorderColour(WindowKind, u32, u32, u32),
|
ActiveWindowBorderColour(WindowKind, u32, u32, u32),
|
||||||
ActiveWindowBorderWidth(i32),
|
ActiveWindowBorderWidth(i32),
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use std::f64::consts::PI;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
|
||||||
use crate::ANIMATE_EASE;
|
use crate::ANIMATION_EASE;
|
||||||
|
|
||||||
pub trait Ease {
|
pub trait Ease {
|
||||||
fn evaluate(t: f64) -> f64;
|
fn evaluate(t: f64) -> f64;
|
||||||
@@ -363,7 +363,7 @@ impl Ease for EaseInOutBounce {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn apply_ease_func(t: f64) -> f64 {
|
fn apply_ease_func(t: f64) -> f64 {
|
||||||
let ease = *ANIMATE_EASE.lock();
|
let ease = *ANIMATION_EASE.lock();
|
||||||
|
|
||||||
match ease {
|
match ease {
|
||||||
EaseEnum::Linear => Linear::evaluate(t),
|
EaseEnum::Linear => Linear::evaluate(t),
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ lazy_static! {
|
|||||||
static ref BORDER_OFFSET: Arc<Mutex<Option<Rect>>> =
|
static ref BORDER_OFFSET: Arc<Mutex<Option<Rect>>> =
|
||||||
Arc::new(Mutex::new(None));
|
Arc::new(Mutex::new(None));
|
||||||
|
|
||||||
static ref ANIMATE_EASE: Arc<Mutex<EaseEnum>> = Arc::new(Mutex::new(EaseEnum::EaseInOutExpo));
|
static ref ANIMATION_EASE: Arc<Mutex<EaseEnum>> = Arc::new(Mutex::new(EaseEnum::Linear));
|
||||||
|
|
||||||
// Use app-specific titlebar removal options where possible
|
// Use app-specific titlebar removal options where possible
|
||||||
// eg. Windows Terminal, IntelliJ IDEA, Firefox
|
// eg. Windows Terminal, IntelliJ IDEA, Firefox
|
||||||
@@ -242,8 +242,8 @@ pub static BORDER_WIDTH: AtomicI32 = AtomicI32::new(20);
|
|||||||
// 0 0 0 aka pure black, I doubt anyone will want this as a border colour
|
// 0 0 0 aka pure black, I doubt anyone will want this as a border colour
|
||||||
pub const TRANSPARENCY_COLOUR: u32 = 0;
|
pub const TRANSPARENCY_COLOUR: u32 = 0;
|
||||||
pub static REMOVE_TITLEBARS: AtomicBool = AtomicBool::new(false);
|
pub static REMOVE_TITLEBARS: AtomicBool = AtomicBool::new(false);
|
||||||
pub static ANIMATE_ENABLED: AtomicBool = AtomicBool::new(true);
|
pub static ANIMATION_ENABLED: AtomicBool = AtomicBool::new(false);
|
||||||
pub static ANIMATE_DURATION: AtomicU64 = AtomicU64::new(250);
|
pub static ANIMATION_DURATION: AtomicU64 = AtomicU64::new(250);
|
||||||
|
|
||||||
pub static HIDDEN_HWND: AtomicIsize = AtomicIsize::new(0);
|
pub static HIDDEN_HWND: AtomicIsize = AtomicIsize::new(0);
|
||||||
|
|
||||||
|
|||||||
@@ -47,9 +47,9 @@ use crate::windows_api::WindowsApi;
|
|||||||
use crate::Notification;
|
use crate::Notification;
|
||||||
use crate::NotificationEvent;
|
use crate::NotificationEvent;
|
||||||
use crate::ALT_FOCUS_HACK;
|
use crate::ALT_FOCUS_HACK;
|
||||||
use crate::ANIMATE_DURATION;
|
use crate::ANIMATION_DURATION;
|
||||||
use crate::ANIMATE_EASE;
|
use crate::ANIMATION_EASE;
|
||||||
use crate::ANIMATE_ENABLED;
|
use crate::ANIMATION_ENABLED;
|
||||||
use crate::BORDER_COLOUR_CURRENT;
|
use crate::BORDER_COLOUR_CURRENT;
|
||||||
use crate::BORDER_COLOUR_MONOCLE;
|
use crate::BORDER_COLOUR_MONOCLE;
|
||||||
use crate::BORDER_COLOUR_SINGLE;
|
use crate::BORDER_COLOUR_SINGLE;
|
||||||
@@ -1143,14 +1143,14 @@ impl WindowManager {
|
|||||||
self.hide_border()?;
|
self.hide_border()?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SocketMessage::Animate(enable) => {
|
SocketMessage::Animation(enable) => {
|
||||||
ANIMATE_ENABLED.store(enable, Ordering::SeqCst);
|
ANIMATION_ENABLED.store(enable, Ordering::SeqCst);
|
||||||
}
|
}
|
||||||
SocketMessage::AnimateDuration(duration) => {
|
SocketMessage::AnimationDuration(duration) => {
|
||||||
ANIMATE_DURATION.store(duration, Ordering::SeqCst);
|
ANIMATION_DURATION.store(duration, Ordering::SeqCst);
|
||||||
}
|
}
|
||||||
SocketMessage::AnimateEase(ease) => {
|
SocketMessage::AnimationEase(ease) => {
|
||||||
*ANIMATE_EASE.lock() = ease;
|
*ANIMATION_EASE.lock() = ease;
|
||||||
}
|
}
|
||||||
SocketMessage::ActiveWindowBorderColour(kind, r, g, b) => {
|
SocketMessage::ActiveWindowBorderColour(kind, r, g, b) => {
|
||||||
match kind {
|
match kind {
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ use crate::window_manager_event::WindowManagerEvent;
|
|||||||
use crate::windows_api::WindowsApi;
|
use crate::windows_api::WindowsApi;
|
||||||
use crate::workspace::Workspace;
|
use crate::workspace::Workspace;
|
||||||
use crate::ALT_FOCUS_HACK;
|
use crate::ALT_FOCUS_HACK;
|
||||||
|
use crate::ANIMATION_DURATION;
|
||||||
|
use crate::ANIMATION_EASE;
|
||||||
|
use crate::ANIMATION_ENABLED;
|
||||||
use crate::BORDER_COLOUR_CURRENT;
|
use crate::BORDER_COLOUR_CURRENT;
|
||||||
use crate::BORDER_COLOUR_MONOCLE;
|
use crate::BORDER_COLOUR_MONOCLE;
|
||||||
use crate::BORDER_COLOUR_SINGLE;
|
use crate::BORDER_COLOUR_SINGLE;
|
||||||
@@ -39,6 +42,7 @@ use komorebi_core::config_generation::MatchingStrategy;
|
|||||||
use komorebi_core::resolve_home_path;
|
use komorebi_core::resolve_home_path;
|
||||||
use komorebi_core::ApplicationIdentifier;
|
use komorebi_core::ApplicationIdentifier;
|
||||||
use komorebi_core::DefaultLayout;
|
use komorebi_core::DefaultLayout;
|
||||||
|
use komorebi_core::EaseEnum;
|
||||||
use komorebi_core::FocusFollowsMouseImplementation;
|
use komorebi_core::FocusFollowsMouseImplementation;
|
||||||
use komorebi_core::HidingBehaviour;
|
use komorebi_core::HidingBehaviour;
|
||||||
use komorebi_core::Layout;
|
use komorebi_core::Layout;
|
||||||
@@ -312,6 +316,15 @@ pub struct StaticConfig {
|
|||||||
/// Set monitor index preferences
|
/// Set monitor index preferences
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub monitor_index_preferences: Option<HashMap<usize, Rect>>,
|
pub monitor_index_preferences: Option<HashMap<usize, Rect>>,
|
||||||
|
/// Enable or disable animations (default: false)
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub animation: Option<bool>,
|
||||||
|
/// Set the animation ease function (default: Linear)
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub animation_ease: Option<EaseEnum>,
|
||||||
|
/// Set the animation duration in ms (default: 250)
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub animation_duration: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&WindowManager> for StaticConfig {
|
impl From<&WindowManager> for StaticConfig {
|
||||||
@@ -432,6 +445,9 @@ impl From<&WindowManager> for StaticConfig {
|
|||||||
layered_applications: None,
|
layered_applications: None,
|
||||||
object_name_change_applications: None,
|
object_name_change_applications: None,
|
||||||
monitor_index_preferences: Option::from(MONITOR_INDEX_PREFERENCES.lock().clone()),
|
monitor_index_preferences: Option::from(MONITOR_INDEX_PREFERENCES.lock().clone()),
|
||||||
|
animation: Option::from(ANIMATION_ENABLED.load(Ordering::SeqCst)),
|
||||||
|
animation_duration: Option::from(ANIMATION_DURATION.load(Ordering::SeqCst)),
|
||||||
|
animation_ease: Option::from(*ANIMATION_EASE.lock()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -449,6 +465,19 @@ impl StaticConfig {
|
|||||||
*window_hiding_behaviour = behaviour;
|
*window_hiding_behaviour = behaviour;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(animation) = self.animation {
|
||||||
|
ANIMATION_ENABLED.store(animation, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(duration) = self.animation_duration {
|
||||||
|
ANIMATION_DURATION.store(duration, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(ease) = self.animation_ease {
|
||||||
|
let mut animation_ease = ANIMATION_EASE.lock();
|
||||||
|
*animation_ease = ease;
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(hack) = self.alt_focus_hack {
|
if let Some(hack) = self.alt_focus_hack {
|
||||||
ALT_FOCUS_HACK.store(hack, Ordering::SeqCst);
|
ALT_FOCUS_HACK.store(hack, Ordering::SeqCst);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use crate::com::SetCloak;
|
use crate::com::SetCloak;
|
||||||
use crate::winevent_listener::WINEVENT_CALLBACK_CHANNEL;
|
use crate::winevent_listener::WINEVENT_CALLBACK_CHANNEL;
|
||||||
use crate::ANIMATE_DURATION;
|
use crate::ANIMATION_DURATION;
|
||||||
use crate::ANIMATE_ENABLED;
|
use crate::ANIMATION_ENABLED;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
@@ -148,7 +148,7 @@ impl Window {
|
|||||||
WindowsApi::position_window(hwnd, layout, top)
|
WindowsApi::position_window(hwnd, layout, top)
|
||||||
} else {
|
} else {
|
||||||
let target_rect = *layout;
|
let target_rect = *layout;
|
||||||
let duration = Duration::from_millis(ANIMATE_DURATION.load(Ordering::SeqCst));
|
let duration = Duration::from_millis(ANIMATION_DURATION.load(Ordering::SeqCst));
|
||||||
let mut animation = self.animation;
|
let mut animation = self.animation;
|
||||||
|
|
||||||
let self_copied = *self;
|
let self_copied = *self;
|
||||||
@@ -209,7 +209,7 @@ impl Window {
|
|||||||
rect.bottom += invisible_borders.bottom;
|
rect.bottom += invisible_borders.bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ANIMATE_ENABLED.load(Ordering::SeqCst) {
|
if ANIMATION_ENABLED.load(Ordering::SeqCst) {
|
||||||
// check if animation is in progress
|
// check if animation is in progress
|
||||||
if self.animation.in_progress {
|
if self.animation.in_progress {
|
||||||
// wait for cancel animation
|
// wait for cancel animation
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ use crate::ring::Ring;
|
|||||||
use crate::static_config::WorkspaceConfig;
|
use crate::static_config::WorkspaceConfig;
|
||||||
use crate::window::Window;
|
use crate::window::Window;
|
||||||
use crate::windows_api::WindowsApi;
|
use crate::windows_api::WindowsApi;
|
||||||
use crate::ANIMATE_ENABLED;
|
use crate::ANIMATION_ENABLED;
|
||||||
use crate::BORDER_HIDDEN;
|
use crate::BORDER_HIDDEN;
|
||||||
use crate::BORDER_HWND;
|
use crate::BORDER_HWND;
|
||||||
use crate::DEFAULT_CONTAINER_PADDING;
|
use crate::DEFAULT_CONTAINER_PADDING;
|
||||||
@@ -248,7 +248,7 @@ impl Workspace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if *self.tile() {
|
if *self.tile() {
|
||||||
if ANIMATE_ENABLED.load(Ordering::SeqCst) {
|
if ANIMATION_ENABLED.load(Ordering::SeqCst) {
|
||||||
let border = Border::from(BORDER_HWND.load(Ordering::SeqCst));
|
let border = Border::from(BORDER_HWND.load(Ordering::SeqCst));
|
||||||
border.hide()?;
|
border.hide()?;
|
||||||
BORDER_HIDDEN.store(true, Ordering::SeqCst);
|
BORDER_HIDDEN.store(true, Ordering::SeqCst);
|
||||||
|
|||||||
@@ -2016,13 +2016,13 @@ Stop-Process -Name:whkd -ErrorAction SilentlyContinue
|
|||||||
send_message(&SocketMessage::ActiveWindowBorderOffset(arg.offset).as_bytes()?)?;
|
send_message(&SocketMessage::ActiveWindowBorderOffset(arg.offset).as_bytes()?)?;
|
||||||
}
|
}
|
||||||
SubCommand::Animate(arg) => {
|
SubCommand::Animate(arg) => {
|
||||||
send_message(&SocketMessage::Animate(arg.boolean_state.into()).as_bytes()?)?;
|
send_message(&SocketMessage::Animation(arg.boolean_state.into()).as_bytes()?)?;
|
||||||
}
|
}
|
||||||
SubCommand::AnimateDuration(arg) => {
|
SubCommand::AnimateDuration(arg) => {
|
||||||
send_message(&SocketMessage::AnimateDuration(arg.duration).as_bytes()?)?;
|
send_message(&SocketMessage::AnimationDuration(arg.duration).as_bytes()?)?;
|
||||||
}
|
}
|
||||||
SubCommand::AnimateEase(arg) => {
|
SubCommand::AnimateEase(arg) => {
|
||||||
send_message(&SocketMessage::AnimateEase(arg.ease_func).as_bytes()?)?;
|
send_message(&SocketMessage::AnimationEase(arg.ease_func).as_bytes()?)?;
|
||||||
}
|
}
|
||||||
SubCommand::ResizeDelta(arg) => {
|
SubCommand::ResizeDelta(arg) => {
|
||||||
send_message(&SocketMessage::ResizeDelta(arg.pixels).as_bytes()?)?;
|
send_message(&SocketMessage::ResizeDelta(arg.pixels).as_bytes()?)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user