Dwm
dwm (abgekürzt von dynamic window manager) ist ein dynamischer Fenstermanager für X11 von suckless.org. dwm ist eine einzelne Binärdatei, und sein Quellcode soll niemals 2000 SLOC überschreiten.
dwm wird konfiguriert, indem der C-Quellcode bearbeitet und neu kompiliert wird. Auf der suckless-Website heißt es, dass sich das Projekt auf fortgeschrittene erfahrene Computerbenutzer konzentriert und - vielleicht mit einem Augenzwinkern - dass die Anpassung durch die Bearbeitung des Quellcodes "die Benutzerbasis klein und elitär hält".
Fenster-Modell
dwm ist ein dynamischer Fenstermanager, der Fenster in Kachel-, Monocle- und Floating-Layouts verwaltet. Alle Layouts können dynamisch angewendet werden um die Umgebung für die verwendete Anwendung und die ausgeführte Aufgabe zu optimieren.
Starten Sie ein paar Terminals mit Shift+Alt+Enter und dwm kachelt die Fenster zwischen dem Master und dem Stack. Ein neues Terminal erscheint im Hauptfenster. Vorhandene Fenster werden auf einen Stapel rechts vom Bildschirm verschoben. Mit der Tastenkombination Alt+Enter schalten Sie die Fenster zwischen Master und Stack um.
+------+----------------------------------+--------+ | tags | title | status + +------+---------------------+------------+--------+ | | | | | | | | | | | | | master | stack | | | | | | | | | | | | | +----------------------------+---------------------+
Installation
USE-Flags
USE flags for x11-wm/dwm a dynamic window manager for X11
savedconfig
|
Use this to restore your config from /etc/portage/savedconfig ${CATEGORY}/${PN}. Make sure your USE flags allow for appropriate dependencies |
xinerama
|
Add support for querying multi-monitor screen geometry through the Xinerama API |
Benutzer sollten in Erwägung ziehen, das savedconfig
USE-Flag zu aktivieren, um angepasste Konfigurationsdateien unter /etc/portage/savedconfig/x11-wm/dwm-6.0.h zu speichern und später zu bearbeiten.
root #
euse --enable savedconfig
Benutzer mit mehreren Monitoren sollten das xinerama
USE-Flag aktivieren, unabhängig davon, ob Xinerama verwendet werden soll oder nicht.
root #
euse --enable xinerama
Emerge
Installieren Sie x11-wm/dwm:
root #
emerge --ask x11-wm/dwm
Konfiguration
Starten
Um dwm zu starten, verwenden Sie einen Displaymanager oder den Befehl startx.
Wer sich für die startx-Route entscheidet, muss die folgende Datei erstellen:
exec dbus-launch --sh-syntax --exit-with-session dwm
Hauptkonfigurationsdatei für dwm (Datei dwm.h)
Wie bereits erwähnt, ist die Hauptkonfigurationsdatei von dwm die Datei /etc/portage/savedconfig/x11-wm/dwm-6.0 und nach jeder Änderung muss dwm neu kompiliert werden, damit die Änderungen wirksam werden.
Damit der Editor die Syntaxhervorhebung für C-Code korrekt anzeigt, erstellen Sie einen Symlink mit einer C-Header-Dateinamenerweiterung.
root #
ln -s /etc/portage/savedconfig/x11-wm/dwm-6.0 /etc/portage/savedconfig/x11-wm/dwm-6.0.h
oder konsultieren Sie die Dokumentation des Editors Ihrer Wahl, wie Sie die Syntaxhervorhebung für eine Datei unabhängig von ihrer Erweiterung ändern können.
Um eine neue Konfiguration nach der Neukompilierung zu verwenden, beenden Sie dwm Mod+Shift+Q, wenn Sie sich bereits in einer dwm-Sitzung befinden, und laden Sie es dann neu, um die aktuell ausgeführte Binärdatei in Speicher zu ersetzen.
Einstellungsdatei (dwmrc)
Die Standard-xsessions-Datei, die vom Gentoo-Ebuild /etc/X11/Sessions/dwm zur Verfügung gestellt wird, bietet ein Standard-Statusfeld, das die Systemauslastung und das Datum/die Uhrzeit anzeigt oder welchen Shell-Code der Benutzer in ~/.dwm/dwmrc hat. Der derzeitige Mechanismus (ab dwm-6.0), um Text an eine Statusbox in der Leiste des Fenstermanagers zu senden, ist die Verwendung von 'xsetroot', wie in der oben erwähnten Standard-xsession dargestellt. Mit ein paar Zeilen Shell-Code kann man diesen Mechanismus nutzen, um einen beliebigen Text an die Statusleiste zu senden (z.B. die CPU-Temperatur, den aktuellen Titel des Musik-Players, die Anzahl an ungelesenen E-Mails usw.).
Zusätzliche Funktionen
dmenu ist ein dynamisches Menü für X, das ursprünglich für dwm entwickelt wurde.
Installation
Emerge
Installieren Sie dmenu:
root #
emerge --ask x11-misc/dmenu
Konfiguration
Die Optionen von dmenu können in der Datei dwm.h angepasst werden, z.B. die Anzeige des Menüs am unteren Rand des Bildschirms.
static const char *dmenucmd[] = { "dmenu_run", "-b", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
Benutzung
Standardmäßig aktiviert die Tastenfolge Alt + P das Menü.
Zusätzliche Statusinformationen
Um zusätzliche Statusinformationen in der Menüleiste von dwm anzuzeigen, sollte man x11-apps/xsetroot verwenden, das Textinformationen in die obere rechte Ecke setzt.
Installieren Sie zunächst x11-apps/xsetroot, falls es noch nicht installiert ist.
Verwenden Sie dann ein Skript oder ein Nebenprogramm, um die aktuellen Informationen im dwm-Status in einer Schleife anzuzeigen.
root #
emerge --ask x11-apps/xsetroot
Conky
Versuchen Sie zum Beispiel Conky, um aktuelle Informationen über das System anzuzeigen. Bevorzugen Sie die Installation mit dem -X
USE-Flag, da nur Textinformationen an die dwm-Instanz weitergeleitet werden. (In Frage kommende USE-Flags sind "-X hddtemp iostats wifi").
root #
emerge --ask app-admin/conky
An example ~/.config/conky/conky.conf file. The configuration file is divided into two sections: conky.config
and conky.text
. The conky.config
section contains options related to Conky, while the conky.text
section defines what and how information is displayed. To use Conky on your system, you may need to adjust some settings in the conky.text
section, such as the path to network interfaces or hard drives, as those can vary depending on your system.
conky.config = {
background = no,
format_human_readable = yes,
out_to_console = yes,
temperature_unit = celsius,
total_run_times = 0,
update_interval = 1,
#use_spacer = left,
use_spacer = none,
};
conky.text = [[
M ${memperc}%/${swapperc}% | \
/sda ${diskio sda} /sdb ${diskio sdb} \
/sdc ${diskio sdc} | \
${if_existing /proc/net/route ppp0}P0 U ${upspeed ppp0} D ${downspeed ppp0} |${endif}\
${if_existing /proc/net/route eth0}E0 U ${upspeed eth0} D ${downspeed eth0} |${endif}\
${if_existing /proc/net/route wlan0}W0 U ${upspeed eth0} D ${downspeed eth0}\
${wireless_ap wlan0} ${wireless_link_qual_perc wlan0} ${endif}\
CPU ${hwmon 1 temp 1}F \
/sda ${hddtemp /dev/sda}F \
/sdb ${hddtemp /dev/sdb}F \
${time %a, %b %d %Y %H:%M (%z)}
]]
Wenn Sie Conky schon einmal verwendet haben, achten Sie auf die neue Syntax mit geschweiften Klammern und Gleichheitszeichen.
Fügen Sie eine Zeile in der Datei ~/.xinitrc vor dem bereits erwähnten Befehl zur Ausführung von dwm ein.
conky | while read -r; do xsetroot -name "$REPLY"; done &
exec ck-launch-session dbus-launch --sh-syntax --exit-with-session dwm
Benutzerdefiniertes Skript
Anstelle der entsprechenden Nebenprogramme können Sie eine einfache Schleife erstellen, die Datum, Uhrzeit, Wetter und andere Systeminformationen anzeigt.
Um zum Beispiel Wetter, Datum und Uhrzeit anzuzeigen, erstellen Sie eine Shell-Skriptdatei in ~/.scripts/
#!/bin/sh
let loop=0
while true; do
if [[ $loop%300 -eq 0 ]]; then
weather="$(curl 'https://wttr.in?format=1')"
let loop=0
fi
xsetroot -name " $weather | $(date '+%b %d %a') | $(date '+%H:%M') "
let loop=$loop+1
sleep 1
done
Da das Skript bereits in einer Schleife läuft, müssen wir es nur innerhalb von xroot in unserer ~/.xinitrc-Datei einstellen.
. ~/.scripts/xsetloop.sh &
exec ck-launch-session dbus-launch --sh-syntax --exit-with-session dwm
Verwendung
Tasten- und Tastenfunktionen
Alle (voreingestellten) dwm-Tastenbindungen arbeiten mit einem bestimmten MODKEY
, der in dwm.h definiert ist. Der voreingestellte MODKEY
-Wert ist Mod1Mask
, was bei PC-Tastaturen die Alt-Taste bedeutet. Im Rest dieses Artikels wird Mod verwendet, um MODKEY
darzustellen.
Manuelles Verschieben eines Fensters
Um ein Fenster manuell zu einem anderen Fenster-Tag zu verschieben, halten Sie die Taste Mod gedrückt und klicken Sie mit der linken Maustaste auf eine beliebige Stelle des Fensters. Klicken Sie dann, während Sie die Taste Mod gedrückt halten, erneut auf den Fenster-Tag, in die das Fenster verschoben werden soll.
Standard-Kurzbefehle
Diese Abkürzungen werden standardmäßig in x11-wm/dwm verwendet:
Verwaltung der Fenster
- Mod+2 - Fenster-Tag Nummer zwei anzeigen
- Mod+Shift+1-9 - Bewegen Sie die Maus über das Fenster und drücken Sie die Tasten. Setzt das Fenster auf die angegebene Tag-Nummer.
- Mod+Shift+0 - Bewegen Sie die Maus über das Fenster und drücken Sie die Tasten. Bringt das Fenster auf alle Tags.
Dienstprogramme
- Mod+Shift+Enter - Starten eines Terminals
- Mod+Shift+C - Tötet ein Fenster
- Mod+P - dmenu
- Mod+J oder Mod+K - Wechsel zu einem anderen Terminal
- Mod+Enter - Schaltet Fenster zwischen Stack und Master um.
- Mod+Shift+Q - dwm beenden
Ändern des Layouts
- Mod+F - Layout auf Floating ändern.
- Mod+T - Layout auf Kacheln ändern.
Lautstärketasten
"..." bedeutet, in x11-wm/dwm nicht am Ende der Datei enthalten zu sein.
Fügen Sie die folgenden Zeilen in die Konfigurationsdatei ein und emergen Sie dwm neu:
#include <X11/XF86keysym.h>
...
/* commands */
static const char *upvol[] = { "amixer", "set", "Master", "2+", NULL };
static const char *downvol[] = { "amixer", "set", "Master", "2-", NULL };
// for muting/unmuting //
static const char *mute[] = { "amixer", "-q", "set", "Master", "toggle", NULL };
// for pulse compatible //
static const char *upvol[] = { "amixer", "-q", "sset", "Master", "1%+", NULL };
static const char *downvol[] = { "amixer", "-q", "sset", "Master", "1%-", NULL };
static const char *mute[] = { "amixer", "-q", "-D", "pulse", "sset", "Master", "toggle", NULL };
...
static Key keys[] = {
/* modifier key function argument */
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = upvol } },
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = downvol } },
{ 0, XF86XK_AudioMute, spawn, {.v = mute } },
Anpassung
dwm wird durch die Bearbeitung des Quellcodes angepasst
(Stellen Sie hier Tricks und Tipps zur Benutzeranpassung vor)
Patchen
Gentoo hat eine spezielle Art, dwm zu patchen. Wenn die Patches bereit sind, mit der dwm-Quelle zusammengeführt zu werden, gibt es eine spezielle Funktion namens eapply_user
, die während des emerge-Prozesses aufgerufen werden kann. Mit dieser Funktion können Benutzer-Patches auf den Quellcode angewendet werden. Verschieben Sie die benötigten Patches an einen der beiden Orte:
- /etc/portage/patches/category/application
- Ein Ebuild-Repository
Patches in /etc/portage/patches/category/application
Erstellen Sie zunächst das folgende Verzeichnis:
root #
mkdir -p /etc/portage/patches/x11-wm/dwm
Copy the dwm patches to /etc/portage/patches/x11-wm/dwm/ and make sure each patch is prefixed with a number, like so: 01-name_of_patch.patch. Also the filename needs to end with .patch
or .diff
otherwise Portage will not apply it. For this example we will assume that the patch is located in the home directory (/home/larry) of the user called larry.
root #
cp /home/larry/01-dwm.6.0-xft.patch /etc/portage/patches/x11-wm/dwm/
Installieren Sie jetzt einfach dwm, emerge kümmert sich um die Anwendung von Patches
root #
emerge --ask x11-wm/dwm
Patches in ein Portage konfiguriertes Ebuild-Repositorium stellen
Das Anlegen eines Ebuild-Repositoriums für die dwm-Patches kann hilfreich sein, wenn man sie weitergeben möchte, entweder auf einem anderen Rechner oder öffentlich.
Kopieren Sie x11-wm/dwm von /var/db/repos/gentoo/ in ein neues Ebuild-Repositorium, oder in ein anderes geeignetes Repositorium.
Legen Sie die Patches im Dateiverzeichnis ab (in diesem Beispiel heißt das für diese Dateien angelegte Repositorium "dwm_patches"):
root #
cp /home/larry/01-dwm-6.0-xft.diff /var/db/repos/dwm_patches/x11-wm/dwm/files/
Öffnen Sie die Ebuild-Datei in einem Texteditor, /var/db/repos/dwm_patches/x11-wm/dwm/dwm-6.1.ebuild, und listen Sie sie im Variablen-Array PATCHES für das automatische Patchen auf:
PATCHES=( "${FILESDIR}/01-dwm-6.0-xft.diff"
"${FILESDIR}/02-dwm-6.1-x11.diff"
)
Starten Sie emerge und genießen Sie es
root #
emerge --ask x11-wm/dwm
Zuweisung von Anwendungen zu Fenster-Tags
Ein Benutzer kann seine Lieblingsanwendungen auf einem anderen Fenster-Tag starten lassen, z.B. MPlayer auf Fenster-Tag Nummer fünf.
Zunächst müssen Sie den Namen der von Xorg aufgezeichneten Anwendung kennen, damit dwm dieses Fenster beim Starten kennt. Um dies herauszufinden, starten Sie die Zielanwendung (in diesem Beispiel MPlayer) und führen Sie auf das MPlayer-Fenster und xprop wird die Daten von Xorg auf dem MPlayer-Fenster anzeigen. Verwenden Sie den zweiten Fensternamen, der in der Zeile WM_CLASS(STRING)
angegeben ist. Jetzt haben wir den Namen des Fensters, das dwm kennen muss.
Manchmal hat eine Anwendung mehrere Fenster von sich selbst und meldet ein Fenster mit Großbuchstaben, während das zweite keine Großbuchstaben hat. Platzhalterzeichen sind in Fensternamen erlaub.
static const Rule rules[] ={
{ "MPlayer", NULL, NULL, 1 << 4, True, 0 },
};
Fehlersuche
Aktualisierung auf dwm-6.0
Das Upgrade von dwm-5.9 auf dwm-6.0 brachte viele Änderungen mit sich, die die bisherige config.h Datei zu einem wahrscheinlichen Problemen beim Kompilieren von dwm-6.0 machen. Wahrscheinliche Probleme können durch Compiler-Fehlermeldungen "'nmaster' undeclared" angezeigt werden. Um das Problem zu beheben, kompilieren und installieren Sie dwm-6.0 ohne die benutzerdefinierte config.h Datei und suchen Sie dann die Standard dwm-6.0 config.h Datei und vergleichen Sie diese mit der alten config.h Datei. (Oder dekomprimieren Sie den dwm-6.0-Tarball, um die dwm-6.0-Standarddatei config.h zu erhalten).
Behebung von " Permission Denied"
Ein logind-Anbieter, wie systemd oder elogind, muss laufen, um eine X-Sitzung als nicht privilegierter Benutzer zu starten. Wenn ein logind-Provider nicht läuft und der Benutzer startx eingibt, kann dwm nicht starten und es erscheint eine Meldung ähnlich dieser:
(EE) parse_vt_settings: Cannot open /dev/tty0 (Permission denied)
Wenn dies der Fall ist und das System OpenRC-basiert ist, fügen Sie elogind zum Bootvorgang hinzu und starten Sie den Dienst:
root #
rc-update add elogind boot
root #
/etc/init.d/elogind start
Für weitere Informationen besuchen Sie bitte die Non root Xorg Wiki-Seite.
Mod-Taste neu belegen
Wenn es zu Konflikten zwischen der dwm-Standardtaste Alt und anderen Konsolenanwendungen kommt, verwenden Sie die Taste Esc innerhalb der Konsolenanwendung. Die Taste Esc ist eine sofort verwendbare Rückfall-Escape-Taste. Eine andere Möglichkeit ist, die Mod-Taste umzudefinieren, um die Taste Super (Windows) oder andere zusätzliche Tasten in der Nähe der Space-Taste zu verwenden.
#define MODKEY Mod4Mask /* Super-Taste verwenden */
To assign a second Mod key allowing a user to have a Mod key on both sides of the keyboard, mimic or copy this keys activity to another key on the keyboard. The Microsoft Menu key (or context menu key) on Microsoft keyboards is directly opposite of the Super (Windows). The x11-apps/xmodmap package is required for this. (For reference, the two key's values are: showkey 125/127
and xev 133/135
respectively - on MS NEK4000 keyboard.)
# Der Anfang der Datei $HOME/.xinitrc ist guter Platz dafür.
# Damit wird die rechte Menütaste der MS NEK4000 so umprogrammiert, dass sie auch die DWM Mod4Key simuliert.
xmodmap -e "keycode 135 = Super_L" # MS Menu Tastendruck neu zuweisen zu Super_L
xmodmap -e "remove mod1 = Super_L" # sicherstellen, dass X nicht in die mod1-Gruppe fällt
Jetzt, sollte ein Benutzer auf beiden Seiten der Tastatur eine leicht zugängliche Mod-Taste haben, die sich nicht widerspricht!
Fehlverhalten von Java-Anwendungen beheben
Java-basierte Anwendungen sind dafür bekannt, dass sie sich falsch verhalten, da Java nicht weiß, welcher WM verwendet wird. Dies führt dazu, dass die GUI bestimmter Java-Anwendungen nicht richtig funktioniert. Um dieses Problem zu lösen, müssen wir die Eigenschaft des Fenstermanager-Namens des Stammfensters setzen. Dies kann mit dem Werkzeug wmname gemacht werden und auf LG3D
gesetzt werden.
Installieren Sie das Werkzeug:
root #
emerge --ask x11-misc/wmname
und legen Sie den Eigenschaftsnamen fest:
user $
wmname LG3D
Um diese Einstellung dauerhaft zu machen, fügen Sie diesen Befehl zu ~/.xinitrc hinzu.
Es ist auch nützlich, AWT_TOOLKIT zu exportieren, wenn einige Java-Anwendungen AWT verwenden, wie unten beschrieben.
Leere (graue) Fenster von Java-Anwendungen
Java-basierte Anwendungen, wie z.B. Apache NetBeans, werden nicht richtig dargestellt. Um dieses Problem zu entschärfen, setzen Sie die Variable AWK_TOOLKIT auf:
user $
AWT_TOOLKIT=MToolkit; export AWT_TOOLKIT
Um diese Aktion dauerhaft zu machen, muss der Befehl zum Startskript hinzugefügt werden, zum Beispiel ~/.xinitrc.
Hintergrund wird nicht neu gezeichnet
Manchmal wird der Hintergrund nicht richtig neu gezeichnet, wenn die aktuelle Ansicht gewechselt wird. Zum Beispiel zeichnen einige Terminalemulatoren wie st nicht den gesamten Fensterbereich. In diesen Fällen muss das X-Root-Fenster eine richtig definierte Farbe haben. Dies kann mit dem Befehl xsetroot erreicht werden. Zum Beispiel:
user $
xsetroot -solid black