Add initial input support , fix bugs , refractor and implement some methods

Rotation also works now
This commit is contained in:
Curi0 2017-10-11 13:09:25 +05:30
parent 1daf1401fb
commit 56816cd0ba
4 changed files with 58 additions and 46 deletions

View File

@ -30,9 +30,21 @@
extern int main(); extern int main();
void handle_cmd(struct android_app* _app, int32_t cmd) { void handle_cmd(struct android_app* _app, int32_t cmd) {
switch (cmd) switch (cmd) {
case APP_CMD_INIT_WINDOW: case APP_CMD_INIT_WINDOW: {
app = _app; // The window is being shown so the initialization is finished. app = _app; // The window is being shown so the initialization is finished.
break;
}
case APP_CMD_LOST_FOCUS: {
break;
}
case APP_CMD_GAINED_FOCUS: {
break;
}
case APP_CMD_TERM_WINDOW: {
glfwDestroyWindow((GLFWwindow *) _glfw.windowListHead);
}
}
} }
// Android Entry Point // Android Entry Point
@ -45,20 +57,12 @@ void android_main(struct android_app *app) {
int events; int events;
struct android_poll_source* source; struct android_poll_source* source;
while ((ident=ALooper_pollAll(0, NULL, &events,(void**)&source)) >= 0) { // Process events
while ((ident=ALooper_pollAll(0, NULL, &events,(void**)&source)) >= 0)
// Process this event. if (source != NULL)
if (source != NULL) {
source->process(app, source); source->process(app, source);
} }
// Check if we are exiting.
if (app->destroyRequested != 0) {
return;
}
}
}
} }
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
////// GLFW platform API ////// ////// GLFW platform API //////

View File

@ -39,8 +39,8 @@
#define _glfw_dlclose(handle) dlclose(handle) #define _glfw_dlclose(handle) dlclose(handle)
#define _glfw_dlsym(handle, name) dlsym(handle, name) #define _glfw_dlsym(handle, name) dlsym(handle, name)
#define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->android.app->window) #define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->android->window)
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowAndroid android #define _GLFW_PLATFORM_WINDOW_STATE struct android_app* android
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE
#define _GLFW_PLATFORM_MONITOR_STATE #define _GLFW_PLATFORM_MONITOR_STATE
#define _GLFW_PLATFORM_CURSOR_STATE #define _GLFW_PLATFORM_CURSOR_STATE
@ -50,13 +50,6 @@
struct android_app *app; struct android_app *app;
// Android-specific per-window data
typedef struct _GLFWwindowAndroid
{
int width;
int height;
struct android_app *app;
} _GLFWwindowAndroid;
typedef VkFlags VkAndroidSurfaceCreateFlagsKHR; typedef VkFlags VkAndroidSurfaceCreateFlagsKHR;

View File

@ -26,8 +26,20 @@
//======================================================================== //========================================================================
#include "internal.h" #include "internal.h"
#include <android_native_app_glue.h>
#include <android/log.h> float x,y;
static int32_t handle_input(struct android_app* app, AInputEvent* event)
{
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION)
for (size_t i = 0; i < AMotionEvent_getPointerCount(event); ++i) {
x = AMotionEvent_getX(event, i);
y = AMotionEvent_getY(event, i);
}
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY)
_glfwInputKey(_glfw.windowListHead, 0 , AKeyEvent_getKeyCode(event), GLFW_PRESS,0);
return 0;
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
////// GLFW platform API ////// ////// GLFW platform API //////
@ -38,33 +50,36 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
const _GLFWctxconfig* ctxconfig, const _GLFWctxconfig* ctxconfig,
const _GLFWfbconfig* fbconfig) const _GLFWfbconfig* fbconfig)
{ {
window->android.app = app; window->android = app;
window->android->onInputEvent = handle_input;
if (ctxconfig->client != GLFW_NO_API) ANativeWindow_setBuffersGeometry(window->android->window, wndconfig->width, wndconfig->height, 0);
{
if ((ctxconfig->source == GLFW_NATIVE_CONTEXT_API) | (ctxconfig->source == GLFW_EGL_CONTEXT_API)) if (ctxconfig->client != GLFW_NO_API) {
{ if ((ctxconfig->source == GLFW_NATIVE_CONTEXT_API) |
(ctxconfig->source == GLFW_EGL_CONTEXT_API)) {
if (!_glfwInitEGL()) if (!_glfwInitEGL())
return GLFW_FALSE; return GLFW_FALSE;
if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig)) if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig))
return GLFW_FALSE; return GLFW_FALSE;
} } else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API) {
else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API)
{
if (!_glfwInitOSMesa()) if (!_glfwInitOSMesa())
return GLFW_FALSE; return GLFW_FALSE;
if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig)) if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))
return GLFW_FALSE; return GLFW_FALSE;
} }
} }
return GLFW_TRUE; return GLFW_TRUE;
} }
void _glfwPlatformDestroyWindow(_GLFWwindow* window) void _glfwPlatformDestroyWindow(_GLFWwindow* window)
{ {
if (window->context.destroy) if (window->context.destroy)
window->context.destroy(window); window->context.destroy(window);
ANativeActivity_finish(window->android->activity);
} }
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title) void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
@ -86,6 +101,7 @@ void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos) void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
{ {
} }
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos) void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
@ -94,22 +110,19 @@ void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height) void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
{ {
if (width) *height = ANativeWindow_getHeight(window->android->window);
*width = window->android.width; *width = ANativeWindow_getWidth(window->android->window);
if (height)
*height = window->android.height;
} }
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
{ {
window->android.width = width;
window->android.height = height;
} }
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window, void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
int minwidth, int minheight, int minwidth, int minheight,
int maxwidth, int maxheight) int maxwidth, int maxheight)
{ {
} }
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int n, int d) void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int n, int d)
@ -118,10 +131,7 @@ void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int n, int d)
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height) void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
{ {
if (width)
*width = window->android.width;
if (height)
*height = window->android.height;
} }
void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window, void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,
@ -197,10 +207,12 @@ int _glfwPlatformWindowVisible(_GLFWwindow* window)
void _glfwPlatformPollEvents(void) void _glfwPlatformPollEvents(void)
{ {
_glfwInputCursorPos(_glfw.windowListHead, x ,y);
} }
void _glfwPlatformWaitEvents(void) void _glfwPlatformWaitEvents(void)
{ {
_glfwPlatformPollEvents();
} }
void _glfwPlatformWaitEventsTimeout(double timeout) void _glfwPlatformWaitEventsTimeout(double timeout)
@ -213,6 +225,8 @@ void _glfwPlatformPostEmptyEvent(void)
void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos) void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
{ {
*xpos = x;
*ypos = y;
} }
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y) void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)
@ -303,7 +317,7 @@ VkResult _glfwPlatformCreateWindowSurface(VkInstance instance,
memset(&sci, 0, sizeof(sci)); memset(&sci, 0, sizeof(sci));
sci.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR; sci.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
sci.window = window->android.app->window; sci.window = window->android->window;
err = vkCreateAndroidSurfaceKHR(instance, &sci, allocator, surface); err = vkCreateAndroidSurfaceKHR(instance, &sci, allocator, surface);
if (err) if (err)
@ -324,5 +338,5 @@ GLFWAPI struct android_app * glfwGetAndroidApp(GLFWwindow* handle)
{ {
_GLFWwindow* window = (_GLFWwindow*)handle; _GLFWwindow* window = (_GLFWwindow*)handle;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
return window->android.app; return window->android;
} }

View File

@ -590,6 +590,7 @@ GLFWAPI void glfwMakeContextCurrent(GLFWwindow* handle)
_glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL); _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);
return; return;
} }
if (previous) if (previous)
{ {
if (!window || window->context.source != previous->context.source) if (!window || window->context.source != previous->context.source)