Awesome WM

Cela faisait un petit moment que mon système tournait sous Wmii et j'en étais bien satisfait. Cependant, il faut bien du changement de temps en temps et j'ai décidé d'aller voir ailleurs. Après une hésitation entre Wmfs et Awesome, j'ai opté pour ce dernier. Cela fait maintenant plusieurs semaines que je suis dessus et je vais vous en faire un petit topo !

Le concept

Awesome fait partie de la famille des gestionnaires de fenêtres de type « Tiling ». Comme Wmii ou Wmfs, le concept principal est d'occuper tout l'écran, quelque soit le nombre d'applications ouvertes ( clients ). Ce type de fonctionnement implique en général une forte utilisation du clavier ( Tout est gérable sans la souris, même s'il reste tout à fait possible d'utiliser cette dernière ) et une plus grande implication au niveau de la personnalisation de la configuration ( et un temps d'adaptation pour s'approprier l'outil ).

Awesome est codé en LUA, language que je connais peu mais dont Kooda me dit le plus grand bien ! Un language un peu plus complexe à « lire » que d'autres, cela compte pour la configuration du gestionnaire. Pour les plus doués d'entre vous, Awesome propose une API très complète qui doit permettre d'en connaître toutes les facettes. Au niveau de la documentation, on en trouve assez difficilement, même si un wiki est disponible. Une des raisons à cette difficulté est due aux changements assez radicaux qui ont pu être fait entre les versions ( 3.4.9 sur Frugalware actuellement ). Mefiez vous donc lors de vos recherches et vérifiez bien de quelle version d'Awesome parle l'article car cela peut donnes quelques surprises !.

Exemples de manipulation au clavier

  • Mod+f place la fenêtre active en plein écran.
  • Mod+Return lance un terminal
  • Mod+p pour lancer une application
  • Mod+Tab bascule entre les derniers clients (fenêtres) focusés.
  • Mod+j,k pour basculer le focus entre les fenêtres
  • Mod+h,l pour augmenter ou diminuer la largeur de la fenêtre active.
  • Shift+Mod+h,j,k,l pour déplacer la fenêtre active (h: gauche, j: bas, k: haut, l: droite)
  • Mod+1,9 bascule entre les tags.
  • Shift+Mod+1,9 envoie la fenetre active au tag N.

L'installation et les fichiers importants

Pour installer Awesome, cela dépendra de votre distribution bien sur. Sur Frugalware, un petit pacman -S awesome sera suffisant. Il est également possible d'utiliser une version en développement en clonant leur GIT.

Le fichier principal d'Awesome est son rc.lua. Il doit être placé dans ~/.config/awesome/. Lors de la première installation, vous n'en avez pas et vous devez le copier l'original :

  cp /etc/xdg/awesome/rc.lua ~/.config/awesome/rc.lua

Comme dit plus haut, il y a eu beaucoup de changements durant l'évolution d'Awesome, et je conseillerais de commencer de cette façon et non de copier « bêtement » un rc.lua trouvé sur le net : vous risquez de planter le bouzin ! Le fichier est bien commenté et après appropriation, vous serez à même de modifier ce qui vous convient et de piocher des morceaux sur le net, notamment en ce qui concerne les widgets.

Mise en place dans Slim

Pour pouvoir utiliser Awesome, il suffit de rajouter la session awesome à votre bootmanager. voici la section du fichier de configuration de slim.

# /etc/slim.conf
login_cmd           exec /bin/sh - ~/.xinitrc %session
   
# Available sessions (first one is the default).
# The current chosen session name is replaced in the login_cmd
# above, so your login command can handle different sessions.
# see the xinitrc.sample file shipped with slim sources
sessions            wmii,openbox,xfce4,e17,wmaker,awesome

Et le fichier ~/.xinitrc qui permet de basculer entre vos WM. Il peut être nécessaire d'y ajouter l'export de la lanque pour pouvoir écrire les caractères accentués dans le terminal

export LANG=fr_FR.utf8
# the following variable defines the session which is started if the user doesn't explicitly select a session
         
DEFAULT_SESSION=awesome
             
case $1 in
             
xfce4)
    exec startxfce4
    ;;
wmaker)
    exec wmaker
    ;;
e17)
    exec enlightenment_start
    ;;
openbox)
    exec openbox-session
    ;;
awesome)
    exec awesome
    ;;
                                                         
wmii)
    exec wmii
    ;;
*)
    exec $DEFAULT_SESSION
    ;;
esac

Détail du fichier de configuration

Je vais vous détailler par morceaux les points importants du rc.lua. Prenez ce qui vous fait envie !

Librairies

  -- Standard awesome library
  require("awful")
  require("awful.autofocus")
  require("awful.rules")
  
  -- Theme handling library
  require("beautiful")
  
  -- Notification library
  require("naughty")

Ces lignes sont les premières du fichier et sont nécessaires au bon fonctionnement d'Awesome. Elles correspondent aux librairies LUA dont dépend le gestionnaire. Vous pouvez trouver d'autres librairies, qui permettent d'autres fonctionnalités ( comme le tagging dynamique ) sur cette page. La librairie "beautiful" permet de spécifier un thème. Vous pouvez trouver des thèmes tout fait sur cette page du wiki.

Paramètres par défaut

  -- This is used later as the default terminal and editor to run.
  terminal = "urxvt"
  editor = os.getenv("EDITOR") or "vim"
  editor_cmd = terminal .. " -e " .. editor
  
  -- Default modkey.
  -- Usually, Mod4 is the key with a logo between Control and Alt.
  -- If you do not like this or do not have such a key,
  -- I suggest you to remap Mod4 to another key using xmodmap or other tools.
  -- However, you can use another modifier like Mod1, but it may interact with others.
  modkey = "Mod4"

Nous abordons ensuite le paramétrage par défaut, comme le choix du terminal et de l'éditeur de texte, ainsi que la touche « magique » qui va servir pour la majorité des raccourcis claviers qui permettront de manipuler les clients et la navigation dans le WM. Mod4 correspond à la touche "Super". Si vous préférez la touche "Alt", modifiez pour mettre "Mod1".

Tags

  -- {{{ Tags
  -- Define a tag table which hold all screen tags.
  tags = {
      names = { "[1:net]", "[2:mail]", "[3:jabber]", "[4:twitter]", "[5:files]", "[6:office]", "[7:medias]", "[8:root]", "[9:ssh]"},
      layout = { layouts[2], layouts[2], layouts[4], layouts[2], layouts[1], layouts[1], layouts[2], layouts[2], layouts[2] }
      }
  
  for s = 1, screen.count() do
      -- Each screen has its own tag table.
      tags[s] = awful.tag(tags.names, s, tags.layout)
  end
  -- }}}

Dans Awesome, il existe une caractéristique très intéressante. Les habitués des systèmes GNU/linux connaissent bien les bureaux virtuels (workspaces) qui permettent de séparer certaines applications et alléger l'écran. Awesome possède cette fonction mais l'associe avec des tags. D'origine, ces tags sont numérotés de 1 à 9 mais il est possible d'attribuer des noms à ces tags (plus simple de s'y retrouver. Il est également possible de spécifier un layout spécifique à chaque tag. Un layout est un mode d'affichage prédéfini. Awesome en propose plusieurs :

floating tile tile.left tile.bottom
tile.top fair fair.horizontal spiral
spiral.dwindle max max.fullscreen magnifier

Vous pouvez donc associer un de ces layouts à un tag en particulier ( nous le verrons à la section concernée ). Et comme vous pouvez associer des applications à un tag, cela permet de gérer au mieux le positionnement de vos applications.

Menu

  -- {{{ Menu
  -- Create a laucher widget and a main menu
  myawesomemenu = {
     { "manual", terminal .. " -e man awesome" },
     { "edit config", editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua" },
     { "restart", awesome.restart },
     { "quit", awesome.quit }
  }
  
  mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
                                      { "open terminal", terminal }
                                    }
                          })
  
  mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon),
                                       menu = mymainmenu })
  -- }}}

C'est le menu qui s'affiche en cliquant sur le logo d'Awesome en haut à gauche, ou en cliquant sur le bouton droit sur le bureau. Je ne l'ai pas personnalisé, n'en ayant que peu d'usage ( sauf pour recharger Awesome après une modification du rc.lua ).

Wibox

  -- {{{ Wibox
  -- Create a textclock widget
  mytextclock = awful.widget.textclock({ align = "right" })
  
  -- Create a systray
  mysystray = widget({ type = "systray" })

C'est ce qui permet de placer des widgets à votre barre awesome, comme l'heure, un systray et plein d'autres choses. Je ne vous colle pas tout car les codes sont en général assez volumineux. Vous pouvez trouver des exemples de widgets ici.

À noter qu'il y a deux parties importantes pour l'affichage des widgets. La première est celle où l'on inscrit le code du widget, la seconde, plus bas dans le code, où l'on appelle le widget dans la wibox et détermine l'ordre d'apparition. N'invoquez pas un widget que vous n'avez pas défini dans la première section ( commentez les indésirables ) :

   -- Create the wibox
      mywibox[s] = awful.wibox({ position = "top", screen = s })
      -- Add widgets to the wibox - order matters
      mywibox[s].widgets = {
          {
              mylauncher,
              mytaglist[s],
              mypromptbox[s],
              layout = awful.widget.layout.horizontal.leftright
          },
          mylayoutbox[s],
          s == 1 and mysystray or nil,
          --tb_volume,
          mytextclock,
          --batinfo,    
          meminfo,
          --cputemp,
          cpuinfo,
          mytasklist[s],
          layout = awful.widget.layout.horizontal.rightleft
      }

Raccourcis claviers

  -- {{{ Key bindings
  globalkeys = awful.util.table.join(
      awful.key({ modkey,           }, "Left",   awful.tag.viewprev       ),
      awful.key({ modkey,           }, "Right",  awful.tag.viewnext       ),
      awful.key({ modkey,           }, "Escape", awful.tag.history.restore),
  
      awful.key({ modkey,           }, "t",
          function ()
              awful.client.focus.byidx( 1)
              if client.focus then client.focus:raise() end
          end),
      awful.key({ modkey,           }, "s",
          function ()
              awful.client.focus.byidx(-1)
              if client.focus then client.focus:raise() end
          end),
      awful.key({ modkey,           }, "w", function () mymainmenu:show({keygrabber=true}) end),
      awful.key({ "Control"}, "e", function () awful.util.spawn("firefox") end),
      awful.key({ "Control"}, "q", function () awful.util.spawn("claws-mail") end),
      awful.key({ "Control"}, "t", function () awful.util.spawn("gajim") end),
      awful.key({ "Control"}, "è", function () awful.util.spawn("hotot & hotot & hotot") end),
      awful.key({ "Control"}, "k", function () awful.util.spawn("rednotebook") end),
      awful.key({ "Control"}, "l", function () awful.util.spawn("libreoffice") end),
  
      -- Layout manipulation
      awful.key({ modkey, "Shift"   }, "t", function () awful.client.swap.byidx(  1)    end),
      awful.key({ modkey, "Shift"   }, "s", function () awful.client.swap.byidx( -1)    end),
      awful.key({ modkey, "Control" }, "t", function () awful.screen.focus_relative( 1) end),
      awful.key({ modkey, "Control" }, "s", function () awful.screen.focus_relative(-1) end),
      awful.key({ modkey,           }, "v", awful.client.urgent.jumpto),
      awful.key({ modkey,           }, "Tab",
          function ()
              awful.client.focus.history.previous()
              if client.focus then
                  client.focus:raise()
              end
          end),

On arrive ensuite à une partie non négligeable qui est la gestion des raccourcis claviers. Même si vous ne souhaitez pas les changer ( ceux de base sont déjà pleinement fonctionnels ), cela vous permet de les tester. Je vous conseille de pratiquer en lisant cette partie. En effet, à la lecture seule du script, il n'est parfois pas facile de savoir à quoi cela correspond. Attention ! dans mon cas précis, j'ai largement modifié ces raccourcis car je suis en clavier Bépo. Vous pouvez vois également que c'est dans cette partie que vous pouvez générer des raccourcis pour lancer des applications. J'ai choisi personnellement "Control" et une touche pour lancer Firefox, Claws-Mail et d'autres applications. Dans le cas de hotot, je lance 3 instances pour mes 2 comptes twitter et mon compte identi.ca.

   -- Standard program
      awful.key({ modkey,           }, "Return", function () awful.util.spawn(terminal) end),
      awful.key({ modkey, "Control" }, "o", awesome.restart),
      awful.key({ modkey, "Shift"   }, "b", awesome.quit),
  
      awful.key({ modkey,           }, "r",     function () awful.tag.incmwfact( 0.05)    end),
      awful.key({ modkey,           }, "c",     function () awful.tag.incmwfact(-0.05)    end),
      awful.key({ modkey, "Shift"   }, "c",     function () awful.tag.incnmaster( 1)      end),
      awful.key({ modkey, "Shift"   }, "r",     function () awful.tag.incnmaster(-1)      end),
      awful.key({ modkey, "Control" }, "c",     function () awful.tag.incncol( 1)         end),
      awful.key({ modkey, "Control" }, "r",     function () awful.tag.incncol(-1)         end),
      awful.key({ modkey,           }, "space", function () awful.layout.inc(layouts,  1) end),
      awful.key({ modkey, "Shift"   }, "space", function () awful.layout.inc(layouts, -1) end),

Ces raccourcis permettent de modifier la largeur des clients et l'importance de la fenêtre "Master". En diminuant "incnmaster", cela permet par exemple d'avoir 3 colonnes, selon le layout choisi. Particulièrement efficace pour afficher les 3 instances d'hotot justement !

  -- Prompt
      awful.key({ modkey },            "j",     function () mypromptbox[mouse.screen]:run() end),

C'est le lanceur d'application. Essentiel dans le fonctionnement d'un WM Tiling. Cela ouvre un champ dans la barre de menu, où vous pouvez appeler vos applications. La tabulation fonctionne bien.

  clientkeys = awful.util.table.join(
      awful.key({ modkey,           }, "e",      function (c) c.fullscreen = not c.fullscreen  end),
      awful.key({ modkey,           }, "b",      function (c) c:kill()                         end),
      awful.key({ modkey, "Control" }, "space",  awful.client.floating.toggle                     ),
      awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end),
      awful.key({ modkey,           }, "o",      awful.client.movetoscreen                        ),
      awful.key({ modkey, "Shift"   }, "r",      function (c) c:redraw()                       end),
      awful.key({ modkey,           }, "t",      function (c) c.ontop = not c.ontop            end),
      awful.key({ modkey,           }, "n",      function (c) c.minimized = not c.minimized    end),
      awful.key({ modkey,           }, "m",
          function (c)
              c.maximized_horizontal = not c.maximized_horizontal
              c.maximized_vertical   = not c.maximized_vertical
          end)

Cette partie permet de passer un client en plein écran, de quitter une application, de la minimiser ou de la basculer au premier plan. La dernière partie, non collée ici, permet de naviguer entre les tags et d'envoyer un client sur un tag. Je n'ai pas fait de modification car le comportement de base est bon : Modkey n ou n= 1 à 9 (en accès direct, pas besoin de shifter pour les azertyens ou les bépoistes ). Shift Modkey n permet d'envoyer le client actif vers le tag en question. C'est la raison pour laquelle j'ai ajouté un chiffre devant mes noms de tags : d'un coup d'œil, je sais quel chiffre utiliser.

Règles

  -- {{{ Rules
  awful.rules.rules = {
      -- All clients will match this rule.
      { rule = { },
        properties = { border_width = beautiful.border_width,
                       border_color = beautiful.border_normal,
                       focus = true,
                       keys = clientkeys,
                       buttons = clientbuttons } },
      { rule = { class = "MPlayer" },
        properties = { floating = true } },
      { rule = { class = "pinentry" },
        properties = { floating = true } },
      { rule = { class = "gimp" },
        properties = { floating = true } },
      -- Set Firefox to always map on tags number 1 of screen 1.
      { rule = { class = "Firefox" },
        properties = { tag = tags[1][1] } },
      -- Set Thunderbird to always map on tags number 2 of screen 1.
      { rule = { class = "Claws-mail" },
        properties = { tag = tags[1][2] } },
      -- Set gajim to always map on tags number 3 of screen 1.
      { rule = { class = "Gajim" },
        properties = { tag = tags[1][3] } },
      -- Set pino to always map on tags number 3 of screen 1.
      { rule = { class = "Pino" },
        properties = { tag = tags[1][4] } },
      -- Set hotot to always map on tags number 4 of screen 1.
      { rule = { class = "Hotot" },
        properties = { tag = tags[1][4] } },
      -- Set libreoffice-impress to always map on tags number 5 of screen 1.
      { rule = { class = "libreoffice-impress" },
        properties = { tag = tags[1][6] } },
      -- Set Gthumb to always map on tags number 6 of screen 1.
      { rule = { class = "Gthumb" },
        properties = { tag = tags[1][7] } },
      -- Set Gimp to always map on tags number 6 of screen 1.
      { rule = { class = "gimp" },
        properties = { tag = tags[1][7] } },
      -- Set rednotebook to always map on tags number 5 of screen 1.
      { rule = { class = "Rednotebook" },
        properties = { tag = tags[1][6] } },
      {rule = {class = "urxvt"},
       properties = {opacity = 0.4} },
  }
  -- }}}

il est donc possible d'assigner des règles (rules) à une application. Principalement pour la lier à un tag mais aussi pour définir une transparence. Pour définir la "class" de l'application, utilisez xprop.

Programmes au démarrage

  -- Démarrage
  awful.util.spawn("setxkbmap fr bepo &")
  os.execute("parcellite &")
  -- }}}

À la fin du fichier, j'ai rajouté ces lignes. Vous pouvez ici indiquer à Awesome les programmes à lancer au démarrage, ou les commandes ( ici, je lance le bépo et un gestionnaire de presse-papier ).

Effets visuels

Pour que ça pète un peu plus, j'ai décidé récemment de rajouter la transparence et quelques effets visuels ( transitions des tags, menus, ombrages ). La méthode est décrite sur cette page. J'ai opté pour Cairo Composite Manager, que j'ai installé sur Frugalware avec un pacman -S cairo-compmgr et l'ajout de ce code dans la section "Librairies" du fichier ( en début ) :

  -- launch the Cairo Composite Manager
   awful.util.spawn_with_shell("cairo-compmgr &")

Par contre, cette méthode retire le fond d'écran de votre thème. Pour remédier à cela, installez feh et Awesome s'occupe de tout ensuite :

  sudo pacman -S feh
  awsetbg /emplacement/de/votre/image.jpg

et hop, tout est ok !

Liens

Vus : 2817
Publié par botchchikii : 30