Generic_Window_Manager/data/mwm-icon.gwm

900 lines
26 KiB
Plaintext

;;File: mwm-icon.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
(: icon.size.width (+ (# 0 iconImageMaximum) 12))
(df icon-menu-open ()
(if iconClick
(with (theIcon window
window window-window
theMenu (window-menu)
theMenuWob (menu-wob theMenu)
window theIcon
x window-x
y (- window-y (height theMenuWob))
)
(if (< y 0) (: y (+ window-y window-height)))
(if (> (+ x (width theMenuWob)) screen-width)
(: x (- screen-width (width theMenuWob))))
(move-window theMenuWob x y)
(menu.pop (window-menu) 1 'here)
(with (wob theMenuWob) (## 'current-valid-item wob 0))
(send-user-event 'goto-activable theMenuWob)
(if (# 0 (valid-items theMenuWob))
(send-user-event 'select-item (# 0 (valid-items theMenuWob))))
)
)
)
; MWM-ICON-FSM :
; ============
(: icon-standard-behavior
(state-make
(on focus-out (progn ;(? "focus leaving icon " window-name "\n")
(maintain-focus-out)))
(on focus-in (progn ;(? "focus in icon " window-name "\n")
(maintain-focus-in)))
(on (buttonrelease 1 alone)
(progn
(: double-click-required window)
(: time-of-last-release (current-event-time))
(icon-menu-open)
)
)
(if (= keyboardFocusPolicy 'explicit)
(on (buttonpress 1 alone)
(progn
(if (not (# 'got-focus window-property))
(progn
(set-focus)
(: resize-flag ())
(if passSelectButton
(ungrab-server-and-replay-event ())
(allow-event-processing))
(unset-grabs (buttonpress 1 alone))
)
(progn
(allow-event-processing)
(if (= double-click-required window)
(progn
(if (< (- (current-event-time) time-of-last-release)
doubleClickTime)
(send-user-event 'double-click
double-click-required))
(: double-click-required ()))
)
)
)
)
)
)
(if (= keyboardFocusPolicy 'explicit)
(on enter-window
(if (not (# 'got-focus window-property))
(set-grabs (replayable-event (buttonpress 1 alone)))))
(on enter-window (set-focus))
)
(if (not (= keyboardFocusPolicy 'explicit))
(on leave-window (send-user-event 'leave-window)))
(if (not (= keyboardFocusPolicy 'explicit))
(on (user-event 'leave-window)
(if (or (not completeIconNameOnFocusIn)
(in-menu-name-test))
(if (not (current-event-from-grab))
(progn ;(? "Should be leaving.\n")
(set-focus ()))
(with (cmp (current-mouse-position)
cmpx (- (# 0 cmp) window-x)
cmpy (- (# 1 cmp) window-y)
)
(if (not (and (> cmpx 0) (> cmpy 0)
(< cmpx window-width)
(< cmpy window-height)))
(progn ;(? "Should be leaving2.")
(set-focus ()))
)
)
)
)
))
(on (user-event 'test-in-icon)
(with (cmp (current-mouse-position) x (# 0 cmp) y (# 1 cmp))
(: in-icon (and (> x window-x) (> y window-y)
(< x (+ window-x window-width))
(< y (+ window-y window-height))
)
)
))
(on (user-event 'double-click) (mwm-de-iconify-window))
)
)
(df in-menu-name-test ()
(if (# 'focus-in-menu-name-placed window)
(with (cmp (current-mouse-position) x (# 0 cmp) y (# 1 cmp))
(: in-menu-name ())
(send-user-event 'test-in-menu-name
(menu-wob (# 'focus-in-menu-name window)))
(not in-menu-name))
t))
(df mwm-icon-fsm ()
(fsm-make
(state-make
(# 0 (# 'icon keyBindings))
(# 'wfsm (menu-wob menu))
icon-standard-behavior
(do-bindings-state '(icon))
)
)
)
; MWM-ICON-FRAME-FSM :
; ------------------
(: mwm-icon-frame-fsm
(fsm-make
(state-make
(on (user-event 'focus-in) (: wob-tile (# 'activepixmap wob)) )
(on (user-event 'focus-out) (: wob-tile (# 'pixmap wob)) )
(on (buttonpress 1 alone)
(progn
(if (= double-click-required window)
(progn
(if (< (- (current-event-time) time-of-last-release)
doubleClickTime)
(send-user-event 'double-click double-click-required)
(do-binding-button 1 alone 'press '(icon))
)
(: double-click-required ())
)
(progn
(: double-click-required ())
(do-binding-button 1 alone 'press '(icon))
)
)
)
)
(on (buttonrelease 1 alone)
(progn
(: double-click-required window)
(: time-of-last-release (current-event-time))
(icon-menu-open)
)
)
(do-bindings-state '(icon))
)
)
)
; THE BARS :
; ========
(: fimn-height (+ 3 iconFontList.height (* 2 label-vertical-margin)))
(de shadow-focus-in-menu-name-pixmap.make (top)
(with (
foreground iconActiveBottomShadowColor
h fimn-height
theTile (pixmap-make 2 h)
)
(if top
(with (foreground iconActiveTopShadowColor)
(draw-line theTile 0 0 0 (- h 1))
(draw-line theTile 1 0 1 (- h 2))
)
(progn
(with (foreground iconActiveTopShadowColor)
(draw-line theTile 0 0 0 1)
)
(with (foreground iconActiveBottomShadowColor)
(draw-line theTile 0 1 1 1)
)
)
)
theTile
)
)
(: left-focus-in-menu-name-plug
(with (
cursor frame-cursor
fsm () ;mwm-icon-frame-fsm
tile (shadow-focus-in-menu-name-pixmap.make t)
borderwidth 0
menu ()
)
(plug-make tile)
)
)
(: right-focus-in-menu-name-plug
(with (
cursor frame-cursor
fsm () ;mwm-icon-frame-fsm
tile (shadow-focus-in-menu-name-pixmap.make ())
borderwidth 0
menu ()
)
(plug-make tile)
)
)
(: focus-in-menu-name-tile
(with (foreground iconActiveBackground
h fimn-height
w (+ icon.size.width (/ icon.size.width 2))
theTile (pixmap-make w h)
)
(with (foreground iconActiveTopShadowColor)
(draw-line theTile 0 0 (- w 1) 0)
;(draw-line theTile 0 1 (- w 1) 1)
)
(with (foreground iconActiveBottomShadowColor)
(draw-line theTile 0 (- h 1) (- w 1) (- h 1))
(draw-line theTile 0 (- h 2) (- w 1) (- h 2))
)
theTile
)
)
(: focus-in-menu-min-width-bar
(with (
foreground iconActiveTopShadowColor
fsm ()
borderwidth 0
)
(bar-make (plug-make (pixmap-make (+ icon.size.width (/ icon.size.width 2)) 1) ) ())
)
)
(: icon-right-bar
(with (
cursor frame-cursor
fsm mwm-icon-frame-fsm
pixmap (pixmap-make iconBackground
"mwm-icrt" iconTopShadowColor
"mwm-icrb" iconBottomShadowColor
)
activepixmap (pixmap-make iconActiveBackground
"mwm-icrt" iconActiveTopShadowColor
"mwm-icrb" iconActiveBottomShadowColor
)
property (list 'pixmap pixmap 'activepixmap activepixmap)
tile pixmap
borderwidth 0
bar-min-width 5
)
(bar-make)
)
)
(: icon-left-bar
(with (
cursor frame-cursor
fsm mwm-icon-frame-fsm
pixmap (pixmap-make iconBackground
"mwm-iclt" iconTopShadowColor
"mwm-iclb" iconBottomShadowColor
)
activepixmap (pixmap-make iconActiveBackground
"mwm-iclt" iconActiveTopShadowColor
"mwm-iclb" iconActiveBottomShadowColor
)
property (list 'pixmap pixmap 'activepixmap activepixmap)
tile pixmap
borderwidth 0
bar-min-width 5
)
(bar-make)
)
)
(: icon-tl-plug
(with (
pixmap (pixmap-make iconBackground
"mwm-ictlt" iconTopShadowColor
"mwm-ictlb" iconBottomShadowColor)
activepixmap (pixmap-make iconActiveBackground
"mwm-ictlt" iconActiveTopShadowColor
"mwm-ictlb" iconActiveBottomShadowColor)
property (list 'pixmap pixmap 'activepixmap activepixmap)
fsm mwm-icon-frame-fsm
borderwidth 0
cursor frame-cursor
)
(plug-make pixmap)
)
)
(: icon-tr-plug
(with (
cursor frame-cursor
pixmap (pixmap-make iconBackground
"mwm-ictrt" iconTopShadowColor
"mwm-ictrb" iconBottomShadowColor)
activepixmap (pixmap-make iconActiveBackground
"mwm-ictrt" iconActiveTopShadowColor
"mwm-ictrb" iconActiveBottomShadowColor)
property (list 'pixmap pixmap 'activepixmap activepixmap)
fsm mwm-icon-frame-fsm
borderwidth 0
)
(plug-make pixmap)
)
)
(: icon-top-bar
(with (
cursor frame-cursor
pixmap (pixmap-make iconBackground
"mwm-ictt" iconTopShadowColor
"mwm-ictb" iconBottomShadowColor)
activepixmap (pixmap-make iconActiveBackground
"mwm-ictt" iconActiveTopShadowColor
"mwm-ictb" iconActiveBottomShadowColor)
property (list 'pixmap pixmap 'activepixmap activepixmap)
tile pixmap
fsm mwm-icon-frame-fsm
borderwidth 0
bar-min-width 5
bar-max-width 5)
(bar-make icon-tl-plug () icon-tr-plug)
)
)
(: icon-bottom-bar-width (+ 12 iconFontHeight))
(de pixmap-make-icon-bl (active)
(with (tSC (if active iconActiveTopShadowColor iconTopShadowColor)
bSC (if active iconActiveBottomShadowColor iconBottomShadowColor)
foreground (if active iconActiveBackground iconBackground)
theTile (pixmap-make 5 icon-bottom-bar-width)
)
(with (foreground tSC)
(draw-line theTile 0 0 0 (- icon-bottom-bar-width 1))
(draw-line theTile 1 0 1 (- icon-bottom-bar-width 1))
(draw-line theTile 4 0 4 1)
(draw-line theTile 0 4 4 4)
)
(with (foreground bSC)
(draw-line theTile 1 3 4 3)
(draw-line theTile 1 (- icon-bottom-bar-width 1) 4 (- icon-bottom-bar-width 1))
(draw-line theTile 2 (- icon-bottom-bar-width 2) 4 (- icon-bottom-bar-width 2))
)
(with (foreground (if active iconActiveBackground iconBackground))
(draw-line theTile 3 1 4 1)
)
)
)
(: icon-bl-plug
(with (
cursor frame-cursor
fsm mwm-icon-frame-fsm
pixmap (pixmap-make-icon-bl ())
activepixmap (pixmap-make-icon-bl t)
property (list 'pixmap pixmap 'activepixmap activepixmap)
borderwidth 0
)
(plug-make pixmap)
)
)
(de pixmap-make-icon-br (active)
(with (tSC (if active iconActiveTopShadowColor iconTopShadowColor)
bSC (if active iconActiveBottomShadowColor iconBottomShadowColor)
foreground (if active iconActiveBackground iconBackground)
theTile (pixmap-make 5 icon-bottom-bar-width)
)
(with (foreground bSC)
(draw-line theTile 4 0 4 (- icon-bottom-bar-width 1))
(draw-line theTile 3 0 3 (- icon-bottom-bar-width 1))
(draw-line theTile 0 (- icon-bottom-bar-width 1) 4 (- icon-bottom-bar-width 1))
(draw-line theTile 0 (- icon-bottom-bar-width 2) 4 (- icon-bottom-bar-width 2))
(draw-line theTile 0 3 4 3)
)
(with (foreground tSC)
(draw-line theTile 0 0 0 1)
(draw-line theTile 0 4 3 4)
)
(with (foreground (if active iconActiveBackground iconBackground))
(draw-line theTile 0 1 1 1)
)
)
)
(: icon-br-plug
(with (
cursor frame-cursor
fsm mwm-icon-frame-fsm
pixmap (pixmap-make-icon-br ())
activepixmap (pixmap-make-icon-br t)
property (list 'pixmap pixmap 'activepixmap activepixmap)
borderwidth 0
)
(plug-make pixmap)
)
)
(de tile-make-icon-bottom-bar (active)
(with (tSC (if active iconActiveTopShadowColor iconTopShadowColor)
bSC (if active iconActiveBottomShadowColor iconBottomShadowColor)
foreground (if active iconActiveBackground iconBackground)
theTile (pixmap-make 2 icon-bottom-bar-width)
)
(with (foreground tSC)
(draw-line theTile 0 0 1 0)
(draw-line theTile 0 4 1 4)
)
(with (foreground bSC)
(draw-line theTile 0 3 1 3)
(draw-line theTile 0 (- icon-bottom-bar-width 1) 1 (- icon-bottom-bar-width 1))
(draw-line theTile 0 (- icon-bottom-bar-width 2) 1 (- icon-bottom-bar-width 2))
)
)
)
(: icon-tile-bottom-bar (tile-make-icon-bottom-bar ()))
(: icon-active-tile-bottom-bar (tile-make-icon-bottom-bar t))
; THE LABEL-PLUG :
; ==============
(: icon-label-plug
'(with (borderwidth 0
fsm (fsm-make
(state-make
(on (user-event 'focus-in)
(progn
(: wob-background iconActiveBackground)
(wob-tile (with (foreground iconActiveForeground)
(active-label-make (# 'theLabel wob) iconFontList)))
) )
(on (user-event 'focus-out)
(progn
(: wob-background iconBackground)
(wob-tile (with (foreground iconForeground)
(active-label-make (# 'theLabel wob) iconFontList)))
) )
(on (user-event 'name-change)
(progn
(## 'theLabel wob window-icon-name)
(wob-tile
(with (foreground
(if (= wob-background iconActiveBackground)
iconActiveForeground iconForeground))
(active-label-make window-icon-name iconFontList))
)
)
)
(on (buttonpress 1 alone)
(progn
(if (= double-click-required window)
(progn
(if (< (- (current-event-time)
time-of-last-release)
doubleClickTime)
(send-user-event 'double-click
double-click-required)
(do-binding-button 1 alone 'press '(icon))
)
(: double-click-required ())
)
(progn
(do-binding-button 1 alone 'press '(icon))
(: double-click-required ())
)
)
)
)
(on (buttonrelease 1 alone)
(progn
(: double-click-required window)
(: time-of-last-release (current-event-time))
(icon-menu-open)
)
)
(do-bindings-state '(icon))
))
background iconBackground
foreground iconForeground
font iconFontList
property (list 'theLabel window-icon-name)
)
(plug-make (label-make window-icon-name)))
)
(: icon-bottom-bar
(with (
cursor frame-cursor
foreground iconForeground
pixmap icon-tile-bottom-bar
activepixmap icon-active-tile-bottom-bar
property (list 'pixmap pixmap 'activepixmap activepixmap)
tile pixmap
fsm mwm-icon-frame-fsm
bar-min-width icon-bottom-bar-width
borderwidth 0
)
(bar-make icon-bl-plug () icon-label-plug () icon-br-plug))
)
(: focus-in-menu-name-bar
(with (
cursor frame-cursor
tile focus-in-menu-name-tile
fsm () ;mwm-icon-frame-fsm
bar-min-width fimn-height
borderwidth 0
menu ()
)
(bar-make left-focus-in-menu-name-plug () icon-label-plug
() right-focus-in-menu-name-plug)
)
)
(df center-icon-blank-pixmap ()
(with (foreground iconImageBackground
MaxX (+ (# 0 iconImageMaximum) 1)
MaxY (+ (# 1 iconImageMaximum) 1)
theTile (pixmap-make (+ MaxX 1) (+ MaxY 1))
)
(with (foreground iconImageTopShadowColor)
(draw-line theTile 0 0 MaxX 0 )
(draw-line theTile 0 0 0 MaxY)
)
(with (foreground iconImageBottomShadowColor)
(draw-line theTile 0 MaxY MaxX MaxY)
(draw-line theTile MaxX 1 MaxX MaxY)
)
theTile
)
)
(df anonymous-icon-pixmap ()
(pixmap-make iconImageBackground
(center-icon-blank-pixmap) iconImageBackground
"X.xbm" iconImageForeground
)
)
; Fsm of the center plug :
(: icon-center-plug-fsm
(fsm-make
(state-make
(on (user-event 'icon-pixmap-change)
(wob-tile
(with (iconImageBackground (color-make
(get-res-value 'iconImageBackground))
iconImageForeground (color-make
(get-res-value 'iconImageForeground))
iconImageBottomShadowColor (color-make (get-res-value
'iconImageBottomShadowColor))
iconImageTopShadowColor (color-make (get-res-value
'iconImageTopShadowColor))
simple-icon-decoration.wip (window-icon-pixmap)
)
(pixmap-make iconImageBackground
(center-icon-blank-pixmap) iconImageBackground
simple-icon-decoration.wip iconImageBackground
))))
(on (buttonpress 1 alone)
(progn
(if (= double-click-required window)
(progn
(if (< (- (current-event-time) time-of-last-release)
doubleClickTime)
(send-user-event 'double-click
double-click-required)
(do-binding-button 1 alone 'press '(icon)))
(: double-click-required ()))
(progn
(do-binding-button 1 alone 'press '(icon))
(: double-click-required ())))))
(on (buttonrelease 1 alone)
(progn
(: double-click-required window)
(: time-of-last-release (current-event-time))
(icon-menu-open)
)
)
(do-bindings-state '(icon))
)
)
)
(: focus-in-menu-name-fsm
(fsm-make
(state-make
(on (user-event 'test-in-menu-name)
(: in-menu-name (and (> x (- wob-x 1)) (> y (- wob-y 1))
(< x (+ wob-x wob-width))
(< y (+ wob-y wob-height))))
)
(on (user-event 'focus-out)
(unpop-menu))
(on leave-window
(with (cmp (current-mouse-position) x (# 0 cmp) y (# 1 cmp))
;(? "Leaving the blowup.")
(: in-icon ())
(send-user-event 'test-in-icon (# 'icon-father wob))
(if (not in-icon) (send-user-event 'leave-window))))
(on (buttonpress 1 alone)
(progn
(if (= double-click-required window)
(progn
(if (< (- (current-event-time) time-of-last-release)
doubleClickTime)
(send-user-event 'double-click double-click-required)
(do-binding-button 1 alone 'press '(icon))
)
(: double-click-required ())
)
(progn
(: double-click-required ())
(do-binding-button 1 alone 'press '(icon))
)
)
)
)
(on (buttonrelease 1 alone)
(progn
(: double-click-required window)
(: time-of-last-release (current-event-time))
(icon-menu-open)
)
)
(do-bindings-state '(icon))
)
)
)
; MWM-ICON.DATA :
; =============
(: mwm-icon
'(with (
; client specific resources :
iconImageBackground (color-make (get-res-value
'iconImageBackground))
iconImageForeground (color-make
(get-res-value 'iconImageForeground))
iconImageBottomShadowColor (color-make
(get-res-value
'iconImageBottomShadowColor))
iconImageTopShadowColor (color-make (get-res-value
'iconImageTopShadowColor))
menu (eval (atom (get-res-value 'windowMenu)))
property (list 'X () 'Y ()
'focus-in-menu-name
(with (
fsm focus-in-menu-name-fsm
borderwidth 0
menu ()
cursor ()
property ()
bar-separator 0
)
(menu-make focus-in-menu-min-width-bar
focus-in-menu-name-bar)
)
'focus-in-menu-name-placed ()
)
grabs
(+ (# 1 (# 'icon keyBindings))
(# 'wgrabs (menu-wob menu))
)
cursor frame-cursor
background iconImageBackground
foreground iconImageForeground
borderwidth 0
simple-icon-decoration.wip (window-icon-pixmap)
tmp (if (not (= (get-res-value 'iconImage) ""))
(pixmap-make (get-res-value 'iconImage))
()
)
fsm icon-center-plug-fsm
center-plug
(if (window-icon-window)
(window-icon-window)
simple-icon-decoration.wip
(plug-make
(pixmap-make iconImageBackground
(center-icon-blank-pixmap) iconImageBackground
simple-icon-decoration.wip iconImageBackground
)
)
tmp
(plug-make (pixmap-make iconImageBackground
(center-icon-blank-pixmap) iconImageBackground
tmp iconImageForeground
))
(plug-make (anonymous-icon-pixmap))
)
fsm (mwm-icon-fsm)
)
(window-make
icon-top-bar
icon-left-bar
icon-right-bar
icon-bottom-bar
center-plug
)
)
)
; Cutting of the screen in boxes to tidy away icons :
; -------------------------------------------------
(: icon.size.width (+ (# 0 iconImageMaximum) 12))
(: icon.size.height (+ (# 1 iconImageMaximum) 6 icon-bottom-bar-width))
(: nb-icons.w (/ screen-width (+ icon.size.width iconPlacementMargin)))
(: nb-icons.h (/ screen-height (+ icon.size.height iconPlacementMargin)))
(: icon-box.w (+ icon.size.width iconPlacementMargin
(/ (% screen-width (+ icon.size.width iconPlacementMargin))
nb-icons.w
)))
(: icon-box.h (+ icon.size.height iconPlacementMargin
(/ (% screen-height (+ icon.size.height iconPlacementMargin))
nb-icons.h
)))
(: icon-array (list-make (* nb-icons.w nb-icons.h)))
(: xmax (* icon-box.w (- nb-icons.w 1)))
(: ymax (* icon-box.h (- nb-icons.h 1)))
; Convert pixel-coords into array-coords :
; --------------------------------------
(de xy-to-XY (x y)
(list
(if (> x xmax) (- nb-icons.w 1) (/ x icon-box.w))
(if (> y ymax) (- nb-icons.h 1) (/ y icon-box.h))
)
)
; Convert array-coords into pixel-coords :
; --------------------------------------
(de XY-to-xy (X Y)
(list
(+ (* X icon-box.w) iconPlacementMargin)
(+ (* Y icon-box.h) iconPlacementMargin)
)
)
; Get the value (icon-wob) located at (X,Y) of the icon-array :
; -----------------------------------------------------------
(de get-icon-from-array (X Y)
(if (or (< X 0)
(< Y 0)
(> X (- nb-icons.w 1))
(> Y (- nb-icons.h 1))
)
'out
(# (+ (* Y nb-icons.w) X) icon-array)
)
)
; Set the value (icon-wob) located at (X,Y) of the icon-array :
; -----------------------------------------------------------
(de set-icon-of-array (X Y value)
(if (or (< X 0)
(< Y 0)
(> X (- nb-icons.w 1))
(> Y (- nb-icons.h 1))
)
'out
(## (+ (* Y nb-icons.w) X) icon-array value)
)
)
; Get the "icon-zone" : top-left = (-1 -1)
; ------------------- top-right = (-1 +1)
; bottom-left = (+1 -1)
; bottom-right = (+1 +1)
(de areaInBoxCoords (x y)
(list
(if (> (% x icon-box.w) (/ icon-box.w 2)) 1 -1)
(if (> (% y icon-box.h) (/ icon-box.h 2)) 1 -1)
)
)
; Get the neighbors of an "icon-box" in the icon-array,
; respencting the 'iconPlacement preferences :
; ------------------------------------------
(de neighbors (x y)
(with (theBox (xy-to-XY x y)
X (# 0 theBox)
Y (# 1 theBox)
areaInBox (areaInBoxCoords x y)
incX (# 0 areaInBox)
incY (# 1 areaInBox)
theSide (# 1 iconPlacement)
)
(if (or (= theSide 'bottom) (= theSide 'top))
(list
(list (get-icon-from-array (+ X incX) Y) (+ X incX) Y)
(list (get-icon-from-array X (+ Y incY)) X (+ Y incY))
)
(list
(list (get-icon-from-array X (+ Y incY)) X (+ Y incY))
(list (get-icon-from-array (+ X incX) Y) (+ X incX) Y)
)
)
)
)
(: right (list 'v (- nb-icons.w 1) 0 -1))
(: left (list 'v 0 nb-icons.w 1))
(: bottom (list 'h (- nb-icons.h 1) 0 -1))
(: top (list 'h 0 nb-icons.h 1))
; Get the first free box in the icon-array,
; respencting the 'iconPlacement preferences :
; ------------------------------------------
(de auto-get-place ()
(with (
theSide (eval (# 1 iconPlacement))
thePlace (eval (# 0 iconPlacement))
theSide.index (# 1 theSide)
theSide.inc (# 3 theSide)
theSide.direction (# 0 theSide)
theSide.limit (# 2 theSide)
theSide.test.limit
(if (= 1 theSide.inc)
(list '< 'theSide.index theSide.limit)
(list '> 'theSide.index (- theSide.limit 1))
)
thePlace.inc (# 3 thePlace)
thePlace.direction (# 0 thePlace)
thePlace.limit (# 2 thePlace)
thePlace.test.limit
(if (= 1 thePlace.inc)
(list '< 'thePlace.index thePlace.limit)
(list '> 'thePlace.index (- thePlace.limit 1))
)
theRes ()
)
(while (and (eval theSide.test.limit) (not theRes))
(with (thePlace.index (# 1 thePlace))
(while (and (eval thePlace.test.limit) (not theRes))
(with (
X (if (= 'v theSide.direction) theSide.index thePlace.index)
Y (if (= 'h theSide.direction) theSide.index thePlace.index)
theIcon (get-icon-from-array X Y)
)
(if (not theIcon) (: theRes (list X Y)))
)
(: thePlace.index (+ thePlace.index thePlace.inc))
)
)
(: theSide.index (+ theSide.index theSide.inc))
)
theRes
)
)