cwm window manager

PackRat

cwm is one of those minimalist window managers - no window decorations, but good key binding control. Configured in the $HOME/.cwmrc file; good man pages for cwm and cwmrc. The default window manager for OpenBSD, I believe:



it's pretty good if you like minimalism - just under 100 MB memory idling on VSIDO, or for those occasions when you don't want to be distracted by eye candy.

get the source code from git:

git clone git://github.com/chneukirchen/cwm.git

I haven't used it in a couple years because the aesthetic can be easily duplicated in fluxbox, fvwm, openbox, or tiling wm's like i3 and dwm - all of which have much more functionality, but I'll confess this is the wm I used to train myself to use key bindings for window management instead of the mouse.

You can use a mouse - the default mouse bindings for window movement/resize are the same as fluxbox, and it is conky and panel friendly - tint2 anyway:



that is conky piped to dzen2 - similar to dwm or spectrwm in the first scrot, regular conky window in the second.
I am tired of talk that comes to nothing.
-- Chief Joseph

...the sun, the darkness, the winds are all listening to what we have to say.
-- Geronimo

VastOne

Thanks Rat Man, I will give it a go...

Has anything changed in the 2 years. Or better, has there been development in that 2 years?
VSIDO      VSIDO Change Blog    

    I dev VSIDO

PackRat

#2
I believe so. It is actively developed by the OpenBSD developers/maintainers and the git repo for the linux port is tied to that release now so it is a simple compile as long as you have a few dependencies -

make
sudo make install


prior to that, it was a real pain in the ass to get it compiled - there were 3-4 linux ports of.

I don't think it supports virtual desktops natively, so tilers like dwm, spectrwm, and i3 really - IMO - blow it away as far as functionality goes. But if you only need the one desktop, or prefer a wm on your server it's really good.

my ~/.cwmrc which is pretty much taken from the man page  - add an ignore rule for tint2 and/or conky windows:

borderwidth 1
color activeborder rgb:E1/CA/5A
color inactiveborder rgb:BC/BE/B3
gap 20 4 4 4
moveamount 10

# Set default Xft(3) font
fontname "terminus:pixelsize=12:regular"

# Turn on sticky-group mode
sticky yes

# Any entry here is shown in the application menu
command dmenu dmenu_run
command terminal urxvtc
command tmux "uxterm -e tmux"
command thunar thunar
command editor geany
command firefox         firefox
command thunderbird thunderbird
command gimp gimp

# Autogroup definitions
autogroup 3 "aterm,XTerm"
autogroup 3 "xterm,XTerm"

# Ignore programs by that name by not drawing borders around them.
ignore XMMS
ignore xwi
ignore xapm
ignore xclock
ignore conky
ignore dzen2
ignore dmenu

# Keybindings
bind CM-r       label
bind CS-Return  "xterm -e top"
bind 4-o        unmap
bind CM-equal   unmap
bind CMS-equal  unmap
#bind M-F7   vmaximize
#bind M-F8  hmaximize
bind M-1        grouponly1
bind M-2        grouponly2
bind M-3        grouponly3
bind MS-1       movetogroup1
bind MS-2       movetogroup2
bind MS-3       movetogroup3

# user bindings
bind M-F1 "urxvtc"
bind M-F2 "dmenu_run"
bind M-F3 "urxvtc -e tmux"
bind M-F4 delete
bind M-F5 raise
bind M-F6 lower
bind M-F7 vmaximize
bind M-F8 hmaximize
bind M-F10 maximize
bind XF86HomePage firefox
bind Menu thunar
bind 4-F14 thunderbird
bind C4-l geany
bind C4-g gimp

# Mousebindings
mousebind M-2   window_lower
mousebind M-3   window_resize

#BIND COMMAND LIST
#     restart             Restart the running cwm(1).
bind 4-q restart
#     quit                Quit cwm(1).
bind 4S-q quit
#     terminal            Spawn a new terminal.
#     lock                Lock the screen.
#     search              Launch window search menu.
#     menusearch          Launch application search menu.
#     exec                Launch "exec program" menu.
#     exec_wm             Launch "exec WindowManager" menu.
#     ssh                 Launch "ssh" menu.
#     group[n]            Select group n, where n is 1-9.
#     grouponly[n]        Like group[n] but also hides the other groups.
#     nogroup             Select all groups.
#     grouptoggle         Toggle group membership of current window.
#     movetogroup[n]      Hide current window from display and move to group n, where n is 1-9.
#     cyclegroup          Forward cycle through groups.
#     rcyclegroup         Reverse cycle through groups.
#     cycle               Forward cycle through windows.
#     rcycle              Reverse cycle through windows.
#     cycleingroup        Forward cycle through windows in current group.
#     rcycleingroup       Reverse cycle through windows in current group.
#     delete              Delete current window.
#     hide                Hide current window.
#     lower               Lower current window.
#     raise               Raise current window.
#     label               Label current window.
#     freeze              Freeze current window geometry.
#     maximize            Maximize current window full-screen.
#     vmaximize           Maximize current window vertically.
#     hmaximize           Maximize current window horizontally.
#     moveup              Move window moveamount pixels up.
bind MS-Up moveup
#     movedown            Move window moveamount pixels down.
bind MS-Down movedown
#     moveright           Move window moveamount pixels right.
bind MS-Left moveleft
#     moveleft            Move window moveamount pixels left.
bind MS-Right moveright
#     bigmoveup           Move window 10 times moveamount pixels up.
#     bigmovedown         Move window 10 times moveamount pixels down.
#     bigmoveright        Move window 10 times moveamount pixels right.
#     bigmoveleft         Move window 10 times moveamount pixels left.
#     resizeup            Resize window moveamount pixels up.
bind C4-Up resizeup
bind C4-Down resizedown
bind C4-Left resizeleft
bind C4-Right resizeright
#     resizedown          Resize window moveamount pixels down.
#     resizeright         Resize window moveamount pixels right.
#     resizeleft          Resize window moveamount pixels left.
#     bigresizeup         Resize window 10 times moveamount pixels up.
#     bigresizedown       Resize window 10 times moveamount pixels down.
#     bigresizeright      Resize window 10 times moveamount pixels right.
#     bigresizeleft       Resize window 10 times moveamount pixels left.
#     ptrmoveup           Move pointer moveamount pixels up.
#     ptrmovedown         Move pointer moveamount pixels down.
#     ptrmoveright        Move pointer moveamount pixels right.
#     ptrmoveleft         Move pointer moveamount pixels left.
#     bigptrmoveup        Move pointer 10 times moveamount pixels up.
#     bigptrmovedown      Move pointer 10 times moveamount pixels down.
#     bigptrmoveright     Move pointer 10 times moveamount pixels right.
#     bigptrmoveleft      Move pointer 10 times moveamount pixels left.
#     htile               Current window is placed at the top of the screen and maximized horizontally, other windows in its group share remaining screen space.
#     vtile               Current window is placed on the left of the screen and maximized vertically, other windows in its group share remaining screen space.

# MOUSEBIND COMMAND LIST
#     window_move         Move current window.
#     window_resize       Resize current window.
#     window_lower        Lower current window.
#     window_raise        Raise current window.
#     window_hide         Hide current window.
#     window_grouptoggle  Toggle group membership of current window.
#     menu_group          Launch group list.
#     menu_unhide         Launch hidden window list.
#     menu_cmd            Launch command list.


and my startcwm file - mine resides in /usr/local/bin - I use it in the /usr/share/xsessions/cwm.desktop file to make it available to lightdm

#!/bin/sh

# Change your keymap:
xmodmap "$HOME/.Xmodmap" &
xrdb -l "$HOME/.Xdefaults" &
xsetroot -mod 1 1 -fg mediumslateblue -bg lightslategray &
urxvtd -q -f -o &
fbsetbg -c -r "$HOME/wallpaper/" &
conky | dzen2 -fn "xft:terminus:pixelsize=12:antialias=true:hinting=slight" &

exec cwm
I am tired of talk that comes to nothing.
-- Chief Joseph

...the sun, the darkness, the winds are all listening to what we have to say.
-- Geronimo

PackRat

Didn't know there was basic tiling native to cwm, tiling is always handy:



just add key bindings in .cwmrc for htile and vtile.
I am tired of talk that comes to nothing.
-- Chief Joseph

...the sun, the darkness, the winds are all listening to what we have to say.
-- Geronimo

PackRat

#4
Re-visiting cwm paying closer attention to cwm groups. This comment:

QuoteI don't think it supports virtual desktops natively

is not entirely accurate. Groups in cwm is a way to simulate virtual desktops. This page gives a short summary:

Getting started with cwm

I modified my ~/.cwmrc to add the following:

# Autogroup definitions - note: group visibility functions as virtual desktops
autogroup 1 "sakura,Sakura"
autogroup 1 "xterm,UXTerm"
autogroup 1 "xterm,XTerm"
autogroup 1 "geany,Geany"
autogroup 1 "medit,medit"

autogroup 2 "Navigator,Firefox"
autogroup 2 "Mail,Thunderbird"

autogroup 3 "xchat,Xchat"
autogroup 3 "filezilla,Filezilla"

autogroup 4 "gimp,Gimp"


Sets up 4 groups (there are 9 total built into cwm); use xprop to get the class names to use in the group definition.

By default, all groups are visible, but once the user starts to cycle through the groups with ALT-Right or ALT-Left, all but the active group become hidden as if they are on different desktops. By default CTRL-ALT-0 (zero) brings all the groups back into view.
I am tired of talk that comes to nothing.
-- Chief Joseph

...the sun, the darkness, the winds are all listening to what we have to say.
-- Geronimo