#include <X11/Xlib.h>
#include <X11/Xutil.h>
#ifdef SHAPE
#include <X11/extensions/shape.h>
#endif

/* user customizable settings --------------------------------------------- */ 

// Misc options
#define EDGE_RESISTANCE 75
#define STRFTIME_STRING "%Y-%m-%d %H:%M"
#define DEF_NEW1 "rxvt || xterm &"
#define F1_STRING "rxvt || xterm &"
#define F2_STRING "xemacs || emacs &"
#define F3_STRING "netscape &"  
#define DEF_FONT "Lucidasans-Bold-10"

// Descent bright default colorset
#define TITLE_BG "grey"
#define TITLE_FG "black"
#define TITLE_FOCUS_BG "black"
#define TITLE_FOCUS_FG "white"
#define BORDER_COLOR "black"
#define TASKBAR_BG "grey"
#define TASKBAR_FOCUS_FG "black"
#define TASKBAR_HIDDEN_FG "grey50"
#define TASKBAR_NORMAL_FG "black"

/* Internal settings -- dont touch! ---------------------------------------- */

#define DEF_BW 2
#define SPACE 3
#define MINSIZE	15
#define USE_TASKBAR 1
#define MAX_CLIENTS_ON_TASKBAR 20
#define TASKBAR_HEIGHT (font->ascent + font->descent + 4*SPACE)
#define MIN(x,y) (if x<y ? x : y)
#ifdef DEBUG
#define debug(x) printf(x)
#else
#define debug(x) ;
#endif
#define ChildMask (SubstructureRedirectMask|SubstructureNotifyMask)
#define ButtonMask (ButtonPressMask|ButtonReleaseMask)
#define MouseMask (ButtonMask|PointerMotionMask)

#define streq(s1, s2) \
	(strcmp(s1, s2) == 0)
#define theight(c) \
	(iheight + opt_bw)
#define grab(w, mask, curs) \
	(XGrabPointer(dpy, w, False, mask, GrabModeAsync, GrabModeAsync, \
	None, curs, CurrentTime) == GrabSuccess)
#define ungrab() \
	XUngrabPointer(dpy, CurrentTime)
#define setmouse(w, x, y) \
	XWarpPointer(dpy, None, w, 0, 0, 0, 0, x, y)

/* client structure */

typedef struct _Client Client;

struct _Client {
	Client *next;
	Client *prev;
	Window window;
	Window parent;
	Window trans;
	Colormap cmap;
	XSizeHints *size;
	char *name;
	char *barname;
	int ignore_unmap;
	int x;
	int y;
	int width;
	int height;
	int minimized;
	int left_offset;
	int right_offset;
	int maximized;
	int shaded;
	int stored_x;
	int stored_y;
	int stored_width;
	int stored_height;
	int title;
};

/* declarations for global variables in main.c */

extern Display *dpy;
extern Display *child_dpy;
extern int screen;
extern Window root;
extern Window taskbar;
extern GC invert_gc;
extern GC string_gc;
extern GC focus_string_gc;
extern GC hidden_string_gc;
extern GC normal_string_gc;
extern GC focus_bg_gc;
extern GC focus_fg_gc;
extern GC border_gc;
extern GC taskbar_focus_fg_gc;
extern GC taskbar_bg_gc;
XColor fg, bg, bd, focus_bg, focus_fg, normal_fg, taskbar_bg, taskbar_focus_fg;
extern XFontStruct *font;
extern int iheight;
extern int current_desk;
extern XColor fg, bg, bd;
extern Client *head_client;
extern Atom xa_wm_state;
extern Atom xa_wm_change_state;
extern Atom xa_wm_protos;
extern Atom xa_wm_delete;
extern Atom xa_wm_cmapwins;
extern Cursor move_curs;
extern Cursor resize_curs;
extern char *opt_display;
extern char *opt_font;
extern char *opt_focus_fg;
extern char *opt_focus_bg;
extern char *opt_fg;
extern char *opt_bg;
extern char *opt_bd;
extern char *opt_new2;
extern char *opt_new1;
extern char *opt_taskbar_bg;
extern char *opt_taskbar_focus_fg;
extern int opt_bw;
extern Client *focused_client;
#ifdef SHAPE 
extern Bool shape;
extern int shape_event;
#endif

/* client.c */

Client *find_client(Window w, int from_parent);
int send_xmessage(Window w, Atom a, long x);
int wm_state(Client *c);
void redraw(Client *c);
void remove_client(Client *c, int from_cleanup);
void send_config(Client *c);
void send_wm_delete(Client *c);
void set_shape(Client *c);
void set_wm_state(Client *c, int state);

/* events.c */

void handle_keypress_event(XKeyEvent *e);
void handle_button_event(XButtonEvent *e);
void handle_client_message(XClientMessageEvent *e);
void handle_colormap_change(XColormapEvent *e);
void handle_configure_request(XConfigureRequestEvent *e);
void handle_enter_event(XCrossingEvent *e);
void handle_expose_event(XExposeEvent *e);
void handle_map_request(XMapRequestEvent *e);
void handle_property_change(XPropertyEvent *e);
void handle_reparent_event(XReparentEvent *e);
void handle_unmap_event(XUnmapEvent *e);

/* main.c */

int main(int argc, char *argv[]);
void scan_windows();
void setup_display();

/* taskbar.c */

void draw_bartime(char *thestring);
void start_taskbar(void);
void taskbar_start(void);
void draw_tasks (void);
void dec_barname(Client *c);
int find_width(void);
int count_tasks(void);
Client * next_non_minimized(Client *c);
Client * find_client_with_longest_name(void);

/* misc.c */

int handle_xerror(Display *dpy, XErrorEvent *e);
void do_event_loop();
void dump_clients();
void err(char *fmt, ...);
void quit_nicely();
void show_event(XEvent e);

/* new.c */

void init_position(Client *c);
void initialize(Client *c, Window w);
void make_new_client(Window w);
void reparent(Client *c);

/* screen.c */

void drag(Client *c);
void draw_outline(Client *c);
void get_mouse_position(int *x, int *y);
void hide(Client *c);
void move(Client *c);
void recalculate_sweep(Client *c, int x1, int y1, int x2, int y2);
void resize(Client *c);
void sweep(Client *c);
void unhide(Client *c);


syntax highlighted by Code2HTML, v. 0.9.1