# Thumbnails

SetEnv ThumbWidth 128
SetEnv ThumbHeight 128

# One of (best to worst): resize, scale, sample
SetEnv ThumbQuality "resize"
SetEnv ThumbBorderColor "gray"

SetEnv ThumbDirectory "/tmp"
SetEnv ThumbIconDirectory "$[FVWM_CONFIGDIR]/bigicons"

#SetEnv SelectOnReleaseKey Alt_L

DestroyFunc Thumbnail
AddToFunc Thumbnail
+ I Current (!Iconifiable) Break
+ I CreateThumbnail

DestroyFunc DeThumbnail
AddToFunc DeThumbnail
+ I Nop
+ D Focus-CurrentDesk

DestroyFunc CloseThumbnail
AddToFunc CloseThumbnail
+ D RemoveThumbnail
+ D Close

DestroyFunc CreateThumbnail
AddToFunc CreateThumbnail
+ I Raise
+ I Piperead "xwd -silent -id $[w.id] > $[ThumbDirectory]/icon.tmp.$[w.id].xwd"
+ I Iconify
+ I State 4 true
+ I State 5 true
+ I Exec nice -19 convert -$[ThumbQuality] $[ThumbWidth]x$[ThumbHeight] -frame 1x1 \
    -mattecolor $[ThumbBorderColor] -quality 0 \
    xwd:$[ThumbDirectory]/icon.tmp.$[w.id].xwd png:$[ThumbDirectory]/icon.tmp.$[w.id].png; \
    rm $[ThumbDirectory]/icon.tmp.$[w.id].xwd; bigiconname=`basename "$[w.miniiconfile]"`; test -f $[ThumbIconDirectory]/${bigiconname} && composite -geometry +5+5 \
    $[ThumbIconDirectory]/${bigiconname} $[ThumbDirectory]/icon.tmp.$[w.id].png $[ThumbDirectory]/icon.tmp.$[w.id].png; \
    FvwmCommand 'WindowId $[w.id] WindowStyle NeverFocus, FixedPosition, Colorset $[cs-quakeconsole], HilightColorset $[cs-quakeconsole], EWMHMiniIconOverride, IconOverride, Icon $[ThumbDirectory]/icon.tmp.$[w.id].png, MiniIcon $[ThumbDirectory]/icon.tmp.$[w.id].png'; \
    FvwmCommand 'WindowId $[w.id] Layer 0 2'

# {{{ Comments about RemoveThumbnail
# In FVWM-Crystal thumbnails are de-iconified using "Iconify false" command.
# FvwmEvent module catches this event and starts 'RemoveThumbnail' function.
# Because there are two instances of FvwmEvent, we can make a double-loop and
# do two things in one complex function:
# How thumbnail system works:
# While thumbnail is created, two States are set (4 & 5). When
# 'RemoveThumbnail' is called, it does:
# (first FvwmEvent instance)
# - check if State 5 is set, if yes, then try to de-iconify and focus a window
# (currently impossible because of the window's Styles)
# - check if State 4 is set, if yes, then remove the thumbnail and reset
# window's Syles
# - unset State 4
# (second FvwmEvent instance)
# - check if State 5 is set, if yes, then try to de-iconify and focus a window
# (now doable)
# - check if State 4 is set, if no, unset State 5 and break
# The result is focused window after de-iconification and cleaned up thumbnail
# image. }}}
DestroyFunc RemoveThumbnail
AddToFunc RemoveThumbnail
+ I ThisWindow (!State 5) Break
+ I WindowId $[w.id] Focus-CurrentDesk
+ I ThisWindow (!State 4) State 5 false
+ I ThisWindow (!State 4) Break
+ I PipeRead "echo WindowStyle Icon \\$\\[Icon-$[w.id]\\]"
+ I PipeRead "echo WindowId $[w.id] Layer 0 4"
+ I UnsetEnv Icon-$[w.id]
+ I DestroyWindowStyle
+ I Exec exec rm -f $[ThumbDirectory]/icon.tmp.$[w.id].png
+ I State 4 false

DestroyFunc ThumbnailListFunc
AddToFunc ThumbnailListFunc
+ I Focus-CurrentDesk

DestroyFunc ThumbnailList
AddToFunc ThumbnailList
+ I WindowList "$*" Function ThumbnailListFunc CurrentDesk NoGeometry MaxLabelWidth 30 OnlyIcons NoHotkeys NoCurrentDeskTitle SelectOnRelease $[SelectOnReleaseKey]

DestroyFunc Thumbnails-Off
AddToFunc Thumbnails-Off
+ I DestroyFunc Thumbnail
+ I AddToFunc Thumbnail I Current (!Iconifiable) Break
+ I AddToFunc Thumbnail I Iconify

DestroyFunc Thumbnails-On
AddToFunc Thumbnails-On
+ I DestroyFunc Thumbnail
+ I AddToFunc Thumbnail I Current (!Iconifiable) Break
+ I AddToFunc Thumbnail I CreateThumbnail

# Just a little trick to make sure that all icons will be shown even if there is no MiniIcon set
Style * MiniIcon none

# Small test to check if ImageMagick is installed
#Thumbnails-Off
#Test (x convert) Thumbnails-On

