switched to CRITICAL_SECTION, reorganized win32main
							parent
							
								
									1db0ad31c2
								
							
						
					
					
						commit
						5c604d8273
					
				|  | @ -1,6 +1,6 @@ | |||
| #define MAJOR 4 | ||||
| #define MINOR 0 | ||||
| #define PATCH 6 | ||||
| #define PATCH 7 | ||||
| 
 | ||||
| #define VN__(a,b,c) #a"."#b"."#c | ||||
| #define VN_(a,b,c) VN__(a,b,c) | ||||
|  |  | |||
							
								
								
									
										525
									
								
								win32_4ed.cpp
								
								
								
								
							
							
						
						
									
										525
									
								
								win32_4ed.cpp
								
								
								
								
							|  | @ -115,7 +115,6 @@ struct Sys_Bubble : public Bubble{ | |||
| 
 | ||||
| struct Win32_Vars{ | ||||
| 	HWND window_handle; | ||||
|     HDC window_hdc; | ||||
|     Render_Target target; | ||||
|      | ||||
|     Win32_Input_Chunk input_chunk; | ||||
|  | @ -131,8 +130,8 @@ struct Win32_Vars{ | |||
| 	DWORD clipboard_sequence; | ||||
|      | ||||
|     Thread_Group groups[THREAD_GROUP_COUNT]; | ||||
|     HANDLE locks[LOCK_COUNT]; | ||||
|     HANDLE DEBUG_sysmem_lock; | ||||
|     CRITICAL_SECTION locks[LOCK_COUNT]; | ||||
|     CRITICAL_SECTION DEBUG_sysmem_lock; | ||||
| 
 | ||||
|     Thread_Memory *thread_memory; | ||||
| 
 | ||||
|  | @ -203,56 +202,44 @@ Win32Ptr(void *h){ | |||
| // Memory (not exposed to application, but needed in system_shared.cpp)
 | ||||
| //
 | ||||
| 
 | ||||
| #if FRED_INTERNAL | ||||
| 
 | ||||
| internal | ||||
| Sys_Get_Memory_Sig(system_get_memory_){ | ||||
|     void *ptr = 0; | ||||
|     if (size > 0){ | ||||
|          | ||||
| #if FRED_INTERNAL | ||||
|         ptr = VirtualAlloc(0, size + sizeof(Sys_Bubble), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); | ||||
|         Sys_Bubble *bubble = (Sys_Bubble*)ptr; | ||||
|         bubble->flags = MEM_BUBBLE_SYS_DEBUG; | ||||
|         bubble->line_number = line_number; | ||||
|         bubble->file_name = file_name; | ||||
|         bubble->size = size; | ||||
|         WaitForSingleObject(win32vars.DEBUG_sysmem_lock, INFINITE); | ||||
|         EnterCriticalSection(&win32vars.DEBUG_sysmem_lock); | ||||
|         insert_bubble(&win32vars.internal_bubble, bubble); | ||||
|         ReleaseSemaphore(win32vars.DEBUG_sysmem_lock, 1, 0); | ||||
|         LeaveCriticalSection(&win32vars.DEBUG_sysmem_lock); | ||||
|         ptr = bubble + 1; | ||||
| #else | ||||
|         ptr = VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); | ||||
| #endif | ||||
|     } | ||||
|     return(ptr); | ||||
| } | ||||
| internal | ||||
| Sys_Free_Memory_Sig(system_free_memory){ | ||||
|     if (block){ | ||||
| #if FRED_INTERNAL | ||||
|         Sys_Bubble *bubble = ((Sys_Bubble*)block) - 1; | ||||
|         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); | ||||
|         ReleaseSemaphore(win32vars.DEBUG_sysmem_lock, 1, 0); | ||||
|         LeaveCriticalSection(&win32vars.DEBUG_sysmem_lock); | ||||
|         VirtualFree(bubble, 0, MEM_RELEASE); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #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); | ||||
| #endif | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #define Win32GetMemory(size) system_get_memory_(size, __LINE__, __FILE__) | ||||
| #define Win32FreeMemory(ptr) system_free_memory(ptr) | ||||
| 
 | ||||
|  | @ -278,16 +265,16 @@ INTERNAL_system_debug_message(char *message){ | |||
| 
 | ||||
| internal | ||||
| Sys_File_Can_Be_Made_Sig(system_file_can_be_made){ | ||||
| 	HANDLE file; | ||||
| 	file = CreateFile((char*)filename, FILE_APPEND_DATA, 0, 0, | ||||
| 					  OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); | ||||
| 	 | ||||
| 	if (!file || file == INVALID_HANDLE_VALUE){ | ||||
| 		return 0; | ||||
| 	} | ||||
| 	 | ||||
| 	CloseHandle(file); | ||||
| 	 | ||||
|     HANDLE file; | ||||
|     file = CreateFile((char*)filename, FILE_APPEND_DATA, 0, 0, | ||||
|                       OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); | ||||
|      | ||||
|     if (!file || file == INVALID_HANDLE_VALUE){ | ||||
|         return 0; | ||||
|     } | ||||
|      | ||||
|     CloseHandle(file); | ||||
|      | ||||
|     return(1); | ||||
| } | ||||
| 
 | ||||
|  | @ -652,12 +639,12 @@ Sys_Post_Clipboard_Sig(system_post_clipboard){ | |||
| 
 | ||||
| internal | ||||
| Sys_Acquire_Lock_Sig(system_acquire_lock){ | ||||
|     WaitForSingleObject(win32vars.locks[id], INFINITE); | ||||
|     EnterCriticalSection(&win32vars.locks[id]); | ||||
| } | ||||
| 
 | ||||
| internal | ||||
| Sys_Release_Lock_Sig(system_release_lock){ | ||||
|     ReleaseSemaphore(win32vars.locks[id], 1, 0); | ||||
|     LeaveCriticalSection(&win32vars.locks[id]); | ||||
| } | ||||
| 
 | ||||
| internal DWORD | ||||
|  | @ -1599,153 +1586,13 @@ WinMain(HINSTANCE hInstance, | |||
|     int argc = __argc; | ||||
|     char **argv = __argv; | ||||
|      | ||||
|     HANDLE original_out = GetStdHandle(STD_OUTPUT_HANDLE); | ||||
| 
 | ||||
|     memset(&win32vars, 0, sizeof(win32vars)); | ||||
|     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]; | ||||
|     memset(background, 0, sizeof(background)); | ||||
|  | @ -1774,32 +1621,172 @@ WinMain(HINSTANCE hInstance, | |||
|      | ||||
|     Assert(win32vars.locks); | ||||
|     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.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); | ||||
|     win32vars.cursor_updown = LoadCursor(NULL, IDC_SIZENS); | ||||
|      | ||||
|     //
 | ||||
|     // System and Application Layer Linkage
 | ||||
|     //
 | ||||
|      | ||||
|     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 = {}; | ||||
|     window_class.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC; | ||||
|     window_class.style = CS_HREDRAW|CS_VREDRAW; | ||||
|     window_class.lpfnWndProc = Win32Callback; | ||||
|     window_class.hInstance = hInstance; | ||||
|     window_class.lpszClassName = "4coder-win32-wndclass"; | ||||
|     window_class.hIcon = LoadIcon(hInstance, "main"); | ||||
|      | ||||
|     if (!RegisterClass(&window_class)){ | ||||
|         return 1; | ||||
|         exit(1); | ||||
|     } | ||||
|      | ||||
|     RECT window_rect = {}; | ||||
| 
 | ||||
|      | ||||
|     if (win32vars.settings.set_window_size){ | ||||
|         window_rect.right = win32vars.settings.window_w; | ||||
|         window_rect.bottom = win32vars.settings.window_h; | ||||
|  | @ -1808,17 +1795,17 @@ WinMain(HINSTANCE hInstance, | |||
|         window_rect.right = 800; | ||||
|         window_rect.bottom = 600; | ||||
|     } | ||||
| 
 | ||||
|      | ||||
|     if (!AdjustWindowRect(&window_rect, WS_OVERLAPPEDWINDOW, false)){ | ||||
|         // TODO(allen): non-fatal diagnostics
 | ||||
|     } | ||||
| 
 | ||||
|      | ||||
| #define WINDOW_NAME "4coder-window: " VERSION | ||||
| 
 | ||||
|      | ||||
|     i32 window_x; | ||||
|     i32 window_y; | ||||
|     i32 window_style; | ||||
| 
 | ||||
|      | ||||
|     if (win32vars.settings.set_window_pos){ | ||||
|         window_x = win32vars.settings.window_x; | ||||
|         window_y = win32vars.settings.window_y; | ||||
|  | @ -1827,35 +1814,30 @@ WinMain(HINSTANCE hInstance, | |||
|         window_x = CW_USEDEFAULT; | ||||
|         window_y = CW_USEDEFAULT; | ||||
|     } | ||||
| 
 | ||||
|      | ||||
|     window_style = WS_OVERLAPPEDWINDOW | WS_VISIBLE; | ||||
|     if (win32vars.settings.maximize_window){ | ||||
|         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?
 | ||||
|     // SetProcessDPIAware();
 | ||||
| 
 | ||||
|     HWND window_handle = {}; | ||||
|     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); | ||||
| 
 | ||||
|      | ||||
|     GetClientRect(win32vars.window_handle, &window_rect); | ||||
|      | ||||
|     static PIXELFORMATDESCRIPTOR pfd = { | ||||
|         sizeof(PIXELFORMATDESCRIPTOR), | ||||
|         1, | ||||
|  | @ -1873,48 +1855,57 @@ WinMain(HINSTANCE hInstance, | |||
|         PFD_MAIN_PLANE, | ||||
|         0, | ||||
|         0, 0, 0 }; | ||||
| 
 | ||||
|     i32 pixel_format; | ||||
|     pixel_format = ChoosePixelFormat(hdc, &pfd); | ||||
|     SetPixelFormat(hdc, pixel_format, &pfd); | ||||
| 
 | ||||
|     win32vars.target.handle = hdc; | ||||
|     win32vars.target.context = wglCreateContext(hdc); | ||||
|     wglMakeCurrent(hdc, (HGLRC)win32vars.target.context); | ||||
|      | ||||
|     HDC hdc = GetDC(win32vars.window_handle); | ||||
|     { | ||||
|         i32 pixel_format; | ||||
|         pixel_format = ChoosePixelFormat(hdc, &pfd); | ||||
|         SetPixelFormat(hdc, pixel_format, &pfd); | ||||
|          | ||||
|         win32vars.target.handle = hdc; | ||||
|         win32vars.target.context = wglCreateContext(hdc); | ||||
|         wglMakeCurrent(hdc, (HGLRC)win32vars.target.context); | ||||
|     } | ||||
|     ReleaseDC(win32vars.window_handle, hdc); | ||||
|      | ||||
| #if FRED_INTERNAL | ||||
| 	// 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"); | ||||
| 	glDebugMessageControl_type *glDebugMessageControl = (glDebugMessageControl_type *)wglGetProcAddress("glDebugMessageControl"); | ||||
| 	if(glDebugMessageCallback && glDebugMessageControl) | ||||
| 	{ | ||||
| 		glDebugMessageCallback(OpenGLDebugCallback, 0); | ||||
| 		glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE); | ||||
| 		glEnable(GL_DEBUG_OUTPUT); | ||||
| 		glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); | ||||
| 	} | ||||
|     // 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"); | ||||
|     glDebugMessageControl_type *glDebugMessageControl = (glDebugMessageControl_type *)wglGetProcAddress("glDebugMessageControl"); | ||||
|     if(glDebugMessageCallback && glDebugMessageControl) | ||||
|     { | ||||
|         glDebugMessageCallback(OpenGLDebugCallback, 0); | ||||
|         glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE); | ||||
|         glEnable(GL_DEBUG_OUTPUT); | ||||
|         glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|      | ||||
|     glEnable(GL_TEXTURE_2D); | ||||
|     glEnable(GL_SCISSOR_TEST); | ||||
|     glEnable(GL_BLEND); | ||||
|     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
| 
 | ||||
|      | ||||
|     Win32Resize(window_rect.right - window_rect.left, window_rect.bottom - window_rect.top); | ||||
| 
 | ||||
|      | ||||
|      | ||||
|     //
 | ||||
|     // Misc System Initializations
 | ||||
|     //
 | ||||
|      | ||||
|     win32vars.clipboard_sequence = GetClipboardSequenceNumber(); | ||||
| 
 | ||||
|      | ||||
|     if (win32vars.clipboard_sequence == 0){ | ||||
|         system_post_clipboard(make_lit_string("")); | ||||
| 
 | ||||
|          | ||||
|         win32vars.clipboard_sequence = GetClipboardSequenceNumber(); | ||||
|         win32vars.next_clipboard_is_self = 0; | ||||
| 
 | ||||
|          | ||||
|         if (win32vars.clipboard_sequence == 0){ | ||||
|             // TODO(allen): diagnostics
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|      | ||||
|     else{ | ||||
|         if (IsClipboardFormatAvailable(CF_TEXT)){ | ||||
|             if (OpenClipboard(win32vars.window_handle)){ | ||||
|  | @ -1931,23 +1922,45 @@ 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, | ||||
|         &memory_vars, &exchange_vars, | ||||
|         win32vars.clipboard_contents, current_directory, | ||||
|         win32vars.custom_api); | ||||
| 
 | ||||
|                        &memory_vars, &exchange_vars, | ||||
|                        win32vars.clipboard_contents, current_directory, | ||||
|                        win32vars.custom_api); | ||||
|      | ||||
|     system_free_memory(current_directory.str); | ||||
| 
 | ||||
|      | ||||
|     win32vars.input_chunk.pers.keep_playing = 1; | ||||
|     win32vars.first = 1; | ||||
|     timeBeginPeriod(1); | ||||
| 
 | ||||
|      | ||||
|     SetForegroundWindow(win32vars.window_handle); | ||||
|     SetActiveWindow(win32vars.window_handle); | ||||
|      | ||||
|     system_acquire_lock(FRAME_LOCK); | ||||
|      | ||||
|     SetForegroundWindow(window_handle); | ||||
|     SetActiveWindow(window_handle); | ||||
|      | ||||
|     MSG msg; | ||||
|     for (;win32vars.input_chunk.pers.keep_playing;){ | ||||
|         // TODO(allen): Find a good way to wait on a pipe
 | ||||
|  | @ -2096,7 +2109,7 @@ WinMain(HINSTANCE hInstance, | |||
|         } | ||||
|     } | ||||
|      | ||||
|     return 0; | ||||
|     return(0); | ||||
| } | ||||
| 
 | ||||
| #if 0 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Allen Webster
						Allen Webster