/*
 * Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
 * Copyright 2006 James Bursa <bursa@users.sourceforge.net>
 * Copyright 2010 Michael Drake <tlsa@netsurf-browser.org>
 *
 * This file is part of NetSurf, http://www.netsurf-browser.org/
 *
 * NetSurf is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * NetSurf is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * \file
 *
 * Core mouse and pointer states.
 */

#ifndef _NETSURF_MOUSE_H_
#define _NETSURF_MOUSE_H_

/**
 * Mouse state.	1 is primary mouse button (e.g. Select on RISC OS).
 *		2 is secondary mouse button (e.g. Adjust on RISC OS).
 *
 * \note click meaning is different for different front ends. On RISC
 *       OS, it is standard to act on press, so a click is fired at
 *       the same time as a mouse button is pressed. With GTK, it is
 *       standard to act on release, so a click is fired when the
 *       mouse button is released, if the operation wasn't a drag.
 *
 * \note double and triple clicks are fired alongside a
 *       BROWSER_MOUSE_CLICK_[1|2] to indicate which button is used.
 */
typedef enum browser_mouse_state {
	/** No mouse buttons pressed, May be used to indicate hover or
	 * end of drag.
	 */
	BROWSER_MOUSE_HOVER = 0,

	/** button 1 pressed */
	BROWSER_MOUSE_PRESS_1 = (1 <<  0),
	/** button 2 pressed */
	BROWSER_MOUSE_PRESS_2 = (1 <<  1),

	/** button 1 clicked. */
	BROWSER_MOUSE_CLICK_1 = (1 <<  2),
	/** button 2 clicked. */
	BROWSER_MOUSE_CLICK_2 = (1 <<  3),

	/** button double clicked */
	BROWSER_MOUSE_DOUBLE_CLICK = (1 << 4),
	/** button triple clicked */
	BROWSER_MOUSE_TRIPLE_CLICK = (1 << 5),

	/** start of button 1 drag */
	BROWSER_MOUSE_DRAG_1 = (1 << 6),
	/** start of button 2 drag */
	BROWSER_MOUSE_DRAG_2 = (1 << 7),

	/** a drag operation was started and a mouse button is still pressed */
	BROWSER_MOUSE_DRAG_ON = (1 << 8),

	/** during button 1 drag */
	BROWSER_MOUSE_HOLDING_1 = (1 << 9),
	/** during button 2 drag */
	BROWSER_MOUSE_HOLDING_2 = (1 << 10),

	/** 1st modifier key pressed (eg. Shift) */
	BROWSER_MOUSE_MOD_1 = (1 << 11),
	/** 2nd modifier key pressed (eg. Ctrl) */
	BROWSER_MOUSE_MOD_2 = (1 << 12),
	/** 3rd modifier key pressed (eg. Alt) */
	BROWSER_MOUSE_MOD_3 = (1 << 13),

	/** pointer leaving window */
	BROWSER_MOUSE_LEAVE = (1 << 14),
} browser_mouse_state;


typedef enum gui_pointer_shape {
	GUI_POINTER_DEFAULT,
	GUI_POINTER_POINT,
	GUI_POINTER_CARET,
	GUI_POINTER_MENU,
	GUI_POINTER_UP,
	GUI_POINTER_DOWN,
	GUI_POINTER_LEFT,
	GUI_POINTER_RIGHT,
	GUI_POINTER_RU,
	GUI_POINTER_LD,
	GUI_POINTER_LU,
	GUI_POINTER_RD,
	GUI_POINTER_CROSS,
	GUI_POINTER_MOVE,
	GUI_POINTER_WAIT,
	GUI_POINTER_HELP,
	GUI_POINTER_NO_DROP,
	GUI_POINTER_NOT_ALLOWED,
	GUI_POINTER_PROGRESS
} gui_pointer_shape;

/** Mouse pointer type */
typedef enum {
	BROWSER_POINTER_DEFAULT		= GUI_POINTER_DEFAULT,
	BROWSER_POINTER_POINT		= GUI_POINTER_POINT,
	BROWSER_POINTER_CARET		= GUI_POINTER_CARET,
	BROWSER_POINTER_MENU		= GUI_POINTER_MENU,
	BROWSER_POINTER_UP		= GUI_POINTER_UP,
	BROWSER_POINTER_DOWN		= GUI_POINTER_DOWN,
	BROWSER_POINTER_LEFT		= GUI_POINTER_LEFT,
	BROWSER_POINTER_RIGHT		= GUI_POINTER_RIGHT,
	BROWSER_POINTER_RU		= GUI_POINTER_RU,
	BROWSER_POINTER_LD		= GUI_POINTER_LD,
	BROWSER_POINTER_LU		= GUI_POINTER_LU,
	BROWSER_POINTER_RD		= GUI_POINTER_RD,
	BROWSER_POINTER_CROSS		= GUI_POINTER_CROSS,
	BROWSER_POINTER_MOVE		= GUI_POINTER_MOVE,
	BROWSER_POINTER_WAIT		= GUI_POINTER_WAIT,
	BROWSER_POINTER_HELP		= GUI_POINTER_HELP,
	BROWSER_POINTER_NO_DROP		= GUI_POINTER_NO_DROP,
	BROWSER_POINTER_NOT_ALLOWED	= GUI_POINTER_NOT_ALLOWED,
	BROWSER_POINTER_PROGRESS	= GUI_POINTER_PROGRESS,
	BROWSER_POINTER_AUTO
} browser_pointer_shape;


void browser_mouse_state_dump(browser_mouse_state mouse);

#endif
