WMFS, acte I : Installation

Après vous avoir fait une brève présentation de WMFS dans un précédent article, voici l’un des premiers « How to » lié à ce tiling manager.

Étant donné que j’utilise WMFS depuis peu, j’ai l’intention de partager mes découvertes concernant celui-ci au fil du temps. Pour faire court, cet article est à considérer comme le premier d’une longue série !

Dans ce premier billet, il sera simplement question d’installer ce gestionnaire de fenêtre et de voir brièvement le fichier de configuration dédié.

En route vers WMFS !

Installation :

Arch Linux :

WMFS est disponible via le dépôt d’utilisateur AUR, celui-ci étant en constante évolution, je vous conseille d’installer la version GIT du paquet :

$ yaourt -S wmfs-git

Ubuntu / Debian :

Des paquets au format .deb pour les architectures 32 et 64 bit sont disponibles, téléchargez tout d’abord le paquet adéquat en vous rendant à l’adresse suivante : http://hramn.icedslash.com/desu/

Installez ensuite le paquet :

# dpkg -i wmfs_*.deb

Merci à engil qui s’occupe de la mise à jour des paquets !

Pour les autres distributions ou par simple curiosité, je vous conseille vivement de vous rendre à la page du wiki dédiée à l’installation de WMFS : http://wmfs.info/projects/wmfs/wiki

Post-installation :

Le fichier de configuration par défaut se situe dans le répertoire : /etc/xdg/wmfs, il sera donc nécessaire de copier celui-ci dans votre /home :

$ mkdir -p ~/.config/wmfs
$ cp /etc/xdg/wmfs/wmfsrc ~/.config/wmfs/wmfsrc

Lancement :

J’ai pour habitude de ne pas utiliser de login manager, il m’a donc suffit de modifier le fichier .xinitrc :

$ nano ~/.xinitrc
#!/bin/sh
 
exec ck-launch-session dbus-launch wmfs

Un simple startx suffit pour lancer la session :

$ startx

Si vous utilisez un gestionnaire de démarrage tel que Slim, GDM ou encore KDM, veuillez vous référer à la documentation adéquate.

Premier contact :

Je vous l’accorde, après le premier lancement on peut qualifier WMFS d’austère… Mais voyons de suite de quoi il se compose :

  • bar : Tableau de bord qui regroupe les fonctionnalités layouts, tags, selbar, launcher, systray et status.
  • Layouts : Nom donné à la mise en page de l’espace de travail.
  • Tags : Espaces de travail, 9 par défaut.
  • Menu : Menu principal de WMFS qui apparaît par défaut via un clic droit.
  • Systray : Zone de notification.
  • Status : Sert à afficher des informations, Conky par exemple.
  • Launcher : Lanceur d’application similaire à Gmrun, la combinaison des touches [ Alt + P ] permet de l’activer.

  • Client : Nom des fenêtres.
  • Titlebar : Barre de « décoration » des fênetres, elle se compose d’un bouton et du titre du client.
  • Selbar : Indique le client qui a le focus, par défaut un clic droit permet d’obtenir la liste de tout les clients.

À présent, voici une liste des principaux raccourcis clavier :

  • Ctrl + Left ] [ Ctrl + Right ] : Passe au tag suivant/précédent.
  • Alt + Tab ] [ Alt + Shift + Tab ] : Passe au client suivant/précédent.
  • [ Alt + Q ] : Quitte le client qui a le focus.
  • [ Alt + P ] : Active le launcher.
  • Alt + space ] : Modifie le type de layout.
  • [ CtrlAlt + R ] : Recharge le fichier de configuration.
  • AltF ] : Active le mode flottant sur la fenêtre qui a le focus.
  • Alt + L ], [ AltH ] : Modifie la taille de la fenêtre en position master.

Bien évidement WMFS vous permet de modifier, d’ajouter ou encore de supprimer des raccourcis clavier.

Configuration :

La configuration de WMFS s’articule autour d’un unique fichier nommé wmfsrc que voici :

#
# This is the default wmfs config file, copy it to
# ~/.config/wmfs/wmfsrc and edit it.
#
 
# Include file to split configuration
# @include "~/.config/wmfs/menu-wmfsrc"
 
[misc]
        font                  = "dejavu-10"
        raisefocus            = true
        raiseswitch           = false
        focus_follow_mouse    = true
        focus_follow_movement = false
        opacity               = 255
 
        # focus_pointer_click: click on unfocused client area:
        # true  -- default, set focus
        # false -- click go to client; including dockapps
        focus_pointer_click = true
        status_timing      = 1     #seconds
        # status_path       = "~/.config/wmfs/status.sh"
[/misc]
 
[bar]
        bg     = "#191919"
        fg     = "#D4D4D4"
        border = true
        #height = "-1"
 
        light_shade =  0.10
        dark_shade  = -0.10
 
        [systray]
                # Enable/disable systray
                active = true
 
                # Screen of systray
                screen = 0
 
                # Spacing between tray icons
                spacing = 3
        [/systray]
 
        # Remove this section to disable the selbar.
        [selbar]
                bg = "#191919"
                fg = "#D4D4ff"
 
                # Cut title length
                # max_length = 25
 
                [mouse] button = "3" func = "clientlist"  [/mouse]
                [mouse] button = "4" func = "client_next" [/mouse]
                [mouse] button = "5" func = "client_prev" [/mouse]
        [/selbar]
 
[/bar]
 
[layouts]
        fg = "#191919"
        bg = "#7E89A2"
 
        # Border around the layout button.
        border = true
 
        # Value menu or switch.
        system = "menu"
 
        # Value left or right.
        placement = "right"
 
        # Keep layout geo for free layout
        keep_layout_geo = false
 
        # Symbol displayed for the selected layout in the list
        selected_layout_symbol = "*"
 
        # Width of layout button
        # layout_button_width = x
 
        # Tiling layouts.
        [layout] type = "tile_right"         symbol = "RIGHT"    [/layout]
        [layout] type = "tile_left"          symbol = "LEFT"     [/layout]
        [layout] type = "tile_top"           symbol = "TOP"      [/layout]
        [layout] type = "tile_bottom"        symbol = "BOTTOM"   [/layout]
        [layout] type = "tile_grid"          symbol = "GRID_H"   [/layout]
        [layout] type = "tile_grid_vertical" symbol = "GRID_V"   [/layout]
        [layout] type = "mirror_vertical"    symbol = "MIRROR_V" [/layout]
        [layout] type = "mirror_horizontal"  symbol = "MIRROR_H" [/layout]
 
        # Other layouts.
        [layout] type = "max"   symbol = "MAX"  [/layout]
        [layout] type = "free"  symbol = "FREE" [/layout]
 
[/layouts]
 
[tags]
        [default_tag]
             name             = "new tag"
             mwfact           = 0.5
             nmaster          = 1
             layout           = "tile_right"
             resizehint       = false
             infobar_position = "top"
        [/default_tag]
 
        # whether client_next on the last tag will send you on the first
        # and client_prev on the first tag will send you on the last one
        tag_round      = false
 
        # Going twice on the same tag will bring you back on the previous one
        tag_auto_prev  = true
 
        occupied_bg    = "#003366"
        occupied_fg    = "#D4D4D4"
        sel_fg         = "#191919"
        sel_bg         = "#7E89A2"
        urgent_bg      = "#DD1111"
        urgent_fg      = "#000000"
 
        # If true, number of the tag will be used for name
        name_count     = false
        #default_name   = "new tag" # deprecated, use [default_tag] instead
        #default_layout = "tile_right" # deprecated, use [default_tag] instead
 
        # Border around the tag buttons.
        border      = true
 
        # Hide empty tags in tag list
        autohide    = false
 
        # Mouse buttons action on tag.
        mouse_button_tag_sel       = "1"
        mouse_button_tag_transfert = "2"
        mouse_button_tag_add       = "3"
        mouse_button_tag_next      = "4"
        mouse_button_tag_prev      = "5"
 
        [tag]
                name             = "one"
                screen           = 0
                mwfact           = 0.65
                nmaster          = 1
                layout           = "tile_right"
                resizehint       = false
                infobar_position = "top"
                above_fc         = false
                #[mouse] [/mouse] Possible multi mouse section
        [/tag]
 
        # clients option is *DEPRECATED* but works, see [rules] section
        [tag] name = "two"  clients = {"Browser"} [/tag]
        [tag] name = "three" [/tag]
        [tag] name = "four"  [/tag]
        [tag] name = "five"  [/tag]
        [tag] name = "six"   [/tag]
        [tag] name = "seven" [/tag]
        [tag] name = "eight" [/tag]
        [tag] name = "nine"  [/tag]
[/tags]
 
[root]
       # Command you can execute to set the background.
        background_command = "xsetroot -solid black"
 
        [mouse] button = "4" func = "tag_next"              [/mouse]
        [mouse] button = "5" func = "tag_prev"              [/mouse]
        [mouse] button = "3" func = "menu" cmd = "rootmenu" [/mouse]
[/root]
 
[client]
        client_round         = true
        client_auto_center   = false
        border_height        = 3
        border_shadow        = true
        border_normal        = "#191919"
        border_focus         = "#003366"
        place_at_mouse       = false
        resize_corner_normal = "#191919"
        resize_corner_focus  = "#003366"
        set_new_win_master   = true
        client_tile_raise    = false
        new_client_get_mouse = false
 
        # send all client that have no tag rule in this default tag
        #default_open_tag     = 4
        # same as above but for the screen
        #default_open_screen  = 1
 
        # Space between tiled clients
        padding = 0
 
        # Modifier for mouse use
        modifier = "Alt"
 
        light_shade =  0.10
        dark_shade  = -0.10
 
        # *DEPRECATED* but works, see [rules] section
        # Set automatic free or max client
        # autofree = "xterm|MPlayer"
        # automax  = "Navigator"
 
        [mouse] button = "1" func = "client_raise" [/mouse]
        [mouse] button = "1" func = "mouse_move"   [/mouse]
        [mouse] button = "3" func = "client_raise" [/mouse]
        [mouse] button = "3" func = "mouse_resize" [/mouse]
 
        # Remove this section to delete the titlebar.
        [titlebar]
                stipple   = false
                height    = 12
                fg_normal = "#7E89A2"
                fg_focus  = "#9F9AB3"
 
                [mouse] button = "1" func = "client_raise" [/mouse]
                [mouse] button = "1" func = "mouse_move"   [/mouse]
                [mouse] button = "3" func = "client_raise" [/mouse]
                [mouse] button = "3" func = "mouse_resize" [/mouse]
 
                [button]
                        # Available "free", "max", "tile" flags or button.
                        flags = "free,max,tile"
                        [mouse] button = "1" func = "client_kill"             [/mouse]
                        [mouse] button = "3" func = "menu" cmd = "clientmenu" [/mouse]
 
                        [line] coord = {1, 1, 4, 1} [/line]
                        [line] coord = {1, 1, 1, 4} [/line]
                        [line] coord = {1, 4, 4, 4} [/line]
                [/button]
        [/titlebar]
[/client]
 
[rules]
       # Example of rule for MPlayer
       [rule]
               instance      = "xv"       # First part of WM_CLASS
               class         = "MPlayer"  # Seconf part of WM_CLASS, not needed if first part is correct
               # role        = ""         # WM_WINDOW_ROLE
               screen        = 0          # Screen to use
               tag           = 2          # Tag number of apps
               free          = true       # Set automatic free client
               max           = false      # Set automatic maximized client
               follow_client = false      # follow the client
               ignore_tags   = false      # ignore tag (free mode)
               follow_client = false      # if the client open in an other tag/screen, follow it.
       [/rule]
[/rules]
 
[menu]
        # Default menu, binded on the root window, button 3.
        [set_menu]
                name = "rootmenu"
 
                # place_at_mouse = false
                # x = 40 y = 50
 
                # Available "center", "left", "right" menu align. Default: "center".
                align = "left"
 
                fg_focus  = "#191919" bg_focus  = "#7E89A2"
                fg_normal = "#9F9AB3" bg_normal = "#191919"
 
                [item] name = "Terminal"        func = "spawn" cmd = "urxvt || xterm || gnome-terminal" [/item]
                [item] name = "Applications" submenu = "appmenu"                   [/item]
                [item] name = "Next tag"        func = "tag_next"                  [/item]
                [item] name = "Previous tag"    func = "tag_prev"                  [/item]
                [item] name = "Next layout"     func = "layout_next"               [/item]
                [item] name = "Previous layout" func = "layout_prev"               [/item]
                [item] name = "Toggle infobar"  func = "toggle_infobar_position"   [/item]
                [item] name = "Quit WMFS"       func = "quit"                      [/item]
        [/set_menu]
 
        [set_menu]
                name = "appmenu"
                align = "left"
 
                fg_focus  = "#191919" bg_focus  = "#7E89A2"
                fg_normal = "#9F9AB3" bg_normal = "#191919"
 
                [item] name = "Browser"         func = "spawn" cmd = "firefox"     [/item]
                [item] name = "Calculator"      func = "spawn" cmd = "xcalc"       [/item]
        [/set_menu]
 
        [set_menu]
                name = "clientmenu"
 
                fg_focus  = "#D4D4D4" bg_focus  = "#003366"
                fg_normal = "#D4D4D4" bg_normal = "#191919"
 
                # Check items: possible 'check_max' or 'check_free'.
                [item] name = "Close"    func = "client_kill"                      [/item]
                [item] name = "Maximize" func = "toggle_max"  check = "check_max"  [/item]
                [item] name = "Free"     func = "toggle_free" check = "check_free" [/item]
        [/set_menu]
[/menu]
 
[launcher]
        [set_launcher]
                # Limit size of the launcher window (px)
                width_limit = 300
 
                name = "launcher_exec"
                prompt = "Exec: "
                command = "exec"
        [/set_launcher]
 
        #ViWMFS : manage wmfs with vi-based command.
        [set_launcher]
                name = "viwmfs"
                prompt = "> "
                command = "wmfs -V"
        [/set_launcher]
[/launcher]
 
[keys]
         # Reload the configuration of wmfs.
        [key] mod = {"Alt", "Control"} key = "r" func = "reload" [/key]
 
        # Open a terminal.
        [key] mod = {"Control"} key = "Return" func = "spawn" cmd = "xterm" [/key]
 
        # Kill the selected client.
        [key] mod = {"Alt"} key = "q" func = "client_kill" [/key]
 
        # Quit wmfs.
        [key] mod = {"Control", "Alt", "Shift"} key = "q" func = "quit" [/key]
 
        # Swap current client with the next.
        [key] mod = {"Alt"} key = "t" func = "client_swap_next" [/key]
 
        # Swap current client with the previous.
        [key] mod = {"Alt", "Shift"} key = "t" func = "client_swap_prev" [/key]
 
        # Toggle maximum the selected client
        [key] mod = {"Alt"} key = "m" func = "toggle_max" [/key]
 
        # Toggle free the selected client.
        [key] mod = {"Alt"} key = "f" func = "toggle_free" [/key]
 
        # Toggle the position of the infobar.
        [key] mod = {"Alt"} key = "b" func = "toggle_infobar_position" [/key]
        [key] mod = {"Alt", "Shift"} key = "b" func = "toggle_infobar_display" [/key]
 
        # Toggle the resizehint of the current tag/screen
        [key] mod = {"Shift", "Control"} key = "r" func = "toggle_resizehint" [/key]
 
        # Toggle the tag_autohide mode
        [key] mod = {"Shift", "Control"} key = "t" func = "toggle_tagautohide" [/key]
 
        # Select the next client.
        [key] mod = {"Alt"} key = "Tab" func = "client_next" [/key]
 
        # Select the previous client.
        [key] mod = {"Alt","Shift"} key = "Tab" func = "client_prev" [/key]
 
        # Select the next tag.
        [key] mod = {"Control"} key = "Right" func = "tag_next" [/key]
 
        # Select the previous tag.
        [key] mod = {"Control"} key = "Left" func = "tag_prev" [/key]
 
        # Select the next visible tag.
        [key] mod = {"Control","Alt"} key = "Right" func = "tag_next_visible" [/key]
 
        # Select the previous visible tag.
        [key] mod = {"Control","Alt"} key = "Left" func = "tag_prev_visible" [/key]
 
        # Set the next layout.
        [key] mod = {"Alt"} key = "space" func = "layout_next" [/key]
 
        # Set the previous layout.
        [key] mod = {"Alt", "Shift"} key = "space" func = "layout_prev" [/key]
 
        # Increase mwfact.
        [key] mod = {"Alt"} key = "l" func = "set_mwfact" cmd = "+0.025" [/key]
 
        # Decrease mwfact.
        [key] mod = {"Alt"} key = "h" func = "set_mwfact" cmd = "-0.025" [/key]
 
        # Increase nmaster.
        [key] mod = {"Alt"} key = "d" func = "set_nmaster" cmd = "+1" [/key]
 
        # Decease nmaster.
        [key] mod = {"Alt", "Shift"} key = "d" func = "set_nmaster" cmd = "-1" [/key]
 
        #Launcher.
        [key] mod = {"Alt"} key = "p" func = "launcher" cmd = "launcher_exec" [/key]
 
        #ViWMFS
        [key] mod = {"Alt"} key = "Escape" func = "launcher" cmd = "viwmfs" [/key]
 
        # Set the tag x.
        [key] mod = {"Alt"} key = "F1" func = "tag" cmd = "1" [/key]
        [key] mod = {"Alt"} key = "F2" func = "tag" cmd = "2" [/key]
        [key] mod = {"Alt"} key = "F3" func = "tag" cmd = "3" [/key]
        [key] mod = {"Alt"} key = "F4" func = "tag" cmd = "4" [/key]
        [key] mod = {"Alt"} key = "F5" func = "tag" cmd = "5" [/key]
        [key] mod = {"Alt"} key = "F6" func = "tag" cmd = "6" [/key]
        [key] mod = {"Alt"} key = "F7" func = "tag" cmd = "7" [/key]
        [key] mod = {"Alt"} key = "F8" func = "tag" cmd = "8" [/key]
        [key] mod = {"Alt"} key = "F9" func = "tag" cmd = "9" [/key]
 
        # Transfert selected client to x.
        [key] mod = {"Alt", "Shift"} key = "F1" func = "tag_transfert" cmd ="1" [/key]
        [key] mod = {"Alt", "Shift"} key = "F2" func = "tag_transfert" cmd ="2" [/key]
        [key] mod = {"Alt", "Shift"} key = "F3" func = "tag_transfert" cmd ="3" [/key]
        [key] mod = {"Alt", "Shift"} key = "F4" func = "tag_transfert" cmd ="4" [/key]
        [key] mod = {"Alt", "Shift"} key = "F5" func = "tag_transfert" cmd ="5" [/key]
        [key] mod = {"Alt", "Shift"} key = "F6" func = "tag_transfert" cmd ="6" [/key]
        [key] mod = {"Alt", "Shift"} key = "F7" func = "tag_transfert" cmd ="7" [/key]
        [key] mod = {"Alt", "Shift"} key = "F8" func = "tag_transfert" cmd ="8" [/key]
        [key] mod = {"Alt", "Shift"} key = "F9" func = "tag_transfert" cmd ="9" [/key]
 
        # Toggle additional tags (x) on the current tag
        [key] mod = {"Alt", "Super"} key = "F1" func = "tag_toggle_additional" cmd ="1" [/key]
        [key] mod = {"Alt", "Super"} key = "F2" func = "tag_toggle_additional" cmd ="2" [/key]
        [key] mod = {"Alt", "Super"} key = "F3" func = "tag_toggle_additional" cmd ="3" [/key]
        [key] mod = {"Alt", "Super"} key = "F4" func = "tag_toggle_additional" cmd ="4" [/key]
        [key] mod = {"Alt", "Super"} key = "F5" func = "tag_toggle_additional" cmd ="5" [/key]
        [key] mod = {"Alt", "Super"} key = "F6" func = "tag_toggle_additional" cmd ="6" [/key]
        [key] mod = {"Alt", "Super"} key = "F7" func = "tag_toggle_additional" cmd ="7" [/key]
        [key] mod = {"Alt", "Super"} key = "F8" func = "tag_toggle_additional" cmd ="8" [/key]
        [key] mod = {"Alt", "Super"} key = "F9" func = "tag_toggle_additional" cmd ="9" [/key]
 
        # change screen
        [key] mod = {"Super"} key = "Tab" func = "screen_next" [/key]
        [key] mod = {"Super", "Shift"} key = "Tab" func = "screen_prev" [/key]
 
        # swap client in the next/prev screen
        [key] mod = {"Super", "Shift"} key = "a" func = "client_screen_next" [/key]
        [key] mod = {"Super", "Shift"} key = "z" func = "client_screen_prev" [/key]
 
        # unlisted fonctions that can be used in [key] func = ""
        # client_focus_{right, left, top, bottom}
        # client_ignore_tag # Toggle the client in ignore_tag (display the client on all tags)
        # tag_prev_sel # go back to the previous selected tag
        # tag_transfert_{next, prev}
        # tag_urgent # go to the urgent tag
        # tag_swap_{next, prev} # swap tag with the previous/next one
        # tag_last # go to the last tag
        # tag_stay_last # toggle the current tag as the last one
        # toggle_abovefc
        # screen_prev_sel # go to the previous screen selected
        # set_layout # set layout. need to be called with cmd = ""
        # ignore_next_client_rules # ignore the rule the next time a rule is called
[/keys]

Comme vous pouvez le voir, celui-ci est parsemé de petits commentaires qui vous aideront à mieux le comprendre.  On peut facilement diviser ce fichier en plusieurs catégories :

  • misc : Configuration générale de WMFS.
  • bar : Cette section permet de modifier tout ce qui est en rapport avec le tableau de bord : Systray, selbar, etc …
  • layouts : Section concernant les divers layouts disponibles.
  • tags : C’est ici que l’on configure les tags : Nombres, noms, fonctions, tout ou presque peut être modifié.
  • root : Vous allez pouvoir indiquer dans cette section un fichier à lancer automatiquement. Pratique si vous voulez lancer un script similaire à l’autostart.sh d’OpenBox.
  • client : Section qui permet de modifier entre autre l’apparence et le comportement des clients.
  • rules : Cette section sert à établir des règles, exemple Mplayer s’ouvrira toujours sur le tag 2 et sera en mode « free ».
  • menu : On y configure ici tout les menus.
  • launcher : Section qui permet de modifier le ou les launcher(s).
  • keys : Section concernant les raccourcis clavier.

WMFS à donc l’avantage de proposer un fichier de configuration unique, ce qui est une bonne chose quand on démarre avec un tiling manager. Cependant, il est difficile de s’y retrouver quand on a configuré plusieurs menus et tout ses raccourcis clavier : Le fichier devient de plus en plus long et par la même occasion, il devient de plus en plus pénible à éditer !

Afin de supprimer ce désagrément, il est possible de diviser en plusieurs parties le fichier wmfsrc. Comme vu précédemment, celui-ci se compose de nombreuses catégories, il suffit donc d’attribuer un fichier de configuration à chaque catégories.

Tout d’abord, créez le répertoire qui accueillera tout les fichiers de configuration :

$ mkdir -p ~/.config/wmfs/conf.d

On va y mettre par exemple le fichier keys qui contiendra la section [keys] de notre wmfsrc:

$ touch ~/.config/wmfs/conf.d/keys
$ nano ~/.config/wmfs/conf.d/keys
[keys]
 
#Vos raccourcis clavier
 
[key] mod = {"Super","Alt"} key = "space" func = "menu" cmd = "rootmenu" [/key]
 
[/keys]

Pour finir, il suffit d’appeler ce fichier dans votre wmfsrc :

$ nano ~/.config/wmfs/wmfsrc

Ajoutez la ligne suivante au début du fichier :

@include "~/.config/wmfs/conf.d/keys"

On peut donc très bien avoir un fichier wmfsrc qui ressemble à ça :

@include "~/.config/wmfs/conf.d/misc"
@include "~/.config/wmfs/conf.d/bar"
@include "~/.config/wmfs/conf.d/layouts"
@include "~/.config/wmfs/conf.d/rules"
@include "~/.config/wmfs/conf.d/tags"
@include "~/.config/wmfs/conf.d/root"
@include "~/.config/wmfs/conf.d/client"
@include "~/.config/wmfs/conf.d/menu"
@include "~/.config/wmfs/conf.d/launcher"
@include "~/.config/wmfs/conf.d/keys"

La configuration de WMFS est une tâche relativement aisée mais qui prend pas mal de temps… Je vous conseille d’abuser du raccourci clavier [ CtrlAltR ] afin de recharger WMFS, cela vous évitera de trop chercher dans le cas d’une mauvaise manipulation !

Pour finir cet article, voici une petite capture d’écran de mon poste de travail ( qui est loin d’être fini ) :

Amusez vous bien et à bientôt pour un autre « how to » concernant WMFS !

Liens :

Dans la même catégorie :

Vus : 1759
Publié par Weedfast : 184