Sorry, this documentation is pretty out of date - and applies to perlwm 0.0.1.

There are currently a handful of configuration variables that you can change (althought they are not yet in a seperate configuration file). They control things like fonts, colors, and the combinations in which they are used, as well as actions and bindings.

%font - this defines the fonts that will be used. It maps a name to a font definition.

%font = (title       => 'lucidasans-14',
	 title_focus => 'lucidasans-bold-14');

%color - this defines the colors that will be used. It maps a name to a color definition.

%color = (frame		=> 'grey75',
	  frame_focus	=> 'white',
	  title		=> 'black',
	  title_focus	=> 'red');

%gc - this defines the GCs (graphics contexts) that will be used to draw various elements. It maps names to GC attributes - fonts and colors used must be in defined in %font or %color. GCs are cached (as are fonts and colors). (Currently, the value of this variable looks a bit redundant, but in future it should become more useful.)

%gc = (frame		=> { foreground => 'frame' },
       frame_focus	=> { foreground => 'frame_focus' },
       title		=> { font       => 'title', 
			     foreground => 'title' },
       title_focus      => { font       => 'title_focus', 
			     foreground => 'title_focus' });

%dim - this defines various dimensions.

%dim = (frame_width => 2);

%actions - this defines 'actions' (perhaps 'functions' might be a better term). They define what piece of code gets executed for a particular event (press, drag and release).

%actions = (move => { drag => \&move_drag },
	    size => { press => \&size_press, drag => \&size_drag });

%bindings - this defines how buttons (and in the future keys) are bound to actions in various contexts.

%bindings = (frame =>  { 'Button1' => 'move' },
	     window => { 'Mod1 Button1' => 'move',
			 'Control Mod1 Button1' => 'size',
		         'Button1' => '+click' });

Sample action code. Here is the code needed to define the 'move' action. It will be called during a drag (after an appropriate binding has been triggered). The three parameters are $c (client - describes the window), $s (state - describes the current action state) and $e (event - the most recent X event). What this function does is move the current window my the incremental amount the mouse moved since the last event. This configuration gives us what is usually called 'opaque move' - the whole window will move with the mouse. Other behaviour can be easily achieved by handling just the press and release, or handling the drag differently.

sub move_drag {

  my($c, $s, $e) = @_;

  $c->{x} += $s->{drag}->{inc_x};
  $c->{y} += $s->{drag}->{inc_y};

  $x->ConfigureWindow($c->{frame}, x => $c->{x}, y => $c->{y});

SourceForge Logo