comparison lisp/utils/sysdep.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children 131b0175ea99
comparison
equal deleted inserted replaced
-1:000000000000 0:376386a54a3c
1 ;;; sysdep.el --- consolidate Emacs-version dependencies in one file.
2
3 ;; Copyright (C) 1995 Ben Wing.
4
5 ;; Author: Ben Wing <wing@666.com>
6 ;; Keywords: lisp, tools
7 ;; Version: 0.001
8
9 ;;; Synched up with: Not in FSF.
10
11 ;; The purpose of this file is to eliminate the cruftiness that
12 ;; would otherwise be required of packages that want to run on multiple
13 ;; versions of Emacs. The idea is that we make it look like we're running
14 ;; the latest version of XEmacs (currently 19.12) by emulating all the
15 ;; missing functions.
16
17 ;; #### This file does not currently do any advising but should.
18 ;; Unfortunately, advice.el is a hugely big package. Is any such
19 ;; thing as `advice-lite' possible?
20
21 ;; #### - This package is great, but its role needs to be thought out a bit
22 ;; more. Sysdep will not permit programs written for the old XEmacs API to
23 ;; run on new versions of XEmacs. Sysdep is a backward-compatibility
24 ;; package for the latest and greatest XEmacs API. It permits programmers
25 ;; to use the latest XEmacs functionality and still have their programs run
26 ;; on older versions of XEmacs...perhaps even on FSF Emacs. It should NEVER
27 ;; ever need to be loaded in the newest XEmacs. It doesn't even make sense
28 ;; to put it in the lisp/utils part of the XEmacs distribution because its
29 ;; real purpose is to be distributed with packages like w3 which take
30 ;; advantage of the latest and greatest features of XEmacs but still need to
31 ;; be run on older versions. --Stig
32
33 ;; Any packages that wish to use this file should load it using
34 ;; `load-library'. It will not load itself if a version of sysdep.el
35 ;; that is at least as recent has already been loaded, but will
36 ;; load over an older version of sysdep.el. It will attempt to
37 ;; not redefine functions that have already been custom-redefined,
38 ;; but will redefine a function if the supplied definition came from
39 ;; an older version of sysdep.el.
40
41 ;; Packages such as w3 that wish to include this file with the package
42 ;; should rename it to something unique, such as `w3-sysdep.el', and
43 ;; load it with `load-library'. That will ensure that no conflicts
44 ;; arise if more than one package in the load path provides a version
45 ;; of sysdep.el. If multiple packages load sysdep.el, the most recent
46 ;; version will end up loaded; as long as I'm careful not to
47 ;; introduce bugs in previously working definitions, this should work
48 ;; fine.
49
50 ;; You may well discover deficiencies in this file as you use it.
51 ;; The preferable way of dealing with this is to send me a patch
52 ;; to sysdep.el; that way, the collective body of knowledge gets
53 ;; increased.
54
55 ;; DO NOT load this file with `require'.
56 ;; DO NOT put a `provide' statement in this file.
57
58 ;; IMPORTANT: leave the version string in the format X.XXX (e.g. 1.001)
59 ;; so that string comparisons to other versions work properly.
60
61 (defconst sysdep-potential-version "0.002")
62
63 (if (and (boundp 'sysdep-version)
64 (not (string-lessp sysdep-version sysdep-potential-version)))
65 ;; if a more recent version of sysdep was already loaded,
66 ;; or if the same package is loaded again, don't load.
67 nil
68
69 (defconst sysdep-version sysdep-potential-version)
70
71 ;; this macro means: define the function, but only if either it
72 ;; wasn't bound before, or the supplied binding comes from an older
73 ;; version of sysdep.el. That way, user-supplied bindings don't
74 ;; get overridden.
75
76 ;; note: sysdep-defalias is often more useful than this function,
77 ;; esp. since you can do load-time conditionalizing and can
78 ;; optionally leave the function undefined. (e.g. frame functions
79 ;; in v18.)
80
81 (defmacro sysdep-defun (function &rest everything-else)
82 (` (cond ((or (not (fboundp (quote (, function))))
83 (get (quote (, function)) 'sysdep-defined-this))
84 (put (quote (, function)) 'sysdep-defined-this t)
85 (defun (, function) (,@ everything-else))))))
86
87 (defmacro sysdep-defvar (function &rest everything-else)
88 (` (cond ((or (not (boundp (quote (, function))))
89 (get (quote (, function)) 'sysdep-defined-this))
90 (put (quote (, function)) 'sysdep-defined-this t)
91 (defvar (, function) (,@ everything-else))))))
92
93 (defmacro sysdep-defconst (function &rest everything-else)
94 (` (cond ((or (not (boundp (quote (, function))))
95 (get (quote (, function)) 'sysdep-defined-this))
96 (put (quote (, function)) 'sysdep-defined-this t)
97 (defconst (, function) (,@ everything-else))))))
98
99 ;; similar for fset and defalias. No need to quote as the argument
100 ;; is already quoted.
101
102 (defmacro sysdep-fset (function def)
103 (` (cond ((and (or (not (fboundp (, function)))
104 (get (, function) 'sysdep-defined-this))
105 (, def))
106 (put (, function) 'sysdep-defined-this t)
107 (fset (, function) (, def))))))
108
109 (defmacro sysdep-defalias (function def)
110 (` (cond ((and (or (not (fboundp (, function)))
111 (get (, function) 'sysdep-defined-this))
112 (, def)
113 (or (listp (, def))
114 (and (symbolp (, def))
115 (fboundp (, def)))))
116 (put (, function) 'sysdep-defined-this t)
117 (defalias (, function) (, def))))))
118
119 ;; bootstrapping: defalias and define-function don't exist
120 ;; in older versions of lemacs
121
122 (sysdep-fset 'defalias 'fset)
123 (sysdep-defalias 'define-function 'defalias)
124
125 ;; useful ways of determining what version is running
126 ;; emacs-major-version and emacs-minor-version are
127 ;; already defined in recent versions of FSF Emacs and XEmacs
128
129 (sysdep-defconst emacs-major-version
130 ;; will string-match ever fail? If so, assume 19.0.
131 ;; (should we assume 18.something?)
132 (if (string-match "^[0-9]+" emacs-version)
133 (string-to-int
134 (substring emacs-version
135 (match-beginning 0) (match-end 0)))
136 19))
137
138 (sysdep-defconst emacs-minor-version
139 (if (string-match "^[0-9]+\\.\\([0-9]+\\)" emacs-version)
140 (string-to-int
141 (substring emacs-version
142 (match-beginning 1) (match-end 1)))
143 0))
144
145 (sysdep-defconst sysdep-running-xemacs
146 (or (string-match "Lucid" emacs-version)
147 (string-match "XEmacs" emacs-version)))
148
149 (sysdep-defconst window-system nil)
150 (sysdep-defconst window-system-version 0)
151
152 (sysdep-defvar list-buffers-directory nil)
153 (sysdep-defvar x-library-search-path '("/usr/X11R6/lib/X11/"
154 "/usr/X11R5/lib/X11/"
155 "/usr/lib/X11R6/X11/"
156 "/usr/lib/X11R5/X11/"
157 "/usr/local/X11R6/lib/X11/"
158 "/usr/local/X11R5/lib/X11/"
159 "/usr/local/lib/X11R6/X11/"
160 "/usr/local/lib/X11R5/X11/"
161 "/usr/X11/lib/X11/"
162 "/usr/lib/X11/"
163 "/usr/local/lib/X11/"
164 "/usr/X386/lib/X11/"
165 "/usr/x386/lib/X11/"
166 "/usr/XFree86/lib/X11/"
167 "/usr/unsupported/lib/X11/"
168 "/usr/athena/lib/X11/"
169 "/usr/local/x11r5/lib/X11/"
170 "/usr/lpp/Xamples/lib/X11/"
171 "/usr/openwin/lib/X11/"
172 "/usr/openwin/share/lib/X11/")
173 "Search path used for X11 libraries.")
174
175 ;; frame-related stuff.
176
177 (sysdep-defalias 'buffer-dedicated-frame 'buffer-dedicated-screen)
178 (sysdep-defalias 'deiconify-frame
179 (cond ((fboundp 'deiconify-screen) 'deiconify-screen)
180 ;; make-frame-visible will be defined as necessary
181 (t 'make-frame-visible)))
182 (sysdep-defalias 'delete-frame 'delete-screen)
183 (sysdep-defalias 'event-frame 'event-screen)
184 (sysdep-defalias 'event-glyph-extent 'event-glyph)
185 (sysdep-defalias 'find-file-other-frame 'find-file-other-screen)
186 (sysdep-defalias 'find-file-read-only-other-frame
187 'find-file-read-only-other-screen)
188 (sysdep-defalias 'frame-height 'screen-height)
189 (sysdep-defalias 'frame-iconified-p 'screen-iconified-p)
190 (sysdep-defalias 'frame-left-margin-width 'screen-left-margin-width)
191 (sysdep-defalias 'frame-list 'screen-list)
192 (sysdep-defalias 'frame-live-p
193 (cond ((fboundp 'screen-live-p) 'screen-live-p)
194 ((fboundp 'live-screen-p) 'live-screen-p)
195 ;; #### not sure if this is correct (this is for Epoch)
196 ;; but gnuserv.el uses it this way
197 ((fboundp 'screenp) 'screenp)))
198 (sysdep-defalias 'frame-name 'screen-name)
199 (sysdep-defalias 'frame-parameters 'screen-parameters)
200 (sysdep-defalias 'frame-pixel-height 'screen-pixel-height)
201 (sysdep-defalias 'frame-pixel-width 'screen-pixel-width)
202 (sysdep-defalias 'frame-right-margin-width 'screen-right-margin-width)
203 (sysdep-defalias 'frame-root-window 'screen-root-window)
204 (sysdep-defalias 'frame-selected-window 'screen-selected-window)
205 (sysdep-defalias 'frame-totally-visible-p 'screen-totally-visible-p)
206 (sysdep-defalias 'frame-visible-p 'screen-visible-p)
207 (sysdep-defalias 'frame-width 'screen-width)
208 (sysdep-defalias 'framep 'screenp)
209 (sysdep-defalias 'get-frame-for-buffer 'get-screen-for-buffer)
210 (sysdep-defalias 'get-frame-for-buffer-noselect 'get-screen-for-buffer-noselect)
211 (sysdep-defalias 'get-other-frame 'get-other-screen)
212 (sysdep-defalias 'iconify-frame 'iconify-screen)
213 (sysdep-defalias 'lower-frame 'lower-screen)
214 (sysdep-defalias 'mail-other-frame 'mail-other-screen)
215
216 (sysdep-defalias 'make-frame
217 (cond ((fboundp 'make-screen)
218 (function (lambda (&optional parameters device)
219 (make-screen parameters))))
220 ((fboundp 'x-create-screen)
221 (function (lambda (&optional parameters device)
222 (x-create-screen parameters))))))
223
224 (sysdep-defalias 'make-frame-invisible 'make-screen-invisible)
225 (sysdep-defalias 'make-frame-visible
226 (cond ((fboundp 'make-screen-visible) 'make-screen-visible)
227 ((fboundp 'mapraised-screen) 'mapraised-screen)
228 ((fboundp 'x-remap-window)
229 (lambda (&optional x)
230 (x-remap-window)
231 (accept-process-output)))))
232 (sysdep-defalias 'modify-frame-parameters 'modify-screen-parameters)
233 (sysdep-defalias 'new-frame 'new-screen)
234 (sysdep-defalias 'next-frame 'next-screen)
235 (sysdep-defalias 'next-multiframe-window 'next-multiscreen-window)
236 (sysdep-defalias 'other-frame 'other-screen)
237 (sysdep-defalias 'previous-frame 'previous-screen)
238 (sysdep-defalias 'previous-multiframe-window 'previous-multiscreen-window)
239 (sysdep-defalias 'raise-frame
240 (cond ((fboundp 'raise-screen) 'raise-screen)
241 ((fboundp 'mapraise-screen) 'mapraise-screen)))
242 (sysdep-defalias 'redraw-frame 'redraw-screen)
243 (sysdep-defalias 'select-frame 'select-screen)
244 (sysdep-defalias 'selected-frame 'selected-screen)
245 (sysdep-defalias 'set-buffer-dedicated-frame 'set-buffer-dedicated-screen)
246 (sysdep-defalias 'set-frame-height 'set-screen-height)
247 (sysdep-defalias 'set-frame-left-margin-width 'set-screen-left-margin-width)
248 (sysdep-defalias 'set-frame-position 'set-screen-position)
249 (sysdep-defalias 'set-frame-right-margin-width 'set-screen-right-margin-width)
250 (sysdep-defalias 'set-frame-size 'set-screen-size)
251 (sysdep-defalias 'set-frame-width 'set-screen-width)
252 (sysdep-defalias 'show-temp-buffer-in-current-frame 'show-temp-buffer-in-current-screen)
253 (sysdep-defalias 'switch-to-buffer-other-frame 'switch-to-buffer-other-screen)
254 (sysdep-defalias 'visible-frame-list 'visible-screen-list)
255 (sysdep-defalias 'window-frame 'window-screen)
256 (sysdep-defalias 'x-create-frame 'x-create-screen)
257 (sysdep-defalias 'x-set-frame-icon-pixmap 'x-set-screen-icon-pixmap)
258 (sysdep-defalias 'x-set-frame-pointer 'x-set-screen-pointer)
259 (sysdep-defalias 'x-display-color-p 'x-color-display-p)
260 (sysdep-defalias 'x-display-grayscale-p 'x-grayscale-display-p)
261 (sysdep-defalias 'menu-event-p 'misc-user-event-p)
262
263 (sysdep-defun add-submenu (menu-path submenu &optional before)
264 "Add a menu to the menubar or one of its submenus.
265 If the named menu exists already, it is changed.
266 MENU-PATH identifies the menu under which the new menu should be inserted.
267 It is a list of strings; for example, (\"File\") names the top-level \"File\"
268 menu. (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
269 If MENU-PATH is nil, then the menu will be added to the menubar itself.
270 SUBMENU is the new menu to add.
271 See the documentation of `current-menubar' for the syntax.
272 BEFORE, if provided, is the name of a menu before which this menu should
273 be added, if this menu is not on its parent already. If the menu is already
274 present, it will not be moved."
275 (add-menu menu-path (car submenu) (cdr submenu) before))
276
277 (sysdep-defun add-menu-button (menu-path menu-leaf &optional before)
278 "Add a menu item to some menu, creating the menu first if necessary.
279 If the named item exists already, it is changed.
280 MENU-PATH identifies the menu under which the new menu item should be inserted.
281 It is a list of strings; for example, (\"File\") names the top-level \"File\"
282 menu. (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
283 MENU-LEAF is a menubar leaf node. See the documentation of `current-menubar'.
284 BEFORE, if provided, is the name of a menu item before which this item should
285 be added, if this item is not on the menu already. If the item is already
286 present, it will not be moved."
287 (add-menu-item menu-path (aref menu-leaf 0) (aref menu-leaf 1)
288 (aref menu-leaf 2) before))
289
290 (sysdep-defun make-glyph (&optional spec-list)
291 (if (and spec-list (cdr-safe (assq 'x spec-list)))
292 (make-pixmap (cdr-safe (assq 'x spec-list)))))
293
294 (sysdep-defalias 'face-list 'list-faces)
295
296 (sysdep-defun set-face-property (face property value &optional locale
297 tag-set how-to-add)
298 "Change a property of FACE."
299 (and (symbolp face)
300 (put face property value)))
301
302 (sysdep-defun face-property (face property &optional locale tag-set exact-p)
303 "Return FACE's value of the given PROPERTY."
304 (and (symbolp face) (get face property)))
305
306 ;; Device functions
307 ;; By wmperry@spry.com
308 ;; This is a complete implementation of all the device-* functions found in
309 ;; XEmacs 19.14. A 'device' for Emacs 19 is just a frame, from which we can
310 ;; determine the connection to an X display, etc.
311
312 (sysdep-defalias 'selected-device 'ignore)
313 (sysdep-defalias 'device-or-frame-p 'framep)
314 (sysdep-defalias 'device-console 'ignore)
315 (sysdep-defalias 'device-sound-enabled-p 'ignore)
316 (sysdep-defalias 'device-live-p 'frame-live-p)
317 (sysdep-defalias 'devicep 'framep)
318 (sysdep-defalias 'frame-device 'identity)
319 (sysdep-defalias 'redisplay-device 'redraw-frame)
320 (sysdep-defalias 'redraw-device 'redraw-frame)
321 (sysdep-defalias 'select-device 'select-frame)
322 (sysdep-defalias 'set-device-class 'ignore)
323
324 (sysdep-defun make-device (type connection &optional props)
325 "Create a new device of type TYPE, attached to connection CONNECTION.
326
327 The valid values for CONNECTION are device-specific; however,
328 CONNECTION is generally a string. (Specifically, for X devices,
329 CONNECTION should be a display specification such as \"foo:0\", and
330 for TTY devices, CONNECTION should be the filename of a TTY device
331 file, such as \"/dev/ttyp4\", or nil to refer to XEmacs' standard
332 input/output.)
333
334 PROPS, if specified, should be a plist of properties controlling
335 device creation.
336
337 If CONNECTION specifies an already-existing device connection, that
338 device is simply returned; no new device is created, and PROPS
339 have no effect."
340 (cond
341 ((and (eq type 'x) connection)
342 (make-frame-on-display display props))
343 ((eq type 'x)
344 (make-frame props))
345 ((eq type 'tty)
346 nil)
347 (t
348 (error "Unsupported device-type: %s" type))))
349
350 (sysdep-defun make-frame-on-device (type connection &optional props)
351 "Create a frame of type TYPE on CONNECTION.
352 TYPE should be a symbol naming the device type, i.e. one of
353
354 x An X display. CONNECTION should be a standard display string
355 such as \"unix:0\", or nil for the display specified on the
356 command line or in the DISPLAY environment variable. Only if
357 support for X was compiled into XEmacs.
358 tty A standard TTY connection or terminal. CONNECTION should be
359 a TTY device name such as \"/dev/ttyp2\" (as determined by
360 the Unix command `tty') or nil for XEmacs' standard input
361 and output (usually the TTY in which XEmacs started). Only
362 if support for TTY's was compiled into XEmacs.
363 ns A connection to a machine running the NeXTstep windowing
364 system. Not currently implemented.
365 win32 A connection to a machine running Microsoft Windows NT or
366 Windows 95. Not currently implemented.
367 pc A direct-write MS-DOS frame. Not currently implemented.
368
369 PROPS should be an plist of properties, as in the call to `make-frame'.
370
371 If a connection to CONNECTION already exists, it is reused; otherwise,
372 a new connection is opened."
373 (make-device type connection props))
374
375 (sysdep-defun make-tty-device (&optional tty terminal-type)
376 "Create a new device on TTY.
377 TTY should be the name of a tty device file (e.g. \"/dev/ttyp3\" under
378 SunOS et al.), as returned by the `tty' command. A value of nil means
379 use the stdin and stdout as passed to XEmacs from the shell.
380 If TERMINAL-TYPE is non-nil, it should be a string specifying the
381 type of the terminal attached to the specified tty. If it is nil,
382 the terminal type will be inferred from the TERM environment variable."
383 (make-device 'tty tty (list 'terminal-type terminal-type)))
384
385 (sysdep-defun make-x-device (&optional display)
386 (make-device 'x display))
387
388 (sysdep-defun set-device-selected-frame (device frame)
389 "Set the selected frame of device object DEVICE to FRAME.
390 If DEVICE is nil, the selected device is used.
391 If DEVICE is the selected device, this makes FRAME the selected frame."
392 (select-frame frame))
393
394 (sysdep-defun set-device-baud-rate (device rate)
395 "Set the output baud rate of DEVICE to RATE.
396 On most systems, changing this value will affect the amount of padding
397 and other strategic decisions made during redisplay."
398 (setq baud-rate rate))
399
400 (sysdep-defun dfw-device (obj)
401 "Given a device, frame, or window, return the associated device.
402 Return nil otherwise."
403 (cond
404 ((windowp obj)
405 (window-frame obj))
406 ((framep obj)
407 obj)
408 (t
409 nil)))
410
411 (sysdep-defun event-device (event)
412 "Return the device that EVENT occurred on.
413 This will be nil for some types of events (e.g. keyboard and eval events)."
414 (dfw-device (posn-window (event-start event))))
415
416 (sysdep-defun find-device (connection &optional type)
417 "Look for an existing device attached to connection CONNECTION.
418 Return the device if found; otherwise, return nil.
419
420 If TYPE is specified, only return devices of that type; otherwise,
421 return devices of any type. (It is possible, although unlikely,
422 that two devices of different types could have the same connection
423 name; in such a case, the first device found is returned.)"
424 (let ((devices (device-list))
425 (retval nil))
426 (while (and devices (not nil))
427 (if (equal connection (device-connection (car devices)))
428 (setq retval (car devices)))
429 (setq devices (cdr devices)))
430 retval))
431
432 (sysdep-defalias 'get-device 'find-device)
433
434 (sysdep-defun device-baud-rate (&optional device)
435 "Return the output baud rate of DEVICE."
436 baud-rate)
437
438 (sysdep-defun device-on-window-system-p (&optional device)
439 "Return non-nil if DEVICE is on a window system.
440 This generally means that there is support for the mouse, the menubar,
441 the toolbar, glyphs, etc."
442 (and (cdr-safe (assq 'display (frame-parameters device))) t))
443
444 (sysdep-defun device-name (&optional device)
445 "Return the name of the specified device."
446 ;; doesn't handle the 19.29 multiple X display stuff yet
447 ;; doesn't handle NeXTStep either
448 (cond
449 ((null window-system) "stdio")
450 ((getenv "DISPLAY")
451 (let ((str (getenv "DISPLAY"))
452 (x (1- (length (getenv "DISPLAY"))))
453 (y 0))
454 (while (/= y x)
455 (if (or (= (aref str y) ?:)
456 (= (aref str y) ?.))
457 (aset str y ?-))
458 (setq y (1+ y)))
459 str))
460 (t "stdio")))
461
462
463 (sysdep-defun device-connection (&optional device)
464 "Return the connection of the specified device.
465 DEVICE defaults to the selected device if omitted"
466 (or (cdr-safe (assq 'display (frame-parameters device))) "stdio"))
467
468 (sysdep-defun device-frame-list (&optional device)
469 "Return a list of all frames on DEVICE.
470 If DEVICE is nil, the selected device will be used."
471 (let ((desired (device-connection device)))
472 (filtered-frame-list (function (lambda (x) (equal (device-connection x)
473 desired))))))
474 (sysdep-defun device-list ()
475 "Return a list of all devices"
476 (let ((seen nil)
477 (cur nil)
478 (conn nil)
479 (retval nil)
480 (not-heard (frame-list)))
481 (while not-heard
482 (setq cur (car not-heard)
483 conn (device-connection cur)
484 not-heard (cdr not-heard))
485 (if (member conn seen)
486 nil ; Already got it
487 (setq seen (cons conn seen) ; Whoo hoo, a new one!
488 retval (cons cur retval))))
489 retval))
490
491 (sysdep-defvar delete-device-hook nil
492 "Function or functions to call when a device is deleted.
493 One argument, the to-be-deleted device.")
494
495 (sysdep-defun delete-device (device &optional force)
496 "Delete DEVICE, permanently eliminating it from use.
497 Normally, you cannot delete the last non-minibuffer-only frame (you must
498 use `save-buffers-kill-emacs' or `kill-emacs'). However, if optional
499 second argument FORCE is non-nil, you can delete the last frame. (This
500 will automatically call `save-buffers-kill-emacs'.)"
501 (let ((frames (device-frame-list device)))
502 (run-hook-with-args 'delete-device-hook device)
503 (while frames
504 (delete-frame (car frames) force)
505 (setq frames (cdr frames)))))
506
507 (sysdep-defalias 'device-color-cells
508 (cond
509 ((null window-system) 'ignore)
510 ((fboundp 'display-color-cells) 'display-color-cells)
511 ((fboundp 'x-display-color-cells) 'x-display-color-cells)
512 ((fboundp 'ns-display-color-cells) 'ns-display-color-celles)
513 (t 'ignore)))
514
515 (sysdep-defun try-font-name (fontname &rest args)
516 (car-safe (x-list-fonts fontname)))
517
518 (sysdep-defalias 'device-pixel-width
519 (cond
520 ((and (eq window-system 'x) (fboundp 'x-display-pixel-width))
521 'x-display-pixel-width)
522 ((and (eq window-system 'ns) (fboundp 'ns-display-pixel-width))
523 'ns-display-pixel-width)
524 (t 'ignore)))
525
526 (sysdep-defalias 'device-pixel-height
527 (cond
528 ((and (eq window-system 'x) (fboundp 'x-display-pixel-height))
529 'x-display-pixel-height)
530 ((and (eq window-system 'ns) (fboundp 'ns-display-pixel-height))
531 'ns-display-pixel-height)
532 (t 'ignore)))
533
534 (sysdep-defalias 'device-mm-width
535 (cond
536 ((and (eq window-system 'x) (fboundp 'x-display-mm-width))
537 'x-display-mm-width)
538 ((and (eq window-system 'ns) (fboundp 'ns-display-mm-width))
539 'ns-display-mm-width)
540 (t 'ignore)))
541
542 (sysdep-defalias 'device-mm-height
543 (cond
544 ((and (eq window-system 'x) (fboundp 'x-display-mm-height))
545 'x-display-mm-height)
546 ((and (eq window-system 'ns) (fboundp 'ns-display-mm-height))
547 'ns-display-mm-height)
548 (t 'ignore)))
549
550 (sysdep-defalias 'device-bitplanes
551 (cond
552 ((and (eq window-system 'x) (fboundp 'x-display-planes))
553 'x-display-planes)
554 ((and (eq window-system 'ns) (fboundp 'ns-display-planes))
555 'ns-display-planes)
556 (t 'ignore)))
557
558 (sysdep-defalias 'device-class
559 (cond
560 ((and (eq window-system 'x) (fboundp 'x-display-visual-class))
561 (function
562 (lambda (&optional device)
563 (let ((val (symbol-name (x-display-visual-class device))))
564 (cond
565 ((string-match "color" val) 'color)
566 ((string-match "gray-scale" val) 'grayscale)
567 (t 'mono))))))
568 ((fboundp 'number-of-colors)
569 (function
570 (lambda (&optional device)
571 (if (= 2 (number-of-colors))
572 'mono
573 'color))))
574 ((and (eq window-system 'x) (fboundp 'x-color-p))
575 (function
576 (lambda (&optional device)
577 (if (x-color-p)
578 'color
579 'mono))))
580 ((and (eq window-system 'ns) (fboundp 'ns-display-visual-class))
581 (function
582 (lambda (&optional device)
583 (let ((val (symbol-name (ns-display-visual-class))))
584 (cond
585 ((string-match "color" val) 'color)
586 ((string-match "gray-scale" val) 'grayscale)
587 (t 'mono))))))
588 (t (function (lambda (&optional device) 'mono)))))
589
590 (sysdep-defun device-class-list ()
591 "Returns a list of valid device classes."
592 (list 'color 'grayscale 'mono))
593
594 (sysdep-defun valid-device-class-p (class)
595 "Given a CLASS, return t if it is valid.
596 Valid classes are 'color, 'grayscale, and 'mono."
597 (memq class (device-class-list)))
598
599 (sysdep-defun device-or-frame-type (device-or-frame)
600 "Return the type (e.g. `x' or `tty') of DEVICE-OR-FRAME.
601 DEVICE-OR-FRAME should be a device or a frame object. See `device-type'
602 for a description of the possible types."
603 (if (cdr-safe (assq 'display (frame-parameters device-or-frame)))
604 window-system
605 'tty))
606
607 (sysdep-defun device-type (&optional device)
608 "Return the type of the specified device (e.g. `x' or `tty').
609 Value is `tty' for a tty device (a character-only terminal),
610 `x' for a device which is a connection to an X server,
611 'ns' for a device which is a connection to a NeXTStep dps server,
612 'win32' for a Windows-NT window,
613 'pm' for an OS/2 Presentation Manager window,
614 'intuition' for an Amiga screen"
615 (device-or-frame-type device))
616
617 (sysdep-defun device-type-list ()
618 "Return a list of valid console types."
619 (if window-system
620 (list window-system 'tty)
621 (list 'tty)))
622
623 (sysdep-defun valid-device-type-p (type)
624 "Given a TYPE, return t if it is valid."
625 (memq type (device-type-list)))
626
627
628 ;; Extent stuff
629 (sysdep-fset 'delete-extent 'delete-overlay)
630 (sysdep-fset 'extent-end-position 'overlay-end)
631 (sysdep-fset 'extent-start-position 'overlay-start)
632 (sysdep-fset 'set-extent-endpoints 'move-overlay)
633
634 (sysdep-defun extent-property (extent property &optional default)
635 (or (overlay-get extent property) default))
636
637 (sysdep-defun extent-at (pos &optional object property before at-flag)
638 (let ((tmp (overlays-at (point)))
639 ovls)
640 (if property
641 (while tmp
642 (if (extent-property (car tmp) property)
643 (setq ovls (cons (car tmp) ovls)))
644 (setq tmp (cdr tmp)))
645 (setq ovls tmp
646 tmp nil))
647 (car-safe
648 (sort ovls
649 (function
650 (lambda (a b)
651 (< (- (extent-end-position a) (extent-start-position a))
652 (- (extent-end-position b) (extent-start-position b)))))))))
653
654
655 (sysdep-defun overlays-in (beg end)
656 "Return a list of the overlays that overlap the region BEG ... END.
657 Overlap means that at least one character is contained within the overlay
658 and also contained within the specified region.
659 Empty overlays are included in the result if they are located at BEG
660 or between BEG and END."
661 (let ((ovls (overlay-lists))
662 tmp retval)
663 (if (< end beg)
664 (setq tmp end
665 end beg
666 beg tmp))
667 (setq ovls (nconc (car ovls) (cdr ovls)))
668 (while ovls
669 (setq tmp (car ovls)
670 ovls (cdr ovls))
671 (if (or (and (<= (overlay-start tmp) end)
672 (>= (overlay-start tmp) beg))
673 (and (<= (overlay-end tmp) end)
674 (>= (overlay-end tmp) beg)))
675 (setq retval (cons tmp retval))))
676 retval))
677
678 (sysdep-defun map-extents (function &optional object from to
679 maparg flags property value)
680 (let ((tmp (overlays-in (or from (point-min))
681 (or to (point-max))))
682 ovls)
683 (if property
684 (while tmp
685 (if (extent-property (car tmp) property)
686 (setq ovls (cons (car tmp) ovls)))
687 (setq tmp (cdr tmp)))
688 (setq ovls tmp
689 tmp nil))
690 (catch 'done
691 (while ovls
692 (setq tmp (funcall function (car ovls) maparg)
693 ovls (cdr ovls))
694 (if tmp
695 (throw 'done tmp))))))
696
697 ;; misc
698 (sysdep-defun alist-to-plist (alist)
699 "Convert association list ALIST into the equivalent property-list form.
700 The plist is returned. This converts from
701
702 \((a . 1) (b . 2) (c . 3))
703
704 into
705
706 \(a 1 b 2 c 3)
707
708 The original alist is not modified. See also `destructive-alist-to-plist'."
709 (let (plist)
710 (while alist
711 (let ((el (car alist)))
712 (setq plist (cons (cdr el) (cons (car el) plist))))
713 (setq alist (cdr alist)))
714 (nreverse plist)))
715
716 (sysdep-defun add-minor-mode (toggle name &optional keymap after toggle-fun)
717 "Add a minor mode to `minor-mode-alist' and `minor-mode-map-alist'.
718 TOGGLE is a symbol which is used as the variable which toggle the minor mode,
719 NAME is the name that should appear in the modeline (it should be a string
720 beginning with a space), KEYMAP is a keymap to make active when the minor
721 mode is active, and AFTER is the toggling symbol used for another minor
722 mode. If AFTER is non-nil, then it is used to position the new mode in the
723 minor-mode alists. TOGGLE-FUN specifies an interactive function that
724 is called to toggle the mode on and off; this affects what appens when
725 button2 is pressed on the mode, and when button3 is pressed somewhere
726 in the list of modes. If TOGGLE-FUN is nil and TOGGLE names an
727 interactive function, TOGGLE is used as the toggle function.
728
729 Example: (add-minor-mode 'view-minor-mode \" View\" view-mode-map)"
730 (if (not (assq toggle minor-mode-alist))
731 (setq minor-mode-alist (cons (list toggle name) minor-mode-alist)))
732 (if (and keymap (not (assq toggle minor-mode-map-alist)))
733 (setq minor-mode-map-alist (cons (cons toggle keymap)
734 minor-mode-map-alist))))
735
736 (sysdep-defvar x-font-regexp-foundry-and-family
737 (let ((- "[-?]")
738 (foundry "[^-]+")
739 (family "[^-]+")
740 )
741 (concat "\\`[-?*]" foundry - "\\(" family "\\)" -)))
742
743 (sysdep-defun match-string (num &optional string)
744 "Return string of text matched by last search.
745 NUM specifies which parenthesized expression in the last regexp.
746 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
747 Zero means the entire text matched by the whole regexp or whole string.
748 STRING should be given if the last search was by `string-match' on STRING."
749 (if (match-beginning num)
750 (if string
751 (substring string (match-beginning num) (match-end num))
752 (buffer-substring (match-beginning num) (match-end num)))))
753
754 (sysdep-defun add-hook (hook-var function &optional at-end)
755 "Add a function to a hook.
756 First argument HOOK-VAR (a symbol) is the name of a hook, second
757 argument FUNCTION is the function to add.
758 Third (optional) argument AT-END means to add the function at the end
759 of the hook list instead of the beginning. If the function is already
760 present, this has no effect.
761 Returns nil if FUNCTION was already present in HOOK-VAR, else new
762 value of HOOK-VAR."
763 (if (not (boundp hook-var)) (set hook-var nil))
764 (let ((old (symbol-value hook-var)))
765 (if (or (not (listp old)) (eq (car old) 'lambda))
766 (setq old (list old)))
767 (if (member function old)
768 nil
769 (set hook-var
770 (if at-end
771 (append old (list function)) ; don't nconc
772 (cons function old))))))
773
774 (sysdep-defalias 'valid-color-name-p
775 (cond
776 ((fboundp 'x-valid-color-name-p) ; XEmacs/Lucid
777 'x-valid-color-name-p)
778 ((and window-system
779 (fboundp 'color-defined-p)) ; NS/Emacs 19
780 'color-defined-p)
781 ((and window-system
782 (fboundp 'x-color-defined-p)) ; Emacs 19
783 'x-color-defined-p)
784 ((fboundp 'get-color) ; Epoch
785 (function (lambda (color)
786 (let ((x (get-color color)))
787 (if x
788 (setq x (progn
789 (free-color x)
790 t)))
791 x))))
792 (t 'identity))) ; All others
793
794 ;; Misc.
795 (sysdep-defun split-string (string pattern)
796 "Return a list of substrings of STRING which are separated by PATTERN."
797 (let (parts (start 0))
798 (while (string-match pattern string start)
799 (setq parts (cons (substring string start (match-beginning 0)) parts)
800 start (match-end 0)))
801 (nreverse (cons (substring string start) parts))
802 ))
803
804 (sysdep-defun member (elt list)
805 (while (and list (not (equal elt (car list))))
806 (setq list (cdr list)))
807 list)
808
809 (sysdep-defun rassoc (key list)
810 (let ((found nil))
811 (while (and list (not found))
812 (if (equal (cdr (car list)) key) (setq found (car list)))
813 (setq list (cdr list)))
814 found))
815
816 (sysdep-defun display-error (error-object stream)
817 "Display `error-object' on `stream' in a user-friendly way."
818 (funcall (or (let ((type (car-safe error-object)))
819 (catch 'error
820 (and (consp error-object)
821 (symbolp type)
822 ;;(stringp (get type 'error-message))
823 (consp (get type 'error-conditions))
824 (let ((tail (cdr error-object)))
825 (while (not (null tail))
826 (if (consp tail)
827 (setq tail (cdr tail))
828 (throw 'error nil)))
829 t)
830 ;; (check-type condition condition)
831 (get type 'error-conditions)
832 ;; Search class hierarchy
833 (let ((tail (get type 'error-conditions)))
834 (while (not (null tail))
835 (cond ((not (and (consp tail)
836 (symbolp (car tail))))
837 (throw 'error nil))
838 ((get (car tail) 'display-error)
839 (throw 'error (get (car tail)
840 'display-error)))
841 (t
842 (setq tail (cdr tail)))))
843 ;; Default method
844 (function
845 (lambda (error-object stream)
846 (let ((type (car error-object))
847 (tail (cdr error-object))
848 (first t))
849 (if (eq type 'error)
850 (progn (princ (car tail) stream)
851 (setq tail (cdr tail)))
852 (princ (or (get type 'error-message) type)
853 stream))
854 (while tail
855 (princ (if first ": " ", ") stream)
856 (prin1 (car tail) stream)
857 (setq tail (cdr tail)
858 first nil)))))))))
859 (function
860 (lambda (error-object stream)
861 (princ "Peculiar error " stream)
862 (prin1 error-object stream))))
863 error-object stream))
864
865 (sysdep-defun find-face (face)
866 (car-safe (memq face (face-list))))
867
868 ;; window functions
869
870 ;; not defined in v18
871 (sysdep-defun eval-buffer (bufname &optional printflag)
872 (save-excursion
873 (set-buffer bufname)
874 (eval-current-buffer)))
875
876 (sysdep-defun window-minibuffer-p (window)
877 "Returns non-nil if WINDOW is a minibuffer window."
878 (eq window (minibuffer-window)))
879
880 ;; not defined in v18
881 (sysdep-defun window-live-p (window)
882 "Returns t if OBJ is a window which is currently visible."
883 (and (windowp window)
884 (window-point window)))
885
886 ;; this parenthesis closes the if statement at the top of the file.
887
888 )
889
890 ;; DO NOT put a provide statement here. This file should never be
891 ;; loaded with `require'. Use `load-library' instead.
892
893 ;;; sysdep.el ends here
894
895 ;;;(sysdep.el) Local Variables:
896 ;;;(sysdep.el) eval: (put 'sysdep-defun 'lisp-indent-function 'defun)
897 ;;;(sysdep.el) eval: (put 'sysdep-defalias 'lisp-indent-function 'defun)
898 ;;;(sysdep.el) eval: (put 'sysdep-defconst 'lisp-indent-function 'defun)
899 ;;;(sysdep.el) eval: (put 'sysdep-defvar 'lisp-indent-function 'defun)
900 ;;;(sysdep.el) End: