diff --git a/internal/desktop/clipboard.go b/internal/desktop/clipboard.go index b9772142..c7431b87 100644 --- a/internal/desktop/clipboard.go +++ b/internal/desktop/clipboard.go @@ -7,6 +7,7 @@ import ( "strings" "gitlab.com/demodesk/neko/server/pkg/types" + "gitlab.com/demodesk/neko/server/pkg/xevent" ) func (manager *DesktopManagerCtx) ClipboardGetText() (*types.ClipboardText, error) { @@ -63,6 +64,13 @@ func (manager *DesktopManagerCtx) ClipboardSetBinary(mime string, data []byte) e return err } + // TODO: Refactor. + // We need to wait until the data came to the clipboard. + wait := make(chan struct{}) + xevent.Emmiter.Once("clipboard-updated", func(payload ...interface{}) { + wait <- struct{}{} + }) + err = cmd.Start() if err != nil { msg := strings.TrimSpace(stderr.String()) @@ -78,6 +86,8 @@ func (manager *DesktopManagerCtx) ClipboardSetBinary(mime string, data []byte) e // TODO: Refactor. // cmd.Wait() + <-wait + return nil } diff --git a/internal/websocket/handler/control.go b/internal/websocket/handler/control.go index d7e041cf..e0cb2a52 100644 --- a/internal/websocket/handler/control.go +++ b/internal/websocket/handler/control.go @@ -99,11 +99,18 @@ func (h *MessageHandlerCtx) controlCopy(session types.Session) error { return h.desktop.KeyPress(xorg.XK_Control_L, xorg.XK_c) } -func (h *MessageHandlerCtx) controlPaste(session types.Session) error { +func (h *MessageHandlerCtx) controlPaste(session types.Session, payload *message.ClipboardData) error { if err := h.controlRequest(session); err != nil && !errors.Is(err, ErrIsAlreadyTheHost) { return err } + // if there have been set clipboard data, set them first + if payload != nil && payload.Text != "" { + if err := h.clipboardSet(session, payload); err != nil { + return err + } + } + return h.desktop.KeyPress(xorg.XK_Control_L, xorg.XK_v) } diff --git a/internal/websocket/handler/handler.go b/internal/websocket/handler/handler.go index 9c5a8a26..d87935b8 100644 --- a/internal/websocket/handler/handler.go +++ b/internal/websocket/handler/handler.go @@ -97,7 +97,10 @@ func (h *MessageHandlerCtx) Message(session types.Session, data types.WebSocketM case event.CONTROL_COPY: err = h.controlCopy(session) case event.CONTROL_PASTE: - err = h.controlPaste(session) + payload := &message.ClipboardData{} + err = utils.Unmarshal(payload, data.Payload, func() error { + return h.controlPaste(session, payload) + }) case event.CONTROL_SELECT_ALL: err = h.controlSelectAll(session)