diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/account-wizard.go | 79 | ||||
-rw-r--r-- | widgets/account.go | 22 | ||||
-rw-r--r-- | widgets/aerc.go | 95 | ||||
-rw-r--r-- | widgets/compose.go | 42 | ||||
-rw-r--r-- | widgets/dirlist.go | 6 | ||||
-rw-r--r-- | widgets/exline.go | 26 | ||||
-rw-r--r-- | widgets/getpasswd.go | 12 | ||||
-rw-r--r-- | widgets/msglist.go | 8 | ||||
-rw-r--r-- | widgets/msgviewer.go | 74 | ||||
-rw-r--r-- | widgets/status.go | 2 |
10 files changed, 168 insertions, 198 deletions
diff --git a/widgets/account-wizard.go b/widgets/account-wizard.go index b6210cb7..0e2bda1e 100644 --- a/widgets/account-wizard.go +++ b/widgets/account-wizard.go @@ -41,7 +41,6 @@ const ( type AccountWizard struct { aerc *Aerc - conf *config.AercConfig step int steps []*ui.Grid focus int @@ -87,23 +86,22 @@ func showPasswordWarning(aerc *Aerc) { aerc.AddDialog(warning) } -func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { +func NewAccountWizard(aerc *Aerc) *AccountWizard { wizard := &AccountWizard{ - accountName: ui.NewTextInput("", &conf.Ui).Prompt("> "), + accountName: ui.NewTextInput("", config.Ui).Prompt("> "), aerc: aerc, - conf: conf, temporary: false, copySent: true, - email: ui.NewTextInput("", &conf.Ui).Prompt("> "), - fullName: ui.NewTextInput("", &conf.Ui).Prompt("> "), - imapPassword: ui.NewTextInput("", &conf.Ui).Prompt("] ").Password(true), - imapServer: ui.NewTextInput("", &conf.Ui).Prompt("> "), - imapStr: ui.NewText("imaps://", conf.Ui.GetStyle(config.STYLE_DEFAULT)), - imapUsername: ui.NewTextInput("", &conf.Ui).Prompt("> "), - smtpPassword: ui.NewTextInput("", &conf.Ui).Prompt("] ").Password(true), - smtpServer: ui.NewTextInput("", &conf.Ui).Prompt("> "), - smtpStr: ui.NewText("smtps://", conf.Ui.GetStyle(config.STYLE_DEFAULT)), - smtpUsername: ui.NewTextInput("", &conf.Ui).Prompt("> "), + email: ui.NewTextInput("", config.Ui).Prompt("> "), + fullName: ui.NewTextInput("", config.Ui).Prompt("> "), + imapPassword: ui.NewTextInput("", config.Ui).Prompt("] ").Password(true), + imapServer: ui.NewTextInput("", config.Ui).Prompt("> "), + imapStr: ui.NewText("imaps://", config.Ui.GetStyle(config.STYLE_DEFAULT)), + imapUsername: ui.NewTextInput("", config.Ui).Prompt("> "), + smtpPassword: ui.NewTextInput("", config.Ui).Prompt("] ").Password(true), + smtpServer: ui.NewTextInput("", config.Ui).Prompt("> "), + smtpStr: ui.NewText("smtps://", config.Ui.GetStyle(config.STYLE_DEFAULT)), + smtpUsername: ui.NewTextInput("", config.Ui).Prompt("> "), } // Autofill some stuff for the user @@ -172,10 +170,10 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { "aerc-accounts(5) man page.\n"+ "Press <Tab> and <Shift+Tab> to cycle between each field in this form, "+ "or <Ctrl+j> and <Ctrl+k>.", - conf.Ui.GetStyle(config.STYLE_DEFAULT))) + config.Ui.GetStyle(config.STYLE_DEFAULT))) basics.AddChild( ui.NewText("Name for this account? (e.g. 'Personal' or 'Work')", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(1, 0) basics.AddChild(wizard.accountName). At(2, 0) @@ -183,7 +181,7 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { At(3, 0) basics.AddChild( ui.NewText("Full name for outgoing emails? (e.g. 'John Doe')", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(4, 0) basics.AddChild(wizard.fullName). At(5, 0) @@ -191,11 +189,11 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { At(6, 0) basics.AddChild( ui.NewText("Your email address? (e.g. 'john@example.org')", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(7, 0) basics.AddChild(wizard.email). At(8, 0) - selector := NewSelector([]string{"Next"}, 0, &conf.Ui). + selector := NewSelector([]string{"Next"}, 0, config.Ui). OnChoose(func(option string) { email := wizard.email.String() if strings.ContainsRune(email, '@') { @@ -244,10 +242,10 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { {Strategy: ui.SIZE_WEIGHT, Size: ui.Const(1)}, }) incoming.AddChild(ui.NewText("\nConfigure incoming mail (IMAP)", - conf.Ui.GetStyle(config.STYLE_DEFAULT))) + config.Ui.GetStyle(config.STYLE_DEFAULT))) incoming.AddChild( ui.NewText("Username", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(1, 0) incoming.AddChild(wizard.imapUsername). At(2, 0) @@ -255,7 +253,7 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { At(3, 0) incoming.AddChild( ui.NewText("Password", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(4, 0) incoming.AddChild(wizard.imapPassword). At(5, 0) @@ -264,7 +262,7 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { incoming.AddChild( ui.NewText("Server address "+ "(e.g. 'mail.example.org' or 'mail.example.org:1313')", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(7, 0) incoming.AddChild(wizard.imapServer). At(8, 0) @@ -272,13 +270,13 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { At(9, 0) incoming.AddChild( ui.NewText("Connection mode", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(10, 0) imapMode := NewSelector([]string{ "IMAP over SSL/TLS", "IMAP with STARTTLS", "Insecure IMAP", - }, 0, &conf.Ui).Chooser(true).OnSelect(func(option string) { + }, 0, config.Ui).Chooser(true).OnSelect(func(option string) { switch option { case "IMAP over SSL/TLS": wizard.imapMode = IMAP_OVER_TLS @@ -290,7 +288,7 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { wizard.imapUri() }) incoming.AddChild(imapMode).At(11, 0) - selector = NewSelector([]string{"Previous", "Next"}, 1, &conf.Ui). + selector = NewSelector([]string{"Previous", "Next"}, 1, config.Ui). OnChoose(wizard.advance) incoming.AddChild(ui.NewFill(' ', tcell.StyleDefault)).At(12, 0) incoming.AddChild(wizard.imapStr).At(13, 0) @@ -323,10 +321,10 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { {Strategy: ui.SIZE_WEIGHT, Size: ui.Const(1)}, }) outgoing.AddChild(ui.NewText("\nConfigure outgoing mail (SMTP)", - conf.Ui.GetStyle(config.STYLE_DEFAULT))) + config.Ui.GetStyle(config.STYLE_DEFAULT))) outgoing.AddChild( ui.NewText("Username", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(1, 0) outgoing.AddChild(wizard.smtpUsername). At(2, 0) @@ -334,7 +332,7 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { At(3, 0) outgoing.AddChild( ui.NewText("Password", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(4, 0) outgoing.AddChild(wizard.smtpPassword). At(5, 0) @@ -343,7 +341,7 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { outgoing.AddChild( ui.NewText("Server address "+ "(e.g. 'mail.example.org' or 'mail.example.org:1313')", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(7, 0) outgoing.AddChild(wizard.smtpServer). At(8, 0) @@ -351,13 +349,13 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { At(9, 0) outgoing.AddChild( ui.NewText("Connection mode", - conf.Ui.GetStyle(config.STYLE_HEADER))). + config.Ui.GetStyle(config.STYLE_HEADER))). At(10, 0) smtpMode := NewSelector([]string{ "SMTP over SSL/TLS", "SMTP with STARTTLS", "Insecure SMTP", - }, 0, &conf.Ui).Chooser(true).OnSelect(func(option string) { + }, 0, config.Ui).Chooser(true).OnSelect(func(option string) { switch option { case "SMTP over SSL/TLS": wizard.smtpMode = SMTP_OVER_TLS @@ -369,15 +367,15 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { wizard.smtpUri() }) outgoing.AddChild(smtpMode).At(11, 0) - selector = NewSelector([]string{"Previous", "Next"}, 1, &conf.Ui). + selector = NewSelector([]string{"Previous", "Next"}, 1, config.Ui). OnChoose(wizard.advance) outgoing.AddChild(ui.NewFill(' ', tcell.StyleDefault)).At(12, 0) outgoing.AddChild(wizard.smtpStr).At(13, 0) outgoing.AddChild(ui.NewFill(' ', tcell.StyleDefault)).At(14, 0) outgoing.AddChild( ui.NewText("Copy sent messages to 'Sent' folder?", - conf.Ui.GetStyle(config.STYLE_HEADER))).At(15, 0) - copySent := NewSelector([]string{"Yes", "No"}, 0, &conf.Ui). + config.Ui.GetStyle(config.STYLE_HEADER))).At(15, 0) + copySent := NewSelector([]string{"Yes", "No"}, 0, config.Ui). Chooser(true).OnChoose(func(option string) { switch option { case "Yes": @@ -404,12 +402,12 @@ func NewAccountWizard(conf *config.AercConfig, aerc *Aerc) *AccountWizard { "You can go back and double check your settings, or choose 'Finish' to\n"+ "save your settings to accounts.conf.\n\n"+ "To add another account in the future, run ':new-account'.", - conf.Ui.GetStyle(config.STYLE_DEFAULT))) + config.Ui.GetStyle(config.STYLE_DEFAULT))) selector = NewSelector([]string{ "Previous", "Finish & open tutorial", "Finish", - }, 1, &conf.Ui).OnChoose(func(option string) { + }, 1, config.Ui).OnChoose(func(option string) { switch option { case "Previous": wizard.advance("Previous") @@ -537,12 +535,11 @@ func (wizard *AccountWizard) finish(tutorial bool) { if wizard.copySent { account.CopyTo = "Sent" } - wizard.conf.Accounts = append(wizard.conf.Accounts, account) + config.Accounts = append(config.Accounts, &account) - view, err := NewAccountView(wizard.aerc, wizard.conf, &account, wizard.aerc, nil) + view, err := NewAccountView(wizard.aerc, &account, wizard.aerc, nil) if err != nil { - wizard.aerc.NewTab(errorScreen(err.Error(), wizard.conf.Ui), - account.Name) + wizard.aerc.NewTab(errorScreen(err.Error()), account.Name) return } wizard.aerc.accounts[account.Name] = view diff --git a/widgets/account.go b/widgets/account.go index 838dd624..6bcb5b83 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -26,7 +26,6 @@ type AccountView struct { sync.Mutex acct *config.AccountConfig aerc *Aerc - conf *config.AercConfig dirlist DirectoryLister labels []string grid *ui.Grid @@ -55,17 +54,17 @@ func (acct *AccountView) UiConfig() *config.UIConfig { return acct.uiConf } -func NewAccountView(aerc *Aerc, conf *config.AercConfig, acct *config.AccountConfig, +func NewAccountView( + aerc *Aerc, acct *config.AccountConfig, host TabHost, deferLoop chan struct{}, ) (*AccountView, error) { - acctUiConf := conf.Ui.ForAccount(acct.Name) + acctUiConf := config.Ui.ForAccount(acct.Name) view := &AccountView{ acct: acct, aerc: aerc, - conf: conf, host: host, - state: statusline.NewState(acct.Name, len(conf.Accounts) > 1, conf.Statusline), + state: statusline.NewState(acct.Name, len(config.Accounts) > 1), uiConf: acctUiConf, } @@ -86,12 +85,12 @@ func NewAccountView(aerc *Aerc, conf *config.AercConfig, acct *config.AccountCon } view.worker = worker - view.dirlist = NewDirectoryList(conf, acct, worker) + view.dirlist = NewDirectoryList(acct, worker) if acctUiConf.SidebarWidth > 0 { view.grid.AddChild(ui.NewBordered(view.dirlist, ui.BORDER_RIGHT, acctUiConf)) } - view.msglist = NewMessageList(conf, aerc) + view.msglist = NewMessageList(aerc, view) view.grid.AddChild(view.msglist).At(0, 1) go func() { @@ -291,8 +290,7 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) { acct.dirlist.UiConfig(name).ReverseThreadOrder, acct.dirlist.UiConfig(name).SortThreadSiblings, func(msg *models.MessageInfo) { - acct.conf.Triggers.ExecNewEmail(acct.acct, - acct.conf, msg) + config.Triggers.ExecNewEmail(acct.acct, msg) }, func() { if acct.dirlist.UiConfig(name).NewMessageBell { acct.host.Beep() @@ -526,7 +524,7 @@ func (acct *AccountView) UpdateSplitView() { return } orig := acct.split - acct.split = NewMessageViewer(acct, acct.conf, view) + acct.split = NewMessageViewer(acct, view) acct.grid.ReplaceChild(orig, acct.split) if orig != nil { orig.Close() @@ -585,7 +583,7 @@ func (acct *AccountView) Split(n int) error { acct.aerc.PushError(err.Error()) return } - acct.split = NewMessageViewer(acct, acct.conf, view) + acct.split = NewMessageViewer(acct, view) acct.grid.AddChild(acct.split).At(1, 1) }) ui.Invalidate() @@ -628,7 +626,7 @@ func (acct *AccountView) Vsplit(n int) error { acct.aerc.PushError(err.Error()) return } - acct.split = NewMessageViewer(acct, acct.conf, view) + acct.split = NewMessageViewer(acct, view) acct.grid.AddChild(acct.split).At(0, 2) }) ui.Invalidate() diff --git a/widgets/aerc.go b/widgets/aerc.go index 97e3c663..cf893a7d 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -29,7 +29,6 @@ type Aerc struct { cmd func(cmd []string) error cmdHistory lib.History complete func(cmd string) []string - conf *config.AercConfig focused ui.Interactive grid *ui.Grid simulating int @@ -52,15 +51,15 @@ type Choice struct { Command []string } -func NewAerc(conf *config.AercConfig, +func NewAerc( crypto crypto.Provider, cmd func(cmd []string) error, complete func(cmd string) []string, cmdHistory lib.History, deferLoop chan struct{}, ) *Aerc { - tabs := ui.NewTabs(&conf.Ui) + tabs := ui.NewTabs(config.Ui) - statusbar := ui.NewStack(conf.Ui) - statusline := NewStatusLine(conf.Ui) + statusbar := ui.NewStack(config.Ui) + statusline := NewStatusLine(config.Ui) statusbar.Push(statusline) grid := ui.NewGrid().Rows([]ui.GridSpec{ @@ -76,34 +75,32 @@ func NewAerc(conf *config.AercConfig, aerc := &Aerc{ accounts: make(map[string]*AccountView), - conf: conf, cmd: cmd, cmdHistory: cmdHistory, complete: complete, grid: grid, statusbar: statusbar, statusline: statusline, - prompts: ui.NewStack(conf.Ui), + prompts: ui.NewStack(config.Ui), tabs: tabs, Crypto: crypto, } statusline.SetAerc(aerc) - conf.Triggers.ExecuteCommand = cmd + config.Triggers.ExecuteCommand = cmd - for i, acct := range conf.Accounts { - view, err := NewAccountView(aerc, conf, &conf.Accounts[i], aerc, deferLoop) + for _, acct := range config.Accounts { + view, err := NewAccountView(aerc, acct, aerc, deferLoop) if err != nil { - tabs.Add(errorScreen(err.Error(), conf.Ui), acct.Name, nil) + tabs.Add(errorScreen(err.Error()), acct.Name, nil) } else { aerc.accounts[acct.Name] = view - conf := view.UiConfig() - tabs.Add(view, acct.Name, conf) + tabs.Add(view, acct.Name, view.UiConfig()) } } - if len(conf.Accounts) == 0 { - wizard := NewAccountWizard(aerc.Config(), aerc) + if len(config.Accounts) == 0 { + wizard := NewAccountWizard(aerc) wizard.Focus(true) aerc.NewTab(wizard, "New account") } @@ -202,8 +199,8 @@ func (aerc *Aerc) HumanReadableBindings() []string { format(config.FormatKeyStrokes(bind.Output)), )) } - if binds.Globals && aerc.conf.Bindings.Global != nil { - for _, bind := range aerc.conf.Bindings.Global.Bindings { + if binds.Globals && config.Binds.Global != nil { + for _, bind := range config.Binds.Global.Bindings { result = append(result, fmt.Sprintf(fmtStr+" (Globals)", format(config.FormatKeyStrokes(bind.Input)), format(config.FormatKeyStrokes(bind.Output)), @@ -229,35 +226,35 @@ func (aerc *Aerc) getBindings() *config.KeyBindings { } switch view := aerc.SelectedTabContent().(type) { case *AccountView: - binds := aerc.conf.Bindings.MessageList.ForAccount(selectedAccountName) + binds := config.Binds.MessageList.ForAccount(selectedAccountName) return binds.ForFolder(view.SelectedDirectory()) case *AccountWizard: - return aerc.conf.Bindings.AccountWizard + return config.Binds.AccountWizard case *Composer: switch view.Bindings() { case "compose::editor": - return aerc.conf.Bindings.ComposeEditor.ForAccount( + return config.Binds.ComposeEditor.ForAccount( selectedAccountName) case "compose::review": - return aerc.conf.Bindings.ComposeReview.ForAccount( + return config.Binds.ComposeReview.ForAccount( selectedAccountName) default: - return aerc.conf.Bindings.Compose.ForAccount( + return config.Binds.Compose.ForAccount( selectedAccountName) } case *MessageViewer: switch view.Bindings() { case "view::passthrough": - return aerc.conf.Bindings.MessageViewPassthrough.ForAccount( + return config.Binds.MessageViewPassthrough.ForAccount( selectedAccountName) default: - return aerc.conf.Bindings.MessageView.ForAccount( + return config.Binds.MessageView.ForAccount( selectedAccountName) } case *Terminal: - return aerc.conf.Bindings.Terminal + return config.Binds.Terminal default: - return aerc.conf.Bindings.Global + return config.Binds.Global } } @@ -319,8 +316,7 @@ func (aerc *Aerc) Event(event tcell.Event) bool { case config.BINDING_NOT_FOUND: } if bindings.Globals { - result, strokes = aerc.conf.Bindings.Global. - GetBinding(aerc.pendingKeys) + result, strokes = config.Binds.Global.GetBinding(aerc.pendingKeys) switch result { case config.BINDING_FOUND: aerc.simulate(strokes) @@ -335,7 +331,7 @@ func (aerc *Aerc) Event(event tcell.Event) bool { exKey := bindings.ExKey if aerc.simulating > 0 { // Keybindings still use : even if you change the ex key - exKey = aerc.conf.Bindings.Global.ExKey + exKey = config.Binds.Global.ExKey } if aerc.isExKey(event, exKey) { aerc.BeginExCommand("") @@ -367,10 +363,6 @@ func (aerc *Aerc) Event(event tcell.Event) bool { return false } -func (aerc *Aerc) Config() *config.AercConfig { - return aerc.conf -} - func (aerc *Aerc) SelectedAccount() *AccountView { return aerc.account(aerc.SelectedTabContent()) } @@ -387,13 +379,13 @@ func (aerc *Aerc) PrevAccount() (*AccountView, error) { if cur == nil { return nil, fmt.Errorf("no account selected, cannot get prev") } - for i, conf := range aerc.conf.Accounts { + for i, conf := range config.Accounts { if conf.Name == cur.Name() { i -= 1 if i == -1 { - i = len(aerc.conf.Accounts) - 1 + i = len(config.Accounts) - 1 } - conf = aerc.conf.Accounts[i] + conf = config.Accounts[i] return aerc.Account(conf.Name) } } @@ -405,13 +397,13 @@ func (aerc *Aerc) NextAccount() (*AccountView, error) { if cur == nil { return nil, fmt.Errorf("no account selected, cannot get next") } - for i, conf := range aerc.conf.Accounts { + for i, conf := range config.Accounts { if conf.Name == cur.Name() { i += 1 - if i == len(aerc.conf.Accounts) { + if i == len(config.Accounts) { i = 0 } - conf = aerc.conf.Accounts[i] + conf = config.Accounts[i] return aerc.Account(conf.Name) } } @@ -441,7 +433,7 @@ func (aerc *Aerc) account(d ui.Drawable) *AccountView { func (aerc *Aerc) SelectedAccountUiConfig() *config.UIConfig { acct := aerc.SelectedAccount() if acct == nil { - return &aerc.conf.Ui + return config.Ui } return acct.UiConfig() } @@ -459,10 +451,9 @@ func (aerc *Aerc) SelectedTab() *ui.Tab { } func (aerc *Aerc) NewTab(clickable ui.Drawable, name string) *ui.Tab { - var uiConf *config.UIConfig = nil + uiConf := config.Ui if acct := aerc.account(clickable); acct != nil { - conf := acct.UiConfig() - uiConf = conf + uiConf = acct.UiConfig() } tab := aerc.tabs.Add(clickable, name, uiConf) aerc.UpdateStatus() @@ -588,7 +579,7 @@ func (aerc *Aerc) BeginExCommand(cmd string) { return aerc.complete(cmd), "" } } - exline := NewExLine(aerc.conf, cmd, func(cmd string) { + exline := NewExLine(cmd, func(cmd string) { parts, err := shlex.Split(cmd) if err != nil { aerc.PushError(err.Error()) @@ -615,7 +606,7 @@ func (aerc *Aerc) PushPrompt(prompt *ExLine) { } func (aerc *Aerc) RegisterPrompt(prompt string, cmd []string) { - p := NewPrompt(aerc.conf, prompt, func(text string) { + p := NewPrompt(prompt, func(text string) { if text != "" { cmd = append(cmd, text) } @@ -641,7 +632,7 @@ func (aerc *Aerc) RegisterChoices(choices []Choice) { cmds[c.Key] = c.Command } prompt := strings.Join(texts, ", ") + "? " - p := NewPrompt(aerc.conf, prompt, func(text string) { + p := NewPrompt(prompt, func(text string) { cmd, ok := cmds[text] if !ok { return @@ -718,7 +709,7 @@ func (aerc *Aerc) Mailto(addr *url.URL) error { return errors.New("No account selected") } - composer, err := NewComposer(aerc, acct, aerc.Config(), + composer, err := NewComposer(aerc, acct, acct.AccountConfig(), acct.Worker(), "", h, models.OriginalMail{}) if err != nil { return nil @@ -766,9 +757,9 @@ func (aerc *Aerc) Mbox(source string) error { acctConf.Postpone = "Drafts" acctConf.CopyTo = "Sent" - mboxView, err := NewAccountView(aerc, aerc.conf, &acctConf, aerc, nil) + mboxView, err := NewAccountView(aerc, &acctConf, aerc, nil) if err != nil { - aerc.NewTab(errorScreen(err.Error(), aerc.conf.Ui), acctConf.Name) + aerc.NewTab(errorScreen(err.Error()), acctConf.Name) } else { aerc.accounts[acctConf.Name] = mboxView aerc.NewTab(mboxView, acctConf.Name) @@ -806,7 +797,7 @@ func (aerc *Aerc) CloseDialog() { func (aerc *Aerc) GetPassword(title string, prompt string) (chText chan string, chErr chan error) { chText = make(chan string, 1) chErr = make(chan error, 1) - getPasswd := NewGetPasswd(title, prompt, aerc.conf, func(pw string, err error) { + getPasswd := NewGetPasswd(title, prompt, func(pw string, err error) { defer func() { close(chErr) close(chText) @@ -848,8 +839,8 @@ func (aerc *Aerc) DecryptKeys(keys []openpgp.Key, symmetric bool) (b []byte, err } // errorScreen is a widget that draws an error in the middle of the context -func errorScreen(s string, conf config.UIConfig) ui.Drawable { - errstyle := conf.GetStyle(config.STYLE_ERROR) +func errorScreen(s string) ui.Drawable { + errstyle := config.Ui.GetStyle(config.STYLE_ERROR) text := ui.NewText(s, errstyle).Strategy(ui.TEXT_CENTER) grid := ui.NewGrid().Rows([]ui.GridSpec{ {Strategy: ui.SIZE_WEIGHT, Size: ui.Const(1)}, diff --git a/widgets/compose.go b/widgets/compose.go index 4cf7da16..4f08afa3 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -36,7 +36,6 @@ type Composer struct { parent models.OriginalMail // parent of current message, only set if reply acctConfig *config.AccountConfig - config *config.AercConfig acct *AccountView aerc *Aerc @@ -65,8 +64,9 @@ type Composer struct { textParts []*lib.Part } -func NewComposer(aerc *Aerc, acct *AccountView, conf *config.AercConfig, - acctConfig *config.AccountConfig, worker *types.Worker, template string, +func NewComposer( + aerc *Aerc, acct *AccountView, acctConfig *config.AccountConfig, + worker *types.Worker, template string, h *mail.Header, orig models.OriginalMail, ) (*Composer, error) { if h == nil { @@ -83,7 +83,6 @@ func NewComposer(aerc *Aerc, acct *AccountView, conf *config.AercConfig, acct: acct, acctConfig: acctConfig, aerc: aerc, - config: conf, header: h, parent: orig, email: email, @@ -132,17 +131,16 @@ func (c *Composer) SwitchAccount(newAcct *AccountView) error { return nil } -func (c *Composer) setupFor(acct *AccountView) error { +func (c *Composer) setupFor(view *AccountView) error { c.Lock() defer c.Unlock() - // set new account and accountConfig - c.acct = acct - c.acctConfig = acct.AccountConfig() - c.worker = acct.Worker() + // set new account + c.acct = view + c.worker = view.Worker() // Set from header if not already in header if fl, err := c.header.AddressList("from"); err != nil || fl == nil { - fl, err = mail.ParseAddressList(c.acctConfig.From) + fl, err = mail.ParseAddressList(view.acct.From) if err != nil { return err } @@ -152,9 +150,9 @@ func (c *Composer) setupFor(acct *AccountView) error { } // update completer - cmd := c.acctConfig.AddressBookCmd + cmd := view.acct.AddressBookCmd if cmd == "" { - cmd = c.config.Compose.AddressBookCmd + cmd = config.Compose.AddressBookCmd } cmpl := completer.New(cmd, func(err error) { c.aerc.PushError( @@ -187,12 +185,12 @@ func (c *Composer) setupFor(acct *AccountView) error { // update the crypto parts c.crypto = nil c.sign = false - if c.acctConfig.PgpAutoSign { + if c.acct.acct.PgpAutoSign { err := c.SetSign(true) log.Warnf("failed to enable message signing: %v", err) } c.encrypt = false - if c.acctConfig.PgpOpportunisticEncrypt { + if c.acct.acct.PgpOpportunisticEncrypt { c.SetEncrypt(true) } err := c.updateCrypto() @@ -204,7 +202,7 @@ func (c *Composer) setupFor(acct *AccountView) error { } func (c *Composer) buildComposeHeader(aerc *Aerc, cmpl *completer.Completer) { - c.layout = aerc.conf.Compose.HeaderLayout + c.layout = config.Compose.HeaderLayout c.editors = make(map[string]*headerEditor) c.focusable = make([]ui.MouseableDrawableInteractive, 0) uiConfig := c.acct.UiConfig() @@ -214,7 +212,7 @@ func (c *Composer) buildComposeHeader(aerc *Aerc, cmpl *completer.Completer) { h = strings.ToLower(h) c.layout[i][j] = h // normalize to lowercase e := newHeaderEditor(h, c.header, uiConfig) - if aerc.conf.Ui.CompletionPopovers { + if uiConfig.CompletionPopovers { e.input.TabComplete( cmpl.ForHeader(h), uiConfig.CompletionDelay, @@ -237,7 +235,7 @@ func (c *Composer) buildComposeHeader(aerc *Aerc, cmpl *completer.Completer) { if c.header.Has(h) { if _, ok := c.editors[h]; !ok { e := newHeaderEditor(h, c.header, uiConfig) - if aerc.conf.Ui.CompletionPopovers { + if uiConfig.CompletionPopovers { e.input.TabComplete( cmpl.ForHeader(h), uiConfig.CompletionDelay, @@ -499,7 +497,7 @@ func (c *Composer) AddTemplate(template string, data interface{}) error { } templateText, err := templates.ParseTemplateFromFile( - template, c.config.Templates.TemplateDirs, data) + template, config.Templates.TemplateDirs, data) if err != nil { return err } @@ -815,7 +813,7 @@ func (c *Composer) WriteMessage(header *mail.Header, writer io.Writer) error { } func (c *Composer) ShouldWarnAttachment() (bool, error) { - regex := c.config.Compose.NoAttachmentWarning + regex := config.Compose.NoAttachmentWarning if regex == nil || len(c.attachments) > 0 { return false, nil @@ -987,7 +985,7 @@ func (c *Composer) ShowTerminal() { c.grid.RemoveChild(c.review) } cmds := []string{ - c.config.Compose.Editor, + config.Compose.Editor, os.Getenv("EDITOR"), "vi", "nano", @@ -1261,7 +1259,7 @@ type reviewMessage struct { } func newReviewMessage(composer *Composer, err error) *reviewMessage { - bindings := composer.config.Bindings.ComposeReview.ForAccount( + bindings := config.Binds.ComposeReview.ForAccount( composer.acctConfig.Name, ) @@ -1400,7 +1398,7 @@ func newReviewMessage(composer *Composer, err error) *reviewMessage { } func (c *Composer) updateMultipart(p *lib.Part) error { - command, found := c.aerc.Config().Converters[p.MimeType] + command, found := config.Converters[p.MimeType] if !found { // unreachable return fmt.Errorf("no command defined for mime/type") diff --git a/widgets/dirlist.go b/widgets/dirlist.go index 0b41c024..4d27def2 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -48,7 +48,6 @@ type DirectoryLister interface { type DirectoryList struct { Scrollable - aercConf *config.AercConfig acctConf *config.AccountConfig store *lib.DirStore dirs []string @@ -60,13 +59,12 @@ type DirectoryList struct { skipSelectCancel context.CancelFunc } -func NewDirectoryList(conf *config.AercConfig, acctConf *config.AccountConfig, +func NewDirectoryList(acctConf *config.AccountConfig, worker *types.Worker, ) DirectoryLister { ctx, cancel := context.WithCancel(context.Background()) dirlist := &DirectoryList{ - aercConf: conf, acctConf: acctConf, store: lib.NewDirStore(), worker: worker, @@ -88,7 +86,7 @@ func (dirlist *DirectoryList) UiConfig(dir string) *config.UIConfig { if dir == "" { dir = dirlist.Selected() } - return dirlist.aercConf.Ui.ForAccount(dirlist.acctConf.Name).ForFolder(dir) + return config.Ui.ForAccount(dirlist.acctConf.Name).ForFolder(dir) } func (dirlist *DirectoryList) List() []string { diff --git a/widgets/exline.go b/widgets/exline.go index 5cf4338d..1f2d71e4 100644 --- a/widgets/exline.go +++ b/widgets/exline.go @@ -14,19 +14,18 @@ type ExLine struct { tabcomplete func(cmd string) ([]string, string) cmdHistory lib.History input *ui.TextInput - conf *config.AercConfig } -func NewExLine(conf *config.AercConfig, cmd string, commit func(cmd string), finish func(), +func NewExLine(cmd string, commit func(cmd string), finish func(), tabcomplete func(cmd string) ([]string, string), cmdHistory lib.History, ) *ExLine { - input := ui.NewTextInput("", &conf.Ui).Prompt(":").Set(cmd) - if conf.Ui.CompletionPopovers { + input := ui.NewTextInput("", config.Ui).Prompt(":").Set(cmd) + if config.Ui.CompletionPopovers { input.TabComplete( tabcomplete, - conf.Ui.CompletionDelay, - conf.Ui.CompletionMinChars, + config.Ui.CompletionDelay, + config.Ui.CompletionMinChars, ) } exline := &ExLine{ @@ -35,7 +34,6 @@ func NewExLine(conf *config.AercConfig, cmd string, commit func(cmd string), fin tabcomplete: tabcomplete, cmdHistory: cmdHistory, input: input, - conf: conf, } return exline } @@ -43,20 +41,20 @@ func NewExLine(conf *config.AercConfig, cmd string, commit func(cmd string), fin func (x *ExLine) TabComplete(tabComplete func(string) ([]string, string)) { x.input.TabComplete( tabComplete, - x.conf.Ui.CompletionDelay, - x.conf.Ui.CompletionMinChars, + config.Ui.CompletionDelay, + config.Ui.CompletionMinChars, ) } -func NewPrompt(conf *config.AercConfig, prompt string, commit func(text string), +func NewPrompt(prompt string, commit func(text string), tabcomplete func(cmd string) ([]string, string), ) *ExLine { - input := ui.NewTextInput("", &conf.Ui).Prompt(prompt) - if conf.Ui.CompletionPopovers { + input := ui.NewTextInput("", config.Ui).Prompt(prompt) + if config.Ui.CompletionPopovers { input.TabComplete( tabcomplete, - conf.Ui.CompletionDelay, - conf.Ui.CompletionMinChars, + config.Ui.CompletionDelay, + config.Ui.CompletionMinChars, ) } exline := &ExLine{ diff --git a/widgets/getpasswd.go b/widgets/getpasswd.go index 70a2648d..17274626 100644 --- a/widgets/getpasswd.go +++ b/widgets/getpasswd.go @@ -14,26 +14,24 @@ type GetPasswd struct { title string prompt string input *ui.TextInput - conf *config.AercConfig } -func NewGetPasswd(title string, prompt string, conf *config.AercConfig, - cb func(string, error), +func NewGetPasswd( + title string, prompt string, cb func(string, error), ) *GetPasswd { getpasswd := &GetPasswd{ callback: cb, title: title, prompt: prompt, - conf: conf, - input: ui.NewTextInput("", &conf.Ui).Password(true).Prompt("Password: "), + input: ui.NewTextInput("", config.Ui).Password(true).Prompt("Password: "), } getpasswd.input.Focus(true) return getpasswd } func (gp *GetPasswd) Draw(ctx *ui.Context) { - defaultStyle := gp.conf.Ui.GetStyle(config.STYLE_DEFAULT) - titleStyle := gp.conf.Ui.GetStyle(config.STYLE_TITLE) + defaultStyle := config.Ui.GetStyle(config.STYLE_DEFAULT) + titleStyle := config.Ui.GetStyle(config.STYLE_TITLE) ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', defaultStyle) ctx.Fill(0, 0, ctx.Width(), 1, ' ', titleStyle) diff --git a/widgets/msglist.go b/widgets/msglist.go index 85b8f168..4c805d51 100644 --- a/widgets/msglist.go +++ b/widgets/msglist.go @@ -21,7 +21,6 @@ import ( type MessageList struct { Scrollable - conf *config.AercConfig height int nmsgs int spinner *Spinner @@ -30,10 +29,9 @@ type MessageList struct { aerc *Aerc } -func NewMessageList(conf *config.AercConfig, aerc *Aerc) *MessageList { +func NewMessageList(aerc *Aerc, account *AccountView) *MessageList { ml := &MessageList{ - conf: conf, - spinner: NewSpinner(&conf.Ui), + spinner: NewSpinner(account.uiConf), isInitalizing: true, aerc: aerc, } @@ -310,7 +308,7 @@ func (ml *MessageList) MouseEvent(localX int, localY int, event tcell.Event) { ml.aerc.PushError(err.Error()) return } - viewer := NewMessageViewer(acct, ml.aerc.Config(), view) + viewer := NewMessageViewer(acct, view) ml.aerc.NewTab(viewer, msg.Envelope.Subject) }) } diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go index 875ff873..0c72fa79 100644 --- a/widgets/msgviewer.go +++ b/widgets/msgviewer.go @@ -28,7 +28,6 @@ var _ ProvidesMessages = (*MessageViewer)(nil) type MessageViewer struct { acct *AccountView - conf *config.AercConfig err error grid *ui.Grid switcher *PartSwitcher @@ -46,11 +45,11 @@ type PartSwitcher struct { mv *MessageViewer } -func NewMessageViewer(acct *AccountView, - conf *config.AercConfig, msg lib.MessageView, +func NewMessageViewer( + acct *AccountView, msg lib.MessageView, ) *MessageViewer { hf := HeaderLayoutFilter{ - layout: HeaderLayout(conf.Viewer.HeaderLayout), + layout: HeaderLayout(config.Viewer.HeaderLayout), keep: func(msg *models.MessageInfo, header string) bool { return fmtHeader(msg, header, "2", "3", "4", "5") != "" }, @@ -59,7 +58,6 @@ func NewMessageViewer(acct *AccountView, header, headerHeight := layout.grid( func(header string) ui.Drawable { hv := &HeaderView{ - conf: conf, Name: header, Value: fmtHeader( msg.MessageInfo(), @@ -94,7 +92,7 @@ func NewMessageViewer(acct *AccountView, {Strategy: ui.SIZE_EXACT, Size: ui.Const(headerHeight)}, } - if msg.MessageDetails() != nil || conf.Ui.IconUnencrypted != "" { + if msg.MessageDetails() != nil || acct.UiConfig().IconUnencrypted != "" { height := 1 if msg.MessageDetails() != nil && msg.MessageDetails().IsSigned && msg.MessageDetails().IsEncrypted { height = 2 @@ -112,7 +110,7 @@ func NewMessageViewer(acct *AccountView, }) switcher := &PartSwitcher{} - err := createSwitcher(acct, switcher, conf, msg) + err := createSwitcher(acct, switcher, msg) if err != nil { return &MessageViewer{ acct: acct, @@ -127,7 +125,7 @@ func NewMessageViewer(acct *AccountView, borderChar := acct.UiConfig().BorderCharHorizontal grid.AddChild(header).At(0, 0) - if msg.MessageDetails() != nil || conf.Ui.IconUnencrypted != "" { + if msg.MessageDetails() != nil || acct.UiConfig().IconUnencrypted != "" { grid.AddChild(NewPGPInfo(msg.MessageDetails(), acct.UiConfig())).At(1, 0) grid.AddChild(ui.NewFill(borderChar, borderStyle)).At(2, 0) grid.AddChild(switcher).At(3, 0) @@ -138,7 +136,6 @@ func NewMessageViewer(acct *AccountView, mv := &MessageViewer{ acct: acct, - conf: conf, grid: grid, msg: msg, switcher: switcher, @@ -186,9 +183,9 @@ func fmtHeader(msg *models.MessageInfo, header string, } } -func enumerateParts(acct *AccountView, conf *config.AercConfig, - msg lib.MessageView, body *models.BodyStructure, - index []int, +func enumerateParts( + acct *AccountView, msg lib.MessageView, + body *models.BodyStructure, index []int, ) ([]*PartViewer, error) { var parts []*PartViewer for i, part := range body.Parts { @@ -198,14 +195,14 @@ func enumerateParts(acct *AccountView, conf *config.AercConfig, pv := &PartViewer{part: part} parts = append(parts, pv) subParts, err := enumerateParts( - acct, conf, msg, part, curindex) + acct, msg, part, curindex) if err != nil { return nil, err } parts = append(parts, subParts...) continue } - pv, err := NewPartViewer(acct, conf, msg, part, curindex) + pv, err := NewPartViewer(acct, msg, part, curindex) if err != nil { return nil, err } @@ -214,13 +211,13 @@ func enumerateParts(acct *AccountView, conf *config.AercConfig, return parts, nil } -func createSwitcher(acct *AccountView, switcher *PartSwitcher, - conf *config.AercConfig, msg lib.MessageView, +func createSwitcher( + acct *AccountView, switcher *PartSwitcher, msg lib.MessageView, ) error { var err error switcher.selected = -1 - switcher.showHeaders = conf.Viewer.ShowHeaders - switcher.alwaysShowMime = conf.Viewer.AlwaysShowMime + switcher.showHeaders = config.Viewer.ShowHeaders + switcher.alwaysShowMime = config.Viewer.AlwaysShowMime if msg.MessageInfo().Error != nil { return fmt.Errorf("could not view message: %w", msg.MessageInfo().Error) @@ -228,30 +225,30 @@ func createSwitcher(acct *AccountView, switcher *PartSwitcher, if len(msg.BodyStructure().Parts) == 0 { switcher.selected = 0 - pv, err := NewPartViewer(acct, conf, msg, msg.BodyStructure(), nil) + pv, err := NewPartViewer(acct, msg, msg.BodyStructure(), nil) if err != nil { return err } switcher.parts = []*PartViewer{pv} } else { - switcher.parts, err = enumerateParts(acct, conf, msg, + switcher.parts, err = enumerateParts(acct, msg, msg.BodyStructure(), []int{}) if err != nil { return err } selectedPriority := -1 - log.Tracef("Selecting best message from %v", conf.Viewer.Alternatives) + log.Tracef("Selecting best message from %v", config.Viewer.Alternatives) for i, pv := range switcher.parts { // Switch to user's preferred mimetype if switcher.selected == -1 && pv.part.MIMEType != "multipart" { switcher.selected = i } mime := pv.part.FullMIMEType() - for idx, m := range conf.Viewer.Alternatives { + for idx, m := range config.Viewer.Alternatives { if m != mime { continue } - priority := len(conf.Viewer.Alternatives) - idx + priority := len(config.Viewer.Alternatives) - idx if priority > selectedPriority { selectedPriority = priority switcher.selected = i @@ -309,8 +306,8 @@ func (mv *MessageViewer) MarkedMessages() ([]uint32, error) { func (mv *MessageViewer) ToggleHeaders() { switcher := mv.switcher switcher.Cleanup() - mv.conf.Viewer.ShowHeaders = !mv.conf.Viewer.ShowHeaders - err := createSwitcher(mv.acct, switcher, mv.conf, mv.msg) + config.Viewer.ShowHeaders = !config.Viewer.ShowHeaders + err := createSwitcher(mv.acct, switcher, mv.msg) if err != nil { log.Errorf("cannot create switcher: %v", err) } @@ -318,8 +315,8 @@ func (mv *MessageViewer) ToggleHeaders() { } func (mv *MessageViewer) ToggleKeyPassthrough() bool { - mv.conf.Viewer.KeyPassthrough = !mv.conf.Viewer.KeyPassthrough - return mv.conf.Viewer.KeyPassthrough + config.Viewer.KeyPassthrough = !config.Viewer.KeyPassthrough + return config.Viewer.KeyPassthrough } func (mv *MessageViewer) SelectedMessagePart() *PartInfo { @@ -380,7 +377,7 @@ func (mv *MessageViewer) NextPart() { } func (mv *MessageViewer) Bindings() string { - if mv.conf.Viewer.KeyPassthrough { + if config.Viewer.KeyPassthrough { return "view::passthrough" } else { return "view" @@ -410,7 +407,7 @@ func (ps *PartSwitcher) Event(event tcell.Event) bool { func (ps *PartSwitcher) Draw(ctx *ui.Context) { height := len(ps.parts) - if height == 1 && !ps.alwaysShowMime { + if height == 1 && !config.Viewer.AlwaysShowMime { ps.parts[ps.selected].Draw(ctx) return } @@ -504,7 +501,6 @@ func (mv *MessageViewer) Focus(focus bool) { } type PartViewer struct { - conf *config.AercConfig acctConfig *config.AccountConfig err error fetched bool @@ -526,8 +522,8 @@ type PartViewer struct { const copying int32 = 1 -func NewPartViewer(acct *AccountView, conf *config.AercConfig, - msg lib.MessageView, part *models.BodyStructure, +func NewPartViewer( + acct *AccountView, msg lib.MessageView, part *models.BodyStructure, curindex []int, ) (*PartViewer, error) { var ( @@ -537,7 +533,7 @@ func NewPartViewer(acct *AccountView, conf *config.AercConfig, term *Terminal ) cmds := []string{ - conf.Viewer.Pager, + config.Viewer.Pager, os.Getenv("PAGER"), "less -R", } @@ -556,7 +552,7 @@ func NewPartViewer(acct *AccountView, conf *config.AercConfig, info := msg.MessageInfo() mime := part.FullMIMEType() - for _, f := range conf.Filters { + for _, f := range config.Filters { switch f.Type { case config.FILTER_MIMETYPE: if fnmatch.Match(f.Filter, mime, 0) { @@ -624,7 +620,6 @@ func NewPartViewer(acct *AccountView, conf *config.AercConfig, copy(index, curindex) pv := &PartViewer{ - conf: conf, acctConfig: acct.AccountConfig(), filter: filter, index: index, @@ -632,7 +627,7 @@ func NewPartViewer(acct *AccountView, conf *config.AercConfig, pager: pager, pagerin: pagerin, part: part, - showHeaders: conf.Viewer.ShowHeaders, + showHeaders: config.Viewer.ShowHeaders, term: term, grid: grid, uiConfig: acct.UiConfig(), @@ -724,7 +719,7 @@ func (pv *PartViewer) writeMailHeaders() { } func (pv *PartViewer) hyperlinks(r io.Reader) (reader io.Reader) { - if !pv.conf.Viewer.ParseHttpLinks { + if !config.Viewer.ParseHttpLinks { return r } reader, pv.links = parse.HttpLinks(r) @@ -738,7 +733,7 @@ var noFilterConfiguredCommands = [][]string{ } func newNoFilterConfigured(pv *PartViewer) *ui.Grid { - bindings := pv.conf.Bindings.MessageView.ForAccount(pv.acctConfig.Name) + bindings := config.Binds.MessageView.ForAccount(pv.acctConfig.Name) var actions []string @@ -774,7 +769,7 @@ func newNoFilterConfigured(pv *PartViewer) *ui.Grid { {Strategy: ui.SIZE_WEIGHT, Size: ui.Const(1)}, }) - uiConfig := pv.conf.Ui + uiConfig := config.Ui noFilter := fmt.Sprintf(`No filter configured for this mimetype ('%s') What would you like to do?`, pv.part.FullMIMEType()) @@ -827,7 +822,6 @@ func (pv *PartViewer) Event(event tcell.Event) bool { } type HeaderView struct { - conf *config.AercConfig Name string Value string ValueField ui.Drawable diff --git a/widgets/status.go b/widgets/status.go index 97ff9441..571fa8b0 100644 --- a/widgets/status.go +++ b/widgets/status.go @@ -22,7 +22,7 @@ type StatusMessage struct { message string } -func NewStatusLine(uiConfig config.UIConfig) *StatusLine { +func NewStatusLine(uiConfig *config.UIConfig) *StatusLine { return &StatusLine{ fallback: StatusMessage{ style: uiConfig.GetStyle(config.STYLE_STATUSLINE_DEFAULT), |