Inactive cursors - multiple positions.

This commit is contained in:
Miroslav Šedivý 2021-11-12 15:27:05 +00:00
parent 8dbe0d1d2d
commit 097e8d2a87
4 changed files with 26 additions and 22 deletions

View File

@ -19,7 +19,7 @@ func New(config *config.Session) *SessionManagerCtx {
config: config,
tokens: make(map[string]string),
sessions: make(map[string]*SessionCtx),
cursors: make(map[types.Session]types.Cursor),
cursors: make(map[types.Session][]types.Cursor),
emmiter: events.New(),
}
@ -56,7 +56,7 @@ type SessionManagerCtx struct {
host types.Session
hostMu sync.Mutex
cursors map[types.Session]types.Cursor
cursors map[types.Session][]types.Cursor
cursorsMu sync.Mutex
emmiter events.EventEmmiter
@ -205,15 +205,21 @@ func (manager *SessionManagerCtx) SetCursor(cursor types.Cursor, session types.S
manager.cursorsMu.Lock()
defer manager.cursorsMu.Unlock()
manager.cursors[session] = cursor
list, ok := manager.cursors[session]
if !ok {
list = []types.Cursor{}
}
func (manager *SessionManagerCtx) PopCursors() map[types.Session]types.Cursor {
list = append(list, cursor)
manager.cursors[session] = list
}
func (manager *SessionManagerCtx) PopCursors() map[types.Session][]types.Cursor {
manager.cursorsMu.Lock()
defer manager.cursorsMu.Unlock()
cursors := manager.cursors
manager.cursors = make(map[types.Session]types.Cursor)
manager.cursors = make(map[types.Session][]types.Cursor)
return cursors
}

View File

@ -88,10 +88,9 @@ type SessionData struct {
State types.SessionState `json:"state"`
}
type SessionCursor struct {
type SessionCursors struct {
ID string `json:"id"`
X uint16 `json:"x"`
Y uint16 `json:"y"`
Cursors []types.Cursor `json:"cursors"`
}
/////////////////////////////

View File

@ -13,8 +13,8 @@ var (
)
type Cursor struct {
X int
Y int
X int `json:"x"`
Y int `json:"y"`
}
type SessionState struct {
@ -56,7 +56,7 @@ type SessionManager interface {
ClearHost()
SetCursor(cursor Cursor, session Session)
PopCursors() map[Session]Cursor
PopCursors() map[Session][]Cursor
Broadcast(event string, payload interface{}, exclude interface{})
AdminBroadcast(event string, payload interface{}, exclude interface{})

View File

@ -21,7 +21,7 @@ import (
const pingPeriod = 10 * time.Second
// period for sending inactive cursor messages
const inactiveCursorsPeriod = 500 * time.Millisecond
const inactiveCursorsPeriod = 750 * time.Millisecond
func New(
sessions types.SessionManager,
@ -326,19 +326,18 @@ func (manager *WebSocketManagerCtx) inactiveCursors() {
}
lastEmpty = currentEmpty
cursors := []message.SessionCursor{}
for session, cursor := range cursorsMap {
cursors = append(
cursors,
message.SessionCursor{
sessionCursors := []message.SessionCursors{}
for session, cursors := range cursorsMap {
sessionCursors = append(
sessionCursors,
message.SessionCursors{
ID: session.ID(),
X: uint16(cursor.X),
Y: uint16(cursor.Y),
Cursors: cursors,
},
)
}
manager.sessions.InactiveCursorsBroadcast(event.SESSION_CURSORS, cursors, nil)
manager.sessions.InactiveCursorsBroadcast(event.SESSION_CURSORS, sessionCursors, nil)
}
}
}()