1 ;;; x-win-sun.el --- runtime initialization for Sun X servers and keyboards
2 ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
4 ;; Authors: jwz, ben, martin
7 ;; This file is part of XEmacs.
9 ;; XEmacs is free software; you can redistribute it and/or modify it
10 ;; under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation; either version 2, or (at your option)
14 ;; XEmacs is distributed in the hope that it will be useful, but
15 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 ;; General Public License for more details.
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with XEmacs; see the file COPYING. If not, write to the
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 ;; Boston, MA 02111-1307, USA.
26 ;; This file is loaded by x-win.el at run-time when we are sure that XEmacs
27 ;; is running on the display of a Sun.
29 ;; The Sun X server (both the MIT and OpenWindows varieties) have extremely
30 ;; stupid names for their keypad and function keys. For example, the key
31 ;; labeled 3 / PgDn, with R15 written on the front, is actually called F35.
33 ;; There are 3 methods of dealing with the Sun key brokenness:
35 ;; - Use xmodmap to give all keys more sensible names for all apps:
36 ;; I use this shell script:
38 ;; for i in 0 1 2 3 4 5 6 7 8 9 Add Subtract Multiply Divide Decimal ; do
39 ;; echo "keysym KP-$i = KP-$i"
42 ;; Clearly, as a good X11 citizen, we can't do this.
44 ;; - Use keyboard-translate-table to remap the keybindings at a low level.
45 ;; This approach is taken in the function `sun-x11-keyboard-translate'.
46 ;; This is like running xmodmap within XEmacs only.
47 ;; This is not the default, however, so that legacy keybindings in users'
48 ;; .emacs files like (global-set-key [(f35)] 'foo) continue to work
50 ;; - Use keyboard macros to provide indirection for keybindings.
51 ;; If we do (global-set-key [(f35)] [(kp-3)]), then the user's keybindings
52 ;; work whether he uses `f35' or `kp-3'.
53 ;; This is also compatible with FSF Emacs and other X11 apps.
54 ;; Although this has the disadvantage that these remappings
55 ;; only work with the global key map, we use this as the default.
57 ;; - The Right Way to do this remains to be written...
59 ;; OK, here's another try at doing things the right way.
61 ;; We use function-key-map, which honors explicit key-bindings for the
62 ;; stupid Sun names, but also allows indirection if no explicit
63 ;; key-binding exists.
67 (defun x-win-init-sun ()
69 (defun x-remap-keysyms-using-function-key-map (from-key to-key)
70 (dolist (prefix '(() (shift) (control) (meta) (alt)
71 (shift control) (shift alt) (shift meta)
72 (control alt) (control meta) (alt meta)
73 (shift control alt) (shift control meta)
74 (shift alt meta) (control alt meta)
75 (shift control alt meta)))
76 (define-key function-key-map
77 (append prefix (list from-key))
78 (vector (append prefix (list to-key))))))
91 (loop for (from-key to-key) in
120 ;; Map f33 and r13 to end or kp-end
122 ((not (x-keysym-on-keyboard-sans-modifiers-p 'end))
125 ((not (x-keysym-on-keyboard-sans-modifiers-p 'kp-end))
129 ,@(when (x-keysym-on-keyboard-sans-modifiers-p 'f36)
133 ;; Type 4 keyboards have a real kp-subtract and a f24 labelled `='
134 ;; Type 5 keyboards have no key labelled `=' and a f24 labelled `-'
135 ,@(when (x-keysym-on-keyboard-sans-modifiers-p 'f24)
136 `((f24 ,(if (x-keysym-on-keyboard-sans-modifiers-p 'kp-subtract)
140 ;; Map f27 to home or kp-home, as appropriate
141 ,@(cond ((not (x-keysym-on-keyboard-sans-modifiers-p 'home))
143 ((not (x-keysym-on-keyboard-sans-modifiers-p 'kp-home))
146 ;; Map f29 to prior or kp-prior, as appropriate
147 ,@(cond ((not (x-keysym-on-keyboard-sans-modifiers-p 'prior))
149 ((not (x-keysym-on-keyboard-sans-modifiers-p 'kp-prior))
152 ;; Map f35 to next or kp-next, as appropriate
153 ,@(cond ((not (x-keysym-on-keyboard-sans-modifiers-p 'next))
155 ((not (x-keysym-on-keyboard-sans-modifiers-p 'kp-next))
158 ,@(cond ((x-keysym-on-keyboard-sans-modifiers-p 'apRead) ; SunOS 4.1.1
159 '((apRead f11) (apEdit f12)))
160 ((x-keysym-on-keyboard-sans-modifiers-p 'SunF36) ; SunOS 5
166 do (when (x-keysym-on-keyboard-sans-modifiers-p from-key)
167 (x-remap-keysyms-using-function-key-map from-key to-key)))
169 (unintern 'x-remap-keysyms-using-function-key-map)
171 ;; for each element in the left column of the above table, alias it
172 ;; to the thing in the right column. Then do the same for many, but
173 ;; not all, modifier combinations.
175 ;; (Well, we omit hyper and super. #### Handle this some other way!)
177 ;; (let ((mods '(() (shift) (control) (meta) (alt))))
179 ;; (let ((k1 (vector (append (car mods) (list (car (car mapping))))))
180 ;; (k2 (vector (append (car mods) (list (cdr (car mapping)))))))
181 ;; (define-key global-map k1 k2))
182 ;; (setq mods (cdr mods))))
183 ;; (setq mapping (cdr mapping))))
185 ;;; I've extended keyboard-translate-table to work over keysyms.
186 ;;; [FSF Emacs has something called `system-key-alist' that is
187 ;;; supposed to accomplish approximately the same thing. Unfortunately,
188 ;;; it's brain-dead in the typically FSF way, and associates *numbers*
189 ;;; (who knows where the hell they come from?) with symbols.] --ben
191 ;;; And I've made it into a function which is NOT called by default --martin
193 (defun sun-x11-keyboard-translate ()
194 "Remap Sun's X11 keyboard.
195 Keys with names like `f35' are remapped, at a low level,
196 to more mnemonic ones,like `kp-3'."
200 'f11 'stop ; the type4 keyboard Sun/MIT name
201 'f36 'stop ; the type5 keyboard Sun name
202 'cancel 'stop ; R6 binding
203 'f12 'again ; the type4 keyboard Sun/MIT name
204 'f37 'again ; the type5 keyboard Sun name
206 'SunProps 'props ; R6 binding
209 'SunFront 'front ; R6 binding
211 'SunCopy 'copy ; R6 binding
213 'SunOpen 'open ; R6 binding
215 'SunPaste 'paste ; R6 binding
218 'SunCut 'cut ; R6 binding
224 ;;'f24 'kp-equal) ; type4 only!
227 'f24 'kp-subtract ; type5 only!
235 'f33 'kp-1 ; the Sun name
236 'r13 'end ; the MIT name
242 'SunF36 'f11 ; Type 5 keyboards
243 'SunF37 'f12 ; Used to be Stop & Again
247 ;;; OpenWindows-like "find" processing.
248 ;;; As far as I know, the `find' key is a Sunism, so we do that binding
249 ;;; here. This is the only Sun-specific keybinding. (The functions
250 ;;; themselves are in x-win.el in case someone wants to use them when
251 ;;; not running on a Sun display.)
253 (define-key global-map 'find 'ow-find)
254 (define-key global-map '(shift find) 'ow-find-backward)
258 ;;; x-win-sun.el ends here