DWM

Izvor: HrOpenWiki
Skoči na: orijentacija, traži

DWM

DWM je dinamičan upravitelj prozorima ( dynamic window manager) za X.Prozorima upravlja u tiled,stacked i full-screen rasporedu ( popločen,složen i po cijelom zaslonu) kao i na mnoge druge naćine uz pomoć opcionalnih patcheva.Layout se primjenjuje dinamički, optimizirajući sučelje trenutno korištene aplikacije te prema trenutnoj potrebi.DWM je vrlo lagan i brz, pisan u C-u i sa dizajnerskom zadaćom da nesmije nikada premašiti 2000 linija koda.Također pruža potporu za xrandr and Xineramu.

Instalacija

Ovdje ćemo obraditi instalaciju iz repozitorija samo za Arch Linux te u Debian i njegove derivate. Imajete na umu da je jedini naćin uređivanja i prilagođavanja DWM-a u uređivanju source koda što je moguće ukoliko ste DWM instalirali kompajliranjem iz sourca te će se ostatak članka oslanjati upravo i na tu opciju.

Arch Linux

DWM se ne nalazi u službenim repozitorijima, već se mora vući iz AUR-a ili preko archlinux.fr repozitorija.


pacman -S dwm
yaourt dwm

Uz dwm će vam zatrebati i meni pa bi bilo pametno da instalirate i dmenu

pacman -S dmenu

Debian i Debianovi derivati

Kod Debiana DWM se nalazi unutar službenih repozitorija te ga je dovoljno povući.

sudo apt-get install dwm dmenu

Kompajliranje

Sa http://dl.suckless.org/dwm/dwm-5.9.tar.gz se skine source kod.Skinuta arhiva se raspakira u direktorij ~/.dwm te se uđe u novonastali direktoriji i kompajlira se uobičajenim postupkom

cd ~/.dwm 
make
sudo make install

Također potrebno je instalirati i dmenu čiju najnoviju inačicu možete skinuti također sa sucklessove stranice te kompajlirati.

Konfiguracija

Kao što je već ranije spomenuto DWM ima ekskluzivan pristup konfiguraciji prilikom kompajliranja te je stoga ukoliko želite mjenjati definicije,boje,izgled pametno raditi instalaciju preko izvornog koda putem kompajliranja ( traje točno 76 sekunda). Svaka promjena izgleda,boja i definicija vrši se u config.h datoteci koja je smještena u ~/.dwm direktoriju kojeg smo definirali prilikom instalacije.Evo i primjera jedne ovakve datoteke

/* See LICENSE file for copyright and license details. */

/* appearance */
static const char font[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
static const char normbordercolor[] = "#070707";
static const char normbgcolor[]     = "#070707";
static const char normfgcolor[]     = "#696969";
static const char selbordercolor[]  = "#3A3A3A";
static const char selbgcolor[]      = "#3A3A3A";
static const char selfgcolor[]      = "#ffffff";
static const unsigned int borderpx  = 1;        /* border pixel of windows */
static const unsigned int snap      = 32;       /* snap pixel */
static const Bool showbar           = True;     /* False means no bar */
static const Bool topbar            = False;     /* False means bottom bar */

/* tagging */
static const char *tags[] = { "term", "web", "files", "multimedia", "office", "fax", "work", "devl", "vbox" };

static const Rule rules[] = {
	/* class      instance    title       tags mask     isfloating   monitor */
	{ "Gimp",     NULL,       NULL,       0,            True,        -1 },
	{ "Vbox",  NULL,       NULL,       1 << 8,       False,       -1 },
};

/* layout(s) */
static const float mfact      = 0.55; /* factor of master area size [0.05..0.95] */
static const Bool resizehints = True; /* True means respect size hints in tiled resizals */

static const Layout layouts[] = {
	/* symbol     arrange function */
	{ "[]=",      tile },    /* first entry is default */
	{ "><>",      NULL },    /* no layout function means floating behavior */
	{ "[M]",      monocle },
};

/* key definitions */
#define MODKEY Mod1Mask
#define MOD4   Mod4Mask
#define TAGKEYS(KEY,TAG) \
    { MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
    { MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
    { MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },

/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }

/* commands */
static const char *dmenucmd[]     = { "dmenu_run", "-i", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
static const char *termcmd[]      = { "xterm -e tmux", NULL };
static const char *thunarcmd[]    = { "thunar", NULL };
static const char *rebootcmd[]    = { "sudo", "reboot", NULL };
static const char *shutdowncmd[]  = { "sudo", "shutdown", "-h", "now", NULL };
static const char *webcmd[]       = { "firefox", NULL };
static const char *mailcmd[]      = { "thunderbird", NULL };
static const char *volupcmd[]     = { "volup", NULL };
static const char *voldowncmd[]   = { "voldown", NULL };
static const char *volwhatcmd[]   = { "volumes_what", NULL };


static Key keys[] = {
    /* modifier                     key        function        argument */
    { MODKEY,                       XK_v,      spawn,          {.v = dmenucmd } },
    { MODKEY,                       XK_Return, spawn,          {.v = termcmd } },
    { MODKEY,                       XK_Up,     spawn,          {.v = volupcmd } },
    { MODKEY,                       XK_Down,   spawn,          {.v = voldowncmd } },
    { MODKEY,                       XK_b,      togglebar,      {0} },
    { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
    { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
    { MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
    { MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
    { MODKEY,                       XK_Tab,    view,           {0} },
    { MODKEY,                       XK_c,      killclient,     {0} },
    { MODKEY,                       XK_space,  setlayout,      {0} },
    { MODKEY,                       XK_0,      view,           {.ui = ~0 } },
    { MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
    { MODKEY,                       XK_period, focusmon,       {.i = +1 } },
// alt + shift + key
    { MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
    { MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
    { MODKEY|ShiftMask,             XK_Return, zoom,           {0} }, /* swap master */
    { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
    { MODKEY|ShiftMask,             XK_h,      setlayout,      {.v = &layouts[0]} }, /* to change layouts horizontal*/
    { MODKEY|ShiftMask,             XK_f,      setlayout,      {.v = &layouts[1]} }, /* floating */
    { MODKEY|ShiftMask,             XK_m,      setlayout,      {.v = &layouts[2]} }, /* monocle */
    { MODKEY|ShiftMask,             XK_v,      setlayout,      {.v = &layouts[3]} }, /* vertical */
    { MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
// alt + control + key
    { MODKEY|ControlMask,           XK_r,      spawn,          {.v = rebootcmd } },
    { MODKEY|ControlMask,           XK_s,      spawn,          {.v = shutdowncmd } },
// Super + key
    { MOD4,                         XK_h,      spawn,          {.v = thunarcmd } },
    { MOD4,                         XK_f,      spawn,          {.v = webcmd } },
    { MOD4,                         XK_e,      spawn,          {.v = mailcmd } },
    { MOD4,                         XK_v,      spawn,          {.v = volwhatcmd } },
    TAGKEYS(                        XK_1,                      0)
    TAGKEYS(                        XK_2,                      1)
    TAGKEYS(                        XK_3,                      2)
    TAGKEYS(                        XK_4,                      3)
    TAGKEYS(                        XK_5,                      4)
    TAGKEYS(                        XK_6,                      5)
    TAGKEYS(                        XK_7,                      6)
    TAGKEYS(                        XK_8,                      7)
    TAGKEYS(                        XK_9,                      8)
    { MODKEY|ControlMask,           XK_q,      quit,           {0} },
};

/* button definitions */
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
    /* click                event mask      button          function        argument */
    { ClkLtSymbol,          0,              Button1,        setlayout,      {0} },
    { ClkLtSymbol,          0,              Button3,        setlayout,      {.v = &layouts[2]} },
    { ClkWinTitle,          0,              Button2,        zoom,           {0} },
    { ClkStatusText,        0,              Button2,        spawn,          {.v = termcmd } },
    { ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
    { ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
    { ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
    { ClkTagBar,            0,              Button1,        view,           {0} },
    { ClkTagBar,            0,              Button3,        toggleview,     {0} },
    { ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
    { ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
};   

Pokretanje

Pokretanje je vrlo jednostavno i ono ovisi o naćinu na koj pokrećete X na svom računalu.

Za pokretanje preko startx naredbe ili putem SLIM managera potrebno je urediti .xinitrc datoteku na naćin da se na njen kraj doda naredba
exec dwm
. Također ukoliko želite koristiti xfce4-power-manager i polkit pravila odnosno dbus umjesto
exec dwm
koristite
 exec ck-launch-session bash -c "xfce4-power-manager & dwm" 
.

Puno bolji i elegantniji način je kreiranjem datoteke ~/bin/startdwm u koju se utrpaju sve aplikacije koje želite pokrenuti prilikom podizanja X-a

te pozivanjem nje preko .xinitrc skripte
 exec ck-launch-session dbus-launch --sh-syntax --exit-with-session ~/bin/startdwm
.

Aplikacije pokrenute na taj način će sve imati polkit/dbus dodjeljena prava.Primjer takve .xinitrc datoteke je

 #!/bin/bash
#this file is called by .xinitrc to start some nice apps for dwm

xrdb -merge ~/.Xresources &

xfce4-power-manager &

sh ~/.fehbg &

while true; do
	xsetroot -name "$(date +"%a %d.%m/%H:%M:%S") $(df -h|grep root|awk '{print $4}')"
	sleep 1
done &

while true; do
	dwm || exit
done

Konfiguracija statusne trake

Osnovna traka

Ovaj primjer ispisuje vrijeme u ISO 8601 formatu. Dodaje se u ~/.xinitrc

 while true; do
   xsetroot -name "$( date +"%F %R" )"
   sleep 1m    # Update time every minute
done &
exec dwm
 

Također jedan primjer za laptop korisnike

 while true ; do
    xsetroot -name "$( acpi -b | awk '{ print $3, $4 }' | tr -d ',' )"
    sleep 1m
done &
exec dwm

Conky kao statusna traka

Conky se može ispisati na na statusbar pomoću xsetroot -name

conky | while read -r; do xsetroot -name "$REPLY"; done &
exec dwm 

Da bi to radilo potrebno je natjerati Conky da radi output samo u konzoli

out_to_console yes
out_to_x no
background no
update_interval 2
total_run_times 0
use_spacer none

TEXT
$mpd_smart :: ${cpu cpu1}% / ${cpu cpu2}%  ${loadavg 1} ${loadavg 2 3} :: ${acpitemp}c :: $memperc% ($mem) :: ${downspeed eth0}K/s ${upspeed eth0}K/s :: ${time %a %b %d %I:%M%P} 

Osnovno korištenje

Dmenu

Dmenu je vrlo koristan dodatak za DWM. Kvalitetniji je i brži nego standardni drop-down izbornici paketa. Radi na principu automatskog dovršavanja te upisivanjem imena paketa.Za pokretanje treba pritisnuti MOD1 + P ( MOD1 tipka je standardno Alt tipka).Kombinaciju možete dakako promjeniti prema vlastitom izboru.Osobno, nekako mi je praktičnije da to bude Win tipka + spacebar.

Kontroliranje prozora

Micanje prozora sa jednog taga na drugi tag je vrlo jednostavno.Dovedite prozor u stanje levitiranja mišem ( dovedite kurzor miša nad prozor te kliknite na njega) pa zatim odradite kombinaciju tipaka Shift+Alt+x gdje je x broj taga na koj želite postaviti prozor.

Zatvaranje prozora

Za zatvarenje prozora pritisnite Shift+Mod1+C

Raspored prozora

Nativno će DWM raditi u tiling modu. To možete primjetiti promatrajući stare prozore kako postaju manji i manji kako se otvaraju novi prozori. Prozori će zajedno zauzeti cijeli display umenjen za statusnu traku.Uz tiling mod postoje nativno još dvije opcije, floating i monocle. Floating je naćin rada sa prozorima na koj su navikli korisnici klasičnih upravitelja desktopom kako KDE,GNOME,LXDE,XFCE ili pak nekih popularnih upraviteljima prozora( OpenBox,FluxBox,IceWM).Za prebacivanjen u takav naćin rada potrebno je pritisnuti kombinaciju Mod1+F. Za prebacivanje u monocle mod potrebno je pritisnuti Mod1+M. Na statusnoj traci možete provjeri i u kojem ste modu. M je za monocle, F je floating a []= je tiling mod. Za povratakk u tiling mod je kombinacija Mod1+T.

Izlazak

Za izlazak je potrebno pritisnuti Shift+Mod1+Q


Dodatne opcije i patchevi

Na službenoj stranici nalazi se mnoštvo patcheva koji omogučuju nove načine definicija upravljanja prozorima kao logaritamska spirala,gravitacija,Fibonaccieva spirala,bstock,mreža,.... Također se na službenj stranici nalazi i vrlo kavlitetno objašnjenje kako primjeniti patcheve pa neću trošiti suvišne redove na to. Nativno će DWM primjeniti isti raspored prozora ne sve agove.Da bi omogučili za svaki tag poseban raspored potrebno je primjeniti patch pertag.