This commit is contained in:
Jeremy Soller 2024-04-26 10:27:52 -06:00
commit 4cec08875f
No known key found for this signature in database
GPG key ID: D02FD439211AF56F
8 changed files with 183 additions and 217 deletions

View file

@ -76,7 +76,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
Ok(fork::Fork::Child) => (),
Ok(fork::Fork::Parent(_child_pid)) => process::exit(0),
Err(err) => {
eprintln!("failed to daemonize: {:?}", err);
eprintln!("failed to daemonize: {err:?}");
process::exit(1);
}
}
@ -209,45 +209,45 @@ impl MenuAction for Action {
fn message(&self, entity_opt: Option<segmented_button::Entity>) -> Message {
match self {
Action::About => Message::ToggleContextPage(ContextPage::About),
Action::ColorSchemes(color_scheme_kind) => {
Self::About => Message::ToggleContextPage(ContextPage::About),
Self::ColorSchemes(color_scheme_kind) => {
Message::ToggleContextPage(ContextPage::ColorSchemes(*color_scheme_kind))
}
Action::Copy => Message::Copy(entity_opt),
Action::CopyPrimary => Message::CopyPrimary(entity_opt),
Action::Find => Message::Find(true),
Action::PaneFocusDown => Message::PaneFocusAdjacent(pane_grid::Direction::Down),
Action::PaneFocusLeft => Message::PaneFocusAdjacent(pane_grid::Direction::Left),
Action::PaneFocusRight => Message::PaneFocusAdjacent(pane_grid::Direction::Right),
Action::PaneFocusUp => Message::PaneFocusAdjacent(pane_grid::Direction::Up),
Action::PaneSplitHorizontal => Message::PaneSplit(pane_grid::Axis::Horizontal),
Action::PaneSplitVertical => Message::PaneSplit(pane_grid::Axis::Vertical),
Action::PaneToggleMaximized => Message::PaneToggleMaximized,
Action::Paste => Message::Paste(entity_opt),
Action::PastePrimary => Message::PastePrimary(entity_opt),
Action::ProfileOpen(profile_id) => Message::ProfileOpen(*profile_id),
Action::Profiles => Message::ToggleContextPage(ContextPage::Profiles),
Action::SelectAll => Message::SelectAll(entity_opt),
Action::Settings => Message::ToggleContextPage(ContextPage::Settings),
Action::ShowHeaderBar(show_headerbar) => Message::ShowHeaderBar(*show_headerbar),
Action::TabActivate0 => Message::TabActivateJump(0),
Action::TabActivate1 => Message::TabActivateJump(1),
Action::TabActivate2 => Message::TabActivateJump(2),
Action::TabActivate3 => Message::TabActivateJump(3),
Action::TabActivate4 => Message::TabActivateJump(4),
Action::TabActivate5 => Message::TabActivateJump(5),
Action::TabActivate6 => Message::TabActivateJump(6),
Action::TabActivate7 => Message::TabActivateJump(7),
Action::TabActivate8 => Message::TabActivateJump(8),
Action::TabClose => Message::TabClose(entity_opt),
Action::TabNew => Message::TabNew,
Action::TabNext => Message::TabNext,
Action::TabPrev => Message::TabPrev,
Action::WindowClose => Message::WindowClose,
Action::WindowNew => Message::WindowNew,
Action::ZoomIn => Message::ZoomIn,
Action::ZoomOut => Message::ZoomOut,
Action::ZoomReset => Message::ZoomReset,
Self::Copy => Message::Copy(entity_opt),
Self::CopyPrimary => Message::CopyPrimary(entity_opt),
Self::Find => Message::Find(true),
Self::PaneFocusDown => Message::PaneFocusAdjacent(pane_grid::Direction::Down),
Self::PaneFocusLeft => Message::PaneFocusAdjacent(pane_grid::Direction::Left),
Self::PaneFocusRight => Message::PaneFocusAdjacent(pane_grid::Direction::Right),
Self::PaneFocusUp => Message::PaneFocusAdjacent(pane_grid::Direction::Up),
Self::PaneSplitHorizontal => Message::PaneSplit(pane_grid::Axis::Horizontal),
Self::PaneSplitVertical => Message::PaneSplit(pane_grid::Axis::Vertical),
Self::PaneToggleMaximized => Message::PaneToggleMaximized,
Self::Paste => Message::Paste(entity_opt),
Self::PastePrimary => Message::PastePrimary(entity_opt),
Self::ProfileOpen(profile_id) => Message::ProfileOpen(*profile_id),
Self::Profiles => Message::ToggleContextPage(ContextPage::Profiles),
Self::SelectAll => Message::SelectAll(entity_opt),
Self::Settings => Message::ToggleContextPage(ContextPage::Settings),
Self::ShowHeaderBar(show_headerbar) => Message::ShowHeaderBar(*show_headerbar),
Self::TabActivate0 => Message::TabActivateJump(0),
Self::TabActivate1 => Message::TabActivateJump(1),
Self::TabActivate2 => Message::TabActivateJump(2),
Self::TabActivate3 => Message::TabActivateJump(3),
Self::TabActivate4 => Message::TabActivateJump(4),
Self::TabActivate5 => Message::TabActivateJump(5),
Self::TabActivate6 => Message::TabActivateJump(6),
Self::TabActivate7 => Message::TabActivateJump(7),
Self::TabActivate8 => Message::TabActivateJump(8),
Self::TabClose => Message::TabClose(entity_opt),
Self::TabNew => Message::TabNew,
Self::TabNext => Message::TabNext,
Self::TabPrev => Message::TabPrev,
Self::WindowClose => Message::WindowClose,
Self::WindowNew => Message::WindowNew,
Self::ZoomIn => Message::ZoomIn,
Self::ZoomOut => Message::ZoomOut,
Self::ZoomReset => Message::ZoomReset,
}
}
}
@ -460,9 +460,9 @@ impl App {
{
let color = Color::from(theme.cosmic().background.base);
let bytes = color.into_rgba8();
let data = (bytes[2] as u32)
| ((bytes[1] as u32) << 8)
| ((bytes[0] as u32) << 16)
let data = u32::from(bytes[2])
| (u32::from(bytes[1]) << 8)
| (u32::from(bytes[0]) << 16)
| 0xFF000000;
terminal::WINDOW_BG_COLOR.store(data, Ordering::SeqCst);
}
@ -499,17 +499,14 @@ impl App {
fn save_color_schemes(&mut self, color_scheme_kind: ColorSchemeKind) -> Command<Message> {
// Optimized for just saving color_schemes
if let Some(ref config_handler) = self.config_handler {
match config_handler.set(
if let Err(err) = config_handler.set(
match color_scheme_kind {
ColorSchemeKind::Dark => "color_schemes_dark",
ColorSchemeKind::Light => "color_schemes_light",
},
&self.config.color_schemes(color_scheme_kind),
self.config.color_schemes(color_scheme_kind),
) {
Ok(()) => {}
Err(err) => {
log::error!("failed to save config: {}", err);
}
log::error!("failed to save config: {}", err);
}
}
self.update_color_schemes();
@ -664,7 +661,7 @@ impl App {
hash = short_hash.as_str(),
date = date
))
.on_press(Message::LaunchUrl(format!("{}/commits/{}", repository, hash)))
.on_press(Message::LaunchUrl(format!("{repository}/commits/{hash}")))
.padding(0)
.into(),
])
@ -754,7 +751,7 @@ impl App {
.into(),
);
for error in self.color_scheme_errors.iter() {
for error in &self.color_scheme_errors {
sections.push(
widget::row::with_children(vec![
icon_cache_get("dialog-error-symbolic", 16)
@ -797,9 +794,8 @@ impl App {
if !self.config.profiles.is_empty() {
let mut profiles_section = widget::settings::view_section("");
for (profile_name, profile_id) in self.config.profile_names() {
let profile = match self.config.profiles.get(&profile_id) {
Some(some) => some,
None => continue,
let Some(profile) = self.config.profiles.get(&profile_id) else {
continue;
};
let expanded = self.profile_expanded == Some(profile_id);
@ -946,8 +942,8 @@ impl App {
let padding = Padding {
top: 0.0,
bottom: 0.0,
left: space_s as f32,
right: space_s as f32,
left: space_s.into(),
right: space_s.into(),
};
profiles_section =
profiles_section.add(widget::container(expanded_section).padding(padding))
@ -1193,7 +1189,6 @@ impl App {
.and_then(|profile_id| self.config.profiles.get(&profile_id))
{
Some(profile) => {
if !profile.tab_title.is_empty() {}
let mut shell = None;
if let Some(mut args) = shlex::split(&profile.command) {
if !args.is_empty() {
@ -1210,10 +1205,10 @@ impl App {
hold: profile.hold,
env: HashMap::new(),
};
let tab_title_override = if !profile.tab_title.is_empty() {
Some(profile.tab_title.clone())
} else {
let tab_title_override = if profile.tab_title.is_empty() {
None
} else {
Some(profile.tab_title.clone())
};
(options, tab_title_override)
}
@ -1268,7 +1263,7 @@ impl App {
log::warn!("tried to create new tab before having event channel");
}
}
return self.update_title(Some(pane));
self.update_title(Some(pane))
}
}
@ -1349,7 +1344,7 @@ impl Application for App {
let mut font_size_names = Vec::new();
let mut font_sizes = Vec::new();
for font_size in 4..=32 {
font_size_names.push(format!("{}px", font_size));
font_size_names.push(format!("{font_size}px"));
font_sizes.push(font_size);
}
@ -1400,7 +1395,7 @@ impl Application for App {
let mut terminal_ids = HashMap::new();
terminal_ids.insert(pane_model.focus, widget::Id::unique());
let mut app = App {
let mut app = Self {
core,
pane_model,
config_handler: flags.config_handler,
@ -1464,10 +1459,10 @@ impl Application for App {
}
fn on_context_drawer(&mut self) -> Command<Message> {
if !self.core.window.show_context {
self.update_focus()
} else {
if self.core.window.show_context {
Command::none()
} else {
self.update_focus()
}
}
@ -1478,15 +1473,10 @@ impl Application for App {
($name: ident, $value: expr) => {
match &self.config_handler {
Some(config_handler) => {
match paste::paste! { self.config.[<set_ $name>](config_handler, $value) } {
Ok(_) => {}
Err(err) => {
log::warn!(
"failed to save config {:?}: {}",
stringify!($name),
err
);
}
if let Err(err) =
paste::paste! { self.config.[<set_ $name>](config_handler, $value) }
{
log::warn!("failed to save config {:?}: {}", stringify!($name), err);
}
}
None => {
@ -1532,7 +1522,7 @@ impl Application for App {
move |result| {
Message::ColorSchemeExportResult(
color_scheme_kind,
color_scheme_id.clone(),
color_scheme_id,
result,
)
},
@ -1556,9 +1546,8 @@ impl Application for App {
&color_scheme,
ron::ser::PrettyConfig::new(),
) {
Ok(ron) => match fs::write(path, &ron) {
Ok(()) => {}
Err(err) => {
Ok(ron) => {
if let Err(err) = fs::write(path, ron) {
log::error!(
"failed to export {:?} to {:?}: {}",
color_scheme_id,
@ -1566,7 +1555,7 @@ impl Application for App {
err
);
}
},
}
Err(err) => {
log::error!(
"failed to serialize color scheme {:?}: {}",
@ -1600,12 +1589,12 @@ impl Application for App {
self.dialog_opt = None;
if let DialogResult::Open(paths) = result {
self.color_scheme_errors.clear();
for path in paths.iter() {
for path in &paths {
let mut file = match fs::File::open(path) {
Ok(ok) => ok,
Err(err) => {
self.color_scheme_errors
.push(format!("Failed to open {:?}: {}", path, err));
.push(format!("Failed to open {path:?}: {err}"));
continue;
}
};
@ -1624,7 +1613,7 @@ impl Application for App {
}
Err(err) => {
self.color_scheme_errors
.push(format!("Failed to parse {:?}: {}", path, err));
.push(format!("Failed to parse {path:?}: {err}"));
}
}
}
@ -1866,18 +1855,17 @@ impl Application for App {
config_set!(focus_follow_mouse, focus_follow_mouse);
}
Message::Key(modifiers, key) => {
for (key_bind, action) in self.key_binds.iter() {
for (key_bind, action) in &self.key_binds {
if key_bind.matches(modifiers, &key) {
return self.update(action.message(None));
}
}
}
Message::LaunchUrl(url) => match open::that_detached(&url) {
Ok(()) => {}
Err(err) => {
Message::LaunchUrl(url) => {
if let Err(err) = open::that_detached(&url) {
log::warn!("failed to open {:?}: {}", url, err);
}
},
}
Message::Modifiers(modifiers) => {
self.modifiers = modifiers;
}
@ -2367,31 +2355,28 @@ impl Application for App {
}
// Extra work to do to prepare context pages
match self.context_page {
ContextPage::ColorSchemes(color_scheme_kind) => {
self.color_scheme_errors.clear();
self.color_scheme_expanded = None;
self.color_scheme_renaming = None;
self.color_scheme_tab_model = widget::segmented_button::Model::default();
let dark_entity = self
.color_scheme_tab_model
.insert()
.text(fl!("dark"))
.data(ColorSchemeKind::Dark)
.id();
let light_entity = self
.color_scheme_tab_model
.insert()
.text(fl!("light"))
.data(ColorSchemeKind::Light)
.id();
self.color_scheme_tab_model
.activate(match color_scheme_kind {
ColorSchemeKind::Dark => dark_entity,
ColorSchemeKind::Light => light_entity,
});
}
_ => {}
if let ContextPage::ColorSchemes(color_scheme_kind) = self.context_page {
self.color_scheme_errors.clear();
self.color_scheme_expanded = None;
self.color_scheme_renaming = None;
self.color_scheme_tab_model = widget::segmented_button::Model::default();
let dark_entity = self
.color_scheme_tab_model
.insert()
.text(fl!("dark"))
.data(ColorSchemeKind::Dark)
.id();
let light_entity = self
.color_scheme_tab_model
.insert()
.text(fl!("light"))
.data(ColorSchemeKind::Light)
.id();
self.color_scheme_tab_model
.activate(match color_scheme_kind {
ColorSchemeKind::Dark => dark_entity,
ColorSchemeKind::Light => light_entity,
});
}
self.set_context_title(context_page.title());
@ -2491,41 +2476,33 @@ impl Application for App {
.get(&pane)
.cloned()
.unwrap_or_else(widget::Id::unique);
match tab_model.data::<Mutex<Terminal>>(entity) {
Some(terminal) => {
let mut terminal_box = terminal_box(terminal)
.id(terminal_id)
.on_context_menu(move |position_opt| {
Message::TabContextMenu(pane, position_opt)
})
.on_middle_click(move || {
Message::MiddleClick(pane, Some(entity_middle_click))
})
.opacity(self.config.opacity_ratio())
.padding(space_xxs);
if let Some(terminal) = tab_model.data::<Mutex<Terminal>>(entity) {
let mut terminal_box = terminal_box(terminal)
.id(terminal_id)
.on_context_menu(move |position_opt| {
Message::TabContextMenu(pane, position_opt)
})
.on_middle_click(move || Message::MiddleClick(pane, Some(entity_middle_click)))
.opacity(self.config.opacity_ratio())
.padding(space_xxs);
if self.config.focus_follow_mouse {
terminal_box =
terminal_box.on_mouse_enter(move || Message::MouseEnter(pane));
}
let context_menu = {
let terminal = terminal.lock().unwrap();
terminal.context_menu
};
let tab_element: Element<'_, Message> = match context_menu {
Some(point) => widget::popover(terminal_box.context_menu(point))
.popup(menu::context_menu(&self.config, &self.key_binds, entity))
.position(widget::popover::Position::Point(point))
.into(),
None => terminal_box.into(),
};
tab_column = tab_column.push(tab_element);
}
None => {
//TODO
if self.config.focus_follow_mouse {
terminal_box = terminal_box.on_mouse_enter(move || Message::MouseEnter(pane));
}
let context_menu = {
let terminal = terminal.lock().unwrap();
terminal.context_menu
};
let tab_element: Element<'_, Message> = match context_menu {
Some(point) => widget::popover(terminal_box.context_menu(point))
.popup(menu::context_menu(&self.config, &self.key_binds, entity))
.position(widget::popover::Position::Point(point))
.into(),
None => terminal_box.into(),
};
tab_column = tab_column.push(tab_element);
}
//Only draw find in the currently focused pane
@ -2583,6 +2560,8 @@ impl Application for App {
tab_column = tab_column
.push(widget::layer_container(find_widget).layer(cosmic_theme::Layer::Primary));
} else {
// TODO
}
pane_grid::Content::new(tab_column)