diff --git a/main.go b/main.go index fc09609..a19d94b 100644 --- a/main.go +++ b/main.go @@ -185,6 +185,9 @@ func (session *viewerSession) initUIWithForm() { AddButton("test", session.testAuth). AddButton("save", session.closeForm) + session.enablePaste(form.GetFormItem(0).(*tview.InputField), form) + session.enablePaste(form.GetFormItem(1).(*tview.InputField), form) + formTreeFlex := tview.NewFlex() if !session.cfg.HorizontalLayout { formTreeFlex.SetDirection(tview.FlexRow) diff --git a/util_unix.go b/util_unix.go new file mode 100644 index 0000000..343d80b --- /dev/null +++ b/util_unix.go @@ -0,0 +1,12 @@ +// +build !windows + +package main + +import ( + "github.com/rivo/tview" +) + +// do nothing for non windows +// remove once https://github.com/gdamore/tcell/issues/319 is fixed +func enablePaste(field *tview.InputField) { +} diff --git a/util_windows.go b/util_windows.go new file mode 100644 index 0000000..cf08479 --- /dev/null +++ b/util_windows.go @@ -0,0 +1,47 @@ +// +build windows + +package main + +import ( + "reflect" + + "github.com/atotto/clipboard" + "github.com/gdamore/tcell" + "github.com/rivo/tview" +) + +// Hacky solution for a working copy paste on Windows +// Breaks encapsulation by accessing a private member using reflect +// remove once https://github.com/gdamore/tcell/issues/319 is fixed +func (session *viewerSession) enablePaste(field *tview.InputField, form *tview.Form) { + field.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + if event.Key() == tcell.KeyCtrlV || event.Key() == tcell.KeyCtrlY { + session.handlePaste(field) + } + return event + }) + + // paste on right click + field.SetMouseCapture(func(action tview.MouseAction, event *tcell.EventMouse) (tview.MouseAction, *tcell.EventMouse) { + item, _ := form.GetFocusedItemIndex() + + if item != -1 && event.Buttons()&tcell.Button2 != 0 && form.GetFormItem(item) == field { + session.handlePaste(field) + } + + return action, event + }) +} + +func (session *viewerSession) handlePaste(field *tview.InputField) { + clipContent, err := clipboard.ReadAll() + if err != nil { + session.logError("could not paste: ", err) + } + val := reflect.ValueOf(*field) + cursorPos := val.FieldByName("cursorPos").Int() + text := field.GetText() + field.SetText(text[0:cursorPos] + clipContent + text[cursorPos:]) + // TODO: why does Draw() deadlock? + session.app.ForceDraw() +}