Files
kaizen/samples/samplefw/SampleFramework.cpp
Simone 4e42229bdd Squashed 'external/gainput/' content from commit 2be0a50
git-subtree-dir: external/gainput
git-subtree-split: 2be0a50089eafcc6fccb66142180082e48f27f4c
2024-01-22 08:51:55 +01:00

360 lines
6.2 KiB
C++

#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