sys

Check-in [4df5046475]
Login

Check-in [4df5046475]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:zwei/mouse.lisp: De-quote keywords.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 4df50464758bdc893c1823a081372c9457ac7b272dbb507dae01cd71cc8bd1be
User & Date: ams 2025-05-15 18:52:54
Context
2025-05-15
18:52
zwei/nprim.lisp: De-quote keywords. check-in: 49168e38d4 user: ams tags: trunk
18:52
zwei/mouse.lisp: De-quote keywords. check-in: 4df5046475 user: ams tags: trunk
18:52
zwei/modes.lisp: De-quote keywords. check-in: f9e5fcaed9 user: ams tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to zwei/mouse.lisp.

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

;;; Called by the editor to initialize the mouse
(DEFUN INITIALIZE-MOUSE (&AUX (INHIBIT-SCHEDULING-FLAG T))
  (AND (BOUNDP '*MOUSE-CHAR-BLINKER*)
       (TV:OPEN-BLINKER *MOUSE-CHAR-BLINKER*))
  (SETQ *MOUSE-P* NIL
	*MOUSE-CHAR-BLINKER* (TV:MAKE-BLINKER TV:MOUSE-SHEET 'TV:CHARACTER-BLINKER
					      ':VISIBILITY NIL
					      ':HALF-PERIOD 4
					      ':FONT TV:(SCREEN-DEFAULT-FONT DEFAULT-SCREEN)
					      ':CHAR #/?)
	*MOUSE-BOX-BLINKER* (TV:MAKE-BLINKER TV:MOUSE-SHEET 'TV:HOLLOW-RECTANGULAR-BLINKER
					     ':VISIBILITY NIL)
	*MOUSE-BLINKER* *MOUSE-BOX-BLINKER*
	*GLOBAL-MOUSE-CHAR-BLINKER* (TV:MAKE-BLINKER TV:MOUSE-SHEET
						     'TV:HOLLOW-RECTANGULAR-BLINKER
						     ':VISIBILITY NIL
						     ':HALF-PERIOD 4)
	*GLOBAL-MOUSE-CHAR-BLINKER-HANDLER* NIL
	*GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING* NIL))

;;;Wait for the mouse to do something, return non-nil if released buttons or left window
;;;LAST-X, LAST-Y are relative to the inside of the window (like *MOUSE-X*, *MOUSE-Y*).
(DEFUN WAIT-FOR-MOUSE (LAST-X LAST-Y &OPTIONAL MAX-SPEED)
  "Wait for the mouse to move from LAST-X, LAST-Y, or for all buttons to be released.







|
|
|
|

|



|
|







35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

;;; Called by the editor to initialize the mouse
(DEFUN INITIALIZE-MOUSE (&AUX (INHIBIT-SCHEDULING-FLAG T))
  (AND (BOUNDP '*MOUSE-CHAR-BLINKER*)
       (TV:OPEN-BLINKER *MOUSE-CHAR-BLINKER*))
  (SETQ *MOUSE-P* NIL
	*MOUSE-CHAR-BLINKER* (TV:MAKE-BLINKER TV:MOUSE-SHEET 'TV:CHARACTER-BLINKER
					      :VISIBILITY NIL
					      :HALF-PERIOD 4
					      :FONT TV:(SCREEN-DEFAULT-FONT DEFAULT-SCREEN)
					      :CHAR #/?)
	*MOUSE-BOX-BLINKER* (TV:MAKE-BLINKER TV:MOUSE-SHEET 'TV:HOLLOW-RECTANGULAR-BLINKER
					     :VISIBILITY NIL)
	*MOUSE-BLINKER* *MOUSE-BOX-BLINKER*
	*GLOBAL-MOUSE-CHAR-BLINKER* (TV:MAKE-BLINKER TV:MOUSE-SHEET
						     'TV:HOLLOW-RECTANGULAR-BLINKER
						     :VISIBILITY NIL
						     :HALF-PERIOD 4)
	*GLOBAL-MOUSE-CHAR-BLINKER-HANDLER* NIL
	*GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING* NIL))

;;;Wait for the mouse to do something, return non-nil if released buttons or left window
;;;LAST-X, LAST-Y are relative to the inside of the window (like *MOUSE-X*, *MOUSE-Y*).
(DEFUN WAIT-FOR-MOUSE (LAST-X LAST-Y &OPTIONAL MAX-SPEED)
  "Wait for the mouse to move from LAST-X, LAST-Y, or for all buttons to be released.
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
  (DECLARE (SPECIAL READ-FUNCTION-NAME-MUST-BE-DEFINED
		    READ-FUNCTION-NAME-OLD-GLOBAL-MOUSE-CHAR-BLINKER-HANDLER
		    READ-FUNCTION-NAME-OLD-GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING
		    READ-FUNCTION-NAME-OLD-MOUSE-FONT-CHAR
		    READ-FUNCTION-NAME-OLD-MOUSE-X-OFFSET
		    READ-FUNCTION-NAME-OLD-MOUSE-Y-OFFSET))
  (flet ((revert-blinker ()
	  (SEND *GLOBAL-MOUSE-CHAR-BLINKER* ':SET-VISIBILITY NIL)
	  (SETQ *GLOBAL-MOUSE-CHAR-BLINKER-HANDLER*
		READ-FUNCTION-NAME-OLD-GLOBAL-MOUSE-CHAR-BLINKER-HANDLER
		*GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING*
		READ-FUNCTION-NAME-OLD-GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING
		*MOUSE-HOOK* NIL
		*MOUSE-FONT-CHAR*
		READ-FUNCTION-NAME-OLD-MOUSE-FONT-CHAR
		*MOUSE-X-OFFSET*
		READ-FUNCTION-NAME-OLD-MOUSE-X-OFFSET
		*MOUSE-Y-OFFSET*
		READ-FUNCTION-NAME-OLD-MOUSE-Y-OFFSET)
	   (TV:MOUSE-SET-BLINKER-DEFINITION ':CHARACTER *MOUSE-X-OFFSET* *MOUSE-Y-OFFSET*
					    ':ON ':SET-CHARACTER *MOUSE-FONT-CHAR*)))
    (COND ((AND (NEQ CHAR-OR-T T)
		(BP-= (INTERVAL-FIRST-BP (WINDOW-INTERVAL *MINI-BUFFER-WINDOW*))
		      (INTERVAL-LAST-BP (WINDOW-INTERVAL *MINI-BUFFER-WINDOW*))))
	   (SETQ *GLOBAL-MOUSE-CHAR-BLINKER-HANDLER*
		 (IF READ-FUNCTION-NAME-MUST-BE-DEFINED
		     'BLINK-FUNCTION
		   'BLINK-ATOM)
		 *GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING*
		 "Click left on highlighted name to select it, right to pull into mini-buffer"
		 *MOUSE-HOOK*
		 #'(LAMBDA (WINDOW CHAR IGNORE IGNORE &AUX TEM)
		     (case CHAR
		       (#/MOUSE-1-1
			(MULTIPLE-VALUE-BIND (FCTN LINE START END)
			    (ATOM-UNDER-MOUSE WINDOW)
			  (WHEN (AND LINE
				     (OR (FBOUNDP (SETQ TEM FCTN))
					 (GET TEM ':SOURCE-FILE-NAME)
					 (GET TEM 'ZMACS-BUFFERS)
					 (STRING-IN-AARRAY-P TEM *ZMACS-COMPLETION-AARRAY*)
					 (AND (NOT READ-FUNCTION-NAME-MUST-BE-DEFINED) TEM)))
			    (LET ((INT (WINDOW-INTERVAL *MINI-BUFFER-WINDOW*)))
			      (DELETE-INTERVAL INT)
			      (INSERT (INTERVAL-FIRST-BP INT) LINE START END))
			    (revert-blinker)
			    (*THROW 'RETURN-FROM-COMMAND-LOOP
				    (SUBSTRING LINE START END)))))
		       (#/MOUSE-3-1
			(MULTIPLE-VALUE-BIND (FCTN LINE START END)
			    (ATOM-UNDER-MOUSE WINDOW)
			  (WHEN (AND LINE
				     (OR (FBOUNDP (SETQ TEM FCTN))
					 (GET TEM ':SOURCE-FILE-NAME)
					 (GET TEM 'ZMACS-BUFFERS)
					 (STRING-IN-AARRAY-P TEM *ZMACS-COMPLETION-AARRAY*)
					 (AND (NOT READ-FUNCTION-NAME-MUST-BE-DEFINED) TEM)))
			    (LET ((INT (WINDOW-INTERVAL *MINI-BUFFER-WINDOW*)))
			      (DELETE-INTERVAL INT)
			      (move-bp (window-point *mini-buffer-window*)
				       (INSERT (INTERVAL-FIRST-BP INT) LINE START END)))
			    (must-redisplay *mini-buffer-window* dis-text)
			    (revert-blinker)
			    (throw 'zwei-command-loop nil))))))
		 *MOUSE-FONT-CHAR* 0
		 *MOUSE-X-OFFSET* 4
		 *MOUSE-Y-OFFSET* 0)
	   (TV:MOUSE-SET-BLINKER-DEFINITION ':CHARACTER *MOUSE-X-OFFSET* *MOUSE-Y-OFFSET*
					    ':ON ':SET-CHARACTER *MOUSE-FONT-CHAR*))
	  (T (revert-blinker)))
    (TV:MOUSE-WAKEUP)))

(DEFUN ATOM-UNDER-MOUSE (WINDOW &OPTIONAL CHAR X Y LINE INDEX &AUX SYMBOL END)
  "Returns the symbol which the mouse is pointing at in WINDOW.  NIL if not pointing at one.
Normally, CHAR, X, Y, LINE, and INDEX are set from the mouse position.
If you pass them, then the mouse position is irrelevant.







|











|
|

















|














|













|
|







307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
  (DECLARE (SPECIAL READ-FUNCTION-NAME-MUST-BE-DEFINED
		    READ-FUNCTION-NAME-OLD-GLOBAL-MOUSE-CHAR-BLINKER-HANDLER
		    READ-FUNCTION-NAME-OLD-GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING
		    READ-FUNCTION-NAME-OLD-MOUSE-FONT-CHAR
		    READ-FUNCTION-NAME-OLD-MOUSE-X-OFFSET
		    READ-FUNCTION-NAME-OLD-MOUSE-Y-OFFSET))
  (flet ((revert-blinker ()
	  (SEND *GLOBAL-MOUSE-CHAR-BLINKER* :SET-VISIBILITY NIL)
	  (SETQ *GLOBAL-MOUSE-CHAR-BLINKER-HANDLER*
		READ-FUNCTION-NAME-OLD-GLOBAL-MOUSE-CHAR-BLINKER-HANDLER
		*GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING*
		READ-FUNCTION-NAME-OLD-GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING
		*MOUSE-HOOK* NIL
		*MOUSE-FONT-CHAR*
		READ-FUNCTION-NAME-OLD-MOUSE-FONT-CHAR
		*MOUSE-X-OFFSET*
		READ-FUNCTION-NAME-OLD-MOUSE-X-OFFSET
		*MOUSE-Y-OFFSET*
		READ-FUNCTION-NAME-OLD-MOUSE-Y-OFFSET)
	   (TV:MOUSE-SET-BLINKER-DEFINITION :CHARACTER *MOUSE-X-OFFSET* *MOUSE-Y-OFFSET*
					    :ON :SET-CHARACTER *MOUSE-FONT-CHAR*)))
    (COND ((AND (NEQ CHAR-OR-T T)
		(BP-= (INTERVAL-FIRST-BP (WINDOW-INTERVAL *MINI-BUFFER-WINDOW*))
		      (INTERVAL-LAST-BP (WINDOW-INTERVAL *MINI-BUFFER-WINDOW*))))
	   (SETQ *GLOBAL-MOUSE-CHAR-BLINKER-HANDLER*
		 (IF READ-FUNCTION-NAME-MUST-BE-DEFINED
		     'BLINK-FUNCTION
		   'BLINK-ATOM)
		 *GLOBAL-MOUSE-CHAR-BLINKER-DOCUMENTATION-STRING*
		 "Click left on highlighted name to select it, right to pull into mini-buffer"
		 *MOUSE-HOOK*
		 #'(LAMBDA (WINDOW CHAR IGNORE IGNORE &AUX TEM)
		     (case CHAR
		       (#/MOUSE-1-1
			(MULTIPLE-VALUE-BIND (FCTN LINE START END)
			    (ATOM-UNDER-MOUSE WINDOW)
			  (WHEN (AND LINE
				     (OR (FBOUNDP (SETQ TEM FCTN))
					 (GET TEM :SOURCE-FILE-NAME)
					 (GET TEM 'ZMACS-BUFFERS)
					 (STRING-IN-AARRAY-P TEM *ZMACS-COMPLETION-AARRAY*)
					 (AND (NOT READ-FUNCTION-NAME-MUST-BE-DEFINED) TEM)))
			    (LET ((INT (WINDOW-INTERVAL *MINI-BUFFER-WINDOW*)))
			      (DELETE-INTERVAL INT)
			      (INSERT (INTERVAL-FIRST-BP INT) LINE START END))
			    (revert-blinker)
			    (*THROW 'RETURN-FROM-COMMAND-LOOP
				    (SUBSTRING LINE START END)))))
		       (#/MOUSE-3-1
			(MULTIPLE-VALUE-BIND (FCTN LINE START END)
			    (ATOM-UNDER-MOUSE WINDOW)
			  (WHEN (AND LINE
				     (OR (FBOUNDP (SETQ TEM FCTN))
					 (GET TEM :SOURCE-FILE-NAME)
					 (GET TEM 'ZMACS-BUFFERS)
					 (STRING-IN-AARRAY-P TEM *ZMACS-COMPLETION-AARRAY*)
					 (AND (NOT READ-FUNCTION-NAME-MUST-BE-DEFINED) TEM)))
			    (LET ((INT (WINDOW-INTERVAL *MINI-BUFFER-WINDOW*)))
			      (DELETE-INTERVAL INT)
			      (move-bp (window-point *mini-buffer-window*)
				       (INSERT (INTERVAL-FIRST-BP INT) LINE START END)))
			    (must-redisplay *mini-buffer-window* dis-text)
			    (revert-blinker)
			    (throw 'zwei-command-loop nil))))))
		 *MOUSE-FONT-CHAR* 0
		 *MOUSE-X-OFFSET* 4
		 *MOUSE-Y-OFFSET* 0)
	   (TV:MOUSE-SET-BLINKER-DEFINITION :CHARACTER *MOUSE-X-OFFSET* *MOUSE-Y-OFFSET*
					    :ON :SET-CHARACTER *MOUSE-FONT-CHAR*))
	  (T (revert-blinker)))
    (TV:MOUSE-WAKEUP)))

(DEFUN ATOM-UNDER-MOUSE (WINDOW &OPTIONAL CHAR X Y LINE INDEX &AUX SYMBOL END)
  "Returns the symbol which the mouse is pointing at in WINDOW.  NIL if not pointing at one.
Normally, CHAR, X, Y, LINE, and INDEX are set from the mouse position.
If you pass them, then the mouse position is irrelevant.
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
				    (*print-base* *print-base*)
				    (*readtable* *readtable*)
				    (READ-PRESERVE-DELIMITERS T)
				    (INTERVAL (WINDOW-INTERVAL WINDOW)))
				(COMPUTE-BUFFER-PACKAGE INTERVAL)
				(MULTIPLE-VALUE (SYMBOL END)
				  (CLI:READ-FROM-STRING LINE NIL NIL
							':START (SETQ I (1+ I))
							':PRESERVE-WHITESPACE T))
				(SETQ END (MIN (ARRAY-ACTIVE-LENGTH LINE) END)))
			      NIL)
		 (SYMBOLP SYMBOL)
		 (VALUES SYMBOL LINE I END))))))

;;; This blinks functions that you point to
;;; This maximum speed thing is a crock, since the mouse can be moving fast







|
|







399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
				    (*print-base* *print-base*)
				    (*readtable* *readtable*)
				    (READ-PRESERVE-DELIMITERS T)
				    (INTERVAL (WINDOW-INTERVAL WINDOW)))
				(COMPUTE-BUFFER-PACKAGE INTERVAL)
				(MULTIPLE-VALUE (SYMBOL END)
				  (CLI:READ-FROM-STRING LINE NIL NIL
							:START (SETQ I (1+ I))
							:PRESERVE-WHITESPACE T))
				(SETQ END (MIN (ARRAY-ACTIVE-LENGTH LINE) END)))
			      NIL)
		 (SYMBOLP SYMBOL)
		 (VALUES SYMBOL LINE I END))))))

;;; This blinks functions that you point to
;;; This maximum speed thing is a crock, since the mouse can be moving fast
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
	(T
	 (MULTIPLE-VALUE (SYMBOL NIL BEG END)
	   (ATOM-UNDER-MOUSE WINDOW CHAR X Y LINE INDEX))
	 (COND ((AND (NOT (NULL BEG))
		     (OR NOT-DEFINED-OK
			 (FBOUNDP SYMBOL)
			 (GET SYMBOL 'ZMACS-BUFFERS)
			 (GET SYMBOL ':SOURCE-FILE-NAME)
			 (STRING-IN-AARRAY-P SYMBOL *ZMACS-COMPLETION-AARRAY*)))
		(SETQ SHEET (WINDOW-SHEET WINDOW))
		(TV:BLINKER-SET-SHEET BLINKER SHEET)
		(SHEET-SET-BLINKER-CURSORPOS SHEET BLINKER
					     (- X (TV:SHEET-STRING-LENGTH SHEET LINE BEG
									  INDEX))
					     Y)







|







424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
	(T
	 (MULTIPLE-VALUE (SYMBOL NIL BEG END)
	   (ATOM-UNDER-MOUSE WINDOW CHAR X Y LINE INDEX))
	 (COND ((AND (NOT (NULL BEG))
		     (OR NOT-DEFINED-OK
			 (FBOUNDP SYMBOL)
			 (GET SYMBOL 'ZMACS-BUFFERS)
			 (GET SYMBOL :SOURCE-FILE-NAME)
			 (STRING-IN-AARRAY-P SYMBOL *ZMACS-COMPLETION-AARRAY*)))
		(SETQ SHEET (WINDOW-SHEET WINDOW))
		(TV:BLINKER-SET-SHEET BLINKER SHEET)
		(SHEET-SET-BLINKER-CURSORPOS SHEET BLINKER
					     (- X (TV:SHEET-STRING-LENGTH SHEET LINE BEG
									  INDEX))
					     Y)
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475

;;; The commands themselves

;;; Single click on the left button.
(DEFPROP COM-MOUSE-MARK-REGION "Move point" :MOUSE-SHORT-DOCUMENTATION)
(DEFCOM COM-MOUSE-MARK-REGION "Jump point and mark to where the mouse is.
Then as the mouse is moved with the button held down point follows the mouse." (KM)
  (REDISPLAY *WINDOW* ':NONE)
  (LET ((POINT (POINT))
	(MARK (MARK))
	(OLD-REGION-P (WINDOW-MARK-P *WINDOW*))
	(BP (MOUSE-BP *WINDOW* *MOUSE-X* *MOUSE-Y*)))
    (MOVE-BP MARK BP)
    (SETF (WINDOW-MARK-P *WINDOW*) T)
    (DO ((LAST-X *MOUSE-X*)
	 (LAST-Y *MOUSE-Y*))
	(NIL)
      (MOVE-BP POINT BP)
      (MUST-REDISPLAY *WINDOW* DIS-BPS)
      (REDISPLAY *WINDOW* ':POINT)
      (OR (WAIT-FOR-MOUSE LAST-X LAST-Y) (RETURN NIL))
      (MULTIPLE-VALUE (LAST-X LAST-Y) (MOUSE-POSITION))
      (SETQ BP (MOUSE-BP *WINDOW* LAST-X LAST-Y)))
    (AND (BP-= POINT MARK)
	 (SETF (WINDOW-MARK-P *WINDOW*) OLD-REGION-P)))
    DIS-NONE)








|











|







449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475

;;; The commands themselves

;;; Single click on the left button.
(DEFPROP COM-MOUSE-MARK-REGION "Move point" :MOUSE-SHORT-DOCUMENTATION)
(DEFCOM COM-MOUSE-MARK-REGION "Jump point and mark to where the mouse is.
Then as the mouse is moved with the button held down point follows the mouse." (KM)
  (REDISPLAY *WINDOW* :NONE)
  (LET ((POINT (POINT))
	(MARK (MARK))
	(OLD-REGION-P (WINDOW-MARK-P *WINDOW*))
	(BP (MOUSE-BP *WINDOW* *MOUSE-X* *MOUSE-Y*)))
    (MOVE-BP MARK BP)
    (SETF (WINDOW-MARK-P *WINDOW*) T)
    (DO ((LAST-X *MOUSE-X*)
	 (LAST-Y *MOUSE-Y*))
	(NIL)
      (MOVE-BP POINT BP)
      (MUST-REDISPLAY *WINDOW* DIS-BPS)
      (REDISPLAY *WINDOW* :POINT)
      (OR (WAIT-FOR-MOUSE LAST-X LAST-Y) (RETURN NIL))
      (MULTIPLE-VALUE (LAST-X LAST-Y) (MOUSE-POSITION))
      (SETQ BP (MOUSE-BP *WINDOW* LAST-X LAST-Y)))
    (AND (BP-= POINT MARK)
	 (SETF (WINDOW-MARK-P *WINDOW*) OLD-REGION-P)))
    DIS-NONE)

491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
                   ((AND PX
			 (< (+ (^ (- LAST-X PX) 2) (^ (- LAST-Y PY) 2))
			    (+ (^ (- LAST-X MX) 2) (^ (- LAST-Y MY) 2))))
                    (POINT))
                   (T
                    (SETQ PX MX PY MY)
                    (MARK))))
    (FUNCALL SHEET ':SET-MOUSE-CURSORPOS
		   (+ PX (FLOOR (TV:SHEET-CHAR-WIDTH SHEET) 2))
		   (+ PY (FLOOR (* 3 (TV:SHEET-LINE-HEIGHT SHEET)) 4)))
    (DO ()
        (NIL)
      (OR (WAIT-FOR-MOUSE LAST-X LAST-Y) (RETURN NIL))
      (MULTIPLE-VALUE (LAST-X LAST-Y) (MOUSE-POSITION))
      (SETQ BP1 (MOUSE-BP *WINDOW* LAST-X LAST-Y))
      (MOVE-BP BP BP1)
      (MUST-REDISPLAY *WINDOW* DIS-BPS)
      (REDISPLAY *WINDOW* ':POINT)))
  DIS-NONE)

(DEFPROP COM-MOUSE-MARK-THING "Mark thing" :MOUSE-SHORT-DOCUMENTATION)
(DEFCOM COM-MOUSE-MARK-THING "Mark the thing you are pointing at." (SM)
  (DO ((POINT (POINT))
       (MARK (MARK))
       (LAST-X *MOUSE-X*)







|









|







491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
                   ((AND PX
			 (< (+ (^ (- LAST-X PX) 2) (^ (- LAST-Y PY) 2))
			    (+ (^ (- LAST-X MX) 2) (^ (- LAST-Y MY) 2))))
                    (POINT))
                   (T
                    (SETQ PX MX PY MY)
                    (MARK))))
    (FUNCALL SHEET :SET-MOUSE-CURSORPOS
		   (+ PX (FLOOR (TV:SHEET-CHAR-WIDTH SHEET) 2))
		   (+ PY (FLOOR (* 3 (TV:SHEET-LINE-HEIGHT SHEET)) 4)))
    (DO ()
        (NIL)
      (OR (WAIT-FOR-MOUSE LAST-X LAST-Y) (RETURN NIL))
      (MULTIPLE-VALUE (LAST-X LAST-Y) (MOUSE-POSITION))
      (SETQ BP1 (MOUSE-BP *WINDOW* LAST-X LAST-Y))
      (MOVE-BP BP BP1)
      (MUST-REDISPLAY *WINDOW* DIS-BPS)
      (REDISPLAY *WINDOW* :POINT)))
  DIS-NONE)

(DEFPROP COM-MOUSE-MARK-THING "Mark thing" :MOUSE-SHORT-DOCUMENTATION)
(DEFCOM COM-MOUSE-MARK-THING "Mark the thing you are pointing at." (SM)
  (DO ((POINT (POINT))
       (MARK (MARK))
       (LAST-X *MOUSE-X*)
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
	   (funcall (or (call-editing-type-function *major-mode*
						    'mark-thing-function
						    nil)
			'default-mark-thing)
		    POINT MARK CHAR LINE CHAR-POS)

	   (MUST-REDISPLAY *WINDOW* DIS-BPS)
	   (REDISPLAY *WINDOW* ':POINT)))
    (OR (WAIT-FOR-MOUSE LAST-X LAST-Y) (RETURN NIL))
    (MULTIPLE-VALUE (LAST-X LAST-Y) (MOUSE-POSITION)))
  DIS-NONE)

(DEFUN LISP-MARK-THING (POINT MARK CHAR LINE CHAR-POS)
  (ATOM-WORD-SYNTAX-BIND
    (SELECT (LIST-SYNTAX CHAR)







|







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
	   (funcall (or (call-editing-type-function *major-mode*
						    'mark-thing-function
						    nil)
			'default-mark-thing)
		    POINT MARK CHAR LINE CHAR-POS)

	   (MUST-REDISPLAY *WINDOW* DIS-BPS)
	   (REDISPLAY *WINDOW* :POINT)))
    (OR (WAIT-FOR-MOUSE LAST-X LAST-Y) (RETURN NIL))
    (MULTIPLE-VALUE (LAST-X LAST-Y) (MOUSE-POSITION)))
  DIS-NONE)

(DEFUN LISP-MARK-THING (POINT MARK CHAR LINE CHAR-POS)
  (ATOM-WORD-SYNTAX-BIND
    (SELECT (LIST-SYNTAX CHAR)
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
		   (OR (ZEROP (BP-INDEX BP2))
		       (SETQ END-LINE (LINE-NEXT END-LINE)))))
          (T
	   (SETQ START-LINE (BP-LINE POINT)
		 END-LINE (LINE-NEXT START-LINE))))
    (MULTIPLE-VALUE-BIND (X Y)
        (FIND-BP-IN-WINDOW-COORDS (FORWARD-OVER *BLANKS* (BEG-OF-LINE START-LINE)) *WINDOW*)
    (FUNCALL SHEET ':SET-MOUSE-CURSORPOS X Y))
    (process-wait "Mouse" #'(lambda () (not (zerop (tv:mouse-buttons)))))
    (DO ((LAST-X)
	 (LAST-Y)
	 (BP (COPY-BP POINT))
         (DELTA))
	(NIL)
      (MULTIPLE-VALUE (LAST-X LAST-Y) (MOUSE-POSITION))
      (SETQ DELTA (LINE-INDENTATION START-LINE SHEET))
      (MOVE-BP BP START-LINE 0)
      (INDENT-LINE BP (MAX 0 LAST-X) SHEET)
      (SETQ DELTA (- (LINE-INDENTATION START-LINE SHEET) DELTA))
      (OR (= DELTA 0)
	      (DO ((LINE START-LINE (LINE-NEXT LINE)))
              ((EQ LINE END-LINE))
            (AND (NEQ LINE START-LINE)
                 (INDENT-LINE (MOVE-BP BP LINE 0)
                              (MAX 0 (+ DELTA (LINE-INDENTATION LINE SHEET))) SHEET))))
      (MUST-REDISPLAY *WINDOW* DIS-TEXT)
      (REDISPLAY *WINDOW* ':POINT nil nil t)
      (wait-for-mouse last-x last-y 10)
      (when (zerop (tv:mouse-buttons)) (return))))
  DIS-TEXT)

;;; *** This should figure out some other kind of mouse-blinker ***
(DEFCOM COM-MOUSE-INDENT-UNDER "Indent the current line as selected by the mouse." (KM)
  (LET ((CH (FUNCALL STANDARD-INPUT ':MOUSE-OR-KBD-TYI)))
    (COND ((= CH #/MOUSE-1-1)
	   (INDENT-LINE (POINT) (BP-INDENTATION (MOUSE-BP *WINDOW*)))
	   (INDENT-BP-ADJUSTMENT (POINT))
	   DIS-TEXT)
	  (T
	   (FUNCALL STANDARD-INPUT ':UNTYI CH)
           (COM-INDENT-UNDER)))))







|


















|






|





|

652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
		   (OR (ZEROP (BP-INDEX BP2))
		       (SETQ END-LINE (LINE-NEXT END-LINE)))))
          (T
	   (SETQ START-LINE (BP-LINE POINT)
		 END-LINE (LINE-NEXT START-LINE))))
    (MULTIPLE-VALUE-BIND (X Y)
        (FIND-BP-IN-WINDOW-COORDS (FORWARD-OVER *BLANKS* (BEG-OF-LINE START-LINE)) *WINDOW*)
    (FUNCALL SHEET :SET-MOUSE-CURSORPOS X Y))
    (process-wait "Mouse" #'(lambda () (not (zerop (tv:mouse-buttons)))))
    (DO ((LAST-X)
	 (LAST-Y)
	 (BP (COPY-BP POINT))
         (DELTA))
	(NIL)
      (MULTIPLE-VALUE (LAST-X LAST-Y) (MOUSE-POSITION))
      (SETQ DELTA (LINE-INDENTATION START-LINE SHEET))
      (MOVE-BP BP START-LINE 0)
      (INDENT-LINE BP (MAX 0 LAST-X) SHEET)
      (SETQ DELTA (- (LINE-INDENTATION START-LINE SHEET) DELTA))
      (OR (= DELTA 0)
	      (DO ((LINE START-LINE (LINE-NEXT LINE)))
              ((EQ LINE END-LINE))
            (AND (NEQ LINE START-LINE)
                 (INDENT-LINE (MOVE-BP BP LINE 0)
                              (MAX 0 (+ DELTA (LINE-INDENTATION LINE SHEET))) SHEET))))
      (MUST-REDISPLAY *WINDOW* DIS-TEXT)
      (REDISPLAY *WINDOW* :POINT nil nil t)
      (wait-for-mouse last-x last-y 10)
      (when (zerop (tv:mouse-buttons)) (return))))
  DIS-TEXT)

;;; *** This should figure out some other kind of mouse-blinker ***
(DEFCOM COM-MOUSE-INDENT-UNDER "Indent the current line as selected by the mouse." (KM)
  (LET ((CH (FUNCALL STANDARD-INPUT :MOUSE-OR-KBD-TYI)))
    (COND ((= CH #/MOUSE-1-1)
	   (INDENT-LINE (POINT) (BP-INDENTATION (MOUSE-BP *WINDOW*)))
	   (INDENT-BP-ADJUSTMENT (POINT))
	   DIS-TEXT)
	  (T
	   (FUNCALL STANDARD-INPUT :UNTYI CH)
           (COM-INDENT-UNDER)))))