mirror of
https://github.com/glfw/glfw.git
synced 2025-10-03 13:20:58 +00:00
Merge branch 'master' into AnalyzeContext-sRGB
This commit is contained in:
commit
27df891a7a
@ -56,6 +56,7 @@ GLFW bundles a number of dependencies in the `deps/` directory.
|
|||||||
- Added `glfwPostEmptyEvent` for allowing secondary threads to cause
|
- Added `glfwPostEmptyEvent` for allowing secondary threads to cause
|
||||||
`glfwWaitEvents` to return
|
`glfwWaitEvents` to return
|
||||||
- Added `empty` test program for verifying posting of empty events
|
- Added `empty` test program for verifying posting of empty events
|
||||||
|
- Added `glfwSetCharModsCallback` for receiving character events with modifiers
|
||||||
- Added `glfwGetWindowFrameSize` for retrieving the size of the frame around
|
- Added `glfwGetWindowFrameSize` for retrieving the size of the frame around
|
||||||
the client area of a window
|
the client area of a window
|
||||||
- Added `GLFW_AUTO_ICONIFY` for controlling whether full screen windows
|
- Added `GLFW_AUTO_ICONIFY` for controlling whether full screen windows
|
||||||
|
@ -47,6 +47,14 @@ GLFW not supports floating windows, also called topmost or always on top, for
|
|||||||
easier debugging, with the `GLFW_FLOATING` window hint.
|
easier debugging, with the `GLFW_FLOATING` window hint.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_31_charmods Character with modifiers callback
|
||||||
|
|
||||||
|
GLFW now provides a callback for character events with modifier key bits.
|
||||||
|
Unlike the regular character callback, this will report character events that
|
||||||
|
will not result in a character being input, for example if the Control key is
|
||||||
|
held down.
|
||||||
|
|
||||||
|
|
||||||
@subsection news_31_egl Stable EGL support
|
@subsection news_31_egl Stable EGL support
|
||||||
|
|
||||||
The support for EGL is now stable, successfully running on PandaBoards, Mesa,
|
The support for EGL is now stable, successfully running on PandaBoards, Mesa,
|
||||||
|
@ -788,6 +788,24 @@ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
|
|||||||
*/
|
*/
|
||||||
typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);
|
typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);
|
||||||
|
|
||||||
|
/*! @brief The function signature for Unicode character with modifiers
|
||||||
|
* callbacks.
|
||||||
|
*
|
||||||
|
* This is the function signature for Unicode character with modifiers callback
|
||||||
|
* functions. It is called for each input character, regardless of what
|
||||||
|
* modifier keys are held down.
|
||||||
|
*
|
||||||
|
* @param[in] window The window that received the event.
|
||||||
|
* @param[in] codepoint The Unicode code point of the character.
|
||||||
|
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
|
||||||
|
* held down.
|
||||||
|
*
|
||||||
|
* @sa glfwSetCharModsCallback
|
||||||
|
*
|
||||||
|
* @ingroup input
|
||||||
|
*/
|
||||||
|
typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);
|
||||||
|
|
||||||
/*! @brief The function signature for file drop callbacks.
|
/*! @brief The function signature for file drop callbacks.
|
||||||
*
|
*
|
||||||
* This is the function signature for file drop callbacks.
|
* This is the function signature for file drop callbacks.
|
||||||
@ -2151,9 +2169,19 @@ GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);
|
|||||||
* This function sets the character callback of the specific window, which is
|
* This function sets the character callback of the specific window, which is
|
||||||
* called when a Unicode character is input.
|
* called when a Unicode character is input.
|
||||||
*
|
*
|
||||||
* The character callback is intended for text input. If you want to know
|
* The character callback is intended for Unicode text input. As it deals with
|
||||||
* whether a specific key was pressed or released, use the
|
* characters, it is keyboard layout dependent, whereas the
|
||||||
* [key callback](@ref glfwSetKeyCallback) instead.
|
* [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1
|
||||||
|
* to physical keys, as a key may produce zero, one or more characters. If you
|
||||||
|
* want to know whether a specific physical key was pressed or released, see
|
||||||
|
* the key callback instead.
|
||||||
|
*
|
||||||
|
* The character callback behaves as system text input normally does and will
|
||||||
|
* not be called if modifier keys are held down that would prevent normal text
|
||||||
|
* input on that platform, for example a Super (Command) key on OS X or Alt key
|
||||||
|
* on Windows. There is a
|
||||||
|
* [character with modifiers callback](@ref glfwSetCharModsCallback) that
|
||||||
|
* receives these events.
|
||||||
*
|
*
|
||||||
* @param[in] window The window whose callback to set.
|
* @param[in] window The window whose callback to set.
|
||||||
* @param[in] cbfun The new callback, or `NULL` to remove the currently set
|
* @param[in] cbfun The new callback, or `NULL` to remove the currently set
|
||||||
@ -2167,6 +2195,33 @@ GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun);
|
GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun);
|
||||||
|
|
||||||
|
/*! @brief Sets the Unicode character with modifiers callback.
|
||||||
|
*
|
||||||
|
* This function sets the character with modifiers callback of the specific
|
||||||
|
* window, which is called when a Unicode character is input regardless of what
|
||||||
|
* modifier keys are used.
|
||||||
|
*
|
||||||
|
* The character with modifiers callback is intended for implementing custom
|
||||||
|
* Unicode character input. For regular Unicode text input, see the
|
||||||
|
* [character callback](@ref glfwSetCharCallback). Like the character
|
||||||
|
* callback, the character with modifiers callback deals with characters and is
|
||||||
|
* keyboard layout dependent. Characters do not map 1:1 to physical keys, as
|
||||||
|
* a key may produce zero, one or more characters. If you want to know whether
|
||||||
|
* a specific physical key was pressed or released, see the
|
||||||
|
* [key callback](@ref glfwSetKeyCallback) instead.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose callback to set.
|
||||||
|
* @param[in] cbfun The new 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.
|
||||||
|
*
|
||||||
|
* @note This function may only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @ingroup input
|
||||||
|
*/
|
||||||
|
GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun);
|
||||||
|
|
||||||
/*! @brief Sets the mouse button callback.
|
/*! @brief Sets the mouse button callback.
|
||||||
*
|
*
|
||||||
* This function sets the mouse button callback of the specified window, which
|
* This function sets the mouse button callback of the specified window, which
|
||||||
|
@ -605,13 +605,15 @@ static int translateKey(unsigned int key)
|
|||||||
{
|
{
|
||||||
const int key = translateKey([event keyCode]);
|
const int key = translateKey([event keyCode]);
|
||||||
const int mods = translateFlags([event modifierFlags]);
|
const int mods = translateFlags([event modifierFlags]);
|
||||||
|
|
||||||
_glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods);
|
_glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods);
|
||||||
|
|
||||||
NSString* characters = [event characters];
|
NSString* characters = [event characters];
|
||||||
NSUInteger i, length = [characters length];
|
NSUInteger i, length = [characters length];
|
||||||
|
const int plain = !(mods & GLFW_MOD_SUPER);
|
||||||
|
|
||||||
for (i = 0; i < length; i++)
|
for (i = 0; i < length; i++)
|
||||||
_glfwInputChar(window, [characters characterAtIndex:i]);
|
_glfwInputChar(window, [characters characterAtIndex:i], mods, plain);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)flagsChanged:(NSEvent *)event
|
- (void)flagsChanged:(NSEvent *)event
|
||||||
|
16
src/input.c
16
src/input.c
@ -153,13 +153,19 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
|
|||||||
window->callbacks.key((GLFWwindow*) window, key, scancode, action, mods);
|
window->callbacks.key((GLFWwindow*) window, key, scancode, action, mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint)
|
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, int plain)
|
||||||
{
|
{
|
||||||
if (codepoint < 32 || (codepoint > 126 && codepoint < 160))
|
if (codepoint < 32 || (codepoint > 126 && codepoint < 160))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (window->callbacks.charmods)
|
||||||
|
window->callbacks.charmods((GLFWwindow*) window, codepoint, mods);
|
||||||
|
|
||||||
|
if (plain)
|
||||||
|
{
|
||||||
if (window->callbacks.character)
|
if (window->callbacks.character)
|
||||||
window->callbacks.character((GLFWwindow*) window, codepoint);
|
window->callbacks.character((GLFWwindow*) window, codepoint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset)
|
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset)
|
||||||
@ -439,6 +445,14 @@ GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* handle, GLFWcharfun cbfun)
|
|||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* handle, GLFWcharmodsfun cbfun)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
_GLFW_SWAP_POINTERS(window->callbacks.charmods, cbfun);
|
||||||
|
return cbfun;
|
||||||
|
}
|
||||||
|
|
||||||
GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* handle,
|
GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* handle,
|
||||||
GLFWmousebuttonfun cbfun)
|
GLFWmousebuttonfun cbfun)
|
||||||
{
|
{
|
||||||
|
@ -262,6 +262,7 @@ struct _GLFWwindow
|
|||||||
GLFWscrollfun scroll;
|
GLFWscrollfun scroll;
|
||||||
GLFWkeyfun key;
|
GLFWkeyfun key;
|
||||||
GLFWcharfun character;
|
GLFWcharfun character;
|
||||||
|
GLFWcharmodsfun charmods;
|
||||||
GLFWdropfun drop;
|
GLFWdropfun drop;
|
||||||
} callbacks;
|
} callbacks;
|
||||||
|
|
||||||
@ -700,9 +701,12 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
|
|||||||
/*! @brief Notifies shared code of a Unicode character input event.
|
/*! @brief Notifies shared code of a Unicode character input event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] codepoint The Unicode code point of the input character.
|
* @param[in] codepoint The Unicode code point of the input character.
|
||||||
|
* @param[in] mods Bit field describing which modifier keys were held down.
|
||||||
|
* @param[in] plain `GL_TRUE` if the character is regular text input, or
|
||||||
|
* `GL_FALSE` otherwise.
|
||||||
* @ingroup event
|
* @ingroup event
|
||||||
*/
|
*/
|
||||||
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint);
|
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, int plain);
|
||||||
|
|
||||||
/*! @brief Notifies shared code of a scroll event.
|
/*! @brief Notifies shared code of a scroll event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
|
@ -526,9 +526,14 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
case WM_CHAR:
|
case WM_CHAR:
|
||||||
|
{
|
||||||
|
_glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GL_TRUE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_SYSCHAR:
|
case WM_SYSCHAR:
|
||||||
{
|
{
|
||||||
_glfwInputChar(window, (unsigned int) wParam);
|
_glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GL_FALSE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,7 +548,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwInputChar(window, (unsigned int) wParam);
|
_glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GL_TRUE);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,40 +576,16 @@ static GLboolean initExtensions(void)
|
|||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a blank cursor (for locked mouse mode)
|
// Create a blank cursor for hidden and disabled cursor modes
|
||||||
//
|
//
|
||||||
static Cursor createNULLCursor(void)
|
static Cursor createNULLCursor(void)
|
||||||
{
|
{
|
||||||
Pixmap cursormask;
|
unsigned char pixels[16 * 16 * 4];
|
||||||
XGCValues xgc;
|
GLFWimage image = { 16, 16, pixels };
|
||||||
GC gc;
|
|
||||||
XColor col;
|
|
||||||
Cursor cursor;
|
|
||||||
|
|
||||||
_glfwGrabXErrorHandler();
|
memset(pixels, 0, sizeof(pixels));
|
||||||
|
|
||||||
cursormask = XCreatePixmap(_glfw.x11.display, _glfw.x11.root, 1, 1, 1);
|
return _glfwCreateCursor(&image, 0, 0);
|
||||||
xgc.function = GXclear;
|
|
||||||
gc = XCreateGC(_glfw.x11.display, cursormask, GCFunction, &xgc);
|
|
||||||
XFillRectangle(_glfw.x11.display, cursormask, gc, 0, 0, 1, 1);
|
|
||||||
col.pixel = 0;
|
|
||||||
col.red = 0;
|
|
||||||
col.flags = 4;
|
|
||||||
cursor = XCreatePixmapCursor(_glfw.x11.display,
|
|
||||||
cursormask, cursormask,
|
|
||||||
&col, &col, 0, 0);
|
|
||||||
XFreePixmap(_glfw.x11.display, cursormask);
|
|
||||||
XFreeGC(_glfw.x11.display, gc);
|
|
||||||
|
|
||||||
_glfwReleaseXErrorHandler();
|
|
||||||
|
|
||||||
if (cursor == None)
|
|
||||||
{
|
|
||||||
_glfwInputXError(GLFW_PLATFORM_ERROR,
|
|
||||||
"X11: Failed to create null cursor");
|
|
||||||
}
|
|
||||||
|
|
||||||
return cursor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Terminate X11 display
|
// Terminate X11 display
|
||||||
@ -664,6 +640,37 @@ void _glfwInputXError(int error, const char* message)
|
|||||||
_glfwInputError(error, "%s: %s", message, buffer);
|
_glfwInputError(error, "%s: %s", message, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a cursor object
|
||||||
|
//
|
||||||
|
Cursor _glfwCreateCursor(const GLFWimage* image, int xhot, int yhot)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Cursor cursor;
|
||||||
|
|
||||||
|
XcursorImage* native = XcursorImageCreate(image->width, image->height);
|
||||||
|
if (native == NULL)
|
||||||
|
return None;
|
||||||
|
|
||||||
|
native->xhot = xhot;
|
||||||
|
native->yhot = yhot;
|
||||||
|
|
||||||
|
unsigned char* source = (unsigned char*) image->pixels;
|
||||||
|
XcursorPixel* target = native->pixels;
|
||||||
|
|
||||||
|
for (i = 0; i < image->width * image->height; i++, target++, source += 4)
|
||||||
|
{
|
||||||
|
*target = (source[3] << 24) |
|
||||||
|
(source[0] << 16) |
|
||||||
|
(source[1] << 8) |
|
||||||
|
source[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor = XcursorImageLoadCursor(_glfw.x11.display, native);
|
||||||
|
XcursorImageDestroy(native);
|
||||||
|
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW platform API //////
|
////// GLFW platform API //////
|
||||||
|
@ -256,6 +256,8 @@ void _glfwHandleSelectionClear(XEvent* event);
|
|||||||
void _glfwHandleSelectionRequest(XEvent* event);
|
void _glfwHandleSelectionRequest(XEvent* event);
|
||||||
void _glfwPushSelectionToManager(_GLFWwindow* window);
|
void _glfwPushSelectionToManager(_GLFWwindow* window);
|
||||||
|
|
||||||
|
Cursor _glfwCreateCursor(const GLFWimage* image, int xhot, int yhot);
|
||||||
|
|
||||||
// Window support
|
// Window support
|
||||||
_GLFWwindow* _glfwFindWindowByHandle(Window handle);
|
_GLFWwindow* _glfwFindWindowByHandle(Window handle);
|
||||||
unsigned long _glfwGetWindowProperty(Window window,
|
unsigned long _glfwGetWindowProperty(Window window,
|
||||||
|
@ -609,7 +609,10 @@ static void processEvent(XEvent *event)
|
|||||||
_glfwInputKey(window, key, event->xkey.keycode, GLFW_PRESS, mods);
|
_glfwInputKey(window, key, event->xkey.keycode, GLFW_PRESS, mods);
|
||||||
|
|
||||||
if (character != -1)
|
if (character != -1)
|
||||||
_glfwInputChar(window, character);
|
{
|
||||||
|
const int plain = !(mods & (GLFW_MOD_CONTROL | GLFW_MOD_ALT));
|
||||||
|
_glfwInputChar(window, character, mods, plain);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1454,29 +1457,7 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
|
|||||||
const GLFWimage* image,
|
const GLFWimage* image,
|
||||||
int xhot, int yhot)
|
int xhot, int yhot)
|
||||||
{
|
{
|
||||||
int i;
|
cursor->x11.handle = _glfwCreateCursor(image, xhot, yhot);
|
||||||
|
|
||||||
XcursorImage* native = XcursorImageCreate(image->width, image->height);
|
|
||||||
if (native == NULL)
|
|
||||||
return GL_FALSE;
|
|
||||||
|
|
||||||
native->xhot = xhot;
|
|
||||||
native->yhot = yhot;
|
|
||||||
|
|
||||||
unsigned char* source = (unsigned char*) image->pixels;
|
|
||||||
XcursorPixel* target = native->pixels;
|
|
||||||
|
|
||||||
for (i = 0; i < image->width * image->height; i++, target++, source += 4)
|
|
||||||
{
|
|
||||||
*target = (source[3] << 24) |
|
|
||||||
(source[0] << 16) |
|
|
||||||
(source[1] << 8) |
|
|
||||||
source[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor->x11.handle = XcursorImageLoadCursor(_glfw.x11.display, native);
|
|
||||||
XcursorImageDestroy(native);
|
|
||||||
|
|
||||||
if (cursor->x11.handle == None)
|
if (cursor->x11.handle == None)
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
|
|
||||||
|
@ -187,9 +187,8 @@ static const char* get_key_name(int key)
|
|||||||
case GLFW_KEY_LEFT_SUPER: return "LEFT SUPER";
|
case GLFW_KEY_LEFT_SUPER: return "LEFT SUPER";
|
||||||
case GLFW_KEY_RIGHT_SUPER: return "RIGHT SUPER";
|
case GLFW_KEY_RIGHT_SUPER: return "RIGHT SUPER";
|
||||||
case GLFW_KEY_MENU: return "MENU";
|
case GLFW_KEY_MENU: return "MENU";
|
||||||
case GLFW_KEY_UNKNOWN: return "UNKNOWN";
|
|
||||||
|
|
||||||
default: return NULL;
|
default: return "UNKNOWN";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,15 +217,22 @@ static const char* get_button_name(int button)
|
|||||||
return "right";
|
return "right";
|
||||||
case GLFW_MOUSE_BUTTON_MIDDLE:
|
case GLFW_MOUSE_BUTTON_MIDDLE:
|
||||||
return "middle";
|
return "middle";
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
static char name[16];
|
||||||
|
sprintf(name, "%i", button);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* get_mods_name(int mods)
|
static const char* get_mods_name(int mods)
|
||||||
{
|
{
|
||||||
static char name[512];
|
static char name[512];
|
||||||
|
|
||||||
|
if (mods == 0)
|
||||||
|
return " no mods";
|
||||||
|
|
||||||
name[0] = '\0';
|
name[0] = '\0';
|
||||||
|
|
||||||
if (mods & GLFW_MOD_SHIFT)
|
if (mods & GLFW_MOD_SHIFT)
|
||||||
@ -321,18 +327,11 @@ static void window_iconify_callback(GLFWwindow* window, int iconified)
|
|||||||
static void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
static void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
||||||
{
|
{
|
||||||
Slot* slot = glfwGetWindowUserPointer(window);
|
Slot* slot = glfwGetWindowUserPointer(window);
|
||||||
const char* name = get_button_name(button);
|
printf("%08x to %i at %0.3f: Mouse button %i (%s) (with%s) was %s\n",
|
||||||
|
counter++, slot->number, glfwGetTime(), button,
|
||||||
printf("%08x to %i at %0.3f: Mouse button %i",
|
get_button_name(button),
|
||||||
counter++, slot->number, glfwGetTime(), button);
|
get_mods_name(mods),
|
||||||
|
get_action_name(action));
|
||||||
if (name)
|
|
||||||
printf(" (%s)", name);
|
|
||||||
|
|
||||||
if (mods)
|
|
||||||
printf(" (with%s)", get_mods_name(mods));
|
|
||||||
|
|
||||||
printf(" was %s\n", get_action_name(action));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cursor_position_callback(GLFWwindow* window, double x, double y)
|
static void cursor_position_callback(GLFWwindow* window, double x, double y)
|
||||||
@ -359,19 +358,13 @@ static void scroll_callback(GLFWwindow* window, double x, double y)
|
|||||||
|
|
||||||
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||||
{
|
{
|
||||||
const char* name = get_key_name(key);
|
|
||||||
Slot* slot = glfwGetWindowUserPointer(window);
|
Slot* slot = glfwGetWindowUserPointer(window);
|
||||||
|
|
||||||
printf("%08x to %i at %0.3f: Key 0x%04x Scancode 0x%04x",
|
printf("%08x to %i at %0.3f: Key 0x%04x Scancode 0x%04x (%s) (with%s) was %s\n",
|
||||||
counter++, slot->number, glfwGetTime(), key, scancode);
|
counter++, slot->number, glfwGetTime(), key, scancode,
|
||||||
|
get_key_name(key),
|
||||||
if (name)
|
get_mods_name(mods),
|
||||||
printf(" (%s)", name);
|
get_action_name(action));
|
||||||
|
|
||||||
if (mods)
|
|
||||||
printf(" (with%s)", get_mods_name(mods));
|
|
||||||
|
|
||||||
printf(" was %s\n", get_action_name(action));
|
|
||||||
|
|
||||||
if (action != GLFW_PRESS)
|
if (action != GLFW_PRESS)
|
||||||
return;
|
return;
|
||||||
@ -396,6 +389,15 @@ static void char_callback(GLFWwindow* window, unsigned int codepoint)
|
|||||||
get_character_string(codepoint));
|
get_character_string(codepoint));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void char_mods_callback(GLFWwindow* window, unsigned int codepoint, int mods)
|
||||||
|
{
|
||||||
|
Slot* slot = glfwGetWindowUserPointer(window);
|
||||||
|
printf("%08x to %i at %0.3f: Character 0x%08x (%s) (with%s) input\n",
|
||||||
|
counter++, slot->number, glfwGetTime(), codepoint,
|
||||||
|
get_character_string(codepoint),
|
||||||
|
get_mods_name(mods));
|
||||||
|
}
|
||||||
|
|
||||||
static void drop_callback(GLFWwindow* window, int count, const char** names)
|
static void drop_callback(GLFWwindow* window, int count, const char** names)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -546,6 +548,7 @@ int main(int argc, char** argv)
|
|||||||
glfwSetScrollCallback(slots[i].window, scroll_callback);
|
glfwSetScrollCallback(slots[i].window, scroll_callback);
|
||||||
glfwSetKeyCallback(slots[i].window, key_callback);
|
glfwSetKeyCallback(slots[i].window, key_callback);
|
||||||
glfwSetCharCallback(slots[i].window, char_callback);
|
glfwSetCharCallback(slots[i].window, char_callback);
|
||||||
|
glfwSetCharModsCallback(slots[i].window, char_mods_callback);
|
||||||
glfwSetDropCallback(slots[i].window, drop_callback);
|
glfwSetDropCallback(slots[i].window, drop_callback);
|
||||||
|
|
||||||
glfwMakeContextCurrent(slots[i].window);
|
glfwMakeContextCurrent(slots[i].window);
|
||||||
|
Loading…
Reference in New Issue
Block a user