(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10 FORMAT XCCS)
(FILECREATED " 3-Jul-2021 13:16:26" 
{DSK}<Users>kaplan>Local>medley3.5>git-medley>library>CLIPBOARD.;6 9185   

      changes to%:  (VARS CLIPBOARDCOMS)

      previous date%: "24-Jun-2021 21:14:38" 
{DSK}<Users>kaplan>Local>medley3.5>git-medley>library>CLIPBOARD.;5)


(PRETTYCOMPRINT CLIPBOARDCOMS)

(RPAQQ CLIPBOARDCOMS
       [                                                     (* ; "Enable copy and paste")
        (FNS INSTALL-CLIPBOARD GETCLIPBOARD PUTCLIPBOARD PASTEFROMCLIPBOARD LISPINTERRUPTS.PASTE 
             CLIPBOARD-COPY-STREAM CLIPBOARD-PASTE-STREAM)
        (FNS TEDIT.COPYTOCLIPBOARD TEDIT.EXTRACTTOCLIPBOARD)
        (FNS SEDIT.COPYTOCLIPBOARD)
        (INITVARS (CLIPBOARD-FORMAT :UTF-8))
        (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DOCOPY (FILES (SYSLOAD)
                                                              UNIXCOMM UNICODE)
               (P (INSTALL-CLIPBOARD)))
        (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
                                                                             (NLAML)
                                                                             (LAMA])



(* ; "Enable copy and paste")

(DEFINEQ

(INSTALL-CLIPBOARD
  [LAMBDA NIL                                           (* ; "Edited 24-Jun-2021 21:14 by rmk:")
                                                            (* ; "Edited 19-Apr-2020 12:15 by rmk:")
                                                            (* ; "Edited 18-Apr-2018 23:00 by rmk:")
    (CL:WHEN (GETD 'LISPINTERRUPTS.PASTE)
        (MOVD? 'LISPINTERRUPTS 'LISPINTERRUPTS.ORIG)
        (MOVD 'LISPINTERRUPTS.PASTE 'LISPINTERRUPTS))
    (INTERRUPTCHAR (CHARCODE "Meta,v")
           '(PASTEFROMCLIPBOARD))
    (INTERRUPTCHAR (CHARCODE "Meta,V")
           '(PASTEFROMCLIPBOARD))
    (CL:WHEN (BOUNDP 'TEDIT.READTABLE)                       (* ; "TEDIT")

        (* ;; "Paste")

        (TEDIT.SETFUNCTION (CHARCODE "Meta,v")
               (FUNCTION PASTEFROMCLIPBOARD)
               TEDIT.READTABLE)
        (TEDIT.SETFUNCTION (CHARCODE "Meta,V")
               (FUNCTION PASTEFROMCLIPBOARD)
               TEDIT.READTABLE)

        (* ;; "Copy")

        (TEDIT.SETFUNCTION (CHARCODE "Meta,c")
               (FUNCTION TEDIT.COPYTOCLIPBOARD)
               TEDIT.READTABLE)
        (TEDIT.SETFUNCTION (CHARCODE "Meta,C")
               (FUNCTION TEDIT.COPYTOCLIPBOARD)
               TEDIT.READTABLE)

        (* ;; "Extract")

        (TEDIT.SETFUNCTION (CHARCODE "Meta,X")
               (FUNCTION TEDIT.EXTRACTTOCLIPBOARD)
               TEDIT.READTABLE)
        (TEDIT.SETFUNCTION (CHARCODE "Meta,x")
               (FUNCTION TEDIT.EXTRACTTOCLIPBOARD)
               TEDIT.READTABLE))
    (CL:WHEN (GETP 'SEDIT 'FILEDATES)                        (* ; 
                                                           "SEDIT copy: INTERRUPTCHAR does paste")
        (SEDIT:ADD-COMMAND "Meta,c" 'SEDIT.COPYTOCLIPBOARD "M-c" "Copy to clipboard")
        (SEDIT:ADD-COMMAND "Meta,C" 'SEDIT.COPYTOCLIPBOARD)
        (SEDIT:RESET-COMMANDS))])

(GETCLIPBOARD
  [LAMBDA NIL                                           (* ; "Edited 23-Feb-2021 11:32 by rmk:")
                                                            (* ; "Edited 25-Apr-2018 16:56 by rmk:")
    (CL:WITH-OPEN-STREAM (s (CLIPBOARD-PASTE-STREAM))
           (CONCATCODES (BIND C WHILE (SETQ C (READCCODE s)) COLLECT C])

(PUTCLIPBOARD
  [LAMBDA (OBJECT PRINTFN)                              (* ; "Edited 23-Feb-2021 11:32 by rmk:")
                                                            (* ; "Edited 25-Apr-2018 16:49 by rmk:")
    (CL:WITH-OPEN-STREAM (s (CLIPBOARD-COPY-STREAM))
           (IF PRINTFN
               THEN (APPLY* PRINTFN OBJECT s)
             ELSE (PRIN3 OBJECT s])

(PASTEFROMCLIPBOARD
  [LAMBDA NIL                                           (* ; "Edited 15-Feb-2021 23:43 by rmk:")
                                                            (* ; "Edited 18-Apr-2018 13:56 by rmk:")
                                                            (* ; "Edited 17-Apr-2018 23:11 by rmk:")

    (* ;; "If for some reason TTY process doesn't have a window (e.g. TEXEC), we can only do the character printing.  Presumably the right thing to do--no image objects in an exec.")

    (* ;; "Should be able to just call COPYINSERT, but the default BKSYSBUF puts in string quotes.")

    (LET [(STR (GETCLIPBOARD))
          (WINDOW (PROCESS.WINDOW (TTY.PROCESS]
         (IF (AND WINDOW (WINDOWPROP WINDOW 'COPYINSERTFN))
             THEN (COPYINSERT STR)
           ELSE (BIND C WHILE (SETQ C (GNCCODE STR)) DO (BKSYSCHARCODE C])

(LISPINTERRUPTS.PASTE
  [LAMBDA NIL                                           (* ; "Edited 18-Apr-2018 22:59 by rmk:")

    (* ;; "So paste interrupts will be installed in every process")

    (APPEND [LIST (LIST (CHARCODE "1,v")
                        '(PASTEFROMCLIPBOARD))
                  (LIST (CHARCODE "1,V")
                        '(PASTEFROMCLIPBOARD]
           (LISPINTERRUPTS.ORIG])

(CLIPBOARD-COPY-STREAM
  [LAMBDA NIL                                           (* ; "Edited 23-Feb-2021 22:11 by rmk:")

    (* ;; "Clipboard is UNICODE and UTF8")

    (LET (STRM (OST (UNIX-GETENV "OSTYPE")))
         (SETQ STRM (CREATE-PROCESS-STREAM (CL:IF (STRPOS "darwin" OST)
                                               "pbcopy"
                                               "xclip -i -selection clipboard")))
         (\EXTERNALFORMAT STRM CLIPBOARD-FORMAT)
         STRM])

(CLIPBOARD-PASTE-STREAM
  [LAMBDA NIL                                           (* ; "Edited 23-Feb-2021 17:29 by rmk:")
    (LET (STRM (OST (UNIX-GETENV "OSTYPE")))
         (SETQ STRM (CREATE-PROCESS-STREAM (CL:IF (STRPOS "darwin" OST)
                                               "pbpaste"
                                               "xclip -o -selection clipboard")))
         (\EXTERNALFORMAT STRM CLIPBOARD-FORMAT)
         [SETFILEINFO STRM 'ENDOFSTREAMOP #'(CL:LAMBDA (s)
                                                   (RETFROM (FUNCTION READCCODE)
                                                          NIL]
         STRM])
)
(DEFINEQ

(TEDIT.COPYTOCLIPBOARD
  [LAMBDA NIL                                           (* ; "Edited 18-Apr-2018 00:02 by rmk:")
    (LET [(TEXTSTREAM (TEXTSTREAM (TTY.PROCESS]
         (IF TEXTSTREAM
             THEN (PUTCLIPBOARD (TEDIT.SEL.AS.STRING TEXTSTREAM])

(TEDIT.EXTRACTTOCLIPBOARD
  [LAMBDA NIL                                           (* ; "Edited 19-Apr-2020 12:17 by rmk:")
                                                            (* ; "Edited 18-Apr-2018 00:02 by rmk:")
    (LET [(TEXTSTREAM (TEXTSTREAM (TTY.PROCESS]
         (IF TEXTSTREAM
             THEN (PUTCLIPBOARD (TEDIT.SEL.AS.STRING TEXTSTREAM))
                   (TEDIT.DELETE TEXTSTREAM (TEDIT.GETSEL TEXTSTREAM])
)
(DEFINEQ

(SEDIT.COPYTOCLIPBOARD
  [LAMBDA (CONTEXT)                                     (* ; "Edited  8-Aug-2020 15:25 by rmk:")
                                                            (* ; "Edited 24-Apr-2018 20:39 by rmk:")
                                                            (* ; "Edited 24-Apr-2018 20:33 by rmk:")
                                                            (* ; "Edited 23-Apr-2018 18:19 by rmk:")
    [CL:MULTIPLE-VALUE-BIND (SEL SELTYPE)
           (SEDIT:GET-SELECTION CONTEXT)

           (* ;; "SEL could be a list of several elements, or a structure, depending on SELTYPE.  ")

           (* ;; "SELTYPE=NIL means not a valid selection, and SEL is NIL.  Non-NIL values are :SUB-LIST, :CHARACTERS, and T")

           (CL:WHEN SELTYPE
               [PUTCLIPBOARD (CONS SEL (EQ SELTYPE :SUB-LIST))
                      (FUNCTION (LAMBDA (PAIR STREAM)
                                  (LET ((*PRINT-PRETTY* T)
                                        (PRETTYTABFLG NIL)
                                        (FONTCHANGEFLG NIL)
                                        (%#RPARS NIL))
                                       (DECLARE (SPECVARS *PRINT-PRETTY* %#RPARS PRETTYTABFLG 
                                                           FONTCHANGEFLG))
                                       (PRINTDEF (CAR PAIR)
                                              0 NIL (CDR PAIR)
                                              NIL STREAM])]
    T])
)

(RPAQ? CLIPBOARD-FORMAT :UTF-8)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DOCOPY 

(FILESLOAD (SYSLOAD)
       UNIXCOMM UNICODE)


(INSTALL-CLIPBOARD)
)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML )

(ADDTOVAR LAMA )
)
(PUTPROPS CLIPBOARD COPYRIGHT (NONE))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (1301 6531 (INSTALL-CLIPBOARD 1311 . 3243) (GETCLIPBOARD 3245 . 3619) (PUTCLIPBOARD 3621
 . 4026) (PASTEFROMCLIPBOARD 4028 . 4946) (LISPINTERRUPTS.PASTE 4948 . 5369) (CLIPBOARD-COPY-STREAM 
5371 . 5871) (CLIPBOARD-PASTE-STREAM 5873 . 6529)) (6532 7291 (TEDIT.COPYTOCLIPBOARD 6542 . 6823) (
TEDIT.EXTRACTTOCLIPBOARD 6825 . 7289)) (7292 8831 (SEDIT.COPYTOCLIPBOARD 7302 . 8829)))))
STOP
