- Restructure osx version to use mp_app_internal.h/mp_app.c
- test new run loop structure on osx
This commit is contained in:
		
							parent
							
								
									72338b1a25
								
							
						
					
					
						commit
						db5b4966e9
					
				| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
.DS_Store
 | 
			
		||||
*.dSYM
 | 
			
		||||
bin/*
 | 
			
		||||
*.metallib
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
set INCLUDES=/I ..\..\src /I ..\..\src\util /I ..\..\src\platform /I ../../ext
 | 
			
		||||
cl /we4013 /Zi /Zc:preprocessor /std:c11 %INCLUDES% main.c /link /LIBPATH:../../bin milepost.lib user32.lib opengl32.lib gdi32.lib /out:test.exe
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
BINDIR=../../bin
 | 
			
		||||
RESDIR=../../resources
 | 
			
		||||
SRCDIR=../../src
 | 
			
		||||
 | 
			
		||||
INCLUDES="-I$SRCDIR -I$SRCDIR/util -I$SRCDIR/platform -I$SRCDIR/app"
 | 
			
		||||
LIBS="-L$BINDIR -lmilepost -framework Carbon -framework Cocoa -framework Metal -framework QuartzCore"
 | 
			
		||||
FLAGS="-mmacos-version-min=10.15.4 -DDEBUG -DLOG_COMPILE_DEBUG"
 | 
			
		||||
 | 
			
		||||
clang -g $FLAGS $LIBS $INCLUDES -o test main.c
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,227 @@
 | 
			
		|||
/************************************************************//**
 | 
			
		||||
*
 | 
			
		||||
*	@file: main.cpp
 | 
			
		||||
*	@author: Martin Fouilleul
 | 
			
		||||
*	@date: 30/07/2022
 | 
			
		||||
*	@revision:
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************/
 | 
			
		||||
#include<stdlib.h>
 | 
			
		||||
#include<string.h>
 | 
			
		||||
 | 
			
		||||
#define _USE_MATH_DEFINES //NOTE: necessary for MSVC
 | 
			
		||||
#include<math.h>
 | 
			
		||||
 | 
			
		||||
#include"milepost.h"
 | 
			
		||||
 | 
			
		||||
#define LOG_SUBSYSTEM "Main"
 | 
			
		||||
 | 
			
		||||
unsigned int program;
 | 
			
		||||
 | 
			
		||||
const char* vshaderSource =
 | 
			
		||||
	"#version 430\n"
 | 
			
		||||
	"attribute vec4 vPosition;\n"
 | 
			
		||||
	"uniform mat4 transform;\n"
 | 
			
		||||
	"void main()\n"
 | 
			
		||||
	"{\n"
 | 
			
		||||
	"   gl_Position = transform*vPosition;\n"
 | 
			
		||||
	"}\n";
 | 
			
		||||
 | 
			
		||||
const char* fshaderSource =
 | 
			
		||||
	"#version 430\n"
 | 
			
		||||
	"precision mediump float;\n"
 | 
			
		||||
	"void main()\n"
 | 
			
		||||
	"{\n"
 | 
			
		||||
	"    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
 | 
			
		||||
	"}\n";
 | 
			
		||||
 | 
			
		||||
void compile_shader(GLuint shader, const char* source)
 | 
			
		||||
{
 | 
			
		||||
	glShaderSource(shader, 1, &source, 0);
 | 
			
		||||
	glCompileShader(shader);
 | 
			
		||||
 | 
			
		||||
	int err = glGetError();
 | 
			
		||||
	if(err)
 | 
			
		||||
	{
 | 
			
		||||
		printf("gl error: %i\n", err);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int status = 0;
 | 
			
		||||
	glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
 | 
			
		||||
	if(!status)
 | 
			
		||||
	{
 | 
			
		||||
		char buffer[256];
 | 
			
		||||
		int size = 0;
 | 
			
		||||
		glGetShaderInfoLog(shader, 256, &size, buffer);
 | 
			
		||||
		printf("shader error: %.*s\n", size, buffer);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
	LogLevel(LOG_LEVEL_DEBUG);
 | 
			
		||||
 | 
			
		||||
	mp_init();
 | 
			
		||||
 | 
			
		||||
	mp_rect rect = {.x = 100, .y = 100, .w = 800, .h = 600};
 | 
			
		||||
	mp_window window = mp_window_create(rect, "test", 0);
 | 
			
		||||
 | 
			
		||||
	//NOTE: create surface
 | 
			
		||||
	mg_surface surface = mg_surface_create_for_window(window, MG_BACKEND_GL);
 | 
			
		||||
 | 
			
		||||
	//NOTE: init shader and gl state
 | 
			
		||||
	GLuint vao;
 | 
			
		||||
	glGenVertexArrays(1, &vao);
 | 
			
		||||
	glBindVertexArray(vao);
 | 
			
		||||
 | 
			
		||||
	GLuint vertexBuffer;
 | 
			
		||||
	glGenBuffers(1, &vertexBuffer);
 | 
			
		||||
 | 
			
		||||
	GLfloat vertices[] = {
 | 
			
		||||
		-0.866/2, -0.5/2, 0, 0.866/2, -0.5/2, 0, 0, 0.5, 0};
 | 
			
		||||
 | 
			
		||||
	glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
 | 
			
		||||
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	unsigned int vshader = glCreateShader(GL_VERTEX_SHADER);
 | 
			
		||||
	unsigned int fshader = glCreateShader(GL_FRAGMENT_SHADER);
 | 
			
		||||
	program = glCreateProgram();
 | 
			
		||||
 | 
			
		||||
	compile_shader(vshader, vshaderSource);
 | 
			
		||||
	compile_shader(fshader, fshaderSource);
 | 
			
		||||
 | 
			
		||||
	glAttachShader(program, vshader);
 | 
			
		||||
	glAttachShader(program, fshader);
 | 
			
		||||
	glLinkProgram(program);
 | 
			
		||||
 | 
			
		||||
	int status = 0;
 | 
			
		||||
	glGetProgramiv(program, GL_LINK_STATUS, &status);
 | 
			
		||||
	if(!status)
 | 
			
		||||
	{
 | 
			
		||||
		char buffer[256];
 | 
			
		||||
		int size = 0;
 | 
			
		||||
		glGetProgramInfoLog(program, 256, &size, buffer);
 | 
			
		||||
		printf("link error: %.*s\n", size, buffer);
 | 
			
		||||
 	}
 | 
			
		||||
 | 
			
		||||
	glUseProgram(program);
 | 
			
		||||
 | 
			
		||||
	mp_window_bring_to_front(window);
 | 
			
		||||
//	mp_window_focus(window);
 | 
			
		||||
 | 
			
		||||
	while(!mp_should_quit())
 | 
			
		||||
	{
 | 
			
		||||
		mp_pump_events(0);
 | 
			
		||||
		mp_event event = {0};
 | 
			
		||||
		while(mp_next_event(&event))
 | 
			
		||||
		{
 | 
			
		||||
			switch(event.type)
 | 
			
		||||
			{
 | 
			
		||||
				case MP_EVENT_WINDOW_CLOSE:
 | 
			
		||||
				{
 | 
			
		||||
					mp_request_quit();
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_WINDOW_RESIZE:
 | 
			
		||||
				{
 | 
			
		||||
					printf("resized, rect = {%f, %f, %f, %f}\n",
 | 
			
		||||
					       event.frame.rect.x,
 | 
			
		||||
					       event.frame.rect.y,
 | 
			
		||||
					       event.frame.rect.w,
 | 
			
		||||
					       event.frame.rect.h);
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_WINDOW_MOVE:
 | 
			
		||||
				{
 | 
			
		||||
					printf("moved, rect = {%f, %f, %f, %f}\n",
 | 
			
		||||
					       event.frame.rect.x,
 | 
			
		||||
					       event.frame.rect.y,
 | 
			
		||||
					       event.frame.rect.w,
 | 
			
		||||
					       event.frame.rect.h);
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_MOUSE_MOVE:
 | 
			
		||||
				{
 | 
			
		||||
					printf("mouse moved, pos = {%f, %f}, delta = {%f, %f}\n",
 | 
			
		||||
					       event.move.x,
 | 
			
		||||
					       event.move.y,
 | 
			
		||||
					       event.move.deltaX,
 | 
			
		||||
					       event.move.deltaY);
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_MOUSE_WHEEL:
 | 
			
		||||
				{
 | 
			
		||||
					printf("mouse wheel, delta = {%f, %f}\n",
 | 
			
		||||
					       event.move.deltaX,
 | 
			
		||||
					       event.move.deltaY);
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_MOUSE_ENTER:
 | 
			
		||||
				{
 | 
			
		||||
					printf("mouse enter\n");
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_MOUSE_LEAVE:
 | 
			
		||||
				{
 | 
			
		||||
					printf("mouse leave\n");
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_MOUSE_BUTTON:
 | 
			
		||||
				{
 | 
			
		||||
					printf("mouse button %i: %i\n",
 | 
			
		||||
					       event.key.code,
 | 
			
		||||
					       event.key.action == MP_KEY_PRESS ? 1 : 0);
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_KEYBOARD_KEY:
 | 
			
		||||
				{
 | 
			
		||||
					printf("key %i: %s\n",
 | 
			
		||||
					        event.key.code,
 | 
			
		||||
					        event.key.action == MP_KEY_PRESS ? "press" : (event.key.action == MP_KEY_RELEASE ? "release" : "repeat"));
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				case MP_EVENT_KEYBOARD_CHAR:
 | 
			
		||||
				{
 | 
			
		||||
					printf("entered char %s\n", event.character.sequence);
 | 
			
		||||
				} break;
 | 
			
		||||
 | 
			
		||||
				default:
 | 
			
		||||
					break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mg_surface_prepare(surface);
 | 
			
		||||
 | 
			
		||||
		glClearColor(0.3, 0.3, 1, 1);
 | 
			
		||||
		glClear(GL_COLOR_BUFFER_BIT);
 | 
			
		||||
 | 
			
		||||
 		static float alpha = 0;
 | 
			
		||||
		//f32 aspect = frameSize.x/frameSize.y;
 | 
			
		||||
		f32 aspect = 800/(f32)600;
 | 
			
		||||
 | 
			
		||||
		glViewport(0, 0, 800, 600);
 | 
			
		||||
 | 
			
		||||
   		GLfloat matrix[] = {cosf(alpha)/aspect, sinf(alpha), 0, 0,
 | 
			
		||||
    	                  		-sinf(alpha)/aspect, cosf(alpha), 0, 0,
 | 
			
		||||
    	                  		0, 0, 1, 0,
 | 
			
		||||
    	                  		0, 0, 0, 1};
 | 
			
		||||
 | 
			
		||||
   		alpha += 2*M_PI/120;
 | 
			
		||||
 | 
			
		||||
   		glUniformMatrix4fv(0, 1, false, matrix);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
 | 
			
		||||
   		glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
 | 
			
		||||
   		glEnableVertexAttribArray(0);
 | 
			
		||||
 | 
			
		||||
   		glDrawArrays(GL_TRIANGLES, 0, 3);
 | 
			
		||||
 | 
			
		||||
		mg_surface_present(surface);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mp_terminate();
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -9,54 +9,10 @@
 | 
			
		|||
#include<stdlib.h>
 | 
			
		||||
#include<string.h>
 | 
			
		||||
 | 
			
		||||
#define _USE_MATH_DEFINES //NOTE: necessary for MSVC
 | 
			
		||||
#include<math.h>
 | 
			
		||||
 | 
			
		||||
#include"milepost.h"
 | 
			
		||||
 | 
			
		||||
#define LOG_SUBSYSTEM "Main"
 | 
			
		||||
 | 
			
		||||
unsigned int program;
 | 
			
		||||
 | 
			
		||||
const char* vshaderSource =
 | 
			
		||||
	"#version 430\n"
 | 
			
		||||
	"attribute vec4 vPosition;\n"
 | 
			
		||||
	"uniform mat4 transform;\n"
 | 
			
		||||
	"void main()\n"
 | 
			
		||||
	"{\n"
 | 
			
		||||
	"   gl_Position = transform*vPosition;\n"
 | 
			
		||||
	"}\n";
 | 
			
		||||
 | 
			
		||||
const char* fshaderSource =
 | 
			
		||||
	"#version 430\n"
 | 
			
		||||
	"precision mediump float;\n"
 | 
			
		||||
	"void main()\n"
 | 
			
		||||
	"{\n"
 | 
			
		||||
	"    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
 | 
			
		||||
	"}\n";
 | 
			
		||||
 | 
			
		||||
void compile_shader(GLuint shader, const char* source)
 | 
			
		||||
{
 | 
			
		||||
	glShaderSource(shader, 1, &source, 0);
 | 
			
		||||
	glCompileShader(shader);
 | 
			
		||||
 | 
			
		||||
	int err = glGetError();
 | 
			
		||||
	if(err)
 | 
			
		||||
	{
 | 
			
		||||
		printf("gl error: %i\n", err);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int status = 0;
 | 
			
		||||
	glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
 | 
			
		||||
	if(!status)
 | 
			
		||||
	{
 | 
			
		||||
		char buffer[256];
 | 
			
		||||
		int size = 0;
 | 
			
		||||
		glGetShaderInfoLog(shader, 256, &size, buffer);
 | 
			
		||||
		printf("shader error: %.*s\n", size, buffer);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
	LogLevel(LOG_LEVEL_DEBUG);
 | 
			
		||||
| 
						 | 
				
			
			@ -66,49 +22,8 @@ int main()
 | 
			
		|||
	mp_rect rect = {.x = 100, .y = 100, .w = 800, .h = 600};
 | 
			
		||||
	mp_window window = mp_window_create(rect, "test", 0);
 | 
			
		||||
 | 
			
		||||
	//NOTE: create surface
 | 
			
		||||
	mg_surface surface = mg_surface_create_for_window(window, MG_BACKEND_GL);
 | 
			
		||||
 | 
			
		||||
	//NOTE: init shader and gl state
 | 
			
		||||
	GLuint vao;
 | 
			
		||||
	glGenVertexArrays(1, &vao);
 | 
			
		||||
	glBindVertexArray(vao);
 | 
			
		||||
 | 
			
		||||
	GLuint vertexBuffer;
 | 
			
		||||
	glGenBuffers(1, &vertexBuffer);
 | 
			
		||||
 | 
			
		||||
	GLfloat vertices[] = {
 | 
			
		||||
		-0.866/2, -0.5/2, 0, 0.866/2, -0.5/2, 0, 0, 0.5, 0};
 | 
			
		||||
 | 
			
		||||
	glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
 | 
			
		||||
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	unsigned int vshader = glCreateShader(GL_VERTEX_SHADER);
 | 
			
		||||
	unsigned int fshader = glCreateShader(GL_FRAGMENT_SHADER);
 | 
			
		||||
	program = glCreateProgram();
 | 
			
		||||
 | 
			
		||||
	compile_shader(vshader, vshaderSource);
 | 
			
		||||
	compile_shader(fshader, fshaderSource);
 | 
			
		||||
 | 
			
		||||
	glAttachShader(program, vshader);
 | 
			
		||||
	glAttachShader(program, fshader);
 | 
			
		||||
	glLinkProgram(program);
 | 
			
		||||
 | 
			
		||||
	int status = 0;
 | 
			
		||||
	glGetProgramiv(program, GL_LINK_STATUS, &status);
 | 
			
		||||
	if(!status)
 | 
			
		||||
	{
 | 
			
		||||
		char buffer[256];
 | 
			
		||||
		int size = 0;
 | 
			
		||||
		glGetProgramInfoLog(program, 256, &size, buffer);
 | 
			
		||||
		printf("link error: %.*s\n", size, buffer);
 | 
			
		||||
 	}
 | 
			
		||||
 | 
			
		||||
	glUseProgram(program);
 | 
			
		||||
 | 
			
		||||
	mp_window_bring_to_front(window);
 | 
			
		||||
//	mp_window_focus(window);
 | 
			
		||||
	mp_window_focus(window);
 | 
			
		||||
 | 
			
		||||
	while(!mp_should_quit())
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -190,35 +105,6 @@ int main()
 | 
			
		|||
					break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mg_surface_prepare(surface);
 | 
			
		||||
 | 
			
		||||
		glClearColor(0.3, 0.3, 1, 1);
 | 
			
		||||
		glClear(GL_COLOR_BUFFER_BIT);
 | 
			
		||||
 | 
			
		||||
 		static float alpha = 0;
 | 
			
		||||
		//f32 aspect = frameSize.x/frameSize.y;
 | 
			
		||||
		f32 aspect = 800/(f32)600;
 | 
			
		||||
 | 
			
		||||
		glViewport(0, 0, 800, 600);
 | 
			
		||||
 | 
			
		||||
   		GLfloat matrix[] = {cosf(alpha)/aspect, sinf(alpha), 0, 0,
 | 
			
		||||
    	                  		-sinf(alpha)/aspect, cosf(alpha), 0, 0,
 | 
			
		||||
    	                  		0, 0, 1, 0,
 | 
			
		||||
    	                  		0, 0, 0, 1};
 | 
			
		||||
 | 
			
		||||
   		alpha += 2*M_PI/120;
 | 
			
		||||
 | 
			
		||||
   		glUniformMatrix4fv(0, 1, false, matrix);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
 | 
			
		||||
   		glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
 | 
			
		||||
   		glEnableVertexAttribArray(0);
 | 
			
		||||
 | 
			
		||||
   		glDrawArrays(GL_TRIANGLES, 0, 3);
 | 
			
		||||
 | 
			
		||||
		mg_surface_present(surface);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mp_terminate();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -355,6 +355,11 @@ mg_surface mg_surface_nil()
 | 
			
		|||
	return((mg_surface){.h = 0});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool mg_surface_is_nil(mg_surface surface)
 | 
			
		||||
{
 | 
			
		||||
	return(surface.h == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mg_surface mg_surface_alloc_handle(mg_surface_info* surface)
 | 
			
		||||
{
 | 
			
		||||
	mg_resource_slot* slot = mg_resource_slot_alloc(&__mgInfo.surfaces);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,7 @@ typedef enum { MG_BACKEND_DUMMY,
 | 
			
		|||
void mg_init();
 | 
			
		||||
 | 
			
		||||
mg_surface mg_surface_nil();
 | 
			
		||||
bool mg_surface_is_nil(mg_surface surface);
 | 
			
		||||
mg_surface mg_surface_create_for_window(mp_window window, mg_backend_id backend);
 | 
			
		||||
mg_surface mg_surface_create_for_view(mp_view view, mg_backend_id backend);
 | 
			
		||||
mg_surface mg_surface_create_offscreen(mg_backend_id backend, u32 width, u32 height);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -259,7 +259,7 @@ mg_surface mg_metal_surface_create_for_window(mp_window window)
 | 
			
		|||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		return(mg_metal_surface_create_for_view(windowData->mainView));
 | 
			
		||||
		return(mg_metal_surface_create_for_view(windowData->osx.mainView));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -207,7 +207,7 @@ typedef enum {
 | 
			
		|||
typedef struct mp_key_event		// keyboard and mouse buttons input
 | 
			
		||||
{
 | 
			
		||||
	mp_key_action action;
 | 
			
		||||
	mp_key_code	code;
 | 
			
		||||
	i32	code;
 | 
			
		||||
	mp_key_mods	mods;
 | 
			
		||||
	char label[8];
 | 
			
		||||
	u8 labelLen;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -136,6 +136,9 @@ typedef struct mp_app
 | 
			
		|||
	mp_window_data windowPool[MP_APP_MAX_WINDOWS];
 | 
			
		||||
	list_info windowFreeList;
 | 
			
		||||
 | 
			
		||||
	mp_live_resize_callback liveResizeCallback;
 | 
			
		||||
	void* liveResizeData;
 | 
			
		||||
 | 
			
		||||
	mp_input_state inputState;
 | 
			
		||||
 | 
			
		||||
	mp_key_utf8 keyLabels[256];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,29 +9,32 @@
 | 
			
		|||
#ifndef __OSX_APP_H_
 | 
			
		||||
#define __OSX_APP_H_
 | 
			
		||||
 | 
			
		||||
#import<Cocoa/Cocoa.h>
 | 
			
		||||
#import<Carbon/Carbon.h>
 | 
			
		||||
#include"mp_app.h"
 | 
			
		||||
#include"graphics.h"
 | 
			
		||||
 | 
			
		||||
typedef struct mp_window_data
 | 
			
		||||
{
 | 
			
		||||
	list_elt freeListElt;
 | 
			
		||||
	u32 generation;
 | 
			
		||||
#ifdef __OBJC__
 | 
			
		||||
	#import<Cocoa/Cocoa.h>
 | 
			
		||||
#else
 | 
			
		||||
	#define NSWindow void
 | 
			
		||||
	#define NSView void
 | 
			
		||||
	#define NSObject void
 | 
			
		||||
	#define NSTimer void
 | 
			
		||||
	#define NSCursor void
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include<Carbon/Carbon.h>
 | 
			
		||||
 | 
			
		||||
typedef struct osx_window_data
 | 
			
		||||
{
 | 
			
		||||
	NSWindow* nsWindow;
 | 
			
		||||
	NSView*   nsView;
 | 
			
		||||
	NSObject* nsWindowDelegate;
 | 
			
		||||
 | 
			
		||||
	mp_rect contentRect;
 | 
			
		||||
	mp_rect frameRect;
 | 
			
		||||
	mp_window_style	style;
 | 
			
		||||
 | 
			
		||||
	bool shouldClose; //TODO could be in status flags
 | 
			
		||||
	bool hidden;
 | 
			
		||||
 | 
			
		||||
	mp_view mainView;
 | 
			
		||||
} mp_window_data;
 | 
			
		||||
 | 
			
		||||
} osx_window_data;
 | 
			
		||||
 | 
			
		||||
#define MP_PLATFORM_WINDOW_DATA osx_window_data osx;
 | 
			
		||||
 | 
			
		||||
typedef struct mp_view_data
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -43,15 +46,23 @@ typedef struct mp_view_data
 | 
			
		|||
	mg_surface surface;
 | 
			
		||||
} mp_view_data;
 | 
			
		||||
 | 
			
		||||
@interface MPNativeWindow : NSWindow
 | 
			
		||||
{
 | 
			
		||||
	mp_window_data* mpWindow;
 | 
			
		||||
}
 | 
			
		||||
- (id)initWithMPWindow:(mp_window_data*) window contentRect:(NSRect) rect styleMask:(uint32) style;
 | 
			
		||||
@end
 | 
			
		||||
const u32 MP_APP_MAX_VIEWS = 128;
 | 
			
		||||
 | 
			
		||||
mp_window_data* mp_window_ptr_from_handle(mp_window handle);
 | 
			
		||||
mp_view_data* mp_view_ptr_from_handle(mp_view handle);
 | 
			
		||||
typedef struct osx_app_data
 | 
			
		||||
{
 | 
			
		||||
	NSTimer* frameTimer;
 | 
			
		||||
	NSCursor* cursor;
 | 
			
		||||
 | 
			
		||||
	TISInputSourceRef kbLayoutInputSource;
 | 
			
		||||
	void* kbLayoutUnicodeData;
 | 
			
		||||
	id kbLayoutListener;
 | 
			
		||||
 | 
			
		||||
	list_info viewFreeList;
 | 
			
		||||
	mp_view_data viewPool[MP_APP_MAX_VIEWS];
 | 
			
		||||
 | 
			
		||||
} osx_app_data;
 | 
			
		||||
 | 
			
		||||
#define MP_PLATFORM_APP_DATA osx_app_data osx;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										893
									
								
								src/osx_app.m
								
								
								
								
							
							
						
						
									
										893
									
								
								src/osx_app.m
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -19,4 +19,4 @@
 | 
			
		|||
	#include<stdatomic.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif __ATOMIC_H_
 | 
			
		||||
#endif //__ATOMIC_H_
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								todo.txt
								
								
								
								
							
							
						
						
									
										21
									
								
								todo.txt
								
								
								
								
							| 
						 | 
				
			
			@ -19,30 +19,39 @@ Windows port
 | 
			
		|||
	(mp_app.c can 'see' platform specific stuff, so ObjectiveC defs pose a problem, but we can define id as void*
 | 
			
		||||
	when not in ObjC...)
 | 
			
		||||
 | 
			
		||||
[ ] Check changes in macos version
 | 
			
		||||
	[x] Restructure macos version to use mp_app_internal.h/mp_app.c
 | 
			
		||||
	[x] test new run loop structure on macos
 | 
			
		||||
	[x] Fix resize crash when there's no surface
 | 
			
		||||
	[ ] separate data for key and mouse event?
 | 
			
		||||
	[ ] Clarify how we want to do view handling across platforms
 | 
			
		||||
		[ ] Views (using docked windows?) -- or see if we can use surfaces and restrict their location?
 | 
			
		||||
		[ ] pull views in common stuff
 | 
			
		||||
	[ ] use isARepeat in macos keyDown event and simplify update key state
 | 
			
		||||
 | 
			
		||||
[ ] Simplify event structs
 | 
			
		||||
 | 
			
		||||
[.] Implement input polling
 | 
			
		||||
	[ ] Simplify input polling API names
 | 
			
		||||
	[/] Try to simplify input state and polling once we have UI usage code
 | 
			
		||||
 | 
			
		||||
[ ] Finish window properties query/setting
 | 
			
		||||
 | 
			
		||||
[ ] use isARepeat in macos keyDown event and simplify update key state
 | 
			
		||||
 | 
			
		||||
[ ] Implement clipboard
 | 
			
		||||
[ ] Implement file dialogs
 | 
			
		||||
[ ] Impement resource path... -> maybe in abstracted file handling
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[ ] Clean backend selection (compile time and runtime)
 | 
			
		||||
[ ] Finish OpenGL loader
 | 
			
		||||
[ ] Test compute shaders
 | 
			
		||||
[ ] Initial version of vector graphics backend
 | 
			
		||||
[ ] Check integration of UI.
 | 
			
		||||
 | 
			
		||||
[ ] Views (using docked windows?) -- or see if we can use surfaces and restrict their location?
 | 
			
		||||
 | 
			
		||||
[ ] test new run loop structure on macos
 | 
			
		||||
[ ] Remove unused APIs
 | 
			
		||||
 | 
			
		||||
[ ] OpenGL backend on OSX
 | 
			
		||||
[ ] Port vector graphics to OpenGL
 | 
			
		||||
[ ] Check OpenGL vector graphics on windows
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Misc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue