mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-18 22:44:50 +02:00
diff kitten: Automatically change colors on terminal color scheme change
This commit is contained in:
@@ -118,6 +118,9 @@ type Loop struct {
|
||||
|
||||
// Called when capabilities response is received
|
||||
OnCapabilitiesReceived func(TerminalCapabilities) error
|
||||
|
||||
// Called when the terminal's color scheme changes
|
||||
OnColorSchemeChange func(ColorPreference) error
|
||||
}
|
||||
|
||||
func New(options ...func(self *Loop)) (*Loop, error) {
|
||||
@@ -203,6 +206,15 @@ func NoRestoreColors(self *Loop) {
|
||||
self.terminal_options.restore_colors = false
|
||||
}
|
||||
|
||||
func (self *Loop) ColorSchemeChangeNotifications() *Loop {
|
||||
self.terminal_options.color_scheme_change_notification = true
|
||||
return self
|
||||
}
|
||||
|
||||
func ColorSchemeChangeNotifications(self *Loop) {
|
||||
self.terminal_options.color_scheme_change_notification = true
|
||||
}
|
||||
|
||||
func NoInBandResizeNotifications(self *Loop) {
|
||||
self.terminal_options.in_band_resize_notification = false
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ func new_loop() *Loop {
|
||||
l.terminal_options.Alternate_screen = true
|
||||
l.terminal_options.restore_colors = true
|
||||
l.terminal_options.in_band_resize_notification = true
|
||||
l.terminal_options.color_scheme_change_notification = false
|
||||
l.terminal_options.kitty_keyboard_mode = DISAMBIGUATE_KEYS | REPORT_ALTERNATE_KEYS | REPORT_ALL_KEYS_AS_ESCAPE_CODES | REPORT_TEXT_WITH_KEYS
|
||||
l.escape_code_parser.HandleCSI = l.handle_csi
|
||||
l.escape_code_parser.HandleOSC = l.handle_osc
|
||||
@@ -144,6 +145,17 @@ func (self *Loop) handle_csi(raw []byte) (err error) {
|
||||
self.TerminalCapabilities.KeyboardProtocol = true
|
||||
self.TerminalCapabilities.KeyboardProtocolResponseReceived = true
|
||||
}
|
||||
} else if self.terminal_options.color_scheme_change_notification && strings.HasPrefix(csi, "?997;") && strings.HasSuffix(csi, "n") {
|
||||
switch csi[len(csi)-2] {
|
||||
case '1':
|
||||
self.TerminalCapabilities.ColorPreference = DARK_COLOR_PREFERENCE
|
||||
case '2':
|
||||
self.TerminalCapabilities.ColorPreference = LIGHT_COLOR_PREFERENCE
|
||||
}
|
||||
self.TerminalCapabilities.ColorPreferenceResponseReceived = true
|
||||
if self.OnColorSchemeChange != nil {
|
||||
return self.OnColorSchemeChange(self.TerminalCapabilities.ColorPreference)
|
||||
}
|
||||
}
|
||||
if self.OnEscapeCode != nil {
|
||||
return self.OnEscapeCode(CSI, raw)
|
||||
|
||||
@@ -46,27 +46,28 @@ type Mode uint32
|
||||
const private Mode = 1 << 31
|
||||
|
||||
const (
|
||||
LNM Mode = 20
|
||||
IRM Mode = 4
|
||||
DECKM Mode = 1 | private
|
||||
DECSCNM Mode = 5 | private
|
||||
DECOM Mode = 6 | private
|
||||
DECAWM Mode = 7 | private
|
||||
DECARM Mode = 8 | private
|
||||
DECTCEM Mode = 25 | private
|
||||
MOUSE_BUTTON_TRACKING Mode = 1000 | private
|
||||
MOUSE_MOTION_TRACKING Mode = 1002 | private
|
||||
MOUSE_MOVE_TRACKING Mode = 1003 | private
|
||||
FOCUS_TRACKING Mode = 1004 | private
|
||||
MOUSE_UTF8_MODE Mode = 1005 | private
|
||||
MOUSE_SGR_MODE Mode = 1006 | private
|
||||
MOUSE_URXVT_MODE Mode = 1015 | private
|
||||
MOUSE_SGR_PIXEL_MODE Mode = 1016 | private
|
||||
ALTERNATE_SCREEN Mode = 1049 | private
|
||||
BRACKETED_PASTE Mode = 2004 | private
|
||||
PENDING_UPDATE Mode = 2026 | private
|
||||
INBAND_RESIZE_NOTIFICATION Mode = 2048 | private
|
||||
HANDLE_TERMIOS_SIGNALS Mode = kitty.HandleTermiosSignals | private
|
||||
LNM Mode = 20
|
||||
IRM Mode = 4
|
||||
DECKM Mode = 1 | private
|
||||
DECSCNM Mode = 5 | private
|
||||
DECOM Mode = 6 | private
|
||||
DECAWM Mode = 7 | private
|
||||
DECARM Mode = 8 | private
|
||||
DECTCEM Mode = 25 | private
|
||||
MOUSE_BUTTON_TRACKING Mode = 1000 | private
|
||||
MOUSE_MOTION_TRACKING Mode = 1002 | private
|
||||
MOUSE_MOVE_TRACKING Mode = 1003 | private
|
||||
FOCUS_TRACKING Mode = 1004 | private
|
||||
MOUSE_UTF8_MODE Mode = 1005 | private
|
||||
MOUSE_SGR_MODE Mode = 1006 | private
|
||||
MOUSE_URXVT_MODE Mode = 1015 | private
|
||||
MOUSE_SGR_PIXEL_MODE Mode = 1016 | private
|
||||
ALTERNATE_SCREEN Mode = 1049 | private
|
||||
BRACKETED_PASTE Mode = 2004 | private
|
||||
PENDING_UPDATE Mode = 2026 | private
|
||||
COLOR_SCHEME_CHANGE_NOTIFICATION Mode = 2031 | private
|
||||
INBAND_RESIZE_NOTIFICATION Mode = 2048 | private
|
||||
HANDLE_TERMIOS_SIGNALS Mode = kitty.HandleTermiosSignals | private
|
||||
)
|
||||
|
||||
func (self Mode) escape_code(which string) string {
|
||||
@@ -101,6 +102,7 @@ type TerminalStateOptions struct {
|
||||
mouse_tracking MouseTracking
|
||||
kitty_keyboard_mode KeyboardStateBits
|
||||
in_band_resize_notification bool
|
||||
color_scheme_change_notification bool
|
||||
}
|
||||
|
||||
func set_modes(sb *strings.Builder, modes ...Mode) {
|
||||
@@ -133,6 +135,9 @@ func (self *TerminalStateOptions) SetStateEscapeCodes() string {
|
||||
if self.in_band_resize_notification {
|
||||
set_modes(&sb, INBAND_RESIZE_NOTIFICATION)
|
||||
}
|
||||
if self.color_scheme_change_notification {
|
||||
set_modes(&sb, COLOR_SCHEME_CHANGE_NOTIFICATION)
|
||||
}
|
||||
if self.Alternate_screen {
|
||||
set_modes(&sb, ALTERNATE_SCREEN)
|
||||
sb.WriteString(CLEAR_SCREEN)
|
||||
|
||||
@@ -22,6 +22,12 @@ func NewLRUCache[K comparable, V any](max_size int) *LRUCache[K, V] {
|
||||
return &ans
|
||||
}
|
||||
|
||||
func (self *LRUCache[K, V]) Clear() {
|
||||
self.lock.RLock()
|
||||
clear(self.data)
|
||||
self.lock.Unlock()
|
||||
}
|
||||
|
||||
func (self *LRUCache[K, V]) Get(key K) (ans V, found bool) {
|
||||
self.lock.RLock()
|
||||
ans, found = self.data[key]
|
||||
|
||||
Reference in New Issue
Block a user