The Official FVWM Homepage - Interface and Initialization Mechanism
Module Invocation
Modules MUST be launched by Fvwm. Fvwm will first open a pair of pipes
for communication with the module. One pipe is for messages to Fvwm
from the module, and the other is for messages to the module from
Fvwm. Each module has its own pair of pipes. After the pipes are open,
Fvwm will fork and spawn the module. Modules must be located in the
ModulePath, as specified in the user's .fvwm2rc file. Modules can be
initiated as fvwm starts up, or can be launched part way through an X
session.
Module Arguments
Args 0
Like any UNIX program, arg 0 is the full pathname of the module.
Most modules acquire this for use in error message, parsing their
own configuration commands, some other possible uses.
Arg 0 is related to the optional arg 6 described under "Module Aliases".
Args 1 and 2
The pipes are open when the module starts execution. The
integer file descriptors are passed to the module as the first and
second command line arguments.
Arg 3
The third command line argument is a character pointer pointing to the
full path name of the last configuration file that fvwm read in.
If there was no configuration file this arg points as to a string
containing "none".
In fvwm2, there is little reason for a module to use this argument.
Arg 4
The next command line argument is the application
window in whose context the module was launched. This is 0 if the
module is launched without an application window context.
Arg 5
The next
argument is the context of the window decoration in which the module
was launched. Contexts are listed below:
#define C_NO_CONTEXT 0 - launched during initialization
#define C_WINDOW 1 - launched from an application window
#define C_TITLE 2 - launched from a title bar
#define C_ICON 4 - launched from an icon window
#define C_ROOT 8 - launched from the root window
#define C_FRAME 16 - launched from a corner piece
#define C_SIDEBAR 32 - launched from a side-bar
#define C_L1 64 - launched from left button #1
#define C_L2 128 - launched from left button #2
#define C_L3 256 - launched from left button #3
#define C_L4 512 - launched from left button #4
#define C_L5 1024 - launched from left button #5
#define C_R1 2048 - launched from right button #1
#define C_R2 4096 - launched from right button #2
#define C_R3 8192 - launched from right button #3
#define C_R4 16384 - launched from right button #4
#define C_R5 32768 - launched from right button #5
Arg 6 and above
A number of user specified command line arguments may be present
(optional). Up to 35 arguments may be passed. For example, in:
Module "FvwmIdentify" FvwmIdentify Hello rob! ``-fg purple''
we would get argv[6] = ``Hello'', argv[7] = ``rob!'', argv[8] = ``-fg purple''.
Module Aliases
In the original fvwm, if you wanted to run 2 copies of a module, you
where advised to copy or soft-link the module executable to another name.
For example, you might have had to copies of FvwmButtons running.
Some of the modules now accept arg 6 as an Alias of the module name.
This alias is used in module generated messages, in recognizing configuration
commands, and possibly other uses. FvwmAnimate makes full use of this
and might provide a good model to follow.
Acquiring the read/write pipes
The following mechanism is recommended to acquire the pipe
descriptors:
int fd[2];
void main(int argc, char **argv) {
if((argc < 6)) {
fprintf(stderr,
"%s: Should only be executed by fvwm!\n", argv[0]);
exit(1);
}
fd[0] = atoi(argv[1]);
fd[1] = atoi(argv[2]);
The descriptor fd[0] is available for the module to send messages to
fvwm, while the descriptor fd[1] is available to read messages from
fvwm.
Since "int fd[2]" is an array, you will often see modules send commands
to fvwm with the construct "SendText(fd,"Command",0);".
Of course, they really mean "SendText(&fd[0],"Command",0);".
Pipe Status
Special attention is paid to the status of the pipe. If Fvwm gets a
read error on a module-to-fvwm pipe, then it assumes that the module
is terminating,
and all communication with the module is terminated. Similarly, if a
module gets a read error on an fvwm-to-module pipe, then it should
assume that fvwm is terminating, and it should gracefully shut down.
All modules should also allow themselves to be shut down via the
Delete Window protocol for X-11.
Reading initial configuration information
In previous implementations, the modules were expected to read and
parse the .fvwmrc file by themselves. This caused some difficulty if a
pre-processor was used on the .fvwmrc file. In fvwm-2.0 and later,
fvwm retains the module command lines (those which start with a
``*''), and passes them to any module on request. Modules can
request the command list by sending a ``Send_ConfigInfo'' command to
fvwm. Modules can request configuration commands interactively,
see M_SENDCONFIG in
Fvwm-to-Module Communication
and
Module-to-Fvwm Communication.