1  ##############################################
   2  ##############################################
   3  ### Fichier de configuration pour Fvwm 2.5.14
   4  ### 
   5  ### Dernière modification le 10 novembre 2005.
   6  ### Lucky <jeremy.lefloch@gmail.com> <bosozoku@jabber.org>
   7  ### www.stationlinux.org
   8  ###
   9  ### Remerciements à Taviso (http://dev.gentoo.org/~taviso) car de nombreuses
  10  ### fonctions dans cette configuration sont directement tirées de son ~/.fvwm2rc.
  11  ##################################################################################
  12  ##################################################################################
  13
  14
  15
  16
  17  ####
  18  # Variables d'environement
  19  ##########################
  20  # Les variables d'environnement sont très utiles car elles vous permettent 
  21  # d'y stoquer des valeurs et de les réutiliser tout au long de votre config. 
  22  # C'est exactement le même principe que dans la plupart des langages de 
  23  # programmation tels que le PHP, Bash etc.
  24  # La syntaxe est très simple : SetEnv variable valeur
  25  # Ceci nous donne la variable $[variable]. Pensez à utiliser la commande 
  26  # UnSetEnv, qui s'utilise de la même façon que la précedente, pour 
  27  # désactiver une variable dont vous n'avez plus besoin.
  28  #
  29  # Il existe une variable d'environnement spéciale : ImagePath.
  30  # Son contenu indique à Fvwm ou il doit aller chercher les images dont il 
  31  # a besoin, pour votre menu par exemple. Voici la syntaxe :
  32  # ImagePath $[img]:$[img_autres]
  33  # Je range toutes mes icônes dans le répertoire $[img] mais aussi dans le 
  34  # répertoire [img_autres].
  35  #
  36  # Pensez à remplacer certaines valeurs par les votres comme :
  37  # SetEnv wallpapers_dir $[HOME]/Images/wallpapers
  38  # Ceci est vrai sur mon ordinateur mais peut être pas chez vous.
  39  ##########################
  40  SetEnv img $[FVWM_USERDIR]/images
  41  ImagePath $[img]:$[img]/deco:$[img]/menu:$[img]/panel
  42  SetEnv scripts $[FVWM_USERDIR]/scripts
  43  SetEnv temp $[FVWM_USERDIR]/temp
  44  SetEnv BorderWidth 4
  45
  46  SetEnv wallpapers_dir $[HOME]/Images/wallpapers
  47  SetEnv screenshots_dir $[HOME]/Images/screenshots/fvwm
  48  PipeRead "export screenshots_dir=${HOME}/Images/screenshots/fvwm"
  49  SetEnv video /mnt/Multimedia/Video
  50  SetEnv video_exec xine
  51  SetEnv video_exec_bis mplayer
  52  SetEnv audio /mnt/Multimedia/Audio
  53  SetEnv audio_exec xmms
  54  SetEnv web_browser firefox
  55  SetEnv browser rox
  56  SetEnv TermName rxvt
  57  SetEnv TermQuake "aterm -geometry 150x30+0+0 -name GameConsole"
  58
  59
  60  ####
  61  # La commande Read est comparable à la commande include en PHP. 
  62  # Cela permet de diviser votre fichier de configuration en plusieurs 
  63  # parties. J'ai choisi de mettre mes menus dans un fichier extérieur 
  64  # (~/.fvwm/menus) dans un soucis de propreté du fichier .fvwm2rc.
  65  ##########################
  66  Read menus
  67  Read fvwmtabrc
  68
  69
  70  ####
  71  # Les Styles et Colorset
  72  ##########################
  73  # Les styles vous permettent de gérer l'apparence et le comportement 
  74  # de vos fenêtres ainsi que de vos menus. La syntaxe est simple :
  75  # Style * vos_styles, un_autre
  76  #
  77  # Les colorsets sont comme le nom l'indique des ensemble de couleurs. 
  78  # Chaque colorset est identifié par un numéro. La syntaxe est simple : 
  79  # Colorset 0 fg couleur, bg couleur, sh couleur, hi couleur
  80  # Je ne rentre pas dans les détails, sachez que vous pouvez donner un nom 
  81  # pour les couleurs (standard X11) ou bien une donnée héxadécimale.
  82  #
  83  # +-------+-----------------------------------------+
  84  # | State | Definition                              |
  85  # +=======+=========================================+
  86  # | 1     | La barre de titre est présente          |
  87  # +-------+-----------------------------------------+
  88  # | 2     | La bordure est présente                 |
  89  # +-------+-----------------------------------------+
  90  # | 3     | Barre de titre en haut                  |
  91  # +-------+-----------------------------------------+
  92  # | 4     | Barre de titre à gauche                 |
  93  # +-------+-----------------------------------------+
  94  # | 5     | Barre de titre en bas                   |
  95  # +-------+-----------------------------------------+
  96  # | 6     | Barre de titre à droite                 |
  97  # +-------+-----------------------------------------+
  98  #
  99  # +----------+--------------------------------------+
 100  # | Colorset | Definition                           |
 101  # +==========+======================================+
 102  # | 0        | Fenêtres non sélectionnées           |
 103  # +----------+--------------------------------------+
 104  # | 1        | FvwmProxy                |
 105  # +----------+--------------------------------------+
 106  # | 2        | Fenêtres actives                     |
 107  # +-------+-----------------------------------------+
 108  # | 3     | Barre de titre en haut                  |
 109  # +-------+-----------------------------------------+
 110  # | 4     | Barre de titre à gauche                 |
 111  # +-------+-----------------------------------------+
 112  # | 5     | Barre de titre en bas                   |
 113  # +-------+-----------------------------------------+
 114  # | 6     | Barre de titre à droite                 |
 115  # +-------+-----------------------------------------+
 116  ##########################
 117
 118
 119  # J'aime beaucoup le SloppyFocus : la fenêtre obtient le focus lorsque la souris 
 120  # entre dans la fenêtre et le garde tant que la souris ne survole pas une autre 
 121  # fenêtre. Pour faire passer la fenêtre au premier plan (Raise), il suffit alors 
 122  # de cliquer dessus. Je trouve que c'est le meilleur comportement !
 123  ##########################
 124  Style * SloppyFocus, MouseFocusClickRaises, ResizeOpaque
 125  Style * WindowShadeSteps 160, GrabFocus
 126  Style * Colorset 0, HilightColorset 2
 127  DefaultFont "Shadow=0 se:xft:Lucida Grande:size=7:bold"
 128  Style * HandleWidth $[BorderWidth]
 129  Style * State 1
 130  Style * State 2
 131  Style * State 3
 132  Style * !State 4
 133  Style * !State 5
 134  Style * !State 6
 135
 136  # Proxy
 137  Colorset 1 fg white, bg #444444
 138
 139
 140  ####
 141  # L'utilisation du joker * était interessante lorsque l'on voulait 
 142  # appliquer un style pour toutes les fenêtres mais j'applique ici des styles 
 143  # différents pour des fenêtres bien distinctes. Le nom de la fenêtre est 
 144  # obtenu grace au module FvwmIdent ; vous pouvez utiliser indifférement la 
 145  # classe ou la ressource de la fenêtre concernée.
 146  # 
 147  # J'indique ici le nom de la mini icône de la fenêtre qui sera affichée
 148  # dans la barre de titre par exemple. Je peux également dire à Fvwm de ne 
 149  # pas donner de barre de titre pour Xmms par exemple.
 150  ##########################
 151  Style xmms EWMHMiniIconOverride, MiniIcon xmms.png, NoTitle
 152  Style XTerm EWMHMiniIconOverride, MiniIcon terminal.png
 153  Style Gvim EWMHMiniIconOverride, MiniIcon editeurs.png
 154  Style Firefox-bin EWMHMiniIconOverride, MiniIcon firefox.png
 155  Style ROX-Filer EWMHMiniIconOverride, MiniIcon home.png
 156  Style Gimp-2.2 EWMHMiniIconOverride, MiniIcon gimp.png
 157  Style Thunderbird-bin EWMHMiniIconOverride, MiniIcon thunderbird.png
 158  Style Gaim EWMHMiniIconOverride, MiniIcon gaim.png
 159  Style gFTP EWMHMiniIconOverride, MiniIcon gftp.png
 160  Style SWT EWMHMiniIconOverride, MiniIcon sancho.png
 161  Style GQview EWMHMiniIconOverride, MiniIcon gqview.png
 162  Style xine EWMHMiniIconOverride, MiniIcon xine.png
 163  Style FvwmIdent TitleAtLeft, EWMHMiniIconOverride, MiniIcon identify.png
 164  Style xpad NoTitle, !Borders, NoHandles, WindowListSkip
 165  Style xchat-2 EWMHMiniIconOverride, MiniIcon xchat.png
 166  Style GameConsole NoHandles, !Borders, NoTitle, \
 167  FixedPosition, WindowListSkip, Sticky, WindowShadeSteps 260
 168  Style xmessage CenterPlacement, NoTitle
 169  Style Gmrun CenterPlacement
 170  Style XOsview     WindowListSkip, CirculateSkip, NoTitle
 171  Style irssi NoTitle, !Borders
 172  ####
 173  # La commande MenuStyle fonctionne exactement comme Style à une différence
 174  # près : elle ne s'applique qu'aux menus. Le caractère * est un joker, le style
 175  # sera effectif pour tous les menus. Référez vous à la page man pour connaître
 176  # de manière précise la signification des styles ci-dessous.
 177  ##########################
 178  MenuStyle * MenuColorset 7
 179  MenuStyle * BorderWidth 1
 180  MenuStyle * HilightBack
 181  MenuStyle * ActiveForeOff
 182  MenuStyle * PopupOffset 0 100
 183  MenuStyle * TitleUnderlines2
 184  MenuStyle * SeparatorsLong
 185  MenuStyle * ActiveColorset 8
 186  MenuStyle * Animation
 187  MenuStyle * TrianglesSolid
 188  MenuStyle * PopupDelayed
 189  MenuStyle * PopupDelay 100
 190  MenuStyle * PopdownImmediately
 191  MenuStyle * Hilight3DOff
 192
 193
 194  ####
 195  # Mise en place des différents curseurs de souris en fonction de 
 196  # différents contextes.
 197  ##########################
 198  CursorStyle root left_ptr
 199  CursorStyle default left_ptr
 200  CursorStyle position left_ptr
 201  CursorStyle sys left_ptr
 202  CursorStyle menu left_ptr
 203  CursorStyle title left_ptr
 204  CursorStyle resize fleur
 205  CursorStyle stroke cross
 206  CursorStyle select draped_box
 207
 208
 209  ####
 210  # Définition des différents décors. En général, un par thème. 
 211  # Référez vous à la page de manuel Fvwm pour comprendre l'ensemble 
 212  # des commandes ci-dessous. En bref :
 213  # Je créer deux décors nommés Default et Green. Ces décors sont composés
 214  # d'une barre de titre (TitleStyle) et de différents boutons (ButtonStyle). 
 215  # Notez que pour voir les boutons sur la barre de titre, il doivent forcément
 216  # être associer à une action (voir les raccourcis clavier).
 217  # Voici la disposition des boutons sur la barre de titre :
 218  # +--------------------------------------------------------+
 219  # | .                                              _  #  X |
 220  # +--------------------------------------------------------+
 221  # | 1                                              6  4  2 |
 222  # |                                                        |
 223  #                                                          
 224  ##########################
 225  DestroyDecor Default
 226  AddToDecor Default
 227  + TitleStyle Centered Height 19
 228  + TitleStyle AllActive  (TiledPixmap cinza/wtitle.png -- flat) \
 229  AllInactive (TiledPixmap cinza/wtitle.png -- flat)
 230  + ButtonStyle 1 AllActive (MiniIcon) AllInactive (MiniIcon)
 231  + ButtonStyle 2 ActiveUp (Pixmap cinza/close.xpm) \
 232  ActiveDown (Pixmap cinza/close.xpm) \
 233  Inactive (Pixmap cinza/closeu.xpm)
 234  + ButtonStyle 4 ActiveUp (Pixmap cinza/max.xpm) \
 235  ActiveDown (Pixmap cinza/max.xpm) \
 236  Inactive (Pixmap cinza/maxu.xpm)
 237  + ButtonStyle 6 ActiveUp (Pixmap cinza/icon.xpm) \
 238  ActiveDown (Pixmap cinza/icon.xpm) \
 239  Inactive (Pixmap cinza/iconu.xpm)
 240  + ButtonStyle All -- UseTitleStyle
 241  + ButtonStyle All -- flat
 242  + BorderStyle -- HiddenHandles NoInset
 243
 244  DestroyDecor Green
 245  AddToDecor Green
 246  + TitleStyle Centered Height 17
 247  + TitleStyle AllActive (Colorset 2 -- flat) AllInactive (Colorset 2 -- flat)
 248  + ButtonStyle 1 AllActive (MiniIcon) AllInactive (MiniIcon)
 249  + ButtonStyle 2 ActiveUp (Pixmap vert/close.xpm) \
 250  ActiveDown (Pixmap vert/close-pressed.xpm) \
 251  Inactive (Pixmap vert/close.xpm)
 252  + ButtonStyle 4 ActiveUp (Pixmap vert/max.xpm) \
 253  ActiveDown (Pixmap vert/max-pressed.xpm) \
 254  Inactive (Pixmap vert/max.xpm)
 255  + ButtonStyle 6 ActiveUp (Pixmap vert/icon.xpm) \
 256  ActiveDown (Pixmap vert/icon-pressed.xpm) \
 257  Inactive (Pixmap vert/icon.xpm)
 258  + ButtonStyle All -- UseTitleStyle
 259  + ButtonStyle All -- flat
 260  + BorderStyle -- HiddenHandles NoInset
 261
 262
 263  ####
 264  # On émule le comportement MWM pour avoir la fenêtre de 
 265  # déplacement / redimenssionement au centre. Cela affecte également
 266  # la placement des fenêtres. J'indique également que la fenêtre de 
 267  # déplacement / redimenssionement doit toujours apparaître si je déplace 
 268  # une fenêtre ou si je la redimenssionne.
 269  ##########################
 270  Emulate MWM
 271  HideGeometryWindow Never
 272
 273
 274  ####
 275  # http://www.fvwm.org/documentation/faq/#5.5
 276  ##########################
 277  IgnoreModifiers L25
 278
 279
 280  ####
 281  # OpaqueMoveSize permet de déplacer les fenêtres en opaque.
 282  #
 283  # SnapAttraction est une option qui permet de coller deux ou plusieurs 
 284  # fenêtres entre elles. 6px me semble un bon compromis.
 285  #
 286  # ClickTime est le temps en millisecondes entre le moment ou vous appuyez 
 287  # sur le bouton de la souris et celui ou vous le relachez (un simple clic). 
 288  # La valeur par defaut est 150ms et c'est un peu trop court à mon gout.
 289  ##########################
 290  OpaqueMoveSize unlimited
 291  SnapAttraction 6 All
 292  ClickTime 300
 293
 294
 295  ####
 296  # J'utilise 4 bureaux (desks) mais une seule page par bureau, 
 297  # ce qui implique un DesktopSize 1x1 (une page x une page).
 298  ##########################
 299  DesktopSize 1x1
 300
 301
 302  ####
 303  # EdgeScroll indique en pourcentage (en horyzontal et vertical) la taille 
 304  # d'une page qui doit être affichée lorsque la souris touche le bord de l'écran.
 305  # Exemple : EdgeScroll 100 100 vous fera passer sur la page voisine si vous touchez 
 306  # le bord de l'écran. 
 307  #
 308  # EdgeResistance accepte deux paramètres :
 309  # le premier règle en millisecondes le temps que la souris devra rester sur le 
 310  # bord de l'écran pour passer à la page voisine. Ceci n'est important que pour ceux 
 311  # qui utilisent EdgeScroll 100 100.
 312  # Le second paramètre règle en pixels la distance que doit parcourir la souris pour
 313  # qu'une fenêtre dépasse de l'écran.
 314  # Dans notre cas, j'utilise la valeur maximale pour le premier paramètre (10000), 
 315  # ce qui implique qu'il est impossible de passer sur une page voisine avec la souris ;
 316  # et je règle 50px pour le second paramètre. C'est à dire que lorsqu'une fenêtre sera 
 317  # collée au bord de l'écran, il faudra que je la déplace encore de 50px pour qu'elle
 318  # sorte de l'écran. 
 319  #
 320  # EdgeThickness n'accepte que trois paramètre : 0,1 ou 2.
 321  # Ceci est la taille en pixel d'une fenêtre invisible que Fvwm créé sur les bords 
 322  # de l'écran qui sont utilisés pour les fonctionnalités de EdgeScroll. La valeur 
 323  # par defaut est 2.
 324  ##########################
 325  EdgeScroll 0 0
 326  EdgeResistance 10000 50
 327  EdgeThickness 0
 328
 329
 330  ####
 331  # Configuration des raccourcis clavier et des actions à effectuer lors de 
 332  # différents clics de la souris.
 333  #
 334  # La syntaxe est la même pour les deux commandes (Mouse pour la souris et Key
 335  # pour le clavier) :
 336  # Mouse num_bouton contexte clavier action
 337  # Key   num_touche contexte clavier action
 338  #
 339  # Le num_bouton ou num_touche est tout simplement le bouton de la souris ou la 
 340  # touche du clavier que vous souhaitez associer à une action. Pour une souris 
 341  # avec deux boutons et une molette cliquable (comme la mienne), on obtient 5 boutons :
 342  # 1 = bouton gauche ; 2 = clic molette ; 3 = bouton droit ; 4 = molette avant ; 
 343  # 5 = molette arrière.
 344  #
 345  # Pour le contexte, je vous laisse observer cette image : 
 346  # http://www.zensites.net/fvwm/guide/window_layout.png
 347  # En bref : R signifie la zone de l'écran libre, W pour la fenêtre, I pour une icône
 348  # et A qui est un joker (n'importe ou sur l'écran).
 349  #
 350  # Ce que j'appelle clavier se nomme Modifier en Anglais. C'est une touche que 
 351  # vous appuierez en plus du bouton ou touche initiale. On peut penser par exemple à
 352  # Alt+x pour lancer xmms, ce qui nous donnera : 
 353  # Key x A M Exec xmms
 354  # Touche x, n'importe où sur l'écran et le Modifier Alt (M), et enfin l'action.
 355  ##########################
 356  Mouse 3 R A Menu Root
 357  Key F1 A A Menu Root
 358  Mouse 1 R A -
 359
 360  Mouse 1 2 A CloseFunc
 361  Mouse 1 4 A MaximizeFunc
 362  Mouse 3 4 A HoryMaximizeFunc
 363  Mouse 1 T A MaximizeTitleBarFunc
 364  Mouse 3 T A Menu WindowControls
 365  Mouse 1 1 A Menu WindowControls
 366  Mouse 4 T N WindowShade True
 367  Mouse 5 T N WindowShade False
 368  Mouse 1 W M MoveFunc
 369  Mouse 3 W M ResizeFunc
 370  Mouse 1 I A DeiconifyAndRearrange
 371  Mouse 3 I A Menu WindowControls Icon 0 -100m
 372  Key F4 A M Close
 373
 374  Mouse 2 R A WindowList NoCurrentDeskTitle
 375  Key Tab A M WindowList Root c c NoDeskSort, NoCurrentDeskTitle, SelectOnRelease Meta_L
 376
 377
 378  ####
 379  # Voici mes raccourcis clavier que j'utilise pour lancer mes applications 
 380  # favorites. Remarquez l'intérêt des variables d'environnement.
 381  ##########################
 382  Key F2 A A Exec gmrun
 383  Key F3 A A Module FvwmConsole -terminal $[TermName]
 384  Key Escape A M SendToModule FvwmProxy ShowToggle
 385  Key f A M Exec $[web_browser]
 386  Key t A M Exec thunderbird
 387  Key a A M Exec $[TermName]
 388  Key i A M Exec $[TermName] -g 95x50 -name irssi -e irssi
 389  Key c A M Exec gvim -geom 88x40 $[FVWM_USERDIR]/.fvwm2rc
 390  Key g A M Exec gaim
 391  Key r A M Exec $[browser]
 392  Key x A M Exec xmms
 393  Key n A M Exec xpad
 394
 395  Key twosuperior A C ToggleTerminal
 396  Key c A CM CenterWindow
 397  Key r A CM Restart
 398  Key q A CM Quit
 399  Key Return A M ToggleTitle
 400
 401
 402  ####
 403  # J'aime bien changer de bureau avec le clavier. Voici ma configuration :
 404  # Ctrl + Alt + gauche ou droite, change de bureau vers la gauche ou la droite.
 405  # Alt + 1, Alt + 2, Alt + 3 et Alt + 4 amènent respectivement directement au 
 406  # bureau 1, 2, 3 ou 4. Remarquez les deux derniers arguments "0 3" de la commande 
 407  # GoToDesk. J'utilise ceci pour dire à Fvwm de faire une boucle lorsque je change
 408  # de bureau avec les flèches : arrivé au bureau 3 il retourne au bureau 0, il ne
 409  # continue pas vers le numéro 4. Ça paraît évident mais ça ne l'est pas pour Fvwm.
 410  ##########################
 411  Key ampersand   A       M       GoToDesk 0 0
 412  Key eacute      A       M       GoToDesk 0 1
 413  Key quotedbl    A       M       GoToDesk 0 2
 414  Key apostrophe  A       M       GoToDesk 0 3
 415  Key Left        A       CM      GoToDesk -1 0 3
 416  Key Right       A       CM      GoToDesk +1 0 3
 417
 418
 419  ####
 420  # Ceci est la configuration des modules Fvwm. Je ne rentre pas dans les détails :
 421  # FvwmAnimate est le module qui s'occupe de la gestion de l'animation lorsque vous 
 422  # iconifiez une fenêtre, FvwmBanner se charge de montrer une belle image au 
 423  # démarrage du gestionnaire de fenêtres, FvwmEvent lance une fonction à partir de 
 424  # différents évenements, FvwmProxy est très utile : pressez donc alt + entrée
 425  # lorsque votre bureau est envahi de fenêtres, et enfin FvwmIdent est le module 
 426  # qui vous donne plein d'informations sur une fenêtre (utile pour obtenir la classe, 
 427  # pour définir le style d'une fenêtre précise par exemple).
 428  ##########################
 429  DestroyModuleConfig FvwmAnimate: *
 430  *FvwmAnimate: Color white
 431  *FvwmAnimate: Delay 1
 432  *FvwmAnimate: Iterations 100
 433  *FvwmAnimate: Width 1
 434  *FvwmAnimate: Effect Frame
 435
 436  DestroyModuleConfig FvwmBanner: *
 437  *FvwmBanner: NoDecor
 438  *FvwmBanner: Pixmap gentoo.png
 439  *FvwmBanner: Timeout 3
 440
 441  DestroyModuleConfig FvwmEvent: *
 442  *FvwmEvent: new_desk NewDeskFunc
 443  *FvwmEvent: add_window AddWindowFunc
 444  *FvwmEvent: destroy_window CloseWindowFunc
 445
 446  DestroyModuleConfig FvwmProxy: *
 447  *FvwmProxy: ProxyMove false
 448  *FvwmProxy: Colorset 1
 449  *FvwmProxy: Font "Shadow=0 se:xft:Lucida Grande:size=7:bold"
 450
 451  DestroyModuleConfig FvwmIdent: *
 452  *FvwmIdent: Font "Shadow=0 se:xft:Lucida Grande:size=8:bold"
 453  *FvwmIdent: Colorset 1
 454
 455  ####
 456  # Il existe 3 fonctions spéciales : StartFunction, InitFunction et RestartFunction.
 457  # Vous verrez qu'une seule est utile grace à la commande conditionnelle Test.
 458  # La commande StartFunction est appellée par Fvwm lorsqu'il démarre, lorsqu'il 
 459  # redémmarre mais aussi lorsqu'il ferme. Ce qui peut nous faire mettre de coter
 460  # les deux autres fonctions.
 461  # 
 462  # On utilise la StartFunction pour lancer les modules au démarrage et effectuer
 463  # différentes fonctions dont on a besoin au démarrage, redémarrage ou fermeture 
 464  # de Fvwm. C'est ici par exemple que je met en place le fond d'écran initial.
 465  ##########################
 466  DestroyFunc StartFunction
 467  AddToFunc StartFunction
 468  + I Test (Init) Module FvwmBanner
 469  + I Test (Init, x xscreensaver) Exec xscreensaver -nosplash
 470  + I Test (Init) SendToModule Panel ChangeButton desk Title "unan"
 471  + I Test (Init, x /usr/bin/numlockx) Exec /usr/bin/numlockx
 472  + I Test (Init) Exec rm $[FVWM_USERDIR]/icon.tmp.*
 473  + I Exec fbsetbg -l
 474  + I Module FvwmAnimate
 475  + I Module FvwmProxy
 476  + I Module FvwmEvent
 477  + I Module FvwmTabs
 478  + I Test (f $[FVWM_USERDIR]/vert) ChangeThemeVert
 479  + I Test (f $[FVWM_USERDIR]/defaut) ChangeThemeDefaut
 480  + I Test (Restart) All (Iconic) Test (f $[FVWM_USERDIR]/icon.tmp.$[w.id].png) WindowStyle IconOverride, Icon $[FVWM_USERDIR]/icon.tmp.$[w.id].png
 481  + I Test (Restart) All (GameConsole) Close
 482
 483
 484  ####
 485  # Configuration du module FvwmPager. J'utilise deux configuration différentes
 486  # suivant le thème. Voila pourquoi vous verrez autant de FvwmPager que de thème. 
 487  ##########################
 488  DestroyModuleConfig FvwmPager: *
 489  *FvwmPager: Colorset * 3
 490  *FvwmPager: HilightColorset * 5
 491  *FvwmPager: WindowColorsets 12 13
 492  *FvwmPager: BalloonColorset * 13
 493  *FvwmPager: Font none
 494  *FvwmPager: SmallFont none
 495  *FvwmPager: Balloons All
 496  *FvwmPager: BalloonFont "Shadow=0 se:xft:Lucida Grande:size=7:bold"
 497  *FvwmPager: BalloonYOffset +2
 498  *FvwmPager: BalloonBorderWidth 1
 499  *FvwmPager: UseSkipList
 500  *FvwmPager: MoveThreshold 0
 501  *FvwmPager: SolidSeparators
 502  *FvwmPager: WindowBorderWidth 1
 503
 504  DestroyModuleConfig FvwmPagerTest: *
 505  *FvwmPagerTest: rows 2
 506  *FvwmPagerTest: Columns 2
 507  *FvwmPagerTest: Colorset * 22
 508  *FvwmPagerTest: HilightColorset * 22
 509  *FvwmPagerTest: WindowColorsets 21 21
 510  *FvwmPagerTest: BalloonColorset * 21
 511  *FvwmPagerTest: Font none
 512  *FvwmPagerTest: SmallFont none
 513  *FvwmPagerTest: Balloons All
 514  *FvwmPagerTest: BalloonFont "Shadow=0 se:xft:Lucida Grande:size=7:bold"
 515  *FvwmPagerTest: BalloonYOffset +2
 516  *FvwmPagerTest: BalloonBorderWidth 1
 517  *FvwmPagerTest: UseSkipList
 518  *FvwmPagerTest: MoveThreshold 0
 519  *FvwmPagerTest: SolidSeparators
 520  *FvwmPagerTest: WindowBorderWidth 1
 521
 522  # Définition du style du pager.
 523  Style FvwmPager Sticky, NoTitle, WindowListSkip, StaysOnBottom, \
 524  FixedSize, NeverFocus, !Handles, !Borders, FixedPosition
 525
 526
 527  ####
 528  # Configuration du tableau de bord. C'est largement copié sur Fluxbox mais je le 
 529  # trouve vraiment très simple et à la fois fonctionnel.
 530  #
 531  # Je commence par définir en pixels sa longueur, ce qui me permet par la suite 
 532  # avec un calcul simple en bash (la commande PipeRead permet de récupérer la sortie
 533  # d'un script) d'obtenir en pixels un décalage par rapport au bord de l'écran.
 534  # C'est une manière de centrer ce tableau de bord quelque soit la résolution 
 535  # d'écran (tant qu'elle ne passe pas en dessous de la longueur même du tableau
 536  # de bord).
 537  #
 538  # La configuration est tout simplement celle de FvwmButtons : lisez la page man.
 539  # Enfin, on définit le style de ce tableau de bord.
 540  ##########################
 541  SetEnv panel.width 800
 542  PipeRead "echo SetEnv offset.panel $$(( ($[vp.width]-$[panel.width]) / 2))"
 543
 544  DestroyModuleConfig Panel:*
 545  *Panel: Frame 0
 546  *Panel: Padding 0 0
 547  *Panel: Geometry $[panel.width]x23+$[offset.panel]-5
 548  *Panel: Rows 23
 549  *Panel: Columns 800
 550  *Panel: Colorset 5
 551  *panel: Font "Shadow=0 se:xft:Lucida Grande:size=7:bold"
 552  *Panel: (1x23, Colorset 6)
 553  *Panel: (35x23, id desk, Title "unan", Colorset 4, \
 554  Action(Mouse 5) 'GoToDesk -1 0 3', \
 555  Action(Mouse 4) 'GoToDesk +1 0 3')
 556  *Panel: (16x23, Icon arrow-previous.xpm, Action(Mouse 1) 'GoToDesk -1 0 3', \
 557  Action(Mouse 5) 'GoToDesk -1 0 3', \
 558  Action(Mouse 4) 'GoToDesk +1 0 3')
 559  *Panel: (16x23, Icon arrow-next.xpm, Action(Mouse 1) 'GoToDesk +1 0 3', \
 560  Action(Mouse 5) 'GoToDesk -1 0 3', \
 561  Action(Mouse 4) 'GoToDesk +1 0 3')
 562  *Panel: (691x23, Swallow FvwmIconMan "Module FvwmIconMan")
 563  *Panel: (40x23, Swallow "TimeScript" 'FvwmScript $[scripts]/TimeScript')
 564  *Panel: (1x23, Colorset 6)
 565
 566  # Définition du style du tableau de bord.
 567  Style Panel Sticky, NoTitle, WindowListSkip, StaysOnBottom, \
 568  FixedSize, NeverFocus, !Handles, !Borders
 569
 570
 571  ####
 572  # Configuration du panel pour le thème Vert. Celui-ci doit inclure
 573  # le Pager ainsi que la date et l'heure. Le panel doit être rétractable,
 574  # ceci est réalisé à l'aide de la fonction PanelVertHideFunc.
 575  ##########################
 576  SetEnv panelvert.width 562
 577  SetEnv panelvert.height 67
 578  PipeRead "echo SetEnv IconBoxVertWidth $$(($[vp.width]-$[panelvert.width]))"
 579
 580  DestroyModuleConfig PanelVert: *
 581  *PanelVert: Frame 0
 582  *PanelVert: Padding 0 0
 583  *PanelVert: Geometry $[panelvert.width]x$[panelvert.height]-0-0
 584  *PanelVert: Colorset 11
 585  *PanelVert: Rows 67
 586  *PanelVert: Columns 562
 587  *PanelVert: (562x5, Colorset 2, Frame 1, Action(Mouse 1) `PanelVertHideFunc $height`)
 588  *PanelVert: (160x62, Swallow FvwmScript "FvwmScript $[scripts]/TimeScriptVert")
 589  *PanelVert: (402x62, Swallow FvwmPager "Module FvwmPager 0 3")
 590
 591  # Définition du style du panel vert.
 592  Style PanelVert Sticky, NoTitle, WindowListSkip, StaysOnBottom, \
 593  FixedSize, !Handles, !Borders, NeverFocus
 594
 595
 596  ####
 597  # Exactement le même principe que pour le tableau de bord sauf que je n'utilise
 598  # (plus) pas ce panneau latéral pour le moment. Il est prêt pour plus tard.
 599  # Il sera censé regrouper le pager, quelques raccourcis de lancement rapide et des 
 600  # monitors de charge comme Xosview.
 601  ##########################
 602  SetEnv side.width 183
 603
 604  DestroyModuleConfig Side: *
 605  *Side: Frame 0
 606  *Side: Padding 0 0
 607  *Side: Geometry $[side.width]x$[vp.height]-0+0
 608  *Side: Colorset 20
 609  *Side: Rows 1000
 610  *Side: Columns 183
 611  *Side: (3x1000, Frame 1, Action(Mouse 1) `SideHideFunc $width`)
 612  *Side: (5x62)
 613  *Side: (170x62, Swallow "TimeScriptSide" 'Module FvwmScript $[scripts]/TimeScriptSide')
 614  *Side: (5x62)
 615  *Side: (180x10)
 616  *Side: (25x20, Icon side/cpu.png)
 617  *Side: (150x20, Swallow(UseOld) "cpumon" `Exec exec xosview -title cpumon +cpu`)
 618  *Side: (5x100)
 619  *Side: (25x20, Icon side/reseau.png)
 620  *Side: (150x20, Swallow(UseOld) "netmon" `Exec exec xosview -title netmon +net`)
 621  *Side: (25x20, Icon side/disquedur.png)
 622  *Side: (150x20, Swallow(UseOld) "diskmon" `Exec exec xosview -title diskmon +disk`)
 623  *Side: (25x40, Icon side/memoire.png)
 624  *Side: (150x40, Swallow(UseOld) "memmon" `Exec exec xosview -title memmon +swap +mem`)
 625  *Side: (180x20)
 626  *Side: (10x100)
 627  *Side: (160x100, Swallow "FvwmPager" 'Module FvwmPager FvwmPagerTest 0 3')
 628  *Side: (10x100)
 629  *Side: (180x828)
 630  *Side: BoxSize Fixed
 631  *Side: Font "Shadow=0 se:xft:Lucida Grande:size=9:bold"
 632
 633  # Définition du style du panneau latéral.
 634  Style Side Sticky, NoTitle, WindowListSkip, StaysOnBottom, \
 635  FixedSize, !Handles, !Borders
 636
 637
 638  ####
 639  # FvwmIconMan est le module qui gère la barre des tâches. Remarquez qu'il est 
 640  # inclue dans le tableau de bord grace à la commande Swallow.
 641  # La configuration est relativement standard, c'est à peu près le comportement 
 642  # que l'on retrouve sur la plupart des gestionnaires de fenêtres et ça me 
 643  # convient très bien. N'oubliez pas de jeter un oeil sur la page man de ce module 
 644  # pour bien comprendre les différentes options que j'utilise.
 645  ##########################
 646  DestroyModuleConfig FvwmIconMan: *
 647  *FvwmIconMan: ButtonGeometry    200x23
 648  *FvwmIconMan: FollowFocus True
 649  *FvwmIconMan: Colorset  10
 650  *FvwmIconMan: PlainColorset 10
 651  *FvwmIconMan: DrawIcons false
 652  *FvwmIconMan: FocusAndSelectColorset 9
 653  *FvwmIconMan: FocusColorset     9
 654  *FvwmIconMan: Font "Shadow=0 se:xft:Lucida Grande:size=6:bold"
 655  *FvwmIconMan: Format "%t"
 656  *FvwmIconMan: ManagerGeometry 8x1
 657  *FvwmIconMan: ReliefThickness   0
 658  *FvwmIconMan: Resolution        page
 659  *FvwmIconMan: SelectColorset    10
 660  *FvwmIconMan: Sort              name
 661  *FvwmIconMan: Title             ""
 662  *FvwmIconMan: UseWinList        true
 663  *FvwmIconMan: NoIconAction         "SendToModule FvwmAnimate animate"
 664  *FvwmIconMan: Action    Mouse   1 N sendcommand FocusOrIconify
 665  *FvwmIconMan: Action    Mouse   3 N sendcommand `Menu WindowControls Rectangle +$left+$top 0 -100m`
 666
 667  # Définition du style de la barre des tâches.
 668  Style FvwmIconMan Sticky, NoTitle, WindowListSkip, StaysOnBottom, \
 669  FixedSize, NeverFocus, !Handles, !Borders
 670
 671
 672  ####
 673  # La configuration de Fvwm est maintenant terminée. Il reste pourtant pas mal de 
 674  # choses en dessous : ce sont des fonctions. 
 675  #
 676  # Regardons d'abord comment est constuite une fonction :
 677  #
 678  #   DestroyFunc FuncName
 679  #   AddToFunc FuncName
 680  #   + I (Action immédiate)
 681  #   + C (Action sur un clic de la souris)
 682  #   + D (Action sur un double clic)
 683  #   + H (Action sur un to happen on a mouse 'hold')
 684  #   + M (Action to happen on a mouse 'motion')
 685  #
 686  # La première chose à faire est de détruire la fonction avec DestroyFunc, 
 687  # ceci permet de remettre à zéro afin d'éviter quelques soucis si la fonction 
 688  # existait déja avant dans le fichier. Puis, la commande AddToFunc permet 
 689  # d'ajouter une liste d'action qui sera exécutée quand cette fonction sera 
 690  # appellée. Comme vous pouvez le voir ci-dessus, ces actions peuvent agir
 691  # différemment avec les actions de la souris. Toutefois, on utilise principalement
 692  # le I. Maintenant quand vous appellez une fonction dans FVWM, vous pouvez 
 693  # lui envoyer plusieurs paramètres. Par exemple, vous pouvez appeller la 
 694  # fonction par son nom suivi de variables : 'FuncName "$0" "$1" "$2" "$3"
 695  # "$4"' où $0-$4 sont les options passées à+ I Key d A CM Next (CirculateHit,Side) SideHideFunc 3
 696   la fonction.
 697  #
 698  # J'essaie de donner un nom explicite pour chacune des fonctions et d'optimiser
 699  # au maximum chaque fonction : ne pas créer deux fonctions qui pourraient 
 700  # n'en faire qu'une seule par exemple.
 701  ##########################
 702
 703
 704  ####
 705  # Deux fonctions pour la barre des tâches.
 706  # La première s'occupe de lancer la fonction FuncSelectWindow si la fenêtre
 707  # concernée n'a pas le focus, elle l'iconifie si la fenêtre a le focus.
 708  # La seconde fonction FuncSelectWindow donne le focus, fait passer au premier
 709  # plan et restaure la fenêtre concernée si elle était iconifiée.
 710  ##########################
 711  DestroyFunc FocusOrIconify
 712  AddToFunc FocusOrIconify
 713  + I ThisWindow (!Focused) FuncSelectWindow
 714  + I TestRc (NoMatch) Iconify
 715
 716  DestroyFunc FuncSelectWindow
 717  AddToFunc FuncSelectWindow
 718  + I Focus
 719  + I Iconify false
 720  + I Raise
 721
 722
 723  ####
 724  # Cette fonction est directement liée au panneau latéral.
 725  # C'est elle qui permet de le montrer ou le cacher.
 726  #
 727  # On effectue dans un premier temps un test en bash avec la commande PipeRead
 728  # qui compare la longueur du panneau additionnée à la longueur qu'il prend sur
 729  # l'écran avec la longueur de l'écran. Si le résultat est plus petit que la longueur
 730  # de l'écran, cela veut dire que le panneau est montré ; on donne alors un argument 
 731  # positif à la commande AnimatedMove (dont le fonctionnement est exactement le 
 732  # même que la commande Move) pour l'axe des abscisses. Si le résultat est plus grand
 733  # que la longueur de l'écran, le panneau est donc caché et il faut le montrer ; on 
 734  # donne alors un argument négatif pour AnimatedMove. 
 735  #
 736  # AnimatedMove accepte deux arguments : un horyzontal et un vertical. Les deux
 737  # arguments horyzontaux sont choisis à l'aide de l'opérateur logique || (ou) et 
 738  # l'argument vertical est donné : keep (on garde la même valeur).
 739  #
 740  # C'est exactement le même principe pour la seconde action sauf que l'on modifie
 741  # la variable $[strut.right] en fonction du résultat de la comparaison.
 742  # Le contenu de la variable $[strut.right] est alors utilisée pour mettre à jour 
 743  # la commande EwmhBaseStruts.
 744  #
 745  # Enfin comme la zone de l'écran autorisé pour les fenêtres maximisées est bien 
 746  # définie en fonction de la position du panneau, on indique aux fenêtres maximisées
 747  # de se remaximiser.
 748  #
 749  #
 750  # La fontion PanelVertHideFunc a le même rôle sauf qu'elle ne s'applique que pour 
 751  # le panel du thème vert.
 752  ##########################
 753
 754  DestroyFunc SideHideFunc
 755  AddToFunc SideHideFunc
 756  + I Next (CirculateHit,Side) PipeRead 'echo AnimatedMove $$(test $$(($[w.x]+$[w.width])) -le $[vp.width] \
 757      && echo w$$(($[w.width]-$0))p \
 758      || echo w-$$(($[w.width]-$0))p) keep'
 759  + I Next (CirculateHit,Side) PipeRead 'test $$(($[w.x]+$[w.width])) -le $[vp.width] \
 760      && echo SetEnv strut.right $[side.width] \
 761      || echo SetEnv strut.right $0'
 762  + I EwmhBaseStruts 0 $[strut.right] 0 33
 763  + I All (Maximized, !Side, !Panel) Maximize True
 764  + I PipeRead 'echo SetEnv screen.x $$(($[vp.width]-$[strut.right]+5))'
 765  + I All (GameConsole, !Shaded) Resize $[screen.x]p keep
 766
 767  DestroyFunc PanelVertHideFunc
 768  AddToFunc PanelVertHideFunc
 769  + I Next (PanelVert) PipeRead 'echo AnimatedMove keep $$(test $$(($[w.y]+$[w.height])) -le $[vp.height] \
 770      && echo w$$(($[w.height]-$0))p \
 771      || echo w-$$(($[w.height]-$0))p)'
 772  + I Next (PanelVert) PipeRead 'test $$(($[w.y]+$[w.height])) -le $[vp.height] \
 773      && echo SetEnv strut.bottom $[w.height] \
 774      || echo SetEnv strut.bottom $0'
 775  + I EwmhBaseStruts 0 0 0 $[strut.bottom]
 776  + I All (Maximized, !PanelVert) Maximize True
 777
 778
 779  ####
 780  # Vous pouvez explorer des répertoires et des fichiers grace au script
 781  # fvwm-menu-directory inclut dans Fvwm. C'est très configurable et très 
 782  # fonctionnel. Ces 3 fonctions sont directements tirées du fichier de 
 783  # configuration de Taviso.
 784  # 
 785  # Il faudra les utiliser dans des menus dynamiques. Elles permettent
 786  # d'explorer vos répertoires de videos et de musiques et de changer de fond d'écran.
 787  ##########################
 788  DestroyFunc FuncFvwmMenuDirectory
 789  AddToFunc FuncFvwmMenuDirectory
 790  + I PipeRead 'case "$0" in \
 791          "$[video]"*) myexec="$[video_exec]" mypng=menu/video.png;; \
 792          "$[audio]"*) myexec="$[audio_exec]" mypng=menu/audio.png;; \
 793      esac; \
 794      fvwm-menu-directory --icon-title menu/dossier.png --icon-file ${mypng:-menu/dossier.png} \
 795      --icon-dir menu/dossier.png --dir "$0" --exec-t="^${myexec:-gvim} *" \
 796      --exec-file "^${myexec:-gvim}"'
 797
 798  DestroyFunc WallpaperBrowser
 799  AddToFunc WallpaperBrowser
 800  + I PipeRead 'test ! -d "$0/.thumbs" && mkdir "$0/.thumbs"; \
 801      for i in "$0/"*; do \
 802          test -f "$0/.thumbs/${i##*/}" \
 803              -a "${i}" -ot "$0/.thumbs/${i##*/}" || { \
 804                  convert -quality 0 -scale 64 "${i}" "png:$0/.thumbs/${i##*/}" 2>/dev/null \
 805                      || continue;}; \
 806      done; \
 807      fvwm-menu-directory --icon-title dossier.png --icon-file __PIXMAP__ \
 808      --icon-dir dossier.png --dir $0 --exec-file "^fbsetbg -f" \
 809      --exec-t="^eog *" | sed -e "s#FuncFvwmMenuDirectory#WallpaperBrowser#g" \
 810      -e "s#__PIXMAP__\\(.*\\)\\"\\(.*/\\)\\(.*\\)\\"#\\2.thumbs/\\3\\1\\2\\3#g"'
 811
 812  DestroyFunc ScreenshotsBrowser
 813  AddToFunc ScreenshotsBrowser
 814  + I PipeRead 'test ! -d "$0/.thumbs" && mkdir "$0/.thumbs"; \
 815      for i in "$0/"*; do \
 816          test -f "$0/.thumbs/${i##*/}" \
 817              -a "${i}" -ot "$0/.thumbs/${i##*/}" || { \
 818                  convert -quality 0 -scale 64 "${i}" "png:$0/.thumbs/${i##*/}" 2>/dev/null \
 819                      || continue;}; \
 820      done; \
 821      fvwm-menu-directory --icon-title dossier.png --icon-file __PIXMAP__ \
 822      --icon-dir dossier.png --dir $0 --exec-file "^eog" \
 823      --exec-t="^eog *" | sed -e "s#FuncFvwmMenuDirectory#ScreenshotsBrowser#g" \
 824      -e "s#__PIXMAP__\\(.*\\)\\"\\(.*/\\)\\(.*\\)\\"#\\2.thumbs/\\3\\1\\2\\3#g"'
 825
 826
 827  ####
 828  # Fvwm possède une fonction native nommée WindowListFunc. Je n'aimais pas trop
 829  # le comportement par defaut de cette fonction, alors je l'ai détruite et recréé
 830  # afin de positionner le curseur de la souris sur la fenêtre sélectionnée.
 831  ##########################
 832  DestroyFunc WindowListFunc
 833  AddToFunc WindowListFunc
 834  + I Iconify off
 835  + I FlipFocus
 836  + I Raise
 837  + I WarpToWindow 50 50
 838
 839
 840  ####
 841  # Fonction très simple qui permet avec une simple opération mathématique de
 842  # centrer une fenêtre. J'utilise la même méthode pour centrer le tableau de bord.
 843  # Cette fonction est appellée avec la combinaison de touche Alt+c.
 844  ##########################
 845  DestroyFunc CenterWindow
 846  AddToFunc   CenterWindow
 847  + I ThisWindow Piperead "echo AnimatedMove \
 848        $(( $[vp.width]/2-$[w.width]/2 ))p \
 849        $(( $[vp.height]/2-$[w.height]/2 ))p"
 850
 851
 852  ####
 853  # Différentes fonctions qui s'occupe des opérations sur les fenêtres :
 854  # iconifier, maximiser, plein écran, enlever la décoration etc.
 855  ##########################
 856  DestroyFunc IconifyFunc
 857  AddToFunc IconifyFunc
 858  + M Nop
 859  + C Iconify
 860
 861  DestroyFunc ThumbnailFunc
 862  AddToFunc ThumbnailFunc
 863  + M Nop
 864  + C Thumbnail
 865
 866
 867  DestroyFunc MaximizeFunc
 868  AddToFunc MaximizeFunc
 869  + C Maximize $0
 870  + M Nop
 871
 872  DestroyFunc HoryMaximizeFunc
 873  AddToFunc HoryMaximizeFunc
 874  + C Maximize 100 0
 875  + M Nop
 876
 877  DestroyFunc MaximizeTitleBarFunc
 878  AddToFunc MaximizeTitleBarFunc
 879  + I Raise
 880  + D Maximize
 881  + M Move
 882
 883  DestroyFunc CloseFunc
 884  AddToFunc CloseFunc
 885  + C Close
 886  + M Nop
 887
 888  DestroyFunc MoveFunc
 889  AddToFunc MoveFunc
 890  + M Move
 891  + C Nop
 892
 893  DestroyFunc ResizeFunc
 894  AddToFunc ResizeFunc
 895  + M Resize
 896  + C Menu WindowControls
 897  AddToFunc DeiconifyAndRearrange
 898   + I DeThumbnail
 899   + I All (CurrentPage, Iconic) PlaceAgain Icon
 900
 901   AddToFunc IconFunc
 902   + C DeiconifyAndRearrange
 903   + M Raise
 904   + M Move
 905   + D DeiconifyAndRearrange
 906
 907  DestroyFunc Thumbnail
 908  AddToFunc Thumbnail
 909  + I Raise
 910  + I ThisWindow (!Iconic) SetEnv Icon-$[w.id] $[w.iconfile]
 911  + I ThisWindow (!Shaded, Iconifiable, !Iconic) PipeRead \
 912  "xwd -silent -id $[w.id] | convert -scale 128 -frame 1x1 \
 913  -mattecolor black -quality 0 xwd:- png:$[FVWM_USERDIR]/icon.tmp.$[w.id].png \
 914  && echo WindowStyle IconOverride, Icon $[FVWM_USERDIR]/icon.tmp.$[w.id].png \
 915  || echo Nop"
 916  + I TestRc (Match) Test (f $[w.miniiconfile], f $[FVWM_USERDIR]/icon.tmp.$[w.id].png) PipeRead \
 917  "composite -geometry +2+4 $[w.miniiconfile] $[FVWM_USERDIR]/icon.tmp.$[w.id].png \
 918  $[FVWM_USERDIR]/icon.tmp.$[w.id].png; echo Nop"
 919  + I Iconify
 920
 921  DestroyFunc DeThumbnail
 922  AddToFunc DeThumbnail
 923  + I PipeRead "echo Test \\(i \\$\\[Icon-$[w.id]\\]\\) WindowStyle Icon \\$\\[Icon-$[w.id]\\]"
 924  + I TestRc (NoMatch) WindowStyle NoIconOverride, Icon
 925  + I Exec rm -f $[FVWM_USERDIR]/icon.tmp.$[w.id].png
 926  + I UnsetEnv Icon-$[w.id]
 927  + I Iconify off
 928
 929  ####
 930  # J'utilise FvwmEvent pour détecter le lancement de nouvelles fenêtres.
 931  # Différentes actions sont exécutées en fonction de la fenêtre.
 932  # Je décide par exemple de placer Irssi à une certaine position dès qu'ils souvre.
 933  #
 934  # Merci à Thomas_Adam sur les forums Fvwm pour m'avoir aidé sur ce point :
 935  # lorsque vous maximisez une fenêtre et que vous la fermez, elle ne sera pas maximisée
 936  # la prochaine fois (seule la taille est conservée). Si je ferme Firefox alors qu'il était 
 937  # maximisé je veux qu'il soit maximisé la prochaine fois que je l'ouvre ; mais je veux aussi
 938  # qu'il ne le soit pas s'il ne l'était pas quand je l'avais fermé. C'est le comportement du
 939  # gestionnaire de fenêtres Metacity de GNOME.
 940  #
 941  # C'est ce que font ces deux fonctions. Lorsqu'une fenêtre est ouverte, on vérifie si le nom
 942  # de sa classe apparait dans le fichier $[FVWM_USERDIR]/windowlist, si oui alors la fenêtre est
 943  # maximisée. Si son nom de classe n'apparait pas, on ne fait rien bien sur.
 944  #
 945  # Par contre lorsque je ferme une fenêtre, il y'a deux possibilités : elle était maximisée ou non.
 946  # Si elle était maximisée et qu'on ne trouve pas le nom de sa classe dans le fichier $[FVWM_USERDIR]/windowlist
 947  # alors on écrit la classe dans ce fichier. Si la fenêtre n'était pas maximisée et qu'on trouve le nom de 
 948  # sa classe dans le fichier, alors il faut le supprimer sinon elle sera maximisée la prochaine fois.
 949  ##########################
 950  DestroyFunc AddWindowFunc
 951  AddToFunc AddWindowFunc
 952  + I ThisWindow (irssi) Move 30p 135p
 953  + I ThisWindow PipeRead `\
 954  while read; do \
 955  [[ "$REPLY" == "$[w.resource]" ]] && \
 956  echo 'ThisWindow (!Maximized) Maximize' || \
 957  echo Nop; done < $[FVWM_USERDIR]/windowlist`
 958
 959  DestroyFunc CloseWindowFunc
 960  AddToFunc CloseWindowFunc
 961  + I ThisWindow (Maximized) Exec /bin/sh -c \
 962  'if ! grep -q $[w.resource] $[FVWM_USERDIR]/windowlist; then echo $[w.resource] >> $[FVWM_USERDIR]/windowlist; fi'
 963  + I ThisWindow (!Maximized) Exec /bin/sh -c \
 964  'if grep -q $[w.resource] $[FVWM_USERDIR]/windowlist; then sed -ie "/$[w.resource]/d;" $[FVWM_USERDIR]/windowlist; fi'
 965
 966
 967  ####
 968  # Deux fonctions utilisées dans le menu des opérations sur les fenêtres.
 969  # Elles permettent respectivement de faire passer une fenêtre en plein écran
 970  # ou de la remettre dans son état initial. Ce que j'appelle plein écran, c'est 
 971  # une fenêtre sans bordures, sans décorations de fenêtres et maximisée au maximum.
 972  # Voila ce que fait la fonction FullScreen et à l'inverse la fonction FullScreenOff.
 973  ##########################
 974  DestroyFunc FullScreen
 975  AddToFunc FullScreen
 976  + I ToggleTitle
 977  + I ToggleBorder
 978  + I UpdateStyles
 979  + I Maximize ewmhiwa true
 980
 981  DestroyFunc FullScreenOff
 982  AddToFunc FullScreenOff
 983  + I ToggleTitle
 984  + I ToggleBorder
 985  + I UpdateStyles
 986  + I Maximize ewmhiwa false
 987
 988
 989  ####
 990  # On a dit au début que toutes les fenêtres avait le State 1 (la barre de titre 
 991  # est bien la). La fonction ToggleTitle s'occupe d'appliquer le Style NoTitle
 992  # à la fenêtre concernée si cette dernière avait bien le State 1. Dans le cas
 993  # contraire (ce qui veut dire que la barre de titre n'est plus la), ToggleTitle
 994  # applique le Style Title à la fenêtre.
 995  #
 996  # Exactement le même principe pour ToggleBorder sauf que l'on joue sur le Style 
 997  # Borders et !Borders ainsi que sur le State 2 (la bordure est bien la).
 998  #
 999  # Toujours le même principe pour TitleRotate. Cela paraît un peu plus compliqué 
1000  # car c'est une boucle. Mais regardez bien : le State 3 définit que la barre de 
1001  # titre est en haut. On indique donc à Fvwm de passer la barre de titre à gauche
1002  # si elle était en haut. Ensuite on dit que si la barre de titre est à gauche, cela 
1003  # correspond au State 4. Si l'on rappelle cette fonction, on lui indique de faire 
1004  # passer la barre de titre en bas si elle était à gauche ; ce qui fait passer la 
1005  # fenêtre en State 5. Cela se répète jusqu'à revenir au State 3. 
1006  #
1007  # Remarque : ces 3 fonctions sont très inspirées de fonctions écrites par Taviso.
1008  ##########################
1009  DestroyFunc ToggleTitle
1010  AddToFunc ToggleTitle
1011  + I ThisWindow (State 1) WindowStyle NoTitle
1012  + I TestRc (Match) State 1 False
1013  + I TestRc (NoMatch) WindowStyle Title
1014  + I TestRc (NoMatch) State 1 True
1015
1016  DestroyFunc ToggleBorder
1017  AddToFunc ToggleBorder
1018  + I ThisWindow (State 2) WindowStyle !Borders
1019  + I TestRc (Match) State 2 False
1020  + I TestRc (NoMatch) WindowStyle Borders
1021  + I TestRc (NoMatch) State 2 True
1022
1023  DestroyFunc TitleRotateLeft
1024  AddToFunc TitleRotateLeft
1025  + I ThisWindow (State 3) WindowStyle TitleAtLeft
1026  + I TestRc (Match) State 3 False
1027  + I TestRc (Match) State 4 True
1028  + I TestRc (Match) Break
1029  + I ThisWindow (State 4) WindowStyle TitleAtBottom
1030  + I TestRc (Match) State 4 False
1031  + I TestRc (Match) State 5 True
1032  + I TestRc (Match) Break
1033  + I ThisWindow (State 5) WindowStyle TitleAtRight
1034  + I TestRc (Match) State 5 False
1035  + I TestRc (Match) State 6 True
1036  + I TestRc (Match) Break
1037  + I ThisWindow (State 6) WindowStyle TitleAtTop
1038  + I TestRc (Match) State 6 False
1039  + I TestRc (Match) State 3 True
1040  + I TestRc (Match) Break
1041
1042  DestroyFunc TitleRotateRight
1043  AddToFunc TitleRotateRight
1044  + I ThisWindow (State 3) WindowStyle TitleAtRight
1045  + I TestRc (Match) State 3 False
1046  + I TestRc (Match) State 6 True
1047  + I TestRc (Match) Break
1048  + I ThisWindow (State 6) WindowStyle TitleAtBottom
1049  + I TestRc (Match) State 6 False
1050  + I TestRc (Match) State 5 True
1051  + I TestRc (Match) Break
1052  + I ThisWindow (State 5) WindowStyle TitleAtLeft
1053  + I TestRc (Match) State 5 False
1054  + I TestRc (Match) State 4 True
1055  + I TestRc (Match) Break
1056  + I ThisWindow (State 4) WindowStyle TitleAtTop
1057  + I TestRc (Match) State 4 False
1058  + I TestRc (Match) State 3 True
1059  + I TestRc (Match) Break
1060
1061
1062
1063
1064
1065
1066  ####
1067  # Celle ci s'occupe de remplacer le contenu de la variable $[desk.n] qui est 
1068  # un chiffre représentatif du bureau courant (0, 1, 2 ou 3 dans notre cas) par 
1069  # un mot, c'est du Breton mais libre à vous de mettre ce que vous voulez bien sur !
1070  # Remarquez l'utilité de la commande PipeRead.
1071  ##########################
1072  DestroyFunc NewDeskFunc
1073  AddToFunc NewDeskFunc
1074  + I Piperead 'case $[desk.n] in \
1075          "0" ) echo SetEnv title.desk unan;; \
1076          "1" ) echo SetEnv title.desk daou;; \
1077          "2" ) echo SetEnv title.desk tri;; \
1078          "3" ) echo SetEnv title.desk pevar;; esac'
1079  + I SendToModule Panel ChangeButton desk Title $[title.desk]
1080
1081
1082  ####
1083  # http://www.stationlinux.org/fiche.140.html
1084  # C'est ce que j'appelle la console Quake 3. Je crois que c'est parce que c'est 
1085  # dans ce jeu que j'ai vu pour la première fois une console de ce genre.
1086  #
1087  # La fonction ToggleTerminal exécute la fonction StartTerminal si il n'existe pas de 
1088  # fenêtre nommée GameConsole. Si il existe déja une fenêtre GameConsole, la fonction
1089  # lui donne le focus, la fait passer en premier plan et la déroule si elle était 
1090  # enroulée ; ou bien appelle la fonction SetWindowShadeTrue si la GameConsole 
1091  # était déroulée.
1092  #
1093  # La fonction StartTerminal ne fait que démarrer un terminal nommé GameConsole, 
1094  # le redimmenssione de telle manière qu'il prenne toute la place de l'écran et
1095  # change le contenu de $[OpenedTerm] à True.
1096  #
1097  # La fonction SetWindowShadeTrue est appellée si la GameConsole est déroulée.
1098  # On test si $[OpenedTerm] contient bien False, alors on enroule le terminal.
1099  #
1100  # Si le terminal est collé en haut de l'écran, on obtient le même comportement
1101  # que sous Quake 3.
1102  ##########################
1103  DestroyFunc ToggleTerminal
1104  AddToFunc ToggleTerminal
1105  + I SetEnv OpenedTerm "False"
1106  + I None (GameConsole) StartTerminal
1107  + I All (GameConsole) Focus
1108  + I All (GameConsole) Raise
1109  + I All (GameConsole, Shaded) SetWindowShadeFalse
1110  + I TestRc (NoMatch) SetWindowShadeTrue
1111
1112  DestroyFunc SetWindowShadeTrue
1113  AddToFunc SetWindowShadeTrue
1114  + I Test (EnvMatch OpenedTerm False) All (GameConsole) WindowShade True
1115
1116  DestroyFunc SetWindowShadeFalse
1117  AddToFunc SetWindowShadeFalse
1118  + I All (GameConsole) WindowShade False
1119  + I All (GameConsole) Resize $[screen.x]p keep
1120
1121  DestroyFunc StartTerminal
1122  AddToFunc StartTerminal
1123  + I Exec $[TermQuake]
1124  + I Wait GameConsole
1125  + I All (GameConsole) Resize $[screen.x]p keep
1126  + I SetEnv OpenedTerm "True"
1127
1128
1129  ####
1130  # ChangeThemeDefaut est lancée dans la StartFunction lors du démarrage de Fvwm (et 
1131  # uniquement lors du démarrage grace au Test (Init)). Elle définie, tout comme 
1132  # ChangeThemeVert, plusieurs Style, MenuStyle, Colorset et même des variables 
1133  # d'environnement. ChangeThemeDefaut sélectionne le décor Default alors que 
1134  # ChangeThemeVert sélectionne le décor Vert.
1135  # 
1136  # ChangeThemeVert est lancée dans la StartFunction lors du redémarrage seulement
1137  # si elle à été lancée auparavant (grace à cette ligne : + I SetEnv theme vert).
1138  # En effet cela créé la variable $[theme] avec pour valeur "vert", et regardez 
1139  # bien dans la StartFunction :
1140  # + I Test (Init) SetEnv theme defaut
1141  # + I ChangeTheme$[theme]
1142  # On lance ChangeThemeDefaut lors du premier démarrage de Fvwm et on lance soit 
1143  # ChangeThemeVert ou ChangeThemeDefaut selon le thème utilisé.
1144  # C'est un moyen de se souvenir quel était le thème utilisé. Il faudrait écrire 
1145  # dans un fichier extérieur la valeur de la variable pour que Fvwm puisse restaurer
1146  # le thème utilisé auparavant lors d'un premier démarrage (après un reboot
1147  # par exemple).
1148  # 
1149  # Il faut créer autant de fonctions similaires qu'il existe de thèmes.
1150  #
1151  # http://www.stationlinux.org/fiche.138.html
1152  # Utilisez EwmhBaseStruts pour empêcher les fenêtres de recouvrir une 
1153  # zone de l'écran lorsqu'elles sont maximisées. Les valeurs sont en pixels.
1154  # Notez que vous pouvez utiliser l'argument ewmhiwa pour la commande Maximize,
1155  # ce qui aura pour conséquence d'ignorer EwmhBaseStruts.
1156  # EwmhBaseStruts $[strut.left] $[strut.right] $[strut.top] $[strut.bottom]
1157  ##########################
1158  DestroyFunc ChangeThemeDefaut
1159  AddToFunc ChangeThemeDefaut
1160  + I DefaultColorset 9
1161  + I Style * UseDecor Default, NoIcon
1162  + I Colorset 0 fg #c0c0c0, bg #fdfdfd
1163  + I Colorset 2 fg #7b7b7b, bg #fdfdfd
1164  + I Colorset 3 fg white, RootTransparent, Tint #414b54 85
1165  + I Colorset 4 fg #393b3a, Pixmap cinza/iconman.png
1166  + I Colorset 5 fg #7b7b7b, Pixmap cinza/iconman.png
1167  + I Colorset 6 Pixmap cinza/panel-side.xpm
1168  + I Colorset 7 fg #2c2c2c, Translucent white 75, hi white, sh white
1169  + I Colorset 8 fg white, bg #414b54, hi white
1170  + I Colorset 9 fg white, Pixmap cinza/hilite.png
1171  + I Colorset 10 fg #393b3a, Pixmap cinza/iconman.png
1172  + I Colorset 20 fg white, Pixmap cinza/hilite-side.png
1173  + I Colorset 21 fg white, Pixmap pager/active.png
1174  + I Colorset 22 fg #393b3a, Pixmap pager/desk.png
1175  + I Mouse 1 6 A IconifyFunc
1176  + I MenuStyle * Font "Shadow=0 se:xft:snap"
1177  + I UpdateStyles
1178  + I Key d A CM Next (CirculateHit,Side) SideHideFunc 3
1179  + I PipeRead "if [ -f ${FVWM_USERDIR}/vert ]; then rm ${FVWM_USERDIR}/vert; fi"
1180  + I PipeRead "if [ -f ${FVWM_USERDIR}/defaut ]; then rm ${FVWM_USERDIR}/defaut; fi"
1181  + I All (PanelVert) Close
1182  + I All (Panel) Close
1183  + I All (Side) Close
1184  + I EwmhBaseStruts 0 $[strut.right] 0 33
1185  + I All (Maximized, !Panel) Maximize True
1186  + I Module FvwmButtons Panel
1187  + I SendToModule Panel ChangeButton desk Title $[title.desk]
1188  + I Module FvwmButtons Side
1189  + I Wait Side
1190  + I All (Side) SideHideFunc 3
1191  + I Exec touch $[FVWM_USERDIR]/defaut
1192  + I All (GameConsole) Close
1193
1194  DestroyFunc ChangeThemeVert
1195  AddToFunc ChangeThemeVert
1196  + I EwmhBaseStruts 0 0 0 67
1197  + I Colorset 0 fg #393b3a, bg #b4d387, IconAlpha 65
1198  + I Colorset 2 fg black, bg #b4d387, IconAlpha 100
1199  + I Colorset 3 fg white, Tint white 70, RootTransparent buffer
1200  + I Colorset 11 fg black, Tint white 70, RootTransparent buffer
1201  + I Colorset 5 fg black, Tint white 80, RootTransparent buffer
1202  + I Mouse 1 6 A ThumbnailFunc
1203  + I Mouse 1 I A IconFunc
1204  + I Style * UseDecor Green, Icon, NoIconTitle
1205  + I Style * IconBox $[IconBoxVertWidth]x$[panelvert.height]+0-0
1206  + I Style * IconGrid 3 3, IconFill bottom left
1207  + I DefaultColorset 0
1208  + I Colorset 7 fg #393b3a, Translucent white 75, white, sh white
1209  + I Colorset 8 fg #393b3a, bg #b4d387, hi white
1210  + I Colorset 12 fg #393b3a, bg #bbd09d
1211  + I Colorset 13 fg #393b3a, bg #b4d387, sh #393b3a, hi #393b3a
1212  + I MenuStyle * Font "Shadow=0 se:xft:Lucida Grande:size=8"
1213  + I UpdateStyles
1214  + I All (Iconic) Test (f $[FVWM_USERDIR]/icon.tmp.$[w.id].png) WindowStyle IconOverride, Icon $[FVWM_USERDIR]/icon.tmp.$[w.id].png
1215  + I Key d A CM Next (CirculateHit,PanelVert) PanelVertHideFunc 5
1216  + I PipeRead "if [ -f ${FVWM_USERDIR}/vert ]; then rm ${FVWM_USERDIR}/vert; fi"
1217  + I PipeRead "if [ -f ${FVWM_USERDIR}/defaut ]; then rm ${FVWM_USERDIR}/defaut; fi"
1218  + I PipeRead 'echo SetEnv screen.x $$(($[vp.width]+5))'
1219  + I All (Panel) Close
1220  + I All (Side) Close
1221  + I All (PanelVert) Close
1222  + I All (Maximized, !PanelVert) Maximize True
1223  + I Module FvwmButtons PanelVert
1224  + I Exec touch $[FVWM_USERDIR]/vert
1225  + I All (GameConsole) Close