Applied Troeglazov "3dEyes**" Gerasim's patches: adds keys up and mouse wheel events support.
Thanks. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20141 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -37,12 +37,24 @@ glutKeyboardFunc(GLUTkeyboardCB keyboardFunc)
|
|||||||
gState.currentWindow->keyboard = keyboardFunc;
|
gState.currentWindow->keyboard = keyboardFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutKeyboardUpFunc(GLUTkeyboardCB keyboardUpFunc)
|
||||||
|
{
|
||||||
|
gState.currentWindow->keyboardUp = keyboardUpFunc;
|
||||||
|
}
|
||||||
|
|
||||||
void APIENTRY
|
void APIENTRY
|
||||||
glutSpecialFunc(GLUTspecialCB specialFunc)
|
glutSpecialFunc(GLUTspecialCB specialFunc)
|
||||||
{
|
{
|
||||||
gState.currentWindow->special = specialFunc;
|
gState.currentWindow->special = specialFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSpecialUpFunc(GLUTspecialCB specialUpFunc)
|
||||||
|
{
|
||||||
|
gState.currentWindow->specialUp = specialUpFunc;
|
||||||
|
}
|
||||||
|
|
||||||
void APIENTRY
|
void APIENTRY
|
||||||
glutMouseFunc(GLUTmouseCB mouseFunc)
|
glutMouseFunc(GLUTmouseCB mouseFunc)
|
||||||
{
|
{
|
||||||
@@ -135,6 +147,11 @@ glutOverlayDisplayFunc(GLUTdisplayCB displayFunc)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutJoystickFunc(GLUTjoystickCB joystickFunc, int pollInterval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void APIENTRY
|
void APIENTRY
|
||||||
glutSpaceballMotionFunc(GLUTspaceMotionCB spaceMotionFunc)
|
glutSpaceballMotionFunc(GLUTspaceMotionCB spaceMotionFunc)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
#include "glutint.h"
|
#include "glutint.h"
|
||||||
#include "glutState.h"
|
#include "glutState.h"
|
||||||
#include "glutBlocker.h"
|
#include "glutBlocker.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define MOUSE_WHEEL_UP 3
|
||||||
|
#define MOUSE_WHEEL_DOWN 4
|
||||||
|
|
||||||
/***********************************************************
|
/***********************************************************
|
||||||
* CLASS: GLUTtimer
|
* CLASS: GLUTtimer
|
||||||
@@ -222,6 +226,31 @@ processEventsAndTimeouts(void)
|
|||||||
if (!gState.windowList[i])
|
if (!gState.windowList[i])
|
||||||
continue; // window was destroyed by callback!
|
continue; // window was destroyed by callback!
|
||||||
|
|
||||||
|
if (win->keybUpEvent) {
|
||||||
|
win->keybUpEvent = false;
|
||||||
|
__glutSetWindow(win);
|
||||||
|
if (win->keyboardUp) {
|
||||||
|
gState.modifierKeys = win->modifierKeys;
|
||||||
|
win->keyboardUp(win->key, win->keyX, win->keyY);
|
||||||
|
gState.modifierKeys = ~0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!gState.windowList[i])
|
||||||
|
continue; // window was destroyed by callback!
|
||||||
|
|
||||||
|
if (win->specialUpEvent) {
|
||||||
|
win->specialUpEvent = false;
|
||||||
|
__glutSetWindow(win);
|
||||||
|
if (win->specialUp) {
|
||||||
|
gState.modifierKeys = win->modifierKeys;
|
||||||
|
win->specialUp(win->specialKey, win->specialX, win->specialY);
|
||||||
|
gState.modifierKeys = ~0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!gState.windowList[i])
|
||||||
|
continue; // window was destroyed by callback!
|
||||||
|
|
||||||
|
|
||||||
if (win->entryEvent) {
|
if (win->entryEvent) {
|
||||||
win->entryEvent = false;
|
win->entryEvent = false;
|
||||||
__glutSetWindow(win);
|
__glutSetWindow(win);
|
||||||
@@ -458,6 +487,127 @@ setModifiers:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************
|
||||||
|
* CLASS: GlutWindow
|
||||||
|
*
|
||||||
|
* FUNCTION: KeyUp
|
||||||
|
*
|
||||||
|
* DESCRIPTION: handles keyboard and special events
|
||||||
|
***********************************************************/
|
||||||
|
void GlutWindow::KeyUp(const char *s, int32 slen)
|
||||||
|
{
|
||||||
|
ulong aChar = s[0];
|
||||||
|
BGLView::KeyUp(s,slen);
|
||||||
|
|
||||||
|
BPoint p;
|
||||||
|
|
||||||
|
switch (aChar) {
|
||||||
|
case B_FUNCTION_KEY:
|
||||||
|
switch(Window()->CurrentMessage()->FindInt32("key")) {
|
||||||
|
case B_F1_KEY:
|
||||||
|
aChar = GLUT_KEY_F1;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F2_KEY:
|
||||||
|
aChar = GLUT_KEY_F2;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F3_KEY:
|
||||||
|
aChar = GLUT_KEY_F3;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F4_KEY:
|
||||||
|
aChar = GLUT_KEY_F4;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F5_KEY:
|
||||||
|
aChar = GLUT_KEY_F5;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F6_KEY:
|
||||||
|
aChar = GLUT_KEY_F6;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F7_KEY:
|
||||||
|
aChar = GLUT_KEY_F7;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F8_KEY:
|
||||||
|
aChar = GLUT_KEY_F8;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F9_KEY:
|
||||||
|
aChar = GLUT_KEY_F9;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F10_KEY:
|
||||||
|
aChar = GLUT_KEY_F10;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F11_KEY:
|
||||||
|
aChar = GLUT_KEY_F11;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_F12_KEY:
|
||||||
|
aChar = GLUT_KEY_F12;
|
||||||
|
goto specialLabel;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case B_LEFT_ARROW:
|
||||||
|
aChar = GLUT_KEY_LEFT;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_UP_ARROW:
|
||||||
|
aChar = GLUT_KEY_UP;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_RIGHT_ARROW:
|
||||||
|
aChar = GLUT_KEY_RIGHT;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_DOWN_ARROW:
|
||||||
|
aChar = GLUT_KEY_DOWN;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_PAGE_UP:
|
||||||
|
aChar = GLUT_KEY_PAGE_UP;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_PAGE_DOWN:
|
||||||
|
aChar = GLUT_KEY_PAGE_DOWN;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_HOME:
|
||||||
|
aChar = GLUT_KEY_HOME;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_END:
|
||||||
|
aChar = GLUT_KEY_END;
|
||||||
|
goto specialLabel;
|
||||||
|
case B_INSERT:
|
||||||
|
aChar = GLUT_KEY_INSERT;
|
||||||
|
specialLabel:
|
||||||
|
if (specialUp!=0) {
|
||||||
|
anyevents = specialUpEvent = true;
|
||||||
|
GetMouse(&p,&m_buttons);
|
||||||
|
specialKey = aChar;
|
||||||
|
specialX = (int)p.x;
|
||||||
|
specialY = (int)p.y;
|
||||||
|
goto setModifiers; // set the modifier variable
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keyboardUp!=0) {
|
||||||
|
anyevents = keybUpEvent = true;
|
||||||
|
GetMouse(&p,&m_buttons);
|
||||||
|
key = aChar;
|
||||||
|
keyX = (int)p.x;
|
||||||
|
keyY = (int)p.y;
|
||||||
|
setModifiers:
|
||||||
|
modifierKeys = 0;
|
||||||
|
uint32 beMod = Window()->CurrentMessage()->FindInt32("modifiers");
|
||||||
|
if(beMod & B_SHIFT_KEY)
|
||||||
|
modifierKeys |= GLUT_ACTIVE_SHIFT;
|
||||||
|
if(beMod & B_CONTROL_KEY)
|
||||||
|
modifierKeys |= GLUT_ACTIVE_CTRL;
|
||||||
|
if(beMod & B_OPTION_KEY) {
|
||||||
|
// since the window traps B_COMMAND_KEY, we'll have to settle
|
||||||
|
// for the option key.. but we need to get the raw character,
|
||||||
|
// not the Unicode-enhanced version
|
||||||
|
key = Window()->CurrentMessage()->FindInt32("raw_char");
|
||||||
|
modifierKeys |= GLUT_ACTIVE_ALT;
|
||||||
|
}
|
||||||
|
gBlock.NewEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************
|
/***********************************************************
|
||||||
* CLASS: GlutWindow
|
* CLASS: GlutWindow
|
||||||
*
|
*
|
||||||
@@ -595,6 +745,35 @@ void GlutWindow::MouseMoved(BPoint point,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************
|
||||||
|
* CLASS: GlutWindow
|
||||||
|
*
|
||||||
|
* FUNCTION: MessageReceived
|
||||||
|
*
|
||||||
|
* DESCRIPTION: handles mouse wheel events
|
||||||
|
***********************************************************/
|
||||||
|
|
||||||
|
void GlutWindow::MessageReceived(BMessage *message)
|
||||||
|
{
|
||||||
|
switch(message->what){
|
||||||
|
case B_MOUSE_WHEEL_CHANGED:
|
||||||
|
{
|
||||||
|
float shift=0;
|
||||||
|
if(message->FindFloat("be:wheel_delta_y",&shift)==B_OK) {
|
||||||
|
if(shift>0)button = MOUSE_WHEEL_UP;
|
||||||
|
if(shift<0)button = MOUSE_WHEEL_DOWN;
|
||||||
|
if(shift!=0) {
|
||||||
|
anyevents = mouseEvent = true;
|
||||||
|
gBlock.NewEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************
|
/***********************************************************
|
||||||
* CLASS: GlutWindow
|
* CLASS: GlutWindow
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -120,8 +120,10 @@ GlutWindow::GlutWindow(GlutWindow *nparent, char *name,
|
|||||||
passive = 0;
|
passive = 0;
|
||||||
entry = 0;
|
entry = 0;
|
||||||
keyboard = 0;
|
keyboard = 0;
|
||||||
|
keyboardUp = 0;
|
||||||
visibility = 0;
|
visibility = 0;
|
||||||
special = 0;
|
special = 0;
|
||||||
|
specialUp = 0;
|
||||||
windowStatus = 0;
|
windowStatus = 0;
|
||||||
|
|
||||||
// clear event counters
|
// clear event counters
|
||||||
@@ -133,9 +135,11 @@ GlutWindow::GlutWindow(GlutWindow *nparent, char *name,
|
|||||||
passiveEvent = 0;
|
passiveEvent = 0;
|
||||||
entryEvent = 0;
|
entryEvent = 0;
|
||||||
keybEvent = 0;
|
keybEvent = 0;
|
||||||
|
keybUpEvent = 0;
|
||||||
windowStatusEvent = 0; // DirectConnected() will report change in
|
windowStatusEvent = 0; // DirectConnected() will report change in
|
||||||
visState = -1; // visibility
|
visState = -1; // visibility
|
||||||
specialEvent = 0;
|
specialEvent = 0;
|
||||||
|
specialUpEvent = 0;
|
||||||
statusEvent = 0;
|
statusEvent = 0;
|
||||||
menuEvent = 0;
|
menuEvent = 0;
|
||||||
visible = true;
|
visible = true;
|
||||||
|
|||||||
@@ -31,8 +31,10 @@ class GlutWindow : public BGLView {
|
|||||||
public:
|
public:
|
||||||
GlutWindow(GlutWindow *nparent, char *name, int x, int y, int width,
|
GlutWindow(GlutWindow *nparent, char *name, int x, int y, int width,
|
||||||
int height, ulong options);
|
int height, ulong options);
|
||||||
|
|
||||||
|
virtual void MessageReceived(BMessage *message);
|
||||||
void KeyDown(const char *bytes, int32 numBytes);
|
void KeyDown(const char *bytes, int32 numBytes);
|
||||||
|
void KeyUp(const char *bytes, int32 numBytes);
|
||||||
void MouseDown(BPoint point);
|
void MouseDown(BPoint point);
|
||||||
void MouseMoved(BPoint point, uint32 transit, const BMessage *message);
|
void MouseMoved(BPoint point, uint32 transit, const BMessage *message);
|
||||||
void FrameResized(float width, float height);
|
void FrameResized(float width, float height);
|
||||||
@@ -63,8 +65,10 @@ public:
|
|||||||
GLUTpassiveCB passive; /* passive motion (x,y) */
|
GLUTpassiveCB passive; /* passive motion (x,y) */
|
||||||
GLUTentryCB entry; /* window entry/exit (state) */
|
GLUTentryCB entry; /* window entry/exit (state) */
|
||||||
GLUTkeyboardCB keyboard; /* keyboard (ASCII,x,y) */
|
GLUTkeyboardCB keyboard; /* keyboard (ASCII,x,y) */
|
||||||
|
GLUTkeyboardCB keyboardUp; /* keyboard up (ASCII,x,y) */
|
||||||
GLUTvisibilityCB visibility; /* visibility */
|
GLUTvisibilityCB visibility; /* visibility */
|
||||||
GLUTspecialCB special; /* special key */
|
GLUTspecialCB special; /* special key */
|
||||||
|
GLUTspecialCB specialUp; /* special key up */
|
||||||
GLUTwindowStatusCB windowStatus; /* window status */
|
GLUTwindowStatusCB windowStatus; /* window status */
|
||||||
|
|
||||||
bool anyevents; // were any events received?
|
bool anyevents; // were any events received?
|
||||||
@@ -75,8 +79,10 @@ public:
|
|||||||
bool passiveEvent; // call passive
|
bool passiveEvent; // call passive
|
||||||
bool entryEvent; // call entry
|
bool entryEvent; // call entry
|
||||||
bool keybEvent; // call keyboard
|
bool keybEvent; // call keyboard
|
||||||
|
bool keybUpEvent; // call keyboard
|
||||||
bool windowStatusEvent; // call visibility
|
bool windowStatusEvent; // call visibility
|
||||||
bool specialEvent; // call special
|
bool specialEvent; // call special
|
||||||
|
bool specialUpEvent; // call special
|
||||||
bool statusEvent; // menu status changed
|
bool statusEvent; // menu status changed
|
||||||
bool menuEvent; // menu selected
|
bool menuEvent; // menu selected
|
||||||
|
|
||||||
|
|||||||
@@ -123,8 +123,8 @@ static struct name_address_pair glut_functions[] = {
|
|||||||
{ "glutMenuStatusFunc", (const GLUTproc) glutMenuStatusFunc },
|
{ "glutMenuStatusFunc", (const GLUTproc) glutMenuStatusFunc },
|
||||||
{ "glutOverlayDisplayFunc", (const GLUTproc) glutOverlayDisplayFunc },
|
{ "glutOverlayDisplayFunc", (const GLUTproc) glutOverlayDisplayFunc },
|
||||||
{ "glutWindowStatusFunc", (const GLUTproc) glutWindowStatusFunc },
|
{ "glutWindowStatusFunc", (const GLUTproc) glutWindowStatusFunc },
|
||||||
// { "glutKeyboardUpFunc", (const GLUTproc) glutKeyboardUpFunc },
|
{ "glutKeyboardUpFunc", (const GLUTproc) glutKeyboardUpFunc },
|
||||||
// { "glutSpecialUpFunc", (const GLUTproc) glutSpecialUpFunc },
|
{ "glutSpecialUpFunc", (const GLUTproc) glutSpecialUpFunc },
|
||||||
// { "glutJoystickFunc", (const GLUTproc) glutJoystickFunc },
|
// { "glutJoystickFunc", (const GLUTproc) glutJoystickFunc },
|
||||||
{ "glutSetColor", (const GLUTproc) glutSetColor },
|
{ "glutSetColor", (const GLUTproc) glutSetColor },
|
||||||
{ "glutGetColor", (const GLUTproc) glutGetColor },
|
{ "glutGetColor", (const GLUTproc) glutGetColor },
|
||||||
|
|||||||
Reference in New Issue
Block a user