From 5b4109882486d4e55c5d1f7e4d50c57584777f76 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Mon, 16 Nov 2015 11:15:45 -0500 Subject: [PATCH] system cleanup --- 4coder_custom.h | 2 +- 4ed.cpp | 46 +++-- 4ed.h | 34 ++-- 4ed_app_target.cpp | 11 +- 4ed_color_view.cpp | 2 +- 4ed_command.cpp | 12 +- 4ed_debug_view.cpp | 2 +- 4ed_file_view.cpp | 10 +- 4ed_interactive_view.cpp | 2 +- 4ed_keyboard.cpp | 20 +- 4ed_layout.cpp | 8 +- 4ed_linux_keyboard.cpp | 20 ++ 4ed_math.cpp | 7 +- 4ed_menu_view.cpp | 2 +- 4ed_style.cpp | 12 +- 4ed_system.h | 13 +- linux_4ed.cpp | 404 +++++++++++++++++++++++++++++++++++++++ win32_4ed.cpp | 97 ++++------ 18 files changed, 561 insertions(+), 143 deletions(-) create mode 100644 4ed_linux_keyboard.cpp create mode 100644 linux_4ed.cpp diff --git a/4coder_custom.h b/4coder_custom.h index a6e801fb..2836de11 100644 --- a/4coder_custom.h +++ b/4coder_custom.h @@ -4,7 +4,7 @@ #define MDFR_ALT 2 #define MDFR_SHIFT 4 -typedef unsigned short Code; +typedef u16 Code; struct Key_Codes{ Code back; diff --git a/4ed.cpp b/4ed.cpp index a42a82e8..a3b05add 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -2691,7 +2691,6 @@ external App_Step_Sig(app_step){ for (i32 i = 0; i < input->press_count; ++i){ key_data.keys[key_data.count++] = input->press[i]; } - for (i32 i = 0; i < input->hold_count; ++i){ key_data.keys[key_data.count++] = input->hold[i]; } @@ -2720,15 +2719,15 @@ external App_Step_Sig(app_step){ // NOTE(allen): detect mouse hover status i32 mx = mouse_data.mx; i32 my = mouse_data.my; - bool32 mouse_in_edit_area = 0; - bool32 mouse_in_margin_area = 0; + b32 mouse_in_edit_area = 0; + b32 mouse_in_margin_area = 0; Panel *mouse_panel = 0; i32 mouse_panel_i = 0; { Panel *panel = 0; - bool32 in_edit_area = 0; - bool32 in_margin_area = 0; + b32 in_edit_area = 0; + b32 in_margin_area = 0; i32 panel_count = vars->layout.panel_count; i32 panel_i; @@ -2752,15 +2751,15 @@ external App_Step_Sig(app_step){ } } - bool32 mouse_on_divider = 0; - bool32 mouse_divider_vertical = 0; + b32 mouse_on_divider = 0; + b32 mouse_divider_vertical = 0; i32 mouse_divider_id = 0; i32 mouse_divider_side = 0; if (mouse_in_margin_area){ - bool32 resize_area = 0; + b32 resize_area = 0; i32 divider_id = 0; - bool32 seeking_v_divider = 0; + b32 seeking_v_divider = 0; i32 seeking_child_on_side = 0; Panel *panel = mouse_panel; if (mx >= panel->inner.x0 && mx < panel->inner.x1){ @@ -2840,7 +2839,7 @@ external App_Step_Sig(app_step){ i32 divider_id = div.id; do{ Divider_And_ID other_div = layout_get_divider(&vars->layout, divider_id); - bool32 divider_match = (other_div.divider->v_divider == mouse_divider_vertical); + b32 divider_match = (other_div.divider->v_divider == mouse_divider_vertical); i32 pos = other_div.divider->pos; if (divider_match && pos > mid && pos < max){ max = pos; @@ -2858,7 +2857,7 @@ external App_Step_Sig(app_step){ while (top > 0){ Divider_And_ID other_div = layout_get_divider(&vars->layout, divider_stack[--top]); - bool32 divider_match = (other_div.divider->v_divider == mouse_divider_vertical); + b32 divider_match = (other_div.divider->v_divider == mouse_divider_vertical); i32 pos = other_div.divider->pos; if (divider_match && pos > mid && pos < max){ max = pos; @@ -3025,12 +3024,12 @@ external App_Step_Sig(app_step){ View *view_ = panel->view; if (view_){ Assert(view_->do_view); - bool32 active = (panel == active_panel); + b32 active = (panel == active_panel); Input_Summary input = (active)?(active_input):(dead_input); if (panel == mouse_panel){ input.mouse = mouse_data; } - if (view_->do_view(system, thread, view_, panel->inner, active_view, + if (view_->do_view(system, view_, panel->inner, active_view, VMSG_STEP, 0, &input, &active_input)){ app_result.redraw = 1; } @@ -3199,12 +3198,12 @@ external App_Step_Sig(app_step){ View *view = panel->view; if (view){ view->do_view(system, - thread, view, inner, active_view, + view, inner, active_view, VMSG_RESIZE, 0, &dead_input, &active_input); view = (view->is_minor)?view->major:0; if (view){ view->do_view(system, - thread, view, inner, active_view, + view, inner, active_view, VMSG_RESIZE, 0, &dead_input, &active_input); } } @@ -3232,12 +3231,12 @@ external App_Step_Sig(app_step){ View *view = panel->view; if (view){ view->do_view(system, - thread, view, panel->inner, active_view, + view, panel->inner, active_view, VMSG_STYLE_CHANGE, 0, &dead_input, &active_input); view = (view->is_minor)?view->major:0; if (view){ view->do_view(system, - thread, view, panel->inner, active_view, + view, panel->inner, active_view, VMSG_STYLE_CHANGE, 0, &dead_input, &active_input); } } @@ -3257,19 +3256,18 @@ external App_Step_Sig(app_step){ i32_Rect full = panel->full; i32_Rect inner = panel->inner; - View *view_ = panel->view; + View *view = panel->view; Style *style = &vars->style; - bool32 active = (panel == active_panel); + b32 active = (panel == active_panel); u32 back_color = style->main.back_color; draw_rectangle(target, full, back_color); - if (view_){ - Assert(view_->do_view); + if (view){ + Assert(view->do_view); draw_push_clip(target, panel->inner); - view_->do_view(system, - thread, view_, panel->inner, active_view, - VMSG_DRAW, target, &dead_input, &active_input); + view->do_view(system, view, panel->inner, active_view, + VMSG_DRAW, target, &dead_input, &active_input); draw_pop_clip(target); } diff --git a/4ed.h b/4ed.h index b413c7a2..0d083c46 100644 --- a/4ed.h +++ b/4ed.h @@ -59,7 +59,7 @@ struct Key_Input_Data{ Key_Event_Data hold[KEY_INPUT_BUFFER_SIZE]; i32 press_count; i32 hold_count; - + b8 control_keys[CONTROL_KEY_COUNT]; b8 caps_lock; }; @@ -85,20 +85,20 @@ get_single_key(Key_Summary *summary, i32 index){ } struct Mouse_State{ - bool32 out_of_window; - bool32 left_button, right_button; - bool32 left_button_prev, right_button_prev; + b32 out_of_window; + b32 left_button, right_button; + b32 left_button_prev, right_button_prev; i32 x, y; i16 wheel; }; struct Mouse_Summary{ i32 mx, my; - bool32 l, r; - bool32 press_l, press_r; - bool32 release_l, release_r; - bool32 out_of_window; - bool32 wheel_used; + b32 l, r; + b32 press_l, press_r; + b32 release_l, release_r; + b32 out_of_window; + b32 wheel_used; i16 wheel_amount; }; @@ -118,8 +118,9 @@ struct Thread_Context; #define App_Init_Sig(name) \ b32 name(System_Functions *system, \ - Thread_Context *thread, Application_Memory *memory, \ - Key_Codes *loose_codes, Clipboard_Contents clipboard, \ + Application_Memory *memory, \ + Key_Codes *loose_codes, \ + Clipboard_Contents clipboard, \ Config_API api) typedef App_Init_Sig(App_Init); @@ -136,17 +137,18 @@ enum Application_Mouse_Cursor{ struct Application_Step_Result{ Application_Mouse_Cursor mouse_cursor_type; - bool32 redraw; + b32 redraw; }; #define App_Step_Sig(name) Application_Step_Result \ name(System_Functions *system, \ - Thread_Context *thread, Key_Codes *codes, \ - Key_Input_Data *input, Mouse_State *mouse, \ - b32 time_step, Render_Target *target, \ + Key_Codes *codes, \ + Key_Input_Data *input, \ + Mouse_State *mouse, \ + Render_Target *target, \ Application_Memory *memory, \ Clipboard_Contents clipboard, \ - b32 first_step, b32 force_redraw) + b32 time_step, b32 first_step, b32 force_redraw) typedef App_Step_Sig(App_Step); diff --git a/4ed_app_target.cpp b/4ed_app_target.cpp index 6833922f..45e3494d 100644 --- a/4ed_app_target.cpp +++ b/4ed_app_target.cpp @@ -70,8 +70,15 @@ #include "4ed.h" #include "4ed_rendering.h" -#include -#include +#if defined(_WIN32) +# include +# include +#elif defined(__linux__) +# include +# include +#else +# error UNSUPPORTED PLATFORM +#endif #include "4ed_internal.h" diff --git a/4ed_color_view.cpp b/4ed_color_view.cpp index 5f046d2e..d0058659 100644 --- a/4ed_color_view.cpp +++ b/4ed_color_view.cpp @@ -1748,7 +1748,7 @@ step_draw_library(System_Functions *system, } internal -DO_VIEW_SIG(do_color_view){ +Do_View_Sig(do_color_view){ view->mouse_cursor_type = APP_MOUSE_CURSOR_ARROW; Color_View *color_view = (Color_View*)view; i32 result = 0; diff --git a/4ed_command.cpp b/4ed_command.cpp index 3c454f87..d720c226 100644 --- a/4ed_command.cpp +++ b/4ed_command.cpp @@ -33,7 +33,7 @@ map_hash(u16 event_code, u8 modifiers){ return result; } -internal bool32 +internal b32 map_add(Command_Map *map, u16 event_code, u8 modifiers, Command_Function function, Custom_Command_Function *custom = 0){ Assert(map->count * 8 < map->max * 7); Command_Binding bind; @@ -55,7 +55,7 @@ map_add(Command_Map *map, u16 event_code, u8 modifiers, Command_Function functio return 0; } -internal bool32 +internal b32 map_find_entry(Command_Map *map, u16 event_code, u8 modifiers, i32 *index_out){ i64 hash = map_hash(event_code, modifiers); i32 max = map->max; @@ -71,9 +71,9 @@ map_find_entry(Command_Map *map, u16 event_code, u8 modifiers, i32 *index_out){ return 0; } -internal bool32 +internal b32 map_find(Command_Map *map, u16 event_code, u8 modifiers, Command_Binding *bind_out){ - bool32 result; + b32 result; i32 index; result = map_find_entry(map, event_code, modifiers, &index); if (result){ @@ -82,9 +82,9 @@ map_find(Command_Map *map, u16 event_code, u8 modifiers, Command_Binding *bind_o return result; } -internal bool32 +internal b32 map_drop(Command_Map *map, u16 event_code, u8 modifiers){ - bool32 result; + b32 result; i32 index; result = map_find_entry(map, event_code, modifiers, &index); if (result){ diff --git a/4ed_debug_view.cpp b/4ed_debug_view.cpp index 4d30d2d0..71dbee05 100644 --- a/4ed_debug_view.cpp +++ b/4ed_debug_view.cpp @@ -349,7 +349,7 @@ step_debug_view(Debug_View *view, i32_Rect rect, Render_Target *target, } internal -DO_VIEW_SIG(do_debug_view){ +Do_View_Sig(do_debug_view){ view->mouse_cursor_type = APP_MOUSE_CURSOR_ARROW; Debug_View *debug_view = (Debug_View*)view; i32 result = 0; diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index bb06a979..990b60a4 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -3720,7 +3720,7 @@ do_undo_slider(Widget_ID wid, UI_State *state, UI_Layout *layout, i32 max, i32 v } internal i32 -step_file_view(System_Functions *system, Thread_Context *thread, View *view_, i32_Rect rect, +step_file_view(System_Functions *system, View *view_, i32_Rect rect, bool32 is_active, Input_Summary *user_input){ view_->mouse_cursor_type = APP_MOUSE_CURSOR_IBEAM; i32 result = 0; @@ -3944,7 +3944,7 @@ buffer_get_sync(Editing_File *file){ } internal i32 -draw_file_view(Thread_Context *thread, View *view_, i32_Rect rect, bool32 is_active, +draw_file_view(View *view_, i32_Rect rect, bool32 is_active, Render_Target *target){ File_View *view = (File_View*)view_; Editing_File *file = view->file; @@ -4363,7 +4363,7 @@ free_file_view(View *view){ } internal -DO_VIEW_SIG(do_file_view){ +Do_View_Sig(do_file_view){ i32 result = 0; switch (message){ case VMSG_RESIZE: @@ -4373,11 +4373,11 @@ DO_VIEW_SIG(do_file_view){ }break; case VMSG_DRAW: { - result = draw_file_view(thread, view, rect, (view == active), target); + result = draw_file_view(view, rect, (view == active), target); }break; case VMSG_STEP: { - result = step_file_view(system, thread, view, rect, (view == active), user_input); + result = step_file_view(system, view, rect, (view == active), user_input); }break; case VMSG_FREE: { diff --git a/4ed_interactive_view.cpp b/4ed_interactive_view.cpp index e15d0a58..9ab0a285 100644 --- a/4ed_interactive_view.cpp +++ b/4ed_interactive_view.cpp @@ -187,7 +187,7 @@ step_draw_int_view(System_Functions *system, return result; } -DO_VIEW_SIG(do_interactive_view){ +Do_View_Sig(do_interactive_view){ i32 result = 0; view->mouse_cursor_type = APP_MOUSE_CURSOR_ARROW; diff --git a/4ed_keyboard.cpp b/4ed_keyboard.cpp index 49cb48d3..2d971bd4 100644 --- a/4ed_keyboard.cpp +++ b/4ed_keyboard.cpp @@ -3,7 +3,7 @@ * * 12.17.2014 * - * Win32-US Keyboard layer for project codename "4ed" + * Win32-US Keyboard layer for 4coder * */ @@ -13,10 +13,10 @@ globalvar u16 keycode_lookup_table[255]; globalvar u16 loose_keycode_lookup_table[255]; internal void -keycode_init(Key_Codes *codes, Key_Codes *loose_codes){ +keycode_init(Key_Codes *codes){ // NOTE(allen): Assign values to the global keycodes. // Skip over the ascii characters that are used as codes. - u16 code = 1; + u16 code = 1, loose; u16 *codes_array = (u16*)codes; for (i32 i = 0; i < sizeof(Key_Codes)/2;){ switch (code){ @@ -28,13 +28,7 @@ keycode_init(Key_Codes *codes, Key_Codes *loose_codes){ codes_array[i++] = code++; } } - - code = 1; - codes_array = (u16*)loose_codes; - for (i32 i = 0; i < sizeof(Key_Codes)/2; ++i){ - codes_array[i] = code++; - } - + // NOTE(allen): lookup table for conversion from // win32 vk values to fred_keycode values. for (u8 i = 0; i < 255; ++i){ @@ -44,8 +38,7 @@ keycode_init(Key_Codes *codes, Key_Codes *loose_codes){ loose_keycode_lookup_table[i] = 0; } else{ - - u16 code, loose = 0; + loose = 0; switch (i){ case VK_SPACE: code = loose = ' '; break; case VK_BACK: code = loose = codes->back; break; @@ -106,7 +99,7 @@ loose_keycode_lookup(u8 virtual_keycode){ return loose_keycode_lookup_table[virtual_keycode]; } -inline bool32 +inline b32 keycode_has_ascii(u16 keycode){ return (keycode >= 0x20 && keycode < 0x7F) || keycode == '\n' || keycode == '\t'; } @@ -161,3 +154,4 @@ keycode_to_character_ascii(Key_Codes *codes, } // BOTTOM + diff --git a/4ed_layout.cpp b/4ed_layout.cpp index 6750102c..49cdeefc 100644 --- a/4ed_layout.cpp +++ b/4ed_layout.cpp @@ -38,13 +38,13 @@ enum View_Message{ }; struct View; -#define DO_VIEW_SIG(name) \ - i32 (name)(System_Functions *system, Thread_Context *thread, \ +#define Do_View_Sig(name) \ + i32 (name)(System_Functions *system, \ View *view, i32_Rect rect, View *active, \ View_Message message, Render_Target *target, \ Input_Summary *user_input, Input_Summary *active_input) -typedef DO_VIEW_SIG(Do_View_Function); +typedef Do_View_Sig(Do_View_Function); #define HANDLE_COMMAND_SIG(name) \ void (name)(System_Functions *system, View *view, \ @@ -193,7 +193,7 @@ live_set_alloc_view(Live_Views *live_set, Mem_Options *mem){ inline void live_set_free_view(System_Functions *system, Live_Views *live_set, View *view){ Assert(live_set->count > 0); - view->do_view(system, 0, view, {}, 0, VMSG_FREE, 0, {}, 0); + view->do_view(system, view, {}, 0, VMSG_FREE, 0, {}, 0); view->next_free = live_set->free_view; live_set->free_view = view; --live_set->count; diff --git a/4ed_linux_keyboard.cpp b/4ed_linux_keyboard.cpp new file mode 100644 index 00000000..5a1afa65 --- /dev/null +++ b/4ed_linux_keyboard.cpp @@ -0,0 +1,20 @@ +/* + * Mr. 4th Dimention - Allen Webster + * + * 14.11.2015 + * + * Linux-US Keyboard layer for 4coder + * + */ + +// TOP + +internal Key_Event_Data +get_key_event(SDL_Event *event){ + Key_Event_Data result = {}; + return result; +} + + +// BOTTOM + diff --git a/4ed_math.cpp b/4ed_math.cpp index a1eddb7a..087668ed 100644 --- a/4ed_math.cpp +++ b/4ed_math.cpp @@ -23,16 +23,15 @@ inline real32 ABS(real32 x){ -#if C_MATH - return abs(x); -#endif + if (x < 0) x = -x; + return x; } inline real32 MOD(real32 x, i32 m){ #if C_MATH real32 whole, frac; - frac = modf(x, &whole); + frac = modff(x, &whole); return ((i32)(whole) % m) + frac; #endif } diff --git a/4ed_menu_view.cpp b/4ed_menu_view.cpp index 0f0d8a04..ecad69fa 100644 --- a/4ed_menu_view.cpp +++ b/4ed_menu_view.cpp @@ -53,7 +53,7 @@ step_draw_menu_view(Menu_View *view, Render_Target *target, i32_Rect rect, return result; } -DO_VIEW_SIG(do_menu_view){ +Do_View_Sig(do_menu_view){ i32 result = 0; Menu_View *menu_view = (Menu_View*)view; diff --git a/4ed_style.cpp b/4ed_style.cpp index 3bc54126..192c20e1 100644 --- a/4ed_style.cpp +++ b/4ed_style.cpp @@ -474,12 +474,14 @@ style_format_for_use(Font_Set *fonts, Style *out, Style_File_Format_v3 *style){ style_format_for_use(fonts, out, &form); } -internal bool32 +internal b32 style_library_import(System_Functions *system, char *filename, Font_Set *fonts, Style *out, i32 max, i32 *count_opt, i32 *total_opt = 0){ - bool32 result = 1; + b32 result = 1; File_Data file = system->load_file(filename); + Style_Page_Header *h = 0; + if (!file.data){ result = 0; } @@ -496,7 +498,7 @@ style_library_import(System_Functions *system, cursor = h+1; } - Style_Page_Header *h = (Style_Page_Header*)cursor; + h = (Style_Page_Header*)cursor; to_read = h->count; cursor = h+1; @@ -545,9 +547,9 @@ early_exit: return result; } -internal bool32 +internal b32 style_library_add(Style_Library *library, Style *style){ - bool32 result = 0; + b32 result = 0; i32 count = library->count; String my_name = style->name; Style *ostyle = library->styles; diff --git a/4ed_system.h b/4ed_system.h index 7f6d5f8b..95673d99 100644 --- a/4ed_system.h +++ b/4ed_system.h @@ -16,8 +16,8 @@ struct Plat_Handle{ }; struct File_Data{ - void *data; - u32 size; + void *data; + u32 size; }; struct Time_Stamp{ @@ -31,14 +31,19 @@ typedef Sys_Load_File_Sig(System_Load_File); #define Sys_Save_File_Sig(name) i32 name(char *filename, void *data, i32 size) typedef Sys_Save_File_Sig(System_Save_File); +#define Sys_File_Size_Sig(name) i32 name(char *filename) +typedef Sys_File_Size_Sig(System_File_Size); + #define Sys_File_Time_Stamp_Sig(name) Time_Stamp name(char *filename) typedef Sys_File_Time_Stamp_Sig(System_File_Time_Stamp); #define Sys_Time_Stamp_Now_Sig(name) u64 name() typedef Sys_Time_Stamp_Now_Sig(System_Time_Stamp_Now); +#if 0 #define Sys_Free_File_Sig(name) void name(File_Data file) typedef Sys_Free_File_Sig(System_Free_File); +#endif #define Sys_Get_Current_Directory_Sig(name) i32 name(char *out, i32 max) typedef Sys_Get_Current_Directory_Sig(System_Get_Current_Directory); @@ -68,10 +73,10 @@ typedef Sys_Get_Memory_Sig(System_Get_Memory); #define get_memory(size) get_memory_full(size, __LINE__, __FILE__) -#define Sys_Free_Memory_Sig(name) void name(void *block); +#define Sys_Free_Memory_Sig(name) void name(void *block) typedef Sys_Free_Memory_Sig(System_Free_Memory); -#define Sys_Post_Clipboard_Sig(name) void name(String str); +#define Sys_Post_Clipboard_Sig(name) void name(String str) typedef Sys_Post_Clipboard_Sig(System_Post_Clipboard); #define Sys_Time_Sig(name) i64 name() diff --git a/linux_4ed.cpp b/linux_4ed.cpp new file mode 100644 index 00000000..9cb773c2 --- /dev/null +++ b/linux_4ed.cpp @@ -0,0 +1,404 @@ +/* + * Mr. 4th Dimention - Allen Webster + * + * 14.11.2015 + * + * Linux layer for project codename "4ed" + * + */ + +// TOP + +#ifdef FRED_NOT_PACKAGE + +#define FRED_INTERNAL 1 +#define FRED_SLOW 1 + +#define FRED_PRINT_DEBUG 1 +#define FRED_PRINT_DEBUG_FILE_LINE 0 +#define FRED_PROFILING 1 +#define FRED_PROFILING_OS 0 +#define FRED_FULL_ERRORS 0 + +#else + +#define FRED_SLOW 0 +#define FRED_INTERNAL 0 + +#define FRED_PRINT_DEBUG 0 +#define FRED_PRINT_DEBUG_FILE_LINE 0 +#define FRED_PROFILING 0 +#define FRED_PROFILING_OS 0 +#define FRED_FULL_ERRORS 0 + +#endif + +#define SOFTWARE_RENDER 0 + +#if FRED_INTERNAL == 0 +# undef FRED_PRINT_DEBUG +# define FRED_PRINT_DEBUG 0 +# undef FRED_PROFILING +# define FRED_PROFILING 0 +# undef FRED_PROFILING_OS +# define FRED_PROFILING_OS 0 +#endif + +#if FRED_PRINT_DEBUG == 0 +# undef FRED_PRINT_DEBUG_FILE_LINE +# define FRED_PRINT_DEBUG_FILE_LINE 0 +# undef FRED_PRINT_DEBUG_FILE_LINE +# define FRED_PROFILING_OS 0 +#endif + +#define FPS 30 +#define frame_useconds (1000000 / FPS) + +#include "4ed_meta.h" + +#define FCPP_FORBID_MALLOC + +#include "4cpp_types.h" +#define FCPP_STRING_IMPLEMENTATION +#include "4cpp_string.h" + +#include "4ed_mem.cpp" + +#include "4ed_math.cpp" +#include "4coder_custom.h" +#include "4ed_system.h" +#include "4ed.h" +#include "4ed_rendering.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "4ed_internal.h" +#include "4ed_linux_keyboard.cpp" + +#define printe(m) printf("%s:%d: %s\n", __FILE__, __LINE__, #m) + +struct Linux_Vars{ + Application_Memory mem; + Key_Input_Data input; + b32 keep_going; + + Clipboard_Contents clipboard; + + void *app_code, *custom; + + System_Functions *system; + App_Functions app; + Config_API config_api; +}; + +Linux_Vars linuxvars; + +internal +Sys_Get_Memory_Sig(system_get_memory_){ + void *ptr = 0; + i32 prot = PROT_READ | PROT_WRITE; + i32 flags = MAP_PRIVATE | MAP_ANON; + +#if FRED_INTERNAL + ptr = mmap(0, size + sizeof(Sys_Bubble), prot, flags, -1, 0); + + 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); + insert_bubble(&win32vars.internal_bubble, bubble); + //ReleaseSemaphore(win32vars.DEBUG_sysmem_lock, 1, 0); + ptr = bubble + 1; +#else + ptr = mmap(0, size + sizeof(i32), prot, flags, -1, 0); + + i32 *size_ptr = (i32*)ptr; + *size_ptr = size; + ptr = size_ptr + 1; +#endif + + return ptr; +} + +#define system_get_memory(size) system_get_memory_(size, __LINE__, __FILE__) + +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); + remove_bubble(bubble); + //ReleaseSemaphore(win32vars.DEBUG_sysmem_lock, 1, 0); + munmap(bubble, bubble->size); +#else + i32 *size_ptr = (i32*)block - 1; + munmap(size_ptr, *size_ptr); +#endif + } +} + +internal +Sys_Time_Sig(system_time){ + i64 result = 0; + struct timespec tp; + if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0){ + result = tp.tv_sec*1000000 + tp.tv_nsec/1000; + } + return result; +} + +internal +Sys_Load_File_Sig(system_load_file){ + File_Data result = {}; + i32 prot = PROT_READ; + i32 flags = MAP_PRIVATE | MAP_ANON; + + struct stat sb; + if (stat(filename, &sb) == 0){ + result.size = sb.st_size; + result.data = system_get_memory(result.size); + if (result.data){ + i32 file = open(filename, O_RDONLY); + i32 result_size = read(file, result.data, result.size); + Assert(result_size == result.size); + close(file); + } + } + + return result; +} + +internal +Sys_Save_File_Sig(system_save_file){ + i32 file = open(filename, O_CREAT | O_WRONLY); + if (!file) return 0; + + i32 result_size = write(file, data, size); + Assert(result_size == size); + + close(file); + return 1; +} + +internal b32 +LinuxLoadAppCode(){ + b32 result = 0; + + char app_code_file[] = "4ed_app.so"; + i32 app_code_file_len = sizeof(app_code_file) - 1; + + char path[1024]; + i32 size = readlink("/proc/self/exe", path, + 1024 - app_code_file_len - 1); + + for (--size; + path[size] != '/' && size > 0; + --size); + memcpy(path + size + 1, app_code_file, app_code_file_len + 1); + + linuxvars.app_code = SDL_LoadObject(path); + if (linuxvars.app_code){ + result = 1; + linuxvars.app.init = (App_Init*) + SDL_LoadFunction(linuxvars.app_code, "app_init"); + linuxvars.app.step = (App_Step*) + SDL_LoadFunction(linuxvars.app_code, "app_step"); + } + else{ + // TODO(allen): initialization failure + printe(app_code); + } + + return result; +} + +internal +Sys_Acquire_Lock_Sig(system_acquire_lock){ + AllowLocal(id); +} + +internal +Sys_Release_Lock_Sig(system_release_lock){ + AllowLocal(id); +} + +internal void +LinuxLoadSystemCode(){ + linuxvars.system->get_memory_full = system_get_memory_; + linuxvars.system->free_memory = system_free_memory; + + linuxvars.system->load_file = system_load_file; + linuxvars.system->save_file = system_save_file; + +#if 0 + linuxvars.system->file_time_stamp = system_file_time_stamp; + linuxvars.system->time_stamp_now = system_time_stamp_now; + linuxvars.system->free_file = system_free_file; + + linuxvars.system->get_current_directory = system_get_current_directory; + linuxvars.system->get_easy_directory = system_get_easy_directory; + + linuxvars.system->get_file_list = system_get_file_list; + linuxvars.system->free_file_list = system_free_file_list; + + linuxvars.system->post_clipboard = system_post_clipboard; + linuxvars.system->time = system_time; + + linuxvars.system->cli_call = system_cli_call; + linuxvars.system->cli_begin_update = system_cli_begin_update; + linuxvars.system->cli_update_step = system_cli_update_step; + linuxvars.system->cli_end_update = system_cli_end_update; + + linuxvars.system->thread_get_id = system_thread_get_id; + linuxvars.system->thread_current_job_id = system_thread_current_job_id; + linuxvars.system->post_job = system_post_job; + linuxvars.system->cancel_job = system_cancel_job; + linuxvars.system->job_is_pending = system_job_is_pending; + linuxvars.system->grow_thread_memory = system_grow_thread_memory; + linuxvars.system->acquire_lock = system_acquire_lock; + linuxvars.system->release_lock = system_release_lock; + + linuxvars.system->force_redraw = system_force_redraw; + + linuxvars.system->internal_sentinel = INTERNAL_system_sentinel; + linuxvars.system->internal_get_thread_states = INTERNAL_get_thread_states; +#endif +} + +int main(){ + linuxvars = {}; + + if (SDL_Init(SDL_INIT_VIDEO)){ + // TODO(allen): initialization failure + printe(SDL_Init); + return(1); + } + SDL_EnableUNICODE(1); + + if (!LinuxLoadAppCode()){ + return(1); + } + + System_Functions system_; + System_Functions *system = &system_; + linuxvars.system = system; + LinuxLoadSystemCode(); + + const SDL_VideoInfo *info = SDL_GetVideoInfo(); + if (!info){ + // TODO(allen): initialization failure + printe(info); + return(1); + } + + { + void *base; +#if FRED_INTERNAL + base = (void*)Mbytes(128); +#else + base = (void*)0; +#endif + + i32 prot = PROT_READ | PROT_WRITE; + i32 flags = MAP_PRIVATE | MAP_ANON; + + linuxvars.mem.vars_memory_size = Mbytes(2); + linuxvars.mem.vars_memory = mmap(base, linuxvars.mem.vars_memory_size, + prot, flags, -1, 0); + +#if FRED_INTERNAL + base = (void*)Mbytes(160); +#else + base = (void*)0; +#endif + + linuxvars.mem.target_memory_size = Mbytes(64); + linuxvars.mem.target_memory = mmap(base, linuxvars.mem.target_memory_size, + prot, flags, -1, 0); + } + + i32 width = 800; + i32 height = 600; + i32 bpp = info->vfmt->BitsPerPixel; + + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + + i32 flags = SDL_OPENGL; + + if (SDL_SetVideoMode(width, height, bpp, flags) == 0){ + // TODO(allen): initialization failure + printe(SDL_SetVideoMode); + return(1); + } + + SDL_WM_SetCaption("4coder-window", 0); + + system_acquire_lock(FRAME_LOCK); + b32 first = 1; + linuxvars.keep_going = 1; + + SDL_Event event; + for (;linuxvars.keep_going && SDL_WaitEvent(&event);){ + b32 pass_to_app = 0; + + linuxvars.input = {}; + linuxvars.clipboard = {}; + switch (event.type){ + case SDL_ACTIVEEVENT: + { + if ((event.active.state & SDL_APPACTIVE) && event.active.gain) + pass_to_app = 1; + }break; + + case SDL_KEYDOWN: + { + pass_to_app = 1; + linuxvars.input.press[linuxvars.input.press_count++] = + get_key_event(&event); + }break; + + case SDL_QUIT: + { + linuxvars.keep_going = 0; + }break; + + } + + if (pass_to_app){ + Application_Step_Result app_result = + linuxvars.app.step(linuxvars.system, + 0, + 0, + &linuxvars.input, + 0, + 1, + 0, + &linuxvars.mem, + linuxvars.clipboard, + first, 1); + + + + SDL_GL_SwapBuffers(); + } + } + + return(0); +} + +// BOTTOM + diff --git a/win32_4ed.cpp b/win32_4ed.cpp index 28d8153f..7ded78a1 100644 --- a/win32_4ed.cpp +++ b/win32_4ed.cpp @@ -52,7 +52,7 @@ #endif #define FPS 30 -#define FRAME_TIME (1000000 / FPS) +#define frame_useconds (1000000 / FPS) #include "4ed_meta.h" @@ -70,28 +70,10 @@ #include "4ed.h" #include "4ed_rendering.h" -Config_API config_api; - #include #include #include "4ed_internal.h" - -#if 0 -#define FCPP_LEXER_IMPLEMENTATION -#include "4cpp_lexer.h" -#include "4ed_rendering.cpp" -#include "4ed_command.cpp" -#include "4ed_layout.cpp" -#include "4ed_style.cpp" -#include "4ed_file_view.cpp" -#include "4ed_color_view.cpp" -#include "4ed_interactive_view.cpp" -#include "4ed_menu_view.cpp" -#include "4ed_debug_view.cpp" -#include "4ed.cpp" -#endif - #include "4ed_keyboard.cpp" struct Full_Job_Data{ @@ -128,7 +110,7 @@ struct Thread_Group{ struct Win32_Vars{ HWND window_handle; - Key_Codes key_codes, loose_codes; + Key_Codes key_codes; Key_Input_Data input_data, previous_data; #if SOFTWARE_RENDER @@ -148,15 +130,15 @@ struct Win32_Vars{ u32 volatile force_redraw; Mouse_State mouse; - bool32 focus; - bool32 keep_playing; + b32 focus; + b32 keep_playing; HCURSOR cursor_ibeam; HCURSOR cursor_arrow; HCURSOR cursor_leftright; HCURSOR cursor_updown; Application_Mouse_Cursor prev_mouse_cursor; Clipboard_Contents clipboard_contents; - bool32 next_clipboard_is_self; + b32 next_clipboard_is_self; DWORD clipboard_sequence; Thread_Context main_thread; @@ -167,15 +149,16 @@ struct Win32_Vars{ HANDLE DEBUG_sysmem_lock; Thread_Memory *thread_memory; + i64 performance_frequency; + i64 start_pcount; + HMODULE custom; HMODULE app_code; - i64 performance_frequency; - i64 start_pcount; - System_Functions *system; App_Functions app; - + Config_API config_api; + #if FRED_INTERNAL Sys_Bubble internal_bubble; #endif @@ -195,13 +178,13 @@ system_get_memory_(i32 size, i32 line_number, char *file_name){ #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); - insert_bubble(&win32vars.internal_bubble, bubble); ReleaseSemaphore(win32vars.DEBUG_sysmem_lock, 1, 0); ptr = bubble + 1; @@ -495,7 +478,7 @@ Win32Resize(i32 width, i32 height){ } internal void -Win32KeyboardHandle(bool8 current_state, bool8 previous_state, WPARAM wParam){ +Win32KeyboardHandle(b8 current_state, b8 previous_state, WPARAM wParam){ u16 key = keycode_lookup((u8)wParam); if (key != -1){ if (current_state & !previous_state){ @@ -639,12 +622,15 @@ Win32Callback(HWND hwnd, UINT uMsg, Clipboard_Contents empty_contents = {}; win32vars.app.step(win32vars.system, - &win32vars.main_thread, &win32vars.key_codes, - &win32vars.previous_data, &win32vars.mouse, - 0, &win32vars.target, &win32memory, empty_contents, 0, 1); + &win32vars.key_codes, + &win32vars.previous_data, + &win32vars.mouse, + &win32vars.target, + &win32memory, + empty_contents, + 0, 0, 1); Win32RedrawScreen(hdc); - EndPaint(hwnd, &ps); }break; @@ -719,9 +705,9 @@ ThreadProc(LPVOID lpParameter){ } } -internal bool32 +internal b32 Win32JobIsPending(Work_Queue *queue, u32 job_id){ - bool32 result; + b32 result; u32 job_index; Full_Job_Data *full_job; @@ -754,7 +740,7 @@ system_post_job(Thread_Group_ID group_id, Job_Data job){ Assert((queue->write_position + 1) % QUEUE_WRAP != queue->read_position % QUEUE_WRAP); - bool32 success = 0; + b32 success = 0; u32 result = 0; while (!success){ u32 write_index = queue->write_position; @@ -816,7 +802,7 @@ system_cancel_job(Thread_Group_ID group_id, u32 job_id){ } } -internal bool32 +internal b32 system_job_is_pending(Thread_Group_ID group_id, u32 job_id){ Work_Queue *queue = win32vars.queues + group_id;; return Win32JobIsPending(queue, job_id); @@ -1001,6 +987,9 @@ Win32LoadAppCode(){ internal void Win32LoadSystemCode(){ + win32vars.system->get_memory_full = system_get_memory_; + win32vars.system->free_memory = system_free_memory; + win32vars.system->load_file = system_load_file; win32vars.system->save_file = system_save_file; win32vars.system->file_time_stamp = system_file_time_stamp; @@ -1013,9 +1002,6 @@ Win32LoadSystemCode(){ win32vars.system->get_file_list = system_get_file_list; win32vars.system->free_file_list = system_free_file_list; - win32vars.system->get_memory_full = system_get_memory_; - win32vars.system->free_memory = system_free_memory; - win32vars.system->post_clipboard = system_post_clipboard; win32vars.system->time = system_time; @@ -1045,7 +1031,6 @@ WinMain(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow){ win32vars = {}; - config_api = {}; if (!Win32LoadAppCode()){ // TODO(allen): Failed to load app code, serious problem. @@ -1069,15 +1054,15 @@ WinMain(HINSTANCE hInstance, win32vars.internal_bubble.flags = MEM_BUBBLE_SYS_DEBUG; #endif - keycode_init(&win32vars.key_codes, &win32vars.loose_codes); + keycode_init(&win32vars.key_codes); #ifdef FRED_SUPER win32vars.custom = LoadLibraryA("4coder_custom.dll"); if (win32vars.custom){ - config_api.get_bindings = (Get_Binding_Data_Function*) + win32vars.config_api.get_bindings = (Get_Binding_Data_Function*) GetProcAddress(win32vars.custom, "get_bindings"); - config_api.set_extra_font = (Set_Extra_Font_Function*) + win32vars.config_api.set_extra_font = (Set_Extra_Font_Function*) GetProcAddress(win32vars.custom, "set_extra_font"); } #endif @@ -1147,7 +1132,7 @@ WinMain(HINSTANCE hInstance, window_class.lpszClassName, WINDOW_NAME, WS_OVERLAPPEDWINDOW | WS_VISIBLE, - CW_USEDEFAULT/*x*/, CW_USEDEFAULT/*y*/, + CW_USEDEFAULT, CW_USEDEFAULT, window_rect.right - window_rect.left, window_rect.bottom - window_rect.top, 0, 0, hInstance, 0); @@ -1259,6 +1244,7 @@ WinMain(HINSTANCE hInstance, // TODO(allen): diagnostics } } + else{ if (IsClipboardFormatAvailable(CF_TEXT)){ if (OpenClipboard(win32vars.window_handle)){ @@ -1276,9 +1262,9 @@ WinMain(HINSTANCE hInstance, } } - if (!win32vars.app.init(win32vars.system, &win32vars.main_thread, + if (!win32vars.app.init(win32vars.system, &win32memory, &win32vars.key_codes, - win32vars.clipboard_contents, config_api)){ + win32vars.clipboard_contents, win32vars.config_api)){ return 5; } @@ -1288,7 +1274,7 @@ WinMain(HINSTANCE hInstance, system_acquire_lock(FRAME_LOCK); Thread_Context *thread = &win32vars.main_thread; AllowLocal(thread); - bool32 first = 1; + b32 first = 1; i64 timer_start = system_time(); while (win32vars.keep_playing){ @@ -1391,14 +1377,15 @@ WinMain(HINSTANCE hInstance, i32 redraw = InterlockedExchange(&win32vars.force_redraw, 0); ProfileEnd(OS_input); - Application_Step_Result result = - win32vars.app.step(win32vars.system, - &win32vars.main_thread, &win32vars.key_codes, - &win32vars.input_data, &win32vars.mouse, - 1, &win32vars.target, + Application_Step_Result result = + win32vars.app.step(win32vars.system, + &win32vars.key_codes, + &win32vars.input_data, + &win32vars.mouse, + &win32vars.target, &win32memory, win32vars.clipboard_contents, - first, redraw); + 1, first, redraw); ProfileStart(OS_frame_out); first = 0; @@ -1421,7 +1408,7 @@ WinMain(HINSTANCE hInstance, ProfileStart(frame_sleep); i64 timer_end = system_time(); - i64 end_target = (timer_start + FRAME_TIME); + i64 end_target = (timer_start + frame_useconds); system_release_lock(FRAME_LOCK); while (timer_end < end_target){