//
// Atoms.hh for pekwm
// Copyright (C) 2003-2004 Claes Nasten <pekdon{@}pekdon{.}net>
//
// This program is licensed under the GNU GPL.
// See the LICENSE file for more information.
//

#include "../config.h"

#ifndef _ATOMS_HH_
#define _ATOMS_HH_

#include "Types.hh"

#include <string>
#include <map>

extern "C" {
#include <X11/Xlib.h>
#include <X11/Xatom.h>
}

// pekwm Atom Names
enum PekwmAtomName {
	PEKWM_FRAME_ID,
	PEKWM_FRAME_DECOR,
	PEKWM_FRAME_SKIP,
	PEKWM_FRAME_VPOS
};

// ICCCM Atom Names
enum IcccmAtomName {
	WM_STATE, WM_CHANGE_STATE,
	WM_PROTOCOLS, WM_DELETE_WINDOW,
	WM_COLORMAP_WINDOWS, WM_TAKE_FOCUS,
	WM_WINDOW_ROLE
};

// Ewmh Atom Names
enum EwmhAtomName {
	NET_SUPPORTED,
	NET_CLIENT_LIST, NET_CLIENT_LIST_STACKING,
	NET_NUMBER_OF_DESKTOPS,
	NET_DESKTOP_GEOMETRY, NET_DESKTOP_VIEWPORT,
	NET_CURRENT_DESKTOP, NET_ACTIVE_WINDOW,
	NET_WORKAREA, NET_DESKTOP_LAYOUT,
	NET_SUPPORTING_WM_CHECK,
	NET_CLOSE_WINDOW,
	NET_WM_NAME, NET_WM_DESKTOP,
	NET_WM_STRUT,

	WINDOW_TYPE,
	WINDOW_TYPE_DESKTOP, WINDOW_TYPE_DOCK,
	WINDOW_TYPE_TOOLBAR, WINDOW_TYPE_MENU,
	WINDOW_TYPE_UTILITY, WINDOW_TYPE_SPLASH,
	WINDOW_TYPE_DIALOG, WINDOW_TYPE_NORMAL,

	STATE,
	STATE_MODAL, STATE_STICKY,
	STATE_MAXIMIZED_VERT, STATE_MAXIMIZED_HORZ,
	STATE_SHADED,
	STATE_SKIP_TASKBAR, STATE_SKIP_PAGER,
	STATE_HIDDEN, STATE_FULLSCREEN,
	STATE_ABOVE, STATE_BELOW,

	EWMH_ALLOWED_ACTIONS,
	EWMH_ACTION_MOVE, EWMH_ACTION_RESIZE,
	EWMH_ACTION_MINIMIZE, EWMH_ACTION_SHADE,
	EWMH_ACTION_STICK,
	EWHM_ACTION_MAXIMIZE_VERT, EWMH_ACTION_MAXIMIZE_HORZ,
	EWMH_ACTION_FULLSCREEN, ACTION_CHANGE_DESKTOP,
	EWMH_ACTION_CLOSE
};

// pekwm stuff
class PekwmAtoms {
public:
	PekwmAtoms(void);
	~PekwmAtoms(void);

	static PekwmAtoms* instance(void) { return _instance; }

	inline Atom getAtom(PekwmAtomName name) const {
		std::map<PekwmAtomName, Atom>::const_iterator it = _atoms.find(name);
		if (it != _atoms.end())
			return it->second;
		return None;
	}

private:
	std::map<PekwmAtomName, Atom> _atoms;

	static PekwmAtoms *_instance;
};

// ICCCM stuff
class IcccmAtoms {
public:
	IcccmAtoms(void);
	~IcccmAtoms(void);

	static IcccmAtoms* instance(void) { return _instance; }

	inline Atom getAtom(IcccmAtomName name) const {
		std::map<IcccmAtomName, Atom>::const_iterator it = _atoms.find(name);
		if (it != _atoms.end())
			return it->second;
		return None;
	}

private:
	std::map<IcccmAtomName, Atom> _atoms;

	static IcccmAtoms *_instance;
};

// Extended WM Hints
class EwmhAtoms {
public:
	EwmhAtoms(void);
	~EwmhAtoms();

	static EwmhAtoms* instance(void) { return _instance; }

	inline uint size(void) const { return _atoms.size(); }
	inline Atom getAtom(EwmhAtomName name) const {
		std::map<EwmhAtomName, Atom>::const_iterator it = _atoms.find(name);
		if (it != _atoms.end())
			return it->second;
		return None;
	}

	Atom* getAtomArray(void) const;

private:
	std::map<EwmhAtomName, Atom> _atoms;

	static EwmhAtoms *_instance;
};

namespace AtomUtil {

	ulong getProperty(Window win, Atom atom, Atom type, ulong expected, uchar** data);

	void setAtom(Window win, Atom atom, Atom value);

	void setAtoms(Window win, Atom atom, Atom *values, int size);

	void setWindow(Window win, Atom atom, Window value);

	void setWindows(Window win, Atom atom, Window *values, int size);

	bool getLong(Window win, Atom atom, long &value);
	void setLong(Window win, Atom atom, long value);

	bool getString(Window win, Atom atom, std::string &value);
	void setString(Window win, Atom atom, const std::string &value);

	bool getPosition(Window win, Atom atom, int &x, int &y);
	void setPosition(Window win, Atom atom, int x, int y);

	void *getEwmhPropData(Window win, Atom prop, Atom type, int &num);

	void unsetProperty(Window win, Atom prop);
}

#endif // _FONT_HH_


syntax highlighted by Code2HTML, v. 0.9.1