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().