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

#include "../config.h"

#ifndef _ACTION_HH_
#define _ACTION_HH_

#include "Types.hh"

#include <list>
#include <string>

class PWinObj;

//! @brief Masks used to set Action context validity.
enum ActionOk {
	KEYGRABBER_OK = (1<<1), //!< Keygrabber ok.
	FRAME_OK = (1<<2), //!< Frame title ok.
	CLIENT_OK = (1<<3), //!< Client click ok.
	ROOTCLICK_OK = (1<<4), //!< Root window click ok.
	BUTTONCLICK_OK = (1<<5), //!< Button{Press,Release} ok.
	WINDOWMENU_OK = (1<<6), //!< Ok from WindowMenu.
	ROOTMENU_OK = (1<<7), //!< Ok from RootMenu.
	FRAME_BORDER_OK  = (1<<8), //!< Frame border ok.
	SCREEN_EDGE_OK = (1<<9) //!< ScreenEdge ok.
};

enum ActionType {
	ACTION_UNSET = 0, ACTION_SET = 1, // to conform with bool values
	ACTION_TOGGLE,

	ACTION_FOCUS, ACTION_UNFOCUS,

	ACTION_GROW_DIRECTION, ACTION_MAXFILL,
	ACTION_RESIZE, ACTION_MOVE_RESIZE,
	ACTION_RAISE, ACTION_LOWER,
	ACTION_ACTIVATE_OR_RAISE,
	ACTION_CLOSE, ACTION_CLOSE_FRAME, ACTION_KILL,
	ACTION_MOVE_TO_EDGE,
	ACTION_NEXT_FRAME, ACTION_NEXT_FRAME_MRU,
	ACTION_PREV_FRAME, ACTION_PREV_FRAME_MRU,
	ACTION_FOCUS_DIRECTIONAL,
	ACTION_ACTIVATE_CLIENT_REL, ACTION_MOVE_CLIENT_REL,
	ACTION_ACTIVATE_CLIENT, ACTION_ACTIVATE_CLIENT_NUM,
	ACTION_SEND_TO_WORKSPACE, ACTION_GOTO_WORKSPACE,
	ACTION_WARP_TO_WORKSPACE, ACTION_WARP_TO_VIEWPORT,
	ACTION_SHOW_MENU, ACTION_HIDE_ALL_MENUS,
	ACTION_DETACH,	ACTION_ATTACH_MARKED,
	ACTION_ATTACH_CLIENT_IN_NEXT_FRAME, ACTION_ATTACH_CLIENT_IN_PREV_FRAME,
	ACTION_ATTACH_FRAME_IN_NEXT_FRAME, ACTION_ATTACH_FRAME_IN_PREV_FRAME,

	ACTION_VIEWPORT_MOVE_XY, ACTION_VIEWPORT_MOVE_DRAG,
	ACTION_VIEWPORT_MOVE_DIRECTION, ACTION_VIEWPORT_SCROLL,
	ACTION_VIEWPORT_GOTO,
	ACTION_FIND_CLIENT,

	ACTION_EXEC, ACTION_RELOAD, ACTION_RESTART,
	ACTION_RESTART_OTHER, ACTION_EXIT,
#ifdef MENUS
	ACTION_MENU_NEXT, ACTION_MENU_PREV, ACTION_MENU_SELECT,
	ACTION_MENU_ENTER_SUBMENU, ACTION_MENU_LEAVE_SUBMENU,

	ACTION_MENU_SUB,
	ACTION_MENU_DYN,
#endif // MENUS
	ACTION_MOVE, ACTION_GROUPING_DRAG,
	ACTION_SHOW_CMD_DIALOG,

	ACTION_NO
};

enum ActionStateType {
	ACTION_STATE_MAXIMIZED, ACTION_STATE_FULLSCREEN,
	ACTION_STATE_SHADED, ACTION_STATE_STICKY,
	ACTION_STATE_ALWAYS_ONTOP, ACTION_STATE_ALWAYS_BELOW,
	ACTION_STATE_DECOR_BORDER, ACTION_STATE_DECOR_TITLEBAR,
	ACTION_STATE_DECOR, ACTION_STATE_TITLE,
	ACTION_STATE_ICONIFIED, ACTION_STATE_TAGGED,
	ACTION_STATE_MARKED, ACTION_STATE_SKIP,
	ACTION_STATE_CFG_DENY,

	ACTION_STATE_GLOBAL_GROUPING,

	ACTION_STATE_NO
};

enum StateAction {
	STATE_SET = ACTION_SET,
	STATE_UNSET = ACTION_UNSET,
	STATE_TOGGLE = ACTION_TOGGLE
};

enum MoveResizeActionType {
	MOVE_HORIZONTAL = 1, MOVE_VERTICAL,
	RESIZE_HORIZONTAL, RESIZE_VERTICAL,
	MOVE_SNAP,
	MOVE_CANCEL, MOVE_END,
	NO_MOVERESIZE_ACTION = 0
};

enum CmdDialogAction {
	CMD_D_INSERT, CMD_D_REMOVE,
	CMD_D_CLEAR, CMD_D_EXEC, CMD_D_CLOSE,
	CMD_D_COMPLETE,
	CMD_D_CURS_NEXT, CMD_D_CURS_PREV,
	CMD_D_CURS_END, CMD_D_CURS_BEGIN,
	CMD_D_HIST_NEXT, CMD_D_HIST_PREV,
	CMD_D_NO_ACTION
};

// Action utils

namespace ActionUtil {
	inline bool needToggle(StateAction sa, bool state) {
		if (((state == true) && (sa == STATE_SET)) ||
				((state == false) && (sa == STATE_UNSET))) {
			return false;
		}
		return true;
	}
}

// Structs and Classes

class Action {
public:
	Action(void) { }
	~Action(void) { }
	
	inline uint getAction(void) const { return _action; }
	inline int getParamI(uint n) const { return _param_i[(n < 3) ? n : 0]; } 
	inline const std::string &getParamS(void) const { return _param_s; }

	inline void setAction(uint action) { _action = action; }
	inline void setParamI(uint n, int param) { _param_i[(n < 3) ? n : 0] = param; }
	inline void setParamS(const std::string param) { _param_s = param; }

private:
	uint _action;

	int _param_i[3];
	std::string _param_s;
};

class ActionEvent {
public:
	ActionEvent(void) { }
	~ActionEvent(void) { }

	inline bool isOnlyAction(uint action) const {
		if ((action_list.size() == 1) &&
				(action_list.front().getAction() == action)) {
			return true;
		}
		return false;
	}

public:	
	uint mod, sym; // event matching
	uint type, threshold; // more matching, press, release etc

	std::list<Action> action_list;
};

class ActionPerformed {
public:
	ActionPerformed(PWinObj *w, const ActionEvent &a) : wo(w), ae(a), type(0) { }
	~ActionPerformed(void) { }

	PWinObj *wo;
	const ActionEvent &ae;

	int type;
	union _event {
		XButtonEvent *button;
		XKeyEvent *key;
		XMotionEvent *motion;
		XCrossingEvent *crossing;
		XExposeEvent *expose;
	} event;
};

#endif // _ACTION_HH_


syntax highlighted by Code2HTML, v. 0.9.1