~delthas/senpai-dev

senpai: add "self" and "others" colors v1 SUPERSEDED

Vlad-Stefan Harbuz: 1
 add "self" and "others" colors

 5 files changed, 33 insertions(+), 13 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~delthas/senpai-dev/patches/45435/mbox | git am -3
Learn more about email & git

[PATCH senpai] add "self" and "others" colors Export this patch

This allows users to decide how their own nick, and how others' nicks,
should be colored, by setting an appropriate color in the config. If
these colors are set, they will be used instead of the colors generated
from the color scheme. This is nice for users who prefer not to use the
hash-based colors, for example to avoid confusing color collisions.

Signed-off-by: Vlad-Stefan Harbuz <vlad@vladh.net>
---
 app.go           | 12 +++++++-----
 config.go        |  6 ++++++
 doc/senpai.5.scd |  4 ++++
 ui/colors.go     | 14 ++++++++++----
 ui/ui.go         | 10 ++++++----
 5 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/app.go b/app.go
index 509a518..0fed149 100644
--- a/app.go
+++ b/app.go
@@ -253,12 +253,14 @@ func (app *App) eventLoop() {
			app.updatePrompt()
			app.setBufferNumbers()
			var currentMembers []irc.Member
			selfNick := ""
			netID, buffer := app.win.CurrentBuffer()
			s := app.sessions[netID]
			if s != nil && buffer != "" {
				currentMembers = s.Names(buffer)
				selfNick = s.Nick()
			}
			app.win.Draw(currentMembers)
			app.win.Draw(currentMembers, selfNick)
			if netID != "" && buffer != "" {
				app.win.SetTitle(fmt.Sprintf("%s — senpai", buffer))
			} else {
@@ -1390,19 +1392,19 @@ func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer strin
	if isAction || isNotice {
		head = "*"
	} else {
		headColor = ui.IdentColor(app.cfg.Colors.Nicks, head)
		headColor = ui.IdentColor(app.cfg.Colors, head, head == s.Nick())
	}

	var body ui.StyledStringBuilder
	if isNotice {
		color := ui.IdentColor(app.cfg.Colors.Nicks, ev.User)
		color := ui.IdentColor(app.cfg.Colors, ev.User, ev.User == s.Nick())
		body.SetStyle(tcell.StyleDefault.Foreground(color))
		body.WriteString(ev.User)
		body.SetStyle(tcell.StyleDefault)
		body.WriteString(": ")
		body.WriteStyledString(ui.IRCString(content))
	} else if isAction {
		color := ui.IdentColor(app.cfg.Colors.Nicks, ev.User)
		color := ui.IdentColor(app.cfg.Colors, ev.User, ev.User == s.Nick())
		body.SetStyle(tcell.StyleDefault.Foreground(color))
		body.WriteString(ev.User)
		body.SetStyle(tcell.StyleDefault)
@@ -1544,7 +1546,7 @@ func (app *App) updatePrompt() {
				Foreground(tcell.ColorRed),
		)
	} else {
		prompt = ui.IdentString(app.cfg.Colors.Nicks, s.Nick())
		prompt = ui.IdentString(app.cfg.Colors, s.Nick(), true)
	}
	app.win.SetPrompt(prompt)
}
diff --git a/config.go b/config.go
index d9bfe33..9f0f044 100644
--- a/config.go
+++ b/config.go
@@ -111,6 +111,8 @@ func Defaults() Config {
			Status: tcell.ColorGray,
			Prompt: tcell.ColorDefault,
			Unread: tcell.ColorDefault,
			Self:   tcell.ColorDefault,
			Others: tcell.ColorDefault,
			Nicks:  ui.ColorSchemeBase,
		},
		Debug: false,
@@ -361,6 +363,10 @@ func unmarshal(filename string, cfg *Config) (err error) {
					cfg.Colors.Unread = color
				case "status":
					cfg.Colors.Status = color
				case "self":
					cfg.Colors.Self = color
				case "others":
					cfg.Colors.Others = color
				default:
					return fmt.Errorf("unknown colors directive %q", child.Name)
				}
diff --git a/doc/senpai.5.scd b/doc/senpai.5.scd
index 198157c..e233b9b 100644
--- a/doc/senpai.5.scd
+++ b/doc/senpai.5.scd
@@ -172,6 +172,10 @@ colors {
:< *Description*
|  prompt
:  color for ">"-prompt that appears in command mode
|  self
:  foreground color for one's own nick. overrides color from "nicks" if set.
|  others
:  foreground color for others' nicks. overrides color from "nicks" if set.
|  unread
:  foreground color for unread buffer names in buffer lists
|  status
diff --git a/ui/colors.go b/ui/colors.go
index f9b4f3f..754ae36 100644
--- a/ui/colors.go
+++ b/ui/colors.go
@@ -65,15 +65,21 @@ var colors = map[ColorScheme][]tcell.Color{
	},
}

func IdentColor(scheme ColorScheme, ident string) tcell.Color {
func IdentColor(configColors ConfigColors, ident string, isSelf bool) tcell.Color {
	if isSelf && configColors.Self != tcell.ColorDefault {
		return configColors.Self
	}
	if configColors.Others != tcell.ColorDefault {
		return configColors.Others
	}
	h := fnv.New32()
	_, _ = h.Write([]byte(ident))
	c := colors[scheme]
	c := colors[configColors.Nicks]
	return c[int(h.Sum32()%uint32(len(c)))]
}

func IdentString(scheme ColorScheme, ident string) StyledString {
	color := IdentColor(scheme, ident)
func IdentString(configColors ConfigColors, ident string, isSelf bool) StyledString {
	color := IdentColor(configColors, ident, isSelf)
	style := tcell.StyleDefault.Foreground(color)
	return Styled(ident, style)
}
diff --git a/ui/ui.go b/ui/ui.go
index fa72fb0..cbadf3e 100644
--- a/ui/ui.go
+++ b/ui/ui.go
@@ -27,6 +27,8 @@ type ConfigColors struct {
	Status tcell.Color
	Prompt tcell.Color
	Unread tcell.Color
	Self   tcell.Color
	Others tcell.Color
	Nicks  ColorScheme
}

@@ -467,7 +469,7 @@ func (ui *UI) Notify(title string, body string) {
	ui.screen.Notify(title, body)
}

func (ui *UI) Draw(members []irc.Member) {
func (ui *UI) Draw(members []irc.Member, selfNick string) {
	w, h := ui.screen.Size()

	if ui.channelWidth == 0 {
@@ -483,7 +485,7 @@ func (ui *UI) Draw(members []irc.Member) {
		ui.bs.DrawVerticalBufferList(ui.screen, 0, 0, ui.channelWidth, h, &ui.channelOffset)
	}
	if ui.memberWidth != 0 {
		ui.drawVerticalMemberList(ui.screen, w-ui.memberWidth, 0, ui.memberWidth, h, members, &ui.memberOffset)
		ui.drawVerticalMemberList(ui.screen, w-ui.memberWidth, 0, ui.memberWidth, h, members, &ui.memberOffset, selfNick)
	}
	if ui.channelWidth == 0 {
		ui.drawStatusBar(ui.channelWidth, h-3, w-ui.memberWidth)
@@ -544,7 +546,7 @@ func (ui *UI) drawStatusBar(x0, y, width int) {
	printString(ui.screen, &x, y, s.StyledString())
}

func (ui *UI) drawVerticalMemberList(screen tcell.Screen, x0, y0, width, height int, members []irc.Member, offset *int) {
func (ui *UI) drawVerticalMemberList(screen tcell.Screen, x0, y0, width, height int, members []irc.Member, offset *int, selfNick string) {
	if y0+len(members)-*offset < height {
		*offset = y0 + len(members) - height
		if *offset < 0 {
@@ -609,7 +611,7 @@ func (ui *UI) drawVerticalMemberList(screen tcell.Screen, x0, y0, width, height
		if m.Away {
			name = Styled(nameText, tcell.StyleDefault.Foreground(tcell.ColorGray).Reverse(reverse))
		} else {
			color := IdentColor(ui.config.Colors.Nicks, m.Name.Name)
			color := IdentColor(ui.config.Colors, m.Name.Name, m.Name.Name == selfNick)
			name = Styled(nameText, tcell.StyleDefault.Foreground(color).Reverse(reverse))
		}

-- 
2.42.0
Hi,

Thanks for your patch!

I'm sorry, I actually reimplemented this when looking at the feature 
request, and ended up not using this patch. :-P

I went for a slightly different configuration option:

     colors { nicks fixed [<others> [self]] }

See: 
https://git.sr.ht/~taiite/senpai/commit/1836d500d39a65d18729c93396ac119281f9dc74