feat(core): wire up auto startup wizard page
This commit is contained in:
parent
0804ef5e27
commit
0f01ab3e3a
|
@ -94,6 +94,24 @@ fn launcher_main(args: CliModuleArgs) -> i32 {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let is_auto_start_page_enabled = !preferences.has_selected_auto_start_option();
|
||||||
|
let preferences_clone = preferences.clone();
|
||||||
|
let auto_start_handler = Box::new(move |auto_start| {
|
||||||
|
preferences_clone.set_has_selected_auto_start_option(true);
|
||||||
|
|
||||||
|
if auto_start {
|
||||||
|
match util::configure_auto_start(true) {
|
||||||
|
Ok(_) => true,
|
||||||
|
Err(error) => {
|
||||||
|
eprintln!("Service register returned error: {}", error);
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
let is_add_path_page_enabled =
|
let is_add_path_page_enabled =
|
||||||
if cfg!(not(target_os = "linux")) && !preferences.has_completed_wizard() {
|
if cfg!(not(target_os = "linux")) && !preferences.has_completed_wizard() {
|
||||||
if cfg!(target_os = "macos") {
|
if cfg!(target_os = "macos") {
|
||||||
|
@ -133,6 +151,7 @@ fn launcher_main(args: CliModuleArgs) -> i32 {
|
||||||
|| is_move_bundle_page_enabled
|
|| is_move_bundle_page_enabled
|
||||||
|| is_legacy_version_page_enabled
|
|| is_legacy_version_page_enabled
|
||||||
|| is_migrate_page_enabled
|
|| is_migrate_page_enabled
|
||||||
|
|| is_auto_start_page_enabled
|
||||||
|| is_add_path_page_enabled
|
|| is_add_path_page_enabled
|
||||||
|| is_accessibility_page_enabled
|
|| is_accessibility_page_enabled
|
||||||
|| is_wrong_edition_page_enabled
|
|| is_wrong_edition_page_enabled
|
||||||
|
@ -144,6 +163,7 @@ fn launcher_main(args: CliModuleArgs) -> i32 {
|
||||||
is_legacy_version_page_enabled,
|
is_legacy_version_page_enabled,
|
||||||
is_wrong_edition_page_enabled,
|
is_wrong_edition_page_enabled,
|
||||||
is_migrate_page_enabled,
|
is_migrate_page_enabled,
|
||||||
|
is_auto_start_page_enabled,
|
||||||
is_add_path_page_enabled,
|
is_add_path_page_enabled,
|
||||||
is_accessibility_page_enabled,
|
is_accessibility_page_enabled,
|
||||||
window_icon_path: icon_paths
|
window_icon_path: icon_paths
|
||||||
|
@ -162,6 +182,7 @@ fn launcher_main(args: CliModuleArgs) -> i32 {
|
||||||
handlers: WizardHandlers {
|
handlers: WizardHandlers {
|
||||||
is_legacy_version_running: Some(is_legacy_version_running_handler),
|
is_legacy_version_running: Some(is_legacy_version_running_handler),
|
||||||
backup_and_migrate: Some(backup_and_migrate_handler),
|
backup_and_migrate: Some(backup_and_migrate_handler),
|
||||||
|
auto_start: Some(auto_start_handler),
|
||||||
add_to_path: Some(add_to_path_handler),
|
add_to_path: Some(add_to_path_handler),
|
||||||
enable_accessibility: Some(enable_accessibility_handler),
|
enable_accessibility: Some(enable_accessibility_handler),
|
||||||
is_accessibility_enabled: Some(is_accessibility_enabled_handler),
|
is_accessibility_enabled: Some(is_accessibility_enabled_handler),
|
||||||
|
|
|
@ -19,13 +19,14 @@
|
||||||
|
|
||||||
use std::{path::Path, process::Command};
|
use std::{path::Path, process::Command};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::{bail, Result};
|
||||||
use espanso_path::Paths;
|
use espanso_path::Paths;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
exit_code::{MIGRATE_CLEAN_FAILURE, MIGRATE_DIRTY_FAILURE},
|
exit_code::{MIGRATE_CLEAN_FAILURE, MIGRATE_DIRTY_FAILURE},
|
||||||
lock::acquire_legacy_lock,
|
lock::acquire_legacy_lock,
|
||||||
|
util::set_command_flags,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn is_legacy_version_running(runtime_path: &Path) -> bool {
|
pub fn is_legacy_version_running(runtime_path: &Path) -> bool {
|
||||||
|
@ -106,3 +107,26 @@ pub fn show_already_running_warning() -> Result<()> {
|
||||||
child.wait()?;
|
child.wait()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn configure_auto_start(auto_start: bool) -> Result<()> {
|
||||||
|
let espanso_exe_path = std::env::current_exe()?;
|
||||||
|
let mut command = Command::new(&espanso_exe_path.to_string_lossy().to_string());
|
||||||
|
let mut args = vec!["service"];
|
||||||
|
if auto_start {
|
||||||
|
args.push("register");
|
||||||
|
} else {
|
||||||
|
args.push("unregister");
|
||||||
|
}
|
||||||
|
|
||||||
|
command.args(&args);
|
||||||
|
set_command_flags(&mut command);
|
||||||
|
|
||||||
|
let mut child = command.spawn()?;
|
||||||
|
let result = child.wait()?;
|
||||||
|
|
||||||
|
if result.success() {
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
bail!("service registration returned non-zero exit code");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ use std::path::{Path, PathBuf};
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
|
use crate::util::set_command_flags;
|
||||||
use crate::{error_eprintln, warn_eprintln};
|
use crate::{error_eprintln, warn_eprintln};
|
||||||
|
|
||||||
pub fn register() -> Result<()> {
|
pub fn register() -> Result<()> {
|
||||||
|
@ -145,13 +146,15 @@ fn create_shortcut_target_file(
|
||||||
target_path: &Path,
|
target_path: &Path,
|
||||||
arguments: &str,
|
arguments: &str,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let output = Command::new("powershell")
|
let mut command = Command::new("powershell");
|
||||||
.arg("-c")
|
command.arg("-c");
|
||||||
.arg("$WshShell = New-Object -comObject WScript.Shell; $Shortcut = $WshShell.CreateShortcut($env:SHORTCUT_PATH); $Shortcut.TargetPath = $env:TARGET_PATH; $Shortcut.Arguments = $env:TARGET_ARGS; $Shortcut.Save()")
|
command.arg("$WshShell = New-Object -comObject WScript.Shell; $Shortcut = $WshShell.CreateShortcut($env:SHORTCUT_PATH); $Shortcut.TargetPath = $env:TARGET_PATH; $Shortcut.Arguments = $env:TARGET_ARGS; $Shortcut.Save()");
|
||||||
.env("SHORTCUT_PATH", shortcut_path.to_string_lossy().to_string())
|
command.env("SHORTCUT_PATH", shortcut_path.to_string_lossy().to_string());
|
||||||
.env("TARGET_PATH", target_path.to_string_lossy().to_string())
|
command.env("TARGET_PATH", target_path.to_string_lossy().to_string());
|
||||||
.env("TARGET_ARGS", arguments)
|
command.env("TARGET_ARGS", arguments);
|
||||||
.output()?;
|
|
||||||
|
set_command_flags(&mut command);
|
||||||
|
let output = command.output()?;
|
||||||
|
|
||||||
if !output.status.success() {
|
if !output.status.success() {
|
||||||
return Err(ShortcutError::PowershellNonZeroExitCode.into());
|
return Err(ShortcutError::PowershellNonZeroExitCode.into());
|
||||||
|
|
|
@ -28,6 +28,7 @@ const HAS_COMPLETED_WIZARD_KEY: &str = "has_completed_wizard";
|
||||||
const HAS_DISPLAYED_WELCOME_KEY: &str = "has_displayed_welcome";
|
const HAS_DISPLAYED_WELCOME_KEY: &str = "has_displayed_welcome";
|
||||||
const SHOULD_DISPLAY_TROUBLESHOOT_FOR_NON_FATAL_ERRORS: &str =
|
const SHOULD_DISPLAY_TROUBLESHOOT_FOR_NON_FATAL_ERRORS: &str =
|
||||||
"should_display_troubleshoot_for_non_fatal_errors";
|
"should_display_troubleshoot_for_non_fatal_errors";
|
||||||
|
const HAS_SELECTED_AUTO_START_OPTION: &str = "has_selected_auto_start_option";
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct DefaultPreferences<KVSType: KVS> {
|
pub struct DefaultPreferences<KVSType: KVS> {
|
||||||
|
@ -80,4 +81,12 @@ impl<KVSType: KVS> Preferences for DefaultPreferences<KVSType> {
|
||||||
fn set_should_display_troubleshoot_for_non_fatal_errors(&self, value: bool) {
|
fn set_should_display_troubleshoot_for_non_fatal_errors(&self, value: bool) {
|
||||||
self.set(SHOULD_DISPLAY_TROUBLESHOOT_FOR_NON_FATAL_ERRORS, value);
|
self.set(SHOULD_DISPLAY_TROUBLESHOOT_FOR_NON_FATAL_ERRORS, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn has_selected_auto_start_option(&self) -> bool {
|
||||||
|
self.get(HAS_SELECTED_AUTO_START_OPTION).unwrap_or(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_has_selected_auto_start_option(&self, value: bool) {
|
||||||
|
self.set(HAS_SELECTED_AUTO_START_OPTION, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,9 @@ pub trait Preferences: Send + Sync + Clone {
|
||||||
|
|
||||||
fn should_display_troubleshoot_for_non_fatal_errors(&self) -> bool;
|
fn should_display_troubleshoot_for_non_fatal_errors(&self) -> bool;
|
||||||
fn set_should_display_troubleshoot_for_non_fatal_errors(&self, value: bool);
|
fn set_should_display_troubleshoot_for_non_fatal_errors(&self, value: bool);
|
||||||
|
|
||||||
|
fn has_selected_auto_start_option(&self) -> bool;
|
||||||
|
fn set_has_selected_auto_start_option(&self, value: bool);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_default(runtime_dir: &Path) -> Result<impl Preferences> {
|
pub fn get_default(runtime_dir: &Path) -> Result<impl Preferences> {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user