diff --git a/internal/api/room/drop.go b/internal/api/room/drop.go new file mode 100644 index 00000000..3a3b9191 --- /dev/null +++ b/internal/api/room/drop.go @@ -0,0 +1,23 @@ +package room + +import ( + "net/http" + + "demodesk/neko/internal/utils" +) + +type DropPayload struct { + X int `json:"x"` + Y int `json:"y"` + Files []string `json:"files"` +} + +func (h *RoomHandler) dropFiles(w http.ResponseWriter, r *http.Request) { + data := &DropPayload{} + if !utils.HttpJsonRequest(w, r, data) { + return + } + + h.desktop.DropFiles(data.X, data.Y, data.Files) + utils.HttpSuccess(w) +} diff --git a/internal/api/room/handler.go b/internal/api/room/handler.go index 67868a18..374df970 100644 --- a/internal/api/room/handler.go +++ b/internal/api/room/handler.go @@ -60,4 +60,8 @@ func (h *RoomHandler) Route(r chi.Router) { r.With(auth.AdminsOnly).Post("/", h.screenConfigurationChange) r.With(auth.AdminsOnly).Get("/configurations", h.screenConfigurationsList) }) + + r.Route("/drop", func(r chi.Router) { + r.With(auth.AdminsOnly).Post("/", h.dropFiles) + }) } diff --git a/internal/desktop/drop.go b/internal/desktop/drop.go new file mode 100644 index 00000000..da8b6f77 --- /dev/null +++ b/internal/desktop/drop.go @@ -0,0 +1,24 @@ +package desktop + +import ( + "time" + "demodesk/neko/internal/desktop/drop" +) + +const ( + DELAY = 100 * time.Millisecond +) + +func (manager *DesktopManagerCtx) DropFiles(x int, y int, files []string) { + go drop.DragWindow(files) + + // TODO: Find a bettter way. + time.Sleep(DELAY) + manager.Move(10, 10) + manager.ButtonDown(1) + manager.Move(x, y) + time.Sleep(DELAY) + manager.Move(x, y) + time.Sleep(DELAY) + manager.ButtonUp(1) +} diff --git a/internal/types/desktop.go b/internal/types/desktop.go index ae206053..1bded734 100644 --- a/internal/types/desktop.go +++ b/internal/types/desktop.go @@ -35,4 +35,7 @@ type DesktopManager interface { // clipboard ReadClipboard() string WriteClipboard(data string) + + // drop + DropFiles(x int, y int, files []string) }