Finished implementing the run loop.
parent
f7b0b05426
commit
fd1c41bab4
|
@ -185,6 +185,10 @@ struct Mac_Vars {
|
||||||
|
|
||||||
i32 cursor_show;
|
i32 cursor_show;
|
||||||
i32 prev_cursor_show;
|
i32 prev_cursor_show;
|
||||||
|
NSCursor *cursor_ibeam;
|
||||||
|
NSCursor *cursor_arrow;
|
||||||
|
NSCursor *cursor_leftright;
|
||||||
|
NSCursor *cursor_updown;
|
||||||
|
|
||||||
String_Const_u8 binary_path;
|
String_Const_u8 binary_path;
|
||||||
|
|
||||||
|
@ -437,6 +441,8 @@ mac_file_can_be_made(u8* filename){
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
function void
|
function void
|
||||||
mac_resize(float width, float height){
|
mac_resize(float width, float height){
|
||||||
if ((width > 0.0f) && (height > 0.0f)){
|
if ((width > 0.0f) && (height > 0.0f)){
|
||||||
|
@ -467,6 +473,8 @@ mac_resize(NSWindow *window){
|
||||||
mac_resize(bounds.size.width, bounds.size.height);
|
mac_resize(bounds.size.width, bounds.size.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
function u32
|
function u32
|
||||||
mac_get_clipboard_change_count(void){
|
mac_get_clipboard_change_count(void){
|
||||||
NSPasteboard *board = [NSPasteboard generalPasteboard];
|
NSPasteboard *board = [NSPasteboard generalPasteboard];
|
||||||
|
@ -526,18 +534,28 @@ mac_post_clipboard(Arena *scratch, char *text, i32 len){
|
||||||
mac_vars.next_clipboard_is_self = true;
|
mac_vars.next_clipboard_is_self = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
|
function void
|
||||||
|
mac_toggle_fullscreen(void){
|
||||||
|
[mac_vars.window toggleFullScreen:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
#if defined(FRED_INTERNAL)
|
#if defined(FRED_INTERNAL)
|
||||||
function inline void
|
function inline void
|
||||||
mac_profile(char *name, u64 begin, u64 end){
|
mac_profile(char *name, u64 begin, u64 end){
|
||||||
printf("%s Time: %fs\n", name, ((end - begin) / 1000000.0f));
|
printf("%s Time: %fs\n", name, ((end - begin) / 1000000.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MacProfileScope(name) for (u64 i = 0, begin = system_now_time();\
|
#define MacProfileScope(name) for (u64 glue(_i_, __LINE__) = 0, glue(_begin_, __LINE__) = system_now_time();\
|
||||||
i == 0;\
|
glue(_i_, __LINE__) == 0;\
|
||||||
i = 1, mac_profile(name, begin, system_now_time()))
|
glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_time()))
|
||||||
#else
|
#else
|
||||||
# define MacProfileScope(...)
|
# define MacProfileScope(...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
@implementation FCoder_App_Delegate
|
@implementation FCoder_App_Delegate
|
||||||
|
@ -683,16 +701,16 @@ i = 1, mac_profile(name, begin, system_now_time()))
|
||||||
|
|
||||||
mac_vars.clip_post.size = 0;
|
mac_vars.clip_post.size = 0;
|
||||||
|
|
||||||
|
// NOTE(yuval): Application Core Update
|
||||||
Application_Step_Result result = {};
|
Application_Step_Result result = {};
|
||||||
MacProfileScope("Step"){
|
MacProfileScope("Step"){
|
||||||
// NOTE(yuval): Application Core Update
|
|
||||||
if (app.step != 0){
|
if (app.step != 0){
|
||||||
result = app.step(mac_vars.tctx, &target, mac_vars.base_ptr, &input);
|
result = app.step(mac_vars.tctx, &target, mac_vars.base_ptr, &input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE(yuval): Quit the app if requested by the application core
|
||||||
MacProfileScope("Perform Kill"){
|
MacProfileScope("Perform Kill"){
|
||||||
// NOTE(yuval): Quit the app
|
|
||||||
if (result.perform_kill){
|
if (result.perform_kill){
|
||||||
printf("Terminating 4coder!\n");
|
printf("Terminating 4coder!\n");
|
||||||
[NSApp terminate:nil];
|
[NSApp terminate:nil];
|
||||||
|
@ -707,11 +725,75 @@ i = 1, mac_profile(name, begin, system_now_time()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MacProfileScope("Render"){
|
// NOTE(yuval): Switch to a new title
|
||||||
|
MacProfileScope("Switch Title"){
|
||||||
|
if (result.has_new_title){
|
||||||
|
NSString *str = [NSString stringWithUTF8String:result.title_string];
|
||||||
|
[mac_vars.window setTitle:str];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(yuval): Switch to new cursor
|
||||||
|
MacProfileScope("Switch Cursor"){
|
||||||
|
// NOTE(yuval): Switch cursor type
|
||||||
|
switch (result.mouse_cursor_type){
|
||||||
|
case APP_MOUSE_CURSOR_ARROW:
|
||||||
|
{
|
||||||
|
[mac_vars.cursor_arrow set];
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case APP_MOUSE_CURSOR_IBEAM:
|
||||||
|
{
|
||||||
|
[mac_vars.cursor_ibeam set];
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case APP_MOUSE_CURSOR_LEFTRIGHT:
|
||||||
|
{
|
||||||
|
[mac_vars.cursor_leftright set];
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case APP_MOUSE_CURSOR_UPDOWN:
|
||||||
|
{
|
||||||
|
[mac_vars.cursor_updown set];
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(yuval): Show or hide cursor
|
||||||
|
if (mac_vars.cursor_show != mac_vars.prev_cursor_show){
|
||||||
|
switch (mac_vars.cursor_show){
|
||||||
|
case MouseCursorShow_Never:
|
||||||
|
{
|
||||||
|
[NSCursor hide];
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case MouseCursorShow_Always:
|
||||||
|
{
|
||||||
|
[NSCursor unhide];
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mac_vars.prev_cursor_show = mac_vars.cursor_show;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(yuval): Update lctrl_lalt_is_altgr status
|
||||||
|
mac_vars.lctrl_lalt_is_altgr = (b8)result.lctrl_lalt_is_altgr;
|
||||||
|
|
||||||
// NOTE(yuval): Render
|
// NOTE(yuval): Render
|
||||||
|
MacProfileScope("Render"){
|
||||||
renderer->render(renderer, &target);
|
renderer->render(renderer, &target);
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(yuval): Toggle full screen
|
||||||
|
MacProfileScope("Toggle Full Screen"){
|
||||||
|
if (mac_vars.do_toggle){
|
||||||
|
mac_toggle_fullscreen();
|
||||||
|
mac_vars.do_toggle = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE(yuval): Schedule another step if needed
|
// NOTE(yuval): Schedule another step if needed
|
||||||
|
MacProfileScope("Schedule Animations"){
|
||||||
if (result.animating){
|
if (result.animating){
|
||||||
system_signal_step(0);
|
system_signal_step(0);
|
||||||
}
|
}
|
||||||
|
@ -1026,9 +1108,6 @@ main(int arg_count, char **args){
|
||||||
mac_vars.frame_arena = reserve_arena(mac_vars.tctx);
|
mac_vars.frame_arena = reserve_arena(mac_vars.tctx);
|
||||||
target.arena = make_arena_system(KB(256));
|
target.arena = make_arena_system(KB(256));
|
||||||
|
|
||||||
mac_vars.cursor_show = MouseCursorShow_Always;
|
|
||||||
mac_vars.prev_cursor_show = MouseCursorShow_Always;
|
|
||||||
|
|
||||||
dll_init_sentinel(&mac_vars.free_mac_objects);
|
dll_init_sentinel(&mac_vars.free_mac_objects);
|
||||||
dll_init_sentinel(&mac_vars.timer_objects);
|
dll_init_sentinel(&mac_vars.timer_objects);
|
||||||
|
|
||||||
|
@ -1178,7 +1257,7 @@ main(int arg_count, char **args){
|
||||||
|
|
||||||
[mac_vars.window setMinSize:NSMakeSize(100, 100)];
|
[mac_vars.window setMinSize:NSMakeSize(100, 100)];
|
||||||
[mac_vars.window setBackgroundColor:NSColor.blackColor];
|
[mac_vars.window setBackgroundColor:NSColor.blackColor];
|
||||||
[mac_vars.window setTitle:@WINDOW_NAME];
|
[mac_vars.window setTitle:@"GRAPHICS"];
|
||||||
[mac_vars.window setAcceptsMouseMovedEvents:YES];
|
[mac_vars.window setAcceptsMouseMovedEvents:YES];
|
||||||
|
|
||||||
NSView* content_view = [mac_vars.window contentView];
|
NSView* content_view = [mac_vars.window contentView];
|
||||||
|
@ -1223,6 +1302,17 @@ main(int arg_count, char **args){
|
||||||
// NOTE(yuval): Initialize the virtul keycodes table
|
// NOTE(yuval): Initialize the virtul keycodes table
|
||||||
mac_keycode_init();
|
mac_keycode_init();
|
||||||
|
|
||||||
|
// NOTE(yuval): Initialize cursors
|
||||||
|
{
|
||||||
|
mac_vars.cursor_show = MouseCursorShow_Always;
|
||||||
|
mac_vars.prev_cursor_show = MouseCursorShow_Always;
|
||||||
|
|
||||||
|
mac_vars.cursor_arrow = [NSCursor arrowCursor];
|
||||||
|
mac_vars.cursor_ibeam = [NSCursor IBeamCursor];
|
||||||
|
mac_vars.cursor_leftright = [NSCursor resizeLeftRightCursor];
|
||||||
|
mac_vars.cursor_updown = [NSCursor resizeUpDownCursor];
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE(yuval): Get the timebase info
|
// NOTE(yuval): Get the timebase info
|
||||||
mach_timebase_info(&mac_vars.timebase_info);
|
mach_timebase_info(&mac_vars.timebase_info);
|
||||||
|
|
||||||
|
@ -1244,6 +1334,10 @@ main(int arg_count, char **args){
|
||||||
mac_vars.first = true;
|
mac_vars.first = true;
|
||||||
mac_vars.step_requested = false;
|
mac_vars.step_requested = false;
|
||||||
|
|
||||||
|
if (plat_settings.fullscreen_window){
|
||||||
|
mac_toggle_fullscreen();
|
||||||
|
}
|
||||||
|
|
||||||
mac_vars.global_frame_mutex = system_mutex_make();
|
mac_vars.global_frame_mutex = system_mutex_make();
|
||||||
|
|
||||||
mac_vars.timer_start = system_now_time();
|
mac_vars.timer_start = system_now_time();
|
||||||
|
|
Loading…
Reference in New Issue