123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- %
- % TOY-MODE.SL - A "toy" to demonstrate a "non-text" data mode
- %
- % Author: William F. Galway
- % Symbolic Computation Group
- % Computer Science Dept.
- % University of Utah
- % Date: 12 August 1982
- % Copyright (c) 1982 University of Utah
- %
- % In reality, this is really the same as text, but with a different refresh
- % algorithm.
- % Need to fix clear window problems at creation time, plus misc clear to
- % end of line problems plus onewindow/twowindow problems.
- (load nstruct)
- (declare_data_mode "toy" 'create_toy_buffer)
- % Taken from "create_text_buffer"
- (de create_toy_buffer ()
- % Environment bindings for this buffer.
- % May prefer to use backquote to do this, but current version is buggy
- % for lists of the form `( (a .b) ). Also, it's important not to share
- % any substructure with other alists built by this routine.
- (list
- % The following 5 "per buffer" variables should be defined for a buffer
- % of any "data mode".
- (cons 'buffers_view_creator 'create_toy_view)
- (cons 'buffers_file_reader 'read_channel_into_text_buffer)
- (cons 'buffers_file_writer 'write_text_buffer_to_channel)
- (cons 'buffers_file NIL) % Name of file associated with buffer.
- (cons 'ModeEstablishExpressions RlispMode)
- % Variables unique to "text data mode" follow.
- % Initial vector allows only one line. (Should really be parameterized
- % somehow?)
- (cons 'CurrentBufferText (MkVect 0)) % 0 is upper bound, one element.
- (cons 'CurrentBufferSize 1) % Start with one line of text (but zero
- % characters in the line! )
- (cons 'CurrentLine NIL)
- (cons 'CurrentLineIndex 0)
- (cons 'point 0)
- % MarkLineIndex corresponds to CurrentLineIndex, but for "mark".
- (cons 'MarkLineIndex 0)
- (cons 'MarkPoint 0) % Corresponds to "point".
- ))
- % Modified from "create_text_view"
- (de create_toy_view (buffer-name)
- (cond
- % If the current buffer also uses a "toy view" or "text view" (hum,
- % needs more work--not very modular! )
- ((memq buffers_view_creator
- '(create_text_view create_toy_view))
- % Just modify (destructively) the current "view" (or "window")
- % environment to look into the new buffer, use the proper refresh
- % algorithm, return the current environment.
- (SelectBuffer buffer-name)
- % Let window know what buffer it's looking into (wierd)!
- (setf WindowsBufferName buffer-name)
- (setf windows_refresher (function refresh_toy_window))
- % Make sure the virtual screen is properly cleared and framed.
- (ClearVirtualScreen CurrentVirtualScreen)
- (FrameScreen CurrentVirtualScreen)
- % Save (and return) the current "view" environment.
- (SaveEnv CurrentWindowDescriptor))
- % Otherwise (if current view isn't into "text" or "toy"), create a
- % framed window of an appropriate size and at an appropriate location.
- % (For lack of a better idea, just use a large window taking up most of
- % the screen--same as provided by "OneWindow".)
- (T
- (let
- ((new-view
- (FramedWindowDescriptor
- buffer-name
- % Upper left corner
- (coords (sub1 (Column ScreenBase)) (sub1 (Row ScreenBase)))
- % Size of window uses entire width of screen, leaves room for two
- % one line windows at bottom of screen.
- (coords (plus 2 (Column ScreenDelta)) (sub1 (Row ScreenDelta)))
- )))
- (setf (cdr (atsoc 'windows_refresher new-view))
- (function refresh_toy_window))
- new-view))))
- (fluid '(row_offset column_offset))
- % Taken from refresh_framed_window.
- (de refresh_toy_window ()
- (progn
- (setf row_offset 1)
- (setf column_offset 1)
- (quietly_copyd 'original-WriteToScreen 'WriteToScreen)
- (quietly_copyd 'WriteToScreen 'backwards-WriteToScreen)
- (refresh_text)
- (quietly_copyd 'WriteToScreen 'original-WriteToScreen)
- (refresh_frame_label)
- (MoveToScreenLocation
- CurrentVirtualScreen
- (plus
- row_offset (CountLinesFrom TopOfDisplayIndex CurrentLineIndex))
- (difference
- (VirtualScreenWidth CurrentVirtualScreen)
- (plus
- column_offset
- (difference
- (LineColumn point CurrentLine)
- ShiftDisplayColumn))))))
- (de backwards-WriteToScreen (Scrn chr rw col)
- (original-WriteToScreen
- Scrn
- chr
- rw
- (difference (VirtualScreenWidth Scrn) col)))
- (de quietly_copyd (dest src)
- (let ((*USERMODE NIL) (*REDEFMSG NIL))
- (copyd dest src)))
- (de quietly_putd (fname ftype body)
- (let ((*USERMODE NIL) (*REDEFMSG NIL))
- (putd fname ftype body)))
|