##########################################################################
# Fichier de configuration ~/.fvwm/config
# Debian unstable sur HP EliteBook 8460p
# Dernière modification : 2011-11-28
# B. Zhang <bb.zhang@free.fr>, http://bz31.tuxfamily.org
##########################################################################



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

# - Configuration simple en un seul fichier ~/.fvwm/config
# - Adatper à l'usage sans souris sur un portable.
# - 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) et un bouton "Quit", gkrellm,
#   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 de configurer la transparence
#   (menus, FvwmPager, FvwmButtons, et gkrellm)
#   Je préfère la root-transparence à la transparence totale (translucent)
#   pour plus de lisibilité.
# - FvwmProxy pour situer toutes les fenêtres de l'écran.

# - "Man page" : 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 automatiquement sur une autre page quand
# le pointeur de la souris arrive au bord de l'écran.
EdgeResistance 15
Style * EdgeMoveDelay 15
Style * EdgeMoveResistance 100
EdgeThickness 0

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



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

# Les fenêtres ouvertes se recouvrent le moins possible.
Style * MinOverlapPercentPlacement
Style * !UsePPosition, 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=-90, top=-10, right=-2, bottom=-1.
#Style * IconBox -90 -10 -2 -1
#
# IconBox en bas à droite juste à coté de pager
Style * IconBox -900 -80 -94 -0, IconFill b r

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



####################### 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 FvwmScript-Quit PositionPlacement center, StaysOnTop
Style FvwmIdent Title, WindowListHit, CirculateHit
Style gkrellm TileCascadePlacement, Sticky, WindowListSkip, NoTitle, CirculateSkip, BorderWidth 0
Style MPlayer StaysOnTop

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



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

# Décoration des menus.
Colorset 1 RootTransparent buffer, fg rgb:ff/ff/c4, bg darkcyan, 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: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 Rrestart et Quit à la fin du root-menu.
#AddToMenu /Debian
#+  ""            Nop
#+  "Restart Fvwm" Restart
#+  "Exit Fvwm"    Quit
#
# Ajouter FvwmScript-Quit à la fin du root-menu.
AddToMenu /Debian
+  "Quit"    Module FvwmScript FvwmScript-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 F     A    CS    Exec exec iceweasel
Key M     A    CS    Exec exec icedove
Key P     A    CS    Exec exec pidgin
Key K     A    CS    Exec exec kile
Key L     A    CS    Exec exec lyx
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 End   A    CS    Module FvwmScript FvwmScript-Quit
Key D     A    CS    Exec exec feh -F -D 4 -z -r prive/Photos/Diapo/*

# Pour les boutons de contôle du volume du son
key XF86AudioMute           A   A   Exec exec amixer set Master toggle
key XF86AudioRaiseVolume    A   A   Exec exec amixer set Master 10%+
key XF86AudioLowerVolume    A   A   Exec exec amixer set Master 10%-

# Note : <fn><f3> = suspend to RAM : OK.

# J'utilise <fn><f8> (symbole batterie) pour le suspend to disk
key XF86Battery             A   A   Exec exec sudo s2disk

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



######################### 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
*FvwmPager: Colorset * 6
#
Style FvwmPager ParentalRelativity
#
*FvwmPager: Geometry 94x62-0-0
*FvwmPager: Rows 1
*FvwmPager: Columns 1
*FvwmPager: HilightColorset * 3
*FvwmPager: WindowColorsets 4 5
*FvwmPager: Window3DBorders
# On n'affiche pas de label pour chaque desk :
*FvwmPager: Font none
# 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, fg yellow
DestroyModuleConfig Launch: *
*Launch: Columns 1
*Launch: Rows 10
*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 "diapo", Action(Mouse 1) 'Exec exec feh -F -D 4 -z -r prive/Photos/Diapo/*')
*Launch: (1x1, Title "icedove", Action(Mouse 1) 'Exec exec icedove')
*Launch: (1x1, Title "iceweasel", Action(Mouse 1) 'Exec exec iceweasel')
*Launch: (1x1, Title "pidgin", 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 "thunar", Action(Mouse 1) 'Exec exec thunar')
*Launch: (1x1, Title "roxterm", Action(Mouse 1) 'Exec exec roxterm')

# FvwmButtons pour mettre "Quit".
#
Colorset 8 fg white, bg steelblue
*FvwmButtons: Colorset 8
*FvwmButtons: Font "xft:Liberation Sans:size=10:bold:antialias=True"
*FvwmButtons: (Title "Quit" Action(Mouse 1) 'Module FvwmScript FvwmScript-Quit')

# Configurer FvwmProxy pour que quand on appuye sur la touche Windows (à coté
# de la touche Alt la commande xev pour me donne super_L), on active
# FvwmProxy qui permet de situer toutes les fenêtres de l'écran.
DestroyModuleConfig FvwmProxy: *
*FvwmProxy: Font "xft:Liberation Sans:size=6:antialias=True:minspace=True"
*FvwmProxy: ProxyMove true
Key Super_L  A  N  SendToModule FvwmProxy ShowToggle

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



#################### 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 95x150-0-94 Launch
#+ I Module FvwmButtons -g 95x30-0-62
+ I Module FvwmButtons -g 40x24-0+0
+ I Module FvwmProxy

# voir http://www.fvwm.org/documentation/faq/#7.4
Style Icedove* StartsOnPage 0 1 0, SkipMapping
Style Buddy* StartsOnPage 0 1 1, SkipMapping
Style xconsole StartIconic, StartsOnPage 0 0 0, SkipMapping

DestroyFunc InitFunction
AddToFunc InitFunction
# Pour la transparence, j'utilise fvwm-root ou feh (qui peut "scale image")
# pour lancer un fond d'écran.
#+ I Exec exec fvwm-root -r /home/zhang/.fvwm/desktop-background-debblue-1440x900.png
# http://burning-liquid.deviantart.com/art/Daylight-WP-Pack-20362265 :
+ I Exec exec feh --bg-scale /home/zhang/.fvwm/Daylight-1920x1200.jpg
+ I Exec exec trayer --widthtype request --heighttype pixel --height 24 --edge top --align right --alpha 100 --transparent true --margin 40
+ I Exec exec gkrellm --geometry -0+24
+ I Exec exec roxterm
+ I Exec exec thunar --daemon

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