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