Moontalk server and client (provided by many parties)
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

73 řádky
1.8KB

  1. require util.4th
  2. 80 constant COMMANDLINE_SIZE
  3. create commandline COMMANDLINE_SIZE allot
  4. variable cmdcursor
  5. variable cmdready
  6. : (cursor@) ( -- index-u ) cmdcursor @ ;
  7. : (translate) ( index-u -- addr )
  8. commandline + ;
  9. : (last-position) ( -- index-u )
  10. COMMANDLINE_SIZE 1- ;
  11. : (tail) ( index-u -- length-u )
  12. COMMANDLINE_SIZE swap - ;
  13. : (cursor-left) ( -- ) (cursor@) 1- 0 max cmdcursor ! ;
  14. : (cursor-right) ( -- ) (cursor@) 1+ COMMANDLINE_SIZE 1- min cmdcursor ! ;
  15. : (overwrite-char) ( c -- )
  16. commandline (cursor@) + c! ;
  17. : (append-char) ( c -- )
  18. (cursor@) (last-position) <> IF
  19. (cursor@) dup (translate) dup 1+ rot (tail) 1- move
  20. THEN (overwrite-char) ;
  21. : (backspace) ( -- )
  22. (cursor@) 0> IF
  23. (cursor@) (translate) dup 1- (cursor@) (tail) move
  24. bl (last-position) (translate) c!
  25. (cursor-left)
  26. THEN ;
  27. : commandline-handlekey ( ekey-n -- )
  28. ekey>char if ( c )
  29. CASE
  30. 10 OF true cmdready ! ENDOF \ newline
  31. 13 OF true cmdready ! ENDOF \ carriage return
  32. 127 OF (backspace) ENDOF \ DEL
  33. (append-char) (cursor-right) EXIT
  34. ENDCASE
  35. else ekey>fkey if ( key-id )
  36. case
  37. k-left of (cursor-left) endof
  38. k-right of (cursor-right) endof
  39. endcase
  40. else ( keyboard-event )
  41. drop \ just ignore an unknown keyboard event
  42. then then ;
  43. : commandline-getline ( -- c-addr u )
  44. commandline COMMANDLINE_SIZE ;
  45. : (update-cursorpos) ( -- )
  46. s\" \033[" type
  47. (cursor@) 1+ to-string type
  48. s" G" type ;
  49. : (carriage-return) ( -- )
  50. 13 emit ;
  51. : commandline-redraw ( -- )
  52. false stdout-logger
  53. (carriage-return)
  54. commandline-getline type
  55. (update-cursorpos)
  56. true stdout-logger ;
  57. : commandline-reset ( -- )
  58. commandline COMMANDLINE_SIZE bl fill
  59. 0 cmdcursor !
  60. false cmdready ! ;
  61. : commandline-key? ( -- flag ) key? ;
  62. : commandline-key ( -- ekey ) ekey ;
  63. : commandline-ready? ( -- flag ) cmdready @ ;
  64. commandline-reset