/* -*-c-*- */
/* Copyright (C) 2001  Olivier Chapuis */

#ifndef _EWMH_INTERN_
#define _EWMH_INTERN_

/* Extended window manager hints support */

/* #define EWMH_DEBUG */
#ifdef EWMH_DEBUG
#include <stdarg.h>
#include <sys/times.h>
#include "ftime.h"
#endif

#define EWMH_CMD_ARGS FvwmWindow *fw, XEvent *ev, window_style *style, \
	unsigned long any

typedef struct ewmh_atom
{
	char *name;
	Atom atom;
	Atom atom_type;
#ifdef __STDC__
	int (*action)(EWMH_CMD_ARGS);
#else
	int (*action)();
#endif
} ewmh_atom;

typedef enum
{
	EWMH_ATOM_LIST_ALL,
	EWMH_ATOM_LIST_CLIENT_ROOT,
	EWMH_ATOM_LIST_CLIENT_WIN,
	EWMH_ATOM_LIST_WM_STATE,
	EWMH_ATOM_LIST_ALLOWED_ACTIONS,
	EWMH_ATOM_LIST_WINDOW_TYPE,
	EWMH_ATOM_LIST_FIXED_PROPERTY,
	EWMH_ATOM_LIST_PROPERTY_NOTIFY,
	EWMH_ATOM_LIST_FVWM_ROOT,
	EWMH_ATOM_LIST_FVWM_WIN,
	EWMH_ATOM_LIST_END
} ewmh_atom_list_name;

typedef struct
{
	ewmh_atom_list_name name;
	ewmh_atom      *list;
	int size;
} ewmh_atom_list;

#define NET_WM_STATE_ADD       1
#define NET_WM_STATE_REMOVE    0
#define NET_WM_STATE_TOGGLE    2

#define EWMH_MAXIMIZE_HORIZ      0x1
#define EWMH_MAXIMIZE_VERT       0x2
#define EWMH_MAXIMIZE_FULL       0x3
#define EWMH_MAXIMIZE_REMOVE     0x4
#define EWMH_MAXIMIZE_FULLSCREEN 0x8
typedef enum
{
	_NET_WM_MOVERESIZE_SIZE_TOPLEFT,
	_NET_WM_MOVERESIZE_SIZE_TOP,
	_NET_WM_MOVERESIZE_SIZE_TOPRIGHT,
	_NET_WM_MOVERESIZE_SIZE_RIGHT,
	_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT,
	_NET_WM_MOVERESIZE_SIZE_BOTTOM,
	_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT,
	_NET_WM_MOVERESIZE_SIZE_LEFT,
	_NET_WM_MOVERESIZE_MOVE,
	_NET_WM_MOVERESIZE_SIZE_KEYBOARD,
	_NET_WM_MOVERESIZE_MOVE_KEYBOARD
} ewmh_move_resize;

typedef struct ewmh_info
{
	unsigned NumberOfDesktops;
	unsigned MaxDesktops;
	unsigned CurrentNumberOfDesktops;
	Bool NeedsToCheckDesk;
	ewmh_strut BaseStrut;
} ewmhInfo;

extern ewmhInfo ewmhc;


ewmh_atom *ewmh_GetEwmhAtomByAtom(Atom atom, ewmh_atom_list_name list_name);
void ewmh_ChangeProperty(
	Window w, const char *atom_name, ewmh_atom_list_name list,
	unsigned char *data, int length);
void ewmh_DeleteProperty(
	Window w, const char *atom_name, ewmh_atom_list_name list);
void *ewmh_AtomGetByName(
	Window win, const char *atom_name, ewmh_atom_list_name list,
	int *size);

int ewmh_HandleDesktop(EWMH_CMD_ARGS);
int ewmh_HandleDialog(EWMH_CMD_ARGS);
int ewmh_HandleDock(EWMH_CMD_ARGS);
int ewmh_HandleMenu(EWMH_CMD_ARGS);
int ewmh_HandleNormal(EWMH_CMD_ARGS);
int ewmh_HandleToolBar(EWMH_CMD_ARGS);

void ewmh_AddToKdeSysTray(FvwmWindow *fw);
void ewmh_SetWorkArea(void);
void ewmh_ComputeAndSetWorkArea(void);
void ewmh_HandleDynamicWorkArea(void);
void ewmh_HandleWindowType(FvwmWindow *fw, window_style *style);

int ewmh_CurrentDesktop(EWMH_CMD_ARGS);
int ewmh_DesktopGeometry(EWMH_CMD_ARGS);
int ewmh_DesktopViewPort(EWMH_CMD_ARGS);
int ewmh_NumberOfDesktops(EWMH_CMD_ARGS);

int ewmh_ActiveWindow(EWMH_CMD_ARGS);
int ewmh_CloseWindow(EWMH_CMD_ARGS);
int ewmh_MoveResizeWindow(EWMH_CMD_ARGS);
int ewmh_RestackWindow(EWMH_CMD_ARGS);
int ewmh_WMDesktop(EWMH_CMD_ARGS);
int ewmh_MoveResize(EWMH_CMD_ARGS);

int ewmh_WMState(EWMH_CMD_ARGS);
int ewmh_WMStateFullScreen(EWMH_CMD_ARGS);
int ewmh_WMStateHidden(EWMH_CMD_ARGS);
int ewmh_WMStateMaxHoriz(EWMH_CMD_ARGS);
int ewmh_WMStateMaxVert(EWMH_CMD_ARGS);
int ewmh_WMStateModal(EWMH_CMD_ARGS);
int ewmh_WMStateShaded(EWMH_CMD_ARGS);
int ewmh_WMStateSkipPager(EWMH_CMD_ARGS);
int ewmh_WMStateSkipTaskBar(EWMH_CMD_ARGS);
int ewmh_WMStateStaysOnTop(EWMH_CMD_ARGS);
int ewmh_WMStateStaysOnBottom(EWMH_CMD_ARGS);
int ewmh_WMStateSticky(EWMH_CMD_ARGS);

int ewmh_WMIconGeometry(EWMH_CMD_ARGS);
int ewmh_WMStrut(EWMH_CMD_ARGS);

Bool ewmh_AllowsYes(EWMH_CMD_ARGS);
Bool ewmh_AllowsClose(EWMH_CMD_ARGS);
Bool ewmh_AllowsFullScreen(EWMH_CMD_ARGS);
Bool ewmh_AllowsMinimize(EWMH_CMD_ARGS);
Bool ewmh_AllowsMaximize(EWMH_CMD_ARGS);
Bool ewmh_AllowsMove(EWMH_CMD_ARGS);
Bool ewmh_AllowsResize(EWMH_CMD_ARGS);

/* ewmh_icon */
int ewmh_WMIcon(EWMH_CMD_ARGS);
CARD32 *ewmh_SetWmIconFromPixmap(
	FvwmWindow *fw, CARD32 *orig_icon, int *orig_size,
	Bool is_mini_icon);

/* debugging */
#ifdef EWMH_DEBUG
void  EWMH_DLOG(char *msg, ...);
#else

#endif

#endif /* _EWMH_INTERN_ */


syntax highlighted by Code2HTML, v. 0.9.1