From fccb93ccf9ed8ed0e0cc1a82d2cd0ec8aaf62836 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 7 Nov 2017 19:18:57 -0500 Subject: [PATCH] working on Mac event limitted execution --- 4coder_API/version.h | 2 +- 4coder_default_hooks.cpp | 2 +- platform_mac/mac_4ed.cpp | 45 ++++++++++++------ platform_mac/mac_4ed.m | 52 +++++++++++++++++---- platform_mac/osx_objective_c_to_cpp_links.h | 5 +- 5 files changed, 80 insertions(+), 26 deletions(-) diff --git a/4coder_API/version.h b/4coder_API/version.h index 7c9a4264..059f17c0 100644 --- a/4coder_API/version.h +++ b/4coder_API/version.h @@ -3,7 +3,7 @@ #define PATCH 22 // string -#define VN__(a,b,c) #a"."#b"."#c +#define VN__(a,b,c) #a "." #b "." #c #define VN_(a,b,c) VN__(a,b,c) #define VERSION_NUMBER VN_(MAJOR,MINOR,PATCH) #define VERSION_STRING "alpha " VERSION_NUMBER diff --git a/4coder_default_hooks.cpp b/4coder_default_hooks.cpp index 149d1895..0f186f6c 100644 --- a/4coder_default_hooks.cpp +++ b/4coder_default_hooks.cpp @@ -120,7 +120,7 @@ OPEN_FILE_HOOK_SIG(default_file_settings){ parse_context_id = parse_context_language_rust; } - if (match(ext, "cpp") || match(ext, "h") || match(ext, "c") || match(ext, "hpp") || match(ext, "cc")){ + if (match(ext, "cpp") || match(ext, "h") || match(ext, "c") || match(ext, "hpp") || match(ext, "cc") || match(ext, "glsl") || match(ext, "m")){ if (parse_context_language_cpp == 0){ init_language_cpp(app); } diff --git a/platform_mac/mac_4ed.cpp b/platform_mac/mac_4ed.cpp index 18687d79..142db677 100644 --- a/platform_mac/mac_4ed.cpp +++ b/platform_mac/mac_4ed.cpp @@ -125,10 +125,8 @@ Sys_Get_4ed_Path_Sig(system_get_4ed_path){ //////////////////////////////// internal void -system_schedule_step(){ - // NOTE(allen): It is unclear to me right now what we might need to actually do here. - // The run loop in a Cocoa app will keep rendering the app anyway, I might just need to set a - // "do_new_frame" variable of some kind to true here. +system_schedule_step(void){ + osx_schedule_step(); } //////////////////////////////// @@ -189,7 +187,9 @@ Sys_Post_Clipboard_Sig(system_post_clipboard){ // CLI // -// HACK(allen): ALMOST an exact duplicate from the Linux version. Just epoll doesn't port. deduplicate. +// HACK(allen): ALMOST an exact duplicate from the Linux version. Just epoll doesn't port. deduplicate or switch to NSTask. +global i32 cli_count = 0; + internal Sys_CLI_Call_Sig(system_cli_call){ i32 pipe_fds[2]; @@ -231,7 +231,7 @@ Sys_CLI_Call_Sig(system_cli_call){ *(int*)&cli_out->out_read = pipe_fds[PIPE_FD_READ]; *(int*)&cli_out->out_write = pipe_fds[PIPE_FD_WRITE]; - // TODO(allen): Getting updates when there is new something new on the pipe!? + ++cli_count; } return(true); @@ -288,6 +288,8 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){ close(*(int*)&cli->out_read); close(*(int*)&cli->out_write); + + --cli_count; } return(close_me); @@ -314,10 +316,10 @@ osx_free(void *ptr, umem size){ external void osx_resize(int width, int height){ - osx_objc.width = width; - osx_objc.height = height; - if (width > 0 && height > 0){ + osx_objc.width = width; + osx_objc.height = height; + glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -326,6 +328,8 @@ osx_resize(int width, int height){ target.width = width; target.height = height; + + osx_schedule_step(); } } @@ -379,7 +383,6 @@ osx_character_input(u32 code, OSX_Keyboard_Modifiers modifier_flags){ case 0xF712: c = key_f15; break; case 0xF713: c = key_f16; break; } - fprintf(stdout, "INPUT: %c\n", (char)code); b8 mods[MDFR_INDEX_COUNT] = {0}; @@ -411,19 +414,29 @@ osx_character_input(u32 code, OSX_Keyboard_Modifiers modifier_flags){ else{ osx_push_key(0, 0, 0, mods); } + + osx_schedule_step(); } external void osx_mouse(i32 mx, i32 my, u32 type){ - osxvars.input.mouse.x = mx; - osxvars.input.mouse.y = osx_objc.height - my; + i32 new_x = mx; + i32 new_y = osx_objc.height - my; + if (new_x != osxvars.input.mouse.x && new_y != osxvars.input.mouse.y){ + osxvars.input.mouse.x = new_x; + osxvars.input.mouse.y = new_y; + osx_schedule_step(); + } + if (type == MouseType_Press){ osxvars.input.mouse.press_l = true; osxvars.input.mouse.l = true; + osx_schedule_step(); } if (type == MouseType_Release){ osxvars.input.mouse.release_l = true; osxvars.input.mouse.l = false; + osx_schedule_step(); } } @@ -435,15 +448,18 @@ osx_mouse_wheel(float dx, float dy){ else if (dy < 0){ osxvars.input.mouse.wheel = -1; } + osx_schedule_step(); } external void osx_try_to_close(void){ system_send_exit_signal(); + osx_schedule_step(); } external void osx_step(void){ + DBG_POINT(); Application_Step_Result result = {}; result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT; result.trying_to_kill = !osxvars.keep_running; @@ -491,6 +507,10 @@ osx_step(void){ } launch_rendering(&sysfunc, &target); + + if (result.animating || cli_count > 0){ + osx_schedule_step(); + } } external void @@ -598,7 +618,6 @@ osx_init(){ DBG_POINT(); char cwd[4096]; u32 size = sysfunc.get_current_path(cwd, sizeof(cwd)); - fprintf(stdout, "cwd = \"%.*s\"\n", size, cwd); if (size == 0 || size >= sizeof(cwd)){ system_error_box("Could not get current directory at launch."); } diff --git a/platform_mac/mac_4ed.m b/platform_mac/mac_4ed.m index 18ba823f..fcde37ba 100644 --- a/platform_mac/mac_4ed.m +++ b/platform_mac/mac_4ed.m @@ -15,7 +15,7 @@ #include "4coder_API/version.h" #include "4coder_API/keycodes.h" -#define WINDOW_NAME "4coder" VERSION +#define WINDOW_NAME "4coder " VERSION #undef internal #undef global @@ -42,7 +42,7 @@ void osx_post_to_clipboard(char *str){ NSPasteboard *board = [NSPasteboard generalPasteboard]; NSString *utf8_type = @"public.utf8-plain-text"; - NSArray *typesArray = [NSArray arrayWithObjects: utf8_type, nil]; + NSArray *typesArray = [NSArray arrayWithObjects: utf8_type, nil]; [board declareTypes:typesArray owner:nil]; NSString *paste_string = [NSString stringWithUTF8String:str]; [board setString:paste_string forType:utf8_type]; @@ -68,10 +68,12 @@ osx_error_dialogue(char *str){ @interface My4coderView : NSOpenGLView{ @public - CVDisplayLinkRef displayLink; + //CVDisplayLinkRef displayLink; } -- (CVReturn)getFrameForTime:(const CVTimeStamp*)time; +- (void)requestDisplay; +- (CVReturn)getFrame; +- (void)drawRect:(NSRect)bounds; @end #define DISPLINK_SIG(n) CVReturn n(CVDisplayLinkRef link, const CVTimeStamp *now, const CVTimeStamp *output, CVOptionFlags flags_in, CVOptionFlags *flags_out, void *context) @@ -103,7 +105,7 @@ static DISPLINK_SIG(osx_display_link); - (void)mouseDown:(NSEvent*)event{ NSPoint m = [event locationInWindow]; - osx_mouse(m.x, m.y, MouseType_Press); + osx_mouse(m.x, m.y, MouseType_Press); } - (void)mouseDragged:(NSEvent*)event{ @@ -132,7 +134,12 @@ static DISPLINK_SIG(osx_display_link); return(NO); } -- (CVReturn)getFrameForTime:(const CVTimeStamp*)time{ +- (void)requestDisplay{ + NSRect rect = CGRectMake(0, 0, osx_objc.width, osx_objc.height); + [self setNeedsDisplayInRect:rect]; +} + +- (CVReturn)getFrame{ @autoreleasepool { if (osx_objc.running){ @@ -232,6 +239,10 @@ static DISPLINK_SIG(osx_display_link); return self; } +- (void)drawRect: (NSRect) bounds{ + [self getFrame]; +} + - (void)awakeFromNib { [self init_gl]; @@ -246,6 +257,7 @@ static DISPLINK_SIG(osx_display_link); GLint swapInt = 1; [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; +#if 0 CVReturn cvreturn = CVDisplayLinkCreateWithActiveCGDisplays(&displayLink); cvreturn = CVDisplayLinkSetOutputCallback(displayLink, &osx_display_link, (__bridge void*)(self)); @@ -254,14 +266,17 @@ static DISPLINK_SIG(osx_display_link); cvreturn = CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(displayLink, cglContext, cglPixelFormat); CVDisplayLinkStart(displayLink); +#endif } - (void)dealloc { [super dealloc]; +#if 0 CVDisplayLinkStop(displayLink); CVDisplayLinkRelease(displayLink); +#endif } - (BOOL)acceptsFirstResponder @@ -280,12 +295,14 @@ static DISPLINK_SIG(osx_display_link); } @end +#if 0 static DISPLINK_SIG(osx_display_link){ My4coderView* view = (__bridge My4coderView*)context; - CVReturn result = [view getFrameForTime:output]; + CVReturn result = [view getFrame]; return result; } +#endif @implementation AppDelegate - (void)applicationDidFinishLaunching:(id)sender @@ -507,7 +524,7 @@ osx_file_listener_hash_always(u64 hash, void *name, i32 fd){ void osx_file_listener_init(void){ - memset(&file_change_queue, 0, sizeof(file_change_queue)); + memset(&file_change_queue, 0, sizeof(file_change_queue)); file_change_queue.kq = kqueue(); osx_file_listener_grow_table(1024); } @@ -519,7 +536,7 @@ osx_add_file_listener(char *dir_name){ return; } - fprintf(stdout, "ADD_FILE_LISTENER: %s\n", dir_name); + //fprintf(stdout, "ADD_FILE_LISTENER: %s\n", dir_name); i32 fd = open(dir_name, O_EVTONLY); if (fd <= 0){ @@ -588,6 +605,21 @@ osx_get_file_change_event(char *buffer, i32 max, i32 *size){ return(result); } +My4coderView* view = 0; + +void +osx_schedule_step(void){ + //DBG_POINT(); +#if 1 + [NSTimer scheduledTimerWithTimeInterval: 0.0 + target: view + selector: @selector(requestDisplay) + userInfo: nil repeats:NO]; +#else + [view requestDisplay]; +#endif +} + void osx_close_app(void){ [NSApp terminate: nil]; @@ -620,7 +652,7 @@ main(int argc, char **argv){ [window setAcceptsMouseMovedEvents:YES]; - My4coderView* view = [[My4coderView alloc] init]; + view = [[My4coderView alloc] init]; [view setFrame:[[window contentView] bounds]]; [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; diff --git a/platform_mac/osx_objective_c_to_cpp_links.h b/platform_mac/osx_objective_c_to_cpp_links.h index 77233068..aab5f0b0 100644 --- a/platform_mac/osx_objective_c_to_cpp_links.h +++ b/platform_mac/osx_objective_c_to_cpp_links.h @@ -14,7 +14,7 @@ #include -#if 0 +#if 1 #define DBG_POINT() fprintf(stdout, "%s\n", __FILE__ ":" LINE_STR ":") #else #define DBG_POINT() @@ -102,6 +102,9 @@ osx_remove_file_listener(char *file_name); external i32 osx_get_file_change_event(char *buffer, i32 max, i32 *size); +external void +osx_schedule_step(void); + external void osx_close_app(void);