182 lines
3.6 KiB
Go
182 lines
3.6 KiB
Go
// Generic, OS-independent clipboard support with text format only
|
|
package cliprdr
|
|
|
|
import (
|
|
"log/slog"
|
|
)
|
|
|
|
// SimpleTextClipboard provides OS-independent text-only clipboard support
|
|
type SimpleTextClipboard struct {
|
|
textContent string
|
|
}
|
|
|
|
var textClipboard = &SimpleTextClipboard{}
|
|
|
|
// GetClipboardText returns the current text content
|
|
func GetClipboardText() string {
|
|
return textClipboard.textContent
|
|
}
|
|
|
|
// SetClipboardText sets the clipboard text content
|
|
func SetClipboardText(text string) {
|
|
textClipboard.textContent = text
|
|
slog.Debug("Text clipboard set", "length", len(text))
|
|
}
|
|
|
|
// GetFormatList returns available formats (text only in generic mode)
|
|
func GetFormatList() []CliprdrFormat {
|
|
formatId := uint32(CF_UNICODETEXT)
|
|
formats := make([]CliprdrFormat, 0, 1)
|
|
formats = append(formats, CliprdrFormat{
|
|
FormatId: formatId,
|
|
FormatName: "CF_UNICODETEXT",
|
|
})
|
|
return formats
|
|
}
|
|
|
|
// ClipWatcher is a no-op in generic mode
|
|
func ClipWatcher(c *CliprdrClient) {
|
|
slog.Debug("Generic clipboard watcher (text-only mode) started")
|
|
// In generic mode, we don't actively monitor system clipboard
|
|
// Format list is provided statically
|
|
select {} // Block indefinitely
|
|
}
|
|
|
|
// Stub functions for compatibility (no-op in generic mode)
|
|
|
|
func OpenClipboard(hwnd uintptr) bool {
|
|
return true
|
|
}
|
|
|
|
func CloseClipboard() bool {
|
|
return true
|
|
}
|
|
|
|
func CountClipboardFormats() int32 {
|
|
return 1
|
|
}
|
|
|
|
func IsClipboardFormatAvailable(id uint32) bool {
|
|
return id == CF_UNICODETEXT || id == CF_TEXT
|
|
}
|
|
|
|
func EnumClipboardFormats(formatId uint32) uint32 {
|
|
if formatId == 0 {
|
|
return CF_UNICODETEXT
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func GetClipboardFormatName(id uint32) string {
|
|
switch id {
|
|
case CF_TEXT:
|
|
return "CF_TEXT"
|
|
case CF_UNICODETEXT:
|
|
return "CF_UNICODETEXT"
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
func EmptyClipboard() bool {
|
|
textClipboard.textContent = ""
|
|
return true
|
|
}
|
|
|
|
func RegisterClipboardFormat(format string) uint32 {
|
|
// Simple hash-based format ID generation
|
|
sum := uint32(0)
|
|
for _, c := range format {
|
|
sum = sum*31 + uint32(c)
|
|
}
|
|
return sum | 0xC000 // Set bit 14 for custom formats
|
|
}
|
|
|
|
func IsClipboardOwner(h uintptr) bool {
|
|
return false // Not applicable in generic mode
|
|
}
|
|
|
|
func HmemAlloc(data []byte) uintptr {
|
|
// In generic mode, return a pointer to the data
|
|
if len(data) == 0 {
|
|
return 0
|
|
}
|
|
return uintptr(len(data))
|
|
}
|
|
|
|
func SetClipboardData(formatId uint32, hmem uintptr) bool {
|
|
// No-op in generic mode
|
|
return true
|
|
}
|
|
|
|
func GetClipboardData(formatId uint32) string {
|
|
if formatId == CF_UNICODETEXT || formatId == CF_TEXT {
|
|
return GetClipboardText()
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func GlobalSize(hMem uintptr) uintptr {
|
|
return hMem
|
|
}
|
|
|
|
func GlobalLock(hMem uintptr) uintptr {
|
|
return hMem
|
|
}
|
|
|
|
func GlobalUnlock(hMem uintptr) {
|
|
// No-op
|
|
}
|
|
|
|
func OleGetClipboard() *IDataObject {
|
|
return nil
|
|
}
|
|
|
|
func OleSetClipboard(dataObject *IDataObject) bool {
|
|
return true
|
|
}
|
|
|
|
func OleIsCurrentClipboard(dataObject *IDataObject) bool {
|
|
return true
|
|
}
|
|
|
|
// GetFileNames and GetFileInfo are not supported in text-only generic mode.
|
|
func GetFileNames() []string {
|
|
return []string{}
|
|
}
|
|
|
|
func GetFileInfo(sys any) (uint32, []byte, uint32, uint32) {
|
|
return 0, []byte{}, 0, 0
|
|
}
|
|
|
|
// IDataObject stub - not used in text-only mode
|
|
type IDataObject struct {
|
|
ptr uintptr
|
|
}
|
|
|
|
type IUnknown struct {
|
|
ptr uintptr
|
|
}
|
|
|
|
type FORMATETC struct {
|
|
CFormat uint32
|
|
DvTargetDevice uintptr
|
|
Aspect uint32
|
|
Index int32
|
|
Tymed uint32
|
|
}
|
|
|
|
type STGMEDIUM struct {
|
|
Tymed uint32
|
|
UnionMember uintptr
|
|
PUnkForRelease *IUnknown
|
|
}
|
|
|
|
func (s *STGMEDIUM) Bytes() ([]byte, error) {
|
|
return []byte{}, nil
|
|
}
|
|
|
|
func CreateDataObject(c *CliprdrClient) *IDataObject {
|
|
return nil
|
|
}
|