switched to CRITICAL_SECTION, reorganized win32main
							parent
							
								
									1db0ad31c2
								
							
						
					
					
						commit
						5c604d8273
					
				|  | @ -1,6 +1,6 @@ | ||||||
| #define MAJOR 4 | #define MAJOR 4 | ||||||
| #define MINOR 0 | #define MINOR 0 | ||||||
| #define PATCH 6 | #define PATCH 7 | ||||||
| 
 | 
 | ||||||
| #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 VN_(a,b,c) VN__(a,b,c) | ||||||
|  |  | ||||||
							
								
								
									
										471
									
								
								win32_4ed.cpp
								
								
								
								
							
							
						
						
									
										471
									
								
								win32_4ed.cpp
								
								
								
								
							|  | @ -115,7 +115,6 @@ struct Sys_Bubble : public Bubble{ | ||||||
| 
 | 
 | ||||||
| struct Win32_Vars{ | struct Win32_Vars{ | ||||||
| 	HWND window_handle; | 	HWND window_handle; | ||||||
|     HDC window_hdc; |  | ||||||
|     Render_Target target; |     Render_Target target; | ||||||
|      |      | ||||||
|     Win32_Input_Chunk input_chunk; |     Win32_Input_Chunk input_chunk; | ||||||
|  | @ -131,8 +130,8 @@ struct Win32_Vars{ | ||||||
| 	DWORD clipboard_sequence; | 	DWORD clipboard_sequence; | ||||||
|      |      | ||||||
|     Thread_Group groups[THREAD_GROUP_COUNT]; |     Thread_Group groups[THREAD_GROUP_COUNT]; | ||||||
|     HANDLE locks[LOCK_COUNT]; |     CRITICAL_SECTION locks[LOCK_COUNT]; | ||||||
|     HANDLE DEBUG_sysmem_lock; |     CRITICAL_SECTION DEBUG_sysmem_lock; | ||||||
| 
 | 
 | ||||||
|     Thread_Memory *thread_memory; |     Thread_Memory *thread_memory; | ||||||
| 
 | 
 | ||||||
|  | @ -203,56 +202,44 @@ Win32Ptr(void *h){ | ||||||
| // Memory (not exposed to application, but needed in system_shared.cpp)
 | // Memory (not exposed to application, but needed in system_shared.cpp)
 | ||||||
| //
 | //
 | ||||||
| 
 | 
 | ||||||
| #if FRED_INTERNAL |  | ||||||
| 
 |  | ||||||
| internal | internal | ||||||
| Sys_Get_Memory_Sig(system_get_memory_){ | Sys_Get_Memory_Sig(system_get_memory_){ | ||||||
|     void *ptr = 0; |     void *ptr = 0; | ||||||
|     if (size > 0){ |     if (size > 0){ | ||||||
|  |          | ||||||
|  | #if FRED_INTERNAL | ||||||
|         ptr = VirtualAlloc(0, size + sizeof(Sys_Bubble), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); |         ptr = VirtualAlloc(0, size + sizeof(Sys_Bubble), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); | ||||||
|         Sys_Bubble *bubble = (Sys_Bubble*)ptr; |         Sys_Bubble *bubble = (Sys_Bubble*)ptr; | ||||||
|         bubble->flags = MEM_BUBBLE_SYS_DEBUG; |         bubble->flags = MEM_BUBBLE_SYS_DEBUG; | ||||||
|         bubble->line_number = line_number; |         bubble->line_number = line_number; | ||||||
|         bubble->file_name = file_name; |         bubble->file_name = file_name; | ||||||
|         bubble->size = size; |         bubble->size = size; | ||||||
|         WaitForSingleObject(win32vars.DEBUG_sysmem_lock, INFINITE); |         EnterCriticalSection(&win32vars.DEBUG_sysmem_lock); | ||||||
|         insert_bubble(&win32vars.internal_bubble, bubble); |         insert_bubble(&win32vars.internal_bubble, bubble); | ||||||
|         ReleaseSemaphore(win32vars.DEBUG_sysmem_lock, 1, 0); |         LeaveCriticalSection(&win32vars.DEBUG_sysmem_lock); | ||||||
|         ptr = bubble + 1; |         ptr = bubble + 1; | ||||||
|  | #else | ||||||
|  |         ptr = VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
|     return(ptr); |     return(ptr); | ||||||
| } | } | ||||||
| internal | internal | ||||||
| Sys_Free_Memory_Sig(system_free_memory){ | Sys_Free_Memory_Sig(system_free_memory){ | ||||||
|     if (block){ |     if (block){ | ||||||
|  | #if FRED_INTERNAL | ||||||
|         Sys_Bubble *bubble = ((Sys_Bubble*)block) - 1; |         Sys_Bubble *bubble = ((Sys_Bubble*)block) - 1; | ||||||
|         Assert((bubble->flags & MEM_BUBBLE_DEBUG_MASK) == MEM_BUBBLE_SYS_DEBUG); |         Assert((bubble->flags & MEM_BUBBLE_DEBUG_MASK) == MEM_BUBBLE_SYS_DEBUG); | ||||||
|         WaitForSingleObject(win32vars.DEBUG_sysmem_lock, INFINITE); |         EnterCriticalSection(&win32vars.DEBUG_sysmem_lock); | ||||||
|         remove_bubble(bubble); |         remove_bubble(bubble); | ||||||
|         ReleaseSemaphore(win32vars.DEBUG_sysmem_lock, 1, 0); |         LeaveCriticalSection(&win32vars.DEBUG_sysmem_lock); | ||||||
|         VirtualFree(bubble, 0, MEM_RELEASE); |         VirtualFree(bubble, 0, MEM_RELEASE); | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #else | #else | ||||||
| 
 |  | ||||||
| internal |  | ||||||
| Sys_Get_Memory_Sig(system_get_memory_){ |  | ||||||
|     void *ptr = 0; |  | ||||||
|     if (size > 0){ |  | ||||||
|         ptr = VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); |  | ||||||
|     } |  | ||||||
|     return(ptr); |  | ||||||
| } |  | ||||||
| internal |  | ||||||
| Sys_Free_Memory_Sig(system_free_memory){ |  | ||||||
|     if (block){ |  | ||||||
|         VirtualFree(block, 0, MEM_RELEASE); |         VirtualFree(block, 0, MEM_RELEASE); | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #define Win32GetMemory(size) system_get_memory_(size, __LINE__, __FILE__) | #define Win32GetMemory(size) system_get_memory_(size, __LINE__, __FILE__) | ||||||
| #define Win32FreeMemory(ptr) system_free_memory(ptr) | #define Win32FreeMemory(ptr) system_free_memory(ptr) | ||||||
| 
 | 
 | ||||||
|  | @ -278,15 +265,15 @@ INTERNAL_system_debug_message(char *message){ | ||||||
| 
 | 
 | ||||||
| internal | internal | ||||||
| Sys_File_Can_Be_Made_Sig(system_file_can_be_made){ | Sys_File_Can_Be_Made_Sig(system_file_can_be_made){ | ||||||
| 	HANDLE file; |     HANDLE file; | ||||||
| 	file = CreateFile((char*)filename, FILE_APPEND_DATA, 0, 0, |     file = CreateFile((char*)filename, FILE_APPEND_DATA, 0, 0, | ||||||
| 					  OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); |                       OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); | ||||||
|      |      | ||||||
| 	if (!file || file == INVALID_HANDLE_VALUE){ |     if (!file || file == INVALID_HANDLE_VALUE){ | ||||||
| 		return 0; |         return 0; | ||||||
| 	} |     } | ||||||
|      |      | ||||||
| 	CloseHandle(file); |     CloseHandle(file); | ||||||
|      |      | ||||||
|     return(1); |     return(1); | ||||||
| } | } | ||||||
|  | @ -652,12 +639,12 @@ Sys_Post_Clipboard_Sig(system_post_clipboard){ | ||||||
| 
 | 
 | ||||||
| internal | internal | ||||||
| Sys_Acquire_Lock_Sig(system_acquire_lock){ | Sys_Acquire_Lock_Sig(system_acquire_lock){ | ||||||
|     WaitForSingleObject(win32vars.locks[id], INFINITE); |     EnterCriticalSection(&win32vars.locks[id]); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| internal | internal | ||||||
| Sys_Release_Lock_Sig(system_release_lock){ | Sys_Release_Lock_Sig(system_release_lock){ | ||||||
|     ReleaseSemaphore(win32vars.locks[id], 1, 0); |     LeaveCriticalSection(&win32vars.locks[id]); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| internal DWORD | internal DWORD | ||||||
|  | @ -1599,153 +1586,13 @@ WinMain(HINSTANCE hInstance, | ||||||
|     int argc = __argc; |     int argc = __argc; | ||||||
|     char **argv = __argv; |     char **argv = __argv; | ||||||
|      |      | ||||||
|     HANDLE original_out = GetStdHandle(STD_OUTPUT_HANDLE); |  | ||||||
| 
 |  | ||||||
|     memset(&win32vars, 0, sizeof(win32vars)); |     memset(&win32vars, 0, sizeof(win32vars)); | ||||||
|     memset(&exchange_vars, 0, sizeof(exchange_vars)); |     memset(&exchange_vars, 0, sizeof(exchange_vars)); | ||||||
|      |      | ||||||
| #if FRED_INTERNAL |  | ||||||
|     win32vars.internal_bubble.next = &win32vars.internal_bubble; |  | ||||||
|     win32vars.internal_bubble.prev = &win32vars.internal_bubble; |  | ||||||
|     win32vars.internal_bubble.flags = MEM_BUBBLE_SYS_DEBUG; |  | ||||||
| #endif |  | ||||||
|      |      | ||||||
|     if (!Win32LoadAppCode()){ |  | ||||||
|         // TODO(allen): Failed to load app code, serious problem.
 |  | ||||||
|         return 99; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     System_Functions system_; |  | ||||||
|     System_Functions *system = &system_; |  | ||||||
|     win32vars.system = system; |  | ||||||
|     Win32LoadSystemCode(); |  | ||||||
| 
 |  | ||||||
|     ConvertThreadToFiber(0); |  | ||||||
|     win32vars.coroutine_free = win32vars.coroutine_data; |  | ||||||
|     for (i32 i = 0; i+1 < ArrayCount(win32vars.coroutine_data); ++i){ |  | ||||||
|         win32vars.coroutine_data[i].next = win32vars.coroutine_data + i + 1; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     LPVOID base; |  | ||||||
| #if FRED_INTERNAL |  | ||||||
|     base = (LPVOID)Tbytes(1); |  | ||||||
| #else |  | ||||||
|     base = (LPVOID)0; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     memory_vars.vars_memory_size = Mbytes(2); |  | ||||||
|     memory_vars.vars_memory = VirtualAlloc(base, memory_vars.vars_memory_size, |  | ||||||
|         MEM_COMMIT | MEM_RESERVE, |  | ||||||
|         PAGE_READWRITE); |  | ||||||
| 
 |  | ||||||
| #if FRED_INTERNAL |  | ||||||
|     base = (LPVOID)Tbytes(2); |  | ||||||
| #else |  | ||||||
|     base = (LPVOID)0; |  | ||||||
| #endif |  | ||||||
|     memory_vars.target_memory_size = Mbytes(512); |  | ||||||
|     memory_vars.target_memory = VirtualAlloc(base, memory_vars.target_memory_size, |  | ||||||
|         MEM_COMMIT | MEM_RESERVE, |  | ||||||
|         PAGE_READWRITE); |  | ||||||
| 
 |  | ||||||
|     base = (LPVOID)0; |  | ||||||
|     memory_vars.user_memory_size = Mbytes(2); |  | ||||||
|     memory_vars.user_memory = VirtualAlloc(base, memory_vars.target_memory_size, |  | ||||||
|         MEM_COMMIT | MEM_RESERVE, |  | ||||||
|         PAGE_READWRITE); |  | ||||||
|     //
 |     //
 | ||||||
| 
 |     // Threads and Coroutines
 | ||||||
|     if (!memory_vars.vars_memory){ |     //
 | ||||||
|         return 4; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     DWORD required = GetCurrentDirectory(0, 0); |  | ||||||
|     required += 1; |  | ||||||
|     required *= 4; |  | ||||||
|     char *current_directory_mem = (char*)system_get_memory(required); |  | ||||||
|     DWORD written = GetCurrentDirectory(required, current_directory_mem); |  | ||||||
| 
 |  | ||||||
|     String current_directory = make_string(current_directory_mem, written, required); |  | ||||||
|     terminate_with_null(¤t_directory); |  | ||||||
|     replace_char(current_directory, '\\', '/'); |  | ||||||
| 
 |  | ||||||
|     Command_Line_Parameters clparams; |  | ||||||
|     clparams.argv = argv; |  | ||||||
|     clparams.argc = argc; |  | ||||||
| 
 |  | ||||||
|     char **files; |  | ||||||
|     i32 *file_count; |  | ||||||
| 
 |  | ||||||
|     files = 0; |  | ||||||
|     file_count = 0; |  | ||||||
| 
 |  | ||||||
|     i32 output_size = |  | ||||||
|         win32vars.app.read_command_line(system, |  | ||||||
|         &memory_vars, |  | ||||||
|         current_directory, |  | ||||||
|         &win32vars.settings, |  | ||||||
|         &files, &file_count, |  | ||||||
|         clparams); |  | ||||||
|      |  | ||||||
|     if (output_size > 0){ |  | ||||||
|         DWORD written; |  | ||||||
|         WriteFile(original_out, memory_vars.target_memory, output_size, &written, 0); |  | ||||||
|     } |  | ||||||
|     if (output_size != 0) return 0; |  | ||||||
|      |  | ||||||
| #ifdef FRED_SUPER |  | ||||||
|     char *custom_file_default = "4coder_custom.dll"; |  | ||||||
|     char *custom_file = 0; |  | ||||||
|     if (win32vars.settings.custom_dll) custom_file = win32vars.settings.custom_dll; |  | ||||||
|     else custom_file = custom_file_default; |  | ||||||
|      |  | ||||||
|     win32vars.custom = LoadLibraryA(custom_file); |  | ||||||
|     if (!win32vars.custom && custom_file != custom_file_default){ |  | ||||||
|         if (!win32vars.settings.custom_dll_is_strict){ |  | ||||||
|             win32vars.custom = LoadLibraryA(custom_file_default); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (win32vars.custom){ |  | ||||||
|         win32vars.custom_api.get_alpha_4coder_version = (_Get_Version_Function*) |  | ||||||
|             GetProcAddress(win32vars.custom, "get_alpha_4coder_version"); |  | ||||||
|          |  | ||||||
|         if (win32vars.custom_api.get_alpha_4coder_version == 0 || |  | ||||||
|                 win32vars.custom_api.get_alpha_4coder_version(MAJOR, MINOR, PATCH) == 0){ |  | ||||||
|             OutputDebugStringA("Error: application and custom version numbers don't match"); |  | ||||||
|             return 22; |  | ||||||
|         } |  | ||||||
|         win32vars.custom_api.get_bindings = (Get_Binding_Data_Function*) |  | ||||||
|             GetProcAddress(win32vars.custom, "get_bindings"); |  | ||||||
|         win32vars.custom_api.view_routine = (View_Routine_Function*) |  | ||||||
|             GetProcAddress(win32vars.custom, "view_routine"); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|      |  | ||||||
|     if (win32vars.custom_api.get_bindings == 0){ |  | ||||||
|         win32vars.custom_api.get_bindings = (Get_Binding_Data_Function*)get_bindings; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (win32vars.custom_api.view_routine == 0){ |  | ||||||
|         win32vars.custom_api.view_routine = (View_Routine_Function*)view_routine; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     FreeConsole(); |  | ||||||
|      |  | ||||||
|     sysshared_filter_real_files(files, file_count); |  | ||||||
|      |  | ||||||
|     LARGE_INTEGER lpf; |  | ||||||
|     QueryPerformanceFrequency(&lpf); |  | ||||||
|     win32vars.performance_frequency = lpf.QuadPart; |  | ||||||
|     QueryPerformanceCounter(&lpf); |  | ||||||
|     win32vars.start_pcount = lpf.QuadPart; |  | ||||||
|      |  | ||||||
|     FILETIME filetime; |  | ||||||
|     GetSystemTimeAsFileTime(&filetime); |  | ||||||
|     win32vars.start_time = ((u64)filetime.dwHighDateTime << 32) | (filetime.dwLowDateTime); |  | ||||||
|     win32vars.start_time /= 10; |  | ||||||
|      |  | ||||||
|     Win32KeycodeInit(); |  | ||||||
|      |      | ||||||
|     Thread_Context background[4]; |     Thread_Context background[4]; | ||||||
|     memset(background, 0, sizeof(background)); |     memset(background, 0, sizeof(background)); | ||||||
|  | @ -1774,28 +1621,168 @@ WinMain(HINSTANCE hInstance, | ||||||
|      |      | ||||||
|     Assert(win32vars.locks); |     Assert(win32vars.locks); | ||||||
|     for (i32 i = 0; i < LOCK_COUNT; ++i){ |     for (i32 i = 0; i < LOCK_COUNT; ++i){ | ||||||
|         win32vars.locks[i] = CreateSemaphore(0, 1, 1, 0); |         InitializeCriticalSection(&win32vars.locks[i]); | ||||||
|  |     } | ||||||
|  |     InitializeCriticalSection(&win32vars.DEBUG_sysmem_lock); | ||||||
|  |          | ||||||
|  |     ConvertThreadToFiber(0); | ||||||
|  |     win32vars.coroutine_free = win32vars.coroutine_data; | ||||||
|  |     for (i32 i = 0; i+1 < ArrayCount(win32vars.coroutine_data); ++i){ | ||||||
|  |         win32vars.coroutine_data[i].next = win32vars.coroutine_data + i + 1; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     //
 | ||||||
|  |     // Memory Initialization
 | ||||||
|  |     //
 | ||||||
|  |      | ||||||
|  | #if FRED_INTERNAL | ||||||
|  |     win32vars.internal_bubble.next = &win32vars.internal_bubble; | ||||||
|  |     win32vars.internal_bubble.prev = &win32vars.internal_bubble; | ||||||
|  |     win32vars.internal_bubble.flags = MEM_BUBBLE_SYS_DEBUG; | ||||||
|  | #endif | ||||||
|  |      | ||||||
|  |     LPVOID base; | ||||||
|  | #if FRED_INTERNAL | ||||||
|  |     base = (LPVOID)Tbytes(1); | ||||||
|  | #else | ||||||
|  |     base = (LPVOID)0; | ||||||
|  | #endif | ||||||
|  |      | ||||||
|  |     memory_vars.vars_memory_size = Mbytes(2); | ||||||
|  |     memory_vars.vars_memory = VirtualAlloc(base, memory_vars.vars_memory_size, | ||||||
|  |                                            MEM_COMMIT | MEM_RESERVE, | ||||||
|  |                                            PAGE_READWRITE); | ||||||
|  |      | ||||||
|  | #if FRED_INTERNAL | ||||||
|  |     base = (LPVOID)Tbytes(2); | ||||||
|  | #else | ||||||
|  |     base = (LPVOID)0; | ||||||
|  | #endif | ||||||
|  |     memory_vars.target_memory_size = Mbytes(512); | ||||||
|  |     memory_vars.target_memory = | ||||||
|  |         VirtualAlloc(base, memory_vars.target_memory_size, | ||||||
|  |                      MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); | ||||||
|  |      | ||||||
|  |     base = (LPVOID)0; | ||||||
|  |     memory_vars.user_memory_size = Mbytes(2); | ||||||
|  |     memory_vars.user_memory = | ||||||
|  |         VirtualAlloc(base, memory_vars.target_memory_size, | ||||||
|  |                      MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); | ||||||
|  |      | ||||||
|  |     if (!memory_vars.vars_memory){ | ||||||
|  |         exit(1); | ||||||
|     } |     } | ||||||
|     win32vars.DEBUG_sysmem_lock = CreateSemaphore(0, 1, 1, 0); |  | ||||||
|      |      | ||||||
|     Win32LoadRenderCode(); |  | ||||||
|     win32vars.target.max = Mbytes(1); |     win32vars.target.max = Mbytes(1); | ||||||
|     win32vars.target.push_buffer = (byte*)system_get_memory(win32vars.target.max); |     win32vars.target.push_buffer = (byte*)system_get_memory(win32vars.target.max); | ||||||
|      |      | ||||||
|     win32vars.cursor_ibeam = LoadCursor(NULL, IDC_IBEAM); |      | ||||||
|     win32vars.cursor_arrow = LoadCursor(NULL, IDC_ARROW); |     //
 | ||||||
|     win32vars.cursor_leftright = LoadCursor(NULL, IDC_SIZEWE); |     // System and Application Layer Linkage
 | ||||||
|     win32vars.cursor_updown = LoadCursor(NULL, IDC_SIZENS); |     //
 | ||||||
|  |      | ||||||
|  |     if (!Win32LoadAppCode()){ | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     System_Functions system_; | ||||||
|  |     System_Functions *system = &system_; | ||||||
|  |     win32vars.system = system; | ||||||
|  |     Win32LoadSystemCode(); | ||||||
|  |      | ||||||
|  |     Win32LoadRenderCode(); | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     //
 | ||||||
|  |     // Read Command Line
 | ||||||
|  |     //
 | ||||||
|  |      | ||||||
|  |     DWORD required = GetCurrentDirectory(0, 0); | ||||||
|  |     required += 1; | ||||||
|  |     required *= 4; | ||||||
|  |     char *current_directory_mem = (char*)system_get_memory(required); | ||||||
|  |     DWORD written = GetCurrentDirectory(required, current_directory_mem); | ||||||
|  |      | ||||||
|  |     String current_directory = make_string(current_directory_mem, written, required); | ||||||
|  |     terminate_with_null(¤t_directory); | ||||||
|  |     replace_char(current_directory, '\\', '/'); | ||||||
|  |      | ||||||
|  |     Command_Line_Parameters clparams; | ||||||
|  |     clparams.argv = argv; | ||||||
|  |     clparams.argc = argc; | ||||||
|  |      | ||||||
|  |     char **files; | ||||||
|  |     i32 *file_count; | ||||||
|  |      | ||||||
|  |     files = 0; | ||||||
|  |     file_count = 0; | ||||||
|  |      | ||||||
|  |     win32vars.app.read_command_line(system, | ||||||
|  |                                     &memory_vars, | ||||||
|  |                                     current_directory, | ||||||
|  |                                     &win32vars.settings, | ||||||
|  |                                     &files, &file_count, | ||||||
|  |                                     clparams); | ||||||
|  |      | ||||||
|  |     sysshared_filter_real_files(files, file_count); | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     //
 | ||||||
|  |     // Custom Layer Linkage
 | ||||||
|  |     //
 | ||||||
|  |      | ||||||
|  | #ifdef FRED_SUPER | ||||||
|  |     char *custom_file_default = "4coder_custom.dll"; | ||||||
|  |     char *custom_file = 0; | ||||||
|  |     if (win32vars.settings.custom_dll) custom_file = win32vars.settings.custom_dll; | ||||||
|  |     else custom_file = custom_file_default; | ||||||
|  |      | ||||||
|  |     win32vars.custom = LoadLibraryA(custom_file); | ||||||
|  |     if (!win32vars.custom && custom_file != custom_file_default){ | ||||||
|  |         if (!win32vars.settings.custom_dll_is_strict){ | ||||||
|  |             win32vars.custom = LoadLibraryA(custom_file_default); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (win32vars.custom){ | ||||||
|  |         win32vars.custom_api.get_alpha_4coder_version = (_Get_Version_Function*) | ||||||
|  |             GetProcAddress(win32vars.custom, "get_alpha_4coder_version"); | ||||||
|  |          | ||||||
|  |         if (win32vars.custom_api.get_alpha_4coder_version == 0 || | ||||||
|  |                 win32vars.custom_api.get_alpha_4coder_version(MAJOR, MINOR, PATCH) == 0){ | ||||||
|  |             OutputDebugStringA("Error: application and custom version numbers don't match"); | ||||||
|  |             exit(1); | ||||||
|  |         } | ||||||
|  |         win32vars.custom_api.get_bindings = (Get_Binding_Data_Function*) | ||||||
|  |             GetProcAddress(win32vars.custom, "get_bindings"); | ||||||
|  |         win32vars.custom_api.view_routine = (View_Routine_Function*) | ||||||
|  |             GetProcAddress(win32vars.custom, "view_routine"); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |      | ||||||
|  |     if (win32vars.custom_api.get_bindings == 0){ | ||||||
|  |         win32vars.custom_api.get_bindings = (Get_Binding_Data_Function*)get_bindings; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (win32vars.custom_api.view_routine == 0){ | ||||||
|  |         win32vars.custom_api.view_routine = (View_Routine_Function*)view_routine; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     //
 | ||||||
|  |     // Window and GL Initialization
 | ||||||
|  |     //
 | ||||||
|      |      | ||||||
|     WNDCLASS window_class = {}; |     WNDCLASS window_class = {}; | ||||||
|     window_class.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC; |     window_class.style = CS_HREDRAW|CS_VREDRAW; | ||||||
|     window_class.lpfnWndProc = Win32Callback; |     window_class.lpfnWndProc = Win32Callback; | ||||||
|     window_class.hInstance = hInstance; |     window_class.hInstance = hInstance; | ||||||
|     window_class.lpszClassName = "4coder-win32-wndclass"; |     window_class.lpszClassName = "4coder-win32-wndclass"; | ||||||
|     window_class.hIcon = LoadIcon(hInstance, "main"); |     window_class.hIcon = LoadIcon(hInstance, "main"); | ||||||
|      |      | ||||||
|     if (!RegisterClass(&window_class)){ |     if (!RegisterClass(&window_class)){ | ||||||
|         return 1; |         exit(1); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     RECT window_rect = {}; |     RECT window_rect = {}; | ||||||
|  | @ -1833,28 +1820,23 @@ WinMain(HINSTANCE hInstance, | ||||||
|         window_style |= WS_MAXIMIZE; |         window_style |= WS_MAXIMIZE; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     win32vars.window_handle = | ||||||
|  |         CreateWindowA(window_class.lpszClassName, | ||||||
|  |                       WINDOW_NAME, window_style, | ||||||
|  |                       window_x, window_y, | ||||||
|  |                       window_rect.right - window_rect.left, | ||||||
|  |                       window_rect.bottom - window_rect.top, | ||||||
|  |                       0, 0, hInstance, 0); | ||||||
|  |      | ||||||
|  |     if (win32vars.window_handle == 0){ | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
|     // TODO(allen): not Windows XP compatible, do we care?
 |     // TODO(allen): not Windows XP compatible, do we care?
 | ||||||
|     // SetProcessDPIAware();
 |     // SetProcessDPIAware();
 | ||||||
|      |      | ||||||
|     HWND window_handle = {}; |     GetClientRect(win32vars.window_handle, &window_rect); | ||||||
|     window_handle = CreateWindowA( |  | ||||||
|         window_class.lpszClassName, |  | ||||||
|         WINDOW_NAME, window_style, |  | ||||||
|         window_x, window_y, |  | ||||||
|         window_rect.right - window_rect.left, |  | ||||||
|         window_rect.bottom - window_rect.top, |  | ||||||
|         0, 0, hInstance, 0); |  | ||||||
| 
 |  | ||||||
|     if (window_handle == 0){ |  | ||||||
|         return 2; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // TODO(allen): errors?
 |  | ||||||
|     win32vars.window_handle = window_handle; |  | ||||||
|     HDC hdc = GetDC(window_handle); |  | ||||||
|     win32vars.window_hdc = hdc; |  | ||||||
| 
 |  | ||||||
|     GetClientRect(window_handle, &window_rect); |  | ||||||
|      |      | ||||||
|     static PIXELFORMATDESCRIPTOR pfd = { |     static PIXELFORMATDESCRIPTOR pfd = { | ||||||
|         sizeof(PIXELFORMATDESCRIPTOR), |         sizeof(PIXELFORMATDESCRIPTOR), | ||||||
|  | @ -1874,25 +1856,29 @@ WinMain(HINSTANCE hInstance, | ||||||
|         0, |         0, | ||||||
|         0, 0, 0 }; |         0, 0, 0 }; | ||||||
|      |      | ||||||
|     i32 pixel_format; |     HDC hdc = GetDC(win32vars.window_handle); | ||||||
|     pixel_format = ChoosePixelFormat(hdc, &pfd); |     { | ||||||
|     SetPixelFormat(hdc, pixel_format, &pfd); |         i32 pixel_format; | ||||||
|  |         pixel_format = ChoosePixelFormat(hdc, &pfd); | ||||||
|  |         SetPixelFormat(hdc, pixel_format, &pfd); | ||||||
|          |          | ||||||
|     win32vars.target.handle = hdc; |         win32vars.target.handle = hdc; | ||||||
|     win32vars.target.context = wglCreateContext(hdc); |         win32vars.target.context = wglCreateContext(hdc); | ||||||
|     wglMakeCurrent(hdc, (HGLRC)win32vars.target.context); |         wglMakeCurrent(hdc, (HGLRC)win32vars.target.context); | ||||||
|  |     } | ||||||
|  |     ReleaseDC(win32vars.window_handle, hdc); | ||||||
|      |      | ||||||
| #if FRED_INTERNAL | #if FRED_INTERNAL | ||||||
| 	// NOTE(casey): This slows down GL but puts error messages to the debug console immediately whenever you do something wrong
 |     // NOTE(casey): This slows down GL but puts error messages to the debug console immediately whenever you do something wrong
 | ||||||
| 	glDebugMessageCallback_type *glDebugMessageCallback = (glDebugMessageCallback_type *)wglGetProcAddress("glDebugMessageCallback"); |     glDebugMessageCallback_type *glDebugMessageCallback = (glDebugMessageCallback_type *)wglGetProcAddress("glDebugMessageCallback"); | ||||||
| 	glDebugMessageControl_type *glDebugMessageControl = (glDebugMessageControl_type *)wglGetProcAddress("glDebugMessageControl"); |     glDebugMessageControl_type *glDebugMessageControl = (glDebugMessageControl_type *)wglGetProcAddress("glDebugMessageControl"); | ||||||
| 	if(glDebugMessageCallback && glDebugMessageControl) |     if(glDebugMessageCallback && glDebugMessageControl) | ||||||
| 	{ |     { | ||||||
| 		glDebugMessageCallback(OpenGLDebugCallback, 0); |         glDebugMessageCallback(OpenGLDebugCallback, 0); | ||||||
| 		glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE); |         glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE); | ||||||
| 		glEnable(GL_DEBUG_OUTPUT); |         glEnable(GL_DEBUG_OUTPUT); | ||||||
| 		glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); |         glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); | ||||||
| 	} |     } | ||||||
| #endif | #endif | ||||||
|      |      | ||||||
|     glEnable(GL_TEXTURE_2D); |     glEnable(GL_TEXTURE_2D); | ||||||
|  | @ -1902,6 +1888,11 @@ WinMain(HINSTANCE hInstance, | ||||||
|      |      | ||||||
|     Win32Resize(window_rect.right - window_rect.left, window_rect.bottom - window_rect.top); |     Win32Resize(window_rect.right - window_rect.left, window_rect.bottom - window_rect.top); | ||||||
|      |      | ||||||
|  |      | ||||||
|  |     //
 | ||||||
|  |     // Misc System Initializations
 | ||||||
|  |     //
 | ||||||
|  |      | ||||||
|     win32vars.clipboard_sequence = GetClipboardSequenceNumber(); |     win32vars.clipboard_sequence = GetClipboardSequenceNumber(); | ||||||
|      |      | ||||||
|     if (win32vars.clipboard_sequence == 0){ |     if (win32vars.clipboard_sequence == 0){ | ||||||
|  | @ -1932,10 +1923,33 @@ WinMain(HINSTANCE hInstance, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     LARGE_INTEGER lpf; | ||||||
|  |     QueryPerformanceFrequency(&lpf); | ||||||
|  |     win32vars.performance_frequency = lpf.QuadPart; | ||||||
|  |     QueryPerformanceCounter(&lpf); | ||||||
|  |     win32vars.start_pcount = lpf.QuadPart; | ||||||
|  |      | ||||||
|  |     FILETIME filetime; | ||||||
|  |     GetSystemTimeAsFileTime(&filetime); | ||||||
|  |     win32vars.start_time = ((u64)filetime.dwHighDateTime << 32) | (filetime.dwLowDateTime); | ||||||
|  |     win32vars.start_time /= 10; | ||||||
|  |      | ||||||
|  |     Win32KeycodeInit(); | ||||||
|  |      | ||||||
|  |     win32vars.cursor_ibeam = LoadCursor(NULL, IDC_IBEAM); | ||||||
|  |     win32vars.cursor_arrow = LoadCursor(NULL, IDC_ARROW); | ||||||
|  |     win32vars.cursor_leftright = LoadCursor(NULL, IDC_SIZEWE); | ||||||
|  |     win32vars.cursor_updown = LoadCursor(NULL, IDC_SIZENS); | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     //
 | ||||||
|  |     // Main Loop
 | ||||||
|  |     //
 | ||||||
|  |      | ||||||
|     win32vars.app.init(win32vars.system, &win32vars.target, |     win32vars.app.init(win32vars.system, &win32vars.target, | ||||||
|         &memory_vars, &exchange_vars, |                        &memory_vars, &exchange_vars, | ||||||
|         win32vars.clipboard_contents, current_directory, |                        win32vars.clipboard_contents, current_directory, | ||||||
|         win32vars.custom_api); |                        win32vars.custom_api); | ||||||
|      |      | ||||||
|     system_free_memory(current_directory.str); |     system_free_memory(current_directory.str); | ||||||
|      |      | ||||||
|  | @ -1943,11 +1957,10 @@ WinMain(HINSTANCE hInstance, | ||||||
|     win32vars.first = 1; |     win32vars.first = 1; | ||||||
|     timeBeginPeriod(1); |     timeBeginPeriod(1); | ||||||
|      |      | ||||||
|  |     SetForegroundWindow(win32vars.window_handle); | ||||||
|  |     SetActiveWindow(win32vars.window_handle); | ||||||
|  |      | ||||||
|     system_acquire_lock(FRAME_LOCK); |     system_acquire_lock(FRAME_LOCK); | ||||||
|      |  | ||||||
|     SetForegroundWindow(window_handle); |  | ||||||
|     SetActiveWindow(window_handle); |  | ||||||
|      |  | ||||||
|     MSG msg; |     MSG msg; | ||||||
|     for (;win32vars.input_chunk.pers.keep_playing;){ |     for (;win32vars.input_chunk.pers.keep_playing;){ | ||||||
|         // TODO(allen): Find a good way to wait on a pipe
 |         // TODO(allen): Find a good way to wait on a pipe
 | ||||||
|  | @ -2096,7 +2109,7 @@ WinMain(HINSTANCE hInstance, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     return 0; |     return(0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #if 0 | #if 0 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Allen Webster
						Allen Webster