JWM

From ArchWiki

Jump to: navigation, search


Contents

Introduction

JWM (Joe's Window Manager) is a featherweight window manager for the X11 Window System written in C; it's under active development and is maintained by Joe Wingbermuehle. ...[A]lthough development on JWM has slowed quite a bit, [Joe Wingbermuehle is] still working on it on and off and...will hopefully have a new release ready one of these days.[1] JWM uses approximately 5 MB of resident memory under normal operating conditions. As of January 2009, the size of the version present in the official Arch Linux repositories is under 76 KB packaged (compare to dwm at under 17 KB) and under 171 KB installed (compare to dwm at 68 KB). A minimally compiled version consumes approximately 136 KB of disk space and occupies under 1500 KB of resident memory.

JWM is generally regarded as the lightest and fastest stacking window manager available for X11 and is the default window manager base for distributions such as Puppy Linux, Damn Small Linux and SliTaz GNU/Linux. Numerous options allow for great flexibility of layout. Some of the more outstanding features of JWM include its simplicity and ease of configuration, native support for customizable panels and buttons and its inclusion of a system tray dock.

[1] Wingbermuehle, Joe. News. 06 Sep. 2008. 11 Feb. 2009 <http://joewing.net/index.shtml>.

Package Installation

JWM is part of the official Arch Linux (community/X11) repositories.

$ pacman -Si jwm
Repository     : community
Name           : jwm
Version        : 2.0.1-2
URL            : http://joewing.net/programs/jwm/
Licenses       : GPL2  
Groups         : None
Provides       : None
Depends On     : libx11  libxft  libjpeg  fribidi  libxpm  libxinerama  libpng  
Optional Deps  : None
Conflicts With : None
Replaces       : None<br>
Download Size  :  75.71 K<br>
Installed Size : 170.93 K<br>
Packager       : Arch Linux (http://www.archlinux.org)<br>
Architecture   : i686<br>
Build Date     : Fri 16 Nov 2007 10:20:50 AM PST<br>
MD5 Sum        : dcc2934fa7208a4acb5ca9c90c3cab33<br>
Description    : A lightweight window manager for the X11 Window System

Install the latest version of JWM:

# pacman -Sy jwm

Starting JWM

To start JWM, simply type:

$ xinit /usr/bin/jwm

or include the appropriate entry (e.g. jwm or exec jwm) in your ~/.xinitrc file and

$ startx

Configuration

Creating ~/.jwmrc

In adherence to the principles of The Arch Way, the look, feel and function of the JWM desktop is controlled by way of a single configuration file: ~/.jwmrc
A sample configuration file is installed upon program installation and is located at /etc/system.jwmrc. ~/.jwmrc must be first created by the user:

$ cd ~
$ touch .jwmrc

or

$ cp /etc/system.jwmrc ~/.jwmrc

All that is left at this point is to establish the environment by editing the XML-based .jwmrc file.

  • JWM Configuration details the complete list of tags, attributes and values available for JWM.

Overview of Selected Tags

<StartupCommand>

Load and fork Parcellite as a background daemon when JWM starts

 <StartupCommand>parcellite -d</StartupCommand>

Quietly connect to and fork the urxvtd daemon to the current $DISPLAY when JWM starts

 <StartupCommand>urxvtd -g -o -f</StartupCommand>

<Program>

Open Thunar in a specified directory

<Program label="Thunar">thunar ~/Desktop</Program>

Connect to the local CUPS server using the preferred web application (xdg-utils):

<Program label="CUPS Printing">xdg-open http://localhost:631</Program>

Iconize and start FileZilla with Site Manager opened

<Program icon="filezilla.png">filezilla -s</Program>

<Menu>

Create containers for a list of additional programs to display as a submenus under <RootMenu>

<Menu label="Sample">
  <Program label="Xfburn">xfburn -d</Program>
  <Program label="urxvt Client">urxvtc</Program>
</Menu>
<Menu label="Example">
  <Program label="Opera">opera -nolirc -nomail -noshape -notrayicon</Program>
  <Program label="Writer">/opt/openoffice/program/swriter -nologo</Program>
</Menu>

<RootMenu>

Create a menu container displaying the label="Test" of height="24" pixels and bound to the left mouse button onroot="1" under <RootMenu>

<RootMenu labeled="true" label="Test" height="24" onroot="1">
    <Program label="Thunar">thunar ~/Desktop</Program>
    <Program label="CUPS Printing">xdg-open http://localhost:631</Program>
    <Program icon="filezilla.png">filezilla -s</Program>
  <Menu label="Sample">
    <Program label="Xfburn">xfburn -d</Program>
    <Program label="urxvt Client">urxvtc</Program>
  </Menu>
  <Menu label="Example">
    <Program label="Opera">opera -nolirc -nomail -noshape -notrayicon</Program>
    <Program label="Writer">/opt/openoffice/program/swriter -nologo</Program>
  </Menu>
</RootMenu>

Create a nested menu container with no label, of height="32" pixels, and bound to the right mouse button onroot="3" under <RootMenu>

<RootMenu height="32" onroot="3">
    <Program label="Thunar">thunar ~/Desktop</Program>
    <Program label="CUPS Printing">xdg-open http://localhost:631</Program>
    <Program icon="filezilla.png" label="FileZilla">filezilla -s</Program>
  <Menu label="Sample">
    <Program label="Xfburn">xfburn -d</Program>
    <Program label="urxvt Client">urxvtc</Program>
  <Menu label="Example">
    <Program label="Opera">opera -nolirc -nomail -noshape -notrayicon</Program>
    <Program label="Writer">/opt/openoffice/program/swriter -nologo</Program>
  </Menu>
  </Menu>
</RootMenu>

<Groups>

Preserve panel space by not displaying Squeeze and Xarchiver within the <Tasklist>

<Group>
  <Class>Squeeze</Class>
  <Class>Xarchiver</Class>
    <Option>nolist</Option>
</Group>

Always start Firefox maximized on the second desktop:2 and without a title bar

<Group>
  <Class>Firefox</Class>
    <Option>maximized</Option>
    <Option>desktop:2</Option>
    <Option>notitle</Option>
</Group>

<TrayButton>

Create a panel <TrayButton> displaying the label="Pattern" which launches the root:1 menu

<TrayButton label="Pattern">root:1</TrayButton>

<Swallow>

Integrate, or <Swallow> into the tray the program whose name=wicd-client and allow the named program to execute the command wicd-client

<Swallow name="wicd-client">
  wicd-client
</Swallow>

<Tray>

Create a panel <Tray> of height="24" pixels offset x="0" pixels from the left of the screen and y="0" from the top of the screen. Display within the panel:

  1. A menu <TrayButton> which displays the root:1 menu.
  2. A <TaskList/> which displays running applications within the current desktop.
  3. A <TrayButton> with the text label="X" that minimizes open windows to show the root window, or desktop.
  4. A virtual desktop <Pager/> showing available workspaces.
  5. The <Swallow> integration of the Wicd network applet.
  6. For supported applications, a system tray area for programs to <Dock/>.
  7. A <Clock> which displays the date and time in the specified format.
<Tray x="0" y="0" height="24">
  <TrayButton label="Pattern">root:1</TrayButton>
  <TaskList/> 
  <TrayButton label="X">showdesktop</TrayButton>
  <Pager/>
  <Swallow name="wicd-client">
    wicd-client
  </Swallow>
  <Dock/>
  <Clock format="%a %b %d %l:%M %p"></Clock>
</Tray>

<Key>

Bind the F1 key to launch and display the root:3 menu

<Key key="F1">root:1</Key>

Bind the Super+l key combination to lock the screen (XScreenSaver)

<Key mask="S" key="l">exec:xscreensaver-command -lock</Key>

<Include>

Elaborate configurations often <Include> files for ease of maintenance and control

<Key key="F1">root:1</Key>
<Include>./.jwmrc-super-hyper-keys</Include> 
<Key mask="S" key="l">exec:xscreensaver-command -lock</Key>

Contents of an example ~/.jwmrc-super-hyper-keys

<Key mask="PH" key="t">exec:thunderbird -addressbook</Key>
<Key mask="PH" key="h">exec:htop -u login --sort-key PERCENT_MEM</Key>
<Key mask="PH" key="c">exec:catfish --hidden --path=/usr</Key>

<ShutdownCommand>

Recursively force the removal of the contents of the Trash folder when JWM shuts down

 <ShutdownCommand>rm -rf ~/.local/share/Trash/*</ShutdownCommand>

Verifying Configuration Changes

$ jwm -p

Runs the native configuration file checking utility of JWM and returns syntax errors (including associated line numbers) present in the configuration file, if any. If the syntax is correct and the configuration file is deemed properly marked up, there is no error code returned. Changes in the configuration file are available immediately after restarting, or refreshing JWM via the <Restart/> command. There is no need to restart the X server via Ctrl+Alt+BACKSPACE, nor the need to logout and login for changes to apply. The <Restart/> command is made available to the user as a command on the initial root menu. Users are recommended to use this tool in between configuration changes in order to ensure valid markup and a stable environment.

Useful Tips & Tricks

Additional Applications

  • Orage can be run within the JWM <Clock> to provide calendaring support and todo and event lists features.
  • Parcellite can be swallowed within a tray(s) to serve as a lightweight X11 clipboard manager.
  • Conky can be run within the JWM <StartupCommand> to provide the display of various data streams (e.g. battery life and AC adapter status for notebooks).
  • PCMan File Manager can be used to manage the desktop. The advantage of using PCMan File Manager is that it also doubles as a powerful GUI file manager.
  • Xfce Desktop Manager (or xfdesktop) can be used to manage the desktop. The advantages of using xfdesktop include integration of a right-click menu with Thunar UCA actions and provides support for wallpaper, menu and icons management.

Xinitrc Startup Applications

Startup applications can be executed outside of the JWM <StartupCommand> by including the appropriate options in ~./xinitrc

#!/bin/bash

conky &
xfdesktop &
parcellite -d &
Thunar --daemon &
urxvtd -q -f -o &
exec /usr/bin/jwm

Improve <Tasklist> Contrast

Change the default <Tasklist> settings to match the improved contrast style of the default <MenuStyle> and active <WindowStyle>

<TaskListStyle>
  <ActiveForeground>black</ActiveForeground>
  <ActiveBackground>gray90:gray70</ActiveBackground>
</TaskListStyle>
<TaskListStyle>
  <ActiveForeground>white</ActiveForeground>
  <ActiveBackground>#70849d:#2e3a67</ActiveBackground>
</TaskListStyle>

Power & Event Management

Logout & Refresh

<Exit/> (Logout) is the menu command to cleanly log out of the current X server.
<Restart/> (Refresh) is the menu command tag which reinitializes the configuration file and updates menus and keybindings accordingly.
<Restart/> and <Exit/> can be bound to the Ctrl+Alt modified keys following the example syntax below:

<Key mask="CA" key="r">exec:jwm -restart</Key>
<Key mask="CA" key="e">exec:jwm -exit</Key>

Reboot & Shutdown

Reboot and shutdown commands can be run within <Key> and/or <Program> tags.
A system with sudo installed and properly configured can be rebooted with Ctrl+Alt+b and powered off with Ctrl+Alt+p

<Key mask="CA" key="r">exec:sudo reboot</Key>
<Key mask="CA" key="p">exec:sudo poweroff"</Key>

Or through a menu option:

<Program label="Restart">sudo reboot</Program>
<Program label="Poweroff">sudo poweroff</Program>
Note: For users wishing to power down a system, poweroff or shutdown -P now may be preferable to shutdown -h now as it leaves no doubt as to the intention of the user initiated command.

Custom Minimal Build

Gains in UI response can be gleaned by not using menu icons and by disabling the use of Xft fonts. Further gains can be accomplished by removing support for external libraries with a custom build. The result is also a reduction in resource requirements. A minimal build compiled with Xft support and using Xft fonts is allocated approximately 3 MB of resident and 1.5 MB of shared memory. The same build compiled without Xft support is allocated under 1.5 MB and approximately 1.2 MB, respectively. See the Arch Build System page for further details.

Minimal PKGBUILD Example

pkgname=jwm
pkgver=2.0.1
pkgrel=100
pkgdesc="A lightweight window manager for the X11 Window System"
arch=('i686' 'x86_64')
url="http://joewing.net/programs/jwm/"
license=('GPL2')
depends=('libx11')
backup=('etc/system.jwmrc')
source=(http://joewing.net/programs/jwm/releases/jwm-$pkgver.tar.bz2)
md5sums=('48f323cd78ea891172b2a61790e8c0ec')

build() {
  cd "$srcdir/$pkgname-$pkgver"

  ./configure --disable-confirm --disable-icons --disable-png  \ 
  --disable-xpm --disable-jpeg --disable-fribidi --disable-xinerama  \
  --disable-shape --disable-xft --disable-xrender --disable-debug  \ 
  --prefix=/usr/local --sysconfdir=/etc
  make || return 1
  make BINDIR=$pkgdir/usr/local/bin \
       MANDIR=$pkgdir/usr/share/man \
       SYSCONF=$pkgdir/etc install || return 1
}

Minimal Build Font Suggestions

<WindowStyle>
<Font>-*-fixed-*-r-*-*-10-*-*-*-*-*-*-*</Font>

<TaskListStyle>
<Font>-*-fixed-*-r-*-*-13-*-*-*-*-*-*-*</Font>

<TrayStyle>
<Font>-*-fixed-*-r-*-*-13-*-*-*-*-*-*-*</Font>

Manual Tiling Support

Tling support can be added to JWM through the use of the Poor Man's Tiling Window Manager python script. Assuming manage.py is part of the PATH, various tiling actions can be keybound according to the example below

<Key mask="H" key="Up">exec:manage.py swap</Key>
<Key mask="H" key="Down">exec:manage.py cycle</Key>
<Key mask="H" key="Left">exec:manage.py left</Key>
<Key mask="H" key="Right">exec:manage.py right</Key>

Troubleshooting DRAFT

  • If X is not already running on a tty1, Ctrl+Alt+F1 will allow you to review standard errors and messages.
  • Thunar > gnome-fs-home error > pacman -Sy gnome-icon-theme
  • Parcellite binding failures
  • PCMan File Manager 'My Documents' desktop folder > Edit source code

Package Removal

To remove the JWM package while retaining its configuration files and dependencies:

# pacman -R jwm

To remove the JWM package and its configuration files while retaining its dependencies:

# pacman -Rn jwm

To remove the JWM package and dependencies not required by any other packages while retaining its configuration files:

# pacman -Rs jwm

To remove the JWM package, its configuration files and dependencies not required by any other packages:

# pacman -Rns jwm
Note: Pacman will not remove configuration files outside of the defaults that were created during package installation. This includes ~/.jwmrc

Additional Resources

Examples of what can be accomplished with a bit of creativity and substitution can be found at:

Personal tools