Win32.Clipboard.Mod 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. MODULE Clipboard; (** AUTHOR "ALEX"; PURPOSE "Windows clipboard interface"; *)
  2. IMPORT SYSTEM, Kernel32, User32, KernelLog, Modules, Texts, TextUtilities, HostClipboard;
  3. CONST
  4. CR = 0DX; LF = 0AX;
  5. (** Copy text of Windows clipboard to text *)
  6. PROCEDURE GetFromClipboard(text : Texts.Text);
  7. VAR
  8. hMem: Kernel32.HGLOBAL; adr: ADDRESS;
  9. hBool: Kernel32.BOOL;
  10. ch : CHAR;
  11. chUnicode: ARRAY 2 OF LONGINT;
  12. BEGIN
  13. ASSERT((text # NIL) & (text.HasWriteLock()));
  14. IF User32.OpenClipboard(Kernel32.NULL) # Kernel32.False THEN
  15. hMem := User32.GetClipboardData(User32.CFText);
  16. IF hMem # Kernel32.NULL THEN
  17. text.Delete( 0, text.GetLength() );
  18. adr := Kernel32.GlobalLock(hMem);
  19. SYSTEM.GET(adr, ch); INC(adr);
  20. WHILE ch # 0X DO
  21. IF (ch # CR) OR (CHR(SYSTEM.GET8(adr)) # LF) THEN (* transform CRLF into LF *)
  22. chUnicode[0] := ORD(ch);
  23. chUnicode[1] := 0;
  24. text.InsertUCS32(text.GetLength(), chUnicode);
  25. END;
  26. SYSTEM.GET(adr, ch); INC(adr)
  27. END;
  28. hBool := Kernel32.GlobalUnlock(hMem);
  29. END;
  30. hBool := User32.CloseClipboard();
  31. END
  32. END GetFromClipboard;
  33. (** Copy text to Windows clipboard *)
  34. PROCEDURE PutToClipboard(text : Texts.Text);
  35. VAR
  36. hMem: Kernel32.HGLOBAL; adr: ADDRESS;
  37. hBool: Kernel32.BOOL;
  38. chBuff: POINTER TO ARRAY OF CHAR;
  39. size,requiredSize: LONGINT;
  40. ind: LONGINT;
  41. BEGIN
  42. ASSERT((text # NIL) & (text.HasReadLock()));
  43. IF User32.OpenClipboard(Kernel32.NULL) # Kernel32.False THEN
  44. User32.EmptyClipboard;
  45. size := text.GetLength();
  46. NEW(chBuff, size + 1);
  47. (* UTF-8 encoding. String is truncated in case of multi-byte encoded characters! *)
  48. TextUtilities.TextToStr(text, chBuff^);
  49. ind := 0; requiredSize := size + 1;
  50. WHILE ind < size DO
  51. IF chBuff^[ind] = LF THEN INC(requiredSize); END; (* transform LF into CRLF *)
  52. INC(ind);
  53. END;
  54. hMem := Kernel32.GlobalAlloc({Kernel32.GMemMoveable, Kernel32.GMemDDEShare}, requiredSize);
  55. adr := Kernel32.GlobalLock(hMem);
  56. ind := 0;
  57. WHILE ind < size DO
  58. IF chBuff^[ind] = LF THEN (* transform LF into CRLF *)
  59. SYSTEM.PUT8(adr, CR); INC(adr);
  60. END;
  61. SYSTEM.PUT(adr, chBuff^[ind]); INC(adr); INC(ind);
  62. END;
  63. SYSTEM.PUT(adr, 0X);
  64. hBool := Kernel32.GlobalUnlock(hMem);
  65. hMem := User32.SetClipboardData(User32.CFText, hMem);
  66. hBool := User32.CloseClipboard();
  67. END
  68. END PutToClipboard;
  69. PROCEDURE ClipboardChanged(sender, data : ANY);
  70. BEGIN
  71. Texts.clipboard.AcquireRead;
  72. PutToClipboard(Texts.clipboard);
  73. Texts.clipboard.ReleaseRead;
  74. END ClipboardChanged;
  75. PROCEDURE Install*;
  76. BEGIN
  77. KernelLog.Enter; KernelLog.String("WindowsClipboard: Registered clipboard at host clipboard interface."); KernelLog.Exit;
  78. END Install;
  79. PROCEDURE Cleanup;
  80. BEGIN
  81. Texts.clipboard.onTextChanged.Remove(ClipboardChanged);
  82. HostClipboard.SetHandlers(NIL, NIL);
  83. KernelLog.Enter; KernelLog.String("WindowsClipboard: Unregistered clipboard at host clipboard interface."); KernelLog.Exit;
  84. END Cleanup;
  85. BEGIN
  86. (* register with AosText clipboard *)
  87. Texts.clipboard.onTextChanged.Add(ClipboardChanged);
  88. HostClipboard.SetHandlers(GetFromClipboard, PutToClipboard);
  89. Modules.InstallTermHandler(Cleanup)
  90. END Clipboard.
  91. Clipboard.Install ~
  92. SystemTools.Free Clipboard ~