Adding Platform/Unix/X11WindowEventHandler
This commit is contained in:
parent
7a694e8fd0
commit
7402896ce6
3 changed files with 82 additions and 0 deletions
|
|
@ -72,6 +72,7 @@ elseif TARGET_OS == "Unix" then
|
||||||
"X11Keyboard.cpp",
|
"X11Keyboard.cpp",
|
||||||
"X11Mouse.cpp",
|
"X11Mouse.cpp",
|
||||||
"X11EventQueue.cpp",
|
"X11EventQueue.cpp",
|
||||||
|
"X11WindowEventHandler.cpp",
|
||||||
"UnixMisc.cpp",
|
"UnixMisc.cpp",
|
||||||
"UnixSystem.cpp",
|
"UnixSystem.cpp",
|
||||||
"glad_glx.c"
|
"glad_glx.c"
|
||||||
|
|
|
||||||
52
source/Platform/Unix/X11WindowEventHandler.cpp
Normal file
52
source/Platform/Unix/X11WindowEventHandler.cpp
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
|
||||||
|
#include <Spectre/System/Log.h>
|
||||||
|
#include "X11Display.h"
|
||||||
|
#include "X11SharedDisplay.h"
|
||||||
|
#include "X11WindowEventHandler.h"
|
||||||
|
#include <X11/Xresource.h>
|
||||||
|
|
||||||
|
namespace sp {
|
||||||
|
|
||||||
|
// Context used to store X11Display pointer.
|
||||||
|
::XContext X11WindowEventHandler::win_context = None;
|
||||||
|
|
||||||
|
void X11WindowEventHandler::registerHandler(::Display* disp, ::Window window, X11Display *ptr)
|
||||||
|
{
|
||||||
|
// Initialize context before use.
|
||||||
|
if (win_context == None) {
|
||||||
|
win_context = XUniqueContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save pointer to window.
|
||||||
|
XSaveContext(disp, window, win_context, (XPointer) ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void X11WindowEventHandler::unregisterHandler(::Display* disp, ::Window window)
|
||||||
|
{
|
||||||
|
// No context. nothing to do.
|
||||||
|
if (win_context == None) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XDeleteContext(disp, window, win_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void X11WindowEventHandler::process(::Display* disp, const ::XEvent& event)
|
||||||
|
{
|
||||||
|
XPointer ptr;
|
||||||
|
|
||||||
|
// No context. nothing to do.
|
||||||
|
if (win_context == None) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the pointer for window ID.
|
||||||
|
if (XFindContext(disp, event.xany.window, win_context, &ptr) == 0) {
|
||||||
|
X11Display* disp_ptr = (X11Display*) ptr;
|
||||||
|
|
||||||
|
// Delegate
|
||||||
|
disp_ptr->processEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace sp
|
||||||
29
source/Platform/Unix/X11WindowEventHandler.h
Normal file
29
source/Platform/Unix/X11WindowEventHandler.h
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
#ifndef PLATFORM_UNIX_X11_WINDOW_EVENT_HANDLER_H
|
||||||
|
#define PLATFORM_UNIX_X11_WINDOW_EVENT_HANDLER_H
|
||||||
|
|
||||||
|
#include <X11/Xutil.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
namespace sp {
|
||||||
|
|
||||||
|
class X11Display;
|
||||||
|
|
||||||
|
class X11WindowEventHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
static void registerHandler(::Display* disp, ::Window window, X11Display *ptr);
|
||||||
|
|
||||||
|
static void unregisterHandler(::Display* disp, ::Window window);
|
||||||
|
|
||||||
|
static void process(::Display* disp, const ::XEvent& event);
|
||||||
|
|
||||||
|
protected :
|
||||||
|
|
||||||
|
static ::XContext win_context;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace sp
|
||||||
|
|
||||||
|
#endif /* PLATFORM_UNIX_WINDOW_EVENT_HANDLER_H */
|
||||||
Loading…
Add table
Add a link
Reference in a new issue