diff --git a/internal/desktop/xorg.go b/internal/desktop/xorg.go index e68c3621..6ca07afe 100644 --- a/internal/desktop/xorg.go +++ b/internal/desktop/xorg.go @@ -9,8 +9,16 @@ import ( "demodesk/neko/internal/desktop/xorg" ) +var mousePosX int +var mousePosY int + func (manager *DesktopManagerCtx) Move(x, y int) { xorg.Move(x, y) + mousePosX, mousePosY = x, y +} + +func (manager *DesktopManagerCtx) GetMousePositon() (x, y int) { + return mousePosX, mousePosY } func (manager *DesktopManagerCtx) Scroll(x, y int) { diff --git a/internal/types/desktop.go b/internal/types/desktop.go index 1501fc40..e1207b6f 100644 --- a/internal/types/desktop.go +++ b/internal/types/desktop.go @@ -48,6 +48,7 @@ type DesktopManager interface { // xorg Move(x, y int) + GetMousePositon() (x, y int) Scroll(x, y int) ButtonDown(code int) error KeyDown(code uint64) error diff --git a/internal/types/event/events.go b/internal/types/event/events.go index 3d767960..4ec99b3c 100644 --- a/internal/types/event/events.go +++ b/internal/types/event/events.go @@ -47,7 +47,8 @@ const ( ) const ( - CURSOR_IMAGE = "cursor/image" + CURSOR_IMAGE = "cursor/image" + CURSOR_POSITION = "cursor/position" ) const ( diff --git a/internal/types/message/messages.go b/internal/types/message/messages.go index 292e10f8..0424a66c 100644 --- a/internal/types/message/messages.go +++ b/internal/types/message/messages.go @@ -172,6 +172,13 @@ type CursorImage struct { Y uint16 `json:"y"` } +type CursorPosition struct { + Event string `json:"event,omitempty"` + MemberId string `json:"member_id"` + X uint16 `json:"x"` + Y uint16 `json:"y"` +} + ///////////////////////////// // Broadcast ///////////////////////////// diff --git a/internal/websocket/manager.go b/internal/websocket/manager.go index 4c6c17de..bd8803cb 100644 --- a/internal/websocket/manager.go +++ b/internal/websocket/manager.go @@ -41,6 +41,7 @@ type WebSocketManagerCtx struct { desktop types.DesktopManager handler *handler.MessageHandlerCtx handlers []types.HandlerFunction + shutdown chan bool } func (ws *WebSocketManagerCtx) Start() { @@ -133,9 +134,51 @@ func (ws *WebSocketManagerCtx) Start() { }) ws.fileChooserDialogEvents() + + go func() { + ws.logger.Debug().Msg("cursor position broadcast start") + + defer func() { + ws.logger.Debug().Msg("cursor position broadcast shutdown") + }() + + var posX int + var posY int + + for { + select { + case <-ws.shutdown: + return + default: + time.Sleep(40 * time.Millisecond) + + session := ws.sessions.GetHost() + if session == nil { + continue + } + + x, y := ws.desktop.GetMousePositon() + if posX == x && posY == y { + continue + } + + memberId := session.ID() + posX = x + posY = y + + ws.sessions.Broadcast(message.CursorPosition{ + Event: event.CURSOR_POSITION, + MemberId: memberId, + X: uint16(x), + Y: uint16(y), + }, []string{ memberId }) + } + } + }() } func (ws *WebSocketManagerCtx) Shutdown() error { + ws.shutdown <- true return nil }