Commit d1efac4c authored by David Byers's avatar David Byers
Browse files

Improved tty menus-

Got rid of compiler warnings.
parent 4306f17e
......@@ -70,6 +70,15 @@
* Migreringsproblem och kompatibilitetsproblem
** Om man använder teckenkodning iso-8859-15 i Gnu Emacs 21.2 (och
kanske andra inställningar), något som verkar vara default i vissa
Linux-distributioner, så går det inte att slå upp mötesnamn som
innehåller tecken utanför ASCII. Anledningen till detta är att
Emacs inte klarar att översätta från iso-8859-15 till iso-8859-1,
som är den teckenkodning som oftast används ihop med LysKOM. Använd
M-x set-language-environment och välj iso-8859-1 för att ställa in
en språkomgivning.
** Den som har definierat en egen uppsättning färger behöver lägga
till några och se över definitionen av kom-first-line-face. Numera
appliceras kom-first-line-face även om den är identisk med default.
......@@ -204,12 +213,30 @@
*** Det finns ytterligare några uppsättningar färger att välja mellan.
*** Tryck M-m före ett kommando för att tillfälligt ändra om
återsekommandon läsmarkerar eller inte.
*** Kommandot M-x kom-apropos är bra för dig som vill hitta bland de
elispvariabler och elispfunktioner som elispklienten består av.
*** Återse omodifierat visar all tilläggsinformation på inlägg
(inklusive information av okänd sort) och inte bara en liten
delmängd.
*** Utfyllnad med mellanslag av kommandon har förbättrats avsevärt.
*** Det är lättare att välja alternativ i menyn man får upp när man
trycker = på t.ex. inläggsnummer i inläggsbufferten.
** LysKOM över SSH
*** Det går numera att tunnla LysKOM genom SSH alldeles automagiskt.
Koden är endast testad med OpenSSH och förväntar sig engelska
meddelanden på ett visst format. Sätt variabeln kom-ssh-relay-host
för att aktivera funktionen.
** FAQ-hantering
*** FAQer till ett möte visas som om de vore kommentarer till
......@@ -228,9 +255,6 @@
*** Prompten visar "Läsa nästa FAQ" när man håller på att återse
FAQer.
*** Kommandot M-x kom-apropos är bra för dig som vill hitta bland de
elispvariabler och elispfunktioner som elispklienten består av.
** Omdirigering av kommentarer
......@@ -307,6 +331,18 @@
** Nya inställningar
*** kom-presence-messages-in-echo-area ersätter kom-presence-messages,
som numera bara används internt i elispklienten (och som kan komma
att byta namn i nästa version av elispklienten).
*** kom-format-html-authors är en lista som anger vilka författare man
accepterar HTML-inlägg från (alternativt vilka man inte accepterar
HTML från). Användbart för att till exempel inte formattera HTML
som har importerats från e-mail.
*** kom-ssh-proxy-host anger vilken maskin man skall skapa en
ssh-tunnel till för att köra LysKOM genom.
*** kom-edit-hide-add-button anger om knappen [Addera...] ska visas
eller inte.
......@@ -524,38 +560,27 @@
** Anmärkningar kan inte längre innehålla radbrytningar.
** Content type sätts rätt på user-arean.
** Stora heltal konverteras till flyttal av vissa versioner av Emacs.
Detta hanteras nu korrekt.
* Förändringar från 0.47-BETA-1
** Formatet som FAQer listas på när man går till ett möte med olästa
FAQer ser bättre ut.
** Inlägg skrivna med ISO-8859-15 konverteras inte till ISO-8859-1
innan de skickas till servern.
** Elispklienten gissar defaultspråk baserat på första inloggningen om
man inte har satt kom-default-language innan man drar igång
klienten.
** Prompten för att addera dold kopia är nu rätt.
** Bindningen till 'a' är mer irriterande är förr.
** Elispklienten gnäller nu om man har variabler i user-arean som inte
borde finnas där.
** Bakgrundsfärgerna för inlägg räknas ut automatiskt, baserat på
Emacs bakgrundsfärg.
** Bindningarna fm för filtrera mottagare.
** Förkortningen av inlägg vid flytta träd tar hänsyn till att vissa
inlägg har väldigt långa rader. Förkorningen till N rader betyder N
skärmrader, inte radbrytningar.
** Hjälpfunktionen är helt omskriven. Nu är hjälptexterna XML-filer
som konverteras till Lisp-strukturer vid kompilering av klienten
(vilket alltså betyder att man inte får någon hjälp i en
okompilerad klient).
* Ytterligare förändringar sedan 0.47-BETA-2
** Lästa FAQer och liknande information läses om när man trycker R.
Detta avsnitt innehåller detaljförändringar som ingår i andra saker
som står ovanför men som kan vara intressanta för den som kör en
betaversion.
** Saknas det externa diff-kommandot så får man ett prydligare fel när
man kör kommandon som kräver det.
** Tunnling av KOM genom SSH integrerat. Se ovan.
** Om man kommenterade flera inlägg av samma författare så ville
klienten lägga till den författaren som mottagare mer än en gång.
Det vill den inte längre.
2002-06-29 David Byers <david.byers@swipnet.se>
* compatibility.el: Added declarations to avoid warnings about
set-specifier, make-specifier and color-rgb-components.
Eliminate warnings because of use of latin-unity:
* lyskom-rest.el (lyskom-format-text-body): Moved try-require
outside this function so it gets run when we load LysKOM. This
avoids a performance hit when the package is unavailable.
(latin-unity-remap-region): New declaration to avoid compiler
warnings.
(latin-unity-preferred-coding-system-list): New declaration.
(latin-unity-iso-8859-1-aliases): New declaration.
(latin-unity-cset-codesys-alist): New declaration.
(coding-system-property): New declaration.
Improve keyboard menus:
* keyboard-menu.el (lyskom-read-from-menu): Break out the code
that draws the menu to...
(lyskom-keyboard-menu-insert): New function. Format menus in as
many columns as possible.
(lyskom-keyboard-menu-format-item): New function to format a
single item.
(lyskom-read-from-menu): C-f and C-b do forward and backward. C-p
and C-n do up and down (not next and previous item). This means
navigation in the buffer is conventional. Added C-a and C-e.
(lyskom-keyboard-menu-up): Rewrote.
(lyskom-keyboard-menu-down): Rewrote.
(lyskom-keyboard-menu-forward): New command.
(lyskom-keyboard-menu-backward): New command.
(lyskom-keyboard-menu-beginning-of-line): New command.
(lyskom-keyboard-menu-end-of-line): New command.
2002-06-28 David Byers <david.byers@swipnet.se>
* keyboard-menu.el (lyskom-read-from-menu): Compute height of menu
window based on the contents and not the table. Display the menu
successfully even if there is no room to split the window.
(lyskom-keyboard-menu-highlight-selected): Recenter the menu
window if point is not visible.
2002-06-28 Ulrik Haugen <qha@lysator.liu.se>
* doc/NEWS-0.47: Updated to this point in ChangeLog in preparation
......
......@@ -86,6 +86,26 @@ of the lyskom-provide-* functions instead."
(cons (quote (, (car (cdr definition))))
lyskom-compatibility-definitions))))))))
(defmacro lyskom-compatibility-definition-ct (predicate definition)
"If PREDICATE is nil, evaluate DEFINITION at compile and run time.
Definition should be a function definition of some kind, with syntax
similar to defun or defmacro.
To simply define a function if it is not already defined, used one
of the lyskom-provide-* functions instead."
(` (progn ;(eval-when-compile
; (if (not (, predicate))
; (message "Compatibility %S for %S"
; (quote (, (car definition)))
; (quote (, (car (cdr definition)))))))
(eval-when-compile
(if (not (, predicate))
(progn
(, definition)
(setq lyskom-compatibility-definitions
(cons (quote (, (car (cdr definition))))
lyskom-compatibility-definitions))))))))
;;; ============================================================
;;; lyskom-provide
......@@ -141,7 +161,6 @@ of the lyskom-provide-* functions instead."
;;;
(lyskom-compatibility-definition
(condition-case nil
(or (equal (kbd (identity "<down-mouse-2>"))
[down-mouse-2])
......@@ -600,16 +619,22 @@ Otherwise treat \\ in NEWTEXT string as special:
(defun lyskom-color-values (color)
nil)
(lyskom-external-function set-specifier)
(lyskom-external-function make-specifier)
(lyskom-external-function color-rgb-components)
(lyskom-compatibility-definition (and (fboundp 'color-rgb-components)
(fboundp 'make-specifier))
(defun lyskom-color-values (color)
(when (stringp color)
(let ((spec nil))
(set-specifier (setq spec (make-specifier 'color)) color)
(setq color spec)))
(color-rgb-components color)))
(eval-and-compile
(cond ((fboundp 'color-values) (fset 'lyskom-color-values 'color-values))
((and (fboundp 'color-rgb-components)
(fboundp 'make-specifier))
(defun lyskom-color-values (color)
(when (stringp color)
(let ((spec nil))
(set-specifier (setq spec (make-specifier 'color)) color)
(setq color spec)))
(color-rgb-components color)))
(cond ((fboundp 'lyskom-color-values) nil)
((fboundp 'color-values) (fset 'lyskom-color-values 'color-values))
((fboundp 'x-color-values) (fset 'lyskom-color-values 'x-color-values))))
......
......@@ -44,7 +44,11 @@
(defvar lyskom-keyboard-menu-selection)
(defvar lyskom-keyboard-menu-overlay)
(defvar lyskom-keyboard-menu-keymap nil)
(defun lyskom-keyboard-menu-read-char (prompt)
"Read a single keyboard event from the keyboard.
Like read-event in Gnu Emacs or next-command-event in XEmacs."
(message prompt)
(sit-for 0)
(lyskom-xemacs-or-gnu
......@@ -56,7 +60,6 @@
(t nil))))
(read-event)))
(defun lyskom-keyboard-menu-keys-for-string (string)
"Return a list of suitable mnemonics for menu item STRING."
(let ((a-uc nil)
......@@ -122,6 +125,7 @@ same element's cdr."
(defun lyskom-keyboard-menu-highlight-selected ()
"Highlight the selected menu item"
(set-buffer lyskom-keyboard-menu-buffer)
(let ((pos (text-property-any (point-min)
(point-max)
......@@ -133,22 +137,76 @@ same element's cdr."
(set-extent-face lyskom-keyboard-menu-overlay nil)
(overlay-put lyskom-keyboard-menu-overlay 'face nil))
(goto-char (point-min)))
(t (lyskom-xemacs-or-gnu
(set-extent-endpoints lyskom-keyboard-menu-overlay
pos
(save-excursion (goto-char pos)
(end-of-line)
(1+ (point))))
(move-overlay lyskom-keyboard-menu-overlay
pos
(save-excursion (goto-char pos)
(end-of-line)
(1+ (point)))))
(t (let ((start pos)
(end (or (next-single-property-change
pos
'lyskom-keyboard-menu-item)
(point-max))))
(lyskom-xemacs-or-gnu
(set-extent-endpoints lyskom-keyboard-menu-overlay
start end)
(move-overlay lyskom-keyboard-menu-overlay
start end)))
(goto-char pos)
(lyskom-xemacs-or-gnu
(set-extent-face lyskom-keyboard-menu-overlay 'kom-mark-face)
(overlay-put lyskom-keyboard-menu-overlay
'face 'kom-mark-face))))))
'face 'kom-mark-face))))
(save-excursion
(unless (pos-visible-in-window-p pos)
(recenter)))))
(defun lyskom-keyboard-menu-format-item (item &optional pad-len)
"Format a single menu item as a string"
(let ((string (format "%s (%s)" (elt item 1) (elt item 0))))
(when (and pad-len (> pad-len (length string)))
(setq string (concat string (make-string (- pad-len (length string))
?\ ))))
(add-text-properties 0
(length string)
(list 'lyskom-keyboard-menu-item item)
string)
string))
(defun lyskom-keyboard-menu-insert (prompt menu)
"Insert the text-based representation of the menu.
PROMPT is the menu title and MENU is the menu data."
(let* ((line-length (apply 'max
(mapcar (lambda (x)
(+ (length (elt x 0))
(length (elt x 1))
3))
menu)))
(columns (/ (+ (window-width) 1)
(+ line-length 2)))
(dashes (make-string (+ (* line-length columns)
(* 2 (1- columns))) ?-))
(quit-item nil))
(insert (format "%s\n%s\n" prompt dashes))
(lyskom-traverse el menu
(if (null (elt el 2))
(setq quit-item el)
(let ((string (lyskom-keyboard-menu-format-item el line-length)))
(when (> (+ (current-column) (length string) 2) (window-width))
(insert "\n"))
(unless (bolp) (insert " "))
(insert string))))
(unless (bolp)
(insert "\n"))
(insert dashes)
(insert "\n")
(when quit-item
(insert (lyskom-keyboard-menu-format-item quit-item)))))
;;; ================================================================
;;; Interactive commands
;;;
(defun lyskom-read-from-menu (prompt table)
"Let the user select one of the values in TABLE.
......@@ -156,40 +214,27 @@ TABLE is an alist whose elements' cars are strings.
Returns the selected string."
(let* ((menu (lyskom-keyboard-menu-frob-table table))
(buffer (get-buffer-create "*Keyboard menu*"))
(line-length (apply 'max
(mapcar (lambda (x)
(+ (length (elt x 0))
(length (elt x 1))
3))
menu))))
(menu-window-height 0))
(save-excursion
;; Format the buffer
(set-buffer buffer)
(erase-buffer)
(insert (format "%s\n%s\n"
prompt
(make-string line-length ?-)))
(lyskom-traverse el menu
(unless (cdr (memq el menu))
(insert (make-string line-length ?-))
(insert "\n"))
(let ((start (point)))
(insert (format "%s (%s)\n" (elt el 1) (elt el 0)))
(add-text-properties start
(point)
(list 'lyskom-keyboard-menu-item el)
)))
(goto-char (point-min))
(lyskom-keyboard-menu-insert prompt menu)
(setq table (cons (cons nil nil) table))
(goto-char (point-min))
(setq menu-window-height (+ 2 (count-lines (point-min) (point-max))))
;; Display the window and do the thing
(save-window-excursion
(split-window (selected-window) (+ 5 (length table)))
(switch-to-buffer buffer)
(if (< (- (window-height (selected-window))
menu-window-height) 5)
(select-window
(display-buffer buffer t))
(split-window (selected-window) menu-window-height)
(switch-to-buffer buffer))
(let* ((lyskom-keyboard-menu-buffer buffer)
(lyskom-keyboard-menu-menu menu)
(lyskom-keyboard-menu-selection nil)
......@@ -214,45 +259,153 @@ Returns the selected string."
"")))))
(cond ((eq (lookup-key global-map (vector c)) 'keyboard-quit)
(keyboard-quit))
((eq c ?\C-a) (lyskom-keyboard-menu-beginning-of-line))
((eq c ?\C-e) (lyskom-keyboard-menu-end-of-line))
((or (eq c 'up)
(eq c ?\C-p)
(eq c ?\C-b)
(eq c 'left))
(eq c ?\C-p))
(lyskom-keyboard-menu-up))
((or (eq c ?\C-b)
(eq c 'left))
(lyskom-keyboard-menu-backward))
((or (eq c 'down)
(eq c ?\C-n)
(eq c ?\C-f)
(eq c 'right))
(eq c ?\C-n))
(lyskom-keyboard-menu-down))
((or (eq c ?\C-f)
(eq c 'right))
(lyskom-keyboard-menu-forward))
((or (eq c 'return)
(eq c ?\r)
(eq c ?\n))
(eq c ?\r)
(eq c ?\n))
(setq result lyskom-keyboard-menu-selection))
((and (characterp c)
(assoc (make-string 1 c)
lyskom-keyboard-menu-menu))
lyskom-keyboard-menu-menu))
(if kom-keyboard-menu-immediate-selection
(setq result (assoc (make-string 1 c)
lyskom-keyboard-menu-menu))
lyskom-keyboard-menu-menu))
(setq lyskom-keyboard-menu-selection
(assoc (make-string 1 c)
lyskom-keyboard-menu-menu))))))
lyskom-keyboard-menu-menu))))))
(when lyskom-keyboard-menu-selection
(setq lyskom-keyboard-menu-menu
(lyskom-rotate-list lyskom-keyboard-menu-menu
lyskom-keyboard-menu-selection))))
(quit (setq result nil)))
(elt result 2)
)))))
)))))
(defun lyskom-keyboard-menu-up ()
"Move up one menu item"
(interactive)
(setq lyskom-keyboard-menu-selection (car (last lyskom-keyboard-menu-menu))))
(let ((done nil))
(while (not done)
;; Move up one line
(condition-case nil
(previous-line 1)
(beginning-of-buffer (setq done t)))
;; Scan the items on this line until we find the one
;; just before point or just after point or around
;; point.
(let ((selection nil)
(start (save-excursion (beginning-of-line) (point)))
(end (save-excursion (end-of-line) (point)))
(pos (point)))
(while (and (>= pos start) (null selection))
(setq selection
(get-text-property pos 'lyskom-keyboard-menu-item)
pos (1- pos)))
(setq pos (point))
(while (and (<= pos end) (null selection))
(setq selection
(get-text-property pos 'lyskom-keyboard-menu-item)
pos (1+ pos)))
(when selection (setq done t
lyskom-keyboard-menu-selection selection))))))
(defun lyskom-keyboard-menu-down ()
"Move down one menu item."
(interactive)
(let ((done nil))
(while (not done)
;; Move up one line
(condition-case nil
(next-line 1)
(end-of-buffer (setq done t)))
;; Scan the items on this line until we find the one
;; just before point or just after point or around
;; point.
(let ((selection nil)
(start (save-excursion (beginning-of-line) (point)))
(end (save-excursion (end-of-line) (point)))
(pos (point)))
(while (and (>= pos start) (null selection))
(setq selection
(get-text-property pos 'lyskom-keyboard-menu-item)
pos (1- pos)))
(setq pos (point))
(while (and (<= pos end) (null selection))
(setq selection
(get-text-property pos 'lyskom-keyboard-menu-item)
pos (1+ pos)))
(when selection (setq done t
lyskom-keyboard-menu-selection selection))))))
(defun lyskom-keyboard-menu-forward ()
"Move right one menu item."
(interactive)
(let ((pos (point))
(item nil))
(while (and pos (or (null item) (eq item lyskom-keyboard-menu-selection)))
(setq pos (next-single-property-change pos 'lyskom-keyboard-menu-item))
(when pos
(setq item (get-text-property pos 'lyskom-keyboard-menu-item))))
(when item (setq lyskom-keyboard-menu-selection item))))
(defun lyskom-keyboard-menu-backward ()
"Move left one menu item."
(interactive)
(let ((pos (point))
(item nil))
(while (and pos (or (null item) (eq item lyskom-keyboard-menu-selection)))
(setq pos (previous-single-property-change pos 'lyskom-keyboard-menu-item))
(when pos
(setq item (get-text-property pos 'lyskom-keyboard-menu-item))))
(when item (setq lyskom-keyboard-menu-selection item))))
(defun lyskom-keyboard-menu-beginning-of-line ()
"Move to the first menu item of this line."
(interactive)
(beginning-of-line)
(setq lyskom-keyboard-menu-selection
(or (get-text-property (point) 'lyskom-keyboard-menu-item)
(get-text-property (or (next-single-property-change
(point) 'lyskom-keyboard-menu-item
nil (save-excursion (end-of-line) (point)))
(point))
'lyskom-keyboard-menu-item))))
(defun lyskom-keyboard-menu-end-of-line ()
"Move to the last menu item of this line."
(interactive)
(if lyskom-keyboard-menu-selection
(setq lyskom-keyboard-menu-selection (car (cdr lyskom-keyboard-menu-menu)))
(setq lyskom-keyboard-menu-selection (car lyskom-keyboard-menu-menu))))
(end-of-line)
(setq lyskom-keyboard-menu-selection
(if (get-text-property (point) 'lyskom-keyboard-menu-item)
(get-text-property (point) 'lyskom-keyboard-menu-item)
(let ((pos (previous-single-property-change
(point) 'lyskom-keyboard-menu-item
nil (1- (save-excursion (beginning-of-line) (point))))))
(when (and pos (not (zerop pos)))
(or (get-text-property pos 'lyskom-keyboard-menu-item)
(get-text-property (1- pos) 'lyskom-keyboard-menu-item)))))))
......@@ -1909,6 +1909,9 @@ Deferred insertions are not supported."
(lyskom-external-function w3-fetch)
(lyskom-external-function w3-region)
(lyskom-external-function smiley-region)
(lyskom-external-function latin-unity-remap-region)
(lyskom-try-require 'latin-unity)
(defun lyskom-format-text-body (text &optional text-stat)
"Format a text for insertion. Does parsing of special markers in the text."
......@@ -1952,8 +1955,7 @@ Deferred insertions are not supported."
(length tmp)
'(special-insert lyskom-postprocess-text)
tmp))
(when (and (fboundp 'latin-unity-remap-region)
(lyskom-try-require 'latin-unity))
(when (fboundp 'latin-unity-remap-region)
(add-text-properties 0
(length tmp)
'(special-insert lyskom-unity-text)
......@@ -1965,6 +1967,11 @@ Deferred insertions are not supported."
(smiley-region start (min (point-max) (1+ end)))
(error nil)))
(defvar latin-unity-preferred-coding-system-list)
(defvar latin-unity-iso-8859-1-aliases)
(defvar latin-unity-cset-codesys-alist)
(lyskom-external-function coding-system-property)
(defun lyskom-unity-text (start end &rest args)
(condition-case nil
(let ((codesys (car latin-unity-preferred-coding-system-list)))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment