Merge commit '4e42229bdd980ab50da8b83b1aa1b0877b5a9ef6' as 'external/gainput'
This commit is contained in:
359
external/gainput/samples/samplefw/SampleFramework.cpp
vendored
Normal file
359
external/gainput/samples/samplefw/SampleFramework.cpp
vendored
Normal file
@@ -0,0 +1,359 @@
|
||||
|
||||
#include <gainput/gainput.h>
|
||||
#include "SampleFramework.h"
|
||||
|
||||
extern void SampleMain();
|
||||
|
||||
const int width = 800;
|
||||
const int height = 600;
|
||||
|
||||
|
||||
int SfwGetWidth()
|
||||
{
|
||||
return width;
|
||||
}
|
||||
|
||||
int SfwGetHeight()
|
||||
{
|
||||
return height;
|
||||
}
|
||||
|
||||
|
||||
#if defined(GAINPUT_PLATFORM_LINUX)
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include <GL/glx.h>
|
||||
|
||||
Display* xDisplay = 0;
|
||||
Window xWindow;
|
||||
GLXContext glxContext;
|
||||
|
||||
|
||||
void SfwOpenWindow(const char* title)
|
||||
{
|
||||
static int attributeListDbl[] = { GLX_RGBA, GLX_DOUBLEBUFFER, /*In case single buffering is not supported*/ GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1,
|
||||
None };
|
||||
|
||||
xDisplay = XOpenDisplay(0);
|
||||
if (xDisplay == 0)
|
||||
{
|
||||
SFW_LOG("Cannot connect to X server.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
Window root = DefaultRootWindow(xDisplay);
|
||||
|
||||
XVisualInfo* vi = glXChooseVisual(xDisplay, DefaultScreen(xDisplay), attributeListDbl);
|
||||
assert(vi);
|
||||
|
||||
glxContext = glXCreateContext(xDisplay, vi, 0, GL_TRUE);
|
||||
|
||||
Colormap cmap = XCreateColormap(xDisplay, root, vi->visual, AllocNone);
|
||||
|
||||
XSetWindowAttributes swa;
|
||||
swa.colormap = cmap;
|
||||
swa.event_mask = ExposureMask
|
||||
| KeyPressMask | KeyReleaseMask
|
||||
| PointerMotionMask | ButtonPressMask | ButtonReleaseMask;
|
||||
|
||||
xWindow = XCreateWindow(
|
||||
xDisplay, root,
|
||||
0, 0, width, height, 0,
|
||||
CopyFromParent, InputOutput,
|
||||
CopyFromParent, CWEventMask,
|
||||
&swa
|
||||
);
|
||||
|
||||
glXMakeCurrent(xDisplay, xWindow, glxContext);
|
||||
|
||||
XSetWindowAttributes xattr;
|
||||
xattr.override_redirect = False;
|
||||
XChangeWindowAttributes(xDisplay, xWindow, CWOverrideRedirect, &xattr);
|
||||
|
||||
XMapWindow(xDisplay, xWindow);
|
||||
XStoreName(xDisplay, xWindow, title);
|
||||
|
||||
Atom wmDelete=XInternAtom(xDisplay, "WM_DELETE_WINDOW", True);
|
||||
XSetWMProtocols(xDisplay, xWindow, &wmDelete, 1);
|
||||
|
||||
XFree(vi);
|
||||
}
|
||||
|
||||
void SfwCloseWindow()
|
||||
{
|
||||
glXDestroyContext(xDisplay, glxContext);
|
||||
XDestroyWindow(xDisplay, xWindow);
|
||||
XCloseDisplay(xDisplay);
|
||||
}
|
||||
|
||||
void SfwUpdate()
|
||||
{
|
||||
}
|
||||
|
||||
bool SfwIsDone()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void SfwSetInputManager(gainput::InputManager* manager)
|
||||
{
|
||||
}
|
||||
|
||||
Display* SfwGetXDisplay()
|
||||
{
|
||||
return xDisplay;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
SampleMain();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#elif defined(GAINPUT_PLATFORM_WIN)
|
||||
|
||||
static char szWindowClass[] = "win32app";
|
||||
bool doExit = false;
|
||||
HINSTANCE hInstance;
|
||||
int nCmdShow;
|
||||
HWND hWnd;
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
PAINTSTRUCT ps;
|
||||
HDC hdc;
|
||||
char greeting[] = "Hello, Gainput!";
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_PAINT:
|
||||
hdc = BeginPaint(hWnd, &ps);
|
||||
TextOut(hdc, 5, 5, greeting, strlen(greeting));
|
||||
EndPaint(hWnd, &ps);
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
doExit = true;
|
||||
break;
|
||||
default:
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SfwOpenWindow(const char* title)
|
||||
{
|
||||
WNDCLASSEX wcex;
|
||||
|
||||
wcex.cbSize = sizeof(WNDCLASSEX);
|
||||
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wcex.lpfnWndProc = WndProc;
|
||||
wcex.cbClsExtra = 0;
|
||||
wcex.cbWndExtra = 0;
|
||||
wcex.hInstance = hInstance;
|
||||
wcex.hIcon = 0;
|
||||
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
wcex.lpszMenuName = NULL;
|
||||
wcex.lpszClassName = szWindowClass;
|
||||
wcex.hIconSm = 0;
|
||||
|
||||
if (!RegisterClassEx(&wcex))
|
||||
{
|
||||
MessageBox(NULL, "Call to RegisterClassEx failed!", title, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
hWnd = CreateWindow(
|
||||
szWindowClass,
|
||||
title,
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
width, height,
|
||||
NULL,
|
||||
NULL,
|
||||
hInstance,
|
||||
NULL
|
||||
);
|
||||
|
||||
if (!hWnd)
|
||||
{
|
||||
MessageBox(NULL, "Call to CreateWindow failed!", title, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
ShowWindow(hWnd, nCmdShow);
|
||||
UpdateWindow(hWnd);
|
||||
}
|
||||
|
||||
void SfwCloseWindow()
|
||||
{
|
||||
}
|
||||
|
||||
void SfwUpdate()
|
||||
{
|
||||
}
|
||||
|
||||
bool SfwIsDone()
|
||||
{
|
||||
return doExit;
|
||||
}
|
||||
|
||||
void SfwSetInputManager(gainput::InputManager* manager)
|
||||
{
|
||||
}
|
||||
|
||||
HWND SfwGetHWnd()
|
||||
{
|
||||
return hWnd;
|
||||
}
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstanceMain, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShowMain)
|
||||
{
|
||||
hInstance = hInstanceMain;
|
||||
nCmdShow = nCmdShowMain;
|
||||
SampleMain();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#elif defined(GAINPUT_PLATFORM_ANDROID)
|
||||
|
||||
|
||||
#include <jni.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <EGL/egl.h>
|
||||
#include <GLES/gl.h>
|
||||
|
||||
#include <android/sensor.h>
|
||||
#include <android/log.h>
|
||||
#include <android_native_app_glue.h>
|
||||
|
||||
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "gainput", __VA_ARGS__))
|
||||
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "gainput", __VA_ARGS__))
|
||||
|
||||
static bool doExit = false;
|
||||
struct android_app* state;
|
||||
|
||||
static int32_t MyHandleInput(struct android_app* app, AInputEvent* event)
|
||||
{
|
||||
// Forward input events to Gainput
|
||||
gainput::InputManager* inputManager = (gainput::InputManager*)app->userData;
|
||||
static bool resSet = false;
|
||||
if (!resSet)
|
||||
{
|
||||
inputManager->SetDisplaySize(ANativeWindow_getWidth(app->window), ANativeWindow_getHeight(app->window));
|
||||
resSet = true;
|
||||
}
|
||||
return inputManager->HandleInput(event);
|
||||
}
|
||||
|
||||
static void MyHandleCmd(struct android_app* app, int32_t cmd)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case APP_CMD_SAVE_STATE:
|
||||
break;
|
||||
case APP_CMD_INIT_WINDOW:
|
||||
break;
|
||||
case APP_CMD_TERM_WINDOW:
|
||||
doExit = true;
|
||||
break;
|
||||
case APP_CMD_LOST_FOCUS:
|
||||
doExit = true;
|
||||
break;
|
||||
case APP_CMD_GAINED_FOCUS:
|
||||
// bring back a certain functionality, like monitoring the accelerometer
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SfwOpenWindow(const char* title)
|
||||
{
|
||||
app_dummy();
|
||||
LOGI("Opening window: %s\n", title);
|
||||
}
|
||||
|
||||
void SfwCloseWindow()
|
||||
{
|
||||
ANativeActivity_finish(state->activity);
|
||||
LOGI("Closing window\n");
|
||||
}
|
||||
|
||||
void SfwUpdate()
|
||||
{
|
||||
int ident;
|
||||
int events;
|
||||
struct android_poll_source* source;
|
||||
|
||||
while (!doExit && (ident=ALooper_pollAll(0, NULL, &events, (void**)&source)) >= 0)
|
||||
{
|
||||
if (source != NULL)
|
||||
{
|
||||
source->process(state, source);
|
||||
}
|
||||
|
||||
if (state->destroyRequested != 0)
|
||||
{
|
||||
doExit = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool SfwIsDone()
|
||||
{
|
||||
return doExit;
|
||||
}
|
||||
|
||||
void SfwSetInputManager(gainput::InputManager* manager)
|
||||
{
|
||||
state->userData = manager;
|
||||
state->onInputEvent = &MyHandleInput;
|
||||
state->onAppCmd = &MyHandleCmd;
|
||||
}
|
||||
|
||||
void android_main(struct android_app* stateMain)
|
||||
{
|
||||
state = stateMain;
|
||||
|
||||
SampleMain();
|
||||
}
|
||||
|
||||
#elif defined(GAINPUT_PLATFORM_MAC)
|
||||
|
||||
void SfwOpenWindow(const char* title)
|
||||
{
|
||||
}
|
||||
|
||||
void SfwCloseWindow()
|
||||
{
|
||||
}
|
||||
|
||||
void SfwUpdate()
|
||||
{
|
||||
}
|
||||
|
||||
bool SfwIsDone()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void SfwSetInputManager(gainput::InputManager* manager)
|
||||
{
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
SampleMain();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user