Les fontions sont une des choses que je préfère utiliser (comme vous avez pu le voir car j'écris souvent une fonction pour des simples tâches). Ceci est vrai avec la plupart des choses que vous programmez, être capable de créer de bonnes fonctions est la clé. La section “notions avancées” ne va pratiquement utiliser que des fonctions, cette partie traîte de fonctions variées.
Ces deux premières fonctions sont tirées du fichier fvwm2rc de Taviso. Elles utilisent les outils d'ImageMagick pour prendre des captures d'écran d'une fenêtre ouverte et ensuite les utilise pour une icône. La première fonction Thumbnail va prendre la capture d'écran de la fenêtre courante et utiliser cette capture pour l'icône lorsque la fenêtre aura le status “d'iconifiée”.
DestroyFunc Thumbnail AddToFunc Thumbnail + I Raise + I SetEnv Icon-$[w.id] $[w.iconfile] + I ThisWindow (!Shaded #Style_Iconifiable">Iconifiable !Iconic) PipeRead \ "xwd -silent -id $[w.id] | convert -scale $$ -frame 1x1 \ -mattecolor black -quality 0 xwd:- png:$[fvwm_tmp]/icon.tmp.$[w.id].png \ && echo Nop" + I TestRc (Match) Test (f $[fvwm_icon]/$[w.iconfile], f $[fvwm_tmp]/#Style_Icon">icon.tmp.$[w.id].png) \ PipeRead "composite -geometry +2+4 \ $[fvwm_icon]/$[w.iconfile] $[fvwm_tmp]/icon.tmp.$[w.id].png \ $[fvwm_tmp]/icon.tmp.$[w.id].png && \ echo WindowStyle IconOverride, Icon $[fvwm_tmp]/icon.tmp.$[w.id].png || echo Nop" + I TestRc (NoMatch) WindowStyle #Style_IconOverride">IconOverride, Icon $[fvwm_tmp]/icon.tmp.$[w.id].png + I Iconify DestroyFunc DeThumbnail AddToFunc DeThumbnail + I PipeRead "echo WindowStyle Icon \\$\\[Icon-$[w.id]\\]" + I UnsetEnv Icon-$[w.id] + I Exec rm -f $[fvwm_tmp]/#Style_Icon">icon.tmp.$[w.id].png
Ces fontions peuvent être utilisées à la place de “Iconify”. La fonction Thumbnail va premièrement prendre un screenshot de la fenêtre active et ensuite l'enregistrer dans un fichier temporaire. Le fichier temporaire est stoqué dans le répertoire $[fvwm_tmp], vous devez donc créer cette variable d'environnement dans votre fichier de config. Ensuite la fonction regarde si vous avez une icône (Iconfile) réglée pour la fenêtre, Test (f $[fvwm_home]/icons/$[w.iconfile]). Ceci n'existera seulement si vous avez utilisé une commande Style, par exemple : Style “Firefox-bin” Icon 48×48/firefox.png va mettre $[w.iconfile] à 48×48/firefox.png (notez que j'ai mis toutes mes icônes dans mon répertoire $[fvwm_icon]). Si ce fichier existe, alors la fonction va 'composer' ces deux pixmaps en une seule icône. Dans le cas contraire, il va mettre le screenshot de la fenêtre en icône et iconifier la fenêtre. La fonction DeThumbnail nettoie tout ça, elle remet l'icône dans son état d'origine et ensuite supprime les icônes temporaires ; ce qui fait que la prochaine fois que la fenêtre est “thumbnailé”, cela va se comporter de la même façon que la première fois (l'icône utilisée sera le screenshot de la fenêtre courante). Il y'a deux façons d'être sur que cette fonction sera appellée lorsque la fenêtre est déiconifiée. La première est d'ajouter un '+ I Iconify' à cette fonction et en créer un raccourci, ça sera donc utilisé lorsque vous allez déiconifier une fenêtre. La seconde solution que je préfère d'ailleurs est de régler le module FvwmEvent pour qu'il exécute ceci lorsque la fenêtre est déiconifiée. C'est plus joli, ça ne posera plus de problème de savoir comment la fenêtre est déiconfiée car cette fonction sera toujours active. Pour faire ceci, réglez le module FvwmEvent comme ci dessous et ensuite chargez le module au démarrage de fvwm dans votre StartFunction.
##### # FvwmEvent ########### DestroyModuleConfig FvwmEvent: * *FvwmEvent: deiconify DeThumbnail
Une dernière note à propos de ces fonctions est que lorsque vous redémarrez FVWM, toutes les icônes sont reconverties dans leur état d'origine et vous devez donc déiconifier puis iconifier les fenêtres pour retrouver les choses en ordre. Une solution à ce problème serai d'ajouter '+ I All (Iconic) ReThumbnail' à votre RestartFunction, ou ReThumbnail serait la fonction ci dessous :
DestroyFunc ReThumbnail AddToFunc ReThumbnail + I Iconify + I Thumbnail
Si tout est bien configuré alors vos icônes pour vos fenêtres iconifiées devraient ressembler aux images ci dessous :
Une autre fonction que Taviso à écrit est FvwmExpose. Cette fonction ressemble à la fonction WindowList. Elle utilise ImageMagick pour prendre un screenshot de toutes les fenêtres ouvertes et ensuite elle met ces images dans un menu qui utilise ces screenshots comme des icônes. Voici une copie de cette fonction :
##### # FvwmExpose ########### DestroyFunc FvwmExpose AddToFunc FvwmExpose + I AddToMenu FvwmExposeMenu "e x p o s e" Title + I + DynamicPopDownAction DestroyMenu FvwmExposeMenu + I All (!Iconic !Shaded AcceptsFocus)\ PipeRead "echo Raise; \ xwd -silent -id $[w.id] | convert -scale $$ -quality 0 xwd:- \ png:$[fvwm_home]/tmp/icon.exp.$[w.id].png \ && echo AddToMenu FvwmExposeMenu \ %$[fvwm_home]/tmp/icon.exp.$[w.id].png%\\\'\"$[w.name]\"\\\' WindowID $[w.id] WarpToWindow 50 50 \ && echo AddToMenu FvwmExposeMenu \\\"\\\" Nop \ + I Popup FvwmExposeMenu + I Exec exec rm -f $[fvwm_home]/tmp/icon.exp.*
Appelez cette fonction à partir d'un raccourci, par exemple chez moi j'utilise meta+clic milieu de la souris, et ceci va ouvrir le FvwmExposeMenu.