fix: force per-workspace setting

This commit is contained in:
Ashley Wulber 2024-05-10 11:39:11 -04:00 • committed by Ashley Wulber
parent 1d6b5d7ec9
commit 42b4145626

View file

@ -32,7 +32,6 @@ pub struct Window {
timeline: Timeline, timeline: Timeline,
config: CosmicCompConfig, config: CosmicCompConfig,
config_helper: Config, config_helper: Config,
autotile_behavior_model: segmented_button::SingleSelectModel,
new_workspace_behavior_model: segmented_button::SingleSelectModel, new_workspace_behavior_model: segmented_button::SingleSelectModel,
new_workspace_entity: Entity, new_workspace_entity: Entity,
/// may not match the config value if behavior is per-workspace /// may not match the config value if behavior is per-workspace
@ -78,25 +77,17 @@ impl cosmic::Application for Window {
active_hint.value = core.system_theme().cosmic().active_hint as i32; active_hint.value = core.system_theme().cosmic().active_hint as i32;
let config_helper = let config_helper =
Config::new("com.system76.CosmicComp", CosmicCompConfig::VERSION).unwrap(); Config::new("com.system76.CosmicComp", CosmicCompConfig::VERSION).unwrap();
let config = CosmicCompConfig::get_entry(&config_helper).unwrap_or_else(|(errs, c)| { let mut config = CosmicCompConfig::get_entry(&config_helper).unwrap_or_else(|(errs, c)| {
for err in errs { for err in errs {
error!(?err, "Error loading config"); error!(?err, "Error loading config");
} }
c c
}); });
let mut autotile_behavior_model = SingleSelectModel::default();
let autotile_global_entity = autotile_behavior_model // Global is removed in favor of per-workspace
.insert() if let Err(err) = config.set_autotile_behavior(&config_helper, TileBehavior::PerWorkspace) {
.text(fl!("all-workspaces")) error!(?err, "Failed to set autotile behavior to PerWorkspace");
.id(); }
let per = autotile_behavior_model
.insert()
.text(fl!("per-workspace"))
.id();
autotile_behavior_model.activate(match config.autotile_behavior {
TileBehavior::Global => autotile_global_entity,
TileBehavior::PerWorkspace => per,
});
let mut new_workspace_behavior_model = SingleSelectModel::default(); let mut new_workspace_behavior_model = SingleSelectModel::default();
let new_workspace_entity = new_workspace_behavior_model let new_workspace_entity = new_workspace_behavior_model
@ -120,7 +111,6 @@ impl cosmic::Application for Window {
autotiled: config.autotile, autotiled: config.autotile,
config, config,
config_helper, config_helper,
autotile_behavior_model,
new_workspace_behavior_model, new_workspace_behavior_model,
new_workspace_entity, new_workspace_entity,
workspace_tx: None, workspace_tx: None,
@ -200,31 +190,17 @@ impl cosmic::Application for Window {
Message::ToggleTileWindows(chain, toggled) => { Message::ToggleTileWindows(chain, toggled) => {
self.timeline.set_chain(chain).start(); self.timeline.set_chain(chain).start();
self.autotiled = toggled; self.autotiled = toggled;
if matches!(self.config.autotile_behavior, TileBehavior::Global) {
self.config.autotile = toggled;
if toggled {
self.new_workspace_behavior_model.activate_position(0);
} else {
self.new_workspace_behavior_model.activate_position(1);
}
let helper = self.config_helper.clone();
thread::spawn(move || {
if let Err(err) = helper.set("autotile", toggled) {
error!(?err, "Failed to set autotile {toggled}");
}
});
} else {
// set via protocol
if let Some(tx) = self.workspace_tx.as_ref() {
let state = if toggled {
TilingState::TilingEnabled
} else {
TilingState::FloatingOnly
};
if let Err(err) = tx.send(state) { // set via protocol
error!("Failed to send the tiling state update. {err:?}") if let Some(tx) = self.workspace_tx.as_ref() {
} let state = if toggled {
TilingState::TilingEnabled
} else {
TilingState::FloatingOnly
};
if let Err(err) = tx.send(state) {
error!("Failed to send the tiling state update. {err:?}")
} }
} }
} }
@ -240,26 +216,11 @@ impl cosmic::Application for Window {
}); });
} }
Message::MyConfigUpdate(c) => { Message::MyConfigUpdate(c) => {
if matches!(c.autotile_behavior, TileBehavior::Global) { if c.autotile != self.config.autotile {
if c.autotile != self.config.autotile { self.new_workspace_behavior_model
if self.popup.is_some() { .activate_position(if c.autotile { 0 } else { 1 });
self.timeline
.set_chain(if c.autotile {
cosmic_time::chain::Toggler::on(self.tile_windows.clone(), 1.0)
} else {
cosmic_time::chain::Toggler::off(self.tile_windows.clone(), 1.0)
})
.start();
}
}
self.autotile_behavior_model.activate_position(0);
} else {
if c.autotile != self.config.autotile {
self.new_workspace_behavior_model
.activate_position(if c.autotile { 0 } else { 1 });
}
self.autotile_behavior_model.activate_position(1);
} }
if c.active_hint != self.config.active_hint { if c.active_hint != self.config.active_hint {
if self.popup.is_some() { if self.popup.is_some() {
self.timeline self.timeline
@ -300,21 +261,14 @@ impl cosmic::Application for Window {
fn view_window(&self, _id: Id) -> Element<Self::Message> { fn view_window(&self, _id: Id) -> Element<Self::Message> {
let mut new_workspace_behavior_button = let mut new_workspace_behavior_button =
segmented_control::horizontal(&self.new_workspace_behavior_model); segmented_control::horizontal(&self.new_workspace_behavior_model)
if matches!(self.config.autotile_behavior, TileBehavior::PerWorkspace) { .on_activate(Message::NewWorkspace);
new_workspace_behavior_button =
new_workspace_behavior_button.on_activate(Message::NewWorkspace);
}
let content_list = column![ let content_list = column![
padded_control(container( padded_control(container(
anim!( anim!(
self.tile_windows, self.tile_windows,
&self.timeline, &self.timeline,
if matches!(self.config.autotile_behavior, TileBehavior::Global) { fl!("tile-current"),
fl!("tile-windows")
} else {
fl!("tile-current")
},
self.autotiled, self.autotiled,
|chain, enable| { Message::ToggleTileWindows(chain, enable) }, |chain, enable| { Message::ToggleTileWindows(chain, enable) },
) )