# Thumbnails

SetEnv ThumbWidth 128
SetEnv ThumbHeight 128

# Icons don't have titles
Style * NoIconTitle

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

SetEnv ThumbDirectory "/tmp"

#SetEnv SelectOnReleaseKey Alt_L

DestroyFunc Window-Iconify
AddToFunc Window-Iconify
+ I Current (!Iconifiable) Break
+ I CreateThumbnail

DestroyFunc Icon-Close
AddToFunc Icon-Close
+ I Nop
+ D PipeRead "echo WindowStyle Icon \\$\\[Icon-$[w.id]\\]"
+ D PipeRead "echo WindowId $[w.id] Layer 0 4"
+ D UnsetEnv Icon-$[w.id]
+ D DestroyWindowStyle
+ D Exec exec rm -f $[ThumbDirectory]/icon.tmp.$[w.id].png
+ 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; test -f $[w.iconfile] && composite -compose over -geometry +5+5 \
    $[w.iconfile] $[ThumbDirectory]/icon.tmp.$[w.id].png $[ThumbDirectory]/icon.tmp.$[w.id].png; \
    FvwmCommand 'WindowId $[w.id] WindowStyle NeverFocus, 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] Window-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

# Restore the thumbnails after session restart
DestroyFunc RecoverThumbnails
AddToFunc RecoverThumbnails
+ I All (*) PipeRead `if [ -e $[ThumbDirectory]/icon.tmp.$[w.id].png ]; then \
echo WindowId $[w.id] WindowStyle IconOverride, Icon $[ThumbDirectory]/icon.tmp.$[w.id].png; fi`

AddToFunc StartFunction I RecoverThumbnails

DestroyModuleConfig FvwmEvent-Icon-Thumbnails
*FvwmEvent-Icon-Thumbnails: deiconify RemoveThumbnail
Module FvwmEvent FvwmEvent-Icon-Thumbnails
Module FvwmEvent FvwmEvent-Icon-Thumbnails

# vim:ft=fvwm
