Browse Source

Clipboard works

Arthur Yefimov 2 years ago
parent
commit
3581c8116e
6 changed files with 58 additions and 22 deletions
  1. 3 1
      Data/Texts/en.dat
  2. 3 1
      Data/Texts/ru.dat
  3. 1 1
      src/Editor.Mod
  4. 28 6
      src/FreeOberon.Mod
  5. 21 9
      src/Graph.Mod
  6. 2 4
      src/TermBox.Mod

+ 3 - 1
Data/Texts/en.dat

@@ -208,7 +208,9 @@ menuRedo "&Redo"
 menuCut "Cu&t"
 menuCopy "&Copy"
 menuPaste "&Paste"
-menuPasteClipboard "Pas&te From OS Clipboard"
+menuCutInternal "Cut &Internally"
+menuCopyInternal "Copy I&nternally"
+menuPasteInternal "Pas&te Internally"
 menuClear "C&lear"
 menuSelectAll "Select &All"
 menuUnselect "U&nselect"

+ 3 - 1
Data/Texts/ru.dat

@@ -208,7 +208,9 @@ menuRedo "&Повтор"
 menuCut "&Вырезать"
 menuCopy "&Копировать"
 menuPaste "В&ставить"
-menuPasteClipboard "Вс&тавить из системного буфера"
+menuCutInternal "В&ырезать внутренне"
+menuCopyInternal "К&опировать внутренне"
+menuPasteInternal "Вс&тавить внутренне"
 menuClear "&Удалить"
 menuSelectAll "В&ыделить всё"
 menuUnselect "С&нять выделение"

+ 1 - 1
src/Editor.Mod

@@ -75,7 +75,7 @@ TYPE
   END;
 
 VAR
-  clipboard: ARRAY 16000 OF CHAR;
+  clipboard: ARRAY 50000 OF CHAR;
   editorMethod-: OV.ControlMethod;
   fileDialogMethod-: OV.ControlMethod;
   searchDialogMethod-: OV.ControlMethod;

+ 28 - 6
src/FreeOberon.Mod

@@ -672,12 +672,29 @@ VAR e: Editor.Editor;
   s: ARRAY 50000 OF CHAR;
 BEGIN
   IF (c.app.windows # NIL) & (c.app.windows IS Editor.Editor) THEN
-    T.GetClipboardText(s);
+    Graph.GetClipboardText(T.GetWindow(), s);
     FixClipboardText(s);
     Editor.PasteText(app, s)
   END
 END EditPasteClipboard;
 
+PROCEDURE EditCopyClipboard*(c: OV.Control);
+VAR s: ARRAY 50000 OF CHAR;
+BEGIN
+  IF (c.app.windows # NIL) & (c.app.windows IS Editor.Editor) THEN
+    c.app.windows(Editor.Editor).text.CopySelection(s);
+    Graph.SetClipboardText(T.GetWindow(), s)
+  END
+END EditCopyClipboard;
+
+PROCEDURE EditCutClipboard*(c: OV.Control);
+BEGIN
+  IF (c.app.windows # NIL) & (c.app.windows IS Editor.Editor) THEN
+    EditCopyClipboard(c);
+    Editor.EditClear(c.app.windows(Editor.Editor))
+  END
+END EditCutClipboard;
+
 PROCEDURE InitIDE;
 VAR w: OV.Window;
   m, m2: OV.Menu;
@@ -715,19 +732,24 @@ BEGIN
   OV.Add(m, m2);
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   FoStrings.Get('menuCut', s);
-  OV.Add(m, OV.NewMenu(s, 'Ctrl+X', OV.hCtrlX, Editor.EditCut));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+X', OV.hCtrlX, EditCutClipboard));
   FoStrings.Get('menuCopy', s);
-  OV.Add(m, OV.NewMenu(s, 'Ctrl+C', OV.hCtrlC, Editor.EditCopy));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+C', OV.hCtrlC, EditCopyClipboard));
   FoStrings.Get('menuPaste', s);
-  OV.Add(m, OV.NewMenu(s, 'Ctrl+V', OV.hCtrlV, Editor.EditPaste));
-  FoStrings.Get('menuPasteClipboard', s);
-  OV.Add(m, OV.NewMenu(s, 'Ctrl+Shift+V', OV.hCtrlShiftV, EditPasteClipboard));
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+V', OV.hCtrlV, EditPasteClipboard));
   FoStrings.Get('menuClear', s);
   OV.Add(m, OV.NewMenu(s, 'Ctrl+Del', OV.hCtrlDel, Editor.EditClear));
   FoStrings.Get('menuSelectAll', s);
   OV.Add(m, OV.NewMenu(s, 'Ctrl+A', OV.hCtrlA, Editor.EditSelectAll));
   FoStrings.Get('menuUnselect', s);
   OV.Add(m, OV.NewMenu(s, '', 0, Editor.EditUnselect));
+  OV.Add(m, OV.NewMenu('-', '', 0, NIL));
+  FoStrings.Get('menuCutInternal', s);
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+Shift+X', OV.hCtrlShiftX, Editor.EditCut));
+  FoStrings.Get('menuCopyInternal', s);
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+Shift+C', OV.hCtrlShiftC, Editor.EditCopy));
+  FoStrings.Get('menuPasteInternal', s);
+  OV.Add(m, OV.NewMenu(s, 'Ctrl+Shift+V', OV.hCtrlShiftV, Editor.EditPaste));
   OV.AddMenu(app, m);
   FoStrings.Get('menuSearch', s);
   m := OV.NewMenu(s, '', 0, NIL);

+ 21 - 9
src/Graph.Mod

@@ -1,5 +1,5 @@
 MODULE Graph;
-IMPORT Out, Al := Allegro5, Utf8, Files, Dir, Strings, SYSTEM;
+IMPORT Out, Al := Allegro5, Utf8, Files, Dir, Strings, SYSTEM, Platform;
 
 CONST
   fontPlanes = 4; (*!TODO*)
@@ -1419,21 +1419,33 @@ RETURN f END LoadFont;
 
 PROCEDURE GetClipboardText*(win: Window; VAR s: ARRAY OF CHAR);
 TYPE P = POINTER [1] TO ARRAY 50000 OF SHORTCHAR;
-VAR a: Al.ADRINT;
-  p: P;
-  q: ARRAY 20 OF SHORTCHAR;
+VAR a: Al.ADRINT; p: P;
+  i: INTEGER;
 BEGIN
   a := Al.get_clipboard_text(win.display);
-  (*IF a = 0 THEN a := Al.get_clipboard_text(win.display) END; (*Allegro bug*)*)
-  (*Out.String('PASTE DEBUG. a = ');Out.Int(a, 0);Out.Ln;*)
+  IF ~Platform.Windows THEN (* Workaround for an Allegro bug on X11 *)
+    FOR i := 1 TO 2 DO (* Maybe "TO 1" is enough *)
+      Al.free_with_context(a, 1429, 'Graph.Mod', 'GetClipboardText');
+      a := Al.get_clipboard_text(win.display)
+    END
+  END;
   IF a # 0 THEN p := SYSTEM.VAL(P, a); Utf8.Decode(p^, s);
-    Al.free_with_context(a, 1430, 'Graph.Mod', 'GetClipboardText')
-    (*;Utf8.Encode('Привет', q);
-    ;IF Al.set_clipboard_text(win.display, SYSTEM.VAL(Al.ADRINT, SYSTEM.ADR(q))) THEN END*)
+    Al.free_with_context(a, 1434, 'Graph.Mod', 'GetClipboardText')
   ELSE s[0] := 0X
   END
 END GetClipboardText;
 
+PROCEDURE SetClipboardText*(win: Window; s: ARRAY OF CHAR);
+TYPE P = POINTER [1] TO ARRAY 50000 OF SHORTCHAR;
+VAR q: ARRAY 200000 OF SHORTCHAR;
+BEGIN
+  Utf8.Encode(s, q);
+  IF Al.set_clipboard_text(win.display, SYSTEM.VAL(Al.ADRINT, SYSTEM.ADR(q)))
+  THEN END
+END SetClipboardText;
+
+(** Time **)
+
 PROCEDURE Time*(): REAL;
 RETURN Al.get_time() END Time;
 

+ 2 - 4
src/TermBox.Mod

@@ -801,10 +801,8 @@ BEGIN
   IF b # NIL THEN G.SetWindowIcon(screen, b) END
 END InitIcon;
 
-PROCEDURE GetClipboardText*(VAR s: ARRAY OF CHAR);
-BEGIN
-  IF screen # NIL THEN G.GetClipboardText(screen, s) ELSE s[0] := 0X END
-END GetClipboardText;
+PROCEDURE GetWindow*(): G.Window;
+RETURN screen END GetWindow;
 
 PROCEDURE InitScreen;
 VAR W, H, dw, dh: INTEGER;