diff --git a/commands/account/compose.go b/commands/account/compose.go index d4128db..1a62d0a 100644 --- a/commands/account/compose.go +++ b/commands/account/compose.go @@ -30,6 +30,9 @@ func (Compose) Execute(aerc *widgets.Aerc, args []string) error { return err } acct := aerc.SelectedAccount() + if acct == nil { + return errors.New("No account selected") + } if template == "" { template = aerc.Config().Templates.NewMessage } diff --git a/commands/account/view.go b/commands/account/view.go index 4f59d94..53ad267 100644 --- a/commands/account/view.go +++ b/commands/account/view.go @@ -26,6 +26,9 @@ func (ViewMessage) Execute(aerc *widgets.Aerc, args []string) error { return errors.New("Usage: view-message") } acct := aerc.SelectedAccount() + if acct == nil { + return errors.New("No account selected") + } if acct.Messages().Empty() { return nil } diff --git a/commands/commands.go b/commands/commands.go index cb5b63b..70a77b9 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -117,11 +117,15 @@ func (cmds *Commands) GetCompletions(aerc *widgets.Aerc, cmd string) []string { func GetFolders(aerc *widgets.Aerc, args []string) []string { out := make([]string, 0) - if len(args) == 0 { - return aerc.SelectedAccount().Directories().List() + acct := aerc.SelectedAccount() + if acct == nil { + return out } - for _, dir := range aerc.SelectedAccount().Directories().List() { - if foundInString(dir, args[0], aerc.SelectedAccount().UiConfig().FuzzyFolderComplete) { + if len(args) == 0 { + return acct.Directories().List() + } + for _, dir := range acct.Directories().List() { + if foundInString(dir, args[0], acct.UiConfig().FuzzyFolderComplete) { out = append(out, dir) } } @@ -144,8 +148,12 @@ func CompletionFromList(valid []string, args []string) []string { } func GetLabels(aerc *widgets.Aerc, args []string) []string { + acct := aerc.SelectedAccount() + if acct == nil { + return make([]string, 0) + } if len(args) == 0 { - return aerc.SelectedAccount().Labels() + return acct.Labels() } // + and - are used to denote tag addition / removal and need to be striped @@ -165,7 +173,7 @@ func GetLabels(aerc *widgets.Aerc, args []string) []string { trimmed := strings.TrimLeft(last, "+-") out := make([]string, 0) - for _, label := range aerc.SelectedAccount().Labels() { + for _, label := range acct.Labels() { if hasCaseSmartPrefix(label, trimmed) { var prev string if len(others) > 0 { diff --git a/commands/compose/postpone.go b/commands/compose/postpone.go index f918b52..9462a9c 100644 --- a/commands/compose/postpone.go +++ b/commands/compose/postpone.go @@ -31,6 +31,10 @@ func (Postpone) Execute(aerc *widgets.Aerc, args []string) error { if len(args) != 1 { return errors.New("Usage: postpone") } + acct := aerc.SelectedAccount() + if acct == nil { + return errors.New("No account selected") + } composer, _ := aerc.SelectedTab().(*widgets.Composer) config := composer.Config() tabName := aerc.TabNames()[aerc.SelectedTabIndex()] @@ -48,7 +52,7 @@ func (Postpone) Execute(aerc *widgets.Aerc, args []string) error { header.SetContentType("text/plain", map[string]string{"charset": "UTF-8"}) header.Set("Content-Transfer-Encoding", "quoted-printable") worker := composer.Worker() - dirs := aerc.SelectedAccount().Directories().List() + dirs := acct.Directories().List() alreadyCreated := false for _, dir := range dirs { if dir == config.Postpone { diff --git a/commands/msg/unsubscribe.go b/commands/msg/unsubscribe.go index 3a69ff9..428e872 100644 --- a/commands/msg/unsubscribe.go +++ b/commands/msg/unsubscribe.go @@ -89,6 +89,9 @@ func parseUnsubscribeMethods(header string) (methods []*url.URL) { func unsubscribeMailto(aerc *widgets.Aerc, u *url.URL) error { widget := aerc.SelectedTab().(widgets.ProvidesMessage) acct := widget.SelectedAccount() + if acct == nil { + return errors.New("No account selected") + } h := &mail.Header{} h.SetSubject(u.Query().Get("subject")) diff --git a/commands/msgview/next.go b/commands/msgview/next.go index 4291a6a..742bc66 100644 --- a/commands/msgview/next.go +++ b/commands/msgview/next.go @@ -1,6 +1,8 @@ package msgview import ( + "errors" + "git.sr.ht/~rjarry/aerc/commands/account" "git.sr.ht/~rjarry/aerc/lib" "git.sr.ht/~rjarry/aerc/widgets" @@ -27,6 +29,9 @@ func (NextPrevMsg) Execute(aerc *widgets.Aerc, args []string) error { } mv, _ := aerc.SelectedTab().(*widgets.MessageViewer) acct := mv.SelectedAccount() + if acct == nil { + return errors.New("No account selected") + } store := mv.Store() err = account.ExecuteNextPrevMessage(args, acct, pct, n) if err != nil { diff --git a/widgets/aerc.go b/widgets/aerc.go index 10e9924..98bc1b2 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -309,6 +309,14 @@ func (aerc *Aerc) SelectedAccount() *AccountView { return nil } +func (aerc *Aerc) SelectedAccountUiConfig() config.UIConfig { + acct := aerc.SelectedAccount() + if acct == nil { + return aerc.conf.Ui + } + return acct.UiConfig() +} + func (aerc *Aerc) SelectedTab() ui.Drawable { return aerc.tabs.Tabs[aerc.tabs.Selected].Content } diff --git a/widgets/compose.go b/widgets/compose.go index 7229ec8..e47aa3e 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -127,15 +127,15 @@ func (c *Composer) buildComposeHeader(aerc *Aerc, cmpl *completer.Completer) { c.layout = aerc.conf.Compose.HeaderLayout c.editors = make(map[string]*headerEditor) c.focusable = make([]ui.MouseableDrawableInteractive, 0) + uiConfig := aerc.SelectedAccountUiConfig() for i, row := range c.layout { for j, h := range row { h = strings.ToLower(h) c.layout[i][j] = h // normalize to lowercase - e := newHeaderEditor(h, c.header, aerc.SelectedAccount().UiConfig()) + e := newHeaderEditor(h, c.header, uiConfig) if aerc.conf.Ui.CompletionPopovers { - e.input.TabComplete(cmpl.ForHeader(h), - aerc.SelectedAccount().UiConfig().CompletionDelay) + e.input.TabComplete(cmpl.ForHeader(h), uiConfig.CompletionDelay) } c.editors[h] = e switch h { @@ -152,9 +152,9 @@ func (c *Composer) buildComposeHeader(aerc *Aerc, cmpl *completer.Completer) { for _, h := range []string{"cc", "bcc"} { if c.header.Has(h) { if _, ok := c.editors[h]; !ok { - e := newHeaderEditor(h, c.header, aerc.SelectedAccount().UiConfig()) + e := newHeaderEditor(h, c.header, uiConfig) if aerc.conf.Ui.CompletionPopovers { - e.input.TabComplete(cmpl.ForHeader(h), aerc.SelectedAccount().UiConfig().CompletionDelay) + e.input.TabComplete(cmpl.ForHeader(h), uiConfig.CompletionDelay) } c.editors[h] = e c.focusable = append(c.focusable, e) @@ -741,11 +741,10 @@ func (c *Composer) AddEditor(header string, value string, appendHeader bool) { e.storeValue() // flush modifications from the user to the header editor = e } else { - e := newHeaderEditor(header, c.header, - c.aerc.SelectedAccount().UiConfig()) - if c.config.Ui.CompletionPopovers { - e.input.TabComplete(c.completer.ForHeader(header), - c.config.Ui.CompletionDelay) + uiConfig := c.aerc.SelectedAccountUiConfig() + e := newHeaderEditor(header, c.header, uiConfig) + if uiConfig.CompletionPopovers { + e.input.TabComplete(c.completer.ForHeader(header), uiConfig.CompletionDelay) } c.editors[header] = e c.layout = append(c.layout, []string{header}) diff --git a/widgets/msglist.go b/widgets/msglist.go index 50ce24e..ae0d211 100644 --- a/widgets/msglist.go +++ b/widgets/msglist.go @@ -53,11 +53,13 @@ func (ml *MessageList) Invalidate() { func (ml *MessageList) Draw(ctx *ui.Context) { ml.height = ctx.Height() + uiConfig := ml.aerc.SelectedAccountUiConfig() ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', - ml.aerc.SelectedAccount().UiConfig().GetStyle(config.STYLE_MSGLIST_DEFAULT)) + uiConfig.GetStyle(config.STYLE_MSGLIST_DEFAULT)) + acct := ml.aerc.SelectedAccount() store := ml.Store() - if store == nil { + if store == nil || acct == nil { if ml.isInitalizing { ml.spinner.Draw(ctx) return @@ -89,7 +91,7 @@ func (ml *MessageList) Draw(ctx *ui.Context) { row int = 0 ) - if ml.aerc.SelectedAccount().UiConfig().ThreadingEnabled || store.BuildThreads() { + if uiConfig.ThreadingEnabled || store.BuildThreads() { threads := store.Threads counter := len(store.Uids()) @@ -119,8 +121,8 @@ func (ml *MessageList) Draw(ctx *ui.Context) { } } fmtCtx := format.Ctx{ - FromAddress: ml.aerc.SelectedAccount().acct.From, - AccountName: ml.aerc.SelectedAccount().Name(), + FromAddress: acct.acct.From, + AccountName: acct.Name(), MsgInfo: msg, MsgNum: row, MsgIsMarked: store.IsMarked(t.Uid), @@ -144,8 +146,8 @@ func (ml *MessageList) Draw(ctx *ui.Context) { uid := uids[i] msg := store.Messages[uid] fmtCtx := format.Ctx{ - FromAddress: ml.aerc.SelectedAccount().acct.From, - AccountName: ml.aerc.SelectedAccount().Name(), + FromAddress: acct.acct.From, + AccountName: acct.Name(), MsgInfo: msg, MsgNum: row, MsgIsMarked: store.IsMarked(uid), @@ -183,8 +185,9 @@ func (ml *MessageList) Draw(ctx *ui.Context) { func (ml *MessageList) drawRow(textWidth int, ctx *ui.Context, uid uint32, row int, needsHeaders *[]uint32, fmtCtx format.Ctx) bool { store := ml.store msg := store.Messages[uid] + acct := ml.aerc.SelectedAccount() - if row >= ctx.Height() { + if row >= ctx.Height() || acct == nil { return true } @@ -195,8 +198,8 @@ func (ml *MessageList) drawRow(textWidth int, ctx *ui.Context, uid uint32, row i } confParams := map[config.ContextType]string{ - config.UI_CONTEXT_ACCOUNT: ml.aerc.SelectedAccount().AccountConfig().Name, - config.UI_CONTEXT_FOLDER: ml.aerc.SelectedAccount().Directories().Selected(), + config.UI_CONTEXT_ACCOUNT: acct.AccountConfig().Name, + config.UI_CONTEXT_FOLDER: acct.Directories().Selected(), } if msg.Envelope != nil { confParams[config.UI_CONTEXT_SUBJECT] = msg.Envelope.Subject @@ -288,7 +291,7 @@ func (ml *MessageList) MouseEvent(localX int, localY int, event tcell.Event) { if ok { ml.Select(selectedMsg) acct := ml.aerc.SelectedAccount() - if acct.Messages().Empty() { + if acct == nil || acct.Messages().Empty() { return } store := acct.Messages().Store() @@ -433,7 +436,7 @@ func (ml *MessageList) ensureScroll() { } func (ml *MessageList) drawEmptyMessage(ctx *ui.Context) { - uiConfig := ml.aerc.SelectedAccount().UiConfig() + uiConfig := ml.aerc.SelectedAccountUiConfig() msg := uiConfig.EmptyMessage ctx.Printf((ctx.Width()/2)-(len(msg)/2), 0, uiConfig.GetStyle(config.STYLE_MSGLIST_DEFAULT), "%s", msg)