[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: system folders, screen sizes and mactcp questions
- To: Curt Stevens <stevens@sigi.cs.colorado.edu>
- Subject: Re: system folders, screen sizes and mactcp questions
- From: bill@cambridge.apple.com
- Date: Fri, 24 Jan 1992 17:57:32 -0500
- Cc: info-mcl
>I was wondering if anyone out there can help me with the following
>problems...
>
>I have written a system that needs to know where the system folder is. I
>have done this for system 7 machines (using gestalt) but I need to do it
>on 6.0.X machines as well. Can someone show me how to do this? Also how
>do I check for the current system version?
The following will work for both system 6 & 7 (though I haven't tested it
under System 6):
(defun system-folder ()
(rlet ((env :SysEnvRec)
(env-ptr :pointer))
(%setf-macptr env-ptr env)
(#_SysEnvirons :check-error 1 env-ptr)
(rlet ((pb :HparamBlockRec
:ioNamePtr (%null-ptr)
:ioVRefNum (rref env :SysEnvRec.sysVRefNum)
:ioDirID 0))
(ccl::%path-from-iopb pb))))
You can probably find a string somewhere telling the system version, but
you're really supposed to check for the precise service that you want
to use. Gestalt is good for that.
>
>I need to find out the sizes of the screens attached to the Mac running
>my application (all screens if more than one).
Here is source code for a bunch of functions that are already in
MCL 2.0. None of them are exported, so you'll need a "CCL::" package
prefix on all the symbols:
----------------------------------------------------------------------
(defun screen-attribute (screen attribute)
(#_TestDeviceAttribute screen attribute))
(defun screen-active-p (screen)
(and (screen-attribute screen $screenDevice)
(screen-attribute screen $screenActive)))
(defun screen-color-p (screen)
(screen-attribute screen $gdDevType))
(defun screen-bits (screen)
(rref (rref screen :GDevice.gdPMap) :PixMap.PixelSize))
(defun screen-position (screen)
(rref screen :GDevice.gdRect.topleft))
(defun screen-size (screen)
(subtract-points
(rref screen :GDevice.gdRect.bottomright)
(screen-position screen)))
(defmacro do-screens ((s &optional (active-only? t)) &body body)
`(with-macptrs ((,s (require-trap #_GetDeviceList :ptr)))
(loop
(if (%null-ptr-p ,s) (return))
(when ,(if active-only? `(screen-active-p ,s) t)
,@body)
(%setf-macptr ,s (require-trap #_GetNextDevice :ptr ,s :ptr)))))
(unless (assq 'do-screens *fred-special-indent-alist*)
(push '(do-screens . 1) *fred-special-indent-alist*))
; Return two values, the position and size of the best color screen
; that is near mouse-position.
; If the mouse is on any color screen and most-bits? is nil, return that screen.
; If most-bits? is true, return the color screen with the most bits using
; mouse-position only to break ties.
(defun find-best-color-screen (&key (mouse-position (view-mouse-position nil))
(most-bits? t) screen)
(if *color-available*
(rlet ((rect :rect :topleft mouse-position :bottomright (add-points mouse-position #@(1 1))))
(with-macptrs ((maxScreen (#_GetMaxDevice rect)))
(let* ((got-max? (not (%null-ptr-p maxScreen)))
(max-color? (and got-max? (screen-color-p maxScreen)))
(max-bits (if got-max? (screen-bits maxScreen) 0)))
(unless (and max-color? (not most-bits?))
(do-screens (screen)
(let ((color? (screen-color-p screen))
(bits (screen-bits screen)))
(when (or (%null-ptr-p maxScreen)
(and color? (not max-color?))
(and (eq color? max-color?)
(> bits max-bits)))
(setq max-bits bits
max-color? color?)
(%setf-macptr maxScreen screen))))))
(if screen
(%setf-macptr screen maxScreen))
(values (screen-position maxScreen) (screen-size maxScreen))))
(progn
(if screen (%setf-macptr screen (%null-ptr)))
(values #@(0 0) (make-point *screen-width* *screen-height*)))))
(defun find-screen (point &optional return-screen)
(when return-screen
(%setf-macptr return-screen (%null-ptr)))
(if *color-available*
(do-screens (screen)
(let* ((pos (screen-position screen))
(pos-h (point-h pos))
(pos-v (point-v pos))
(size (screen-size screen))
(h (point-h point))
(v (point-v point)))
(declare (fixnum pos-h pos-v h v))
(when
(and (<= pos-h h)
(<= h (the fixnum (+ pos-h (the fixnum (point-h size)))))
(<= pos-v v)
(<= v (the fixnum (+ pos-v (the fixnum (point-v size))))))
(when return-screen (%setf-macptr return-screen screen))
(return (values pos size)))))
(let ((size (make-point *screen-width* *screen-height*)))
(and (point<= #@(0 0) point size)
(values #@(0 0) size)))))
----------------------------------------------------------------------
>
>I am using MacTCP (version 1.1) and the fixed MacTCP.lisp interface.
>After I open and close about 10 tcp streams I get the following error:
>
>> Error: Error #-23048
>> While executing: CCL::TCP-HOST-ADDRESS
>> Type Command-. to abort.
>See the RestartsI menu item for further choices.
'fraid I can't help you with that one.
-----
Bill St. Clair
bill@cambridge.apple.com