Mercurial > hg > xemacs-beta
diff lisp/w3/devices.el @ 136:b980b6286996 r20-2b2
Import from CVS: tag r20-2b2
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:31:12 +0200 |
parents | |
children | 6608ceec7cf8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/w3/devices.el Mon Aug 13 09:31:12 2007 +0200 @@ -0,0 +1,341 @@ +;;; devices.el -- XEmacs device API emulation +;; Author: wmperry +;; Created: 1997/04/21 15:57:56 +;; Version: 1.2 +;; Keywords: + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Copyright (c) 1996 by William M. Perry (wmperry@cs.indiana.edu) +;;; Copyright (c) 1996, 1997 Free Software Foundation, Inc. +;;; +;;; This file is not part of GNU Emacs, but the same permissions apply. +;;; +;;; GNU Emacs is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 2, or (at your option) +;;; any later version. +;;; +;;; GNU Emacs is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Emacs; see the file COPYING. If not, write to the +;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;;; Boston, MA 02111-1307, USA. +;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; This is a complete implementation of all the device-* functions found in +;; XEmacs 19.14. A 'device' for Emacs 19 is just a frame, from which we can +;; determine the connection to an X display, etc. + +(eval-when-compile + (if (string-match "XEmacs" (emacs-version)) + (set 'byte-optimize nil))) + +(if (string-match "XEmacs" (emacs-version)) + nil +'() +(defalias 'selected-device 'ignore) +(defalias 'device-or-frame-p 'framep) +(defalias 'device-console 'ignore) +(defalias 'device-sound-enabled-p 'ignore) +(defalias 'device-live-p 'frame-live-p) +(defalias 'devicep 'framep) +(defalias 'frame-device 'identity) +(defalias 'redisplay-device 'redraw-frame) +(defalias 'redraw-device 'redraw-frame) +(defalias 'select-device 'select-frame) +(defalias 'set-device-class 'ignore) + +(defun make-device (type connection &optional props) + "Create a new device of type TYPE, attached to connection CONNECTION. + +The valid values for CONNECTION are device-specific; however, +CONNECTION is generally a string. (Specifically, for X devices, +CONNECTION should be a display specification such as \"foo:0\", and +for TTY devices, CONNECTION should be the filename of a TTY device +file, such as \"/dev/ttyp4\", or nil to refer to XEmacs' standard +input/output.) + +PROPS, if specified, should be a plist of properties controlling +device creation. + +If CONNECTION specifies an already-existing device connection, that +device is simply returned; no new device is created, and PROPS +have no effect." + (cond + ((and (eq type 'x) connection) + (make-frame-on-display connection props)) + ((eq type 'x) + (make-frame props)) + ((eq type 'tty) + nil) + (t + (error "Unsupported device-type: %s" type)))) + +(defun make-frame-on-device (type connection &optional props) + "Create a frame of type TYPE on CONNECTION. +TYPE should be a symbol naming the device type, i.e. one of + +x An X display. CONNECTION should be a standard display string + such as \"unix:0\", or nil for the display specified on the + command line or in the DISPLAY environment variable. Only if + support for X was compiled into XEmacs. +tty A standard TTY connection or terminal. CONNECTION should be + a TTY device name such as \"/dev/ttyp2\" (as determined by + the Unix command `tty') or nil for XEmacs' standard input + and output (usually the TTY in which XEmacs started). Only + if support for TTY's was compiled into XEmacs. +ns A connection to a machine running the NeXTstep windowing + system. Not currently implemented. +win32 A connection to a machine running Microsoft Windows NT or + Windows 95. Not currently implemented. +pc A direct-write MS-DOS frame. Not currently implemented. + +PROPS should be an plist of properties, as in the call to `make-frame'. + +If a connection to CONNECTION already exists, it is reused; otherwise, +a new connection is opened." + (make-device type connection props)) + +(defun make-tty-device (&optional tty terminal-type) + "Create a new device on TTY. + TTY should be the name of a tty device file (e.g. \"/dev/ttyp3\" under +SunOS et al.), as returned by the `tty' command. A value of nil means +use the stdin and stdout as passed to XEmacs from the shell. + If TERMINAL-TYPE is non-nil, it should be a string specifying the +type of the terminal attached to the specified tty. If it is nil, +the terminal type will be inferred from the TERM environment variable." + (make-device 'tty tty (list 'terminal-type terminal-type))) + +(defun make-x-device (&optional display) + (make-device 'x display)) + +(defsubst set-device-selected-frame (device frame) + "Set the selected frame of device object DEVICE to FRAME. +If DEVICE is nil, the selected device is used. +If DEVICE is the selected device, this makes FRAME the selected frame." + (select-frame frame)) + +(defsubst set-device-baud-rate (device rate) + "Set the output baud rate of DEVICE to RATE. +On most systems, changing this value will affect the amount of padding +and other strategic decisions made during redisplay." + (setq baud-rate rate)) + +(defun dfw-device (obj) + "Given a device, frame, or window, return the associated device. +Return nil otherwise." + (cond + ((windowp obj) + (window-frame obj)) + ((framep obj) + obj) + (t + nil))) + +(defsubst event-device (event) + "Return the device that EVENT occurred on. +This will be nil for some types of events (e.g. keyboard and eval events)." + (dfw-device (posn-window (event-start event)))) + +(defsubst device-connection (&optional device) + "Return the connection of the specified device. +DEVICE defaults to the selected device if omitted" + (or (cdr-safe (assq 'display (frame-parameters device))) "stdio")) + +(defun find-device (connection &optional type) + "Look for an existing device attached to connection CONNECTION. +Return the device if found; otherwise, return nil. + +If TYPE is specified, only return devices of that type; otherwise, +return devices of any type. (It is possible, although unlikely, +that two devices of different types could have the same connection +name; in such a case, the first device found is returned.)" + (let ((devices (device-list)) + (retval nil)) + (while (and devices (not nil)) + (if (equal connection (device-connection (car devices))) + (setq retval (car devices))) + (setq devices (cdr devices))) + retval)) + +(defalias 'get-device 'find-device) + +(defmacro device-baud-rate (&optional device) + "Return the output baud rate of DEVICE." + 'baud-rate) + +(defsubst device-on-window-system-p (&optional device) + "Return non-nil if DEVICE is on a window system. +This generally means that there is support for the mouse, the menubar, +the toolbar, glyphs, etc." + (and (cdr-safe (assq 'display (frame-parameters device))) t)) + +(defsubst device-name (&optional device) + "Return the name of the specified device." + (or (cdr-safe (assq 'display (frame-parameters device))) "stdio")) + +(defun device-frame-list (&optional device) + "Return a list of all frames on DEVICE. +If DEVICE is nil, the selected device will be used." + (let ((desired (device-connection device))) + (filtered-frame-list (function (lambda (x) (equal (device-connection x) + desired)))))) +(defun device-list () + "Return a list of all devices" + (let ((seen nil) + (cur nil) + (conn nil) + (retval nil) + (not-heard (frame-list))) + (while not-heard + (setq cur (car not-heard) + conn (device-connection cur) + not-heard (cdr not-heard)) + (if (member conn seen) + nil ; Already got it + (setq seen (cons conn seen) ; Whoo hoo, a new one! + retval (cons cur retval)))) + retval)) + +(defvar delete-device-hook nil + "Function or functions to call when a device is deleted. +One argument, the to-be-deleted device.") + +(defun delete-device (device &optional force) + "Delete DEVICE, permanently eliminating it from use. +Normally, you cannot delete the last non-minibuffer-only frame (you must +use `save-buffers-kill-emacs' or `kill-emacs'). However, if optional +second argument FORCE is non-nil, you can delete the last frame. (This +will automatically call `save-buffers-kill-emacs'.)" + (let ((frames (device-frame-list device))) + (run-hook-with-args 'delete-device-hook device) + (while frames + (delete-frame (car frames) force) + (setq frames (cdr frames))))) + +(defsubst device-color-cells (&optional device) + (case window-system + ((x win32 pm) (x-display-color-cells device)) + (ns (ns-display-color-cells device)) + (otherwise 1))) + +(defsubst device-pixel-width (&optional device) + (case window-system + ((x win32 pm) (x-display-pixel-width device)) + (ns (ns-display-pixel-width device)) + (otherwise (frame-width device)))) + +(defsubst device-pixel-height (&optional device) + (case window-system + ((x win32 pm) (x-display-pixel-height device)) + (ns (ns-display-pixel-height device)) + (otherwise (frame-height device)))) + +(defsubst device-mm-width (&optional device) + (case window-system + ((x win32 pm) (x-display-mm-width device)) + (ns (ns-display-mm-width device)) + (otherwise nil))) + +(defsubst device-mm-height (&optional device) + (case window-system + ((x win32 pm) (x-display-mm-height device)) + (ns (ns-display-mm-height device)) + (otherwise nil))) + +(defsubst device-bitplanes (&optional device) + (case window-system + ((x win32 pm) (x-display-planes device)) + (ns (ns-display-planes device)) + (otherwise 2))) + +(defsubst device-class (&optional device) + (case window-system + (x ; X11 + (cond + ((fboundp 'x-display-visual-class) + (let ((val (symbol-name (x-display-visual-class device)))) + (cond + ((string-match "color" val) 'color) + ((string-match "gray-scale" val) 'grayscale) + (t 'mono)))) + ((fboundp 'x-display-color-p) + (if (x-display-color-p device) + 'color + 'mono)) + (t 'color))) + (pm ; OS/2 Presentation Manager + (cond + ((fboundp 'pm-display-visual-class) + (let ((val (symbol-name (pm-display-visual-class device)))) + (cond + ((string-match "color" val) 'color) + ((string-match "gray-scale" val) 'grayscale) + (t 'mono)))) + ((fboundp 'pm-display-color-p) + (if (pm-display-color-p device) + 'color + 'mono)) + (t 'color))) + (ns + (cond + ((fboundp 'ns-display-visual-class) + (let ((val (symbol-name (ns-display-visual-class device)))) + (cond + ((string-match "color" val) 'color) + ((string-match "gray-scale" val) 'grayscale) + (t 'mono)))) + ((fboundp 'ns-display-color-p) + (if (ns-display-color-p device) + 'color + 'mono)) + (t 'mono))) + (otherwise 'color))) + +(defsubst device-class-list () + "Returns a list of valid device classes." + (list 'color 'grayscale 'mono)) + +(defsubst valid-device-class-p (class) + "Given a CLASS, return t if it is valid. +Valid classes are 'color, 'grayscale, and 'mono." + (memq class (device-class-list))) + +(defsubst device-or-frame-type (device-or-frame) + "Return the type (e.g. `x' or `tty') of DEVICE-OR-FRAME. +DEVICE-OR-FRAME should be a device or a frame object. See `device-type' +for a description of the possible types." + (or window-system 'tty)) + +(defsubst device-type (&optional device) + "Return the type of the specified device (e.g. `x' or `tty'). +Value is `tty' for a tty device (a character-only terminal), +`x' for a device which is a connection to an X server, +'ns' for a device which is a connection to a NeXTStep dps server, +'win32' for a Windows-NT window, +'pm' for an OS/2 Presentation Manager window, +'intuition' for an Amiga screen" + (device-or-frame-type device)) + +(defsubst device-type-list () + "Return a list of valid console types." + (if window-system + (list window-system 'tty) + (list 'tty))) + +(defsubst valid-device-type-p (type) + "Given a TYPE, return t if it is valid." + (memq type (device-type-list))) + +) ; This closes the conditional on whether we are in XEmacs or not + +(provide 'devices) + +(eval-when-compile + (if (string-match "XEmacs" (emacs-version)) + (set 'byte-optimize t)))