/*
* Copyright 2010 Inalogic® Inc.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License, as
* published by the Free Software Foundation; either version 2.1 or 3.0
* of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the applicable version of the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of both the GNU Lesser General Public
* License along with this program. If not, see
*
* Authored by: Jay Taoko
*
*/
#ifndef GFXEVENTSX11_H
#define GFXEVENTSX11_H
#include "GLResource.h"
#include "VirtualKeyCodesX11.h"
//--------------------------------------------------------------key_code_e
// Keyboard codes. There's also a restricted set of codes that are most
// probably supported on different platforms. Any platform dependent codes
// should be converted into these ones. There're only those codes are
// defined that cannot be represented as printable ASCII-characters.
// All printable ASCII-set can be used in a regilar C/C++ manner:
// ' ', 'A', '0' '+' and so on.
// Since the class is used for creating very simple demo-applications
// we don't need very rich possibilities here, just basic ones.
// Actually the numeric key codes are taken from the SDL library, so,
// the implementation of the SDL support does not require any mapping.
//enum eKeyCode
//{
// // ASCII set. Should be supported everywhere
// key_backspace = 8,
// key_tab = 9,
// key_clear = 12,
// key_return = 13,
// key_shift = 16,
// key_control = 17,
// key_pause = 19,
// key_escape = 27,
//
// key_space = 32,
//
// // Keypad
// key_delete = 127,
// key_kp0 = 256,
// key_kp1 = 257,
// key_kp2 = 258,
// key_kp3 = 259,
// key_kp4 = 260,
// key_kp5 = 261,
// key_kp6 = 262,
// key_kp7 = 263,
// key_kp8 = 264,
// key_kp9 = 265,
// key_kp_period = 266,
// key_kp_divide = 267,
// key_kp_multiply = 268,
// key_kp_minus = 269,
// key_kp_plus = 270,
// key_kp_enter = 271,
// key_kp_equals = 272,
//
// // Arrow-keys and stuff
// key_up = 273,
// key_down = 274,
// key_right = 275,
// key_left = 276,
// key_insert = 277,
// key_home = 278,
// key_end = 279,
// key_page_up = 280,
// key_page_down = 281,
//
// // Functional keys. You'd better avoid using
// // f11...f15 in your applications if you want
// // the applications to be portable
// key_f1 = 282,
// key_f2 = 283,
// key_f3 = 284,
// key_f4 = 285,
// key_f5 = 286,
// key_f6 = 287,
// key_f7 = 288,
// key_f8 = 289,
// key_f9 = 290,
// key_f10 = 291,
// key_f11 = 292,
// key_f12 = 293,
// key_f13 = 294,
// key_f14 = 295,
// key_f15 = 296,
//
// // The possibility of using these keys is
// // very restricted. Actually it's guaranteed
// // only in win32_api and win32_sdl implementations
// key_numlock = 300,
// key_capslock = 301,
// key_scrollock = 302,
//
// // Phew!
// end_of_key_codes
//};
namespace nux
{
const long I_ExposureMask = (1L << 15);
const long I_StructureNotifyMask = (1L << 17);
const long I_SubstructureNotifyMask = (1L << 19);
#define NUX_BackSpace NUX_VK_BACK
#define NUX_Tab NUX_VK_TAB
#define NUX_Clear NUX_VK_CLEAR
#define NUX_Enter NUX_VK_ENTER
#define NUX_Shift_L NUX_VK_SHIFT
#define NUX_Control_L NUX_VK_CONTROL
#define NUX_Alt_L NUX_VK_MENU
#define NUX_Pause NUX_VK_PAUSE
#define NUX_Caps_Lock NUX_VK_CAPITAL
#define NUX_Escape NUX_VK_ESCAPE
#define NUX_SpaceBar NUX_VK_SPACE
#define NUX_Page_Up NUX_VK_PAGE_UP
#define NUX_Page_Down NUX_VK_PAGE_DOWN
#define NUX_End NUX_VK_END
#define NUX_Home NUX_VK_HOME
#define NUX_Left NUX_VK_LEFT
#define NUX_Up NUX_VK_UP
#define NUX_Right NUX_VK_RIGHT
#define NUX_Down NUX_VK_DOWN
#define NUX_Print NUX_VK_SNAPSHOT
#define NUX_Insert NUX_VK_INSERT
#define NUX_Delete NUX_VK_DELETE
#define NUX_LWin NUX_VK_LWIN
#define NUX_RWin NUX_VK_RWIN
#define NUX_APPS NUX_VK_APPS
#define NUX_Multiply NUX_VK_MULTIPLY
#define NUX_Add NUX_VK_ADD
#define NUX_Subtract NUX_VK_SUBTRACT
#define NUX_Decimal NUX_VK_DECIMAL
#define NUX_Divide NUX_VK_DIVIDE
#define NUX_Numlock NUX_VK_NUMLOCK
#define NUX_Scroll NUX_VK_SCROLL
#define NUX_KP_ENTER (0xff00 | NUX_VK_ENTER)
#define NUX_EXT_Shift_R (0xff00 | NUX_VK_SHIFT)
#define NUX_EXT_Control_R (0xff00 | NUX_VK_CONTROL)
#define NUX_EXT_Alt_R (0xff00 | NUX_VK_MENU)
#define NUX_KP_PAGE_UP (0xff00 | NUX_VK_PAGE_UP)
#define NUX_KP_PAGE_DOWN (0xff00 | NUX_VK_PAGE_DOWN)
#define NUX_KP_END (0xff00 | NUX_VK_END)
#define NUX_KP_HOME (0xff00 | NUX_VK_HOME)
#define NUX_KP_LEFT (0xff00 | NUX_VK_LEFT)
#define NUX_KP_UP (0xff00 | NUX_VK_UP)
#define NUX_KP_RIGHT (0xff00 | NUX_VK_RIGHT)
#define NUX_KP_DOWN (0xff00 | NUX_VK_DOWN)
#define NUX_KP_INSERT (0xff00 | NUX_VK_INSERT)
#define NUX_KP_DELETE (0xff00 | NUX_VK_DELETE)
#define NUX_F1 NUX_VK_F1
#define NUX_F2 NUX_VK_F2
#define NUX_F3 NUX_VK_F3
#define NUX_F4 NUX_VK_F4
#define NUX_F5 NUX_VK_F5
#define NUX_F6 NUX_VK_F6
#define NUX_F7 NUX_VK_F7
#define NUX_F8 NUX_VK_F8
#define NUX_F9 NUX_VK_F9
#define NUX_F10 NUX_VK_F10
#define NUX_F11 NUX_VK_F11
#define NUX_F12 NUX_VK_F12
#define NUX_F13 NUX_VK_F13
#define NUX_F14 NUX_VK_F14
#define NUX_F15 NUX_VK_F15
#define NUX_F16 NUX_VK_F16
#define NUX_F17 NUX_VK_F17
#define NUX_F18 NUX_VK_F18
#define NUX_F19 NUX_VK_F19
#define NUX_F20 NUX_VK_F20
#define NUX_F21 NUX_VK_F21
#define NUX_F22 NUX_VK_F22
#define NUX_F23 NUX_VK_F23
#define NUX_F24 NUX_VK_F24
#define NUX_LEFT_MOUSE 1
#define NUX_MIDDLE_MOUSE 2
#define NUX_RIGHT_MOUSE 3
// Key States. Set in e_key_modifiers.
#define NUX_STATE_SHIFT 0x00010000
#define NUX_STATE_CAPS_LOCK 0x00020000
#define NUX_STATE_CTRL 0x00040000
#define NUX_STATE_ALT 0x00080000
#define NUX_STATE_NUMLOCK 0x00100000 // most X servers do this?
#define NUX_STATE_META 0x00400000 // correct for XFree86
#define NUX_STATE_SCROLLLOCK 0x00800000 // correct for XFree86
// These flags describe the mouse button responsible for the mouse event.
// They are valid only for the current frame.
// Go in e_mouse_state.
#define NUX_EVENT_BUTTON1_UP 0x00001000
#define NUX_EVENT_BUTTON2_UP 0x00002000
#define NUX_EVENT_BUTTON3_UP 0x00004000
#define NUX_EVENT_BUTTON1_DOWN 0x00010000
#define NUX_EVENT_BUTTON2_DOWN 0x00020000
#define NUX_EVENT_BUTTON3_DOWN 0x00040000
#define NUX_EVENT_BUTTON1 0x00010000
#define NUX_EVENT_BUTTON2 0x00020000
#define NUX_EVENT_BUTTON3 0x00040000
#define NUX_EVENT_MOUSEWHEEL 0x00080000
// These flags describe the state of the mouse buttons.
// They persist over several frame until the mouse buttons change state.
// Go in e_mouse_state.
#define NUX_STATE_BUTTON1_DOWN 0x01000000
#define NUX_STATE_BUTTON2_DOWN 0x02000000
#define NUX_STATE_BUTTON3_DOWN 0x04000000
// These flags are set if the event is a double click.
// They are valid only for the current frame.
// Go in e_mouse_state.
#define NUX_EVENT_BUTTON1_DBLCLICK 0x10000000
#define NUX_EVENT_BUTTON2_DBLCLICK 0x20000000
#define NUX_EVENT_BUTTON3_DBLCLICK 0x40000000
#define eLEFT_BUTTON NUX_EVENT_BUTTON1
#define eMIDDLE_BUTTON NUX_EVENT_BUTTON2
#define eRIGHT_BUTTON NUX_EVENT_BUTTON3
#define eLEFT_BUTTON_DOWN NUX_STATE_BUTTON1_DOWN
#define eMIDDLE_BUTTON_DOWN NUX_STATE_BUTTON2_DOWN
#define eRIGHT_BUTTON_DOWN NUX_STATE_BUTTON3_DOWN
#define NUX_WIN32_MOUSEWHEEL_DELTA 120 // 120 correspond to one notch of the mouse wheel
typedef unsigned char uchar;
typedef unsigned long ulong;
struct EventToNameStruct
{
int event;
const TCHAR *EventName;
};
enum
{
// events
NUX_NO_EVENT = 0,
NUX_MOUSE_PRESSED,
NUX_MOUSE_RELEASED,
NUX_KEYDOWN,
NUX_KEYUP,
NUX_MOUSE_MOVE,
NUX_SIZE_CONFIGURATION,
NUX_WINDOW_CONFIGURATION,
NUX_WINDOW_ENTER_FOCUS,
NUX_WINDOW_EXIT_FOCUS,
NUX_WINDOW_DIRTY,
NUX_WINDOW_MOUSELEAVE,
NUX_MOUSEWHEEL,
NUX_DESTROY_WINDOW,
NUX_TERMINATE_APP
};
typedef struct IEvent
{
int width, height;
unsigned int ascii_code;
int virtual_code;
bool IsLeftMouseDown;
bool IsRightMouseDown;
bool IsMiddleMouseDown;
int e_x,
e_y,
e_x_root,
e_y_root,
e_dx,
e_dy,
e_clicks,
e_is_click,
e_keysym;
int e_wheeldelta;
unsigned long e_key_modifiers; // key modifiers
unsigned short e_key_repeat_count; // number of time a key is repeated;
unsigned long e_mouse_state;
char *e_text;
int e_length;
unsigned long e_event;
IEvent()
{
IsLeftMouseDown = false;
IsRightMouseDown = false;
IsMiddleMouseDown = false;
e_text = (char *) "";
for (int i = 0; i < NUX_MAX_VK; i++)
{
VirtualKeycodeState[i] = 0;
}
ascii_code = 0;
virtual_code = 0;
e_key_modifiers = 0;
e_key_repeat_count = 0;
e_mouse_state = 0;
e_x = 0;
e_y = 0;
e_x_root = 0;
e_y_root = 0;
e_dx = 0;
e_dy = 0;
e_clicks = 0;
e_is_click = 0;
e_keysym = 0;
e_wheeldelta = 0;
//Application = 0;
}
int event_x() const
{
return e_x;
}
int event_y() const
{
return e_y;
}
int event_x_root() const
{
return e_x_root;
}
int event_y_root() const
{
return e_y_root;
}
int event_dx() const
{
return e_dx;
}
int event_dy() const
{
return e_dy;
}
void get_mouse (int &, int &);
unsigned long event_key_state() const
{
return e_key_modifiers;
}
unsigned long event_mouse_state() const
{
return e_mouse_state;
}
//! Return virtual key code of the key that has triggered the last event.
/*!
Return virtual key code of the key that has triggered the last event.
@return the virtual key code.
*/
unsigned long event_keysym() const
{
return e_keysym;
}
unsigned short event_key_auto_repeat_count() const
{
return e_key_repeat_count;
}
bool event_is_key_auto_repeat() const
{
if (e_key_repeat_count > 1)
return true;
return false;
}
const char *event_text() const
{
return e_text;
}
// Because an event is save in e_event instead of calling immediately the handling function,
// we must clear the previous event each time before we test for new event in Gfx_OpenGLImpl::get_event.
void Reset()
{
e_event = NUX_NO_EVENT;
e_text = (char *) "";
e_keysym = 0;
e_key_repeat_count = 0;
e_wheeldelta = 0;
}
unsigned long VirtualKeycodeState[NUX_MAX_VK];
//! Return the state of the Virtual key
/*!
Return the state of the Virtual key.
@param VirtualKey virtual key code.
@return 1 if the key is pressed, 0 if the key is released.
*/
unsigned long GetVirtualKeyState (unsigned long VirtualKey) const
{
if (VirtualKey >= NUX_MAX_VK)
return 0;
if (VirtualKey <= 0)
return 0;
return VirtualKeycodeState[VirtualKey];
}
//void* Application;
} IEvent;
}
#endif // GFXEVENTSX11_H