Mercurial > emacs
view etc/ledit.l @ 40137:5f0d7d58283b
(remember_mouse_glyph): New function.
(w32_mouse_position): Use it.
(note_mouse_movement): If the mouse moved off the glyph, remember its
new position.
Sync with xterm.c:
(notice_overwritten_cursor): Renamed from note_overwritten_text_cursor.
Rewritten to take glyph widths into account.
(x_y_to_hpos_vpos): Add parameter BUFFER_ONLY_P.
(fast_find_string_pos): New function.
(fast_find_position): Return the correct vpos. Add parameter STOP.
In the final row, stop before glyphs having STOP as object.
Don't consider glyphs that are not from a buffer.
(fast_find_position) [0]: Add a presumably more correct version for after 21.1.
(expose_window_tree, expose_frame): Don't compute intersections here.
(expose_window): Do it here instead.
(expose_window_tree, expose_window, expose_line): Return 1 when
overwriting mouse-face.
(expose_window): If W is the window currently being updated, mark
the frame garbaged.
(expose_frame): If mouse-face was overwritten, redo it.
(x_use_underline_position_properties): New variable.
(syms_of_xterm): DEFVAR_BOOL it.
(x_draw_glyph_string): Add comment to use it in future.
(x_draw_glyph_string): Restore clipping after drawing box.
Fix a computation of the underline position.
(w32_get_glyph_string_clip_rect): Minor cleanup.
(x_fill_stretch_glyph_string): Remove an assertion.
(x_produce_glyphs): Don't convert multibyte characters
to unibyte characters in unibyte buffers.
(cursor_in_mouse_face_p): New function.
(x_draw_stretch_glyph_string): Use it to choose a different GC
when drawing a cursor within highlighted text. Don't draw
background again if it has already been drawn.
(x_draw_glyph_string_box): Don't draw a full-width
box just because the glyph row's full_width_p flag is set.
(x_draw_glyphs): Fix computation of rightmost x for full-width rows.
(x_dump_glyph_string): Put in #if GLYPH_DEBUG.
(w32_draw_relief_rect): Extend left shadow to the bottom and left;
change bottom shadow accordingly. Some cleanup.
(x_update_window_end): Handle overwritten mouse face
also for tool bar windows.
(show_mouse_face): Set the glyph row's mouse_face_p flag also when
DRAW is DRAW_IMAGE_RAISED.
(clear_mouse_face): Return 1 if text with mouse face was
actually redrawn. Make the function static. Reset
dpyinfo->mouse_face_overlay otherwise note_mouse_highlight might
optimize away highlighting if we pass over that same overlay again.
(note_mouse_highlight): Call mouse_face_overlay_overlaps
to detect a case where we have to highlight a different region
despite not having left the currently highlighted region.
Set mouse_face_overlay in the x_display_info. Avoid changing the
mouse pointer shape when show_mouse_face has already done it, or
there is no need. Handle mouse-face and help-echo in strings.
(glyph_rect): New function.
(w32_mouse_position): Use it to raise the threshold for mouse
movement event generation.
(w32_initialize_display_info): Initialize the x_display_info's
mouse_face_overlay.
(w32_set_vertical_scroll_bar): Don't clear a zero height or width area.
(w32_set_vertical_scroll_bar, x_scroll_bar_create): Don't configure
a widget to zero height.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Sun, 21 Oct 2001 15:20:03 +0000 |
parents | bd1d7d04426c |
children | 19880a4faa73 |
line wrap: on
line source
;;; -*- Mode: lisp -*- ; load in the c functions (removeaddress '_signal) (removeaddress '_switch_to_proc) (removeaddress '_set_proc_str) (cfasl "/src/mdc/ledit/leditcfns.o" '_switch_to_proc 'emacs) (getaddress '_set_proc_str 'set_proc_str) (declare (special *ledit-infile* ; emacs->lisp tempfile *ledit-outfile* ; lisp->emacs tempfile *ledit-ppfile* ; pp->emacs tempfile *ledit-lisztfile* ; compiler input *ledit-objfile* ; compiler output *ledit-initialized*) ; flag ) (setq *ledit-initialized* nil) ;;; INIT-LEDIT (defun init-ledit () (let ((user (getenv '|USER|))) ;USER must be uppercase (setq *ledit-outfile* (concat "/tmp/" user ".l2") ; lisp -> emacs *ledit-infile* (concat "/tmp/" user ".l1") ; emacs -> lisp *ledit-ppfile* (concat "/tmp/" user ".l3") ; pp output to emacs. *ledit-lisztfile* (concat "/tmp/" user ".l4") *ledit-objfile* (concat "/tmp/" user ".o") *ledit-initialized* t))) ;;; LEDIT ; if 1 arg, arg is taken as a tag name to pass to emacs. ; if 2 args, second arg is a keyword. If 2nd arg is pp, ; pp is applied to first arg, and result is sent to emacs ; to put in a buffer called LEDIT (which is first erased.) (defun ledit fexpr (args) (apply #'ledit* args)) ;;; LEDIT* (defun ledit* n (if (not *ledit-initialized*) (init-ledit)) (ledit-output (listify n)) (syscall 10. *ledit-infile*) ; syscall 10 is "delete" (syscall 10. *ledit-lisztfile*) (emacs) (ledit-input) (syscall 10. *ledit-outfile*) (syscall 10. *ledit-ppfile*) t) ;;; LEDIT-OUTPUT ;;; Egad, what a mess! Doesn't work for XEMACS yet. ;;; Here's an example from Mocklisp: ;;; -> (defun bar (nothing) (bar nothing)) ;;; bar ;;; -> (ledit bar) ;;; should produce... ;;; (progn) (progn tag (setq tag "bar") (&goto-tag)) ;;; and ;;; -> (ledit bar pp) ;;; should stuff this to emacs... ;;; (progn) (switch-to-buffer "LEDIT") (erase-buffer) ;;; (insert-file "/tmp/walter.l3") (lisp-mode) ;;; and this... ;;; (def bar ;;; (lambda (x) ;;; (bar nothing))) ;;; into *LEDIT* (defun ledit-output (args) (if args (let ((ofile (outfile *ledit-outfile*))) (format ofile "(progn)") ; this is necessary. (cond ((null (cdr args)) ; no keyword -> arg is a tag. (format ofile "(progn tag (setq tag \"~A\"~ (&goto-tag))" (car args))) ((eq (cadr args) 'pp) ; pp-> pp first arg to emacs (apply 'pp `((|F| ,*ledit-ppfile*) ,(car args))) (format ofile "(switch-to-buffer \"LEDIT\")~ (erase-buffer)") (format ofile "(insert-file \"~A\")" *ledit-ppfile*) (format ofile "(lisp-mode)")) (t (format t "~&~A -- unknown option~%" (cdr args)))) (close ofile)))) ;;; LISZT* ;;; Need this guy to do compile-input. ;;; Liszt returns 0 if all was well. ;;; Note that in ordinary use the user will have to get used to looking ;;; at "%Warning: ... Compiler declared *foo* special" messages, since ;;; you don't usually want to hunt around in your file, zap in the the ;;; declarations, then go back to what you were doing. ;;; Fortunately this doesn't cause the compiler to bomb. ;;; Some sleepless night I will think of a way to get around this. (defun liszt* (&rest args) (apply #'liszt args)) ;;; LEDIT-INPUT ;;; Although there are two cases here, in practice ;;; it is never the case that there is both input to be ;;; interpreted and input to be compiled. (defun ledit-input () (if (probef *ledit-lisztfile*) (cond ((getd #'liszt) (format t ";Compiling LEDIT:") (and (zerop (liszt* *ledit-lisztfile* '-o *ledit-objfile*)) (load *ledit-objfile*))) (t (format t ";Can't compile LEDIT: No liszt.~%;Reading instead:") (let ((ifile (infile *ledit-lisztfile*))) (ledit-load ifile) (close ifile))))) (if (probef *ledit-infile*) (let ((ifile (infile *ledit-infile*))) (format t ";Reading from LEDIT:~%") (ledit-load ifile) (close ifile)))) ;;; LEDIT-LOAD ;;; A generally useful form of load (defun ledit-load (ifile) (let ((eof-form (list 'eof-form))) (do ((form (read ifile eof-form) (read ifile eof-form))) ((eq form eof-form)) (format t "; ~A~%" (eval form))))) (setsyntax #/ 'macro 'ledit) ; make ^E = (ledit)<return> ;; more robust version of the c function set_proc_str. Does argument checking. ;; set_proc_str sets the string that is stuffed to the tty after franz pauses ;; and the csh wakes up. It is usually "%emacs" or "%vemacs" or "%?emacs" (defun set-proc-str (arg) (if (stringp arg) (set_proc_str arg) (if (symbolp arg) (set_proc_str (get-pname arg)) (error arg " is illegal argument to set-proc-str"))))