Generic_Window_Manager/data/mwm-menus.gwm

1183 lines
31 KiB
Plaintext

;;File: std-popups.gwm --
;;Author: colas@mirsa.inria.fr (Colas NAHABOO) -- Bull Research FRANCE
;;Author: Frederic CHARTON
;;Revision: 1.0 -- Sep 12 1989
;;State: Exp
;;GWM Version: 1.4
; Pop-ups
; =======
(defname 'pop-item-font screen. menuFontList)
(defname 'pop-item-height screen. 18)
(defname 'pop-label-font screen. menuFontList)
(with (font menuFontList) (: item-height (+ 4 (height "A"))))
; Offset for cascading menus :
(: menu.offset.x 8)
(: menu.offset.y -4)
(: menu-right-arrow
(with (
borderwidth 0
fsm ()
)
(plug-make
(pixmap-make menuBackground "right-arrow" menuForeground)
)
)
)
; Left and right plugs for items (-> 3D look)
(de border-plug-make (top h)
(with ( foreground (if top menuTopShadowColor menuBottomShadowColor)
fsm ()
borderwidth 0
)
(plug-make (pixmap-make 2 h) )
)
)
(: border-plug-right (border-plug-make () item-height))
(: border-plug-left (border-plug-make t item-height))
(: corner-plug (with (borderwidth 0 fsm ())
(plug-make (pixmap-make menuTopShadowColor
"cornerPlug" menuBottomShadowColor) ) ))
(: top-bar-menu
(with (fsm () borderwidth 0 background menuTopShadowColor
bar-min-width 2
bar-max-width 2)
(bar-make () corner-plug)
)
)
(: bottom-bar-menu
(with (fsm () borderwidth 0 background menuBottomShadowColor
bar-min-width 2
bar-max-width 2)
(bar-make corner-plug ())
)
)
;-------------------------------------------------------------------------
; MENU.MAKE : args = list of items obtained by item-make or pop-label-make
; =========
(df menu.make args
(with (
borderwidth 0
menu ()
cursor menu-cursor
myMenu (eval (+ '(menu-make)
(+
'(top-bar-menu)
'(blank-item-separator)
args
'(blank-item-separator)
'(bottom-bar-menu))))
)
(send-user-event 'make-opened-tile (menu-wob myMenu))
myMenu
)
)
;-------------------------------------------------------------------------
; MENU.MOVE : places the menu inside the screen
; =========
(de menu.move (theMenu x y)
(with (theMenuWob (menu-wob theMenu)
w (width theMenuWob)
h (height theMenuWob)
)
(if (> (+ y h) screen-height)
(: y (- screen-height h)))
(if (> (+ x w) screen-width)
(: x (- screen-width w)))
(move-window theMenuWob x y)
)
)
;-------------------------------------------------------------------------
; MENU.POP : "pop" of a menu : args = (menu-to-pop button-to-use <'here>)
; ========
(de menu.pop args
(with (menu-to-pop (if args (# 0 args) wob-menu)
window-of-menu window)
(if (# 1 args) (: button-menu (# 1 args)))
(send-user-event 'update-items (menu-wob menu-to-pop))
(send-user-event 'activate-menu (menu-wob menu-to-pop))
(## 'current-valid-item (menu-wob menu-to-pop) 0)
(if (> (current-event-code) 5)
(send-user-event 'select-item (# 0 (# 'valid-items
(menu-wob menu-to-pop)))))
(## 'menu-son wob (menu-wob menu-to-pop))
(## 'already-popped (menu-wob menu-to-pop) t)
(## 'father (menu-wob menu-to-pop) wob)
(setq popping-window window)
(with (grab-keyboard-also t)
(if (member 'here args)
(pop-menu menu-to-pop 'here)
(pop-menu menu-to-pop)
))
(send-user-event 'set-grabs (menu-wob menu-to-pop))
))
;-------------------------------------------------------------------------
; Borders plugs of item separators
(: separator-plug-left
(with (
fsm ()
borderwidth 0
foreground menuBackground
plug-tile (pixmap-make 4 3)
foreground menuTopShadowColor
)
(draw-line plug-tile 0 0 0 2)
(draw-line plug-tile 1 0 1 2)
(plug-make plug-tile)
)
)
(: separator-plug-right
(with (
fsm ()
borderwidth 0
foreground menuBackground
plug-tile (pixmap-make 4 3)
foreground menuBottomShadowColor
)
(draw-line plug-tile 2 0 2 2)
(draw-line plug-tile 3 0 3 2)
(plug-make plug-tile)
)
)
; Blank item separator (space between two consecutive items)
(: blank-item-separator
(with (fsm () borderwidth 0
background menuBackground
bar-min-width 3 )
(bar-make separator-plug-left () separator-plug-right )
)
)
; Item separator (line between two consecutive items)
(: item-separator
(with (fsm () borderwidth 0
tile (pixmap-make menuBackground "itemSep" menuForeground)
bar-min-width 3 background menuBottomShadowColor)
(bar-make separator-plug-left () separator-plug-right )
)
)
;-------------------------------------------------------------------------
; VARIOUS UTILITIES :
; =-=-=-=-=-=-=-=-=
; Good button checking :
(df check-button ()
(= button-menu (current-event-code))
)
(df valid-items eventual-wob
(if eventual-wob
(with (wob (eval (# 0 eventual-wob)))
(# 'valid-items wob)
)
(# 'valid-items wob)
)
)
(df set-valid-items args
(with (item-nb (eval (# 0 args)) eventual-wob (eval (# 1 args)))
(if eventual-wob
(with (wob (eval eventual-wob))
(## 'valid-items wob item-nb)
)
(## 'valid-items wob item-nb)
)
)
)
(df nb-valid-items ()
(length (# 'valid-items wob))
)
(df current-valid-item eventual-wob
(if eventual-wob
(with (wob (eval (# 0 eventual-wob)))
(# 'current-valid-item wob)
)
(# 'current-valid-item wob)
)
)
(de set-current-valid-item (item-nb)
(## 'current-valid-item wob item-nb)
)
; Is the action "f.menu" ?
(df action-is-f.menu ()
(= 'f.menu (# 0 (# 'action wob)))
)
(df menu-wob-of-action ()
(menu-wob (eval (# 1 (# 'action wob))))
)
(df menu-of-action ()
(eval (# 1 (# 'action wob)))
)
; The oldest menu father of the menu
(de menu-oldest-father (theWob)
(with (father (or (# 'father theWob) root-window))
(if (with (wob father) (= 'menu wob-status))
(menu-oldest-father father)
theWob
)
)
)
; The oldest father of the menu to grab
(de oldest-father-for-grab (theWob)
(with (father (or (# 'father theWob) root-window))
(if (with (wob father) (= 'menu wob-status))
(menu-oldest-father father)
(if (# 'is-button-menu father) father theWob)
)
)
)
; Setting of the current item :
(df fix-current-item ()
(with (i 0 listOfValidItems (valid-items wob-parent)
current-item (# i listOfValidItems))
(while current-item
(if (= wob current-item)
(progn
(with (wob wob-parent)
(## 'current-valid-item wob i)
)
(: current-item ())
)
(progn
(: i (+ i 1))
(: current-item (# i listOfValidItems))
)
)
)
)
)
(: menus-basic-state
(state-make
(on (user-event 'select-item)
(wob-tile (# 'opened-tile wob)))
(on (user-event 'goto-opened) () opened)
(on (user-event 'goto-activable) () activable)
(on (user-event 'depop) (: wob-background menuBackground) activable)
(on (user-event 'unselect-item)
(progn
(with (wob wob-parent)
(if (# 'item-menu-son wob)
(send-user-event 'depop (# 'menu-son wob)))
)
(: wob-background menuBackground)
)
)
(on (user-event 'test-item-menu-popped)
(if (action-is-f.menu)
(: in-item-menu-popped
(and (> cerx 0)
(> cery 0)
(< cerx wob-width)
(< cery wob-height)
)
)
)
)
)
)
;-------------------------------------------------------------------------
; ========================================================================
; ITEMS' FSM : 4 states : activable / non-activable / closed / opened
; ========================================================================
(setq menus.fsm
(fsm-make
;-----------------------------------------------------------ACTIVABLE
(: activable
(state-make
(on (buttonpress any any)
(if (check-button)
(progn
(if (# (current-valid-item wob-parent) (valid-items wob-parent))
(send-user-event
'unselect-item
(# (current-valid-item wob-parent) (valid-items wob-parent))
)
)
(if (action-is-f.menu)
(if (# 'already-popped wob)
(progn
(send-user-event 'unselect-item
(# (current-valid-item (menu-wob-of-action))
(valid-items (menu-wob-of-action)))
)
)
(progn
(with (theWob wob wob wob-parent)
(## 'item-menu-son wob theWob)
)
(menu.move (menu-of-action) (- (+ wob-x wob-width) menu.offset.x)
(+ wob-y menu.offset.y))
(with (theMenu (menu-of-action) wob wob-parent)
(menu.pop theMenu button-menu 'here))
)
)
)
(wob-tile (# 'opened-tile wob))
(send-user-event 'activate-menu (menu-oldest-father wob-parent))
(send-user-event 'goto-opened wob)
)
)
)
(on (user-event 'update-items)
(if (not
(with (condition (# 'enable-condition wob )
wob window-of-menu)
(eval condition))
)
(send-user-event 'disable-item wob)
(set-valid-items (+ (valid-items wob-parent) (list wob)) wob-parent)
)
)
(on (user-event 'disable-item) () non-activable)
(on (user-event 'activate-menu)
(if (= wob (# (current-valid-item wob-parent) (valid-items wob-parent)))
(if (or (not (action-is-f.menu))
(not (= wob (with (wob wob-parent) (# 'item-menu-son wob)))))
(: wob-background menuBackground)
)
)
closed)
(on (user-event 'make-opened-tile)
(## 'opened-tile wob (item-tile.make wob-width wob-height))
)
menus-basic-state
)
)
;-----------------------------------------------------------NON-ACTIVABLE
(: non-activable
(state-make
(on (buttonpress any any)
(if (check-button)
(send-user-event 'activate-menu (menu-oldest-father wob-parent))
)
)
(on (buttonrelease any any)
(if (check-button)
(send-user-event 'depop (menu-oldest-father wob-parent))
)
)
(on (user-event 'update-items)
(if
(with (condition (# 'enable-condition wob)
wob window-of-menu)
(eval condition))
(progn
(send-user-event 'enable-item wob)
(set-valid-items (+ (valid-items wob-parent) (list wob))
wob-parent)
)
)
)
(on (user-event 'enable-item) () activable)
)
)
;-----------------------------------------------------------CLOSED
(: closed
(state-make
(on enter-window
(progn
(: wob-tile (# 'opened-tile wob))
(if (action-is-f.menu)
(if (not (# 'already-popped wob))
(progn
(with (theWob wob theMenu (menu-wob-of-action) wob wob-parent)
(## 'item-menu-son wob theWob)
)
(menu.move (menu-of-action) (- (+ wob-x wob-width) menu.offset.x)
(+ wob-y menu.offset.y))
(with (theMenu (menu-of-action) wob wob-parent)
(menu.pop theMenu button-menu 'here))
(fix-current-item)
)
)
)
)
opened)
menus-basic-state
)
)
;-----------------------------------------------------------OPENED
(: opened
(state-make
(on (buttonpress any any)
(if (and (check-button) (action-is-f.menu))
(send-user-event 'activate-menu (menu-oldest-father wob-parent))
)
)
(on (buttonrelease any any)
(if (check-button)
(if (action-is-f.menu)
(progn
(fix-current-item)
(with (wob (menu-wob-of-action))
(## 'current-valid-item wob 0))
(with (theWob (oldest-father-for-grab wob-parent))
(if (# 'is-button-menu theWob)
(send-user-event 'button-release theWob))
)
(send-user-event 'goto-activable (menu-oldest-father wob-parent))
(send-user-event 'select-item
(# 0 (valid-items (menu-wob-of-action))) )
)
(progn
(setq std-popups.action (# 'action wob))
(send-user-event 'goto-activable (menu-oldest-father wob-parent))
(send-user-event 'depop (menu-oldest-father wob-parent))
(: wob-background menuBackground)
(wob wob-parent)
(wob (# 'father wob))
(with (window popping-window action-by-menu t) (eval std-popups.action))
)
)
)
)
(on leave-window
(if (action-is-f.menu)
(with (cerx (current-event-relative-x)
cery (current-event-relative-y))
(if (not
(and (> cerx 0)
(> cery 0)
(< cerx wob-width)
(< cery wob-height)
) )
(with (cex (current-event-x) cey (current-event-y)
in-menu-son ())
(send-user-event 'in-menu-son-test (menu-wob-of-action))
(if (not in-menu-son)
(progn
(: wob-background menuBackground )
(send-user-event 'goto-activable (menu-wob-of-action))
(send-user-event 'unselect-item
(# (current-valid-item (menu-wob-of-action))
(valid-items (menu-wob-of-action))))
(send-user-event 'depop (menu-wob-of-action))
(send-user-event 'goto-closed wob)
)
)
)
)
)
(progn
(: wob-background menuBackground )
(send-user-event 'goto-closed wob)
)
)
)
(on (user-event 'goto-closed) () closed)
(on (user-event 'unselect-item) (: wob-background menuBackground))
menus-basic-state
)
)
)
)
;-------------------------------------------------------------------------
; MNEMO-LABEL-MAKE : making of a label with is underlined mnemonic
; ================ or of the pixmap designed by the file "@file" .
(de mnemo-label-make (label mnemo)
(if (eq 0 (member "@" label))
(with ( pixmapFile (match "@\\(.*\\)" label 1))
(pixmap-make menuBackground pixmapFile menuForeground)
)
(if mnemo
(with (
foreground menuForeground
background menuBackground
before-mnemo (match (+ "\\(.*\\)" mnemo) label 1)
after-mnemo (match (+ "\\(.*" mnemo "\\)") label 1)
font menuFontList
x1 (if (and before-mnemo
(not (= before-mnemo "")))
(- (width before-mnemo) label-horizontal-margin)
label-horizontal-margin)
x2 (- (width after-mnemo) label-horizontal-margin)
y (- item-height 6)
)
;(? before-mnemo "!!" after-mnemo "!!" x1 "!!" x2 "\n")
(draw-line (label-make label) (- x1 1) y (- x2 2) y)
)
(with (
foreground menuForeground
background menuBackground
font menuFontList
)
(label-make label)
)
)
)
)
;-------------------------------------------------------------------------
; ITEM-TILE.MAKE : making of the selected framework of an item
; ==============
(de item-tile.make (w h)
(with (
foreground menuBackground
item-tile (pixmap-make (+ w (* 2 plug-separator)) h)
item-xmax (- w 5)
item-ymax (- h 1)
)
(with (foreground menuTopShadowColor)
(draw-line item-tile 4 0 item-xmax 0 )
(draw-line item-tile 4 1 item-xmax 1 )
(draw-line item-tile 4 0 4 item-ymax)
(draw-line item-tile 5 0 5 item-ymax)
)
(with (foreground menuBottomShadowColor)
(draw-line item-tile 4 item-ymax item-xmax item-ymax )
(draw-line item-tile 5 (- item-ymax 1) item-xmax (- item-ymax 1))
(draw-line item-tile item-xmax 0 item-xmax item-ymax )
(draw-line item-tile (- item-xmax 1) 1 (- item-xmax 1) item-ymax )
)
item-tile
)
)
;-------------------------------------------------------------------------
; ITEM-MAKE :
; =========
; args : (label mnemonic action enable-condition blank-plug accelerator)
(df item-make args
(with (
label (+ (# 0 args) "") ; assure que 'label' est une string
label-is-bitmap (eq 0 (member "@" label))
mnemo (# 1 args) action (# 2 args)
blank-plug (# 4 args) accelerator (# 5 args)
property (+
'(opened-tile ())
(list 'enable-condition (if (> (length args) 3) (# 3 args) t))
(list 'action action)
(list 'mnemonic mnemo)
'(already-popped ())
)
borderwidth 0
enable-pixmap (mnemo-label-make label mnemo)
bar-min-width (+
(if label-is-bitmap 8 4)
(height enable-pixmap))
plug-separator 4
fsm menus.fsm
background menuBackground
)
(bar-make
(if label-is-bitmap (border-plug-make t bar-min-width)
border-plug-left)
(with (borderwidth 0 font pop-item-font
menuForeground ; Dynamic binding hack--boo hiss
(if shadeDisabled
menuShadeColor
menuForeground)
background menuBackground
disable-pixmap (mnemo-label-make label mnemo)
property (list 'item-label label 'mnemo mnemo
'enable-pixmap enable-pixmap
'disable-pixmap
(if shadeDisabled disable-pixmap
(with (foreground menuForeground)
(draw-line disable-pixmap
0 (/ (height disable-pixmap) 2)
(width disable-pixmap)
(/ (height disable-pixmap) 2))))
)
fsm
(fsm-make (state-make
(on (user-event 'enable-item)
(: wob-tile (# 'enable-pixmap wob))
)
(on (user-event 'disable-item)
(: wob-tile (# 'disable-pixmap wob))
)
)
))
(plug-make enable-pixmap)
)
blank-plug
(if (not (= (# 0 action) 'f.menu)) accelerator)
()
(if (= (# 0 action) 'f.menu) menu-right-arrow)
(if label-is-bitmap (border-plug-make () bar-min-width) border-plug-right)
) )
)
;-------------------------------------------------------------------------
; POP-LABEL-MAKE : making of the menu's title
; ==============
(df pop-label-make (label)
(with (fsm ()
background menuBackground
foreground menuForeground
borderwidth 0
bar-min-width item-height bar-max-width item-height
plug-separator 4
)
(bar-make
border-plug-left
()
(with (borderwidth 0 font pop-label-font
background menuBackground foreground menuForeground)
(plug-make (mnemo-label-make label ())))
()
border-plug-right
)
)
)
;-------------------------------------------------------------------------
(de youngest-son (theWob)
(with (wob theWob son (# 'menu-son wob))
(if son (youngest-son son) wob)
)
)
(de propagate-key-event (user-evt-name)
(if (# 'menu-son wob)
(send-user-event user-evt-name (youngest-son wob))
(send-user-event user-evt-name wob)
)
)
; UPDATE-GRAB : grabs the server with flag "grab-keyboard-also" to true
; =========== on the menu oldest father of the wob, then grabs the server
; on the oldest father with flag "grab-keyborad-also" to false.
(de update-grab ()
(with (
o-father (oldest-father-for-grab wob)
m-o-father (menu-oldest-father wob)
)
(with (grab-keyboard-also t) (grab-server m-o-father))
(if (not (= o-father m-o-father)) (grab-server o-father))
)
)
; MENUS' FSM :
; ==========
(: pop-fsm
(fsm-make
(: pop-state (state-make
(on enter-window
(progn
(if (and (not (current-event-from-grab)) (# 'active wob))
(progn
(if (# 'menu-son wob)
(progn
(: in-item-menu-popped ())
(with (
cerx
(current-event-relative-x)
cery
(- (+ (current-event-relative-y) wob-y)
(with (wob (# 'item-menu-son wob)) wob-y))
)
(send-user-event 'test-item-menu-popped (# 'item-menu-son wob))
)
(if (not in-item-menu-popped)
(progn
(send-user-event 'goto-closed (# 'item-menu-son wob))
(send-user-event 'unselect-item (# 'item-menu-son wob))
;(send-user-event 'depop (# 'menu-son wob))
)
)
)
)
)
) )
)
(on (buttonpress any any)
(if (check-button)
(progn
(if (and double-click-required (= button-menu 1))
(progn
(if (< (- (current-event-time) time-of-last-release)
doubleClickTime)
(send-user-event 'double-click double-click-required)
)
(: double-click-required ())
)
)
(send-user-event 'activate-menu (menu-oldest-father wob))
)
)
)
(on (buttonrelease any any)
(if (check-button) (send-user-event 'depop (menu-oldest-father wob))) )
(on (user-event 'depop)
(progn
(if (# 'menu-son wob)
(send-user-event 'depop (# 'menu-son wob))
)
(update-grab)
(unpop-menu)
(with (father (or (# 'father wob) root-window))
(with (wob father)
(## 'already-popped wob ())
(## 'menu-son wob ())
(## 'item-menu-son wob ())
)
(send-user-event 'button-release father)
(with (wob father)
(if (not (= wob-status 'menu)) (ungrab-server))
)
)
(## 'menu-son wob ())
(## 'item-menu-son wob ())
)
)
(on (user-event 'activate-menu)
(progn
(## 'active wob t)
(if (# 'menu-son wob)
(send-user-event 'activate-menu (# 'menu-son wob))
)
)
)
(on (user-event 'goto-activable)
(progn
(## 'active wob ())
(if (# 'menu-son wob)
(send-user-event 'goto-activable (# 'menu-son wob))
)
)
)
(on (user-event 'update-items) (set-valid-items ()))
(on (user-event 'set-grabs) (update-grab))
(on (user-event 'in-menu-son-test)
(: in-menu-son (and (> cex wob-x) (> cey wob-y)
(< cex (+ wob-x wob-width))
(< cey (+ wob-y wob-height)))))
;--Keys Events :
;--UP------------------------------------------------
(on (keypress (key-make "Up") alone)
(propagate-key-event 'Up)
)
(on (user-event 'Up)
(if (valid-items)
(progn
(send-user-event 'unselect-item (# (current-valid-item) (valid-items)))
(set-current-valid-item (% (-
(if (> (current-valid-item) 0) (current-valid-item) (nb-valid-items))
1) (nb-valid-items))
)
(send-user-event 'select-item (# (current-valid-item) (valid-items)))
)
)
)
;--DOWN----------------------------------------------
(on (keypress (key-make "Down") alone)
(propagate-key-event 'Down)
)
(on (user-event 'Down)
(if (valid-items)
(progn
(send-user-event 'unselect-item (# (current-valid-item) (valid-items)))
(set-current-valid-item (% (+ (current-valid-item) 1) (nb-valid-items)))
(send-user-event 'select-item (# (current-valid-item) (valid-items)))
)
)
)
;--RIGHT---------------------------------------------
(on (keypress (key-make "Right") alone)
(propagate-key-event 'Right)
)
(on (user-event 'Right)
(with (wob (# (current-valid-item) (valid-items)))
(if (action-is-f.menu)
(with (theMenu (menu-wob-of-action))
(with (theWob wob wob wob-parent)
(## 'item-menu-son wob theWob)
)
(menu.move (menu-of-action) (- (+ wob-x wob-width) menu.offset.x)
(+ wob-y menu.offset.y))
(with (theMenu (menu-of-action) wob wob-parent)
(menu.pop theMenu button-menu 'here))
(send-user-event 'goto-activable theMenu)
(send-user-event 'select-item (# 0 (valid-items theMenu)) )
)
)
)
)
;--LEFT----------------------------------------------
(on (keypress (key-make "Left") alone)
(propagate-key-event 'Left)
)
(on (user-event 'Left)
(if (not (= wob (menu-oldest-father wob)))
(progn
(send-user-event 'goto-activable wob)
(send-user-event 'depop wob)
(update-grab)
)
)
)
(on (keypress (key-make "Return") alone)
(propagate-key-event 'Return)
)
;--RETURN--------------------------------------------
(on (user-event 'Return)
(if (valid-items)
(if (with (wob (# (current-valid-item) (valid-items)) )
(action-is-f.menu) )
(with (wob (# (current-valid-item) (valid-items)))
(if (action-is-f.menu)
(with (theMenu (menu-wob-of-action))
(with (theWob wob wob wob-parent)
(## 'item-menu-son wob theWob)
)
(menu.move (menu-of-action) (- (+ wob-x wob-width) menu.offset.x)
(+ wob-y menu.offset.y))
(with (theMenu (menu-of-action) wob wob-parent)
(menu.pop theMenu button-menu 'here))
(send-user-event 'goto-activable theMenu)
(send-user-event 'select-item (# 0 (valid-items theMenu)) )
)
)
)
(progn
(send-user-event 'unselect-item (# (current-valid-item) (valid-items)))
(with (wob (# (current-valid-item) (valid-items)))
(setq std-popups.action (# 'action wob))
(send-user-event 'depop (menu-oldest-father wob-parent))
(: wob-background menuBackground)
(wob wob-parent)
(wob (# 'father wob))
(with (action-by-menu t) (eval std-popups.action))
(send-user-event 'goto-activable wob)
)
)
)
)
)
;--ESCAPE--------------------------------------------
(on (keypress (key-make "Escape") alone)
(propagate-key-event 'Escape)
)
(on (user-event 'Escape)
(if (valid-items)
(with (wob (# (current-valid-item) (valid-items)))
(send-user-event 'unselect-item wob)
(send-user-event 'depop (menu-oldest-father wob-parent))
)
)
)
;--ANY KEY-------------------------------------------
(on (keypress any any)
(with (cec (current-event-code) cem (current-event-modifier))
(send-user-event 'keypress-any-any (menu-oldest-father wob))
)
)
(on (user-event 'keypress-any-any)
(progn
(with (theKey cec
theAcceleratorItem
(# (atom (+ "key"
(itoa
(keycode-to-keysym theKey alone))
"m" (itoa cem)))
(# 'accelerator-list wob))
theMnemonicItem
(# (atom (+ "key"
(itoa
(keycode-to-keysym theKey alone))))
(# 'mnemonic-list wob))
theItem
(if theAcceleratorItem theAcceleratorItem
theMnemonicItem)
enable (# 0 theItem)
action (# 1 theItem)
)
(if theItem
(if (eval enable)
(progn
(send-user-event 'Escape wob)
(wob (# 'father wob))
(with (action-by-menu t) (eval action))
(send-user-event 'goto-activable wob)
)
)
(if (# 'menu-son wob)
(send-user-event 'keypress-any-any (# 'menu-son wob))
)
)
)
)
)
)
)
)
)
;-------------------------------------------------------------------------
; MK-BLANK-PLUG : making of a "blank" pixmap
; =============
(de mk-blank-plug (w)
(with (fsm () foreground menuBackground borderwidth 0)
(plug-make (pixmap-make (+ 1 w) 1))
)
)
;-------------------------------------------------------------------------
;*******************************
(load "mwm-functions")
;*******************************
;-------------------------------------------------------------------------
(de modifier-string.make (theModifiers)
(with (theRes ""
i 0 l (length theModifiers)
)
(while (< i l)
(with (modifier (# i theModifiers))
(: theRes (+ theRes
(if (= modifier 'any) ""
(= modifier 'alone) ""
(= modifier 'with-alt) "Alt+"
(= modifier 'with-shift) "Shift+"
(= modifier 'with-control) "Ctrl+"
(= modifier 'with-lock) "Lock+"
(= modifier 'with-modifier-1) "Mod1+"
(= modifier 'with-modifier-2) "Mod2+"
(= modifier 'with-modifier-3) "Mod3+"
(= modifier 'with-modifier-4) "Mod4+"
(= modifier 'with-modifier-5) "Mod5+"
(= modifier 'with-button-1) "But1+"
(= modifier 'with-button-2) "But2+"
(= modifier 'with-button-3) "But3+"
(= modifier 'with-button-4) "But4+"
(= modifier 'with-button-5) "But5+"
""
)
))
)
(: i (+ i 1))
)
theRes
)
)
;============================================================================
; MWM-MENU.MAKE
;============================================================================
(df mwm-menu.make args
(with
(state pop-state
mnemonic-list ()
accelerator-list ()
wgrabs window-grabs
wbeh ()
args-for-menu.make ()
max-width-label 0
max-width-acc 0
)
(with (font menuFontList)
(for item args
(with (label (# 0 item)
acc (# 2 item))
(if (eq 0 (member "@" label))
(with ( pixmapFile (match "@\\(.*\\)" label 1))
(: label (pixmap-make menuBackground pixmapFile menuForeground))
)
)
(if label
(if (> (width label) max-width-label)
(: max-width-label (width label))))
))
)
(for item args
(with (
label (# 0 item)
mnemo (# 1 item)
acc (# 2 item)
key (# 0 acc)
modifier (# 1 acc)
fctn (# 3 item)
fctn.name (# 0 fctn)
fctn.name.string (match "[.]\\(.*\\)" fctn.name 1)
transition ()
acc-string
(+
(if (= 'atom (type modifier))
(modifier-string.make (list modifier))
(modifier-string.make (sublist 1 (length modifier)
modifier) )
)
key)
)
(if (= fctn.name 'f.separator)
(: args-for-menu.make (+ args-for-menu.make '(item-separator)))
(= fctn.name 'f.title)
(: args-for-menu.make (+ args-for-menu.make '(item-separator item-separator)
(list (list 'pop-label-make label))
'(item-separator item-separator) ))
; else
(progn
(: args-for-menu.make
(+ args-for-menu.make
(list (list
'item-make
label
mnemo
fctn (eval (atom (+ "e." fctn.name.string)))
(if acc (mk-blank-plug
(with (font menuFontList)
(- max-width-label (width label)))))
(if acc
(with (borderwidth 0
fsm ()
font menuFontList
foreground menuForeground
background menuBackground
)
(plug-make (active-label-make acc-string)))
)
))
)
)
(if (= fctn.name 'f.menu)
(progn
(: wgrabs (+ wgrabs
(with (wob (menu-wob (eval (# 1 fctn)))) (# 'wgrabs wob))))
(: wbeh (state-make wbeh
(with (wob (menu-wob (eval (# 1 fctn)))) (# 'wfsm wob))))
)
)
(if acc
(progn
(: transition
(list 'on (list 'keypress (key-make key) modifier)
(list 'if (eval (atom (+ "e." fctn.name.string)))
(list 'with '(action-by-menu t) fctn))
)
)
(: wgrabs (+ wgrabs (list (eval (list 'keypress (key-make key) modifier)))))
(: wbeh (eval (list 'state-make transition 'wbeh)))
(## (atom (+ "key" (itoa (key-make
(if (# (atom key) to-lower-case-list)
(# (atom key) to-lower-case-list) key
)
)) "m" (itoa (eval modifier))) )
'accelerator-list
(list (eval (atom (+ "e." fctn.name.string))) fctn) )
)
)
(if mnemo
(with (key mnemo modifier with-alt)
(## (atom (+ "key" (itoa (key-make (setq key
(if (# (atom mnemo) to-lower-case-list)
(# (atom mnemo) to-lower-case-list) mnemo))))))
'mnemonic-list
(list (eval (atom (+ "e." fctn.name.string))) fctn) )
(: transition
(list 'on (list 'keypress (key-make key) modifier)
(list 'if (eval (atom (+ "e." fctn.name.string)))
(list 'with '(action-by-menu t) fctn))
)
)
(: wgrabs
(+ wgrabs (list (eval
(list 'keypress (key-make key) modifier)))))
(: wbeh (eval (list 'state-make transition 'wbeh)))
(## (atom (+ "key" (itoa
(key-make
(if (# (atom key) to-lower-case-list)
(# (atom key) to-lower-case-list) key)
)) "m" (itoa (eval modifier))) )
'accelerator-list
(list (eval (atom (+ "e." fctn.name.string))) fctn) )
))
)
)
)
)
(with (
fsm (fsm-make state)
property '(father () valid-items () menu-son () item-menu-son () active ()
current-valid-item 0 wgrabs () wfsm () )
property (+ (list 'mnemonic-list mnemonic-list
'accelerator-list accelerator-list) property)
myMenu (eval (+ '(menu.make) args-for-menu.make))
wob (menu-wob myMenu)
)
(## 'wfsm wob wbeh)
(## 'wgrabs wob wgrabs)
myMenu
)
))
;------------------------------------------------------------Fin----------