about summary refs log tree commit diff stats
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 b9381a8..3348efa 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 c430724..8ebd69d 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 9e918ae..0000000
--- 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 fb17d93..0000000
--- 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()
-}