aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/aerc.conf.in11
-rw-r--r--config/config.go63
-rw-r--r--config/default_styleset33
-rw-r--r--config/style.go372
4 files changed, 6 insertions, 473 deletions
diff --git a/config/aerc.conf.in b/config/aerc.conf.in
index b9381a8b..3348efac 100644
--- a/config/aerc.conf.in
+++ b/config/aerc.conf.in
@@ -67,17 +67,6 @@ sort=
# Default: true
next-message-on-delete=true
-# The directories where the stylesets are stored. It takes a colon-separated
-# list of directories.
-#
-# default: @SHAREDIR@/stylesets/
-stylesets-dirs=@SHAREDIR@/stylesets/
-
-# Sets the styleset to use for the aerc ui elements.
-#
-# Default: default
-styleset-name=default
-
[viewer]
#
# Specifies the pager to use when displaying emails. Note that some filters
diff --git a/config/config.go b/config/config.go
index c4307241..8ebd69d3 100644
--- a/config/config.go
+++ b/config/config.go
@@ -45,9 +45,6 @@ type UIConfig struct {
NextMessageOnDelete bool `ini:"next-message-on-delete"`
CompletionDelay time.Duration `ini:"completion-delay"`
CompletionPopovers bool `ini:"completion-popovers"`
- StyleSetDirs []string `ini:"stylesets-dirs", delim:":"`
- StyleSetName string `ini:"styleset-name"`
- style StyleSet
}
type ContextType int
@@ -335,11 +332,6 @@ func (config *AercConfig) LoadConfig(file *ini.File) error {
if err := ui.MapTo(&config.Ui); err != nil {
return err
}
-
- stylesetsDirs := ui.Key("stylesets-dirs").String()
- if stylesetsDirs != "" {
- config.Ui.StyleSetDirs = strings.Split(stylesetsDirs, ":")
- }
}
for _, sectionName := range file.SectionStrings() {
if !strings.Contains(sectionName, "ui:") {
@@ -354,10 +346,6 @@ func (config *AercConfig) LoadConfig(file *ini.File) error {
if err := uiSection.MapTo(&uiSubConfig); err != nil {
return err
}
- stylesetsDirs := uiSection.Key("stylesets-dirs").String()
- if stylesetsDirs != "" {
- uiSubConfig.StyleSetDirs = strings.Split(stylesetsDirs, ":")
- }
contextualUi :=
UIConfigContext{
UiConfig: uiSubConfig,
@@ -418,19 +406,6 @@ func (config *AercConfig) LoadConfig(file *ini.File) error {
}
}
}
-
- if err := config.Ui.loadStyleSet(
- config.Ui.StyleSetDirs); err != nil {
- return err
- }
-
- for idx, _ := range config.ContextualUis {
- if err := config.ContextualUis[idx].UiConfig.loadStyleSet(
- config.Ui.StyleSetDirs); err != nil {
- return err
- }
- }
-
return nil
}
@@ -491,8 +466,6 @@ func LoadConfigFromFile(root *string, sharedir string) (*AercConfig, error) {
NextMessageOnDelete: true,
CompletionDelay: 250 * time.Millisecond,
CompletionPopovers: true,
- StyleSetDirs: []string{path.Join(sharedir, "stylesets")},
- StyleSetName: "default",
},
ContextualUis: []UIConfigContext{},
@@ -522,7 +495,6 @@ func LoadConfigFromFile(root *string, sharedir string) (*AercConfig, error) {
Forwards: "forward_as_body",
},
}
-
// These bindings are not configurable
config.Bindings.AccountWizard.ExKey = KeyStroke{
Key: tcell.KeyCtrlE,
@@ -533,7 +505,6 @@ func LoadConfigFromFile(root *string, sharedir string) (*AercConfig, error) {
if err = config.LoadConfig(file); err != nil {
return nil, err
}
-
if ui, err := file.GetSection("general"); err == nil {
if err := ui.MapTo(&config.General); err != nil {
return nil, err
@@ -641,17 +612,8 @@ func parseLayout(layout string) [][]string {
return l
}
-func (ui *UIConfig) loadStyleSet(styleSetDirs []string) error {
- ui.style = NewStyleSet()
- if err := ui.style.ParseStyleSet(ui.StyleSetName, styleSetDirs); err != nil {
- return fmt.Errorf("Error whie parsing styleset \"%s\": %s", ui.StyleSetName, err)
- }
-
- return nil
-}
-
-func (config AercConfig) mergeContextualUi(baseUi UIConfig,
- contextType ContextType, s string) UIConfig {
+func (config *AercConfig) mergeContextualUi(baseUi *UIConfig,
+ contextType ContextType, s string) {
for _, contextualUi := range config.ContextualUis {
if contextualUi.ContextType != contextType {
continue
@@ -661,30 +623,17 @@ func (config AercConfig) mergeContextualUi(baseUi UIConfig,
continue
}
- mergo.Merge(&baseUi, contextualUi.UiConfig, mergo.WithOverride)
- if contextualUi.UiConfig.StyleSetName != "" {
- baseUi.style = contextualUi.UiConfig.style
- }
- return baseUi
+ mergo.MergeWithOverwrite(baseUi, contextualUi.UiConfig)
+ return
}
-
- return baseUi
}
-func (config AercConfig) GetUiConfig(params map[ContextType]string) UIConfig {
+func (config *AercConfig) GetUiConfig(params map[ContextType]string) UIConfig {
baseUi := config.Ui
for k, v := range params {
- baseUi = config.mergeContextualUi(baseUi, k, v)
+ config.mergeContextualUi(&baseUi, k, v)
}
return baseUi
}
-
-func (uiConfig UIConfig) GetStyle(so StyleObject) tcell.Style {
- return uiConfig.style.Get(so)
-}
-
-func (uiConfig UIConfig) GetStyleSelected(so StyleObject) tcell.Style {
- return uiConfig.style.Selected(so)
-}
diff --git a/config/default_styleset b/config/default_styleset
deleted file mode 100644
index 9e918aeb..00000000
--- a/config/default_styleset
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# aerc default styleset
-#
-# This styleset uses the terminal defaults as its base.
-# More information on how to configure the styleset can be found in
-# the *aerc-styleset.7* manpage. Please read the manual before
-# modifying or creating a styleset.
-
-*.default=true
-*.selected.reverse=toggle
-
-title.reverse=true
-header.bold=true
-
-error.fg=red
-warning.fg=yellow
-*error.bold=true
-success.fg=green
-
-statusline*.default=true
-statusline_default.reverse=true
-statusline_error.fg=red
-statusline_success.fg=green
-
-msglist_unread.bold=true
-
-completion_pill.reverse=true
-
-tab.reverse=true
-border.reverse = true
-
-selecter_focused.reverse=true
-selecter_chooser.bold=true
diff --git a/config/style.go b/config/style.go
deleted file mode 100644
index fb17d93f..00000000
--- a/config/style.go
+++ /dev/null
@@ -1,372 +0,0 @@
-package config
-
-import (
- "errors"
- "os"
- "path"
- "regexp"
- "strings"
-
- "github.com/gdamore/tcell"
- "github.com/go-ini/ini"
- "github.com/mitchellh/go-homedir"
-)
-
-type StyleObject int32
-
-const (
- STYLE_DEFAULT StyleObject = iota
- STYLE_ERROR
- STYLE_WARNING
- STYLE_SUCCESS
-
- STYLE_TITLE
- STYLE_HEADER
-
- STYLE_STATUSLINE_DEFAULT
- STYLE_STATUSLINE_ERROR
- STYLE_STATUSLINE_SUCCESS
-
- STYLE_MSGLIST_DEFAULT
- STYLE_MSGLIST_UNREAD
- STYLE_MSGLIST_READ
- STYLE_MSGLIST_DELETED
- STYLE_MSGLIST_MARKED
- STYLE_MSGLIST_FLAGGED
-
- STYLE_DIRLIST_DEFAULT
-
- STYLE_COMPLETION_DEFAULT
- STYLE_COMPLETION_GUTTER
- STYLE_COMPLETION_PILL
-
- STYLE_TAB
- STYLE_STACK
- STYLE_SPINNER
- STYLE_BORDER
-
- STYLE_SELECTER_DEFAULT
- STYLE_SELECTER_FOCUSED
- STYLE_SELECTER_CHOOSER
-)
-
-var StyleNames = map[string]StyleObject{
- "default": STYLE_DEFAULT,
- "error": STYLE_ERROR,
- "warning": STYLE_WARNING,
- "success": STYLE_SUCCESS,
-
- "title": STYLE_TITLE,
- "header": STYLE_HEADER,
-
- "statusline_default": STYLE_STATUSLINE_DEFAULT,
- "statusline_error": STYLE_STATUSLINE_ERROR,
- "statusline_success": STYLE_STATUSLINE_SUCCESS,
-
- "msglist_default": STYLE_MSGLIST_DEFAULT,
- "msglist_unread": STYLE_MSGLIST_UNREAD,
- "msglist_read": STYLE_MSGLIST_READ,
- "msglist_deleted": STYLE_MSGLIST_DELETED,
- "msglist_marked": STYLE_MSGLIST_MARKED,
- "msglist_flagged": STYLE_MSGLIST_FLAGGED,
-
- "dirlist_default": STYLE_DIRLIST_DEFAULT,
-
- "completion_default": STYLE_COMPLETION_DEFAULT,
- "completion_gutter": STYLE_COMPLETION_GUTTER,
- "completion_pill": STYLE_COMPLETION_PILL,
-
- "tab": STYLE_TAB,
- "stack": STYLE_STACK,
- "spinner": STYLE_SPINNER,
- "border": STYLE_BORDER,
-
- "selecter_default": STYLE_SELECTER_DEFAULT,
- "selecter_focused": STYLE_SELECTER_FOCUSED,
- "selecter_chooser": STYLE_SELECTER_CHOOSER,
-}
-
-type Style struct {
- Fg tcell.Color
- Bg tcell.Color
- Bold bool
- Blink bool
- Underline bool
- Reverse bool
-}
-
-func (s Style) Get() tcell.Style {
- return tcell.StyleDefault.
- Foreground(s.Fg).
- Background(s.Bg).
- Bold(s.Bold).
- Blink(s.Blink).
- Underline(s.Blink).
- Reverse(s.Reverse)
-}
-
-func (s *Style) Normal() {
- s.Bold = false
- s.Blink = false
- s.Underline = false
- s.Reverse = false
-}
-
-func (s *Style) Default() *Style {
- s.Fg = tcell.ColorDefault
- s.Bg = tcell.ColorDefault
- return s
-}
-
-func (s *Style) Reset() *Style {
- s.Default()
- s.Normal()
- return s
-}
-
-func boolSwitch(val string, cur_val bool) (bool, error) {
- switch val {
- case "true":
- return true, nil
- case "false":
- return false, nil
- case "toggle":
- return !cur_val, nil
- default:
- return cur_val, errors.New(
- "Bool Switch attribute must be true, false, or toggle")
- }
-}
-
-func (s *Style) Set(attr, val string) error {
- switch attr {
- case "fg":
- s.Fg = tcell.GetColor(val)
- case "bg":
- s.Bg = tcell.GetColor(val)
- case "bold":
- if state, err := boolSwitch(val, s.Bold); err != nil {
- return err
- } else {
- s.Bold = state
- }
- case "blink":
- if state, err := boolSwitch(val, s.Blink); err != nil {
- return err
- } else {
- s.Blink = state
- }
- case "underline":
- if state, err := boolSwitch(val, s.Underline); err != nil {
- return err
- } else {
- s.Underline = state
- }
- case "reverse":
- if state, err := boolSwitch(val, s.Reverse); err != nil {
- return err
- } else {
- s.Reverse = state
- }
- case "default":
- s.Default()
- case "normal":
- s.Normal()
- default:
- return errors.New("Unknown style attribute: " + attr)
- }
-
- return nil
-}
-
-type StyleSet struct {
- objects map[StyleObject]*Style
- selected map[StyleObject]*Style
-}
-
-func NewStyleSet() StyleSet {
- ss := StyleSet{
- objects: make(map[StyleObject]*Style),
- selected: make(map[StyleObject]*Style),
- }
- for _, so := range StyleNames {
- ss.objects[so] = new(Style)
- ss.selected[so] = new(Style)
- }
-
- return ss
-}
-
-func (ss StyleSet) reset() {
- for _, so := range StyleNames {
- ss.objects[so].Reset()
- ss.selected[so].Reset()
- }
-}
-
-func (ss StyleSet) Get(so StyleObject) tcell.Style {
- return ss.objects[so].Get()
-}
-
-func (ss StyleSet) Selected(so StyleObject) tcell.Style {
- return ss.selected[so].Get()
-}
-
-func findStyleSet(stylesetName string, stylesetsDir []string) (string, error) {
- for _, dir := range stylesetsDir {
- stylesetPath, err := homedir.Expand(path.Join(dir, stylesetName))
- if err != nil {
- return "", err
- }
-
- if _, err := os.Stat(stylesetPath); os.IsNotExist(err) {
- continue
- }
-
- return stylesetPath, nil
- }
-
- return "", errors.New("Can't find styleset - " + stylesetName)
-}
-func (ss *StyleSet) ParseStyleSet(stylesetName string, stylesetDirs []string) error {
- filepath, err := findStyleSet(stylesetName, stylesetDirs)
- if err != nil {
- return err
- }
-
- file, err := ini.Load(filepath)
- if err != nil {
- return err
- }
-
- ss.reset()
-
- defaultSection, err := file.GetSection(ini.DefaultSection)
- if err != nil {
- return err
- }
-
- selectedKeys := []string{}
-
- for _, key := range defaultSection.KeyStrings() {
- tokens := strings.Split(key, ".")
- var styleName, attr string
- switch len(tokens) {
- case 2:
- styleName, attr = tokens[0], tokens[1]
- case 3:
- if tokens[1] != "selected" {
- return errors.New("Unknown modifier: " + tokens[1])
- }
- selectedKeys = append(selectedKeys, key)
- continue
- default:
- return errors.New("Style parsing error: " + key)
- }
- val := defaultSection.KeysHash()[key]
-
- if strings.ContainsAny(styleName, "*?") {
- regex := fnmatchToRegex(styleName)
- for sn, so := range StyleNames {
- matched, err := regexp.MatchString(regex, sn)
- if err != nil {
- return err
- }
-
- if !matched {
- continue
- }
-
- if err := ss.objects[so].Set(attr, val); err != nil {
- return err
- }
- if err := ss.selected[so].Set(attr, val); err != nil {
- return err
- }
- }
- } else {
- so, ok := StyleNames[styleName]
- if !ok {
- return errors.New("Unknown style object: " + styleName)
- }
- if err := ss.objects[so].Set(attr, val); err != nil {
- return err
- }
- if err := ss.selected[so].Set(attr, val); err != nil {
- return err
- }
- }
- }
-
- for _, key := range selectedKeys {
- tokens := strings.Split(key, ".")
- styleName, modifier, attr := tokens[0], tokens[1], tokens[2]
- if modifier != "selected" {
- return errors.New("Unknown modifier: " + modifier)
- }
-
- val := defaultSection.KeysHash()[key]
-
- if strings.ContainsAny(styleName, "*?") {
- regex := fnmatchToRegex(styleName)
- for sn, so := range StyleNames {
- matched, err := regexp.MatchString(regex, sn)
- if err != nil {
- return err
- }
-
- if !matched {
- continue
- }
-
- if err := ss.selected[so].Set(attr, val); err != nil {
- return err
- }
- }
- } else {
- so, ok := StyleNames[styleName]
- if !ok {
- return errors.New("Unknown style object: " + styleName)
- }
- if err := ss.selected[so].Set(attr, val); err != nil {
- return err
- }
- }
- }
-
- for _, key := range defaultSection.KeyStrings() {
- tokens := strings.Split(key, ".")
- styleName, attr := tokens[0], tokens[1]
- val := defaultSection.KeysHash()[key]
-
- if styleName != "selected" {
- continue
- }
-
- for _, so := range StyleNames {
- if err := ss.selected[so].Set(attr, val); err != nil {
- return err
- }
- }
- }
-
- return nil
-}
-
-func fnmatchToRegex(pattern string) string {
- n := len(pattern)
- var regex strings.Builder
-
- for i := 0; i < n; i++ {
- switch pattern[i] {
- case '*':
- regex.WriteString(".*")
- case '?':
- regex.WriteByte('.')
- default:
- regex.WriteByte(pattern[i])
- }
- }
-
- return regex.String()
-}