/* -*-c-*- */
#ifndef FVWM_MODULE_LIST_H
#define FVWM_MODULE_LIST_H
#include "libs/Module.h"
#include "libs/queue.h"
/* for F_CMD_ARGS */
#include "fvwm/fvwm.h"
/* please don't use msg_masks_t and PipeMask outside of module_interface.c.
* They are only global to allow to access the IS_MESSAGE_SELECTED macro without
* having to call a function. */
typedef struct msg_masks_t
{
unsigned long m1;
unsigned long m2;
} msg_masks_t;
/* module linked list record, only to be accessed by using the access macros
* below */
typedef struct fmodule
{
struct
{
unsigned is_cmdline_module : 1;
} xflags;
int xreadPipe;
int xwritePipe;
fqueue xpipeQueue;
msg_masks_t xPipeMask;
msg_masks_t xNoGrabMask;
msg_masks_t xSyncMask;
char *xname;
char *xalias;
} fmodule;
#define MOD_IS_CMDLINE(m) ((m)->xflags.is_cmdline_module)
#define MOD_SET_CMDLINE(m,on) ((m)->xflags.is_cmdline_module = !!(on))
typedef struct fmodule_store
{
fmodule *module;
struct fmodule_store *next;
} fmodule_store;
/* This defines the module list object */
typedef fmodule_store* fmodule_list;
/* this objects allows safe iteration over a module list */
typedef fmodule_store* fmodule_list_itr;
#define MOD_READFD(m) ((m)->xreadPipe)
#define MOD_WRITEFD(m) ((m)->xwritePipe)
#define MOD_PIPEQUEUE(m) ((m)->xpipeQueue)
#define MOD_PIPEMASK(m) ((m)->xPipeMask)
#define MOD_NAME(m) ((m)->xname)
#define MOD_ALIAS(m) ((m)->xalias)
/* this is a bit long winded to allow MAX_MESSAGE to be 32 and not get an
* integer overflow with (1 << MAX_MESSAGES) and even with
* (1<<(MAX_MESSAGES-1)) - 1 */
#define DEFAULT_MASK (MAX_MSG_MASK & ~(M_SENDCONFIG))
#define DEFAULT_XMASK (DEFAULT_XMSG_MASK)
/*
* Returns zero if the msg is not selected by the mask. Takes care of normal
* and extended messages.
*/
#define IS_MESSAGE_IN_MASK(mask, msg) \
(((msg)&M_EXTENDED_MSG) ? ((mask)->m2 & (msg)) : ((mask)->m1 & (msg)))
/*
* Returns non zero if one of the specified messages is selected for the module
*/
#define IS_MESSAGE_SELECTED(module, msg_mask) \
IS_MESSAGE_IN_MASK(&(MOD_PIPEMASK(module)), (msg_mask))
/*
* M_SENDCONFIG for modules to tell fvwm that they want to see each
* module configuration command as it is entered. Causes modconf.c to
* look at each active module, find the ones that sent M_SENDCONFIG, and
* send a copy of the command in an M_CONFIG_INFO command.
*/
/* struct to store module input data */
typedef struct fmodule_input
{
Window window;
fmodule *module;
char *command;
} fmodule_input;
/*
* Basic Module Handling Functions
*/
/* kill all modules */
void module_kill_all(void);
/* kill a module */
void module_kill(fmodule *module);
/* execute a module - full function and wraper */
/*fmodule *module_execute(F_CMD_ARGS, Bool desperate, Bool do_listen_only)*/
fmodule *do_execute_module(F_CMD_ARGS, Bool desperate, Bool do_listen_only);
/* execute module wraper, desperate mode */
fmodule *executeModuleDesperate(F_CMD_ARGS);
/*
* Basic Module Communication Functions
*/
/* send "raw" data to the module */
/* module_send(fmodule *module, unsigned long *ptr, int size); */
void PositiveWrite(fmodule *module, unsigned long *ptr, int size);
/* returns a dynamicaly allocated struct with the received data
* or NULL on error */
fmodule_input *module_receive(fmodule *module);
/* frees an input data struct */
void module_input_discard(fmodule_input *input);
/* returns true if received the "expect" string, false otherwise */
Bool module_input_expect(fmodule_input *input, char *expect);
/*
* Utility Functions
*/
/* initializes the given iterator */
void module_list_itr_init(fmodule_list_itr *itr);
/* gets the next module on the list */
fmodule *module_list_itr_next(fmodule_list_itr *itr);
/* free modules in the deathrow */
void module_cleanup(void);
/*
* Message Queue Handling Functions
*/
/* message queues */
void FlushAllMessageQueues(void);
void FlushMessageQueue(fmodule *module);
/*
* Misc Functions (should they be here?)
*/
/*
* exposed to be used by modconf.c
*/
char *skipModuleAliasToken(const char *string);
/* dead pipe signal handler - empty */
RETSIGTYPE DeadPipe(int nonsense);
#endif /* MODULE_LIST_H */
syntax highlighted by Code2HTML, v. 0.9.1