132 lines
3.7 KiB
Go
132 lines
3.7 KiB
Go
package cmd
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/liamg/darktile/internal/app/darktile/config"
|
|
"github.com/liamg/darktile/internal/app/darktile/gui"
|
|
"github.com/liamg/darktile/internal/app/darktile/hinters"
|
|
"github.com/liamg/darktile/internal/app/darktile/termutil"
|
|
"github.com/liamg/darktile/internal/app/darktile/version"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var rewriteConfig bool
|
|
var debugFile string
|
|
var initialCommand string
|
|
var shell string
|
|
var screenshotAfterMS int
|
|
var screenshotFilename string
|
|
var themePath string
|
|
var showVersion bool
|
|
|
|
var rootCmd = &cobra.Command{
|
|
Use: os.Args[0],
|
|
SilenceUsage: true,
|
|
RunE: func(c *cobra.Command, args []string) error {
|
|
|
|
if showVersion {
|
|
fmt.Println(version.Version)
|
|
os.Exit(0)
|
|
}
|
|
|
|
var startupErrors []error
|
|
var fileNotFound *config.ErrorFileNotFound
|
|
|
|
conf, err := config.LoadConfig()
|
|
if err != nil {
|
|
if !errors.As(err, &fileNotFound) {
|
|
startupErrors = append(startupErrors, err)
|
|
}
|
|
conf = config.DefaultConfig()
|
|
}
|
|
|
|
if rewriteConfig {
|
|
if _, err := conf.Save(); err != nil {
|
|
return fmt.Errorf("failed to write config file: %w", err)
|
|
}
|
|
}
|
|
|
|
var theme *termutil.Theme
|
|
|
|
if themePath != "" {
|
|
theme, err = config.LoadThemeFromPath(conf, themePath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to load theme: %s", err)
|
|
}
|
|
} else {
|
|
theme, err = config.LoadTheme(conf)
|
|
if err != nil {
|
|
if !errors.As(err, &fileNotFound) {
|
|
startupErrors = append(startupErrors, err)
|
|
}
|
|
theme, err = config.DefaultTheme(conf)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to load default theme: %w", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
termOpts := []termutil.Option{
|
|
termutil.WithTheme(theme),
|
|
}
|
|
|
|
if debugFile != "" {
|
|
termOpts = append(termOpts, termutil.WithLogFile(debugFile))
|
|
}
|
|
if shell != "" {
|
|
termOpts = append(termOpts, termutil.WithShell(shell))
|
|
}
|
|
if initialCommand != "" {
|
|
termOpts = append(termOpts, termutil.WithInitialCommand(initialCommand))
|
|
}
|
|
|
|
terminal := termutil.New(termOpts...)
|
|
|
|
options := []gui.Option{
|
|
gui.WithFontDPI(conf.Font.DPI),
|
|
gui.WithFontSize(conf.Font.Size),
|
|
gui.WithFontFamily(conf.Font.Family),
|
|
gui.WithOpacity(conf.Opacity),
|
|
}
|
|
|
|
if screenshotAfterMS > 0 {
|
|
options = append(options, gui.WithStartupFunc(func(g *gui.GUI) {
|
|
<-time.After(time.Duration(screenshotAfterMS) * time.Millisecond)
|
|
g.RequestScreenshot(screenshotFilename)
|
|
}))
|
|
}
|
|
|
|
// load all hinters
|
|
for _, hinter := range hinters.All() {
|
|
options = append(options, gui.WithHinter(hinter))
|
|
}
|
|
|
|
g, err := gui.New(terminal, options...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, err := range startupErrors {
|
|
g.ShowError(err.Error())
|
|
}
|
|
|
|
return g.Run()
|
|
},
|
|
}
|
|
|
|
func Execute() error {
|
|
rootCmd.Flags().BoolVar(&showVersion, "version", showVersion, "Show darktile version information and exit")
|
|
rootCmd.Flags().BoolVar(&rewriteConfig, "rewrite-config", rewriteConfig, "Write the resultant config after parsing config files and merging with defauls back to the config file")
|
|
rootCmd.Flags().StringVar(&debugFile, "log-file", debugFile, "Debug log file")
|
|
rootCmd.Flags().StringVarP(&shell, "shell", "s", shell, "Shell to launch terminal with - defaults to configured user shell")
|
|
rootCmd.Flags().StringVarP(&initialCommand, "command", "c", initialCommand, "Command to run when shell starts - use this with caution")
|
|
rootCmd.Flags().IntVar(&screenshotAfterMS, "screenshot-after-ms", screenshotAfterMS, "Take a screenshot after this many milliseconds")
|
|
rootCmd.Flags().StringVar(&screenshotFilename, "screenshot-filename", screenshotFilename, "Filename to store screenshot taken by --screenshot-after-ms")
|
|
rootCmd.Flags().StringVar(&themePath, "theme-path", themePath, "Path to a theme file to use instead of the default")
|
|
return rootCmd.Execute()
|
|
}
|