Pekwm

De ArchwikiFR


PekWM est un gestionnaire de fenêtres très léger ressemblant à OpenBox ou à FluxBox, mais il est totalement dépourvu de barre des tâches contrairement à ces derniers. Il est écrit en C++ et est distribué sous licence GPL.

Sommaire

Installation

Pekwm a très peu de dépendances, vous pouvez l'installer très facilement de la manière suivante :

pacman -S pekwm

Lancement avec KDM

Pour le moment, PekWM n'apparait pas dans la liste des sessions de KDM. Qu'à cela ne tienne, on va y remédier en recopiant /usr/share/xsessions/pekwm.desktop dans /usr/share/apps/kdm/sessions/:

cp /usr/share/xsessions/pekwm.desktop /usr/share/apps/kdm/sessions/

Configuration

La configuration se fait dans le dossier personnel ~/.pekwm/. Je vous conseille de prendre la configuration par défaut qui se trouve dans /etc/pekwm/. La configuration de PekWM se fait à l'aide de plusieurs fichiers de configuration :

  • "config" : fichier de configuration principal (thème, nom des bureaux, comportement des fenêtres, etc...)
  • "mouse" : fichier de configuration des raccourcis que l'on souhaite utiliser avec la souris
  • "keys" : fichier de configuration des raccourcis clavier
  • "menu" : fichier de configuration des menus du bureau ou de la fenêtre
  • "vars" : fichier de configuration permettant d'utiliser des variables, ce n'est pas un fichier de configuration proprement dit, d'ailleurs vous ne le trouverez pas dans la documentation de PekWM, il sert cependant à pouvoir réutiliser plusieurs applications aisément sans avoir à changer tous les fichiers à chaque modification.
  • "autoproperties" : fichier sans doute le plus complexe mais très puissant
  • "start" : fichier permettant de lancer automatiquement des applications au démarrage

Le fichier config

Ce fichier permet de configurer le comportement des fenêtres, le nommage des bureaux par exemple et diverses options. La configuration se fait en plusieurs sous-sections:

Files

Les fichiers à utiliser (je vous conseille de tout simplement laisser par défaut).

Files {
    Keys = "~/.pekwm/keys"
    Mouse = "~/.pekwm/mouse"
    Menu = "~/.pekwm/menu"
    Start = "~/.pekwm/start"
    AutoProps = "~/.pekwm/autoproperties"
    Theme = "~/.pekwm/themes/Lightgrey"
}

Keys, Mouse, Menu, Start, AutoProps: on indique les fichiers à utiliser, laissez ceci par défaut.
Theme: on indique le thème à utiliser en pointant le répertoire de celui ci (il existe un script par défaut qui permet de changer automatiquement cette valeur par le menu).

MoveResize

Comportement des fenêtres lors d'un déplacement/redimensionnement.

MoveResize {
    EdgeAttract = "10"
    EdgeResist = "10"
    WindowAttract = "5"
    WindowResist = "5"
    OpaqueMove = "true"
    OpaqueResize = "false"
}

EdgeAttract: cette valeur est la distance (en pixel) à partir de laquelle la fenêtre "colle" aux bords.
WindowAttract: même chose par rapport aux fenêtres.
OpaqueMove: doit-on dessiner la fenêtre pendant le déplacement.
OpaqueResize: doit-on dessiner la fenêtre pendant le redimensionnement.

Screen

Configuration du placement des fenêtres et des espaces de travail.

Screen {
    Workspaces = "6"
    WorkspacesPerRow = "2"
    WorkspaceNames = "Main;Chat;Music;Web;Games;Code"
    ShowFrameList = "true"
    ShowStatusWindowCenteredOnRoot = "true"
    ShowWorkspaceIndicator = "500"
    ShowClientID = "false"
    FocusNew = "true"
    FocusNewChild = "true"
    PlaceNew = "true"
    FullscreenAbove = "true"
    FullscreenDetect = "true"
    EdgeSize = "18 0 0 0"
    EdgeIndent = "true"
    DoubleClicktime = "200"
    Placement {
    Model = "CenteredOnParent Smart MouseNotUnder"
    Smart {
        Row = "false"
        TopToBottom = "true"
        LeftToRight = "true"
        OffsetX = "100"
        OffsetY = "100"
        }
    }

}

Workspace: le nombre de bureaux.
WorkspacesPerRow: le nombre de bureaux par colonne (0 pour mettre en ligne).
ShowFrameList: doit-on afficher la liste des fenêtres lorsque l'on navigue parmi elles.
WorkspaceNames: noms des bureaux séparés par ;.
ShowStatusWindowsCenteredOnRoot: si oui les informations de la fenêtre seront au centre du bureau sinon au centre de la fenêtre.
FocusNew: doit-on mettre automatiquement en avant une nouvelle fenêtre.
EdgeSize: l'espacement par rapport aux bords (dans l'ordre haut bas gauche droite).
EdgeIndent: si oui les fenêtres n'iront pas d'elles même dans l'espacement inscrit dans EdgeSize.
DoubleClickTime: la vitesse de double clic en ms.
Placement {: configuration du placement des fenêtres, regardez la documentation de pekwm pour plus de détails.

Menu

Section permettant de définir l'utilisation du menu (pas son contenu).

Menu {
    DisplayIcons = "true"
    Icons = "Menu" {
      Minimum = "16x16"
      Maximum = "16x16"
    }
    Select = "Motion"
    Enter = "Motion"
    Exec = "ButtonPress"
}

DisplayIcons: doit-on afficher des icônes.
Icons = "Menu": paramètres à utiliser pour la section "Menu" du fichier ~/.pekwm/menu (voir la configuration du menu).
Select: comment choisir un élément du menu.
Enter: comment entrer dans un sous-menu.
Exec: comment exécuter un élément.

CmdDialog

Section permettant de configurer le lanceur d'applications.

CmdDialog {
    HistoryUnique = "true"
    HistorySize = "500"
    HistoryFile = "~/.pekwm/history"
    HistorySaveInterval = "16"
}

HistoryUnique: doit-on afficher qu'une fois une application déjà lancée plusieurs fois.
HistorySize: taille du fichier historique.
HistoryFile: le fichier historique à utiliser.

Harbour

Section pour configurer le dock de pekwm (positionnement,orientation, taille).

Harbour {
        OnTop = "True"
        MaximizeOver = "False"
        Placement = "Right"
        Orientation = "TopToBottom"
        Head = "0"
        DockApp {
               SideMin = "64"
               SideMax = "0"
        }
}

Les fichiers mouse et keys

Ces fichiers servent à configurer les raccourcis et les actions avec la souris et le clavier

Important: Pour les deux fichiers la syntaxe est la même:
X = "Y" { Actions = "command" }

Les différentes opérandes (X)

  • pour mouse
    • ButtonPress: lors d'un clic.
    • Motion: le déplacement.
    • ButtonRelease: assez similaire à ButtonPress sauf que c'est au relâchement.
    • DoubleClick: lors d'un double clic
  • pour keys
    • KeyPress: lors d'une pression d'une touche.
    • Chain: raccourcis supplémentaires utilisés de cette façon par exemple: ctrl + a puis b.

Les différents identificateurs (Y)

  • pour mouse
    • 1: clic gauche.
    • 2: clic du milieu.
    • 3: clic droit.
    • 4/5: molette haut/molette bas.
  • pour keys
    • Ctrl: touche contrôle.
    • Mod1: touche alt.
    • Mod4: touche super ou windows.
Astuce: Si vous voulez utiliser une touche multimédia vous devez utiliser xev et inscrire le nom du keycode avec un #. Exemple:
KeyPress = "#162").

Les sections disponibles

Elles permettent de déterminer sur quel élément va s'appliquer tel ou tel raccourci. La forme d'une section est la suivante:

Section {
     X = "Y1" { Actions = "command1" }
     X = "Y2" { Actions = "command2" }
     X = "Y3" { Actions = "command3" }
     ...
}
  • pour mouse
    • Client: sur une fenêtre quelconque.
    • Root: sur le bureau.
    • FrameTitle: sur la barre de fenêtre.
    • ScreenEdges { X {} }: sur les bords de l'écran avec X = Top, Bottom, Right ou Left.
  • pour keys
    • Global: n'importe quand.
    • MoveResize: quand MoveResize est activé (Actions = "MoveResize)

Exemples

Un petit exemple pour que vous ne soyez pas complètement perdu:

  • pour mouse
Client {
    ButtonPress = "Ctrl Mod1 1" { Actions = "Close" }
    Motion = "Mod1 3" { Actions = "Resize" }
}

ScreenEdge {
	Down {
		ButtonRelease = "3" { Actions = "ShowMenu Root" }
        }
}

Border {
  TopLeft     { ButtonPress = "1" { Actions = "Resize TopLeft" } } 
  Top         { ButtonPress = "1" { Actions = "Move" } } 
  TopRight    { ButtonPress = "1" { Actions = "Resize TopRight" } } 
  Left        { ButtonPress = "1" { Actions = "Resize Left" } } 
  Right       { ButtonPress = "1" { Actions = "Resize Right" } } 
  BottomLeft  { ButtonPress = "1" { Actions = "Resize BottomLeft" } } 
  Bottom      { ButtonPress = "1" { Actions = "Resize Bottom" } } 
  BottomRight { ButtonPress = "1" { Actions = "Resize BottomRight" } } 
}

ButtonPress = "Ctrl Mod1 1" { Actions = "Close" }: Fermer la fenêtre par clic gauche sur une fenêtre tout en pressant Ctrl + Alt.
Motion = "Mod1 3" { Actions = "Resize" }: Redimensionner la fenêtre avec Alt + clic droit.
Les entrées dans Border {} vous permettent de redimensionner une fenêtre par le clic gauche sur une bordure de fenêtre.

  • pour keys
INCLUDE = "vars"
Global {
  KeyPress = "Mod4 e" { Actions = "Exec $TERMINAL &" }
  KeyPress = "#123" { Actions = "Exec $MIXINC &" }
  KeyPress = "Mod1 Tab" { Actions = "NextFrame EndRaise" }
  Chain = "Mod4 Mod1 M" {
    KeyPress = "P" { Actions = "Exec $PLAY &" }
  }
}

INCLUDE = "vars": on inclue le fichier vars où on définira certaines applications.
KeyPress = "#123" { Actions = "Exec $MIXINC &" }: sur la pression de la touche 123 identifiée par xev on lance $MIXINC défini dans ~/.pekwm/vars.
Chain = "Mod4 Mod1 M" {: le raccourci Super + Alt + M, à lui seul il donne rien, il faut ensuite rajouter une autre touche.
KeyPress = "P" { Actions = "Exec $PLAY &" }: appuyer P après Super + Alt + M lancera $PLAY défini dans ~/.pekwm/vars.

Le fichier menu

Ce fichier est certainement le plus simple à comprendre. Il permettra d'éditer le menu du bureau ou des fenêtres.

Note: Tout comme keys et mouse le fichier menu doit être complété avec des Actions de pekwm ou des applications externes.
Note: N'oubliez pas le & pour vos applications externes quelque soit le fichier de configuration.

Il est alors divisé en plusieurs sections:

RootMenu

Le menu du bureau. La syntaxe est facile, la voici:

INCLUDE = "vars"
RootMenu = "Menu" {
    Entry = "Terminal" { Actions = "Exec $TERMINAL &" }
    Separator {}

    Submenu = "Accessoires" {
        Entry = "Calculatrice" { Actions = "Exec $CALC &" }
    }
}

Ici "Menu" fait allusion aux paramètres que j'ai cité plus haut dans le fichier ~/.pekwm/config.

INCLUDE = "vars": tout comme keys je conseille d'utiliser ce fichier pour définir certaines applications susceptible d'être modifiés.
RootMenu = "Menu" {: le début du menu principal.
Entry = "Terminal" { Actions = "Exec $TERMINAL &" }: entrée nommée Terminal qui lancera $TERMINAL défini dans .pekwm/vars.
Separator {}: un simple séparateur.
Submenu = "Accessoires" {: création du sous menu accessoires.
Entry = "Calculatrice" { Actions = "Exec $CALC &" }: entrée nommée Calculatrice qui lancera $CALC défini dans ~/.pekwm/vars

WindowMenu

Menu par rapport à une fenêtre.

WindowMenu = "Window Menu" {
    Entry = "(Un)Stick" { Actions = "Toggle Sticky" }
    Entry = "(Un)Shade" { Actions = "Toggle Shaded" }
}

WindowMenu = "Window Menu" {: le menu de fenêtre.
Entry = "(Un)Stick" { Actions = "Toggle Sticky" }: entrée qui permute l'option visible sur tous les bureaux.
Entry = "(Un)Shade" { Actions = "Toggle Shaded" }: entrée qui permute l'option enroulé.

Le fichier vars

Ce fichier tout simple vous permet de définir des applications à utiliser dans vos fichiers de configuration. Il vous sera utile car si vous définissez un terminal dans votre fichier vars et que vous en faites un raccourci clavier et une entrée du menu vous n'aurez plus qu'à modifier cette valeur dans le fichiers vars uniquement laissant aussi les autres intactes. Ou par exemple ceci.

$SMALLCMD = "urxvtc -geometry 60x15 -e"

Imaginez que vous vouliez modifier la taille du terminal qui est inscrit une dizaines de fois dans votre menu (vous pourriez toujours utiliser sed mais bon) là il n'y

a qu'une seule valeur à changer ce qui est bien plus pratique.

Voici la manière la plus simple de s'en servir:

$TERMINAL = "urxvtc"
$PLAY = "mpc toggle"

Ainsi vous n'auriez plus qu'à utiliser $TERMINAL et $PLAY dans vos fichiers de configuration de pekwm où vous auriez bien évidemment inclu le fichier vars.

Le fichier autoproperties

Nous voilà au fichier le plus complexe de pekwm mais aussi le plus puissant, avec celui ci vous pourrez faire en sorte qu'une application se lance sur tel ou tel bureau, de manière maximisée ou bien groupée avec d'autres.

Tout d'abord vous devez connaître la valeur WM_CLASS de l'application que vous voulez définir. pour cela en terminal faites

xprop WM_CLASS

puis cliquez sur l'application désirée, par exemple firefox -> WM_CLASS(STRING) = "Navigator", "Firefox"

Maintenant admettons que je veuille que firefox démarre sur le bureau 4 automatiquement au lancement je fais ceci:

Property = "Navigator,Firefox" {
  ApplyOn = "New Start"
  Workspace = "4"
}

Property = "Navigator", "Firefox" {: la propriété visant firefox.
ApplyOn = "New Start": New = quand une nouvelle fenêtre démarre, Start = quand firefox se lance.
Workspace = "4": on dit de lancer firefox sur le bureau 4.

Maintenant si je veux ajouter d'autres applications à démarrer sur le bureau 4 au lieu de tout réecrire je peux faire de cette manière:

Property = "(appli1|appli2), (appli1|appli2)"

Exemple: je veux lancer un terminal automatiquement sur le bureau 4 tout comme firefox je prends WM_CLASS(STRING) = "urxvt", "URxvt" pour le terminal rxvt.

Property = "(Navigator|urxvt), (Firefox|URxvt)" {
  ApplyOn = "New Start"
  Workspace = "4"
}
Note: Pour renseigner Property vous devez utiliser du regex.

Autre exemple je veux grouper automatiquement les fenêtre de conversations de pidgin et gajim ensemble, je prend alors la valeur de la fenêtre de conversation de chacune comme ceci xprop

WM_WINDOW_ROLE
puis clic sur chacune des fenêtre de conversation.

voici le code WM_CLASS et WM_WINDOW_ROLE de gajim:

"gajim.py","Gajim.py" ET "messages"

Et celui de pidgin:

"pidgin","Pidgin" ET "conversation"

Je groupe alors comme ceci:

# Gajim.
Property = "^gajim.py,^Gajim.py" {
  Role = "^messages"
  Workspace = "2"
  ApplyOn = "New Start Reload"
  Group = "im" { Size = "0"; Global = "true" }
} 
  
# Pidgin.
Property = "^pidgin,^Pidgin" {
  Role = "^conversation"
  Workspace = "2"
  ApplyOn = "New Start Reload"
  Group = "im" { Size = "0"; Global = "true" }
}

Si vous avez bien compris la syntaxe on dit d'appliquer ces règles aux fenêtres de Pidgin et Gajim ayant comme role "messages" et "conversation",
Group = "im" { Size = "0"; Global = "true" }: on indique de les grouper automatiquement ensemble, le Size 0 veut dire taille infinie mais on pourrait mettre 2 et global permet sur n'importe quel bureau.
Workspace = "2": j'en profite pour envoyer le tout sur le bureau 2.

Important: Si vous désirez aussi envoyer les fenêtres principales de pidgin et gajim vous devez le faire après celles identifiées par leur rôles, pekwm prend ce qu'il trouve en premier ainsi si vous mettez aucun rôle il ignorera la suite. Le code qui suit est alors correct.
# Gajim.
Property = "gajim.py,Gajim.py" {
  Role = "messages"
  Workspace = "2"
  ApplyOn = "New Start Reload"
  Group = "im" { Size = "0"; Global = "true" }
} 
  
# Pidgin.
Property = "pidgin,Pidgin" {
  Role = "conversation"
  Workspace = "2"
  ApplyOn = "New Start Reload"
  Group = "im" { Size = "0"; Global = "true" }
}

# On lange pidgin et gajim sur le bureau 2
Property = "(gajim.py|pidgin),(Gajim.py|Pidgin)" {
  ApplyOn = "New Start Reload"
  Workspace = "2"
}

Autre exemple intéressant si vous voulez grouper la fenêtre de gimp avec celle des calques automatiquement:

Property = "^gimp,^Gimp" {
  Role = "^(gimp-toolbox|^gimp-dock)"
  ApplyOn = "New Start Reload"
  Workspace = "6"
  Group = "gimp" { Size = "2"; Global = "true" }
}

Le fichier start

Le fichier le plus simple de tout pekwm, il se chargera de lancer automatiquement les applications au démarrage de pekwm

Note: Attention ce fichier doit être exécutable (chmod +x ~/.pekwm/start) et doit commencer par #!/bin/sh

Voici comment le remplir:

#!/bin/sh
pidgin &
firefox &

Liens

Site officiel (en)

Outils personnels
Autres langues