1
0
Fork 0
mirror of https://github.com/gwm17/glfw.git synced 2024-11-26 12:18:51 -05:00

Begin adapting touch patch

This commit is contained in:
Quinten Lansu 2012-04-17 13:21:45 +02:00 committed by Camilla Berglund
parent a94a84b507
commit 4d2c3a547b
8 changed files with 202 additions and 0 deletions

View File

@ -133,6 +133,7 @@ skills.
- Cameron King
- Peter Knut
- Eric Larson
- Quinten Lansu
- Robin Leffmann
- Glenn Lewis
- Shane Liesegang

View File

@ -656,6 +656,7 @@ extern "C" {
#define GLFW_CURSOR 0x00033001
#define GLFW_STICKY_KEYS 0x00033002
#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003
#define GLFW_TOUCH 0x00030004
#define GLFW_CURSOR_NORMAL 0x00034001
#define GLFW_CURSOR_HIDDEN 0x00034002
@ -979,6 +980,27 @@ typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);
*/
typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**);
/*! @brief The function signature for touch start/end callbacks.
* @param[in] window The window that received the event.
* @param[in] touch The touch that started or ended.
* @param[in] action One of @ref GLFW_PRESS or @ref GLFW_RELEASE.
* @ingroup input
*
* @sa glfwSetTouchCallback
*/
typedef void (* GLFWtouchfun)(GLFWwindow*,int,int);
/*! @brief The function signature for touch position callbacks.
* @param[in] window The window that received the event.
* @param[in] touch The touch that moved.
* @param[in] xpos The new x-coordinate of the touch.
* @param[in] ypos The new y-coordinate of the touch.
* @ingroup input
*
* @sa glfwSetTouchPosCallback
*/
typedef void (* GLFWtouchposfun)(GLFWwindow*,int,double,double);
/*! @brief The function signature for monitor configuration callbacks.
*
* This is the function signature for monitor configuration callback functions.
@ -3042,6 +3064,36 @@ GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cb
*/
GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun);
/*! @brief Sets the touch start/end callback.
*
* This function sets the touch callback, which is called when a touch is
* started or ended.
*
* @param[in] window The window whose callback to set.
* @param[in] cbfun The new scroll callback, or `NULL` to remove the currently
* set callback.
* @return The previously set callback, or `NULL` if no callback was set or an
* error occurred.
*
* @ingroup input
*/
GLFWAPI GLFWtouchfun glfwSetTouchCallback(GLFWwindow* window, GLFWtouchfun cbfun);
/*! @brief Sets the touch position callback.
*
* This function sets the touch position callback, which is called when a touch
* moves.
*
* @param[in] window The window whose callback to set.
* @param[in] cbfun The new scroll callback, or `NULL` to remove the currently
* set callback.
* @return The previously set callback, or `NULL` if no callback was set or an
* error occurred.
*
* @ingroup input
*/
GLFWAPI GLFWtouchposfun glfwSetTouchPosCallback(GLFWwindow* window, GLFWtouchposfun cbfun);
/*! @brief Returns whether the specified joystick is present.
*
* This function returns whether the specified joystick is present.

View File

@ -1162,6 +1162,10 @@ void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
*ypos = contentRect.size.height - pos.y - 1;
}
void _glfwPlatformSetTouchInput(_GLFWwindow* window, int enabled)
{
}
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
{
_glfwPlatformSetCursorMode(window, window->cursorMode);

View File

@ -126,6 +126,18 @@ static void setStickyMouseButtons(_GLFWwindow* window, int enabled)
window->stickyMouseButtons = enabled;
}
// Set touch input for the specified window
//
static void setTouchInput(_GLFWwindow* window, int enabled)
{
if (window->touchInput == enabled)
return;
_glfwPlatformSetTouchInput(window, enabled);
window->touchInput = enabled;
}
//////////////////////////////////////////////////////////////////////////
////// GLFW event API //////
@ -222,6 +234,18 @@ void _glfwInputDrop(_GLFWwindow* window, int count, const char** paths)
window->callbacks.drop((GLFWwindow*) window, count, paths);
}
void _glfwInputTouch(_GLFWwindow* window, int touch, int action)
{
if (window->callbacks.touch)
window->callbacks.touch((GLFWwindow*) window, touch, action);
}
void _glfwInputTouchPos(_GLFWwindow* window, int touch, double xpos, double ypos)
{
if (window->callbacks.touchPos)
window->callbacks.touchPos((GLFWwindow*) window, touch, xpos, ypos);
}
//////////////////////////////////////////////////////////////////////////
////// GLFW public API //////
@ -241,6 +265,8 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode)
return window->stickyKeys;
case GLFW_STICKY_MOUSE_BUTTONS:
return window->stickyMouseButtons;
case GLFW_TOUCH:
return window->touchInput;
default:
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode");
return 0;
@ -264,6 +290,9 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value)
case GLFW_STICKY_MOUSE_BUTTONS:
setStickyMouseButtons(window, value ? GLFW_TRUE : GLFW_FALSE);
break;
case GLFW_TOUCH:
setTouchInput(window, value ? GLFW_TRUE : GLFW_FALSE);
break;
default:
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode");
break;
@ -579,6 +608,22 @@ GLFWAPI const char* glfwGetJoystickName(int joy)
return _glfwPlatformGetJoystickName(joy);
}
GLFWAPI GLFWtouchfun glfwSetTouchCallback(GLFWwindow* handle, GLFWtouchfun cbfun)
{
_GLFWwindow* window = (_GLFWwindow*) handle;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.touch, cbfun);
return cbfun;
}
GLFWAPI GLFWtouchposfun glfwSetTouchPosCallback(GLFWwindow* handle, GLFWtouchposfun cbfun)
{
_GLFWwindow* window = (_GLFWwindow*) handle;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(window->callbacks.touchPos, cbfun);
return cbfun;
}
GLFWAPI void glfwSetClipboardString(GLFWwindow* handle, const char* string)
{
_GLFWwindow* window = (_GLFWwindow*) handle;

View File

@ -253,6 +253,7 @@ struct _GLFWwindow
// Window input state
GLFWbool stickyKeys;
GLFWbool stickyMouseButtons;
GLFWbool touchInput;
double cursorPosX, cursorPosY;
int cursorMode;
char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
@ -289,6 +290,8 @@ struct _GLFWwindow
GLFWcharfun character;
GLFWcharmodsfun charmods;
GLFWdropfun drop;
GLFWtouchfun touch;
GLFWtouchposfun touchPos;
} callbacks;
// This is defined in the window API's platform.h
@ -406,6 +409,14 @@ void _glfwPlatformTerminate(void);
*/
const char* _glfwPlatformGetVersionString(void);
/*! @brief Sets whether touch input is enabled for the specified window.
* @param[in] window The window whose touch input status to change.
* @param[in] enabled @c GL_TRUE to enable touch input, or @c GL_FALSE to
* disable it.
* @ingroup platform
*/
void _glfwPlatformSetTouchInput(_GLFWwindow* window, int enabled);
/*! @copydoc glfwGetCursorPos
* @ingroup platform
*/
@ -774,6 +785,23 @@ void _glfwInputCursorMotion(_GLFWwindow* window, double x, double y);
*/
void _glfwInputCursorEnter(_GLFWwindow* window, int entered);
/*! @brief Notifies shared code of a touch start/end event.
* @param[in] window The window that received the event.
* @param[in] touch The touch that started or ended.
* @param[in] action One of @c GLFW_PRESS or @c GLFW_RELEASE.
* @ingroup event
*/
void _glfwInputTouch(_GLFWwindow* window, int touch, int action);
/*! @brief Notifies shared code of a touch movement event.
* @param[in] window The window that received the event.
* @param[in] touch The touch that moved.
* @param[in] xpos The new x-coordinate of the touch.
* @param[in] ypos The new y-coordinate of the touch.
* @ingroup event
*/
void _glfwInputTouchPos(_GLFWwindow* window, int touch, double xpos, double ypos);
/*! @ingroup event
*/
void _glfwInputMonitorChange(void);

View File

@ -584,6 +584,55 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
return 0;
}
case WM_TOUCH:
{
TOUCHINPUT* inputs;
UINT count = LOWORD(wParam);
inputs = (TOUCHINPUT*) malloc(sizeof(TOUCHINPUT) * count);
if (GetTouchInputInfo((HTOUCHINPUT) lParam,
count, inputs, sizeof(TOUCHINPUT)))
{
int i, width, height;
_glfwPlatformGetWindowSize(window, &width, &height);
for (i = 0; i < count; i++)
{
POINT pos;
// Discard any points that lie outside of the client area
pos.x = TOUCH_COORD_TO_PIXEL(inputs[i].x);
pos.y = TOUCH_COORD_TO_PIXEL(inputs[i].y);
ScreenToClient(window->win32.handle, &pos);
if (pos.x < 0 || pos.x >= width ||
pos.y < 0 || pos.y >= height)
{
continue;
}
if (inputs[i].dwFlags & TOUCHEVENTF_DOWN)
_glfwInputTouch(window, (int) inputs[i].dwID, GLFW_PRESS);
else if (inputs[i].dwFlags & TOUCHEVENTF_UP)
_glfwInputTouch(window, (int) inputs[i].dwID, GLFW_RELEASE);
else if (inputs[i].dwFlags & TOUCHEVENTF_MOVE)
{
_glfwInputTouchPos(window, (int) inputs[i].dwID,
inputs[i].x / 100.0,
inputs[i].y / 100.0);
}
}
CloseTouchInputHandle((HTOUCHINPUT) lParam);
}
free(inputs);
break;
}
case WM_PAINT:
{
_glfwInputWindowDamage(window);
@ -1138,6 +1187,14 @@ void _glfwPlatformPostEmptyEvent(void)
PostMessage(window->win32.handle, WM_NULL, 0, 0);
}
void _glfwPlatformSetTouchInput(_GLFWwindow* window, int enabled)
{
if (enabled)
RegisterTouchWindow(window->win32.handle, 0);
else
UnregisterTouchWindow(window->win32.handle);
}
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
{
POINT pos;

View File

@ -1871,6 +1871,10 @@ void _glfwPlatformPostEmptyEvent(void)
XFlush(_glfw.x11.display);
}
void _glfwPlatformSetTouchInput(_GLFWwindow* window, int enabled)
{
}
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
{
Window root, child;

View File

@ -438,6 +438,16 @@ static void monitor_callback(GLFWmonitor* monitor, int event)
}
}
static void touch_callback(GLFWwindow* window, int touch, int action, double x, double y)
{
printf("%08x at %0.3f: Touch %i %s at %0.3f %0.3f\n",
counter++,
glfwGetTime(),
touch,
get_action_name(action),
x, y);
}
int main(int argc, char** argv)
{
Slot* slots;
@ -551,6 +561,7 @@ int main(int argc, char** argv)
glfwSetCharCallback(slots[i].window, char_callback);
glfwSetCharModsCallback(slots[i].window, char_mods_callback);
glfwSetDropCallback(slots[i].window, drop_callback);
glfwSetTouchCallback(slots[i].window, touch_callback);
glfwMakeContextCurrent(slots[i].window);
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);