home *** CD-ROM | disk | FTP | other *** search
- ;;; -*- Mode:Lisp; Syntax: Common-lisp; Package:XLIB; Base:10; Lowercase: Yes -*-
-
- (in-package :xlib)
-
- (defun hello-world (host &rest args &key (string "Hello World") (font "fixed"))
- ;; CLX demo, says STRING using FONT in its own window on HOST
- (let ((display nil)
- (abort t))
- (unwind-protect
- (progn
- (setq display (open-display host))
- (multiple-value-prog1
- (let* ((screen (display-default-screen display))
- (black (screen-black-pixel screen))
- (white (screen-white-pixel screen))
- (font (open-font display font))
- (border 1) ; Minimum margin around the text
- (width (+ (text-width font string) (* 2 border)))
- (height (+ (max-char-ascent font) (max-char-descent font) (* 2 border)))
- (x (truncate (- (screen-width screen) width) 2))
- (y (truncate (- (screen-height screen) height) 2))
- (window (create-window :parent (screen-root screen)
- :x x :y y :width width :height height
- :background black
- :border white
- :border-width 1
- :colormap (screen-default-colormap screen)
- :bit-gravity :center
- :event-mask '(:exposure :button-press)))
- (gcontext (create-gcontext :drawable window
- :background black
- :foreground white
- :font font)))
- ;; Set window manager hints
- (set-wm-properties window
- :name 'hello-world
- :icon-name string
- :resource-name string
- :resource-class 'hello-world
- :command (list* 'hello-world host args)
- :x x :y y :width width :height height
- :min-width width :min-height height
- :input :off :initial-state :normal)
- (map-window window) ; Map the window
- ;; Handle events
- (event-case (display :discard-p t :force-output-p t)
- (exposure ;; Come here on exposure events
- (window count)
- (when (zerop count) ;; Ignore all but the last exposure event
- (with-state (window)
- (let ((x (truncate (- (drawable-width window) width) 2))
- (y (truncate (- (+ (drawable-height window)
- (max-char-ascent font))
- (max-char-descent font))
- 2)))
- ;; Draw text centered in widnow
- (clear-area window)
- (draw-glyphs window gcontext x y string)))
- ;; Returning non-nil causes event-case to exit
- nil))
- (button-press () t))) ;; Pressing any mouse-button exits
- (setq abort nil)))
- ;; Ensure display is closed when done
- (when display
- (close-display display :abort abort)))))
-