diff --git a/ui/room-view.go b/ui/room-view.go index 73693eb..bcad2b6 100644 --- a/ui/room-view.go +++ b/ui/room-view.go @@ -908,6 +908,7 @@ func (view *RoomView) UpdateUserList() { func (view *RoomView) AddServiceMessage(text string) { view.content.AddMessage(messages.NewServiceMessage(text), AppendMessage) + go view.parent.FlashLED(0x00, 0xFF, 0x00) } func (view *RoomView) parseEvent(evt *muksevt.Event) *messages.UIMessage { @@ -923,6 +924,7 @@ func (view *RoomView) AddHistoryEvent(evt *muksevt.Event) { func (view *RoomView) AddEvent(evt *muksevt.Event) ifc.Message { if msg := view.parseEvent(evt); msg != nil { view.content.AddMessage(msg, AppendMessage) + go view.parent.FlashLED(0xFF, 0xFF, 0xFF) return msg } return nil @@ -930,17 +932,20 @@ func (view *RoomView) AddEvent(evt *muksevt.Event) ifc.Message { func (view *RoomView) AddRedaction(redactedEvt *muksevt.Event) { view.AddEvent(redactedEvt) + go view.parent.FlashLED(0xFF, 0x00, 0x00) } func (view *RoomView) AddEdit(evt *muksevt.Event) { if msg := view.parseEvent(evt); msg != nil { view.content.AddMessage(msg, IgnoreMessage) + go view.parent.FlashLED(0xFF, 0xFF, 0x00) } } func (view *RoomView) AddReaction(evt *muksevt.Event, key string) { msgView := view.MessageView() msg := msgView.getMessageByID(evt.ID) + go view.parent.FlashLED(0xFF, 0x00, 0xFF) if msg == nil { // Message not in view, nothing to do return diff --git a/ui/view-main.go b/ui/view-main.go index e7daa10..32e59e4 100644 --- a/ui/view-main.go +++ b/ui/view-main.go @@ -36,6 +36,7 @@ import ( ifc "maunium.net/go/gomuks/interface" "maunium.net/go/gomuks/lib/notification" "maunium.net/go/gomuks/matrix/rooms" + "maunium.net/go/gomuks/ui/beepberry" "maunium.net/go/gomuks/ui/messages" "maunium.net/go/gomuks/ui/widget" ) @@ -56,6 +57,9 @@ type MainView struct { lastFocusTime time.Time + led *beepberry.LED + ledLock sync.RWMutex + matrix ifc.MatrixContainer gmx ifc.Gomuks config *config.Config @@ -77,6 +81,10 @@ func (ui *GomuksUI) NewMainView() mauview.Component { mainView.rosterView = NewRosterView(mainView) mainView.cmdProcessor = NewCommandProcessor(mainView) + if led, err := beepberry.NewLED(); err == nil { + mainView.led = led + } + mainView.flex. AddFixedComponent(mainView.roomList, 25). AddFixedComponent(widget.NewBorder(), 1). @@ -92,6 +100,21 @@ func (view *MainView) CmdProcessor() *CommandProcessor { return view.cmdProcessor } +func (view *MainView) FlashLED(r, g, b uint16) { + if view.led == nil { + return + } + + view.ledLock.Lock() + defer view.ledLock.Unlock() + + view.led.SetColor(r, g, b) + view.led.On() + time.Sleep(time.Second) + view.led.Off() + view.led.SetColor(0xFF, 0xFF, 0xFF) +} + func (view *MainView) ShowModal(modal mauview.Component) { view.modal = modal var ok bool