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.
- [ Ctrl + Alt + R ] : Recharge le fichier de configuration.
- [ Alt + F ] : Active le mode flottant sur la fenêtre qui a le focus.
- [ Alt + L ], [ Alt + H ] : 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 [ Ctrl + Alt + R ] 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 !