/*--------------------------------*/
/* a simple dockapp library       */
/* made from scratch              */
/*--------------------------------*/

/*
	functions were written by following People:

		--- linked list
		Kresten Krab Thorup
		Alfredo K. Kojima

		--- built-in Dock module for WindowMaker
		Alfredo K. Kojima

		---	wmgeneral (taken from wmppp)
		Martijn Pieterse (pieterse@xs4all.nl)

		--- prefs routines
		Tomasz M±ka
*/


#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
# define INLINE inline
#else
# define INLINE
#endif

typedef struct LinkedList {
  void *head;
  struct LinkedList *tail;
} LinkedList;

INLINE LinkedList* list_cons(void* head, LinkedList* tail);

INLINE int list_length(LinkedList* list);

INLINE void* list_nth(int index, LinkedList* list);

INLINE void list_remove_head(LinkedList** list);

INLINE LinkedList *list_remove_elem(LinkedList* list, void* elem);

INLINE void list_mapcar(LinkedList* list, void(*function)(void*));

INLINE LinkedList*list_find(LinkedList* list, void* elem);

INLINE void list_free(LinkedList* list);


extern void parse_command(char *, char ***, int *);

extern pid_t execCommand(char *);


  /***********/
 /* Defines */
/***********/

#define MAX_MOUSE_REGION (8)

  /************/
 /* Typedefs */
/************/

typedef struct _rckeys rckeys;

struct _rckeys {
	const char	*label;
	char		**var;
};

typedef struct {
	Pixmap			pixmap;
	Pixmap			mask;
	XpmAttributes	attributes;
} XpmIcon;

  /*******************/
 /* Global variable */
/*******************/

Display		*display;
Window		Root;
int			d_depth;
GC			NormalGC;
XpmIcon		wmgen;
Window		iconwin, win;

  /***********************/
 /* Function Prototypes */
/***********************/

void AddMouseRegion(int index, int left, int top, int right, int bottom);
int CheckMouseRegion(int x, int y);

void openXwindow(int argc, char *argv[], char **, char *, int, int);
void RedrawWindow(void);
void RedrawWindowXY(int x, int y);

void copyXPMArea(int, int, int, int, int, int);
void copyXBMArea(int, int, int, int, int, int);
void setMaskXY(int, int);

void parse_rcfile(const char *, rckeys *);


#define P_READ			1
#define P_WRITE			2

#define null_char		'\0'
#define crlf_char		'\n'
#define slash 			"/"

#define MAX_LINE_LEN	512
#define MAX_VALUE_LEN	256

#define MAX_PATH 		1024

char* p_getfilename_config (char *config_dir, char *config_filename);
void* p_prefs_openfile (char *filename, int openmode);
void p_prefs_closefile (void);
void p_prefs_put_int (char *tagname, int value);
void p_prefs_put_float (char *tagname, float value);
void p_prefs_put_string (char *tagname, char *value);
void p_prefs_put_lf (void);
void p_prefs_put_comment (char *comment);
int p_prefs_get_int (char *tagname);
float p_prefs_get_float (char *tagname);
char* p_prefs_get_string (char *tagname);