mirror of
https://github.com/gwm17/glfw.git
synced 2024-11-23 02:38:52 -05:00
Begin adapting touch patch
This commit is contained in:
parent
a94a84b507
commit
4d2c3a547b
|
@ -133,6 +133,7 @@ skills.
|
||||||
- Cameron King
|
- Cameron King
|
||||||
- Peter Knut
|
- Peter Knut
|
||||||
- Eric Larson
|
- Eric Larson
|
||||||
|
- Quinten Lansu
|
||||||
- Robin Leffmann
|
- Robin Leffmann
|
||||||
- Glenn Lewis
|
- Glenn Lewis
|
||||||
- Shane Liesegang
|
- Shane Liesegang
|
||||||
|
|
|
@ -656,6 +656,7 @@ extern "C" {
|
||||||
#define GLFW_CURSOR 0x00033001
|
#define GLFW_CURSOR 0x00033001
|
||||||
#define GLFW_STICKY_KEYS 0x00033002
|
#define GLFW_STICKY_KEYS 0x00033002
|
||||||
#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003
|
#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003
|
||||||
|
#define GLFW_TOUCH 0x00030004
|
||||||
|
|
||||||
#define GLFW_CURSOR_NORMAL 0x00034001
|
#define GLFW_CURSOR_NORMAL 0x00034001
|
||||||
#define GLFW_CURSOR_HIDDEN 0x00034002
|
#define GLFW_CURSOR_HIDDEN 0x00034002
|
||||||
|
@ -979,6 +980,27 @@ typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**);
|
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.
|
/*! @brief The function signature for monitor configuration callbacks.
|
||||||
*
|
*
|
||||||
* This is the function signature for monitor configuration callback functions.
|
* 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);
|
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.
|
/*! @brief Returns whether the specified joystick is present.
|
||||||
*
|
*
|
||||||
* This function returns whether the specified joystick is present.
|
* This function returns whether the specified joystick is present.
|
||||||
|
|
|
@ -1162,6 +1162,10 @@ void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
|
||||||
*ypos = contentRect.size.height - pos.y - 1;
|
*ypos = contentRect.size.height - pos.y - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetTouchInput(_GLFWwindow* window, int enabled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
|
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
|
||||||
{
|
{
|
||||||
_glfwPlatformSetCursorMode(window, window->cursorMode);
|
_glfwPlatformSetCursorMode(window, window->cursorMode);
|
||||||
|
|
45
src/input.c
45
src/input.c
|
@ -126,6 +126,18 @@ static void setStickyMouseButtons(_GLFWwindow* window, int enabled)
|
||||||
window->stickyMouseButtons = 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 //////
|
////// GLFW event API //////
|
||||||
|
@ -222,6 +234,18 @@ void _glfwInputDrop(_GLFWwindow* window, int count, const char** paths)
|
||||||
window->callbacks.drop((GLFWwindow*) window, count, 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 //////
|
////// GLFW public API //////
|
||||||
|
@ -241,6 +265,8 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode)
|
||||||
return window->stickyKeys;
|
return window->stickyKeys;
|
||||||
case GLFW_STICKY_MOUSE_BUTTONS:
|
case GLFW_STICKY_MOUSE_BUTTONS:
|
||||||
return window->stickyMouseButtons;
|
return window->stickyMouseButtons;
|
||||||
|
case GLFW_TOUCH:
|
||||||
|
return window->touchInput;
|
||||||
default:
|
default:
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode");
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -264,6 +290,9 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value)
|
||||||
case GLFW_STICKY_MOUSE_BUTTONS:
|
case GLFW_STICKY_MOUSE_BUTTONS:
|
||||||
setStickyMouseButtons(window, value ? GLFW_TRUE : GLFW_FALSE);
|
setStickyMouseButtons(window, value ? GLFW_TRUE : GLFW_FALSE);
|
||||||
break;
|
break;
|
||||||
|
case GLFW_TOUCH:
|
||||||
|
setTouchInput(window, value ? GLFW_TRUE : GLFW_FALSE);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode");
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode");
|
||||||
break;
|
break;
|
||||||
|
@ -579,6 +608,22 @@ GLFWAPI const char* glfwGetJoystickName(int joy)
|
||||||
return _glfwPlatformGetJoystickName(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)
|
GLFWAPI void glfwSetClipboardString(GLFWwindow* handle, const char* string)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
|
@ -253,6 +253,7 @@ struct _GLFWwindow
|
||||||
// Window input state
|
// Window input state
|
||||||
GLFWbool stickyKeys;
|
GLFWbool stickyKeys;
|
||||||
GLFWbool stickyMouseButtons;
|
GLFWbool stickyMouseButtons;
|
||||||
|
GLFWbool touchInput;
|
||||||
double cursorPosX, cursorPosY;
|
double cursorPosX, cursorPosY;
|
||||||
int cursorMode;
|
int cursorMode;
|
||||||
char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
|
char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
|
||||||
|
@ -289,6 +290,8 @@ struct _GLFWwindow
|
||||||
GLFWcharfun character;
|
GLFWcharfun character;
|
||||||
GLFWcharmodsfun charmods;
|
GLFWcharmodsfun charmods;
|
||||||
GLFWdropfun drop;
|
GLFWdropfun drop;
|
||||||
|
GLFWtouchfun touch;
|
||||||
|
GLFWtouchposfun touchPos;
|
||||||
} callbacks;
|
} callbacks;
|
||||||
|
|
||||||
// This is defined in the window API's platform.h
|
// This is defined in the window API's platform.h
|
||||||
|
@ -406,6 +409,14 @@ void _glfwPlatformTerminate(void);
|
||||||
*/
|
*/
|
||||||
const char* _glfwPlatformGetVersionString(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
|
/*! @copydoc glfwGetCursorPos
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
*/
|
*/
|
||||||
|
@ -774,6 +785,23 @@ void _glfwInputCursorMotion(_GLFWwindow* window, double x, double y);
|
||||||
*/
|
*/
|
||||||
void _glfwInputCursorEnter(_GLFWwindow* window, int entered);
|
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
|
/*! @ingroup event
|
||||||
*/
|
*/
|
||||||
void _glfwInputMonitorChange(void);
|
void _glfwInputMonitorChange(void);
|
||||||
|
|
|
@ -584,6 +584,55 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
||||||
return 0;
|
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:
|
case WM_PAINT:
|
||||||
{
|
{
|
||||||
_glfwInputWindowDamage(window);
|
_glfwInputWindowDamage(window);
|
||||||
|
@ -1138,6 +1187,14 @@ void _glfwPlatformPostEmptyEvent(void)
|
||||||
PostMessage(window->win32.handle, WM_NULL, 0, 0);
|
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)
|
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
|
||||||
{
|
{
|
||||||
POINT pos;
|
POINT pos;
|
||||||
|
|
|
@ -1871,6 +1871,10 @@ void _glfwPlatformPostEmptyEvent(void)
|
||||||
XFlush(_glfw.x11.display);
|
XFlush(_glfw.x11.display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetTouchInput(_GLFWwindow* window, int enabled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
|
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
|
||||||
{
|
{
|
||||||
Window root, child;
|
Window root, child;
|
||||||
|
|
|
@ -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)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
Slot* slots;
|
Slot* slots;
|
||||||
|
@ -551,6 +561,7 @@ int main(int argc, char** argv)
|
||||||
glfwSetCharCallback(slots[i].window, char_callback);
|
glfwSetCharCallback(slots[i].window, char_callback);
|
||||||
glfwSetCharModsCallback(slots[i].window, char_mods_callback);
|
glfwSetCharModsCallback(slots[i].window, char_mods_callback);
|
||||||
glfwSetDropCallback(slots[i].window, drop_callback);
|
glfwSetDropCallback(slots[i].window, drop_callback);
|
||||||
|
glfwSetTouchCallback(slots[i].window, touch_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(slots[i].window);
|
glfwMakeContextCurrent(slots[i].window);
|
||||||
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user