[comp.archives] [comp.emacs] Epoch 3.1 Release Announcment

kaplan@m.cs.uiuc.edu (02/07/90)

Archive-name: epoch/v3.1
Original-posting-by: kaplan@m.cs.uiuc.edu
Original-subject: Epoch 3.1 Release Announcment
Archive-site: cs.uiuc.edu [128.174.252.1]
Archive-directory: pub/epoch-files/epoch
Archive-files: README.Epoch-3.1
Reposted-by: emv@math.lsa.umich.edu (Edward Vielmetti)


Epoch 3.1, based on gnu emacs 18.55, is now available.
Epoch is gnu emacs extended in the following ways:

o	multiple x windows (hereafter called screens)..
o	ability to set/change x-properties like color, font, cursor
	etc on the fly, by screen.
o	ability to place "buttons" --- highlighted regions of text ---
	in buffers.  Useful for highlighed cut-and-paste with the mouse,
	hyptertext hotbuttons, etc.
o	ability to communicate with other X clients using property change
	and client message events.

Epoch is available by anonymous FTP from cs.uiuc.edu (128.174.252.1), or 
on tape for a nominal charge to cover expenses.  There is also an epoch 
mailing list.   To join the list or get more information about obtaining
epoch, email epoch-request@cs.uiuc.edu, uunet!uiucdcs!epoch-request or
(as a last resort) epoch-request%cs.uiuc.edu@uiucvmd.bitnet.

FILES in the DISTRIBUTION, INSTALLATION and CHANGES:

Epoch can be found in the directory pub/epoch-files/epoch on cs.uiuc.edu.
Once you've obtained it, it installs like regular gnu emacs 18.55

The files in the distribution are:

epoch-3.1.tar.Z			the entire release
epoch-3.1-stripped.tar.Z	just the etc, lisp and src directories
epoch-3.1.epoch-man.tar.Z	just the manual, for the curious
epoch-3.1.epoch-man.ps.Z	manual in postscript
README.Epoch-3.1		this file
epoch-3.0-3.1-diffs.tar.Z	diffs from 3.0 to 3.1.  Includes:
				src diffs.
				complete new manual, epoch-lisp-files,
				new src files not diffs cuz they didnt
				exist last time.

epoch-3.1.tar.Z is a complete emacs distribution, based on 18.55, and does
not require that you have an emacs already installed.  if you have 18.55
installed already you can blow off everything and use the 18.55 etc and
lisp directories: just remember to save the epoch binary and etc/DOC files
somewhere before you do this.

The X-Menu code does not work in epoch, dont define HAVE_X_MENUS

The s-file for the suns seems a little hosed:  on my sun3 running
4.0.3, I had to change STARTFILES to be crt0.o /lib/Mcrt1.o  (to
get around a problem of an undefined flag _f68881_used even though
I was not using the -f68881 option on the compile).  Worked fine after
this fix.

When Making on the HP, MAXHOSTNAMELEN must be define somewhere. 1024
seems a good value

For all operating systems and machines it is useful to read the notes
in etc/MACHINES

We have included the s- and m-files for the MIPS running RISCOS from
beldar@mips.com

Change log for epoch, upgrading from 3.0 to 3.1

1/30/90

+ Epoch 3.1 released.

1/29/90

+ changed names of primitive functions and built-in variables:  
  instead of being *x-prim* it is
  now epoch::prim, designed to look/feel like common lisp package internals
  (thanks to janssens@xerox.com for suggesting this fix).  
  So, *x-create-screen*   will now be epoch::create-screen.  
  Similarly modified all the alist entries to be epoch:: prefixed rather
  than x- prefixed.

+ also renamed x-screen-mapped to epoch::screen-mapped-p

+ -xrm added to options list.  This allows override of resource info on the
  command line, eg epoch -xrm "*motion:on".

1/28/89

+ Added the ability to set the parent window of a screen. Use 'parent in
  the alist. Value should be an X-resource Window. THIS IS DANGEROUS!
  If you create a window that is too small (<2 lines), Epoch will crash.

+ epoch::query-pointer changed. This is significant. The new return value is
  the list (X Y MOD-STATE). Note that the (cdr) of the return value is
  no longer an integer. You have to use (car (cdr)) now. The button
  state is a bit mask, with the 8 keyboard modifiers followed by the
  5 mouse buttons.

1/23/89 

+ put in buffer-anchoring.  The idea is that a buffer is anchored to

	. the screen it first appears in.
	. any other screen you explicitly select it in with select-buffer
  	  or pop-to-buffer.
	. the buffer-local variable screens tells you what screens a buffer
	  is anchored in.

  the effect is that when you do an (other-buffer) 9eg in C-xb or C-z4b or C-xb
  you do not get random buffers from other screens offered as options (but
  you can select them).  Thus gnus buffers, rmail buffers, calendars etc, dont
  wonder all over your screens.  This increases the illusion that separate
  screens function as separate tools.

+ put in mouse-dragging.  Used buttons.  File "motion.el" contains the
  goods.  Also changed smk-x-mouse.  It is now VERY different to
  x-mouse.el
 
  It was hard to decide exactly how to implement what actions on what
  buttons.  Eventually we decided to use the xterm "standard set".  (Of
  course you can change all of this).  So now, 

  left-down:		set point
  left-down-and-drag:	highlight the dragged area and stick into cut
			buffer and kill-ring. 
  middle-down:		paste contents of cut buffer in at point of click.
  right-down:		extend coverage of area dragged by a left-down-and-drag
			to current mouse os.
  right-down-and-drag:	as for right-down, but keep extending as mouse
			drags.
  ctrl-right-down:	cut highlighted region.  

  Also:  on left-mouse-up  and right-mouse-up, the point gets left where
	it is and the mark put on the other end of the highlighted region
	so that mouse and emacs keystrokes interact nicely (eg drag then
	cut with ^W).

  Dragged regions remain highlighted until the next left-down.

  The buttons are buffer-local so you can have simultaneous highlightings 
  in different buffers.
  
  All this based on Denys Duchier's code for similar features.

+ if you hold the left or right-down and drag out of the screen (up or
  down) the screen scrolls in the direction of the drag.  

+ changed the way events are handled in epoch.el.  There is now an alist of
  event-type symbols and function-names.  when an event happens it is looked
  up in the alist and the appropriate handler function called.  This was done
  to avoid the need to keep hacking epoch.el every time a new kind of event
  is added.  The alist is called event-alist.  By default is handles property
  changes, focus events and motion events.  


1/23/89

+ Fix event handling again. Used Denys' code, mostly. Had to fix dependencies
  on other non-installed features. Attempting to fix bug that's trashing
  the stack frame.

1/22/89 (18.55.47)

+ Yet another change to the focus tracking code. It works better. Maybe it's
  finally correct.

+ New primitives installed: (Ones marked {Denys} are stolen from Denys Duchier)
      . epoch::query-pointer [ SCREEN ] : 
	return pointer coords (in characters) from
	origin of the screen as a cons pair.
      . epoch::send-client message DEST TYPE FORMAT DATA : send a 
	client message
	to another X-window. FORMAT should be nil or one of 8,16,32. DATA
	should be nil or a string. TYPE should be an X-resource ATOM.
	DEST can be a screen or an X-resource WINDOW.
      . epoch::redisplay-screen [ SCREEN ] : 
	forces a redisplay of the screen. Be
	careful -- this is a _forced_ redisplay, _no_ pre-emption. {Denys}
      . epoch::redraw-display : 
	Attempts to perform updates on all appropriate screens
	{Denys}
      . epoch::set-screen-modified [ SCREEN ]: 
	Marks the screen as modifed, so the
	next updates should redraw it. {Denys}
      . epoch::redisplay-buffer : 
	Attempts to update the display of the buffer in
	all screens. May not work. {Denys}
      . epoch::motion-hints-p [ SCREEN ] : 
	Return motion hint state
      . epoch::set-motion-hints FLAG [ SCREEN ] : Enable/Disable the input of
	MotionHint events.
      . epoch::font [ NAME ] [ SCREEN ] : If name is nil, the current font
	information is returned. If not, then the font is changed to the
	new NAME. Replaces *x-font-information*.
+ ClientMessages are now in the Q. They come back as 'client-message
  with a value of ( TYPE FORMAT . DATA ).
+ MotionHints are in the Q, returned as 'motion events. Can be enabled
  through epoch::set-motion-hints, or in the screen alist with 'motion.
  Command line option '-motion' enables them.
+ Global variable - epoch::mouse-events. 
  If non-nil, mouse button events go into
  the Epoch event Q instead of generating fake keyboard input. Event type
  is 'button, value is ( press/release char-x char-y button . mod-state )
+ Event handling is now different internally. Things should work
  better. Should have fewer problems with events being in the Q without
  being processed.
+ Global display is different - setting epoch::global-update to a 
  non-nil, non-t
  value now forces updates on all screens, regardless of their local update
  flag.

1/21/89

+ epoch::warp-pointer X Y [ SCREEN ] : Teleports the pointer to the target X,Y
  relative to the specified screen. SCREEN can also be an X resource of
  type Window.

+ Changed size of global obarray to 1031 from 511. Despite all the warnings
  about this number being prime, the GNU-choice (511) is _not_ prime.
  1031 is, though.

1/20/89 (18.55.33)

+ More resource functions:
  epoch::intern-atom NAME - converts a string to the corresponding X atom
  epoch::unintern-atom ATOM - converts an X atom back to a string
  string-to-resource STRING TYPE
	- converts a decimal string to an X resource of the given TYPE
	- TYPE must be an X-resource of type ATOM.
  resource-to-type RESOURCE - returns a X resource of type ATOM and value
                            - the type of RESOURCE
  epoch::id-of-screen - returns the X window of a screen
  epoch::resource-p - returns t if the argument is a resource, nil otherwise
  equal - returns true if both arguments are x resources, and their x id's
	- match does _not_ check the type.
	- Actually just a modification to the original equal.

+ epoch::mod-to-shiftmask INDEX - converts an X modifier index into the appropriate
  shift mask to pass to epoch::rebind-key. Solves the problem of differing left
  and right keys on various keyboards, and fiddling by xmodmap.

+ Still cleaning up the ill-fated buffer-select-hook stuff in buffer.c and
  window.c

+ Fixed negative geometry location specs. Now accounts for the window size and
  border widths.

+ X resource id's have been added as a new type of lisp object. Garbage
  collection and other handling of them seems to work. Currently, there
  is nothing useful to do with them, but that will be fixed shortly.

  An X resource id is an encapsulation of a X window system id value
  (which can't be represented in an Elisp int, due to lack of bits).
  X resources are opaque to Elisp code and to the rest of Epoch. They
  consist of the X id and a type, currently one of
    Arc, Atom, Bitmap, Cardinal, Cursor, Drawable, Font, Integer,
    Pixmap, Point, Rectangle, String, Window, WM Hints, WM Size Hints
  or Resource (untyped).

+ Professor Kaplan claims that the memory leak fix mentioned below actually
  works.

1/12/89 (18.55.21)

+ Changed add-button to be more generous in the arguments it accepts. It will
  now create markers for integer arguments, and will extract the buffer from
  the markers. It also checks for buffer conflicts, such as the marker buffers
  not begin the same as the specified buffer, or different from each other.

+ Removed bogus garbage collection protection from xutil.c and xevent.c.
  GC can only happen in eval or similar functions (e.g., apply, funcall).
  Don't have protect from cons or make-vector.

+ Changed PlotTextLine() to allow attributes in highlighted lines. Instead
  of being treated specially and blasted out, highlight simply reverses the
  meaning of "normal" and "reverse".

+ Fixed button stuff. The variable "buttons-modify-buffers" can be set to
  nil if buttons should not modify the buffer. This can be set to be a buffer
  local variable, so that different buffers can have different settings.
  If the buffer is read only, and buttons-modify-buffers is not nil, then
  a read-only buffer error is signaled.

+ Dead screens should be more apparent now. I fixed epoch::select-screen to use
  the find_block() function, which returns nil if the screen is dead, so
  that epoch::select-screen will now return nil if the screen is dead.
  epoch::make-id returns nil on dead screens, a number otherwise. So,
  screen-alive-p could be defined as
  (defun screen-alive-p (screen)
    (if (not (epoch::screen-p screen)) (error "Not a screen"))
    (numberp (epoch::make-id screen))
  )

1/11/89 (Epoch 18.55.18)

+ Memory leak may be fixed. The font info retrieved in x_create_screen() is
  now freed at the end of the function. Technically, the font shouldn't be
  used after this, but the X-docs claim that if it is in a GC, then it's
  still available.

+ Epoch crashed on startup if the default font couldn't be found. This is
  because error() would be called during initialization, and that would
  break things. It now calls fprintf on stderr and exits instead, and
  calls error() during subsequent screen creations. It should also free
  allocated X and W screen blocks if the font is bad.

1/5/90 (Epoch 18.55.17)

A number of minor bug fixes -
+ Problems with vertical-motion, pos-visible-in-window, scroll-up, and
  scroll-down incorrectly dealing with wrapping lines fixed. Previously,
  a line that wrapped was counted as occupying a single screen line. The
  number of screen lines is now counted correctly. The error involved
  checking the screen width by looking at the size of the minibuffer, which
  of course in Epoch is irrelevant. The fix involved looking at the
  W_Screen->width instead.

+ epoch::rebind-key installed. 
  This function takes an X KeySym name, a shift mask,
  and a string, and rebinds the key to send the string when pressed.
  Note that contrary to Oliver Stone's book, the KeySym name does _not_
  have the leading "XK_" in it. The name of R8 is "R8", not "XK_R8".
  Read the function documentation for details on the shift mask.

  This is a very handy function. I am using the convention that rebound
  function keys send sequences that start with \C-^ followed by identification.
  A S,C, or M indicates a shift state. r,R,l,L,f,F indicate the function
  key set, followed by a single digit. Lower case indicates 1-9, upper case
  10-19.

+ Scrolling other screen bug fixed. There were two errors, one a GNU error
  and the other mine. The GNU error caused core dumps on certain types of
  error messages. My error involved epoch::get-buffer-window 
  returning bad values
  if executed when the mini-buffer was active. Both of these errors have been
  fixed.

+ Played with using bcopy() in moving the buffer gap instead of a while loop.
  Seems to work, and the man pages here claim that bcopy() correctly handles
  overlapping moves. However, this is currently disabled. To try it out, change
  the #if 0 defines in insdel.c in functions gap_left() and gap_right().