mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-04-24 01:28:39 +02:00
refactor(wm): float_rules > ignore_rules w/ compat
WIP
This commit is contained in:
@@ -116,7 +116,8 @@ pub struct ApplicationConfiguration {
|
|||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub options: Option<Vec<ApplicationOptions>>,
|
pub options: Option<Vec<ApplicationOptions>>,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub float_identifiers: Option<Vec<MatchingRule>>,
|
#[serde(alias = "float_identifiers")]
|
||||||
|
pub ignore_identifiers: Option<Vec<MatchingRule>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ApplicationConfiguration {
|
impl ApplicationConfiguration {
|
||||||
@@ -187,7 +188,7 @@ impl ApplicationConfigurationGenerator {
|
|||||||
|
|
||||||
let mut lines = vec![String::from("# Generated by komorebic.exe"), String::new()];
|
let mut lines = vec![String::from("# Generated by komorebic.exe"), String::new()];
|
||||||
|
|
||||||
let mut float_rules = vec![];
|
let mut ignore_rules = vec![];
|
||||||
|
|
||||||
for app in cfgen {
|
for app in cfgen {
|
||||||
lines.push(format!("# {}", app.name));
|
lines.push(format!("# {}", app.name));
|
||||||
@@ -201,15 +202,15 @@ impl ApplicationConfigurationGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(float_identifiers) = app.float_identifiers {
|
if let Some(ignore_identifiers) = app.ignore_identifiers {
|
||||||
for matching_rule in float_identifiers {
|
for matching_rule in ignore_identifiers {
|
||||||
if let MatchingRule::Simple(float) = matching_rule {
|
if let MatchingRule::Simple(float) = matching_rule {
|
||||||
let float_rule =
|
let float_rule =
|
||||||
format!("komorebic.exe float-rule {} \"{}\"", float.kind, float.id);
|
format!("komorebic.exe float-rule {} \"{}\"", float.kind, float.id);
|
||||||
|
|
||||||
// Don't want to send duped signals especially as configs get larger
|
// Don't want to send duped signals especially as configs get larger
|
||||||
if !float_rules.contains(&float_rule) {
|
if !ignore_rules.contains(&float_rule) {
|
||||||
float_rules.push(float_rule.clone());
|
ignore_rules.push(float_rule.clone());
|
||||||
|
|
||||||
// if let Some(comment) = float.comment {
|
// if let Some(comment) = float.comment {
|
||||||
// lines.push(format!("# {comment}"));
|
// lines.push(format!("# {comment}"));
|
||||||
@@ -238,7 +239,7 @@ impl ApplicationConfigurationGenerator {
|
|||||||
|
|
||||||
let mut lines = vec![String::from("; Generated by komorebic.exe"), String::new()];
|
let mut lines = vec![String::from("; Generated by komorebic.exe"), String::new()];
|
||||||
|
|
||||||
let mut float_rules = vec![];
|
let mut ignore_rules = vec![];
|
||||||
|
|
||||||
for app in cfgen {
|
for app in cfgen {
|
||||||
lines.push(format!("; {}", app.name));
|
lines.push(format!("; {}", app.name));
|
||||||
@@ -252,8 +253,8 @@ impl ApplicationConfigurationGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(float_identifiers) = app.float_identifiers {
|
if let Some(ignore_identifiers) = app.ignore_identifiers {
|
||||||
for matching_rule in float_identifiers {
|
for matching_rule in ignore_identifiers {
|
||||||
if let MatchingRule::Simple(float) = matching_rule {
|
if let MatchingRule::Simple(float) = matching_rule {
|
||||||
let float_rule = format!(
|
let float_rule = format!(
|
||||||
"RunWait('komorebic.exe float-rule {} \"{}\"', , \"Hide\")",
|
"RunWait('komorebic.exe float-rule {} \"{}\"', , \"Hide\")",
|
||||||
@@ -261,8 +262,8 @@ impl ApplicationConfigurationGenerator {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Don't want to send duped signals especially as configs get larger
|
// Don't want to send duped signals especially as configs get larger
|
||||||
if !float_rules.contains(&float_rule) {
|
if !ignore_rules.contains(&float_rule) {
|
||||||
float_rules.push(float_rule.clone());
|
ignore_rules.push(float_rule.clone());
|
||||||
|
|
||||||
// if let Some(comment) = float.comment {
|
// if let Some(comment) = float.comment {
|
||||||
// lines.push(format!("; {comment}"));
|
// lines.push(format!("; {comment}"));
|
||||||
|
|||||||
@@ -174,7 +174,8 @@ pub enum SocketMessage {
|
|||||||
ClearWorkspaceRules(usize, usize),
|
ClearWorkspaceRules(usize, usize),
|
||||||
ClearNamedWorkspaceRules(String),
|
ClearNamedWorkspaceRules(String),
|
||||||
ClearAllWorkspaceRules,
|
ClearAllWorkspaceRules,
|
||||||
FloatRule(ApplicationIdentifier, String),
|
#[serde(alias = "FloatRule")]
|
||||||
|
IgnoreRule(ApplicationIdentifier, String),
|
||||||
ManageRule(ApplicationIdentifier, String),
|
ManageRule(ApplicationIdentifier, String),
|
||||||
IdentifyObjectNameChangeApplication(ApplicationIdentifier, String),
|
IdentifyObjectNameChangeApplication(ApplicationIdentifier, String),
|
||||||
IdentifyTrayApplication(ApplicationIdentifier, String),
|
IdentifyTrayApplication(ApplicationIdentifier, String),
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ lazy_static! {
|
|||||||
static ref REGEX_IDENTIFIERS: Arc<Mutex<HashMap<String, Regex>>> =
|
static ref REGEX_IDENTIFIERS: Arc<Mutex<HashMap<String, Regex>>> =
|
||||||
Arc::new(Mutex::new(HashMap::new()));
|
Arc::new(Mutex::new(HashMap::new()));
|
||||||
static ref MANAGE_IDENTIFIERS: Arc<Mutex<Vec<MatchingRule>>> = Arc::new(Mutex::new(vec![]));
|
static ref MANAGE_IDENTIFIERS: Arc<Mutex<Vec<MatchingRule>>> = Arc::new(Mutex::new(vec![]));
|
||||||
static ref FLOAT_IDENTIFIERS: Arc<Mutex<Vec<MatchingRule>>> = Arc::new(Mutex::new(vec![
|
static ref IGNORE_IDENTIFIERS: Arc<Mutex<Vec<MatchingRule>>> = Arc::new(Mutex::new(vec![
|
||||||
// mstsc.exe creates these on Windows 11 when a WSL process is launched
|
// mstsc.exe creates these on Windows 11 when a WSL process is launched
|
||||||
// https://github.com/LGUG2Z/komorebi/issues/74
|
// https://github.com/LGUG2Z/komorebi/issues/74
|
||||||
MatchingRule::Simple(IdWithIdentifier {
|
MatchingRule::Simple(IdWithIdentifier {
|
||||||
|
|||||||
@@ -68,8 +68,8 @@ use crate::ANIMATION_STYLE;
|
|||||||
use crate::CUSTOM_FFM;
|
use crate::CUSTOM_FFM;
|
||||||
use crate::DATA_DIR;
|
use crate::DATA_DIR;
|
||||||
use crate::DISPLAY_INDEX_PREFERENCES;
|
use crate::DISPLAY_INDEX_PREFERENCES;
|
||||||
use crate::FLOAT_IDENTIFIERS;
|
|
||||||
use crate::HIDING_BEHAVIOUR;
|
use crate::HIDING_BEHAVIOUR;
|
||||||
|
use crate::IGNORE_IDENTIFIERS;
|
||||||
use crate::INITIAL_CONFIGURATION_LOADED;
|
use crate::INITIAL_CONFIGURATION_LOADED;
|
||||||
use crate::LAYERED_WHITELIST;
|
use crate::LAYERED_WHITELIST;
|
||||||
use crate::MANAGE_IDENTIFIERS;
|
use crate::MANAGE_IDENTIFIERS;
|
||||||
@@ -394,20 +394,20 @@ impl WindowManager {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SocketMessage::FloatRule(identifier, ref id) => {
|
SocketMessage::IgnoreRule(identifier, ref id) => {
|
||||||
let mut float_identifiers = FLOAT_IDENTIFIERS.lock();
|
let mut ignore_identifiers = IGNORE_IDENTIFIERS.lock();
|
||||||
|
|
||||||
let mut should_push = true;
|
let mut should_push = true;
|
||||||
for f in &*float_identifiers {
|
for i in &*ignore_identifiers {
|
||||||
if let MatchingRule::Simple(f) = f {
|
if let MatchingRule::Simple(i) = i {
|
||||||
if f.id.eq(id) {
|
if i.id.eq(id) {
|
||||||
should_push = false;
|
should_push = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if should_push {
|
if should_push {
|
||||||
float_identifiers.push(MatchingRule::Simple(IdWithIdentifier {
|
ignore_identifiers.push(MatchingRule::Simple(IdWithIdentifier {
|
||||||
kind: identifier,
|
kind: identifier,
|
||||||
id: id.clone(),
|
id: id.clone(),
|
||||||
matching_strategy: Option::from(MatchingStrategy::Legacy),
|
matching_strategy: Option::from(MatchingStrategy::Legacy),
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ use crate::DEFAULT_CONTAINER_PADDING;
|
|||||||
use crate::DEFAULT_WORKSPACE_PADDING;
|
use crate::DEFAULT_WORKSPACE_PADDING;
|
||||||
use crate::DISPLAY_INDEX_PREFERENCES;
|
use crate::DISPLAY_INDEX_PREFERENCES;
|
||||||
use crate::FLOATING_APPLICATIONS;
|
use crate::FLOATING_APPLICATIONS;
|
||||||
use crate::FLOAT_IDENTIFIERS;
|
|
||||||
use crate::HIDING_BEHAVIOUR;
|
use crate::HIDING_BEHAVIOUR;
|
||||||
|
use crate::IGNORE_IDENTIFIERS;
|
||||||
use crate::LAYERED_WHITELIST;
|
use crate::LAYERED_WHITELIST;
|
||||||
use crate::MANAGE_IDENTIFIERS;
|
use crate::MANAGE_IDENTIFIERS;
|
||||||
use crate::MONITOR_INDEX_PREFERENCES;
|
use crate::MONITOR_INDEX_PREFERENCES;
|
||||||
@@ -672,7 +672,7 @@ impl StaticConfig {
|
|||||||
transparency_manager::TRANSPARENCY_ALPHA
|
transparency_manager::TRANSPARENCY_ALPHA
|
||||||
.store(self.transparency_alpha.unwrap_or(200), Ordering::SeqCst);
|
.store(self.transparency_alpha.unwrap_or(200), Ordering::SeqCst);
|
||||||
|
|
||||||
let mut float_identifiers = FLOAT_IDENTIFIERS.lock();
|
let mut ignore_identifiers = IGNORE_IDENTIFIERS.lock();
|
||||||
let mut regex_identifiers = REGEX_IDENTIFIERS.lock();
|
let mut regex_identifiers = REGEX_IDENTIFIERS.lock();
|
||||||
let mut manage_identifiers = MANAGE_IDENTIFIERS.lock();
|
let mut manage_identifiers = MANAGE_IDENTIFIERS.lock();
|
||||||
let mut tray_and_multi_window_identifiers = TRAY_AND_MULTI_WINDOW_IDENTIFIERS.lock();
|
let mut tray_and_multi_window_identifiers = TRAY_AND_MULTI_WINDOW_IDENTIFIERS.lock();
|
||||||
@@ -683,7 +683,7 @@ impl StaticConfig {
|
|||||||
let mut floating_applications = FLOATING_APPLICATIONS.lock();
|
let mut floating_applications = FLOATING_APPLICATIONS.lock();
|
||||||
|
|
||||||
if let Some(rules) = &mut self.ignore_rules {
|
if let Some(rules) = &mut self.ignore_rules {
|
||||||
populate_rules(rules, &mut float_identifiers, &mut regex_identifiers)?;
|
populate_rules(rules, &mut ignore_identifiers, &mut regex_identifiers)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(rules) = &mut self.floating_applications {
|
if let Some(rules) = &mut self.floating_applications {
|
||||||
@@ -916,8 +916,8 @@ impl StaticConfig {
|
|||||||
let asc = ApplicationConfigurationGenerator::load(&content)?;
|
let asc = ApplicationConfigurationGenerator::load(&content)?;
|
||||||
|
|
||||||
for mut entry in asc {
|
for mut entry in asc {
|
||||||
if let Some(rules) = &mut entry.float_identifiers {
|
if let Some(rules) = &mut entry.ignore_identifiers {
|
||||||
populate_rules(rules, &mut float_identifiers, &mut regex_identifiers)?;
|
populate_rules(rules, &mut ignore_identifiers, &mut regex_identifiers)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref options) = entry.options {
|
if let Some(ref options) = entry.options {
|
||||||
|
|||||||
@@ -41,9 +41,9 @@ use crate::styles::WindowStyle;
|
|||||||
use crate::transparency_manager;
|
use crate::transparency_manager;
|
||||||
use crate::window_manager_event::WindowManagerEvent;
|
use crate::window_manager_event::WindowManagerEvent;
|
||||||
use crate::windows_api::WindowsApi;
|
use crate::windows_api::WindowsApi;
|
||||||
use crate::FLOAT_IDENTIFIERS;
|
|
||||||
use crate::HIDDEN_HWNDS;
|
use crate::HIDDEN_HWNDS;
|
||||||
use crate::HIDING_BEHAVIOUR;
|
use crate::HIDING_BEHAVIOUR;
|
||||||
|
use crate::IGNORE_IDENTIFIERS;
|
||||||
use crate::LAYERED_WHITELIST;
|
use crate::LAYERED_WHITELIST;
|
||||||
use crate::MANAGE_IDENTIFIERS;
|
use crate::MANAGE_IDENTIFIERS;
|
||||||
use crate::NO_TITLEBAR;
|
use crate::NO_TITLEBAR;
|
||||||
@@ -566,13 +566,13 @@ fn window_is_eligible(
|
|||||||
|
|
||||||
let regex_identifiers = REGEX_IDENTIFIERS.lock();
|
let regex_identifiers = REGEX_IDENTIFIERS.lock();
|
||||||
|
|
||||||
let float_identifiers = FLOAT_IDENTIFIERS.lock();
|
let ignore_identifiers = IGNORE_IDENTIFIERS.lock();
|
||||||
let should_float = if let Some(rule) = should_act(
|
let should_float = if let Some(rule) = should_act(
|
||||||
title,
|
title,
|
||||||
exe_name,
|
exe_name,
|
||||||
class,
|
class,
|
||||||
path,
|
path,
|
||||||
&float_identifiers,
|
&ignore_identifiers,
|
||||||
®ex_identifiers,
|
®ex_identifiers,
|
||||||
) {
|
) {
|
||||||
debug.matches_float_identifier = Some(rule);
|
debug.matches_float_identifier = Some(rule);
|
||||||
|
|||||||
@@ -71,9 +71,9 @@ use crate::Rgb;
|
|||||||
use crate::CUSTOM_FFM;
|
use crate::CUSTOM_FFM;
|
||||||
use crate::DATA_DIR;
|
use crate::DATA_DIR;
|
||||||
use crate::DISPLAY_INDEX_PREFERENCES;
|
use crate::DISPLAY_INDEX_PREFERENCES;
|
||||||
use crate::FLOAT_IDENTIFIERS;
|
|
||||||
use crate::HIDING_BEHAVIOUR;
|
use crate::HIDING_BEHAVIOUR;
|
||||||
use crate::HOME_DIR;
|
use crate::HOME_DIR;
|
||||||
|
use crate::IGNORE_IDENTIFIERS;
|
||||||
use crate::LAYERED_WHITELIST;
|
use crate::LAYERED_WHITELIST;
|
||||||
use crate::MANAGE_IDENTIFIERS;
|
use crate::MANAGE_IDENTIFIERS;
|
||||||
use crate::MONITOR_INDEX_PREFERENCES;
|
use crate::MONITOR_INDEX_PREFERENCES;
|
||||||
@@ -136,7 +136,8 @@ pub struct GlobalState {
|
|||||||
pub stackbar_tab_width: i32,
|
pub stackbar_tab_width: i32,
|
||||||
pub stackbar_height: i32,
|
pub stackbar_height: i32,
|
||||||
pub remove_titlebars: bool,
|
pub remove_titlebars: bool,
|
||||||
pub float_identifiers: Vec<MatchingRule>,
|
#[serde(alias = "float_identifiers")]
|
||||||
|
pub ignore_identifiers: Vec<MatchingRule>,
|
||||||
pub manage_identifiers: Vec<MatchingRule>,
|
pub manage_identifiers: Vec<MatchingRule>,
|
||||||
pub layered_whitelist: Vec<MatchingRule>,
|
pub layered_whitelist: Vec<MatchingRule>,
|
||||||
pub tray_and_multi_window_identifiers: Vec<MatchingRule>,
|
pub tray_and_multi_window_identifiers: Vec<MatchingRule>,
|
||||||
@@ -185,7 +186,7 @@ impl Default for GlobalState {
|
|||||||
stackbar_tab_width: STACKBAR_TAB_WIDTH.load(Ordering::SeqCst),
|
stackbar_tab_width: STACKBAR_TAB_WIDTH.load(Ordering::SeqCst),
|
||||||
stackbar_height: STACKBAR_TAB_HEIGHT.load(Ordering::SeqCst),
|
stackbar_height: STACKBAR_TAB_HEIGHT.load(Ordering::SeqCst),
|
||||||
remove_titlebars: REMOVE_TITLEBARS.load(Ordering::SeqCst),
|
remove_titlebars: REMOVE_TITLEBARS.load(Ordering::SeqCst),
|
||||||
float_identifiers: FLOAT_IDENTIFIERS.lock().clone(),
|
ignore_identifiers: IGNORE_IDENTIFIERS.lock().clone(),
|
||||||
manage_identifiers: MANAGE_IDENTIFIERS.lock().clone(),
|
manage_identifiers: MANAGE_IDENTIFIERS.lock().clone(),
|
||||||
layered_whitelist: LAYERED_WHITELIST.lock().clone(),
|
layered_whitelist: LAYERED_WHITELIST.lock().clone(),
|
||||||
tray_and_multi_window_identifiers: TRAY_AND_MULTI_WINDOW_IDENTIFIERS.lock().clone(),
|
tray_and_multi_window_identifiers: TRAY_AND_MULTI_WINDOW_IDENTIFIERS.lock().clone(),
|
||||||
|
|||||||
@@ -583,7 +583,7 @@ macro_rules! gen_application_target_subcommand_args {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gen_application_target_subcommand_args! {
|
gen_application_target_subcommand_args! {
|
||||||
FloatRule,
|
IgnoreRule,
|
||||||
ManageRule,
|
ManageRule,
|
||||||
IdentifyTrayApplication,
|
IdentifyTrayApplication,
|
||||||
IdentifyLayeredApplication,
|
IdentifyLayeredApplication,
|
||||||
@@ -1208,9 +1208,10 @@ enum SubCommand {
|
|||||||
/// Set the operation behaviour when the focused window is not managed
|
/// Set the operation behaviour when the focused window is not managed
|
||||||
#[clap(arg_required_else_help = true)]
|
#[clap(arg_required_else_help = true)]
|
||||||
UnmanagedWindowOperationBehaviour(UnmanagedWindowOperationBehaviour),
|
UnmanagedWindowOperationBehaviour(UnmanagedWindowOperationBehaviour),
|
||||||
/// Add a rule to always float the specified application
|
/// Add a rule to ignore the specified application
|
||||||
#[clap(arg_required_else_help = true)]
|
#[clap(arg_required_else_help = true)]
|
||||||
FloatRule(FloatRule),
|
#[clap(alias = "float-rule")]
|
||||||
|
IgnoreRule(IgnoreRule),
|
||||||
/// Add a rule to always manage the specified application
|
/// Add a rule to always manage the specified application
|
||||||
#[clap(arg_required_else_help = true)]
|
#[clap(arg_required_else_help = true)]
|
||||||
ManageRule(ManageRule),
|
ManageRule(ManageRule),
|
||||||
@@ -2154,8 +2155,8 @@ Stop-Process -Name:komorebi -ErrorAction SilentlyContinue
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SubCommand::FloatRule(arg) => {
|
SubCommand::IgnoreRule(arg) => {
|
||||||
send_message(&SocketMessage::FloatRule(arg.identifier, arg.id))?;
|
send_message(&SocketMessage::IgnoreRule(arg.identifier, arg.id))?;
|
||||||
}
|
}
|
||||||
SubCommand::ManageRule(arg) => {
|
SubCommand::ManageRule(arg) => {
|
||||||
send_message(&SocketMessage::ManageRule(arg.identifier, arg.id))?;
|
send_message(&SocketMessage::ManageRule(arg.identifier, arg.id))?;
|
||||||
|
|||||||
Reference in New Issue
Block a user