##########################################################################
# Fichier de configuration ~/.fvwm/config
# Debian unstable sur Apple ibook G4 1.2Ghz 12"
# Dernière modification : 2008-05-20
# B. Zhang <bb.zhang@free.fr>, http://bz31.tuxfamily.org
##########################################################################



############################ Objectifs ################################

# - Configuration simple en un seul fichier ~/.fvwm/config
# - Adatper à l'usage sur un portable sans souris et avec un petit
#   écran 12".
# - Des raccourcis claviers pour se déplacer dans les bureaux virtuels et
#   pour lancer certaines applications les plus utilisées.
# - Ne pas configurer de nouvelles icônes, elles ne m'intéressent pas.
#   Les icônes installées avec les packages me suffisent largement.
# - Sur une petite bande verticale à l'extrémité droite de l'écran, je vais
#   mettre : trayer (zone de notification), gkrellm, xconsole iconifié,
#   un petit lanceur d'applications et un pager (FvwmButtons et
#   FvwmPager sont deux modules très bien conçus et très puissants, ils
#   sont suffisants pour créer une configuration simple et efficace).
# - Utiliser un fond d'écran permettant la transparence des menus,
#   de FvwmPager, des FvwmButtons, de gkrellm.
#   Je préfère la root-transparence à la transparence totale (translucent)
#   pour plus de lisibilité.

# - Man page agréable à lire
#   http://www.fvwm.org/documentation/manpages/unstable/
# - FAQ officiel
#   http://www.fvwm.org/documentation/faq/
# - Une introduction à FvwmButtons par Tavis Ormandy
#   http://forums.gentoo.org/viewtopic.php?t=162177

##########################################################################



############################ Bureaux virtuels ############################

# page = écran physique
# desk (bureau virtuel) = un ensemble de pages dont le nombre est défini
# par DeskTopSize  
# Le nombre de desks est "illimité".
#
# Je veux que chaque desk soit composé de 4 pages en deux lignes
# et deux colonnes. Elles ont les coordonnées 0 0, 1 0, 1 0, 1 1.
#       -------------------
#       |        |        |    
#       |  0  0  |  1  0  |
#       -------------------
#       |        |        |
#       |  0  1  |  1  1  |
#       -------------------
DeskTopSize 2x2

# Je préfère ne pas passer sur une autre page quand le pointeur de
# la souris arrive au bord de l'écran.
EdgeResistance 15 100
EdgeThickness 0              

##########################################################################



#################### Placement et focus des fenêtres #####################

# Les fenêtres ouvertes se recouvrent le moins possible.
Style * MinOverlapPercentPlacement 
Style * NoPPosition, CaptureHonorsStartsOnPage

# Focus sur la fenêtre quand le pointeur de la souris arrive, et clic
# dessus pour la ramener au premier plan.  
Style * MouseFocusClickRaises
Style * FPAllowFocusClickFunction, FPAllowRaiseClickFunction

##########################################################################



############ Décoration générale des Fenêtres et des Icônes ##############

# Polices des titres pour les fenêtres et les icônes.
#Style * Font "xft:Liberation Sans:Bold:size=10:antialias=True"
Style * Font "xft:Liberation Sans:size=10:antialias=True"
#Style * IconFont "xft:Liberation Sans:Medium:size=10:antialias=True"
Style * IconFont "xft:Liberation Sans:size=10:antialias=True"

# Les bords des fenêtres, pas trop fin pour que la manipulation soit facile.
Style * HandleWidth 4

# Couleurs des textes et de l'arrière plan des fenêtres ou des icônes.
# Quand une fenêtre est activée (au premier plan) :
Style * HilightFore white, HilightBack steelblue
# Quand une fenêtre est non activée (en arrière plan) :
Style * Color Black/DarkGrey

# Style à la MWM.
Style * MWMFunctions, MWMDecor, HintOverride, MWMBorder
Style * DecorateTransient

# Les formes des boutons sur les barres de titres des fenêtres.
# J'utilise 5 boutons (Je ne définis que leur forme ici, mais pas leur
# action, elles sont dans la section "mouse binding" ci-dessous).
# Un seul bouton à gauche (bouton 1, non personnalisé ici, donc
# utiliser la forme par défaut), qui sert à affiche un
# menu d'options (menu Windows Ops).
# Quatre autres boutons à droite (numérotés sous la forme "|8|6|4|2|"),
# qui sont (de droite à gauche) : close, iconify, shade et maximise.
#   ____________________________________________________
#   | 1                                     8  6  4  2 |
#   |--------------------------------------------------|
#   |                                                  |
#   |                                                  |
#
# Les formes : 1=tiret, 2=croix, 4=point, 6=triangle vers le bas, 8=carré.
ButtonStyle Reset
ButtonStyle 2 Vector 17 20x20@1 30x20@1 50x40@1 70x20@1 80x20@1 80x30@0 \
                     60x50@0 80x70@0 80x80@0 70x80@0 50x60@0 30x80@0 \
                     20x80@0 20x70@1 40x50@1 20x30@0 20x20@1
ButtonStyle 4 Vector 5 45x45@1 55x45@1 55x55@0 45x55@0 45x45@1
ButtonStyle 6 Vector 4 50x75@1 25x25@1 75x25@1 50x75@0
ButtonStyle 8 Vector 5 25x75@0 75x75@0 75x25@0 25x25@1 25x75@1

# Définition de IconBox (l'endroit où va quand iconifier une fenêtre).
# Exemple : coordonnées : left=0, top=-10, right=-280, bottom=-1.
#Style * IconBox 0 -10 -280 -1  
#
# Je ne l'utilise pas de manière standard. Je le mets sur la bande droite
# pour contenir l'icône de xconsole
#Style * IconBox -79 -295 -0 -285
Style * IconBox -79 -221 -0 -211

##########################################################################



####################### Décoration spéciale ##############################

# L'option de placement TileCascadePlacement utilisée ici a pour but de
# ne pas couvrir (si possible) ces fenêtres par les autres.
# Voir aussi plus haut l'option globle "Placement et focus des fenêtres".
Style Fvwm* TileCascadePlacement, NoTitle, Sticky, WindowListSkip, CirculateSkip, CirculateSkipIcon
Style FvwmButtons NeverFocus, StaysOnBottom, NoHandles, BorderWidth 0
Style FvwmPager NeverFocus, StaysOnTop, NoHandles, BorderWidth 1
Style FvwmIdent Title, WindowListHit, CirculateHit
Style trayer NeverFocus, WindowListSkip, StaysOnBottom, NoHandles, CirculateSkip
# L'option Unmanaged pour le style de gkrellm contourne le bug #473589 :
Style gkrellm TileCascadePlacement, Sticky, WindowListSkip, NoTitle, CirculateSkip, BorderWidth 0, Unmanaged 
Style MPlayer StaysOnTop

##########################################################################



############################### Menus ####################################

# Décoration des menus.
Colorset 1 RootTransparent buffer, fg rgb:ff/ff/c4, bg average, \
       Tint black 20, bgTint black 20
# Le nombre 20 ci-dessus contrôle le degré de transparence.
#
MenuStyle * MenuColorset 1
#Menustyle * Font "xft:Liberation Sans:Bold:size=10:antialias=True"
Menustyle * Font "xft:Liberation Sans:size=10:antialias=True"

# Le contenu du Root-Menu.
#
# Je prends le défaut "Debian Menu" géré par le paquet menu.
Read /etc/X11/fvwm/menudefs.hook Quiet
#
# Ajouter "restart" et "quit" à la fin du root-menu.
AddToMenu /Debian
+  ""            Nop
+  "Restart Fvwm" Restart
+  "Exit Fvwm"   Quit

# Le Window-Ops menu est pour manipuler les fenêtres.
DestroyMenu Window-Ops
AddToMenu Window-Ops "Alt-F1: Window Ops" Title
+ "Main Menu"                   Popup /Debian
+ "Lower"                       Lower
+ "Window List"                 WindowList
+ "Previous"                    Prev
+ "Next"                        Next
+ "Move"                        Move
+ "Resize"                      Resize
+ "(De)Iconify"                 Iconify
+ "(Un)Maximize to screen"      Maximize 100 100
+ "Raise"                       Raise
+ "(Un)Stick"                   Stick        
+ "(Un)Maximize vertical"       Maximize 0 100
+ "(Un)Maximize horizontal"     Maximize 100 0
+ "(Un)Shade"                   WindowShade
+ ""                                     Nop
+ "ScrollBar"                   Module FvwmScroll 2 2
+ ""                                     Nop
+ "Destroy"                     Destroy
+ "Close"                       Close

##########################################################################



################### Raccourcis souris (Mouse bindings) ###################

# Syntaxe :
# Mouse  Button  Context  Modifiers  Function
#
# Ceci définit un raccourci souris, ou supprimer le raccourci
# si Function est '-'.
#
# "Button" est le numéro d'un bouton de la souris. 0 signifie n'importe quel
# bouton.
#
# "Context" : où est appliqué le raccourci :
# R = root window
# W = an application window
# D = desktop application (as kdesktop or Nautilus desktop)
# T = window title-bar
# S = window side, top, or bottom bar
# [, ], -, _ = left, right, top, bottom (side)
# F = window frame (the corners)
# <, ^, >, v = top left, top right, bottom right, bottom left (corner)
# I = Icon window
# 0 through 9 = title-bar buttons
# or any combination of these letters
# A = any context
#
# Modifiers :
# N = no modifiers
# C = Ctrl = Control
# S = Shift
# M =Alt = Meta
# A = any modifier
#
# Function est une des commandes fvwm.

# Clic sur le fond d'écran (root window) avec un des boutons de la souris
# affiche un menu.
Mouse 1   R  A  Menu /Debian    # 1=bouton gauche, R=root window
Mouse 2   R  A  Menu Window-Ops # 2=bouton du milieu de la souris
Mouse 3   R  A  WindowList      # 3=bouton droit

# Clic sur les boutons du bar de titre.
Mouse 0 1 A Popup Window-Ops
Mouse 0 2 A Close
Mouse 0 4 A Iconify
Mouse 0 6 A WindowShade
Mouse 1 8 A Maximize 100 100
Mouse 2 8 A Maximize 0 100
Mouse 3 8 A Maximize 100 0

### Deux nouvelle fonctions
#
# Ces deux fonctions opèrent sur une fenêtre ou une icône.
# "+ I Action" = "action exécutée immédiatement quand la fonction est appelée"
# "+ C Action" = "souris quand simple click"
# "+ D Action" = "souris action quand double clic"
# "+ H Action" = "action quand souris appuyée"
# "+ M Action" = "action quand souris bougée"
#
DestroyFunc move-and-raise-or-raiselower
AddToFunc   move-and-raise-or-raiselower
+ "M" Move
+ "M" Raise
+ "C" RaiseLower
#
DestroyFunc move-or-deiconify
AddToFunc   move-or-deiconify
+ "M" Move
+ "C" Iconify
###########################

# Action sur le bar de titre d'une fenêtre avec n'importe quel bouton de la
# souris exécute la fonction move-and-raise-or-raiselower.
Mouse 0 T A move-and-raise-or-raiselower

# Action sur une icône avec n'importe quel bouton de la
# souris exécute la fonction move-or-deiconify.
Mouse 0 I A move-or-deiconify

##########################################################################


##################### Raccourcis clavier (Key bindings) ##################

# Syntaxe :
# Key  Keyname  Context  Modifiers  Function
#
# Le syntaxe est le même que les raccourcis souris (Mouse binding) sauf que
# le numéro d'un bouton de la souris est remplacé par a Keyname.
# Voir ci-dessus la section sur les raccourcis souris (Mouse bindings).

# Pour se déplacer entre les quatre pages du desk actuel.
Key Left  A    C    Scroll -100 +0      # Ctrl + LeftArrow
Key Up    A    C    Scroll +0 -100
Key Right A    C    Scroll +100 +0
Key Down  A    C    Scroll +0 +100
# Pour changer de desks (au cas où le module FvwmPager affiche deux desks).
#Key Page_Up A C  Desk 0 0              # Ctrl + PgUp
#Key Page_Down  A C  Desk 0 1           # Ctrl + PgDn

# Pour lancer des applications fréquemment utilisées avec
# la combinaison de touches "ctrl + shift + key".
Key A     A    CS    Exec exec iceowl
#Key E     A    CS    Exec exec evolution
Key F     A    CS    Exec exec iceweasel
Key M     A    CS    Exec exec icedove
#Key P     A    CS    Exec exec xcinterm-gb2312 -e pidgin
Key P     A    CS    Exec exec pidgin
Key K     A    CS    Exec exec kile
Key XF86PowerOff    A    A    Exec exec sudo hibernate
Key L     A    CS    Exec exec lyx
Key N     A    CS    Exec exec liferea
Key R     A    CS    Exec exec rox
Key S     A    CS    Exec exec gksu -u root /usr/sbin/synaptic
Key T     A    CS    Exec exec roxterm
Key V     A    CS    Exec exec gvim
Key X     A    CS    Exec exec /usr/bin/xscreensaver-command -lock
Key Y     A    CS    Exec exec rxvt -fg white -bg black -e /usr/bin/yafc

##########################################################################



######################### Configurer des Modules #########################

# J'utilise principalement les deux modules FvwmPager et FvwmButtons.
# Ces deux modules sont largement suffisants pour faire une configuration
# simple et efficace.
# Le module FvwmProxy donne un petit plus agréable.

# FvwMPager
#
# Pour la non-transparence :
# Pager background and foreground.
Colorset 2  bg #502000, fg #C0C0C0
Colorset 3  bg #004020, fg #C0C0C0
# Pager inactive and active window colors.
Colorset 4  bg #808080
Colorset 5  bg #FCFF00
#
# Pour la transparence :
Colorset 6 RootTransparent buffer, fg red, bg darkcyan
*FvwmPager: Colorset * 6
#
Style FvwmPager ParentalRelativity
#
*FvwmPager: Geometry 80x62-0-0
*FvwmPager: Rows 1
*FvwmPager: Columns 1
*FvwmPager: HilightColorset * 3
*FvwmPager: WindowColorsets 4 5
*FvwmPager: Window3DBorders
*FvwmPager: Font none   # On n'affiche pas de label pour chaque desk
# Font pour les noms des fenêtres dans les pages :
*FvwmPager: SmallFont "xft:Liberation Sans:size=6:antialias=True"
*FvwmPager: Balloons All
*FvwmPager: BalloonBack Yellow
*FvwmPager: BalloonFore Black
*FvwmPager: BalloonFont "xft:Liberation Sans:size=6:antialias=True"
*FvwmPager: BalloonYOffset      +2
*FvwmPager: BalloonBorderWidth  1
*FvwmPager: BalloonBorderColor  Black

# Définir un lanceur d'applications à l'aide de FvwmButtons.
#
Colorset 7 RootTransparent buffer, fg yellow, bg darkcyan
DestroyModuleConfig Launch: *                                  
*Launch: Columns 1
*Launch: Rows 9
*Launch: Font "xft:Liberation Sans:size=8:antialias=True"
*Launch: Colorset 7
*Launch: Frame 0
# Ci-dessous axb signifie un bouton qui occupe a colonnes et b lignes.
*Launch: (1x1, Title "icedove", Action(Mouse 1) 'Exec exec icedove')
*Launch: (1x1, Title "iceweasel", Action(Mouse 1) 'Exec exec iceweasel')
#*Launch: (1x1, Title "pidgim", Action(Mouse 1) 'Exec exec xcinterm-gb2312 -e pidgin')
*Launch: (1x1, Title "pidgim", Action(Mouse 1) 'Exec exec pidgin')
*Launch: (1x1, Title "gimp", Action(Mouse 1) 'Exec exec gimp')
*Launch: (1x1, Title "gvim", Action(Mouse 1) 'Exec exec gvim')
*Launch: (1x1, Title "kile", Action(Mouse 1) 'Exec exec kile')
*Launch: (1x1, Title "lyx", Action(Mouse 1) 'Exec exec lyx')
*Launch: (1x1, Title "rox", Action(Mouse 1) 'Exec exec rox')
#*Launch: (1x1, Title "texmaker", Action(Mouse 1) 'Exec exec texmaker')
*Launch: (1x1, Title "roxterm", Action(Mouse 1) 'Exec exec roxterm')

# FvwmButtons pour mettre wmpinboard.
#
# Pour bouton transparent sans bord :
*FvwmButtons: Frame 0
*FvwmButtons: Colorset 7
*FvwmButtons: Columns 1
*FvwmButtons: (Swallow (NoClose, UseOld) "wmpinboard" 'Exec exec wmpinboard'

# Configurer FvwmProxy pour que appuyer sur KP_Enter
# (la touche (un bar sur le chapeau) à coté de la touche right-pomme-command)
# "to toggle FvwmProxy, which allows you to see all windows on your
# desktop, even if they've been obscured..really cool".
DestroyModuleConfig FvwmProxy: *
*FvwmProxy: ProxyMove true
Key KP_Enter  A  N  SendToModule FvwmProxy ShowToggle
#
# Il y a skippy qui fait la même chose, plus jolie mais plus lent.
# Voir ci-dessous plus loin.

##########################################################################



#################### Fonctions d'initialisation ##########################

# InitFunction est exécutée automatiquement quand fvwm est lancé.
# RestartFunction est exécutée automatiquement quand fvwm est relancé par
# lui-même.
# StartFunction fait les deux types.
#
# StartFunction devrait être utilisée pour lancer des modules fvwm.
# InitFunction devrait être utilisée pour lancer d'autres applications qui
# ne devraient pas être relancées quand fvwm est relancé par lui-même.

DestroyFunc StartFunction
AddToFunc StartFunction
+ I Module FvwmPager 0 0
+ I Module FvwmButtons -g 81x135-0-64 Launch
#+ I Module FvwmButtons -g 81x74-0-200
+ I Module FvwmProxy

# Pour certaines applications, SkipMapping ne marche pas.
Style evolution* StartsOnPage 0 1 0, SkipMapping
Style Icedove-bin StartsOnPage 0 1 0, SkipMapping
Style Iceowl-bin StartsOnPage 0 1 1, SkipMapping
Style pidgin StartsOnPage 0 1 1, SkipMapping
Style crxvt-gb StartsOnPage 0 1 1, SkipMapping
# Si utiliser startx ou gdm :
#Style xconsole StartIconic, StartsOnPage 0 0 0, SkipMapping

DestroyFunc InitFunction
AddToFunc InitFunction 
# Pour la transparence, j'utilise fvwm-root pour lancer un fond d'écran.
#+ I Exec exec fvwm-root -r /home/zhang/Multimedia/Images/GreatWall.png
+ I Exec exec fvwm-root -r /home/zhang/Multimedia/Images/debblue-1024x768.png
#+ I Exec exec fvwm-root -r /home/zhang/.fvwm/juju-2.png
#########
# Skippy :
# Voir ci-dessus plus haut la configuration de FvwmProxy.
# Lancer skippy, voir la doc et ~/.skippyrc.
#+ I Exec exec skippy
##########
+ I Exec exec trayer --widthtype request --heighttype pixel --height 24 --edge top --align right --alpha 100 --transparent true --margin 0
+ I Exec exec gkrellm --geometry -0+24
+ I Exec exec roxterm
#+ I Exec exec xcinterm-gb2312 -e pidgin
#+ I Exec exec pidgin
+ I Exec exec gtkpbbuttons -d
#+ I Exec exec workrave
# Pour jouer/tester les ombres :
#+ I Exec exec nice xcompmgr -cCfF -r7 -o.65 -l-10 -t-8 -D7
# Pour jouer/tester la vraie transparence avec transset-df dans un script :
#+ I Exec exec /home/zhang/transparence

##########################################################################