|
From: <axl...@us...> - 2009-12-22 16:08:59
|
Revision: 632
http://hgengine.svn.sourceforge.net/hgengine/?rev=632&view=rev
Author: axlecrusher
Date: 2009-12-22 16:08:48 +0000 (Tue, 22 Dec 2009)
Log Message:
-----------
add windows mouse handling
Modified Paths:
--------------
Mercury2/src/MercuryWindow.cpp
Mercury2/src/MercuryWindow.h
Mercury2/src/Win32Window.cpp
Mercury2/src/Win32Window.h
Mercury2/src/X11Window.cpp
Mercury2/src/X11Window.h
Modified: Mercury2/src/MercuryWindow.cpp
===================================================================
--- Mercury2/src/MercuryWindow.cpp 2009-12-21 20:08:27 UTC (rev 631)
+++ Mercury2/src/MercuryWindow.cpp 2009-12-22 16:08:48 UTC (rev 632)
@@ -2,7 +2,7 @@
MercuryWindow::MercuryWindow(const MString& title, int width, int height, int bits, int depthBits, bool fullscreen)
:m_title(title), m_width(width), m_height(height), m_bits(bits), m_depthBits(depthBits), m_fullscreen(fullscreen),
- m_bGrabbed(true)
+ m_bGrabbed(true),m_iLastMouseX(0),m_iLastMouseY(0),m_inFocus(false)
{
}
Modified: Mercury2/src/MercuryWindow.h
===================================================================
--- Mercury2/src/MercuryWindow.h 2009-12-21 20:08:27 UTC (rev 631)
+++ Mercury2/src/MercuryWindow.h 2009-12-22 16:08:48 UTC (rev 632)
@@ -34,6 +34,9 @@
void SetGrabbedMouseMode( bool bGrabbed ) { m_bGrabbed = bGrabbed; }
bool GetGrabbedMouseMode( ) { return m_bGrabbed; }
+
+ inline bool InFocus() const { return m_inFocus; }
+
protected:
static Callback0R< MercuryWindow* > genWindowClbk;
static MercuryWindow* m_windowInstance;
@@ -43,6 +46,11 @@
uint8_t m_bits, m_depthBits;
bool m_fullscreen;
bool m_bGrabbed;
+
+ int m_iLastMouseX;
+ int m_iLastMouseY;
+
+ bool m_inFocus;
};
#endif
Modified: Mercury2/src/Win32Window.cpp
===================================================================
--- Mercury2/src/Win32Window.cpp 2009-12-21 20:08:27 UTC (rev 631)
+++ Mercury2/src/Win32Window.cpp 2009-12-22 16:08:48 UTC (rev 632)
@@ -1,9 +1,11 @@
#include <Win32Window.h>
+//#include <Windowsx.h>
#include <GLHeaders.h>
-#include <MercuryInput.h>
+#include <MercuryInput.h>
LRESULT CALLBACK WindowCallback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //Window callback
Callback0R< MercuryWindow* > MercuryWindow::genWindowClbk(Win32Window::GenWin32Window); //Register window generation callback
+bool ACTIVE = false;
MercuryWindow* Win32Window::GenWin32Window()
{
@@ -20,8 +22,8 @@
}
Win32Window::Win32Window(const MString& title, int width, int height, int bits, int depthBits, bool fullscreen)
- :m_hwnd(NULL), m_hdc(NULL), m_hglrc(NULL), m_hInstance(NULL), m_className(NULL), m_windowAtom(NULL), m_winTitle(NULL),
- MercuryWindow(title, width, height, bits, depthBits, fullscreen)
+ :m_hwnd(NULL), m_hdc(NULL), m_hglrc(NULL), m_hInstance(NULL), m_className(NULL), m_windowAtom(NULL), m_winTitle(NULL),m_cX(0),
+ m_cY(0),MercuryWindow(title, width, height, bits, depthBits, fullscreen)
{
m_className = (WCHAR*)StringToLPCTSTR("Mercury Render Window");
m_winTitle = (WCHAR*)StringToLPCTSTR(title);
@@ -191,44 +193,62 @@
{
MSG message;
+ if ( InFocus() != ACTIVE )
+ {
+ m_inFocus = ACTIVE;
+ ShowCursor(!m_inFocus);
+ PointerToCenter();
+ }
+
while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
- switch( message.message )
+ if ( InFocus() )
{
- case WM_QUIT:
- return false;
- case WM_KEYDOWN:
+ switch( message.message )
{
- if ( IsKeyRepeat(message.lParam) ) break;
-// printf( "%d\n", message.lParam>>16 );
- KeyboardInput::ProcessKeyInput( ConvertScancode( message.lParam ), true, false);
- }
- break;
- case WM_KEYUP:
- {
- if ( IsKeyRepeat(message.lParam) ) break;
-// printf( "%d\n", message.lParam>>16 );
- KeyboardInput::ProcessKeyInput( ConvertScancode( message.lParam ), false, false);
- }
- break;
- case WM_MOUSEMOVE:
- break;
- case WM_LBUTTONDOWN:
- break;
- case WM_LBUTTONUP:
- break;
- case WM_RBUTTONDOWN:
- break;
- case WM_RBUTTONUP:
- break;
- case WM_MBUTTONDOWN:
- break;
- case WM_MBUTTONUP:
- break;
- case 0x020A: //Do nothing (at least now) It's a mouse wheel!
- break;
+ case WM_KEYDOWN:
+ {
+ if ( IsKeyRepeat(message.lParam) ) break;
+ KeyboardInput::ProcessKeyInput( ConvertScancode( message.lParam ), true, false);
+ }
+ break;
+ case WM_KEYUP:
+ {
+ if ( IsKeyRepeat(message.lParam) ) break;
+ KeyboardInput::ProcessKeyInput( ConvertScancode( message.lParam ), false, false);
+ }
+ break;
+ case WM_MOUSEMOVE:
+ {
+ POINT pos;
+ GetCursorPos(&pos);
+ if (pos.x!=m_cX || pos.y!=m_cY) //ignore the resets to center
+ {
+ int dx = m_cX - pos.x;
+ int dy = m_cY - pos.y;
+ m_iLastMouseX += dx;
+ m_iLastMouseY += dy;
+ MouseInput::ProcessMouseInput(dx, dy, message.wParam&MK_LBUTTON, message.wParam&MK_RBUTTON, message.wParam&MK_MBUTTON, 0, 0);
+ PointerToCenter();
+ }
+ }
+ break;
+ case WM_LBUTTONDOWN:
+ break;
+ case WM_LBUTTONUP:
+ break;
+ case WM_RBUTTONDOWN:
+ break;
+ case WM_RBUTTONUP:
+ break;
+ case WM_MBUTTONDOWN:
+ break;
+ case WM_MBUTTONUP:
+ break;
+ case 0x020A: //Do nothing (at least now) It's a mouse wheel!
+ break;
+ }
}
-
TranslateMessage(&message); // Translate The Message
DispatchMessage(&message); // Dispatch The Message
}
@@ -246,127 +266,139 @@
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
}
-bool Win32Window::IsKeyRepeat(uint32_t c)
-{
-// printf("count %d\n", (c&65535));
- return (c&65535) > 1;
-}
+bool Win32Window::IsKeyRepeat(uint32_t c)
+{
+// printf("count %d\n", (c&65535));
+ return (c&65535) > 1;
+}
-short Win32Window::ConvertScancode( uint32_t scanin )
-{
-// Specifies the scan code. The value depends on the OEM.
- scanin = (scanin>>16)&511;
- switch( scanin )
- {
- case 1: return 27; //esc
- case 0: return '0';
- case 41: return 97; //`
- case 14: return 8; //backspace
- case 87: return 292; //F11
- case 88: return 293; //F12
- case 12: return 45; //-
- case 13: return 61; //=
- case 43: return 92; //backslash
- case 15: return 9; //tab
- case 58: return 15; //Caps lock
- case 42: return 160; //[lshift]
- case 54: return 161; //[rshift]
-
- case 30: return 'a';
- case 48: return 'b';
- case 46: return 'c';
- case 32: return 'd';
- case 18: return 'e';
- case 33: return 'f';
- case 34: return 'g';
- case 35: return 'h';
- case 23: return 'i';
- case 36: return 'j';
- case 37: return 'k';
- case 38: return 'l';
- case 50: return 'm';
- case 49: return 'n';
- case 24: return 'o';
- case 25: return 'p';
- case 16: return 'q';
- case 19: return 'r';
- case 31: return 's';
- case 20: return 't';
- case 22: return 'u';
- case 47: return 'v';
- case 17: return 'w';
- case 45: return 'x';
- case 21: return 'y';
- case 44: return 'z';
-
- case 39: return 59; //;
- case 40: return 39; //'
- case 51: return 44; //,
- case 52: return 46; //.
- case 53: return 47; // /
-
- case 328: return 273; //arrow keys: up
- case 331: return 276; //arrow keys: left
- case 333: return 275; //arrow keys: right
- case 336: return 274; //arrow keys: down
-//STOPPED HERE
- case 29: return 162; //left ctrl
- case 347: return 91; //left super (aka win)
- case 64: return 164; //left alt
- case 57: return 32; //space bar
- case 108: return 165; //right alt
- case 134: return 91; //right super (aka win)
- case 349: return 93; //menu
- case 285: return 268; //right control
-
- case 107: return 316; //Print Screen
- //case 78: scroll lock
- case 127: return 19; //Pause
- case 118: return 277; //Insert
- case 110: return 278; //Home
- case 112: return 280; //Page Up
- case 119: return 127; //Delete
- case 115: return 279; //End
- case 117: return 181; //Page Down
-
- //case 77: Num Lock (not mapped)
- case 106: return 267; //Keypad /
- case 63: return 268; //Keypad *
- case 82: return 269; //Keypad -
- case 79: return 263; //Keypad 7
- case 80: return 264; //Keypad 8
- case 81: return 265; //Keypad 9
- case 86: return 270; //Keypad +
- case 83: return 260; //Keypad 4
- case 84: return 261; //Keypad 5
- case 85: return 262; //Keypad 6
-// case 87: return 257; //Keypad 1
-// case 88: return 258; //Keypad 2
- case 89: return 259; //Keypad 3
-// case 36: //Enter
- case 104: return 13; //Keypad enter
- case 90: return 260; //Keypad 0
- case 91: return 266; //Keypad .
-
- default:
- // numbers
- if( scanin >= 10 && scanin <= 18 )
- return scanin + ( (short)'1' - 10 );
- // f1 -- f10
- if( scanin >= 67 && scanin <= 76 )
- return scanin + ( 282 - 67 );
- return scanin;
- }
+void Win32Window::PointerToCenter()
+{
+ RECT rect;
+ GetWindowRect(m_hwnd, &rect);
+ m_cX = rect.left+m_width/2;
+ m_cY = rect.top+m_height/2;
+ SetCursorPos(m_cX, m_cY);
}
+short Win32Window::ConvertScancode( uint32_t scanin )
+{
+// Specifies the scan code. The value depends on the OEM.
+ scanin = (scanin>>16)&511;
+ switch( scanin )
+ {
+ case 1: return 27; //esc
+ case 0: return '0';
+ case 41: return 97; //`
+ case 14: return 8; //backspace
+ case 87: return 292; //F11
+ case 88: return 293; //F12
+ case 12: return 45; //-
+ case 13: return 61; //=
+ case 43: return 92; //backslash
+ case 15: return 9; //tab
+ case 58: return 15; //Caps lock
+ case 42: return 160; //[lshift]
+ case 54: return 161; //[rshift]
+
+ case 30: return 'a';
+ case 48: return 'b';
+ case 46: return 'c';
+ case 32: return 'd';
+ case 18: return 'e';
+ case 33: return 'f';
+ case 34: return 'g';
+ case 35: return 'h';
+ case 23: return 'i';
+ case 36: return 'j';
+ case 37: return 'k';
+ case 38: return 'l';
+ case 50: return 'm';
+ case 49: return 'n';
+ case 24: return 'o';
+ case 25: return 'p';
+ case 16: return 'q';
+ case 19: return 'r';
+ case 31: return 's';
+ case 20: return 't';
+ case 22: return 'u';
+ case 47: return 'v';
+ case 17: return 'w';
+ case 45: return 'x';
+ case 21: return 'y';
+ case 44: return 'z';
+
+ case 39: return 59; //;
+ case 40: return 39; //'
+ case 51: return 44; //,
+ case 52: return 46; //.
+ case 53: return 47; // /
+
+ case 328: return 273; //arrow keys: up
+ case 331: return 276; //arrow keys: left
+ case 333: return 275; //arrow keys: right
+ case 336: return 274; //arrow keys: down
+//STOPPED HERE
+ case 29: return 162; //left ctrl
+ case 347: return 91; //left super (aka win)
+ case 64: return 164; //left alt
+ case 57: return 32; //space bar
+ case 108: return 165; //right alt
+ case 134: return 91; //right super (aka win)
+ case 349: return 93; //menu
+ case 285: return 268; //right control
+
+ case 107: return 316; //Print Screen
+ //case 78: scroll lock
+ case 127: return 19; //Pause
+ case 118: return 277; //Insert
+ case 110: return 278; //Home
+ case 112: return 280; //Page Up
+ case 119: return 127; //Delete
+ case 115: return 279; //End
+ case 117: return 181; //Page Down
+
+ //case 77: Num Lock (not mapped)
+ case 106: return 267; //Keypad /
+ case 63: return 268; //Keypad *
+ case 82: return 269; //Keypad -
+ case 79: return 263; //Keypad 7
+ case 80: return 264; //Keypad 8
+ case 81: return 265; //Keypad 9
+ case 86: return 270; //Keypad +
+ case 83: return 260; //Keypad 4
+ case 84: return 261; //Keypad 5
+ case 85: return 262; //Keypad 6
+// case 87: return 257; //Keypad 1
+// case 88: return 258; //Keypad 2
+ case 89: return 259; //Keypad 3
+// case 36: //Enter
+ case 104: return 13; //Keypad enter
+ case 90: return 260; //Keypad 0
+ case 91: return 266; //Keypad .
+
+ default:
+ // numbers
+ if( scanin >= 10 && scanin <= 18 )
+ return scanin + ( (short)'1' - 10 );
+ // f1 -- f10
+ if( scanin >= 67 && scanin <= 76 )
+ return scanin + ( 282 - 67 );
+ return scanin;
+ }
+}
+
LRESULT CALLBACK WindowCallback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
- {
- exit(1);
- }
+ exit(1);
+ break;
+ case WM_ACTIVATE:
+ ACTIVE = LOWORD(wParam)!=WA_INACTIVE;
+// return 0;
+ break;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
Modified: Mercury2/src/Win32Window.h
===================================================================
--- Mercury2/src/Win32Window.h 2009-12-21 20:08:27 UTC (rev 631)
+++ Mercury2/src/Win32Window.h 2009-12-22 16:08:48 UTC (rev 632)
@@ -17,17 +17,19 @@
static MercuryWindow* GenWin32Window();
virtual void* GetProcAddress(const MString& x);
virtual void Clear();
- static short ConvertScancode( uint32_t scanin );
+ static short ConvertScancode( uint32_t scanin );
private:
- bool IsKeyRepeat(uint32_t c);
-
+ bool IsKeyRepeat(uint32_t c);
+
void GenWindow();
void GenWinClass();
void SetPixelType();
void CreateRenderingContext();
void GenPixelType();
+ void PointerToCenter();
+
HWND m_hwnd; //window handle
HDC m_hdc; //device handle
PIXELFORMATDESCRIPTOR m_pfd; //pixel format descriptor
@@ -40,6 +42,8 @@
MScopedArray< WCHAR > m_className;
MScopedArray< WCHAR > m_winTitle;
+
+ uint16_t m_cX, m_cY;
};
#endif
Modified: Mercury2/src/X11Window.cpp
===================================================================
--- Mercury2/src/X11Window.cpp 2009-12-21 20:08:27 UTC (rev 631)
+++ Mercury2/src/X11Window.cpp 2009-12-22 16:08:48 UTC (rev 632)
@@ -231,7 +231,7 @@
bool X11Window::PumpMessages()
{
- static bool inFocus = false;
+// static bool inFocus = false;
XEvent event;
while ( XPending(m_display) > 0)
{
@@ -265,14 +265,14 @@
case FocusOut:
{
//XFocusChangeEvent*e = (XFocusChangeEvent*)&event;
- inFocus = (event.type == FocusIn);
- if (inFocus && m_bGrabbed ) XWarpPointer(m_display, None, m_window, 0,0,0,0,m_width/2,m_height/2);
+ m_inFocus = (event.type == FocusIn);
+ if (m_inFocus && m_bGrabbed ) XWarpPointer(m_display, None, m_window, 0,0,0,0,m_width/2,m_height/2);
break;
}
}
//The events below only get processed if window is in focus
- if ( !inFocus ) continue;
+ if ( !m_inFocus ) continue;
switch (event.type)
{
case ButtonPress:
Modified: Mercury2/src/X11Window.h
===================================================================
--- Mercury2/src/X11Window.h 2009-12-21 20:08:27 UTC (rev 631)
+++ Mercury2/src/X11Window.h 2009-12-22 16:08:48 UTC (rev 632)
@@ -28,9 +28,6 @@
GLXContext m_renderCtx;
Window m_window;
Atom m_wmDeleteMessage;
-
- int m_iLastMouseX;
- int m_iLastMouseY;
};
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|