Previous: Things that are missing
The following gives a simple example that pops up a window containing a “Quit” button. Clicking on the button exits the application. Note that the application runs concurrently with CMUCL: you can evaluate forms in the listener while the Motif application is running. Exiting the application does not cause CMUCL to exit; once you have quit the application, you can run it again.
To run this example, save the code to a file named motif-example.lisp and in the CMUCL listener, type
USER> (compile-file "motif-example") ; Loading #p"/opt/cmucl/lib/cmucl/lib/subsystems/clm-library.x86f". ;; Loading #p"/opt/cmucl/lib/cmucl/lib/subsystems/clx-library.x86f". ; Byte Compiling Top-Level Form: ; Converted my-callback. ; Compiling defun my-callback: ; Converted test-init. ; Compiling defun test-init: ; Converted test. ; Compiling defun test: ; Byte Compiling Top-Level Form: #p"/home/CMUCL/motif-example.x86f" nil nil USER> (load *) ; Loading #p"/home/CMUCL/motif-example.x86f". t USER> (motif-example:test) #<X Toolkit Connection, fd=5> Got callback on #<X Toolkit Widget: push-button-gadget 82D89A0> Callback reason was cr-activate Quit button is #<X Toolkit Widget: push-button-gadget 82D7AD0> USER> (quit)
The source code:
;;; file motif-example.lisp (eval-when (:load-toplevel :compile-toplevel) (require :clm)) (defpackage :motif-example (:use :cl :toolkit) (:export #:test)) (in-package :motif-example) (defun my-callback (widget call-data quit) (format t "Got callback on ~A~%" widget) (format t "Callback reason was ~A~%" (any-callback-reason call-data)) (format t "Quit button is ~A~%" quit)) (defun test-init () (let* ((shell (create-application-shell)) (rc (create-row-column shell "rowColumn")) (quit (create-push-button-gadget rc "quitButton" :label-string "Quit")) (button (create-push-button-gadget rc "button" :highlight-on-enter t :shadow-thickness 0 :label-string "This is a button"))) (add-callback quit :activate-callback #'quit-application-callback) (add-callback button :activate-callback 'my-callback quit) (manage-child rc) (manage-children quit button) (realize-widget shell))) (defun test () (run-motif-application 'test-init))