Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaarten Gribnau <mail@maartengribnau.com>2003-01-28 00:35:26 +0300
committerMaarten Gribnau <mail@maartengribnau.com>2003-01-28 00:35:26 +0300
commit6478b3aa942516d22201f0939aa2fd666e21c9b9 (patch)
tree61cb2a065f619f513a245131049ea3de91e25762
parent3396a234990f6c2bcc25de0b99a003d69bcc961a (diff)
Added mouse wheel support for windows.
Both gears (C and C++) projects contain an example. Maarten
-rw-r--r--intern/ghost/intern/GHOST_EventWheel.h6
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.cpp36
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.h23
-rw-r--r--intern/ghost/test/gears/GHOST_C-Test.c16
-rwxr-xr-xintern/ghost/test/gears/GHOST_Test.cpp24
5 files changed, 94 insertions, 11 deletions
diff --git a/intern/ghost/intern/GHOST_EventWheel.h b/intern/ghost/intern/GHOST_EventWheel.h
index 3a5b0130345..7776a1778db 100644
--- a/intern/ghost/intern/GHOST_EventWheel.h
+++ b/intern/ghost/intern/GHOST_EventWheel.h
@@ -40,6 +40,8 @@
/**
* Mouse wheel event.
+ * The displacement of the mouse wheel is counted in ticks.
+ * A positive value means the wheel is turned away from the user.
* @author Maarten Gribnau
* @date May 11, 2001
*/
@@ -52,8 +54,8 @@ public:
* @param type The type of this event.
* @param z The displacement of the mouse wheel.
*/
- GHOST_EventWheel(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow* window, GHOST_TInt32 z)
- : GHOST_Event(msec, type, window)
+ GHOST_EventWheel(GHOST_TUns64 msec, GHOST_IWindow* window, GHOST_TInt32 z)
+ : GHOST_Event(msec, GHOST_kEventWheel, window)
{
m_wheelEventData.z = z;
m_data = &m_wheelEventData;
diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp
index 3582554ba44..ad513372eb5 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.cpp
+++ b/intern/ghost/intern/GHOST_SystemWin32.cpp
@@ -41,14 +41,29 @@
#include <config.h>
#endif
+#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
+
#include "GHOST_SystemWin32.h"
+/*
+ * According to the docs the mouse wheel message is supported from windows 98
+ * upwards. Leaving WINVER at default value, the WM_MOUSEWHEEL message and the
+ * wheel detent value are undefined.
+ */
+#ifndef WM_MOUSEWHEEL
+#define WM_MOUSEWHEEL 0x020A
+#endif // WM_MOUSEWHEEL
+#ifndef WHEEL_DELTA
+#define WHEEL_DELTA 120 /* Value for rolling one detent */
+#endif // WHEEL_DELTA
+
#include "GHOST_Debug.h"
#include "GHOST_DisplayManagerWin32.h"
#include "GHOST_EventButton.h"
#include "GHOST_EventCursor.h"
#include "GHOST_EventKey.h"
+#include "GHOST_EventWheel.h"
#include "GHOST_TimerTask.h"
#include "GHOST_TimerManager.h"
#include "GHOST_WindowManager.h"
@@ -455,6 +470,17 @@ GHOST_EventCursor* GHOST_SystemWin32::processCursorEvent(GHOST_TEventType type,
}
+GHOST_EventWheel* GHOST_SystemWin32::processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam)
+{
+ // short fwKeys = LOWORD(wParam); // key flags
+ int zDelta = (short) HIWORD(wParam); // wheel rotation
+ zDelta /= WHEEL_DELTA;
+ // short xPos = (short) LOWORD(lParam); // horizontal position of pointer
+ // short yPos = (short) HIWORD(lParam); // vertical position of pointer
+ return new GHOST_EventWheel (getSystem()->getMilliSeconds(), window, zDelta);
+}
+
+
GHOST_EventKey* GHOST_SystemWin32::processKeyEvent(GHOST_IWindow *window, bool keyDown, WPARAM wParam, LPARAM lParam)
{
GHOST_TKey key = ((GHOST_SystemWin32*)getSystem())->convertKey(wParam, lParam);
@@ -627,6 +653,16 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
case WM_MOUSEMOVE:
event = processCursorEvent(GHOST_kEventCursorMove, window);
break;
+ case WM_MOUSEWHEEL:
+ /* The WM_MOUSEWHEEL message is sent to the focus window
+ * when the mouse wheel is rotated. The DefWindowProc
+ * function propagates the message to the window's parent.
+ * There should be no internal forwarding of the message,
+ * since DefWindowProc propagates it up the parent chain
+ * until it finds a window that processes it.
+ */
+ event = processWheelEvent(window, wParam, lParam);
+ break;
case WM_SETCURSOR:
/* The WM_SETCURSOR message is sent to a window if the mouse causes the cursor
* to move within a window and mouse input is not captured.
diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h
index 9d48c5c7cdc..a6798ee7109 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.h
+++ b/intern/ghost/intern/GHOST_SystemWin32.h
@@ -52,6 +52,7 @@
class GHOST_EventButton;
class GHOST_EventCursor;
class GHOST_EventKey;
+class GHOST_EventWheel;
class GHOST_EventWindow;
/**
@@ -196,35 +197,49 @@ protected:
* With the modifier keys, we want to distinguish left and right keys.
* Sometimes this is not possible (Windows ME for instance). Then, we want
* events generated for both keys.
+ * @param window The window receiving the event (the active window).
*/
void processModifierKeys(GHOST_IWindow *window);
/**
* Creates mouse button event.
- * @param type The type of event to create.
- * @param type The button mask of this event.
+ * @param type The type of event to create.
+ * @param window The window receiving the event (the active window).
+ * @param mask The button mask of this event.
* @return The event created.
*/
static GHOST_EventButton* processButtonEvent(GHOST_TEventType type, GHOST_IWindow *window, GHOST_TButtonMask mask);
/**
* Creates cursor event.
- * @param type The type of event to create.
+ * @param type The type of event to create.
+ * @param window The window receiving the event (the active window).
* @return The event created.
*/
static GHOST_EventCursor* processCursorEvent(GHOST_TEventType type, GHOST_IWindow *window);
/**
+ * Creates a mouse wheel event.
+ * @param window The window receiving the event (the active window).
+ * @param wParam The wParam from the wndproc
+ * @param lParam The lParam from the wndproc
+ */
+ static GHOST_EventWheel* processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam);
+
+ /**
* Creates a key event and updates the key data stored locally (m_modifierKeys).
* In most cases this is a straightforward conversion of key codes.
* For the modifier keys however, we want to distinguish left and right keys.
+ * @param window The window receiving the event (the active window).
+ * @param wParam The wParam from the wndproc
+ * @param lParam The lParam from the wndproc
*/
static GHOST_EventKey* processKeyEvent(GHOST_IWindow *window, bool keyDown, WPARAM wParam, LPARAM lParam);
/**
* Creates a window event.
* @param type The type of event to create.
- * @param window The window receiving the event.
+ * @param window The window receiving the event (the active window).
* @return The event created.
*/
static GHOST_Event* processWindowEvent(GHOST_TEventType type, GHOST_IWindow* window);
diff --git a/intern/ghost/test/gears/GHOST_C-Test.c b/intern/ghost/test/gears/GHOST_C-Test.c
index bb4ecd0082e..9fd4e155b3b 100644
--- a/intern/ghost/test/gears/GHOST_C-Test.c
+++ b/intern/ghost/test/gears/GHOST_C-Test.c
@@ -297,6 +297,7 @@ int processEvent(GHOST_EventHandle hEvent, GHOST_TUserDataPtr userData)
int cursor;
int visibility;
GHOST_TEventKeyData* keyData = NULL;
+ GHOST_TEventWheelData* wheelData = NULL;
GHOST_DisplaySetting setting;
GHOST_WindowHandle window = GHOST_GetEventWindow(hEvent);
@@ -310,6 +311,20 @@ int processEvent(GHOST_EventHandle hEvent, GHOST_TUserDataPtr userData)
case GHOST_kEventCursorMove:
break;
*/
+ case GHOST_kEventWheel:
+ {
+ wheelData = (GHOST_TEventWheelData*)GHOST_GetEventData(hEvent);
+ if (wheelData->z > 0)
+ {
+ view_rotz += 5.f;
+ }
+ else
+ {
+ view_rotz -= 5.f;
+ }
+ }
+ break;
+
case GHOST_kEventKeyUp:
break;
@@ -347,6 +362,7 @@ int processEvent(GHOST_EventHandle hEvent, GHOST_TUserDataPtr userData)
*/
sFullScreenWindow = GHOST_BeginFullScreen(shSystem, &setting,
+
FALSE /* stereo flag */);
}
else
diff --git a/intern/ghost/test/gears/GHOST_Test.cpp b/intern/ghost/test/gears/GHOST_Test.cpp
index 95fd0772269..3abdd3977eb 100755
--- a/intern/ghost/test/gears/GHOST_Test.cpp
+++ b/intern/ghost/test/gears/GHOST_Test.cpp
@@ -275,7 +275,7 @@ static void View(GHOST_IWindow* window, bool stereo, int eye = 0)
int verticalBlankingInterval = 32; // hard coded for testing purposes, display device dependant
float left, right, bottom, top;
float nearplane, farplane, zeroPlane, distance;
- float eyeSeparation = 0.62;
+ float eyeSeparation = 0.62f;
window->getClientBounds(bnds);
// viewport
@@ -314,8 +314,8 @@ static void View(GHOST_IWindow* window, bool stereo, int eye = 0)
// projection
left = -6.0;
right = 6.0;
- bottom = -4.8;
- top = 4.8;
+ bottom = -4.8f;
+ top = 4.8f;
nearplane = 5.0;
farplane = 60.0;
@@ -481,6 +481,20 @@ bool Application::processEvent(GHOST_IEvent* event)
case GHOST_kEventCursorMove:
std::cout << "GHOST_kEventCursorMove"; break;
*/
+ case GHOST_kEventWheel:
+ {
+ GHOST_TEventWheelData* wheelData = (GHOST_TEventWheelData*) event->getData();
+ if (wheelData->z > 0)
+ {
+ view_rotz += 5.f;
+ }
+ else
+ {
+ view_rotz -= 5.f;
+ }
+ }
+ break;
+
case GHOST_kEventKeyUp:
break;
@@ -678,10 +692,10 @@ int main(int /*argc*/, char** /*argv*/)
LONG lresult;
HKEY hkey = 0;
DWORD dwd = 0;
- unsigned char buffer[128];
+ //unsigned char buffer[128];
CRegKey regkey;
- DWORD keyValue;
+ //DWORD keyValue;
// lresult = regkey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable");
lresult = regkey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable",
KEY_ALL_ACCESS );