stk/STklos/Tk/Toplevel.stklos

236 lines
8.1 KiB
Plaintext

;;;;
;;;; T o p l e v e l . s t k -- Frame and Toplevel class definitions
;;;;
;;;; Copyright © 1993-1999 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
;;;;
;;;; Permission to use, copy, modify, distribute,and license this
;;;; software and its documentation for any purpose is hereby granted,
;;;; provided that existing copyright notices are retained in all
;;;; copies and that this notice is included verbatim in any
;;;; distributions. No written agreement, license, or royalty fee is
;;;; required for any of the authorized uses.
;;;; This software is provided ``AS IS'' without express or implied
;;;; warranty.
;;;;
;;;; Author: Erick Gallesio [eg@kaolin.unice.fr]
;;;; Creation date: 5-Mar-1994 17:19
;;;; Last file update: 3-Sep-1999 20:12 (eg)
(require "Basics")
(select-module STklos+Tk)
(export *top-root* children
deiconify iconify toplevel-frame toplevel-state withdraw
make-transient place-toplevel)
;=============================================================================
;
; <Frame>
;
;=============================================================================
(define-class <Frame> (<Tk-simple-widget> <Tk-sizeable>)
((class :getter class
:init-keyword :class
:allocation :tk-virtual)
(colormap :allocation :tk-virtual
:init-keyword :colormap
:allocation :tk-virtual)
(container :accessor container
:init-keyword :container
:allocation :tk-virtual)
(visual :accessor visual
:init-keyword :visual
:allocation :tk-virtual)))
(define-method tk-constructor ((self <Frame>))
Tk:frame)
;; We have a special initialization because some slots values must be
(define-method initialize ((self <Frame>) initargs)
;; passed at widget initialization. So we have to isolate these slots
;; since they cannot be initialized in a standard way
(let ((specials (special-Tk-slots self)))
(let Loop ((l initargs) (normal '()) (special '()))
(cond
((null? l)
(if (null? special)
(next-method self normal)
(next-method self `(:tk-options ,special ,@normal))))
((memv (car l) specials)
(Loop (cddr l) normal (list* (car l) (cadr l) special)))
(else (Loop (cddr l) (list* (car l) (cadr l) normal) special))))))
(define-method special-Tk-slots ((self <Frame>))
(list :class :colormap :container :visual))
(define-method children ((self <Frame>))
(let ((l (winfo 'children (slot-ref self 'Id)))
(trad (lambda (x) (let ((x (Id->instance x))) (if x (list x) '())))))
(apply append (map trad l))))
;=============================================================================
;
; <Toplevel>
;
;=============================================================================
(define-class <Toplevel> (<Frame>)
((menu :accessor menu-of
:init-keyword :menu
:allocation :tk-virtual)
(screen :getter screen
:init-keyword :screen
:allocation :tk-virtual)
(use :getter use
:init-keyword :use
:allocation :tk-virtual)
;;;;
;;;; Following slots embody the Tk:wm command options
;;;; Note: "Uncommon" slots have not been given an accessor
;;;;
(aspect :allocation :virtual
:init-keyword :aspect
:slot-ref (lambda (o) (Tk:wm 'aspect (slot-ref o 'Eid)))
:slot-set! (lambda (o v)
(apply Tk:wm 'aspect (slot-ref o 'Eid) v)))
(client :allocation :virtual
:init-keyword :client
:slot-ref (lambda (o) (Tk:wm 'client (slot-ref o 'Eid)))
:slot-set! (lambda (o v)
(Tk:wm 'client (slot-ref o 'Eid) v)))
(command :allocation :virtual
:init-keyword :command
:slot-ref (lambda (o) (Tk:wm 'command (slot-ref o 'Eid)))
:slot-set! (lambda (o v)
(Tk:wm 'command (slot-ref o 'Eid) v)))
(focus-model :allocation :virtual
:init-keyword :focus-model
:slot-ref (lambda (o) (Tk:wm 'focus (slot-ref o 'Eid)))
:slot-set! (lambda (o v)
(Tk:wm 'focus (slot-ref o 'Eid) v)))
(geometry :accessor geometry
:init-keyword :geometry
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'geometry (slot-ref o 'Eid)))
:slot-set! (lambda (o v)
(Tk:wm 'geometry (slot-ref o 'Eid) v)))
(wm-group :allocation :virtual
:init-keyword :wm-group
:slot-ref (lambda (o) (Tk:wm 'group (slot-ref o 'Eid)))
:slot-set! (lambda (o v)
(Tk:wm 'group (slot-ref o 'Eid) v)))
(icon-bitmap :accessor icon-bitmap
:init-keyword :icon-bitmap
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'iconbit (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'iconbit (slot-ref o 'Eid) v)))
(icon-mask :init-keyword :icon-mask
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'iconma (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'iconma (slot-ref o 'Eid) v)))
(icon-name :accessor icon-name
:init-keyword :icon-name
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'iconnam (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'iconnam (slot-ref o 'Eid) v)))
(icon-window :init-keyword :icon-window
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'iconwin (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'iconwin (slot-ref o 'Eid) v)))
(max-size :accessor maximum-size
:init-keyword :maximum-size
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'max (slot-ref o 'Eid)))
:slot-set! (lambda (o v)
(apply Tk:wm 'max (slot-ref o 'Eid) v)))
(min-size :accessor minimum-size
:init-keyword :minimum-size
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'min (slot-ref o 'Eid)))
:slot-set! (lambda (o v)
(apply Tk:wm 'min (slot-ref o 'Eid) v)))
(override :init-keyword :override-redirect
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'over (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'over (slot-ref o 'Eid) v)))
(pos-from :init-keyword :position-from
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'pos (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'pos (slot-ref o 'Eid) v)))
(protocol :init-keyword :protocol
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'proto (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'proto (slot-ref o 'Eid) v)))
(size-from :init-keyword :size-from
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'size (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'size (slot-ref o 'Eid) v)))
(title :accessor title
:init-keyword :title
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'title (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'title (slot-ref o 'Eid) v)))
(transient :accessor transient
:init-keyword :transient
:allocation :virtual
:slot-ref (lambda (o) (Tk:wm 'trans (slot-ref o 'Eid)))
:slot-set! (lambda (o v) (Tk:wm 'trans (slot-ref o 'Eid) v)))))
(define-method tk-constructor ((self <Toplevel>))
Tk:toplevel)
(define-method special-Tk-slots ((self <Frame>))
(list :class :colormap :container :visual :screen :use))
;=============================================================================
;
; Some <Toplevel> methods
;
;=============================================================================
(define-method deiconify ((self <Toplevel>))
(Tk:wm 'deiconify (slot-ref self 'Eid)))
(define-method iconify ((self <Toplevel>))
(Tk:wm 'iconify (slot-ref self 'Eid)))
(define-method toplevel-frame ((self <Toplevel>))
(Tk:wm 'frame (slot-ref self 'Eid)))
(define-method toplevel-state ((self <Toplevel>))
(Tk:wm 'state (slot-ref self 'Eid)))
(define-method withdraw ((self <Toplevel>))
(Tk:wm 'withdraw (slot-ref self 'Eid)))
(define-method place-toplevel ((self <Toplevel>) x y)
(set! (geometry self) (format #f "+~A+~A"x y)))
(define-method make-transient ((self <Toplevel>))
(withdraw self)
(slot-set! self 'override #t))
;=============================================================================
;
; Redefine *top-root* to a <Toplevel> accessing the root window (before
; loading this file *top-root* is set to #f)
;
;=============================================================================
(define *top-root* (if Tk:initialized?
(let ((top (allocate-instance <Toplevel> '())))
(slot-set! top 'Id *root*)
(slot-set! top 'Eid *root*)
(slot-set! top 'parent *root*)
(set-widget-data! *root* `(:instance ,top))
top)
#f))
(provide "Toplevel")