; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; File: Form3.lsp ; RCS: $Header: /users/npm/src/widgit/examples/RCS/Form3.lsp,v 2.5 1994/11/04 07:38:15 npm Exp $ ; Description: Example options panel for Bob Leichner's audio controller... ; Author: Niels Mayer ; Created: Fri Jul 27 14:00:53 1990 ; Modified: Thu Nov 3 23:33:54 1994 (Niels Mayer) npm@indeed ; Language: Lisp ; Package: N/A ; Status: X11r6 contrib release ; ; Copyright (C) 1994, Enterprise Integration Technologies Corp. and Niels Mayer. ; WINTERP 1.15-1.99, Copyright (c) 1993, Niels P. Mayer. ; WINTERP 1.0-1.14, Copyright (c) 1989-1992 Hewlett-Packard Co. and Niels Mayer. ; ; Permission to use, copy, modify, distribute, and sell this software and its ; documentation for any purpose is hereby granted without fee, provided that ; the above copyright notice appear in all copies and that both that ; copyright notice and this permission notice appear in supporting ; documentation, and that the name of Enterprise Integration Technologies, ; Hewlett-Packard Company, or Niels Mayer not be used in advertising or ; publicity pertaining to distribution of the software without specific, ; written prior permission. Enterprise Integration Technologies, Hewlett-Packard ; Company, and Niels Mayer makes no representations about the suitability of ; this software for any purpose. It is provided "as is" without express or ; implied warranty. ; ; ENTERPRISE INTEGRATION TECHNOLOGIES, HEWLETT-PACKARD COMPANY AND NIELS MAYER ; DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED ; WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ENTERPRISE ; INTEGRATION TECHNOLOGIES, HEWLETT-PACKARD COMPANY OR NIELS MAYER BE LIABLE ; FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ; RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF ; CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN ; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (require "lib-utils/motif-vers") ;define *MOTIF-1.1-OR-LATER-P* (let ( form_w sliderpnl_w btnpnl_w balance_w volume_w bass_w treble_w pb1_w pb2_w pb3_w pb4_w pb5_w ok_w ) (cond ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Code for Motif 1.1 (and later) version -- 1.0 version below has ;;; workarounds for bugs in Motif 1.0 XmForm widget. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (*MOTIF-1.1-OR-LATER-P* ;; Note use of a dummy toplevel widget (*TOPLEVEL_WIDGET*) below (setq form_w (send XM_FORM_WIDGET_CLASS :new :dialog "form" *TOPLEVEL_WIDGET* :XMN_DIALOG_TITLE "Audio Controller Options" :XMN_DELETE_RESPONSE :destroy ;resource on XM_DIALOG_POPUP_SHELL_WIDGET_CLASS parent :XMN_AUTO_UNMANAGE nil ;don't unmanage dialog after button click )) (setq sliderpnl_w (send XM_FORM_WIDGET_CLASS :new :managed "sliders" form_w :XMN_LEFT_ATTACHMENT :attach_form :XMN_BOTTOM_ATTACHMENT :attach_form :XMN_TOP_ATTACHMENT :attach_form )) (setq btnpnl_w (send XM_ROW_COLUMN_WIDGET_CLASS :new :managed "buttons" form_w :XMN_ORIENTATION :vertical :XMN_ENTRY_ALIGNMENT :alignment_center :XMN_IS_ALIGNED t :XMN_PACKING :pack_tight :XMN_TOP_ATTACHMENT :attach_form :XMN_BOTTOM_ATTACHMENT :attach_form :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET sliderpnl_w :XMN_RIGHT_ATTACHMENT :attach_form )) ;; ;; place a balance slider at bottom, horizontally stretching from ;; left side of form to the right side of the treble control ;; (setq balance_w (send XM_SCALE_WIDGET_CLASS :new :managed "balance" sliderpnl_w :XMN_TITLE_STRING "Balance" :XMN_SENSITIVE t :XMN_SHOW_VALUE t :XMN_ORIENTATION :horizontal :XMN_PROCESSING_DIRECTION :max_on_right :XMN_MAXIMUM 10 :XMN_MINIMUM -10 :XMN_LEFT_ATTACHMENT :attach_form :XMN_BOTTOM_ATTACHMENT :attach_form :XMN_RIGHT_ATTACHMENT :attach_form )) ;; ;; Create volume, bass, and treble sliders stretching across form ;; horizontally... ;; (setq volume_w (send XM_SCALE_WIDGET_CLASS :new :managed "volume" sliderpnl_w :XMN_TITLE_STRING "Vol" :XMN_SENSITIVE t :XMN_SHOW_VALUE t :XMN_ORIENTATION :vertical :XMN_PROCESSING_DIRECTION :max_on_top :XMN_MAXIMUM 100 :XMN_MINIMUM 0 :XMN_TOP_ATTACHMENT :attach_form :XMN_LEFT_ATTACHMENT :attach_form :XMN_BOTTOM_ATTACHMENT :attach_widget :XMN_BOTTOM_WIDGET balance_w )) (setq bass_w (send XM_SCALE_WIDGET_CLASS :new :managed "bass" sliderpnl_w :XMN_TITLE_STRING "Bass" :XMN_SENSITIVE t :XMN_SHOW_VALUE t :XMN_ORIENTATION :vertical :XMN_PROCESSING_DIRECTION :max_on_top :XMN_MAXIMUM 10 :XMN_MINIMUM -10 :XMN_TOP_ATTACHMENT :attach_form :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET volume_w :XMN_BOTTOM_ATTACHMENT :attach_widget :XMN_BOTTOM_WIDGET balance_w )) (setq treble_w (send XM_SCALE_WIDGET_CLASS :new :managed "treble" sliderpnl_w :XMN_TITLE_STRING "Treble" :XMN_SENSITIVE t :XMN_SHOW_VALUE t :XMN_ORIENTATION :vertical :XMN_PROCESSING_DIRECTION :max_on_top :XMN_MAXIMUM 10 :XMN_MINIMUM -10 :XMN_TOP_ATTACHMENT :attach_form :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET bass_w :XMN_BOTTOM_ATTACHMENT :attach_widget :XMN_BOTTOM_WIDGET balance_w )) ;; ;; place a column of buttons vertically on rhs of form in btnpnl ;; (setq pb1_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb1" btnpnl_w :XMN_LABEL_STRING "Jack In" )) (setq pb2_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb2" btnpnl_w :XMN_LABEL_STRING "Jack Out" )) (setq pb3_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb3" btnpnl_w :XMN_LABEL_STRING "Do Watoosi" )) (setq pb4_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb4" btnpnl_w :XMN_LABEL_STRING "Enter Hyperspace" )) (setq pb5_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb5" btnpnl_w :XMN_LABEL_STRING "Winterp-Mute" )) (setq ok_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "ok" btnpnl_w :XMN_LABEL_STRING "Ok" :XMN_SHOW_AS_DEFAULT t )) ;; ;; this causes the ok button to be pressed when is entered within the form widget. ;; (send form_w :set_values :xmn_default_button ok_w) (send form_w :manage) ;pop it up ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; The Motif 1.0 version -- workarounds for bugs in Motif 1.0 XmForm ;;; widget. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (t ;; Note use of a dummy toplevel widget (*TOPLEVEL_WIDGET*) below (setq form_w (send XM_FORM_WIDGET_CLASS :new :dialog "form" *TOPLEVEL_WIDGET* :XMN_DIALOG_TITLE "Audio Controller Options" :XMN_AUTO_UNMANAGE nil ;BulletinBoard resource -- setting to NIL prevents automatic unamange of dialog caused by clicking on pushbutton child of form_w.... )) ;; ;; Create volume, bass, and treble sliders stretching across form horizontally... ;; (setq volume_w (send XM_SCALE_WIDGET_CLASS :new :managed "volume" form_w :XMN_TITLE_STRING "Vol" :XMN_SENSITIVE t :XMN_SHOW_VALUE t :XMN_ORIENTATION :vertical :XMN_PROCESSING_DIRECTION :max_on_top :XMN_MAXIMUM 100 :XMN_MINIMUM 0 :XMN_TOP_ATTACHMENT :attach_form :XMN_LEFT_ATTACHMENT :attach_form )) (setq bass_w (send XM_SCALE_WIDGET_CLASS :new :managed "bass" form_w :XMN_TITLE_STRING "Bass" :XMN_SENSITIVE t :XMN_SHOW_VALUE t :XMN_ORIENTATION :vertical :XMN_PROCESSING_DIRECTION :max_on_top :XMN_MAXIMUM 11 :XMN_MINIMUM -10 :XMN_TOP_ATTACHMENT :attach_form :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET volume_w )) (setq treble_w (send XM_SCALE_WIDGET_CLASS :new :managed "treble" form_w :XMN_TITLE_STRING "Treble" :XMN_SENSITIVE t :XMN_SHOW_VALUE t :XMN_ORIENTATION :vertical :XMN_PROCESSING_DIRECTION :max_on_top :XMN_MAXIMUM 11 :XMN_MINIMUM -10 :XMN_TOP_ATTACHMENT :attach_form :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET bass_w )) ;; ;; place a column of buttons vertically on rhs of form ;; (setq pb1_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb1" form_w :XMN_LABEL_STRING "Jack In" :XMN_TOP_ATTACHMENT :attach_form :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET treble_w ;;; :XMN_RIGHT_ATTACHMENT :attach_form )) (setq pb2_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb2" form_w :XMN_LABEL_STRING "Jack Out" :XMN_TOP_ATTACHMENT :attach_widget :XMN_TOP_WIDGET pb1_w :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET treble_w ;;; :XMN_RIGHT_ATTACHMENT :attach_form )) (setq pb3_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb3" form_w :XMN_LABEL_STRING "Do Watoosi" :XMN_TOP_ATTACHMENT :attach_widget :XMN_TOP_WIDGET pb2_w :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET treble_w ;;; :XMN_RIGHT_ATTACHMENT :attach_form )) (setq pb4_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb4" form_w :XMN_LABEL_STRING "Enter Hyperspace" :XMN_TOP_ATTACHMENT :attach_widget :XMN_TOP_WIDGET pb3_w :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET treble_w ;;; :XMN_RIGHT_ATTACHMENT :attach_form )) (setq pb5_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "pb5" form_w :XMN_LABEL_STRING "Winterp-Mute" :XMN_TOP_ATTACHMENT :attach_widget :XMN_TOP_WIDGET pb4_w :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET treble_w ;;; :XMN_RIGHT_ATTACHMENT :attach_form )) (setq ok_w (send XM_PUSH_BUTTON_WIDGET_CLASS :new :managed "ok" form_w :XMN_LABEL_STRING "Ok" :XMN_SHOW_AS_DEFAULT 2 :XMN_TOP_ATTACHMENT :attach_widget :XMN_TOP_WIDGET pb5_w :XMN_LEFT_ATTACHMENT :attach_widget :XMN_LEFT_WIDGET treble_w ;;; :XMN_RIGHT_ATTACHMENT :attach_form )) ;; ;; place a balance slider horizontally stretching from left side of form to the ;; right side of the treble control ;; (setq balance_w (send XM_SCALE_WIDGET_CLASS :new :managed "balance" form_w :XMN_TITLE_STRING "Balance" :XMN_SENSITIVE t :XMN_SHOW_VALUE t :XMN_ORIENTATION :horizontal :XMN_PROCESSING_DIRECTION :max_on_right :XMN_MAXIMUM 10 :XMN_MINIMUM -11 :XMN_TOP_ATTACHMENT :attach_widget :XMN_TOP_WIDGET treble_w :XMN_LEFT_ATTACHMENT :attach_form :XMN_RIGHT_ATTACHMENT :attach_opposite_widget :XMN_RIGHT_WIDGET treble_w :XMN_BOTTOM_ATTACHMENT :attach_opposite_widget :XMN_BOTTOM_WIDGET ok_w )) ;; ;; this causes the ok button to be pressed when is entered within the form widget. ;; (send form_w :set_values :xmn_default_button ok_w) ;; ;; work around a resize bug for Motif 1.0 only: if these constraint resources are set before the ;; form-dialog widget is managed, then the dialog shell comes up too small ;; and doesn't display the buttons. If no right attachment is made, then all ;; the buttons come up in different sizes which looks ugly. ;; ;; ;; this pops up the form-dialog... ;; (send form_w :manage) ;pop it up (send pb1_w :set_values :XMN_RIGHT_ATTACHMENT :attach_form ) (send pb2_w :set_values :XMN_RIGHT_ATTACHMENT :attach_form ) (send pb3_w :set_values :XMN_RIGHT_ATTACHMENT :attach_form ) (send pb4_w :set_values :XMN_RIGHT_ATTACHMENT :attach_form ) (send pb5_w :set_values :XMN_RIGHT_ATTACHMENT :attach_form ) (send ok_w :set_values :XMN_RIGHT_ATTACHMENT :attach_form ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Set up callbacks... (shared between 1.0 and 1.1 versions) ;; (send pb1_w :set_callback :XMN_ACTIVATE_CALLBACK '(CALLBACK_WIDGET) '( (format T "callback called on button: ~A\n" (xm_string_get_l_to_r (car (send CALLBACK_WIDGET :get_values :xmn_label_string nil)))) )) (send pb2_w :set_callback :XMN_ACTIVATE_CALLBACK '(CALLBACK_WIDGET) '( (format T "callback called on button: ~A\n" (xm_string_get_l_to_r (car (send CALLBACK_WIDGET :get_values :xmn_label_string nil)))) )) (send pb3_w :set_callback :XMN_ACTIVATE_CALLBACK '(CALLBACK_WIDGET) '( (format T "callback called on button: ~A\n" (xm_string_get_l_to_r (car (send CALLBACK_WIDGET :get_values :xmn_label_string nil)))) )) (send pb4_w :set_callback :XMN_ACTIVATE_CALLBACK '(CALLBACK_WIDGET) '( (format T "callback called on button: ~A\n" (xm_string_get_l_to_r (car (send CALLBACK_WIDGET :get_values :xmn_label_string nil)))) )) (send pb5_w :set_callback :XMN_ACTIVATE_CALLBACK '(CALLBACK_WIDGET) '( (format T "callback called on button: ~A\n" (xm_string_get_l_to_r (car (send CALLBACK_WIDGET :get_values :xmn_label_string nil)))) )) ;; ;; unmanage the form dialog when the ok button is pressed --> pops down. ;; after unmanaging, read values of sliders.... ;; (send ok_w :set_callback :XMN_ACTIVATE_CALLBACK '() '( (format T "Volume=~A; Bass=~A; Treble=~A; Balance=~A\n" (send volume_w :get_value) (send bass_w :get_value) (send treble_w :get_value) (send balance_w :get_value) ) (send form_w :destroy) )) )