From a01957a3fc75256092e28cd6e9b0018104360fe2 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 4 Sep 2016 16:41:48 -0400 Subject: [PATCH] moved linux over to build.c system --- 4coder_custom.so | Bin 0 -> 170096 bytes 4ed_app | Bin 0 -> 631472 bytes Makefile | 19 + build.c | 322 ++- fsmgen | Bin 0 -> 27912 bytes linux_4ed.cpp | 6962 ++++++++++++++++++++++----------------------- metagen | Bin 0 -> 168440 bytes original.Makefile | 6 +- 8 files changed, 3766 insertions(+), 3543 deletions(-) create mode 100755 4coder_custom.so create mode 100755 4ed_app create mode 100755 fsmgen create mode 100755 metagen diff --git a/4coder_custom.so b/4coder_custom.so new file mode 100755 index 0000000000000000000000000000000000000000..8470c9582cf71e070c31f3836016ae37d4d2bf86 GIT binary patch literal 170096 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

Mil0;LL+DbQGfYyzbT~}mB@36q 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

M3SFEBOg2 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 literal 0 HcmV?d00001 diff --git a/Makefile b/Makefile index e69de29b..e4a4ea86 100755 --- a/Makefile +++ b/Makefile @@ -0,0 +1,19 @@ +CPP_FILES := $(wildcard *.cpp) $(wildcard **/*.cpp) +C_FILES := $(wildcard *.c) $(wildcard **/*.c) +H_FILES := $(wildcard *.h) $(wildcard **/*.h) + +WARNINGS := -Wno-write-strings +FLAGS := -D_GNU_SOURCE -fPIC + +debug: FLAGS += -DDEV_BUILD +debug: ../build/build + +../build/build: $(CPP_FILES) $(C_FILES) $(H_FILES) + gcc $(WARNINGS) $(FLAGS) build.c -g -o $@ + ../build/build + +clean: + $(RM) ../build/build ../build/fsmgen ../build/metagen ../build/4ed_app.so ../build/4ed + + + diff --git a/build.c b/build.c index 54c6c866..6214fe4f 100644 --- a/build.c +++ b/build.c @@ -4,19 +4,17 @@ // TOP -#include +#include // include system for windows +#include // include system for linux (YAY!) #include #include +#include // // reusable // -#define CL_OPTS \ -"/W4 /wd4310 /wd4100 /wd4201 /wd4505 /wd4996 " \ -"/wd4127 /wd4510 /wd4512 /wd4610 /wd4390 /WX " \ -"/GR- /EHa- /nologo /FC" - +// NOTE(allen): Compiler OS cracking. #if defined(_MSC_VER) #define IS_CL @@ -25,6 +23,18 @@ #if defined(_WIN32) # define IS_WINDOWS # pragma comment(lib, "Kernel32.lib") +#else +# error This compiler/platform combo is not supported yet +#endif + +#elif defined(__GNUC__) || defined(__GNUG__) + +#define IS_GCC + +#if defined(__gnu_linux__) +# define IS_LINUX +#else +# error This compiler/platform combo is not supported yet #endif #else @@ -41,6 +51,11 @@ static int32_t error_state = 0; }while(0) +static void init_time_system(); +static uint64_t get_time(); +static int32_t get_current_directory(char *buffer, int32_t max); +static void execute(char *dir, char *str); + #if defined(IS_WINDOWS) typedef uint32_t DWORD; @@ -101,6 +116,69 @@ execute(char *dir, char *str){ } } +#elif defined(IS_LINUX) + +#include +#include + +typedef struct Temp_Dir{ + char dir[512]; +} Temp_Dir; + +static Temp_Dir +linux_pushd(char *dir){ + Temp_Dir temp; + char *result = getcwd(temp.dir, sizeof(temp.dir)); + int32_t chresult = chdir(dir); + if (result == 0 || chresult != 0){ + printf("trying pushd %s\n", dir); + assert(result != 0); + assert(chresult == 0); + } + return(temp); +} + +static void +linux_popd(Temp_Dir temp){ + chdir(temp.dir); +} + +static void +init_time_system(){ + // NOTE(allen): do nothing +} + +static uint64_t +get_time(){ + struct timespec spec; + uint64_t result; + clock_gettime(CLOCK_MONOTONIC, &spec); + result = (spec.tv_sec * (uint64_t)(1000000)) + (spec.tv_nsec / (uint64_t)(1000)); + return(result); +} + +static int32_t +get_current_directory(char *buffer, int32_t max){ + int32_t result = 0; + char *d = getcwd(buffer, max); + if (d == buffer){ + result = strlen(buffer); + } + return(result); +} + +static void +execute(char *dir, char *str){ + if (dir){ + Temp_Dir temp = linux_pushd(dir); + systemf("%s", str); + linux_popd(temp); + } + else{ + systemf("%s", str); + } +} + #else #error This OS is not supported yet #endif @@ -112,19 +190,11 @@ execute(char *dir, char *str){ // 4coder specific // -#define CL_INCLUDES \ -"/I..\\foreign /I..\\foreign\\freetype2" - -#define CL_LIBS \ -"user32.lib winmm.lib gdi32.lib opengl32.lib ..\\foreign\\freetype.lib" - -#define CL_ICON \ -"..\\foreign\\freetype.lib" static void -swap_ptr(void **A, void **B){ - void *a = *A; - void *b = *B; +swap_ptr(char **A, char **B){ + char *a = *A; + char *b = *B; *A = b; *B = a; } @@ -150,6 +220,62 @@ enum{ }; +#define BUILD_LINE_MAX 4096 +typedef struct Build_Line{ + char build_optionsA[BUILD_LINE_MAX]; + char build_optionsB[BUILD_LINE_MAX]; + char *build_options; + char *build_options_prev; + int32_t build_max; +} Build_Line; + +static void +init_build_line(Build_Line *line){ + line->build_options = line->build_optionsA; + line->build_options_prev = line->build_optionsB; + line->build_optionsA[0] = 0; + line->build_optionsB[0] = 0; + line->build_max = BUILD_LINE_MAX; +} + +#if defined(IS_CL) + +#define build_ap(line, str, ...) do{ \ + snprintf(line.build_options, \ + line.build_max, "%s "str, \ + line.build_options_prev, __VA_ARGS__); \ + swap_ptr(&line.build_options, \ + &line.build_options_prev); \ +}while(0) + +#elif defined(IS_GCC) + +#define build_ap(line, str, ...) do{ \ + snprintf(line.build_options, \ + line.build_max, "%s "str, \ + line.build_options_prev, ##__VA_ARGS__);\ + swap_ptr(&line.build_options, \ + &line.build_options_prev); \ +}while(0) + +#endif + + +#define CL_OPTS \ +"/W4 /wd4310 /wd4100 /wd4201 /wd4505 /wd4996 " \ +"/wd4127 /wd4510 /wd4512 /wd4610 /wd4390 /WX " \ +"/GR- /EHa- /nologo /FC" + +#define CL_INCLUDES \ +"/I..\\foreign /I..\\foreign\\freetype2" + +#define CL_LIBS \ +"user32.lib winmm.lib gdi32.lib opengl32.lib " \ +"..\\foreign\\freetype.lib" + +#define CL_ICON \ +"..\\foreign\\freetype.lib" + static void build_cl(uint32_t flags, char *code_path, char *code_file, @@ -158,6 +284,51 @@ build_cl(uint32_t flags, win32_slash_fix(out_path); win32_slash_fix(code_path); + Build_Line line; + init_build_line(&line); + + if (flags & OPTS){ + build_ap(line, CL_OPTS); + } + + if (flags & INCLUDES){ + build_ap(line, CL_INCLUDES); + } + + if (flags & LIBS){ + build_ap(line, CL_LIBS); + } + + if (flags & ICON){ + build_ap(line, CL_ICON); + } + + if (flags & DEBUG_INFO){ + build_ap(line, "/Zi"); + } + + if (flags & OPTIMIZATION){ + build_ap(line, "/O2"); + } + + if (flags & SHARED_CODE){ + build_ap(line, "/LD"); + } + + if (flags & SUPER){ + build_ap(line, "/DFRED_SUPER"); + } + + if (flags & INTERNAL){ + build_ap(line, "/DFRED_INTERNAL"); + } + + if (flags & KEEP_ASSERT){ + build_ap(line, "/DFRED_KEEP_ASSERT"); + } + + swap_ptr(&line.build_options, &line.build_options_prev); + char link_options[1024]; if (flags & SHARED_CODE){ assert(exports); @@ -167,69 +338,84 @@ build_cl(uint32_t flags, snprintf(link_options, sizeof(link_options), "/NODEFAULTLIB:library"); } - char build_optionsA[4096]; - char build_optionsB[4096]; - char *build_options = build_optionsA; - char *build_options_prev = build_optionsB; - int32_t build_max = sizeof(build_optionsA); - - build_optionsA[0] = 0; - build_optionsB[0] = 0; + systemf("pushd %s & cl %s %s\\%s /Fe%s /link /DEBUG /INCREMENTAL:NO %s", + out_path, line.build_options, code_path, code_file, out_file, link_options); +} + + + +#define GCC_OPTS \ +"-Wno-write-strings -D_GNU_SOURCE -fPIC " \ +"-fno-threadsafe-statics -pthread" + +#define GCC_INCLUDES \ +"-I../foreign" + +#define GCC_LIBS \ +"-L/usr/local/lib -lX11 -lpthread -lm -lrt " \ +"-lGL -ldl -lXfixes -lfreetype -lfontconfig" + +static void +build_gcc(uint32_t flags, + char *code_path, char *code_file, + char *out_path, char *out_file, + char *exports){ + Build_Line line; + init_build_line(&line); if (flags & OPTS){ - snprintf(build_options, build_max, "%s "CL_OPTS, build_options_prev); - swap_ptr(&build_options, &build_options_prev); + build_ap(line, GCC_OPTS); } if (flags & INCLUDES){ - snprintf(build_options, build_max, "%s "CL_INCLUDES, build_options_prev); - swap_ptr(&build_options, &build_options_prev); - } - - if (flags & LIBS){ - snprintf(build_options, build_max, "%s "CL_LIBS, build_options_prev); - swap_ptr(&build_options, &build_options_prev); - } - - if (flags & ICON){ - snprintf(build_options, build_max, "%s "CL_ICON, build_options_prev); - swap_ptr(&build_options, &build_options_prev); + int32_t size = 0; + char freetype_include[512]; + FILE *file = popen("pkg-config --cflags freetype2", "r"); + if (file != 0){ + fgets(freetype_include, sizeof(freetype_include), file); + size = strlen(freetype_include); + freetype_include[size-1] = 0; + pclose(file); + } + + build_ap(line, GCC_INCLUDES" %s", freetype_include); } if (flags & DEBUG_INFO){ - snprintf(build_options, build_max, "%s /Zi", build_options_prev); - swap_ptr(&build_options, &build_options_prev); + build_ap(line, "-g -O0"); } if (flags & OPTIMIZATION){ - snprintf(build_options, build_max, "%s /O2", build_options_prev); - swap_ptr(&build_options, &build_options_prev); + build_ap(line, "-O3"); } if (flags & SHARED_CODE){ - snprintf(build_options, build_max, "%s /LD", build_options_prev); - swap_ptr(&build_options, &build_options_prev); + build_ap(line, "-shared"); } if (flags & SUPER){ - snprintf(build_options, build_max, "%s /DFRED_SUPER", build_options_prev); - swap_ptr(&build_options, &build_options_prev); + build_ap(line, "-DFRED_SUPER"); } if (flags & INTERNAL){ - snprintf(build_options, build_max, "%s /DFRED_INTERNAL", build_options_prev); - swap_ptr(&build_options, &build_options_prev); + build_ap(line, "-DFRED_INTERNAL"); } if (flags & KEEP_ASSERT){ - snprintf(build_options, build_max, "%s /DFRED_KEEP_ASSERT", build_options_prev); - swap_ptr(&build_options, &build_options_prev); + build_ap(line, "-DFRED_KEEP_ASSERT"); } - swap_ptr(&build_options, &build_options_prev); + build_ap(line, "%s/%s", code_path, code_file); - systemf("pushd %s & cl %s %s\\%s /Fe%s /link /DEBUG /INCREMENTAL:NO %s", - out_path, build_options, code_path, code_file, out_file, link_options); + if (flags & LIBS){ + build_ap(line, GCC_LIBS); + } + + swap_ptr(&line.build_options, &line.build_options_prev); + + Temp_Dir temp = linux_pushd(out_path); + systemf("g++ %s -o %s", line.build_options, out_file); + linux_popd(temp); } static void @@ -239,6 +425,8 @@ build(uint32_t flags, char *exports){ #if defined(IS_CL) build_cl(flags, code_path, code_file, out_path, out_file, exports); +#elif defined(IS_GCC) + build_gcc(flags, code_path, code_file, out_path, out_file, exports); #else #error The build rule for this compiler is not ready #endif @@ -254,6 +442,15 @@ buildsuper(char *code_path, char *out_path, char *filename){ systemf("pushd %s & call \"%s\\buildsuper.bat\" %s", out_path, code_path, filename); +#elif defined(IS_GCC) + + Temp_Dir temp = linux_pushd(out_path); + + systemf("\"%s/buildsuper.sh\" %s", + code_path, filename); + + linux_popd(temp); + #else #error The build rule for this compiler is not ready #endif @@ -262,6 +459,14 @@ buildsuper(char *code_path, char *out_path, char *filename){ #define META_DIR "../meta" #define BUILD_DIR "../build" +#if defined(IS_WINDOWS) +#define PLAT_LAYER "win32_4ed.cpp" +#elif defined(IS_LINUX) +#define PLAT_LAYER "linux_4ed.cpp" +#else +#error No platform layer defined for this OS. +#endif + static void standard_build(char *cdir, uint32_t flags){ #if 1 @@ -298,7 +503,11 @@ standard_build(char *cdir, uint32_t flags){ { BEGIN_TIME_SECTION(); //buildsuper(cdir, BUILD_DIR, "../code/4coder_default_bindings.cpp"); +#if IS_WINDOWS buildsuper(cdir, BUILD_DIR, "../code/internal_4coder_tests.cpp"); +#else + buildsuper(cdir, BUILD_DIR, "../code/power/4coder_experiments.cpp"); +#endif //buildsuper(cdir, BUILD_DIR, "../code/power/4coder_casey.cpp"); //buildsuper(cdir, BUILD_DIR, "../4vim/4coder_chronal.cpp"); END_TIME_SECTION("build custom"); @@ -315,16 +524,17 @@ standard_build(char *cdir, uint32_t flags){ { BEGIN_TIME_SECTION(); - build(OPTS | INCLUDES | LIBS | ICON | flags, cdir, "win32_4ed.cpp", + build(OPTS | INCLUDES | LIBS | ICON | flags, cdir, PLAT_LAYER, BUILD_DIR, "4ed", 0); END_TIME_SECTION("build 4ed"); } #endif } -#if defined(DEV_BUILD) +#if defined(DEV_BUILD) + int main(int argc, char **argv){ init_time_system(); diff --git a/fsmgen b/fsmgen new file mode 100755 index 0000000000000000000000000000000000000000..9804106bdd01577fce593a55efde0c3574b56a28 GIT binary patch literal 27912 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 ys6;Xfq6K8_U - -# include "4coder_mem.h" - -// TODO(allen): This is duplicated from 4coder_custom.h -// I need to work out a way to avoid this. -#define VIEW_ROUTINE_SIG(name) void name(struct Application_Links *app, int32_t view_id) -#define GET_BINDING_DATA(name) int32_t name(void *data, int32_t size) -#define _GET_VERSION_SIG(n) int32_t n(int32_t maj, int32_t min, int32_t patch) - -typedef VIEW_ROUTINE_SIG(View_Routine_Function); -typedef GET_BINDING_DATA(Get_Binding_Data_Function); -typedef _GET_VERSION_SIG(_Get_Version_Function); - -struct Custom_API{ - View_Routine_Function *view_routine; - Get_Binding_Data_Function *get_bindings; - _Get_Version_Function *get_alpha_4coder_version; -}; - - -typedef void Custom_Command_Function; -#include "4coder_types.h" -struct Application_Links; -# include "4ed_os_custom_api.h" - -//# include "4coder_custom.h" -#else -# include "4coder_default_bindings.cpp" - -# define FSTRING_IMPLEMENTATION -# define FSTRING_C -# include "4coder_string.h" - -#endif - -#include "4ed_math.h" - -#include "4ed_system.h" -#include "4ed_rendering.h" -#include "4ed.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - - -// -// Linux macros -// - -#define LINUX_MAX_PASTE_CHARS 0x10000L -#define FPS 60L -#define frame_useconds (1000000UL / FPS) - -#define LinuxGetMemory(size) LinuxGetMemory_(size, __LINE__, __FILE__) - -#if FRED_INTERNAL - #define LINUX_FN_DEBUG(fmt, ...) do { \ - fprintf(stderr, "%s: " fmt "\n", __func__, ##__VA_ARGS__); \ - } while(0) -#else - #define LINUX_FN_DEBUG(fmt, ...) -#endif - -#if (__cplusplus <= 199711L) - #define static_assert(x, ...) -#endif - -#if defined(_BSD_SOURCE) || defined(_SVID_SOURCE) || _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 - #define OLD_STAT_NANO_TIME 0 -#else - #define OLD_STAT_NANO_TIME 1 -#endif - -#define SUPPORT_DPI 1 -#define LINUX_FONTS 1 - -#define InterlockedCompareExchange(dest, ex, comp) __sync_val_compare_and_swap((dest), (comp), (ex)) - -#include "filetrack/4tech_file_track_linux.c" -#include "system_shared.h" - -// -// Linux structs / enums -// - -#if FRED_INTERNAL - -struct Sys_Bubble : public Bubble{ - i32 line_number; - char *file_name; -}; - -#endif - -enum { - LINUX_4ED_EVENT_X11 = (UINT64_C(1) << 32), - LINUX_4ED_EVENT_X11_INTERNAL = (UINT64_C(2) << 32), - LINUX_4ED_EVENT_STEP = (UINT64_C(3) << 32), - LINUX_4ED_EVENT_STEP_TIMER = (UINT64_C(4) << 32), - LINUX_4ED_EVENT_CLI = (UINT64_C(5) << 32), -}; - -struct Linux_Coroutine { - Coroutine coroutine; - Linux_Coroutine *next; - ucontext_t ctx, yield_ctx; - stack_t stack; - b32 done; -}; - -struct Thread_Context{ - u32 job_id; - b32 running; - b32 cancel; - - Work_Queue *queue; - u32 id; - u32 group_id; - pthread_t handle; -}; - -struct Thread_Group{ - Thread_Context *threads; - i32 count; - - Unbounded_Work_Queue queue; - - i32 cancel_lock0; - i32 cancel_cv0; -}; - -struct Linux_Vars{ - Display *XDisplay; - Window XWindow; - Render_Target target; - - XIM input_method; - XIMStyle input_style; - XIC input_context; - - Application_Step_Input input; - - String clipboard_contents; - String clipboard_outgoing; - b32 new_clipboard; - - Atom atom_TARGETS; - Atom atom_CLIPBOARD; - Atom atom_UTF8_STRING; - Atom atom__NET_WM_STATE; - Atom atom__NET_WM_STATE_MAXIMIZED_HORZ; - Atom atom__NET_WM_STATE_MAXIMIZED_VERT; - Atom atom__NET_WM_STATE_FULLSCREEN; - Atom atom__NET_WM_PING; - Atom atom__NET_WM_WINDOW_TYPE; - Atom atom__NET_WM_WINDOW_TYPE_NORMAL; - Atom atom__NET_WM_PID; - Atom atom_WM_DELETE_WINDOW; - - b32 has_xfixes; - int xfixes_selection_event; - - int epoll; - - int step_timer_fd; - int step_event_fd; - int x11_fd; - int inotify_fd; - - u64 last_step; - - b32 keep_running; - - Application_Mouse_Cursor cursor; - b32 hide_cursor; - Cursor hidden_cursor; - - void *app_code; - void *custom; - - Thread_Memory *thread_memory; - Thread_Group groups[THREAD_GROUP_COUNT]; - Work_Queue queues[THREAD_GROUP_COUNT]; - pthread_mutex_t locks[LOCK_COUNT]; - pthread_cond_t conds[8]; - sem_t thread_semaphore; - - Partition font_part; - -#if SUPPORT_DPI - i32 dpi_x, dpi_y; -#endif - - Plat_Settings settings; - System_Functions system; - App_Functions app; - Custom_API custom_api; - b32 vsync; - -#if FRED_INTERNAL - Sys_Bubble internal_bubble; - pthread_mutex_t DEBUG_sysmem_lock; -#endif - - Linux_Coroutine coroutine_data[18]; - Linux_Coroutine *coroutine_free; -}; - -// -// Linux globals -// - -globalvar Linux_Vars linuxvars; -globalvar Application_Memory memory_vars; - -// -// Linux forward declarations -// - -internal void LinuxScheduleStep(void); - -internal Plat_Handle LinuxSemToHandle(sem_t*); -internal sem_t* LinuxHandleToSem(Plat_Handle); - -internal Plat_Handle LinuxFDToHandle(int); -internal int LinuxHandleToFD(Plat_Handle); - -internal void LinuxStringDup(String*, void*, size_t); -internal void LinuxToggleFullscreen(Display*, Window); - -internal Sys_Acquire_Lock_Sig(system_acquire_lock); -internal Sys_Release_Lock_Sig(system_release_lock); - -internal void system_wait_cv(i32, i32); -internal void system_signal_cv(i32, i32); - -// -// Linux static assertions -// - -static_assert(sizeof(Plat_Handle) >= sizeof(ucontext_t*), "Plat_Handle not big enough"); -static_assert(sizeof(Plat_Handle) >= sizeof(sem_t*), "Plat_Handle not big enough"); -static_assert(sizeof(Plat_Handle) >= sizeof(int), "Plat_Handle not big enough"); - -// -// Shared system functions (system_shared.h) -// - -internal void* -LinuxGetMemory_(i32 size, i32 line_number, char *file_name){ - void *result = 0; - - Assert(size != 0); - -#if FRED_INTERNAL - result = mmap(0, size + sizeof(Sys_Bubble), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - - Sys_Bubble* bubble = (Sys_Bubble*)result; - bubble->flags = 0; - bubble->line_number = line_number; - bubble->file_name = file_name; - bubble->size = size; - - pthread_mutex_lock(&linuxvars.DEBUG_sysmem_lock); - insert_bubble(&linuxvars.internal_bubble, bubble); - pthread_mutex_unlock(&linuxvars.DEBUG_sysmem_lock); - - result = bubble + 1; -#else - size_t real_size = size + sizeof(size_t); - result = mmap(0, real_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if(result == MAP_FAILED){ - perror("mmap"); - result = NULL; - } else { - memcpy(result, &real_size, sizeof(size_t)); - result = (char*)result + sizeof(size_t); - } -#endif - - return(result); -} - -internal void -LinuxFreeMemory(void *block){ - if (block){ -#if FRED_INTERNAL - Sys_Bubble *bubble = ((Sys_Bubble*)block) - 1; - - size_t size = bubble->size + sizeof(Sys_Bubble); - - pthread_mutex_lock(&linuxvars.DEBUG_sysmem_lock); - remove_bubble(bubble); - pthread_mutex_unlock(&linuxvars.DEBUG_sysmem_lock); - - munmap(bubble, size); -#else - block = (char*)block - sizeof(size_t); - size_t size = *(size_t*)block; - munmap(block, size); -#endif - } -} - -internal -Sys_Get_Memory_Sig(system_get_memory_){ - return(LinuxGetMemory_(size, line_number, file_name)); -} - -internal -Sys_Free_Memory_Sig(system_free_memory){ - LinuxFreeMemory(block); -} - - -internal -Sys_File_Can_Be_Made_Sig(system_file_can_be_made){ - b32 result = access(filename, W_OK) == 0; - LINUX_FN_DEBUG("%s = %d", filename, result); - return(result); -} - -internal -Sys_Get_Binary_Path_Sig(system_get_binary_path){ - ssize_t size = readlink("/proc/self/exe", out->str, out->memory_size - 1); - if(size != -1 && size < out->memory_size - 1){ - out->size = size; - remove_last_folder(out); - terminate_with_null(out); - size = out->size; - } else { - size = 0; - } - - return size; -} - -// -// System Functions (4ed_system.h) -// - -// -// Files -// - -internal -Sys_Set_File_List_Sig(system_set_file_list){ - DIR *d; - struct dirent *entry; - char *fname, *cursor, *cursor_start; - File_Info *info_ptr; - i32 count, file_count, size, required_size; - - if(directory.size <= 0){ - if(!directory.str){ - system_free_memory(file_list->block); - file_list->block = 0; - file_list->block_size = 0; - } - file_list->infos = 0; - file_list->count = 0; - return; - } - - char* dir = (char*) alloca(directory.size + 1); - memcpy(dir, directory.str, directory.size); - dir[directory.size] = 0; - - LINUX_FN_DEBUG("%s", dir); - - d = opendir(dir); - if (d){ - count = 0; - file_count = 0; - for (entry = readdir(d); - entry != 0; - entry = readdir(d)){ - fname = entry->d_name; - if(fname[0] == '.' && (fname[1] == 0 || (fname[1] == '.' && fname[2] == 0))){ - continue; - } - ++file_count; - for (size = 0; fname[size]; ++size); - count += size + 1; - } - - required_size = count + file_count * sizeof(File_Info); - if (file_list->block_size < required_size){ - system_free_memory(file_list->block); - file_list->block = system_get_memory(required_size); - } - - file_list->infos = (File_Info*)file_list->block; - cursor = (char*)(file_list->infos + file_count); - - rewinddir(d); - info_ptr = file_list->infos; - for (entry = readdir(d); - entry != 0; - entry = readdir(d)){ - fname = entry->d_name; - if(fname[0] == '.' && (fname[1] == 0 || (fname[1] == '.' && fname[2] == 0))){ - continue; - } - cursor_start = cursor; - for (; *fname; ) *cursor++ = *fname++; - - if(entry->d_type == DT_LNK){ - struct stat st; - if(stat(entry->d_name, &st) != -1){ - info_ptr->folder = S_ISDIR(st.st_mode); - } else { - info_ptr->folder = 0; - } - } else { - info_ptr->folder = entry->d_type == DT_DIR; - } - - info_ptr->filename = cursor_start; - info_ptr->filename_len = (int)(cursor - cursor_start); - *cursor++ = 0; - ++info_ptr; - } - - file_list->count = file_count; - - closedir(d); - } else { - system_free_memory(file_list->block); - file_list->block = 0; - file_list->block_size = 0; - file_list->infos = 0; - file_list->count = 0; - } -} - -internal -Sys_Get_Canonical_Sig(system_get_canonical){ - char* path = (char*) alloca(len + 1); - char* write_p = path; - const char* read_p = filename; - - while(read_p < filename + len){ - if(read_p == filename || read_p[0] == '/'){ - if(read_p[1] == '/'){ - ++read_p; - } else if(read_p[1] == '.'){ - if(read_p[2] == '/' || !read_p[2]){ - read_p += 2; - } else if(read_p[2] == '.' && (read_p[3] == '/' || !read_p[3])){ - while(write_p > path && *--write_p != '/'); - read_p += 3; - } else { - *write_p++ = *read_p++; - } - } else { - *write_p++ = *read_p++; - } - } else { - *write_p++ = *read_p++; - } - } - if(write_p == path) *write_p++ = '/'; - - if(max >= (write_p - path)){ - memcpy(buffer, path, write_p - path); - } else { - write_p = path; - } - -#if FRED_INTERNAL - if(len != (write_p - path) || memcmp(filename, path, len) != 0){ - LINUX_FN_DEBUG("[%.*s] -> [%.*s]", len, filename, (int)(write_p - path), path); - } -#endif - - return write_p - path; -} - -internal -Sys_Load_Handle_Sig(system_load_handle){ - b32 result = 0; - - int fd = open(filename, O_RDONLY); - if(fd == -1){ - perror("open"); - } else { - *(int*)handle_out = fd; - result = 1; - } - - return result; -} - -internal -Sys_Load_Size_Sig(system_load_size){ - u32 result = 0; - - int fd = *(int*)&handle; - struct stat st; - - if(fstat(fd, &st) == -1){ - perror("fstat"); - } else { - result = st.st_size; - } - - return result; -} - -internal -Sys_Load_File_Sig(system_load_file){ - - int fd = *(int*)&handle; - do { - ssize_t n = read(fd, buffer, size); - if(n == -1 && errno != EAGAIN){ - perror("read"); - break; - } else { - size -= n; - buffer += n; - } - } while(size); - - return size == 0; -} - -internal -Sys_Load_Close_Sig(system_load_close){ - b32 result = 1; - - int fd = *(int*)&handle; - if(close(fd) == -1){ - perror("close"); - result = 0; - } - - return result; -} - -internal -Sys_Save_File_Sig(system_save_file){ - b32 result = 0; - int fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 00640); - - LINUX_FN_DEBUG("%s %d", filename, size); - - if(fd < 0){ - fprintf(stderr, "system_save_file: open '%s': %s\n", filename, strerror(errno)); - } else { - do { - ssize_t written = write(fd, buffer, size); - if(written == -1){ - if(errno != EINTR){ - perror("system_save_file: write"); - break; - } - } else { - size -= written; - buffer += written; - } - } while(size); - - close(fd); - } - - return (size == 0); -} - -// -// Time -// - -internal -Sys_Now_Time_Sig(system_now_time){ - struct timespec spec; - u64 result; - - clock_gettime(CLOCK_REALTIME, &spec); - result = (spec.tv_sec * UINT64_C(1000000)) + (spec.tv_nsec / UINT64_C(1000)); - - //LINUX_FN_DEBUG("ts: %" PRIu64, result); - - return(result); -} - -// -// 4coder_custom.h -// - -internal -MEMORY_ALLOCATE_SIG(system_memory_allocate){ - // NOTE(allen): This must return the exact base of the vpage. - // We will count on the user to keep track of size themselves. - void *result = mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if(result == MAP_FAILED){ - perror("mmap"); - result = NULL; - } - return(result); -} - -internal -MEMORY_SET_PROTECTION_SIG(system_memory_set_protection){ - // NOTE(allen): - // There is no such thing as "write only" in windows - // so I just made write = write + read in all cases. - bool32 result = 1; - int protect = 0; - - flags = flags & 0x7; - - switch (flags){ - case 0: - protect = PROT_NONE; break; - - case MemProtect_Read: - protect = PROT_READ; break; - - case MemProtect_Write: - case MemProtect_Read|MemProtect_Write: - protect = PROT_READ | PROT_WRITE; break; - - case MemProtect_Execute: - protect = PROT_EXEC; break; - - case MemProtect_Execute|MemProtect_Read: - protect = PROT_READ | PROT_EXEC; break; - - // NOTE(inso): some W^X protection things might be unhappy about this one - case MemProtect_Execute|MemProtect_Write: - case MemProtect_Execute|MemProtect_Write|MemProtect_Read: - protect = PROT_READ | PROT_WRITE | PROT_EXEC; break; - } - - if(mprotect(ptr, size, protect) == -1){ - result = 0; - perror("mprotect"); - } - - return(result); -} - -internal -MEMORY_FREE_SIG(system_memory_free){ - // NOTE(allen): This must take the exact base of the vpage. - munmap(ptr, size); -} - -internal -FILE_EXISTS_SIG(system_file_exists){ - int result = 0; - char buff[PATH_MAX] = {}; - - if(len + 1 > PATH_MAX){ - fputs("system_directory_has_file: path too long\n", stderr); - } else { - memcpy(buff, filename, len); - buff[len] = 0; - struct stat st; - result = stat(buff, &st) == 0 && S_ISREG(st.st_mode); - } - - LINUX_FN_DEBUG("%s: %d", buff, result); - - return(result); -} - -internal -DIRECTORY_CD_SIG(system_directory_cd){ - String directory = make_string_cap(dir, *len, capacity); - b32 result = 0; - i32 old_size; - - if (rel_path[0] != 0){ - if (rel_path[0] == '.' && rel_path[1] == 0){ - result = 1; - } - else if (rel_path[0] == '.' && rel_path[1] == '.' && rel_path[2] == 0){ - result = remove_last_folder(&directory); - terminate_with_null(&directory); - } - else{ - if (directory.size + rel_len + 1 > directory.memory_size){ - old_size = directory.size; - append_partial_sc(&directory, rel_path); - append_s_char(&directory, '/'); - terminate_with_null(&directory); - - struct stat st; - if (stat(directory.str, &st) == 0 && S_ISDIR(st.st_mode)){ - result = 1; - } - else{ - directory.size = old_size; - } - } - } - } - - *len = directory.size; - - LINUX_FN_DEBUG("%.*s: %d", directory.size, directory.str, result); - - return(result); -} - -internal -GET_4ED_PATH_SIG(system_get_4ed_path){ - String str = make_string_cap(out, 0, capacity); - return(system_get_binary_path(&str)); -} - -internal -SHOW_MOUSE_CURSOR_SIG(system_show_mouse_cursor){ - linuxvars.hide_cursor = !show; - XDefineCursor(linuxvars.XDisplay, linuxvars.XWindow, show ? None : linuxvars.hidden_cursor); -} - -internal -TOGGLE_FULLSCREEN_SIG(system_toggle_fullscreen){ - LinuxToggleFullscreen(linuxvars.XDisplay, linuxvars.XWindow); -} - -internal -IS_FULLSCREEN_SIG(system_is_fullscreen){ - b32 result = 0; - - Atom type, *prop; - unsigned long nitems, pad; - int fmt; - - int ret = XGetWindowProperty(linuxvars.XDisplay, - linuxvars.XWindow, - linuxvars.atom__NET_WM_STATE, - 0, 32, False, XA_ATOM, - &type, - &fmt, - &nitems, - &pad, - (unsigned char**)&prop); - - if(ret == Success && prop){ - result = *prop == linuxvars.atom__NET_WM_STATE_FULLSCREEN; - XFree((unsigned char*)prop); - } - - return result; -} - -// -// Clipboard -// - -internal -Sys_Post_Clipboard_Sig(system_post_clipboard){ - LinuxStringDup(&linuxvars.clipboard_outgoing, str.str, str.size); - XSetSelectionOwner(linuxvars.XDisplay, linuxvars.atom_CLIPBOARD, linuxvars.XWindow, CurrentTime); -} - -// -// Coroutine -// - -internal Linux_Coroutine* -LinuxAllocCoroutine(){ - Linux_Coroutine *result = linuxvars.coroutine_free; - Assert(result != 0); - if(getcontext(&result->ctx) == -1){ - perror("getcontext"); - } - result->ctx.uc_stack = result->stack; - linuxvars.coroutine_free = result->next; - return(result); -} - -internal void -LinuxFreeCoroutine(Linux_Coroutine *data){ - data->next = linuxvars.coroutine_free; - linuxvars.coroutine_free = data; -} - -internal void -LinuxCoroutineMain(void *arg_){ - Linux_Coroutine *c = (Linux_Coroutine*)arg_; - c->coroutine.func(&c->coroutine); - c->done = 1; - LinuxFreeCoroutine(c); - setcontext((ucontext_t*)c->coroutine.yield_handle); -} - -internal -Sys_Create_Coroutine_Sig(system_create_coroutine){ - Linux_Coroutine *c = LinuxAllocCoroutine(); - c->done = 0; - - makecontext(&c->ctx, (void (*)())LinuxCoroutineMain, 1, &c->coroutine); - - *(ucontext_t**)&c->coroutine.plat_handle = &c->ctx; - c->coroutine.func = func; - - return(&c->coroutine); -} - -internal -Sys_Launch_Coroutine_Sig(system_launch_coroutine){ - Linux_Coroutine *c = (Linux_Coroutine*)coroutine; - ucontext_t* ctx = *(ucontext**)&coroutine->plat_handle; - - coroutine->yield_handle = &c->yield_ctx; - coroutine->in = in; - coroutine->out = out; - - swapcontext(&c->yield_ctx, ctx); - - if (c->done){ - LinuxFreeCoroutine(c); - coroutine = 0; - } - - return(coroutine); -} - -internal -Sys_Resume_Coroutine_Sig(system_resume_coroutine){ - Linux_Coroutine *c = (Linux_Coroutine*)coroutine; - void *fiber; - - Assert(!c->done); - - coroutine->yield_handle = &c->yield_ctx; - coroutine->in = in; - coroutine->out = out; - - ucontext *ctx = *(ucontext**)&coroutine->plat_handle; - - swapcontext(&c->yield_ctx, ctx); - - if (c->done){ - LinuxFreeCoroutine(c); - coroutine = 0; - } - - return(coroutine); -} - -internal -Sys_Yield_Coroutine_Sig(system_yield_coroutine){ - swapcontext(*(ucontext_t**)&coroutine->plat_handle, (ucontext*)coroutine->yield_handle); -} - -// -// CLI -// - -internal -Sys_CLI_Call_Sig(system_cli_call){ - LINUX_FN_DEBUG("%s %s", path, script_name); - - int pipe_fds[2]; - if(pipe(pipe_fds) == -1){ - perror("system_cli_call: pipe"); - return 0; - } - - pid_t child_pid = fork(); - if(child_pid == -1){ - perror("system_cli_call: fork"); - return 0; - } - - enum { PIPE_FD_READ, PIPE_FD_WRITE }; - - // child - if(child_pid == 0){ - close(pipe_fds[PIPE_FD_READ]); - dup2(pipe_fds[PIPE_FD_WRITE], STDOUT_FILENO); - dup2(pipe_fds[PIPE_FD_WRITE], STDERR_FILENO); - - if(chdir(path) == -1){ - perror("system_cli_call: chdir"); - exit(1); - }; - - char* argv[] = { "sh", "-c", script_name, NULL }; - - if(execv("/bin/sh", argv) == -1){ - perror("system_cli_call: execv"); - } - exit(1); - } else { - close(pipe_fds[PIPE_FD_WRITE]); - - *(pid_t*)&cli_out->proc = child_pid; - *(int*)&cli_out->out_read = pipe_fds[PIPE_FD_READ]; - *(int*)&cli_out->out_write = pipe_fds[PIPE_FD_WRITE]; - - struct epoll_event e = {}; - e.events = EPOLLIN | EPOLLET; - e.data.u64 = LINUX_4ED_EVENT_CLI; - epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, pipe_fds[PIPE_FD_READ], &e); - } - - return 1; -} - -internal -Sys_CLI_Begin_Update_Sig(system_cli_begin_update){ - // NOTE(inso): I don't think anything needs to be done here. -} - -internal -Sys_CLI_Update_Step_Sig(system_cli_update_step){ - - int pipe_read_fd = *(int*)&cli->out_read; - - fd_set fds; - FD_ZERO(&fds); - FD_SET(pipe_read_fd, &fds); - - struct timeval tv = {}; - - size_t space_left = max; - char* ptr = dest; - - while(space_left > 0 && select(pipe_read_fd + 1, &fds, NULL, NULL, &tv) == 1){ - ssize_t num = read(pipe_read_fd, ptr, space_left); - if(num == -1){ - perror("system_cli_update_step: read"); - } else if(num == 0){ - // NOTE(inso): EOF - break; - } else { - ptr += num; - space_left -= num; - } - } - - *amount = (ptr - dest); - return (ptr - dest) > 0; -} - -internal -Sys_CLI_End_Update_Sig(system_cli_end_update){ - pid_t pid = *(pid_t*)&cli->proc; - b32 close_me = 0; - - int status; - if(pid && waitpid(pid, &status, WNOHANG) > 0){ - close_me = 1; - - cli->exit = WEXITSTATUS(status); - - struct epoll_event e = {}; - epoll_ctl(linuxvars.epoll, EPOLL_CTL_DEL, *(int*)&cli->out_read, &e); - - close(*(int*)&cli->out_read); - close(*(int*)&cli->out_write); - } - - return close_me; -} - -// -// Threads -// - -internal -Sys_Acquire_Lock_Sig(system_acquire_lock){ - pthread_mutex_lock(linuxvars.locks + id); -} - -internal -Sys_Release_Lock_Sig(system_release_lock){ - pthread_mutex_unlock(linuxvars.locks + id); -} - -internal void -system_wait_cv(i32 lock_id, i32 cv_id){ - pthread_cond_wait(linuxvars.conds + cv_id, linuxvars.locks + lock_id); -} - -internal void -system_signal_cv(i32 lock_id, i32 cv_id){ - pthread_cond_signal(linuxvars.conds + cv_id); -} - -internal void* -JobThreadProc(void* lpParameter){ - Thread_Context *thread = (Thread_Context*)lpParameter; - Work_Queue *queue = linuxvars.queues + thread->group_id; - Thread_Group *group = linuxvars.groups + thread->group_id; - - i32 thread_index = thread->id - 1; - - i32 cancel_lock = group->cancel_lock0 + thread_index; - i32 cancel_cv = group->cancel_cv0 + thread_index; - - Thread_Memory *thread_memory = linuxvars.thread_memory + thread_index; - - if (thread_memory->size == 0){ - i32 new_size = Kbytes(64); - thread_memory->data = LinuxGetMemory(new_size); - thread_memory->size = new_size; - } - - for (;;){ - u32 read_index = queue->read_position; - u32 write_index = queue->write_position; - - if (read_index != write_index){ - // NOTE(allen): Previously I was wrapping by the job wrap then - // wrapping by the queue wrap. That was super stupid what was that? - // Now it just wraps by the queue wrap. - u32 next_read_index = (read_index + 1) % QUEUE_WRAP; - u32 safe_read_index = - InterlockedCompareExchange(&queue->read_position, - next_read_index, read_index); - - if (safe_read_index == read_index){ - Full_Job_Data *full_job = queue->jobs + safe_read_index; - // NOTE(allen): This is interlocked so that it plays nice - // with the cancel job routine, which may try to cancel this job - // at the same time that we try to run it - - i32 safe_running_thread = - InterlockedCompareExchange(&full_job->running_thread, - thread->id, THREAD_NOT_ASSIGNED); - - if (safe_running_thread == THREAD_NOT_ASSIGNED){ - thread->job_id = full_job->id; - thread->running = 1; - - full_job->job.callback(&linuxvars.system, - thread, thread_memory, full_job->job.data); - LinuxScheduleStep(); - //full_job->running_thread = 0; - thread->running = 0; - - system_acquire_lock(cancel_lock); - if (thread->cancel){ - thread->cancel = 0; - system_signal_cv(cancel_lock, cancel_cv); - } - system_release_lock(cancel_lock); - } - } - } - else{ - sem_wait(LinuxHandleToSem(queue->semaphore)); - } - } -} - -internal void -initialize_unbounded_queue(Unbounded_Work_Queue *source_queue){ - i32 max = 512; - source_queue->jobs = (Full_Job_Data*)system_get_memory(max*sizeof(Full_Job_Data)); - source_queue->count = 0; - source_queue->max = max; - source_queue->skip = 0; -} - -inline i32 -get_work_queue_available_space(i32 write, i32 read){ - // NOTE(allen): The only time that queue->write_position == queue->read_position - // is allowed is when the queue is empty. Thus if - // queue->write_position+1 == queue->read_position the available space is zero. - // So these computations both end up leaving one slot unused. The only way I can - // think to easily eliminate this is to have read and write wrap at twice the size - // of the underlying array but modulo their values into the array then if write - // has caught up with read it still will not be equal... but lots of modulos... ehh. - - i32 available_space = 0; - if (write >= read){ - available_space = QUEUE_WRAP - (write - read) - 1; - } - else{ - available_space = (read - write) - 1; - } - - return(available_space); -} - -#define UNBOUNDED_SKIP_MAX 128 - -internal void -flush_to_direct_queue(Unbounded_Work_Queue *source_queue, Work_Queue *queue, i32 thread_count){ - // NOTE(allen): It is understood that read_position may be changed by other - // threads but it will only make more space in the queue if it is changed. - // Meanwhile write_position should not ever be changed by anything but the - // main thread in this system, so it will not be interlocked. - u32 read_position = queue->read_position; - u32 write_position = queue->write_position; - u32 available_space = get_work_queue_available_space(write_position, read_position); - u32 available_jobs = source_queue->count - source_queue->skip; - - u32 writable_count = Min(available_space, available_jobs); - - if (writable_count > 0){ - u32 count1 = writable_count; - - if (count1+write_position > QUEUE_WRAP){ - count1 = QUEUE_WRAP - write_position; - } - - u32 count2 = writable_count - count1; - - Full_Job_Data *job_src1 = source_queue->jobs + source_queue->skip; - Full_Job_Data *job_src2 = job_src1 + count1; - - Full_Job_Data *job_dst1 = queue->jobs + write_position; - Full_Job_Data *job_dst2 = queue->jobs; - - Assert((job_src1->id % QUEUE_WRAP) == write_position); - - memcpy(job_dst1, job_src1, sizeof(Full_Job_Data)*count1); - memcpy(job_dst2, job_src2, sizeof(Full_Job_Data)*count2); - queue->write_position = (write_position + writable_count) % QUEUE_WRAP; - - source_queue->skip += writable_count; - - if (source_queue->skip == source_queue->count){ - source_queue->skip = source_queue->count = 0; - } - else if (source_queue->skip > UNBOUNDED_SKIP_MAX){ - u32 left_over = source_queue->count - source_queue->skip; - memmove(source_queue->jobs, source_queue->jobs + source_queue->skip, - sizeof(Full_Job_Data)*left_over); - source_queue->count = left_over; - source_queue->skip = 0; - } - } - - i32 semaphore_release_count = writable_count; - if (semaphore_release_count > thread_count){ - semaphore_release_count = thread_count; - } - - // NOTE(allen): platform dependent portion... - // TODO(allen): pull out the duplicated part once I see - // that this is pretty much the same on linux. - for (i32 i = 0; i < semaphore_release_count; ++i){ - sem_post(LinuxHandleToSem(queue->semaphore)); - } -} - -internal void -flush_thread_group(i32 group_id){ - Thread_Group *group = linuxvars.groups + group_id; - Work_Queue *queue = linuxvars.queues + group_id; - Unbounded_Work_Queue *source_queue = &group->queue; - flush_to_direct_queue(source_queue, queue, group->count); -} - -// Note(allen): post_job puts the job on the unbounded queue. -// The unbounded queue is entirely managed by the main thread. -// The thread safe queue is bounded in size so the unbounded -// queue is periodically flushed into the direct work queue. -internal -Sys_Post_Job_Sig(system_post_job){ - Thread_Group *group = linuxvars.groups + group_id; - Unbounded_Work_Queue *queue = &group->queue; - - u32 result = queue->next_job_id++; - - while (queue->count >= queue->max){ - i32 new_max = queue->max*2; - Full_Job_Data *new_jobs = (Full_Job_Data*) - system_get_memory(new_max*sizeof(Full_Job_Data)); - - memcpy(new_jobs, queue->jobs, queue->count); - - system_free_memory(queue->jobs); - - queue->jobs = new_jobs; - queue->max = new_max; - } - - Full_Job_Data full_job; - - full_job.job = job; - full_job.running_thread = THREAD_NOT_ASSIGNED; - full_job.id = result; - - queue->jobs[queue->count++] = full_job; - - Work_Queue *direct_queue = linuxvars.queues + group_id; - flush_to_direct_queue(queue, direct_queue, group->count); - - return(result); -} - -internal -Sys_Cancel_Job_Sig(system_cancel_job){ - Thread_Group *group = linuxvars.groups + group_id; - Unbounded_Work_Queue *source_queue = &group->queue; - - b32 handled_in_unbounded = false; - if (source_queue->skip < source_queue->count){ - Full_Job_Data *first_job = source_queue->jobs + source_queue->skip; - if (first_job->id <= job_id){ - u32 index = source_queue->skip + (job_id - first_job->id); - Full_Job_Data *job = source_queue->jobs + index; - job->running_thread = 0; - handled_in_unbounded = true; - } - } - - if (!handled_in_unbounded){ - Work_Queue *queue = linuxvars.queues + group_id; - Full_Job_Data *job = queue->jobs + (job_id % QUEUE_WRAP); - Assert(job->id == job_id); - - u32 thread_id = - InterlockedCompareExchange(&job->running_thread, - 0, THREAD_NOT_ASSIGNED); - - if (thread_id != THREAD_NOT_ASSIGNED && thread_id != 0){ - i32 thread_index = thread_id - 1; - - i32 cancel_lock = group->cancel_lock0 + thread_index; - i32 cancel_cv = group->cancel_cv0 + thread_index; - Thread_Context *thread = group->threads + thread_index; - - - system_acquire_lock(cancel_lock); - - thread->cancel = 1; - - system_release_lock(FRAME_LOCK); - do{ - system_wait_cv(cancel_lock, cancel_cv); - }while (thread->cancel == 1); - system_acquire_lock(FRAME_LOCK); - - system_release_lock(cancel_lock); - } - } -} - -internal -Sys_Check_Cancel_Sig(system_check_cancel){ - b32 result = 0; - - Thread_Group *group = linuxvars.groups + thread->group_id; - i32 thread_index = thread->id - 1; - i32 cancel_lock = group->cancel_lock0 + thread_index; - - system_acquire_lock(cancel_lock); - if (thread->cancel){ - result = 1; - } - system_release_lock(cancel_lock); - - return(result); -} - -internal -Sys_Grow_Thread_Memory_Sig(system_grow_thread_memory){ - void *old_data; - i32 old_size, new_size; - - system_acquire_lock(CANCEL_LOCK0 + memory->id - 1); - old_data = memory->data; - old_size = memory->size; - new_size = LargeRoundUp(memory->size*2, Kbytes(4)); - memory->data = system_get_memory(new_size); - memory->size = new_size; - if (old_data){ - memcpy(memory->data, old_data, old_size); - system_free_memory(old_data); - } - system_release_lock(CANCEL_LOCK0 + memory->id - 1); -} - -// -// Debug -// - -#if FRED_INTERNAL - -internal -INTERNAL_Sys_Sentinel_Sig(internal_sentinel){ - return (&linuxvars.internal_bubble); -} - -#ifdef OLD_JOB_QUEUE -internal -INTERNAL_Sys_Get_Thread_States_Sig(internal_get_thread_states){ - Work_Queue *queue = linuxvars.queues + id; - u32 write = queue->write_position; - u32 read = queue->read_position; - if (write < read) write += QUEUE_WRAP; - *pending = (i32)(write - read); - - Thread_Group *group = linuxvars.groups + id; - for (i32 i = 0; i < group->count; ++i){ - running[i] = (group->threads[i].running != 0); - } -} -#else -internal -INTERNAL_Sys_Get_Thread_States_Sig(internal_get_thread_states){ - Thread_Group *group = linuxvars.groups + id; - Unbounded_Work_Queue *source_queue = &group->queue; - Work_Queue *queue = linuxvars.queues + id; - u32 write = queue->write_position; - u32 read = queue->read_position; - if (write < read) write += QUEUE_WRAP; - *pending = (i32)(write - read) + source_queue->count - source_queue->skip; - - for (i32 i = 0; i < group->count; ++i){ - running[i] = (group->threads[i].running != 0); - } -} -#endif - -internal -INTERNAL_Sys_Debug_Message_Sig(internal_debug_message){ - fprintf(stderr, "%s", message); -} - -#endif - -// -// Linux rendering/font system functions -// - -#include "system_shared.cpp" -#include "linux_font.cpp" - -internal f32 -size_change(i32 dpi_x, i32 dpi_y){ - // TODO(allen): We're just hoping dpi_x == dpi_y for now I guess. - f32 size_x = dpi_x / 96.f; - f32 size_y = dpi_y / 96.f; - f32 size_max = Max(size_x, size_y); - return(size_max); -} - -internal -Font_Load_Sig(system_draw_font_load){ - b32 success = 0; - i32 attempts = 0; - - LINUX_FN_DEBUG("%s, %dpt, tab_width: %d", filename, pt_size, tab_width); - - if (linuxvars.font_part.base == 0){ - linuxvars.font_part = sysshared_scratch_partition(Mbytes(8)); - } - - i32 oversample = 2; - -#if SUPPORT_DPI - pt_size = ROUND32(pt_size * size_change(linuxvars.dpi_x, linuxvars.dpi_y)); -#endif - - for(; attempts < 3; ++attempts){ -#if LINUX_FONTS - success = linux_font_load(&linuxvars.font_part, font_out, filename, pt_size, tab_width, - linuxvars.settings.use_hinting); -#else - success = font_load( - &linuxvars.font_part, - font_out, - filename, - pt_size, - tab_width, - oversample, - store_texture - ); -#endif - - if(success){ - break; - } else { - fprintf(stderr, "draw_font_load failed, %p %d\n", linuxvars.font_part.base, linuxvars.font_part.max); - sysshared_partition_double(&linuxvars.font_part); - } - } - - return success; -} - -// -// End of system funcs -// - -// -// Linux init functions -// - -internal b32 -LinuxLoadAppCode(String* base_dir){ - b32 result = 0; - App_Get_Functions *get_funcs = 0; - - if(!sysshared_to_binary_path(base_dir, "4ed_app.so")){ - return 0; - } - - linuxvars.app_code = dlopen(base_dir->str, RTLD_LAZY); - if (linuxvars.app_code){ - get_funcs = (App_Get_Functions*) - dlsym(linuxvars.app_code, "app_get_functions"); - } else { - fprintf(stderr, "dlopen failed: %s\n", dlerror()); - } - - if (get_funcs){ - result = 1; - linuxvars.app = get_funcs(); - } - - return(result); -} - -internal void -LinuxLoadSystemCode(){ - - // files - linuxvars.system.set_file_list = system_set_file_list; - linuxvars.system.get_canonical = system_get_canonical; - linuxvars.system.add_listener = system_add_listener; - linuxvars.system.remove_listener = system_remove_listener; - linuxvars.system.get_file_change = system_get_file_change; - linuxvars.system.load_handle = system_load_handle; - linuxvars.system.load_size = system_load_size; - linuxvars.system.load_file = system_load_file; - linuxvars.system.load_close = system_load_close; - linuxvars.system.save_file = system_save_file; - - // time - linuxvars.system.now_time = system_now_time; - - // 4coder_custom.h - linuxvars.system.memory_allocate = system_memory_allocate; - linuxvars.system.memory_set_protection = system_memory_set_protection; - linuxvars.system.memory_free = system_memory_free; - linuxvars.system.file_exists = system_file_exists; - linuxvars.system.directory_cd = system_directory_cd; - linuxvars.system.get_4ed_path = system_get_4ed_path; - linuxvars.system.show_mouse_cursor = system_show_mouse_cursor; - linuxvars.system.toggle_fullscreen = system_toggle_fullscreen; - linuxvars.system.is_fullscreen = system_is_fullscreen; - - // clipboard - linuxvars.system.post_clipboard = system_post_clipboard; - - // coroutine - linuxvars.system.create_coroutine = system_create_coroutine; - linuxvars.system.launch_coroutine = system_launch_coroutine; - linuxvars.system.resume_coroutine = system_resume_coroutine; - linuxvars.system.yield_coroutine = system_yield_coroutine; - - // cli - 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; - - // threads - linuxvars.system.post_job = system_post_job; - linuxvars.system.cancel_job = system_cancel_job; - linuxvars.system.check_cancel = system_check_cancel; - linuxvars.system.grow_thread_memory = system_grow_thread_memory; - linuxvars.system.acquire_lock = system_acquire_lock; - linuxvars.system.release_lock = system_release_lock; - - // debug -#if FRED_INTERNAL - linuxvars.system.internal_sentinel = internal_sentinel; - linuxvars.system.internal_get_thread_states = internal_get_thread_states; - linuxvars.system.internal_debug_message = internal_debug_message; -#endif - - // non-function details - linuxvars.system.slash = '/'; -} - -internal void -LinuxLoadRenderCode(){ - linuxvars.target.push_clip = draw_push_clip; - linuxvars.target.pop_clip = draw_pop_clip; - linuxvars.target.push_piece = draw_push_piece; - - linuxvars.target.font_set.font_load = system_draw_font_load; - linuxvars.target.font_set.release_font = draw_release_font; -} - -// -// Renderer -// - -internal void -LinuxRedrawTarget(){ - launch_rendering(&linuxvars.target); - //glFlush(); - glXSwapBuffers(linuxvars.XDisplay, linuxvars.XWindow); -} - -internal void -LinuxResizeTarget(i32 width, i32 height){ - if (width > 0 && height > 0){ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, width, height, 0, -1, 1); - glScissor(0, 0, width, height); - - linuxvars.target.width = width; - linuxvars.target.height = height; - } -} - -// -// OpenGL init -// - -// NOTE(allen): Thanks to Casey for providing the linux OpenGL launcher. -static bool ctxErrorOccurred = false; - -internal int -ctxErrorHandler( Display *dpy, XErrorEvent *ev ) -{ - ctxErrorOccurred = true; - return 0; -} - -#if FRED_INTERNAL - -static void LinuxGLDebugCallback( - GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam -){ - fprintf(stderr, "GL DEBUG: %s\n", message); -} - -#endif - -internal GLXContext -InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc, b32 &IsLegacy) -{ - IsLegacy = false; - - typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*); - - typedef PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXTProc; - typedef PFNGLXSWAPINTERVALMESAPROC glXSwapIntervalMESAProc; - typedef PFNGLXGETSWAPINTERVALMESAPROC glXGetSwapIntervalMESAProc; - typedef PFNGLXSWAPINTERVALSGIPROC glXSwapIntervalSGIProc; - - const char *glxExts = glXQueryExtensionsString(XDisplay, DefaultScreen(XDisplay)); - - #define GLXLOAD(x) x ## Proc x = (x ## Proc) glXGetProcAddressARB( (const GLubyte*) #x); - - GLXLOAD(glXCreateContextAttribsARB); - - GLXContext ctx = 0; - ctxErrorOccurred = false; - int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&ctxErrorHandler); - - if (!glXCreateContextAttribsARB) - { - fprintf(stderr, "glXCreateContextAttribsARB() not found, using old-style GLX context\n" ); - ctx = glXCreateNewContext( XDisplay, bestFbc, GLX_RGBA_TYPE, 0, True ); - } - else - { - int context_attribs[] = - { - GLX_CONTEXT_MAJOR_VERSION_ARB, 4, - GLX_CONTEXT_MINOR_VERSION_ARB, 3, - GLX_CONTEXT_PROFILE_MASK_ARB , GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, -#if FRED_INTERNAL - GLX_CONTEXT_FLAGS_ARB , GLX_CONTEXT_DEBUG_BIT_ARB, -#endif - None - }; - - fprintf(stderr, "Creating GL 4.3 context...\n"); - ctx = glXCreateContextAttribsARB(XDisplay, bestFbc, 0, True, context_attribs); - - XSync( XDisplay, False ); - if (!ctxErrorOccurred && ctx) - { - fprintf(stderr, "Created GL 4.3 context.\n" ); - } - else - { - ctxErrorOccurred = false; - - context_attribs[1] = 3; - context_attribs[3] = 2; - - fprintf(stderr, "GL 4.3 unavailable, creating GL 3.2 context...\n" ); - ctx = glXCreateContextAttribsARB( XDisplay, bestFbc, 0, True, context_attribs ); - - XSync(XDisplay, False); - - if (!ctxErrorOccurred && ctx) - { - fprintf(stderr, "Created GL 3.2 context.\n" ); - } - else - { - context_attribs[1] = 1; - context_attribs[3] = 2; - - ctxErrorOccurred = false; - - fprintf(stderr, "Failed to create GL 3.2 context, using old-style GLX context\n"); - ctx = glXCreateContextAttribsARB(XDisplay, bestFbc, 0, True, context_attribs); - - IsLegacy = true; - } - } - } - - XSync(XDisplay, False); - XSetErrorHandler(oldHandler); - - if (ctxErrorOccurred || !ctx) - { - fprintf(stderr, "Failed to create an OpenGL context\n"); - exit(1); - } - - b32 Direct; - if (!glXIsDirect(XDisplay, ctx)) - { - fprintf(stderr, "Indirect GLX rendering context obtained\n"); - Direct = 0; - } - else - { - fprintf(stderr, "Direct GLX rendering context obtained\n"); - Direct = 1; - } - - fprintf(stderr, "Making context current\n"); - glXMakeCurrent( XDisplay, XWindow, ctx ); - - char *Vendor = (char *)glGetString(GL_VENDOR); - char *Renderer = (char *)glGetString(GL_RENDERER); - char *Version = (char *)glGetString(GL_VERSION); - - //TODO(inso): glGetStringi is required in core profile if the GL version is >= 3.0 - char *Extensions = (char *)glGetString(GL_EXTENSIONS); - - fprintf(stderr, "GL_VENDOR: %s\n", Vendor); - fprintf(stderr, "GL_RENDERER: %s\n", Renderer); - fprintf(stderr, "GL_VERSION: %s\n", Version); - // fprintf(stderr, "GL_EXTENSIONS: %s\n", Extensions); - - //NOTE(inso): enable vsync if available. this should probably be optional - if(Direct && strstr(glxExts, "GLX_EXT_swap_control ")){ - - GLXLOAD(glXSwapIntervalEXT); - - if(glXSwapIntervalEXT){ - glXSwapIntervalEXT(XDisplay, XWindow, 1); - - unsigned int swap_val = 0; - glXQueryDrawable(XDisplay, XWindow, GLX_SWAP_INTERVAL_EXT, &swap_val); - - linuxvars.vsync = swap_val == 1; - fprintf(stderr, "VSync enabled? %s.\n", linuxvars.vsync ? "Yes" : "No"); - } - - } else if(Direct && strstr(glxExts, "GLX_MESA_swap_control ")){ - - GLXLOAD(glXSwapIntervalMESA); - GLXLOAD(glXGetSwapIntervalMESA); - - if(glXSwapIntervalMESA){ - glXSwapIntervalMESA(1); - - if(glXGetSwapIntervalMESA){ - linuxvars.vsync = glXGetSwapIntervalMESA(); - fprintf(stderr, "VSync enabled? %s (MESA)\n", linuxvars.vsync ? "Yes" : "No"); - } else { - // NOTE(inso): assume it worked? - linuxvars.vsync = 1; - fputs("VSync enabled? possibly (MESA)\n", stderr); - } - } - - } else if(Direct && strstr(glxExts, "GLX_SGI_swap_control ")){ - - GLXLOAD(glXSwapIntervalSGI); - - if(glXSwapIntervalSGI){ - glXSwapIntervalSGI(1); - - //NOTE(inso): The SGI one doesn't seem to have a way to confirm we got it... - linuxvars.vsync = 1; - fputs("VSync enabled? hopefully (SGI)\n", stderr); - } - - } else { - fputs("VSync enabled? nope, no suitable extension\n", stderr); - } - -#if FRED_INTERNAL - typedef PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackProc; - - GLXLOAD(glDebugMessageCallback); - - if(glDebugMessageCallback){ - fputs("Enabling GL Debug Callback\n", stderr); - glDebugMessageCallback(&LinuxGLDebugCallback, 0); - glEnable(GL_DEBUG_OUTPUT); - } -#endif - - glEnable(GL_TEXTURE_2D); - glEnable(GL_SCISSOR_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - -#undef GLXLOAD - - return(ctx); -} - -internal b32 -GLXCanUseFBConfig(Display *XDisplay) -{ - b32 Result = false; - - int GLXMajor, GLXMinor; - - char *XVendor = ServerVendor(XDisplay); - fprintf(stderr, "XWindows vendor: %s\n", XVendor); - if(glXQueryVersion(XDisplay, &GLXMajor, &GLXMinor)) - { - fprintf(stderr, "GLX version %d.%d\n", GLXMajor, GLXMinor); - if(((GLXMajor == 1 ) && (GLXMinor >= 3)) || (GLXMajor > 1)) - { - Result = true; - } - } - - return(Result); -} - -typedef struct glx_config_result{ - b32 Found; - GLXFBConfig BestConfig; - XVisualInfo BestInfo; -} glx_config_result; - -internal glx_config_result -ChooseGLXConfig(Display *XDisplay, int XScreenIndex) -{ - glx_config_result Result = {0}; - - int DesiredAttributes[] = - { - GLX_X_RENDERABLE , True, - GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT, - GLX_RENDER_TYPE , GLX_RGBA_BIT, - GLX_X_VISUAL_TYPE , GLX_TRUE_COLOR, - GLX_RED_SIZE , 8, - GLX_GREEN_SIZE , 8, - GLX_BLUE_SIZE , 8, - GLX_ALPHA_SIZE , 8, - GLX_DEPTH_SIZE , 24, - GLX_STENCIL_SIZE , 8, - GLX_DOUBLEBUFFER , True, - //GLX_SAMPLE_BUFFERS , 1, - //GLX_SAMPLES , 4, - None - }; - - int ConfigCount = 0; - GLXFBConfig *Configs = glXChooseFBConfig(XDisplay, - XScreenIndex, - DesiredAttributes, - &ConfigCount); - if(Configs && ConfigCount > 0) - { - XVisualInfo* VI = glXGetVisualFromFBConfig(XDisplay, Configs[0]); - if(VI) - { - Result.Found = true; - Result.BestConfig = Configs[0]; - Result.BestInfo = *VI; - - int id = 0; - glXGetFBConfigAttrib(XDisplay, Result.BestConfig, GLX_FBCONFIG_ID, &id); - fprintf(stderr, "Using FBConfig: %d (0x%x)\n", id, id); - - XFree(VI); - } - - XFree(Configs); - } - - return(Result); -} - -// -// X11 input / events init -// - -struct Init_Input_Result{ - XIM input_method; - XIMStyle best_style; - XIC xic; -}; - -inline Init_Input_Result -init_input_result_zero(){ - Init_Input_Result result={0}; - return(result); -} - -internal Init_Input_Result -LinuxInputInit(Display *dpy, Window XWindow) -{ - Init_Input_Result result = {}; - XIMStyles *styles = 0; - XIMStyle style; - unsigned long xim_event_mask = 0; - i32 i; - - setlocale(LC_ALL, ""); - XSetLocaleModifiers(""); - fprintf(stderr, "Supported locale?: %s.\n", XSupportsLocale() ? "Yes" : "No"); - // TODO(inso): handle the case where it isn't supported somehow? - - result.input_method = XOpenIM(dpy, 0, 0, 0); - if (!result.input_method){ - // NOTE(inso): Try falling back to the internal XIM implementation that - // should in theory always exist. - - XSetLocaleModifiers("@im=none"); - result.input_method = XOpenIM(dpy, 0, 0, 0); - } - - if (result.input_method){ - if (!XGetIMValues(result.input_method, XNQueryInputStyle, &styles, NULL) && styles){ - for (i = 0; i < styles->count_styles; ++i){ - style = styles->supported_styles[i]; - if (style == (XIMPreeditNothing | XIMStatusNothing)){ - result.best_style = style; - break; - } - } - } - - if (result.best_style){ - XFree(styles); - - result.xic = XCreateIC( - result.input_method, - XNInputStyle, result.best_style, - XNClientWindow, XWindow, - XNFocusWindow, XWindow, - NULL - ); - - if (XGetICValues(result.xic, XNFilterEvents, &xim_event_mask, NULL)){ - xim_event_mask = 0; - } - } - else{ - result = init_input_result_zero(); - fputs("Could not get minimum required input style.\n", stderr); - } - } - else{ - result = init_input_result_zero(); - fputs("Could not open X Input Method.\n", stderr); - } - - XSelectInput( - linuxvars.XDisplay, - linuxvars.XWindow, - ExposureMask | - KeyPressMask | KeyReleaseMask | - ButtonPressMask | ButtonReleaseMask | - EnterWindowMask | LeaveWindowMask | - PointerMotionMask | - FocusChangeMask | - StructureNotifyMask | - MappingNotify | - ExposureMask | - VisibilityChangeMask | - xim_event_mask - ); - - return(result); -} - -// -// Keyboard handling funcs -// - -globalvar u8 keycode_lookup_table[255]; - -internal void -LinuxKeycodeInit(Display* dpy){ - - // NOTE(inso): This looks a bit dumb, but it's the best way I can think of to do it, since: - // KeySyms are the type representing "virtual" keys, like XK_BackSpace, but they are 32-bit ints. - // KeyCodes are guaranteed to fit in 1 byte (and therefore the keycode_lookup_table) but - // have dynamic numbers assigned by the XServer. - // There is XKeysymToKeycode, but it only returns 1 KeyCode for a KeySym. I have my capslock - // rebound to esc, so there are two KeyCodes for the XK_Escape KeyCode but XKeysymToKeycode only - // gets one of them, hence the need for this crazy lookup which works correctly with rebound keys. - - memset(keycode_lookup_table, 0, sizeof(keycode_lookup_table)); - - struct SymMapping { - KeySym sym; - u8 code; - } sym_table[] = { - { XK_BackSpace, key_back }, - { XK_Delete, key_del }, - { XK_Up, key_up }, - { XK_Down, key_down }, - { XK_Left, key_left }, - { XK_Right, key_right }, - { XK_Insert, key_insert }, - { XK_Home, key_home }, - { XK_End, key_end }, - { XK_Page_Up, key_page_up }, - { XK_Page_Down, key_page_down }, - { XK_Escape, key_esc }, - { XK_F1, key_f1 }, - { XK_F2, key_f2 }, - { XK_F3, key_f3 }, - { XK_F4, key_f4 }, - { XK_F5, key_f5 }, - { XK_F6, key_f6 }, - { XK_F7, key_f7 }, - { XK_F8, key_f8 }, - { XK_F9, key_f9 }, - { XK_F10, key_f10 }, - { XK_F11, key_f11 }, - { XK_F12, key_f12 }, - { XK_F13, key_f13 }, - { XK_F14, key_f14 }, - { XK_F15, key_f15 }, - { XK_F16, key_f16 }, - }; - - const int table_size = sizeof(sym_table) / sizeof(struct SymMapping); - - int key_min, key_max, syms_per_code; - XDisplayKeycodes(dpy, &key_min, &key_max); - - int key_count = (key_max - key_min) + 1; - - KeySym* syms = XGetKeyboardMapping( - dpy, - key_min, - key_count, - &syms_per_code - ); - - if(!syms) return; - - int key = key_min; - for(int i = 0; i < key_count * syms_per_code; ++i){ - for(int j = 0; j < table_size; ++j){ - if(sym_table[j].sym == syms[i]){ - keycode_lookup_table[key + (i/syms_per_code)] = sym_table[j].code; - break; - } - } - } - - XFree(syms); - -} - -internal void -LinuxPushKey(u8 code, u8 chr, u8 chr_nocaps, b8 (*mods)[MDFR_INDEX_COUNT], b32 is_hold) -{ - i32 *count; - Key_Event_Data *data; - - if(is_hold){ - count = &linuxvars.input.keys.hold_count; - data = linuxvars.input.keys.hold; - } else { - count = &linuxvars.input.keys.press_count; - data = linuxvars.input.keys.press; - } - - if(*count < KEY_INPUT_BUFFER_SIZE){ - data[*count].keycode = code; - data[*count].character = chr; - data[*count].character_no_caps_lock = chr_nocaps; - - memcpy(data[*count].modifiers, *mods, sizeof(*mods)); - - ++(*count); - } -} - -// -// Misc utility funcs -// - -internal Plat_Handle -LinuxSemToHandle(sem_t* sem){ - return *(Plat_Handle*)&sem; -} - -internal sem_t* -LinuxHandleToSem(Plat_Handle h){ - return *(sem_t**)&h; -} - -internal Plat_Handle -LinuxFDToHandle(int fd){ - return *(Plat_Handle*)&fd; -} - -internal int -LinuxHandleToFD(Plat_Handle h){ - return *(int*)&h; -} - -internal void -LinuxStringDup(String* str, void* data, size_t size){ - if(str->memory_size < size){ - if(str->str){ - LinuxFreeMemory(str->str); - } - str->memory_size = size; - str->str = (char*)LinuxGetMemory(size); - //TODO(inso): handle alloc failure case - } - - str->size = size; - memcpy(str->str, data, size); -} - -internal void -LinuxScheduleStep(void) -{ - u64 now = system_now_time(); - u64 diff = (now - linuxvars.last_step); - - if(diff > (u64)frame_useconds){ - u64 ev = 1; - write(linuxvars.step_event_fd, &ev, sizeof(ev)); - } else { - struct itimerspec its = {}; - timerfd_gettime(linuxvars.step_timer_fd, &its); - - if(its.it_value.tv_sec == 0 && its.it_value.tv_nsec == 0){ - its.it_value.tv_nsec = (frame_useconds - diff) * 1000UL; - timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL); - } - } -} - -// -// X11 utility funcs -// - -internal void -LinuxSetWMState(Display* d, Window w, Atom one, Atom two, int mode) -{ - //NOTE(inso): this will only work after it is mapped - - enum { STATE_REMOVE, STATE_ADD, STATE_TOGGLE }; - - XEvent e = {}; - - e.xany.type = ClientMessage; - e.xclient.message_type = linuxvars.atom__NET_WM_STATE; - e.xclient.format = 32; - e.xclient.window = w; - e.xclient.data.l[0] = mode; - e.xclient.data.l[1] = one; - e.xclient.data.l[2] = two; - e.xclient.data.l[3] = 1L; - - XSendEvent( - d, - RootWindow(d, 0), - 0, - SubstructureNotifyMask | SubstructureRedirectMask, - &e - ); -} - -internal void -LinuxMaximizeWindow(Display* d, Window w, b32 maximize) -{ - LinuxSetWMState(d, - w, - linuxvars.atom__NET_WM_STATE_MAXIMIZED_HORZ, - linuxvars.atom__NET_WM_STATE_MAXIMIZED_VERT, - maximize != 0); -} - -internal void -LinuxToggleFullscreen(Display* d, Window w) -{ - LinuxSetWMState(d, w, linuxvars.atom__NET_WM_STATE_FULLSCREEN, 0, 2); -} - -#include "linux_icon.h" -internal void -LinuxSetIcon(Display* d, Window w) -{ - Atom WM_ICON = XInternAtom(d, "_NET_WM_ICON", False); - - XChangeProperty( - d, - w, - WM_ICON, - XA_CARDINAL, - 32, - PropModeReplace, - (unsigned char*)linux_icon, - sizeof(linux_icon) / sizeof(long) - ); -} - -internal void -LinuxX11ConnectionWatch(Display* dpy, XPointer cdata, int fd, Bool opening, XPointer* wdata) -{ - struct epoll_event e = {}; - e.events = EPOLLIN | EPOLLET; - e.data.u64 = LINUX_4ED_EVENT_X11_INTERNAL | fd; - - int op = opening ? EPOLL_CTL_ADD : EPOLL_CTL_DEL; - epoll_ctl(linuxvars.epoll, op, fd, &e); -} - -// NOTE(inso): this was a quick hack, might need some cleanup. -internal void -LinuxFatalErrorMsg(const char* msg) -{ - fprintf(stderr, "Fatal Error: %s\n", msg); - - Display *dpy = XOpenDisplay(0); - if(!dpy){ - exit(1); - } - - int win_w = 450; - int win_h = 150 + (strlen(msg) / 40) * 24; - - Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, win_w, win_h, 0, 0, 0x2EA44F); - XStoreName(dpy, w, "4coder Error"); - - XSizeHints* sh = XAllocSizeHints(); - sh->flags = PMinSize; - sh->min_width = win_w; - sh->min_height = win_h; - XSetWMNormalHints(dpy, w, sh); - - Atom type = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - - XChangeProperty(dpy, w, - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False), - XA_ATOM, - 32, - PropModeReplace, - (unsigned char*) &type, - 1); - - Atom WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - XSetWMProtocols(dpy, w, &WM_DELETE_WINDOW, 1); - - XMapRaised(dpy, w); - XSync(dpy, False); - - XSelectInput(dpy, w, ExposureMask | StructureNotifyMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask); - - XFontStruct* font = XLoadQueryFont(dpy, "-*-fixed-*-*-*-*-*-140-*-*-*-*-iso8859-1"); - if(!font){ - exit(1); - } - - XGCValues gcv; - gcv.foreground = WhitePixel(dpy, 0); - gcv.background = 0x2EA44F; - gcv.line_width = 2; - gcv.font = font->fid; - - GC gc = XCreateGC(dpy, w, GCForeground | GCBackground | GCFont | GCLineWidth, &gcv); - - gcv.foreground = BlackPixel(dpy, 0); - GC gc2 = XCreateGC(dpy, w, GCForeground | GCBackground | GCFont | GCLineWidth, &gcv); - - int button_trigger = 0; - int button_hi = 0; - - XEvent ev; - while(1){ - XNextEvent(dpy, &ev); - - int redraw = 0; - - if(ev.type == Expose) redraw = 1; - - if(ev.type == ConfigureNotify){ - redraw = 1; - - win_w = ev.xconfigure.width; - win_h = ev.xconfigure.height; - } - - XRectangle button_rect = { win_w/2-40, win_h*0.8f, 80, 20 }; - - if(ev.type == MotionNotify){ - int new_hi = (ev.xmotion.x > button_rect.x && - ev.xmotion.y > button_rect.y && - ev.xmotion.x < button_rect.x + button_rect.width && - ev.xmotion.y < button_rect.y + button_rect.height); - - if(new_hi != button_hi){ - button_hi = new_hi; - redraw = 1; - } - } - - if(ev.type == ButtonPress && ev.xbutton.button == Button1){ - if(button_hi) button_trigger = 1; - redraw = 1; - } - - if(ev.type == ButtonRelease && ev.xbutton.button == Button1){ - if(button_trigger){ - if(button_hi){ - exit(1); - } else { - button_trigger = 0; - } - } - redraw = 1; - } - - if(ev.type == ClientMessage && ev.xclient.window == w && (Atom)ev.xclient.data.l[0] == WM_DELETE_WINDOW){ - exit(1); - } - - if(redraw){ - XClearWindow(dpy, w); - - const char* line_start = msg; - const char* last_space = NULL; - int y = 30; - - { - const char title[] = "4coder - Fatal Error"; - int width = XTextWidth(font, title, sizeof(title)-1); - int x = (win_w/2) - (width/2); - XDrawString(dpy, w, gc2, x+2, y+2, title, sizeof(title)-1); - XDrawString(dpy, w, gc, x, y, title, sizeof(title)-1); - } - - y += 36; - - int width = XTextWidth(font, "x", 1) * 40; - int x = (win_w/2) - (width/2); - for(const char* p = line_start; *p; ++p){ - if(*p == ' ') last_space = p; - if(p - line_start > 40){ - if(!last_space) last_space = p; - - XDrawString(dpy, w, gc2, x+2, y+2, line_start, last_space - line_start); - XDrawString(dpy, w, gc, x, y, line_start, last_space - line_start); - line_start = *last_space == ' ' ? last_space + 1 : p; - last_space = NULL; - y += 18; - } - } - - XDrawString(dpy, w, gc2, x+2, y+2, line_start, strlen(line_start)); - XDrawString(dpy, w, gc, x, y, line_start, strlen(line_start)); - - XDrawRectangles(dpy, w, gc, &button_rect, 1); - if(button_hi || button_trigger){ - XDrawRectangle(dpy, w, gc2, button_rect.x+1, button_rect.y+1, button_rect.width-2, button_rect.height-2); - } - XDrawString(dpy, w, gc2, button_rect.x + 22, button_rect.y + 17, "Drat!", 5); - XDrawString(dpy, w, gc, button_rect.x + 20, button_rect.y + 15, "Drat!", 5); - } - } -} - -internal int -LinuxGetXSettingsDPI(Display* dpy, int screen) -{ - struct XSettingHeader { - u8 type; - u8 pad0; - u16 name_len; - char name[0]; - }; - - struct XSettings { - u8 byte_order; - u8 pad[3]; - u32 serial; - u32 num_settings; - }; - - enum { XSettingsTypeInt, XSettingsTypeString, XSettingsTypeColor }; - - int dpi = -1; - unsigned char* prop = NULL; - char sel_buffer[64]; - struct XSettings* xs; - const char* p; - - snprintf(sel_buffer, sizeof(sel_buffer), "_XSETTINGS_S%d", screen); - - Atom XSET_SEL = XInternAtom(dpy, sel_buffer, True); - Atom XSET_SET = XInternAtom(dpy, "_XSETTINGS_SETTINGS", True); - - if(XSET_SEL == None || XSET_SET == None){ - fputs("XSETTINGS unavailable.\n", stderr); - return dpi; - } - - Window xset_win = XGetSelectionOwner(dpy, XSET_SEL); - if(xset_win == None){ - // TODO(inso): listen for the ClientMessage about it becoming available? - // there's not much point atm if DPI scaling is only done at startup - goto out; - } - - { - Atom type; - int fmt; - unsigned long pad, num; - - if(XGetWindowProperty(dpy, xset_win, XSET_SET, 0, 1024, False, XSET_SET, &type, &fmt, &num, &pad, &prop) != Success){ - fputs("XSETTINGS: GetWindowProperty failed.\n", stderr); - goto out; - } - - if(fmt != 8){ - fputs("XSETTINGS: Wrong format.\n", stderr); - goto out; - } - } - - xs = (struct XSettings*)prop; - p = (char*)(xs + 1); - - if(xs->byte_order != 0){ - fputs("FIXME: XSETTINGS not host byte order?\n", stderr); - goto out; - } - - for(int i = 0; i < xs->num_settings; ++i){ - struct XSettingHeader* h = (struct XSettingHeader*)p; - - // const char* strs[] = { "Int", "String", "Color" }; - // printf("%s:\t\"%.*s\"\n", strs[h->type], h->name_len, h->name); - - p += sizeof(struct XSettingHeader); - p += h->name_len; - p += ((4 - (h->name_len & 3)) & 3); - p += 4; // serial - - switch(h->type){ - case XSettingsTypeInt: { - if(strncmp(h->name, "Xft/DPI", h->name_len) == 0){ - dpi = *(i32*)p; - if(dpi != -1) dpi /= 1024; - } - p += 4; - } break; - - case XSettingsTypeString: { - u32 len = *(u32*)p; - p += 4; - p += len; - p += ((4 - (len & 3)) & 3); - } break; - - case XSettingsTypeColor: { - p += 8; - } break; - - default: { - fputs("XSETTINGS: Got invalid type...\n", stderr); - goto out; - } break; - } - } - -out: - if(prop){ - XFree(prop); - } - - return dpi; -} - -// -// X11 window init -// - -internal b32 -LinuxX11WindowInit(int argc, char** argv, int* WinWidth, int* WinHeight) -{ - // NOTE(allen): Here begins the linux screen setup stuff. - // Behold the true nature of this wonderful OS: - // (thanks again to Casey for providing this stuff) - -#define BASE_W 800 -#define BASE_H 600 - - if (linuxvars.settings.set_window_size){ - *WinWidth = linuxvars.settings.window_w; - *WinHeight = linuxvars.settings.window_h; - } else { - *WinWidth = BASE_W * size_change(linuxvars.dpi_x, linuxvars.dpi_y); - *WinHeight = BASE_H * size_change(linuxvars.dpi_x, linuxvars.dpi_y); - } - - if (!GLXCanUseFBConfig(linuxvars.XDisplay)){ - LinuxFatalErrorMsg("Your XServer's GLX version is too old. GLX 1.3+ is required."); - return false; - } - - glx_config_result Config = ChooseGLXConfig(linuxvars.XDisplay, DefaultScreen(linuxvars.XDisplay)); - if (!Config.Found){ - LinuxFatalErrorMsg("Could not get a matching GLX FBConfig. Check your OpenGL drivers are installed correctly."); - return false; - } - - XSetWindowAttributes swa = {}; - swa.backing_store = WhenMapped; - swa.event_mask = StructureNotifyMask; - swa.bit_gravity = NorthWestGravity; - swa.colormap = XCreateColormap(linuxvars.XDisplay, - RootWindow(linuxvars.XDisplay, Config.BestInfo.screen), - Config.BestInfo.visual, AllocNone); - - linuxvars.XWindow = - XCreateWindow(linuxvars.XDisplay, - RootWindow(linuxvars.XDisplay, Config.BestInfo.screen), - 0, 0, *WinWidth, *WinHeight, - 0, Config.BestInfo.depth, InputOutput, - Config.BestInfo.visual, - CWBackingStore|CWBitGravity|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &swa); - - if (!linuxvars.XWindow){ - LinuxFatalErrorMsg("XCreateWindow failed. Make sure your display is set up correctly."); - return false; - } - - //NOTE(inso): Set the window's type to normal - XChangeProperty( - linuxvars.XDisplay, - linuxvars.XWindow, - linuxvars.atom__NET_WM_WINDOW_TYPE, - XA_ATOM, - 32, - PropModeReplace, - (unsigned char*)&linuxvars.atom__NET_WM_WINDOW_TYPE_NORMAL, - 1 - ); - - //NOTE(inso): window managers want the PID as a window property for some reason. - pid_t pid = getpid(); - XChangeProperty( - linuxvars.XDisplay, - linuxvars.XWindow, - linuxvars.atom__NET_WM_PID, - XA_CARDINAL, - 32, - PropModeReplace, - (unsigned char*)&pid, - 1 - ); - -#define WINDOW_NAME "4coder 4linux: " VERSION - - //NOTE(inso): set wm properties - XStoreName(linuxvars.XDisplay, linuxvars.XWindow, WINDOW_NAME); - - XSizeHints *sz_hints = XAllocSizeHints(); - XWMHints *wm_hints = XAllocWMHints(); - XClassHint *cl_hints = XAllocClassHint(); - - sz_hints->flags = PMinSize | PMaxSize | PWinGravity; - - sz_hints->min_width = 50; - sz_hints->min_height = 50; - - sz_hints->max_width = sz_hints->max_height = (1UL << 16UL); - -/* NOTE(inso): fluxbox thinks this is minimum, so don't set it - sz_hints->base_width = BASE_W; - sz_hints->base_height = BASE_H; -*/ - sz_hints->win_gravity = NorthWestGravity; - - if (linuxvars.settings.set_window_pos){ - sz_hints->flags |= USPosition; - sz_hints->x = linuxvars.settings.window_x; - sz_hints->y = linuxvars.settings.window_y; - } - - wm_hints->flags |= InputHint | StateHint; - wm_hints->input = True; - wm_hints->initial_state = NormalState; - - cl_hints->res_name = "4coder"; - cl_hints->res_class = "4coder"; - - char* win_name_list[] = { WINDOW_NAME }; - XTextProperty win_name; - XStringListToTextProperty(win_name_list, 1, &win_name); - - XSetWMProperties( - linuxvars.XDisplay, - linuxvars.XWindow, - &win_name, NULL, - argv, argc, - sz_hints, wm_hints, cl_hints - ); - - XFree(win_name.value); - - XFree(sz_hints); - XFree(wm_hints); - XFree(cl_hints); - - LinuxSetIcon(linuxvars.XDisplay, linuxvars.XWindow); - - //NOTE(inso): make the window visible - XMapWindow(linuxvars.XDisplay, linuxvars.XWindow); - - b32 IsLegacy = false; - GLXContext GLContext = - InitializeOpenGLContext(linuxvars.XDisplay, linuxvars.XWindow, Config.BestConfig, IsLegacy); - - XRaiseWindow(linuxvars.XDisplay, linuxvars.XWindow); - - if (linuxvars.settings.set_window_pos){ - XMoveWindow( - linuxvars.XDisplay, - linuxvars.XWindow, - linuxvars.settings.window_x, - linuxvars.settings.window_y - ); - } - - if (linuxvars.settings.maximize_window){ - LinuxMaximizeWindow(linuxvars.XDisplay, linuxvars.XWindow, 1); - } - else if(linuxvars.settings.fullscreen_window){ - LinuxToggleFullscreen(linuxvars.XDisplay, linuxvars.XWindow); - } - - XSync(linuxvars.XDisplay, False); - - XWindowAttributes WinAttribs; - if (XGetWindowAttributes(linuxvars.XDisplay, linuxvars.XWindow, &WinAttribs)) - { - *WinWidth = WinAttribs.width; - *WinHeight = WinAttribs.height; - } - - Atom wm_protos[] = { - linuxvars.atom_WM_DELETE_WINDOW, - linuxvars.atom__NET_WM_PING - }; - - XSetWMProtocols(linuxvars.XDisplay, linuxvars.XWindow, wm_protos, 2); -} - -internal void -LinuxHandleX11Events(void) -{ - static XEvent PrevEvent = {}; - b32 should_step = 0; - - while(XPending(linuxvars.XDisplay)) - { - XEvent Event; - XNextEvent(linuxvars.XDisplay, &Event); - - if (XFilterEvent(&Event, None) == True){ - continue; - } - - switch (Event.type){ - case KeyPress: { - should_step = 1; - - b32 is_hold = (PrevEvent.type == KeyRelease && - PrevEvent.xkey.time == Event.xkey.time && - PrevEvent.xkey.keycode == Event.xkey.keycode); - - b8 mods[MDFR_INDEX_COUNT] = {}; - mods[MDFR_HOLD_INDEX] = is_hold; - - if(Event.xkey.state & ShiftMask) mods[MDFR_SHIFT_INDEX] = 1; - if(Event.xkey.state & ControlMask) mods[MDFR_CONTROL_INDEX] = 1; - if(Event.xkey.state & LockMask) mods[MDFR_CAPS_INDEX] = 1; - if(Event.xkey.state & Mod1Mask) mods[MDFR_ALT_INDEX] = 1; - - Event.xkey.state &= ~(ControlMask); - - Status status; - KeySym keysym = NoSymbol; - char buff[32] = {}; - - Xutf8LookupString( - linuxvars.input_context, - &Event.xkey, - buff, - sizeof(buff) - 1, - &keysym, - &status - ); - - if(status == XBufferOverflow){ - //TODO(inso): handle properly - Xutf8ResetIC(linuxvars.input_context); - XSetICFocus(linuxvars.input_context); - fputs("FIXME: XBufferOverflow from LookupString.\n", stderr); - } - - u8 key = *buff, key_no_caps = key; - - if(mods[MDFR_CAPS_INDEX] && status == XLookupBoth && Event.xkey.keycode){ - char buff_no_caps[32] = {}; - Event.xkey.state &= ~(LockMask); - - XLookupString( - &Event.xkey, - buff_no_caps, - sizeof(buff_no_caps) - 1, - NULL, - NULL - ); - - if(*buff_no_caps){ - key_no_caps = *buff_no_caps; - } - } - - if(key == '\r') key = '\n'; - if(key_no_caps == '\r') key_no_caps = '\n'; - - // don't push modifiers - if(keysym >= XK_Shift_L && keysym <= XK_Hyper_R){ - break; - } - - if(keysym == XK_ISO_Left_Tab){ - key = key_no_caps = '\t'; - mods[MDFR_SHIFT_INDEX] = 1; - } - - u8 special_key = keycode_lookup_table[(u8)Event.xkey.keycode]; - - if(special_key){ - LinuxPushKey(special_key, 0, 0, &mods, is_hold); - } else if(key < 128){ - LinuxPushKey(key, key, key_no_caps, &mods, is_hold); - } else { - LinuxPushKey(0, 0, 0, &mods, is_hold); - } - }break; - - case KeyRelease: { - should_step = 1; - }break; - - case MotionNotify: { - should_step = 1; - linuxvars.input.mouse.x = Event.xmotion.x; - linuxvars.input.mouse.y = Event.xmotion.y; - }break; - - case ButtonPress: { - should_step = 1; - switch(Event.xbutton.button){ - case Button1: { - linuxvars.input.mouse.press_l = 1; - linuxvars.input.mouse.l = 1; - } break; - case Button3: { - linuxvars.input.mouse.press_r = 1; - linuxvars.input.mouse.r = 1; - } break; - - //NOTE(inso): scroll up - case Button4: { - linuxvars.input.mouse.wheel = 1; - }break; - - //NOTE(inso): scroll down - case Button5: { - linuxvars.input.mouse.wheel = -1; - }break; - } - }break; - - case ButtonRelease: { - should_step = 1; - switch(Event.xbutton.button){ - case Button1: { - linuxvars.input.mouse.release_l = 1; - linuxvars.input.mouse.l = 0; - } break; - case Button3: { - linuxvars.input.mouse.release_r = 1; - linuxvars.input.mouse.r = 0; - } break; - } - }break; - - case EnterNotify: { - should_step = 1; - linuxvars.input.mouse.out_of_window = 0; - }break; - - case LeaveNotify: { - should_step = 1; - linuxvars.input.mouse.out_of_window = 1; - }break; - - case FocusIn: - case FocusOut: { - should_step = 1; - linuxvars.input.mouse.l = 0; - linuxvars.input.mouse.r = 0; - }break; - - case ConfigureNotify: { - should_step = 1; - i32 w = Event.xconfigure.width, h = Event.xconfigure.height; - - if(w != linuxvars.target.width || h != linuxvars.target.height){ - LinuxResizeTarget(Event.xconfigure.width, Event.xconfigure.height); - } - }break; - - case MappingNotify: { - if(Event.xmapping.request == MappingModifier || Event.xmapping.request == MappingKeyboard){ - XRefreshKeyboardMapping(&Event.xmapping); - LinuxKeycodeInit(linuxvars.XDisplay); - } - }break; - - case ClientMessage: { - if ((Atom)Event.xclient.data.l[0] == linuxvars.atom_WM_DELETE_WINDOW) { - should_step = 1; - linuxvars.keep_running = 0; - } - else if ((Atom)Event.xclient.data.l[0] == linuxvars.atom__NET_WM_PING) { - Event.xclient.window = DefaultRootWindow(linuxvars.XDisplay); - XSendEvent( - linuxvars.XDisplay, - Event.xclient.window, - False, - SubstructureRedirectMask | SubstructureNotifyMask, - &Event - ); - } - }break; - - // NOTE(inso): Someone wants us to give them the clipboard data. - case SelectionRequest: { - XSelectionRequestEvent request = Event.xselectionrequest; - - XSelectionEvent response = {}; - response.type = SelectionNotify; - response.requestor = request.requestor; - response.selection = request.selection; - response.target = request.target; - response.time = request.time; - response.property = None; - - if ( - linuxvars.clipboard_outgoing.size && - request.selection == linuxvars.atom_CLIPBOARD && - request.property != None && - request.display && - request.requestor - ){ - Atom atoms[] = { - XA_STRING, - linuxvars.atom_UTF8_STRING - }; - - if(request.target == linuxvars.atom_TARGETS){ - - XChangeProperty( - request.display, - request.requestor, - request.property, - XA_ATOM, - 32, - PropModeReplace, - (u8*)atoms, - ArrayCount(atoms) - ); - - response.property = request.property; - - } else { - b32 found = false; - for(int i = 0; i < ArrayCount(atoms); ++i){ - if(request.target == atoms[i]){ - found = true; - break; - } - } - - if(found){ - XChangeProperty( - request.display, - request.requestor, - request.property, - request.target, - 8, - PropModeReplace, - (u8*)linuxvars.clipboard_outgoing.str, - linuxvars.clipboard_outgoing.size - ); - - response.property = request.property; - } - } - } - - XSendEvent(request.display, request.requestor, True, 0, (XEvent*)&response); - - }break; - - // NOTE(inso): Another program is now the clipboard owner. - case SelectionClear: { - if(Event.xselectionclear.selection == linuxvars.atom_CLIPBOARD){ - linuxvars.clipboard_outgoing.size = 0; - } - }break; - - // NOTE(inso): A program is giving us the clipboard data we asked for. - case SelectionNotify: { - XSelectionEvent* e = (XSelectionEvent*)&Event; - if( - e->selection == linuxvars.atom_CLIPBOARD && - e->target == linuxvars.atom_UTF8_STRING && - e->property != None - ){ - Atom type; - int fmt; - unsigned long nitems, bytes_left; - u8 *data; - - int result = XGetWindowProperty( - linuxvars.XDisplay, - linuxvars.XWindow, - linuxvars.atom_CLIPBOARD, - 0L, - LINUX_MAX_PASTE_CHARS/4L, - False, - linuxvars.atom_UTF8_STRING, - &type, - &fmt, - &nitems, - &bytes_left, - &data - ); - - if(result == Success && fmt == 8){ - LinuxStringDup(&linuxvars.clipboard_contents, data, nitems); - should_step = 1; - linuxvars.new_clipboard = 1; - XFree(data); - XDeleteProperty(linuxvars.XDisplay, linuxvars.XWindow, linuxvars.atom_CLIPBOARD); - } - } - }break; - - case Expose: - case VisibilityNotify: { - should_step = 1; - }break; - - default: { - if(Event.type == linuxvars.xfixes_selection_event){ - XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&Event; - if(sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.XWindow){ - XConvertSelection( - linuxvars.XDisplay, - linuxvars.atom_CLIPBOARD, - linuxvars.atom_UTF8_STRING, - linuxvars.atom_CLIPBOARD, - linuxvars.XWindow, - CurrentTime - ); - } - } - }break; - } - - PrevEvent = Event; - } - - if(should_step){ - LinuxScheduleStep(); - } -} - -// -// Entry point -// - -int -main(int argc, char **argv) -{ - // - // System & Memory init - // - -#if FRED_INTERNAL - linuxvars.internal_bubble.next = &linuxvars.internal_bubble; - linuxvars.internal_bubble.prev = &linuxvars.internal_bubble; - linuxvars.internal_bubble.flags = 0; - - pthread_mutex_init(&linuxvars.DEBUG_sysmem_lock, 0); -#endif - - char base_dir_mem[PATH_MAX]; - String base_dir = make_fixed_width_string(base_dir_mem); - - if (!LinuxLoadAppCode(&base_dir)){ - LinuxFatalErrorMsg("Could not load '4ed_app.so'. This file should be in the same directory as the main '4ed' executable."); - return 99; - } - - LinuxLoadSystemCode(); - LinuxLoadRenderCode(); - - memory_vars.vars_memory_size = Mbytes(2); - memory_vars.vars_memory = system_get_memory(memory_vars.vars_memory_size); - memory_vars.target_memory_size = Mbytes(512); - memory_vars.target_memory = system_get_memory(memory_vars.target_memory_size); - memory_vars.user_memory_size = Mbytes(2); - memory_vars.user_memory = system_get_memory(memory_vars.user_memory_size); - - linuxvars.target.max = Mbytes(1); - linuxvars.target.push_buffer = (char*)system_get_memory(linuxvars.target.max); - - if(memory_vars.vars_memory == NULL || memory_vars.target_memory == NULL || memory_vars.user_memory == NULL || linuxvars.target.push_buffer == NULL){ - LinuxFatalErrorMsg("Could not allocate sufficient memory. Please make sure you have atleast 512Mb of RAM free. (This requirement will be relaxed in the future)."); - exit(1); - } - - init_shared_vars(); - - // - // Read command line - // - - char* cwd = get_current_dir_name(); - if(!cwd){ - char buf[1024]; - snprintf(buf, sizeof(buf), "Call to get_current_dir_name failed: %s", strerror(errno)); - LinuxFatalErrorMsg(buf); - return 1; - } - - String current_directory = make_string_slowly(cwd); - - Command_Line_Parameters clparams; - clparams.argv = argv; - clparams.argc = argc; - - char **files; - i32 *file_count; - i32 output_size; - - output_size = - linuxvars.app.read_command_line(&linuxvars.system, - &memory_vars, - current_directory, - &linuxvars.settings, - &files, &file_count, - clparams); - - if (output_size > 0){ - // TODO(allen): crt free version - fprintf(stdout, "%.*s", output_size, (char*)memory_vars.target_memory); - } - if (output_size != 0){ - LinuxFatalErrorMsg("Error reading command-line arguments."); - return 1; - } - - sysshared_filter_real_files(files, file_count); - - // - // Custom layer linkage - // - -#ifdef FRED_SUPER - - char *custom_file_default = "4coder_custom.so"; - sysshared_to_binary_path(&base_dir, custom_file_default); - custom_file_default = base_dir.str; - - char *custom_file; - if (linuxvars.settings.custom_dll){ - custom_file = linuxvars.settings.custom_dll; - } else { - custom_file = custom_file_default; - } - - linuxvars.custom = dlopen(custom_file, RTLD_LAZY); - if (!linuxvars.custom && custom_file != custom_file_default){ - if (!linuxvars.settings.custom_dll_is_strict){ - linuxvars.custom = dlopen(custom_file_default, RTLD_LAZY); - } - } - - if (linuxvars.custom){ - linuxvars.custom_api.get_alpha_4coder_version = (_Get_Version_Function*) - dlsym(linuxvars.custom, "get_alpha_4coder_version"); - - if (linuxvars.custom_api.get_alpha_4coder_version == 0 || - linuxvars.custom_api.get_alpha_4coder_version(MAJOR, MINOR, PATCH) == 0){ - LinuxFatalErrorMsg("Failed to load '4coder_custom.so': Version mismatch. Try rebuilding it with 'buildsuper.sh'."); - exit(1); - } - else{ - linuxvars.custom_api.get_bindings = (Get_Binding_Data_Function*) - dlsym(linuxvars.custom, "get_bindings"); - linuxvars.custom_api.view_routine = (View_Routine_Function*) - dlsym(linuxvars.custom, "view_routine"); - - if (linuxvars.custom_api.get_bindings == 0){ - LinuxFatalErrorMsg("Failed to load '4coder_custom.so': " - "It does not export the required 'get_bindings' function. " - "Try rebuilding it with 'buildsuper.sh'."); - exit(1); - } - else{ - fprintf(stderr, "Successfully loaded 4coder_custom.so\n"); - } - } - } else { - char buf[4096]; - const char* error = dlerror(); - snprintf(buf, sizeof(buf), "Error loading custom: %s. " - "Make sure this file is in the same directory as the main '4ed' executable.", - error ? error : "'4coder_custom.so' missing"); - LinuxFatalErrorMsg(buf); - exit(1); - } -#else - linuxvars.custom_api.get_bindings = get_bindings; -#endif - - linuxvars.custom_api.view_routine = 0; - -#if 0 - if (linuxvars.custom_api.view_routine == 0){ - linuxvars.custom_api.view_routine = view_routine; - } -#endif - - // - // Coroutine / Thread / Semaphore / Mutex init - // - - linuxvars.coroutine_free = linuxvars.coroutine_data; - for (i32 i = 0; i+1 < ArrayCount(linuxvars.coroutine_data); ++i){ - linuxvars.coroutine_data[i].next = linuxvars.coroutine_data + i + 1; - } - - const size_t stack_size = Mbytes(2); - for (i32 i = 0; i < ArrayCount(linuxvars.coroutine_data); ++i){ - linuxvars.coroutine_data[i].stack.ss_size = stack_size; - linuxvars.coroutine_data[i].stack.ss_sp = system_get_memory(stack_size); - } - - Thread_Context background[4] = {}; - linuxvars.groups[BACKGROUND_THREADS].threads = background; - linuxvars.groups[BACKGROUND_THREADS].count = ArrayCount(background); - linuxvars.groups[BACKGROUND_THREADS].cancel_lock0 = CANCEL_LOCK0; - linuxvars.groups[BACKGROUND_THREADS].cancel_cv0 = 0; - - Thread_Memory thread_memory[ArrayCount(background)]; - linuxvars.thread_memory = thread_memory; - - sem_init(&linuxvars.thread_semaphore, 0, 0); - linuxvars.queues[BACKGROUND_THREADS].semaphore = LinuxSemToHandle(&linuxvars.thread_semaphore); - - for(i32 i = 0; i < linuxvars.groups[BACKGROUND_THREADS].count; ++i){ - Thread_Context *thread = linuxvars.groups[BACKGROUND_THREADS].threads + i; - thread->id = i + 1; - thread->group_id = BACKGROUND_THREADS; - - Thread_Memory *memory = linuxvars.thread_memory + i; - *memory = thread_memory_zero(); - memory->id = thread->id; - - thread->queue = &linuxvars.queues[BACKGROUND_THREADS]; - pthread_create(&thread->handle, NULL, &JobThreadProc, thread); - } - - initialize_unbounded_queue(&linuxvars.groups[BACKGROUND_THREADS].queue); - - for(i32 i = 0; i < LOCK_COUNT; ++i){ - pthread_mutex_init(linuxvars.locks + i, NULL); - } - - for(i32 i = 0; i < ArrayCount(linuxvars.conds); ++i){ - pthread_cond_init(linuxvars.conds + i, NULL); - } - - // - // X11 init - // - - linuxvars.XDisplay = XOpenDisplay(0); - if(!linuxvars.XDisplay){ - // NOTE(inso): probably not worth trying the popup in this case... - fprintf(stderr, "Can't open display!\n"); - return 1; - } - -#define LOAD_ATOM(x) linuxvars.atom_##x = XInternAtom(linuxvars.XDisplay, #x, False); - - LOAD_ATOM(TARGETS); - LOAD_ATOM(CLIPBOARD); - LOAD_ATOM(UTF8_STRING); - LOAD_ATOM(_NET_WM_STATE); - LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_HORZ); - LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_VERT); - LOAD_ATOM(_NET_WM_STATE_FULLSCREEN); - LOAD_ATOM(_NET_WM_PING); - LOAD_ATOM(_NET_WM_WINDOW_TYPE); - LOAD_ATOM(_NET_WM_WINDOW_TYPE_NORMAL); - LOAD_ATOM(_NET_WM_PID); - LOAD_ATOM(WM_DELETE_WINDOW); - -#undef LOAD_ATOM - -#if SUPPORT_DPI - linuxvars.dpi_x = linuxvars.dpi_y = LinuxGetXSettingsDPI(linuxvars.XDisplay, DefaultScreen(linuxvars.XDisplay)); - - // fallback - if(linuxvars.dpi_x == -1){ - int scr = DefaultScreen(linuxvars.XDisplay); - - int dw = DisplayWidth(linuxvars.XDisplay, scr); - int dh = DisplayHeight(linuxvars.XDisplay, scr); - - int dw_mm = DisplayWidthMM(linuxvars.XDisplay, scr); - int dh_mm = DisplayHeightMM(linuxvars.XDisplay, scr); - - linuxvars.dpi_x = dw_mm ? dw / (dw_mm / 25.4) : 96; - linuxvars.dpi_y = dh_mm ? dh / (dh_mm / 25.4) : 96; - - fprintf(stderr, "%dx%d - %dmmx%dmm DPI: %dx%d\n", dw, dh, dw_mm, dh_mm, linuxvars.dpi_x, linuxvars.dpi_y); - } else { - fprintf(stderr, "DPI from XSETTINGS: %d\n", linuxvars.dpi_x); - } -#endif - - int WinWidth, WinHeight; - if(!LinuxX11WindowInit(argc, argv, &WinWidth, &WinHeight)){ - return 1; - } - - int xfixes_version_unused, xfixes_err_unused; - linuxvars.has_xfixes = XQueryExtension( - linuxvars.XDisplay, - "XFIXES", - &xfixes_version_unused, - &linuxvars.xfixes_selection_event, - &xfixes_err_unused - ) == True; - - if(linuxvars.has_xfixes){ - XFixesSelectSelectionInput( - linuxvars.XDisplay, - linuxvars.XWindow, - linuxvars.atom_CLIPBOARD, - XFixesSetSelectionOwnerNotifyMask - ); - } else { - fputs("Your X server doesn't support XFIXES, mention this fact if you report any clipboard-related issues.\n", stderr); - } - - Init_Input_Result input_result = - LinuxInputInit(linuxvars.XDisplay, linuxvars.XWindow); - - linuxvars.input_method = input_result.input_method; - linuxvars.input_style = input_result.best_style; - linuxvars.input_context = input_result.xic; - - LinuxKeycodeInit(linuxvars.XDisplay); - - Cursor xcursors[APP_MOUSE_CURSOR_COUNT] = { - None, - XCreateFontCursor(linuxvars.XDisplay, XC_arrow), - XCreateFontCursor(linuxvars.XDisplay, XC_xterm), - XCreateFontCursor(linuxvars.XDisplay, XC_sb_h_double_arrow), - XCreateFontCursor(linuxvars.XDisplay, XC_sb_v_double_arrow) - }; - - { - char data = 0; - XColor c = {}; - Pixmap p = XCreateBitmapFromData(linuxvars.XDisplay, linuxvars.XWindow, &data, 1, 1); - - linuxvars.hidden_cursor = XCreatePixmapCursor(linuxvars.XDisplay, p, p, &c, &c, 0, 0); - - XFreePixmap(linuxvars.XDisplay, p); - } - - - // - // Epoll init - // - - linuxvars.x11_fd = ConnectionNumber(linuxvars.XDisplay); - linuxvars.inotify_fd = inotify_init1(IN_NONBLOCK); - linuxvars.step_event_fd = eventfd(0, EFD_NONBLOCK); - linuxvars.step_timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); - - linuxvars.epoll = epoll_create(16); - - { - struct epoll_event e = {}; - e.events = EPOLLIN | EPOLLET; - - e.data.u64 = LINUX_4ED_EVENT_X11; - epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, linuxvars.x11_fd, &e); - - e.data.u64 = LINUX_4ED_EVENT_STEP; - epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, linuxvars.step_event_fd, &e); - - e.data.u64 = LINUX_4ED_EVENT_STEP_TIMER; - epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, linuxvars.step_timer_fd, &e); - } - - // - // App init - // - - XAddConnectionWatch(linuxvars.XDisplay, &LinuxX11ConnectionWatch, NULL); - - linuxvars.app.init(&linuxvars.system, - &linuxvars.target, - &memory_vars, - linuxvars.clipboard_contents, - current_directory, - linuxvars.custom_api); - - LinuxResizeTarget(WinWidth, WinHeight); - - // - // Main loop - // - - system_acquire_lock(FRAME_LOCK); - - LinuxScheduleStep(); - - linuxvars.keep_running = 1; - linuxvars.input.first_step = 1; - linuxvars.input.dt = (frame_useconds / 1000000.f); - - while(1){ - - if(XEventsQueued(linuxvars.XDisplay, QueuedAlready)){ - LinuxHandleX11Events(); - } - - system_release_lock(FRAME_LOCK); - - struct epoll_event events[16]; - int num_events = epoll_wait(linuxvars.epoll, events, ArrayCount(events), -1); - - system_acquire_lock(FRAME_LOCK); - - if(num_events == -1){ - if(errno != EINTR){ - perror("epoll_wait"); - } - continue; - } - - b32 do_step = 0; - - for(int i = 0; i < num_events; ++i){ - - int fd = events[i].data.u64 & UINT32_MAX; - u64 type = events[i].data.u64 & ~fd; - - switch(type){ - case LINUX_4ED_EVENT_X11: { - LinuxHandleX11Events(); - } break; - - case LINUX_4ED_EVENT_X11_INTERNAL: { - XProcessInternalConnection(linuxvars.XDisplay, fd); - } break; - - case LINUX_4ED_EVENT_STEP: { - u64 ev; - int ret; - do { - ret = read(linuxvars.step_event_fd, &ev, 8); - } while(ret != -1 || errno != EAGAIN); - do_step = 1; - } break; - - case LINUX_4ED_EVENT_STEP_TIMER: { - u64 count; - int ret; - do { - ret = read(linuxvars.step_timer_fd, &count, 8); - } while(ret != -1 || errno != EAGAIN); - do_step = 1; - } break; - - case LINUX_4ED_EVENT_CLI: { - LinuxScheduleStep(); - } break; - } - } - - if(do_step){ - linuxvars.last_step = system_now_time(); - - if(linuxvars.input.first_step || !linuxvars.has_xfixes){ - XConvertSelection( - linuxvars.XDisplay, - linuxvars.atom_CLIPBOARD, - linuxvars.atom_UTF8_STRING, - linuxvars.atom_CLIPBOARD, - linuxvars.XWindow, - CurrentTime - ); - } - - Application_Step_Result result = {}; - result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT; - result.trying_to_kill = !linuxvars.keep_running; - - if(linuxvars.new_clipboard){ - linuxvars.input.clipboard = linuxvars.clipboard_contents; - linuxvars.new_clipboard = 0; - } else { - linuxvars.input.clipboard = string_zero(); - } - - linuxvars.app.step( - &linuxvars.system, - &linuxvars.target, - &memory_vars, - &linuxvars.input, - &result - ); - - if(result.perform_kill){ - break; - } else { - linuxvars.keep_running = 1; - } - - if(result.animating){ - LinuxScheduleStep(); - } - - LinuxRedrawTarget(); - - if(result.mouse_cursor_type != linuxvars.cursor && !linuxvars.input.mouse.l){ - Cursor c = xcursors[result.mouse_cursor_type]; - if(!linuxvars.hide_cursor){ - XDefineCursor(linuxvars.XDisplay, linuxvars.XWindow, c); - } - linuxvars.cursor = result.mouse_cursor_type; - } - - flush_thread_group(BACKGROUND_THREADS); - - linuxvars.input.first_step = 0; - linuxvars.input.keys = key_input_data_zero(); - linuxvars.input.mouse.press_l = 0; - linuxvars.input.mouse.release_l = 0; - linuxvars.input.mouse.press_r = 0; - linuxvars.input.mouse.release_r = 0; - linuxvars.input.mouse.wheel = 0; - } - } - - return 0; -} - -// BOTTOM -// vim: expandtab:ts=4:sts=4:sw=4 - +/* + * Mr. 4th Dimention - Allen Webster + * (Mostly by insofaras) + * + * 14.11.2015 + * + * Linux layer for project codename "4ed" + * + */ + +// TOP + +# include "4ed_defines.h" + +#if FRED_SUPER + +# define FSTRING_IMPLEMENTATION +# define FSTRING_C +# include "4coder_string.h" + +#include "4coder_version.h" +# include "4coder_keycodes.h" +# include "4coder_style.h" +# include "4coder_rect.h" + +# include + +# include "4coder_mem.h" + +// TODO(allen): This is duplicated from 4coder_custom.h +// I need to work out a way to avoid this. +#define VIEW_ROUTINE_SIG(name) void name(struct Application_Links *app, int32_t view_id) +#define GET_BINDING_DATA(name) int32_t name(void *data, int32_t size) +#define _GET_VERSION_SIG(n) int32_t n(int32_t maj, int32_t min, int32_t patch) + +typedef VIEW_ROUTINE_SIG(View_Routine_Function); +typedef GET_BINDING_DATA(Get_Binding_Data_Function); +typedef _GET_VERSION_SIG(_Get_Version_Function); + +struct Custom_API{ + View_Routine_Function *view_routine; + Get_Binding_Data_Function *get_bindings; + _Get_Version_Function *get_alpha_4coder_version; +}; + + +typedef void Custom_Command_Function; +#include "4coder_types.h" +struct Application_Links; +# include "4ed_os_custom_api.h" + +//# include "4coder_custom.h" +#else +# include "4coder_default_bindings.cpp" + +# define FSTRING_IMPLEMENTATION +# define FSTRING_C +# include "4coder_string.h" + +#endif + +#include "4ed_math.h" + +#include "4ed_system.h" +#include "4ed_rendering.h" +#include "4ed.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + + +// +// Linux macros +// + +#define LINUX_MAX_PASTE_CHARS 0x10000L +#define FPS 60L +#define frame_useconds (1000000UL / FPS) + +#define LinuxGetMemory(size) LinuxGetMemory_(size, __LINE__, __FILE__) + +#if FRED_INTERNAL + #define LINUX_FN_DEBUG(fmt, ...) do { \ + fprintf(stderr, "%s: " fmt "\n", __func__, ##__VA_ARGS__); \ + } while(0) +#else + #define LINUX_FN_DEBUG(fmt, ...) +#endif + +#if (__cplusplus <= 199711L) + #define static_assert(x, ...) +#endif + +#define SUPPORT_DPI 1 +#define LINUX_FONTS 1 + +#define InterlockedCompareExchange(dest, ex, comp) __sync_val_compare_and_swap((dest), (comp), (ex)) + +#include "filetrack/4tech_file_track_linux.c" +#include "system_shared.h" + +// +// Linux structs / enums +// + +#if FRED_INTERNAL + +struct Sys_Bubble : public Bubble{ + i32 line_number; + char *file_name; +}; + +#endif + +enum { + LINUX_4ED_EVENT_X11 = (UINT64_C(1) << 32), + LINUX_4ED_EVENT_X11_INTERNAL = (UINT64_C(2) << 32), + LINUX_4ED_EVENT_STEP = (UINT64_C(3) << 32), + LINUX_4ED_EVENT_STEP_TIMER = (UINT64_C(4) << 32), + LINUX_4ED_EVENT_CLI = (UINT64_C(5) << 32), +}; + +struct Linux_Coroutine { + Coroutine coroutine; + Linux_Coroutine *next; + ucontext_t ctx, yield_ctx; + stack_t stack; + b32 done; +}; + +struct Thread_Context{ + u32 job_id; + b32 running; + b32 cancel; + + Work_Queue *queue; + u32 id; + u32 group_id; + pthread_t handle; +}; + +struct Thread_Group{ + Thread_Context *threads; + i32 count; + + Unbounded_Work_Queue queue; + + i32 cancel_lock0; + i32 cancel_cv0; +}; + +struct Linux_Vars{ + Display *XDisplay; + Window XWindow; + Render_Target target; + + XIM input_method; + XIMStyle input_style; + XIC input_context; + + Application_Step_Input input; + + String clipboard_contents; + String clipboard_outgoing; + b32 new_clipboard; + + Atom atom_TARGETS; + Atom atom_CLIPBOARD; + Atom atom_UTF8_STRING; + Atom atom__NET_WM_STATE; + Atom atom__NET_WM_STATE_MAXIMIZED_HORZ; + Atom atom__NET_WM_STATE_MAXIMIZED_VERT; + Atom atom__NET_WM_STATE_FULLSCREEN; + Atom atom__NET_WM_PING; + Atom atom__NET_WM_WINDOW_TYPE; + Atom atom__NET_WM_WINDOW_TYPE_NORMAL; + Atom atom__NET_WM_PID; + Atom atom_WM_DELETE_WINDOW; + + b32 has_xfixes; + int xfixes_selection_event; + + int epoll; + + int step_timer_fd; + int step_event_fd; + int x11_fd; + int inotify_fd; + + u64 last_step; + + b32 keep_running; + + Application_Mouse_Cursor cursor; + b32 hide_cursor; + Cursor hidden_cursor; + + void *app_code; + void *custom; + + Thread_Memory *thread_memory; + Thread_Group groups[THREAD_GROUP_COUNT]; + Work_Queue queues[THREAD_GROUP_COUNT]; + pthread_mutex_t locks[LOCK_COUNT]; + pthread_cond_t conds[8]; + sem_t thread_semaphore; + + Partition font_part; + +#if SUPPORT_DPI + i32 dpi_x, dpi_y; +#endif + + Plat_Settings settings; + System_Functions system; + App_Functions app; + Custom_API custom_api; + b32 vsync; + +#if FRED_INTERNAL + Sys_Bubble internal_bubble; + pthread_mutex_t DEBUG_sysmem_lock; +#endif + + Linux_Coroutine coroutine_data[18]; + Linux_Coroutine *coroutine_free; +}; + +// +// Linux globals +// + +globalvar Linux_Vars linuxvars; +globalvar Application_Memory memory_vars; + +// +// Linux forward declarations +// + +internal void LinuxScheduleStep(void); + +internal Plat_Handle LinuxSemToHandle(sem_t*); +internal sem_t* LinuxHandleToSem(Plat_Handle); + +internal Plat_Handle LinuxFDToHandle(int); +internal int LinuxHandleToFD(Plat_Handle); + +internal void LinuxStringDup(String*, void*, size_t); +internal void LinuxToggleFullscreen(Display*, Window); + +internal Sys_Acquire_Lock_Sig(system_acquire_lock); +internal Sys_Release_Lock_Sig(system_release_lock); + +internal void system_wait_cv(i32, i32); +internal void system_signal_cv(i32, i32); + +// +// Linux static assertions +// + +static_assert(sizeof(Plat_Handle) >= sizeof(ucontext_t*), "Plat_Handle not big enough"); +static_assert(sizeof(Plat_Handle) >= sizeof(sem_t*), "Plat_Handle not big enough"); +static_assert(sizeof(Plat_Handle) >= sizeof(int), "Plat_Handle not big enough"); + +// +// Shared system functions (system_shared.h) +// + +internal void* +LinuxGetMemory_(i32 size, i32 line_number, char *file_name){ + void *result = 0; + + Assert(size != 0); + +#if FRED_INTERNAL + result = mmap(0, size + sizeof(Sys_Bubble), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + Sys_Bubble* bubble = (Sys_Bubble*)result; + bubble->flags = 0; + bubble->line_number = line_number; + bubble->file_name = file_name; + bubble->size = size; + + pthread_mutex_lock(&linuxvars.DEBUG_sysmem_lock); + insert_bubble(&linuxvars.internal_bubble, bubble); + pthread_mutex_unlock(&linuxvars.DEBUG_sysmem_lock); + + result = bubble + 1; +#else + size_t real_size = size + sizeof(size_t); + result = mmap(0, real_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if(result == MAP_FAILED){ + perror("mmap"); + result = NULL; + } else { + memcpy(result, &real_size, sizeof(size_t)); + result = (char*)result + sizeof(size_t); + } +#endif + + return(result); +} + +internal void +LinuxFreeMemory(void *block){ + if (block){ +#if FRED_INTERNAL + Sys_Bubble *bubble = ((Sys_Bubble*)block) - 1; + + size_t size = bubble->size + sizeof(Sys_Bubble); + + pthread_mutex_lock(&linuxvars.DEBUG_sysmem_lock); + remove_bubble(bubble); + pthread_mutex_unlock(&linuxvars.DEBUG_sysmem_lock); + + munmap(bubble, size); +#else + block = (char*)block - sizeof(size_t); + size_t size = *(size_t*)block; + munmap(block, size); +#endif + } +} + +internal +Sys_Get_Memory_Sig(system_get_memory_){ + return(LinuxGetMemory_(size, line_number, file_name)); +} + +internal +Sys_Free_Memory_Sig(system_free_memory){ + LinuxFreeMemory(block); +} + + +internal +Sys_File_Can_Be_Made_Sig(system_file_can_be_made){ + b32 result = access(filename, W_OK) == 0; + LINUX_FN_DEBUG("%s = %d", filename, result); + return(result); +} + +internal +Sys_Get_Binary_Path_Sig(system_get_binary_path){ + ssize_t size = readlink("/proc/self/exe", out->str, out->memory_size - 1); + if(size != -1 && size < out->memory_size - 1){ + out->size = size; + remove_last_folder(out); + terminate_with_null(out); + size = out->size; + } else { + size = 0; + } + + return size; +} + +// +// System Functions (4ed_system.h) +// + +// +// Files +// + +internal +Sys_Set_File_List_Sig(system_set_file_list){ + DIR *d; + struct dirent *entry; + char *fname, *cursor, *cursor_start; + File_Info *info_ptr; + i32 count, file_count, size, required_size; + + if(directory.size <= 0){ + if(!directory.str){ + system_free_memory(file_list->block); + file_list->block = 0; + file_list->block_size = 0; + } + file_list->infos = 0; + file_list->count = 0; + return; + } + + char* dir = (char*) alloca(directory.size + 1); + memcpy(dir, directory.str, directory.size); + dir[directory.size] = 0; + + LINUX_FN_DEBUG("%s", dir); + + d = opendir(dir); + if (d){ + count = 0; + file_count = 0; + for (entry = readdir(d); + entry != 0; + entry = readdir(d)){ + fname = entry->d_name; + if(fname[0] == '.' && (fname[1] == 0 || (fname[1] == '.' && fname[2] == 0))){ + continue; + } + ++file_count; + for (size = 0; fname[size]; ++size); + count += size + 1; + } + + required_size = count + file_count * sizeof(File_Info); + if (file_list->block_size < required_size){ + system_free_memory(file_list->block); + file_list->block = system_get_memory(required_size); + } + + file_list->infos = (File_Info*)file_list->block; + cursor = (char*)(file_list->infos + file_count); + + rewinddir(d); + info_ptr = file_list->infos; + for (entry = readdir(d); + entry != 0; + entry = readdir(d)){ + fname = entry->d_name; + if(fname[0] == '.' && (fname[1] == 0 || (fname[1] == '.' && fname[2] == 0))){ + continue; + } + cursor_start = cursor; + for (; *fname; ) *cursor++ = *fname++; + + if(entry->d_type == DT_LNK){ + struct stat st; + if(stat(entry->d_name, &st) != -1){ + info_ptr->folder = S_ISDIR(st.st_mode); + } else { + info_ptr->folder = 0; + } + } else { + info_ptr->folder = entry->d_type == DT_DIR; + } + + info_ptr->filename = cursor_start; + info_ptr->filename_len = (int)(cursor - cursor_start); + *cursor++ = 0; + ++info_ptr; + } + + file_list->count = file_count; + + closedir(d); + } else { + system_free_memory(file_list->block); + file_list->block = 0; + file_list->block_size = 0; + file_list->infos = 0; + file_list->count = 0; + } +} + +internal +Sys_Get_Canonical_Sig(system_get_canonical){ + char* path = (char*) alloca(len + 1); + char* write_p = path; + const char* read_p = filename; + + while(read_p < filename + len){ + if(read_p == filename || read_p[0] == '/'){ + if(read_p[1] == '/'){ + ++read_p; + } else if(read_p[1] == '.'){ + if(read_p[2] == '/' || !read_p[2]){ + read_p += 2; + } else if(read_p[2] == '.' && (read_p[3] == '/' || !read_p[3])){ + while(write_p > path && *--write_p != '/'); + read_p += 3; + } else { + *write_p++ = *read_p++; + } + } else { + *write_p++ = *read_p++; + } + } else { + *write_p++ = *read_p++; + } + } + if(write_p == path) *write_p++ = '/'; + + if(max >= (write_p - path)){ + memcpy(buffer, path, write_p - path); + } else { + write_p = path; + } + +#if FRED_INTERNAL + if(len != (write_p - path) || memcmp(filename, path, len) != 0){ + LINUX_FN_DEBUG("[%.*s] -> [%.*s]", len, filename, (int)(write_p - path), path); + } +#endif + + return write_p - path; +} + +internal +Sys_Load_Handle_Sig(system_load_handle){ + b32 result = 0; + + int fd = open(filename, O_RDONLY); + if(fd == -1){ + perror("open"); + } else { + *(int*)handle_out = fd; + result = 1; + } + + return result; +} + +internal +Sys_Load_Size_Sig(system_load_size){ + u32 result = 0; + + int fd = *(int*)&handle; + struct stat st; + + if(fstat(fd, &st) == -1){ + perror("fstat"); + } else { + result = st.st_size; + } + + return result; +} + +internal +Sys_Load_File_Sig(system_load_file){ + + int fd = *(int*)&handle; + do { + ssize_t n = read(fd, buffer, size); + if(n == -1 && errno != EAGAIN){ + perror("read"); + break; + } else { + size -= n; + buffer += n; + } + } while(size); + + return size == 0; +} + +internal +Sys_Load_Close_Sig(system_load_close){ + b32 result = 1; + + int fd = *(int*)&handle; + if(close(fd) == -1){ + perror("close"); + result = 0; + } + + return result; +} + +internal +Sys_Save_File_Sig(system_save_file){ + b32 result = 0; + int fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 00640); + + LINUX_FN_DEBUG("%s %d", filename, size); + + if(fd < 0){ + fprintf(stderr, "system_save_file: open '%s': %s\n", filename, strerror(errno)); + } else { + do { + ssize_t written = write(fd, buffer, size); + if(written == -1){ + if(errno != EINTR){ + perror("system_save_file: write"); + break; + } + } else { + size -= written; + buffer += written; + } + } while(size); + + close(fd); + } + + return (size == 0); +} + +// +// Time +// + +internal +Sys_Now_Time_Sig(system_now_time){ + struct timespec spec; + u64 result; + + clock_gettime(CLOCK_REALTIME, &spec); + result = (spec.tv_sec * UINT64_C(1000000)) + (spec.tv_nsec / UINT64_C(1000)); + + //LINUX_FN_DEBUG("ts: %" PRIu64, result); + + return(result); +} + +// +// 4coder_custom.h +// + +internal +MEMORY_ALLOCATE_SIG(system_memory_allocate){ + // NOTE(allen): This must return the exact base of the vpage. + // We will count on the user to keep track of size themselves. + void *result = mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if(result == MAP_FAILED){ + perror("mmap"); + result = NULL; + } + return(result); +} + +internal +MEMORY_SET_PROTECTION_SIG(system_memory_set_protection){ + // NOTE(allen): + // There is no such thing as "write only" in windows + // so I just made write = write + read in all cases. + bool32 result = 1; + int protect = 0; + + flags = flags & 0x7; + + switch (flags){ + case 0: + protect = PROT_NONE; break; + + case MemProtect_Read: + protect = PROT_READ; break; + + case MemProtect_Write: + case MemProtect_Read|MemProtect_Write: + protect = PROT_READ | PROT_WRITE; break; + + case MemProtect_Execute: + protect = PROT_EXEC; break; + + case MemProtect_Execute|MemProtect_Read: + protect = PROT_READ | PROT_EXEC; break; + + // NOTE(inso): some W^X protection things might be unhappy about this one + case MemProtect_Execute|MemProtect_Write: + case MemProtect_Execute|MemProtect_Write|MemProtect_Read: + protect = PROT_READ | PROT_WRITE | PROT_EXEC; break; + } + + if(mprotect(ptr, size, protect) == -1){ + result = 0; + perror("mprotect"); + } + + return(result); +} + +internal +MEMORY_FREE_SIG(system_memory_free){ + // NOTE(allen): This must take the exact base of the vpage. + munmap(ptr, size); +} + +internal +FILE_EXISTS_SIG(system_file_exists){ + int result = 0; + char buff[PATH_MAX] = {}; + + if(len + 1 > PATH_MAX){ + fputs("system_directory_has_file: path too long\n", stderr); + } else { + memcpy(buff, filename, len); + buff[len] = 0; + struct stat st; + result = stat(buff, &st) == 0 && S_ISREG(st.st_mode); + } + + LINUX_FN_DEBUG("%s: %d", buff, result); + + return(result); +} + +internal +DIRECTORY_CD_SIG(system_directory_cd){ + String directory = make_string_cap(dir, *len, capacity); + b32 result = 0; + i32 old_size; + + if (rel_path[0] != 0){ + if (rel_path[0] == '.' && rel_path[1] == 0){ + result = 1; + } + else if (rel_path[0] == '.' && rel_path[1] == '.' && rel_path[2] == 0){ + result = remove_last_folder(&directory); + terminate_with_null(&directory); + } + else{ + if (directory.size + rel_len + 1 > directory.memory_size){ + old_size = directory.size; + append_partial_sc(&directory, rel_path); + append_s_char(&directory, '/'); + terminate_with_null(&directory); + + struct stat st; + if (stat(directory.str, &st) == 0 && S_ISDIR(st.st_mode)){ + result = 1; + } + else{ + directory.size = old_size; + } + } + } + } + + *len = directory.size; + + LINUX_FN_DEBUG("%.*s: %d", directory.size, directory.str, result); + + return(result); +} + +internal +GET_4ED_PATH_SIG(system_get_4ed_path){ + String str = make_string_cap(out, 0, capacity); + return(system_get_binary_path(&str)); +} + +internal +SHOW_MOUSE_CURSOR_SIG(system_show_mouse_cursor){ + linuxvars.hide_cursor = !show; + XDefineCursor(linuxvars.XDisplay, linuxvars.XWindow, show ? None : linuxvars.hidden_cursor); +} + +internal +TOGGLE_FULLSCREEN_SIG(system_toggle_fullscreen){ + LinuxToggleFullscreen(linuxvars.XDisplay, linuxvars.XWindow); +} + +internal +IS_FULLSCREEN_SIG(system_is_fullscreen){ + b32 result = 0; + + Atom type, *prop; + unsigned long nitems, pad; + int fmt; + + int ret = XGetWindowProperty(linuxvars.XDisplay, + linuxvars.XWindow, + linuxvars.atom__NET_WM_STATE, + 0, 32, False, XA_ATOM, + &type, + &fmt, + &nitems, + &pad, + (unsigned char**)&prop); + + if(ret == Success && prop){ + result = *prop == linuxvars.atom__NET_WM_STATE_FULLSCREEN; + XFree((unsigned char*)prop); + } + + return result; +} + +// +// Clipboard +// + +internal +Sys_Post_Clipboard_Sig(system_post_clipboard){ + LinuxStringDup(&linuxvars.clipboard_outgoing, str.str, str.size); + XSetSelectionOwner(linuxvars.XDisplay, linuxvars.atom_CLIPBOARD, linuxvars.XWindow, CurrentTime); +} + +// +// Coroutine +// + +internal Linux_Coroutine* +LinuxAllocCoroutine(){ + Linux_Coroutine *result = linuxvars.coroutine_free; + Assert(result != 0); + if(getcontext(&result->ctx) == -1){ + perror("getcontext"); + } + result->ctx.uc_stack = result->stack; + linuxvars.coroutine_free = result->next; + return(result); +} + +internal void +LinuxFreeCoroutine(Linux_Coroutine *data){ + data->next = linuxvars.coroutine_free; + linuxvars.coroutine_free = data; +} + +internal void +LinuxCoroutineMain(void *arg_){ + Linux_Coroutine *c = (Linux_Coroutine*)arg_; + c->coroutine.func(&c->coroutine); + c->done = 1; + LinuxFreeCoroutine(c); + setcontext((ucontext_t*)c->coroutine.yield_handle); +} + +internal +Sys_Create_Coroutine_Sig(system_create_coroutine){ + Linux_Coroutine *c = LinuxAllocCoroutine(); + c->done = 0; + + makecontext(&c->ctx, (void (*)())LinuxCoroutineMain, 1, &c->coroutine); + + *(ucontext_t**)&c->coroutine.plat_handle = &c->ctx; + c->coroutine.func = func; + + return(&c->coroutine); +} + +internal +Sys_Launch_Coroutine_Sig(system_launch_coroutine){ + Linux_Coroutine *c = (Linux_Coroutine*)coroutine; + ucontext_t* ctx = *(ucontext**)&coroutine->plat_handle; + + coroutine->yield_handle = &c->yield_ctx; + coroutine->in = in; + coroutine->out = out; + + swapcontext(&c->yield_ctx, ctx); + + if (c->done){ + LinuxFreeCoroutine(c); + coroutine = 0; + } + + return(coroutine); +} + +internal +Sys_Resume_Coroutine_Sig(system_resume_coroutine){ + Linux_Coroutine *c = (Linux_Coroutine*)coroutine; + void *fiber; + + Assert(!c->done); + + coroutine->yield_handle = &c->yield_ctx; + coroutine->in = in; + coroutine->out = out; + + ucontext *ctx = *(ucontext**)&coroutine->plat_handle; + + swapcontext(&c->yield_ctx, ctx); + + if (c->done){ + LinuxFreeCoroutine(c); + coroutine = 0; + } + + return(coroutine); +} + +internal +Sys_Yield_Coroutine_Sig(system_yield_coroutine){ + swapcontext(*(ucontext_t**)&coroutine->plat_handle, (ucontext*)coroutine->yield_handle); +} + +// +// CLI +// + +internal +Sys_CLI_Call_Sig(system_cli_call){ + LINUX_FN_DEBUG("%s %s", path, script_name); + + int pipe_fds[2]; + if(pipe(pipe_fds) == -1){ + perror("system_cli_call: pipe"); + return 0; + } + + pid_t child_pid = fork(); + if(child_pid == -1){ + perror("system_cli_call: fork"); + return 0; + } + + enum { PIPE_FD_READ, PIPE_FD_WRITE }; + + // child + if(child_pid == 0){ + close(pipe_fds[PIPE_FD_READ]); + dup2(pipe_fds[PIPE_FD_WRITE], STDOUT_FILENO); + dup2(pipe_fds[PIPE_FD_WRITE], STDERR_FILENO); + + if(chdir(path) == -1){ + perror("system_cli_call: chdir"); + exit(1); + }; + + char* argv[] = { "sh", "-c", script_name, NULL }; + + if(execv("/bin/sh", argv) == -1){ + perror("system_cli_call: execv"); + } + exit(1); + } else { + close(pipe_fds[PIPE_FD_WRITE]); + + *(pid_t*)&cli_out->proc = child_pid; + *(int*)&cli_out->out_read = pipe_fds[PIPE_FD_READ]; + *(int*)&cli_out->out_write = pipe_fds[PIPE_FD_WRITE]; + + struct epoll_event e = {}; + e.events = EPOLLIN | EPOLLET; + e.data.u64 = LINUX_4ED_EVENT_CLI; + epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, pipe_fds[PIPE_FD_READ], &e); + } + + return 1; +} + +internal +Sys_CLI_Begin_Update_Sig(system_cli_begin_update){ + // NOTE(inso): I don't think anything needs to be done here. +} + +internal +Sys_CLI_Update_Step_Sig(system_cli_update_step){ + + int pipe_read_fd = *(int*)&cli->out_read; + + fd_set fds; + FD_ZERO(&fds); + FD_SET(pipe_read_fd, &fds); + + struct timeval tv = {}; + + size_t space_left = max; + char* ptr = dest; + + while(space_left > 0 && select(pipe_read_fd + 1, &fds, NULL, NULL, &tv) == 1){ + ssize_t num = read(pipe_read_fd, ptr, space_left); + if(num == -1){ + perror("system_cli_update_step: read"); + } else if(num == 0){ + // NOTE(inso): EOF + break; + } else { + ptr += num; + space_left -= num; + } + } + + *amount = (ptr - dest); + return (ptr - dest) > 0; +} + +internal +Sys_CLI_End_Update_Sig(system_cli_end_update){ + pid_t pid = *(pid_t*)&cli->proc; + b32 close_me = 0; + + int status; + if(pid && waitpid(pid, &status, WNOHANG) > 0){ + close_me = 1; + + cli->exit = WEXITSTATUS(status); + + struct epoll_event e = {}; + epoll_ctl(linuxvars.epoll, EPOLL_CTL_DEL, *(int*)&cli->out_read, &e); + + close(*(int*)&cli->out_read); + close(*(int*)&cli->out_write); + } + + return close_me; +} + +// +// Threads +// + +internal +Sys_Acquire_Lock_Sig(system_acquire_lock){ + pthread_mutex_lock(linuxvars.locks + id); +} + +internal +Sys_Release_Lock_Sig(system_release_lock){ + pthread_mutex_unlock(linuxvars.locks + id); +} + +internal void +system_wait_cv(i32 lock_id, i32 cv_id){ + pthread_cond_wait(linuxvars.conds + cv_id, linuxvars.locks + lock_id); +} + +internal void +system_signal_cv(i32 lock_id, i32 cv_id){ + pthread_cond_signal(linuxvars.conds + cv_id); +} + +internal void* +JobThreadProc(void* lpParameter){ + Thread_Context *thread = (Thread_Context*)lpParameter; + Work_Queue *queue = linuxvars.queues + thread->group_id; + Thread_Group *group = linuxvars.groups + thread->group_id; + + i32 thread_index = thread->id - 1; + + i32 cancel_lock = group->cancel_lock0 + thread_index; + i32 cancel_cv = group->cancel_cv0 + thread_index; + + Thread_Memory *thread_memory = linuxvars.thread_memory + thread_index; + + if (thread_memory->size == 0){ + i32 new_size = Kbytes(64); + thread_memory->data = LinuxGetMemory(new_size); + thread_memory->size = new_size; + } + + for (;;){ + u32 read_index = queue->read_position; + u32 write_index = queue->write_position; + + if (read_index != write_index){ + // NOTE(allen): Previously I was wrapping by the job wrap then + // wrapping by the queue wrap. That was super stupid what was that? + // Now it just wraps by the queue wrap. + u32 next_read_index = (read_index + 1) % QUEUE_WRAP; + u32 safe_read_index = + InterlockedCompareExchange(&queue->read_position, + next_read_index, read_index); + + if (safe_read_index == read_index){ + Full_Job_Data *full_job = queue->jobs + safe_read_index; + // NOTE(allen): This is interlocked so that it plays nice + // with the cancel job routine, which may try to cancel this job + // at the same time that we try to run it + + i32 safe_running_thread = + InterlockedCompareExchange(&full_job->running_thread, + thread->id, THREAD_NOT_ASSIGNED); + + if (safe_running_thread == THREAD_NOT_ASSIGNED){ + thread->job_id = full_job->id; + thread->running = 1; + + full_job->job.callback(&linuxvars.system, + thread, thread_memory, full_job->job.data); + LinuxScheduleStep(); + //full_job->running_thread = 0; + thread->running = 0; + + system_acquire_lock(cancel_lock); + if (thread->cancel){ + thread->cancel = 0; + system_signal_cv(cancel_lock, cancel_cv); + } + system_release_lock(cancel_lock); + } + } + } + else{ + sem_wait(LinuxHandleToSem(queue->semaphore)); + } + } +} + +internal void +initialize_unbounded_queue(Unbounded_Work_Queue *source_queue){ + i32 max = 512; + source_queue->jobs = (Full_Job_Data*)system_get_memory(max*sizeof(Full_Job_Data)); + source_queue->count = 0; + source_queue->max = max; + source_queue->skip = 0; +} + +inline i32 +get_work_queue_available_space(i32 write, i32 read){ + // NOTE(allen): The only time that queue->write_position == queue->read_position + // is allowed is when the queue is empty. Thus if + // queue->write_position+1 == queue->read_position the available space is zero. + // So these computations both end up leaving one slot unused. The only way I can + // think to easily eliminate this is to have read and write wrap at twice the size + // of the underlying array but modulo their values into the array then if write + // has caught up with read it still will not be equal... but lots of modulos... ehh. + + i32 available_space = 0; + if (write >= read){ + available_space = QUEUE_WRAP - (write - read) - 1; + } + else{ + available_space = (read - write) - 1; + } + + return(available_space); +} + +#define UNBOUNDED_SKIP_MAX 128 + +internal void +flush_to_direct_queue(Unbounded_Work_Queue *source_queue, Work_Queue *queue, i32 thread_count){ + // NOTE(allen): It is understood that read_position may be changed by other + // threads but it will only make more space in the queue if it is changed. + // Meanwhile write_position should not ever be changed by anything but the + // main thread in this system, so it will not be interlocked. + u32 read_position = queue->read_position; + u32 write_position = queue->write_position; + u32 available_space = get_work_queue_available_space(write_position, read_position); + u32 available_jobs = source_queue->count - source_queue->skip; + + u32 writable_count = Min(available_space, available_jobs); + + if (writable_count > 0){ + u32 count1 = writable_count; + + if (count1+write_position > QUEUE_WRAP){ + count1 = QUEUE_WRAP - write_position; + } + + u32 count2 = writable_count - count1; + + Full_Job_Data *job_src1 = source_queue->jobs + source_queue->skip; + Full_Job_Data *job_src2 = job_src1 + count1; + + Full_Job_Data *job_dst1 = queue->jobs + write_position; + Full_Job_Data *job_dst2 = queue->jobs; + + Assert((job_src1->id % QUEUE_WRAP) == write_position); + + memcpy(job_dst1, job_src1, sizeof(Full_Job_Data)*count1); + memcpy(job_dst2, job_src2, sizeof(Full_Job_Data)*count2); + queue->write_position = (write_position + writable_count) % QUEUE_WRAP; + + source_queue->skip += writable_count; + + if (source_queue->skip == source_queue->count){ + source_queue->skip = source_queue->count = 0; + } + else if (source_queue->skip > UNBOUNDED_SKIP_MAX){ + u32 left_over = source_queue->count - source_queue->skip; + memmove(source_queue->jobs, source_queue->jobs + source_queue->skip, + sizeof(Full_Job_Data)*left_over); + source_queue->count = left_over; + source_queue->skip = 0; + } + } + + i32 semaphore_release_count = writable_count; + if (semaphore_release_count > thread_count){ + semaphore_release_count = thread_count; + } + + // NOTE(allen): platform dependent portion... + // TODO(allen): pull out the duplicated part once I see + // that this is pretty much the same on linux. + for (i32 i = 0; i < semaphore_release_count; ++i){ + sem_post(LinuxHandleToSem(queue->semaphore)); + } +} + +internal void +flush_thread_group(i32 group_id){ + Thread_Group *group = linuxvars.groups + group_id; + Work_Queue *queue = linuxvars.queues + group_id; + Unbounded_Work_Queue *source_queue = &group->queue; + flush_to_direct_queue(source_queue, queue, group->count); +} + +// Note(allen): post_job puts the job on the unbounded queue. +// The unbounded queue is entirely managed by the main thread. +// The thread safe queue is bounded in size so the unbounded +// queue is periodically flushed into the direct work queue. +internal +Sys_Post_Job_Sig(system_post_job){ + Thread_Group *group = linuxvars.groups + group_id; + Unbounded_Work_Queue *queue = &group->queue; + + u32 result = queue->next_job_id++; + + while (queue->count >= queue->max){ + i32 new_max = queue->max*2; + Full_Job_Data *new_jobs = (Full_Job_Data*) + system_get_memory(new_max*sizeof(Full_Job_Data)); + + memcpy(new_jobs, queue->jobs, queue->count); + + system_free_memory(queue->jobs); + + queue->jobs = new_jobs; + queue->max = new_max; + } + + Full_Job_Data full_job; + + full_job.job = job; + full_job.running_thread = THREAD_NOT_ASSIGNED; + full_job.id = result; + + queue->jobs[queue->count++] = full_job; + + Work_Queue *direct_queue = linuxvars.queues + group_id; + flush_to_direct_queue(queue, direct_queue, group->count); + + return(result); +} + +internal +Sys_Cancel_Job_Sig(system_cancel_job){ + Thread_Group *group = linuxvars.groups + group_id; + Unbounded_Work_Queue *source_queue = &group->queue; + + b32 handled_in_unbounded = false; + if (source_queue->skip < source_queue->count){ + Full_Job_Data *first_job = source_queue->jobs + source_queue->skip; + if (first_job->id <= job_id){ + u32 index = source_queue->skip + (job_id - first_job->id); + Full_Job_Data *job = source_queue->jobs + index; + job->running_thread = 0; + handled_in_unbounded = true; + } + } + + if (!handled_in_unbounded){ + Work_Queue *queue = linuxvars.queues + group_id; + Full_Job_Data *job = queue->jobs + (job_id % QUEUE_WRAP); + Assert(job->id == job_id); + + u32 thread_id = + InterlockedCompareExchange(&job->running_thread, + 0, THREAD_NOT_ASSIGNED); + + if (thread_id != THREAD_NOT_ASSIGNED && thread_id != 0){ + i32 thread_index = thread_id - 1; + + i32 cancel_lock = group->cancel_lock0 + thread_index; + i32 cancel_cv = group->cancel_cv0 + thread_index; + Thread_Context *thread = group->threads + thread_index; + + + system_acquire_lock(cancel_lock); + + thread->cancel = 1; + + system_release_lock(FRAME_LOCK); + do{ + system_wait_cv(cancel_lock, cancel_cv); + }while (thread->cancel == 1); + system_acquire_lock(FRAME_LOCK); + + system_release_lock(cancel_lock); + } + } +} + +internal +Sys_Check_Cancel_Sig(system_check_cancel){ + b32 result = 0; + + Thread_Group *group = linuxvars.groups + thread->group_id; + i32 thread_index = thread->id - 1; + i32 cancel_lock = group->cancel_lock0 + thread_index; + + system_acquire_lock(cancel_lock); + if (thread->cancel){ + result = 1; + } + system_release_lock(cancel_lock); + + return(result); +} + +internal +Sys_Grow_Thread_Memory_Sig(system_grow_thread_memory){ + void *old_data; + i32 old_size, new_size; + + system_acquire_lock(CANCEL_LOCK0 + memory->id - 1); + old_data = memory->data; + old_size = memory->size; + new_size = LargeRoundUp(memory->size*2, Kbytes(4)); + memory->data = system_get_memory(new_size); + memory->size = new_size; + if (old_data){ + memcpy(memory->data, old_data, old_size); + system_free_memory(old_data); + } + system_release_lock(CANCEL_LOCK0 + memory->id - 1); +} + +// +// Debug +// + +#if FRED_INTERNAL + +internal +INTERNAL_Sys_Sentinel_Sig(internal_sentinel){ + return (&linuxvars.internal_bubble); +} + +#ifdef OLD_JOB_QUEUE +internal +INTERNAL_Sys_Get_Thread_States_Sig(internal_get_thread_states){ + Work_Queue *queue = linuxvars.queues + id; + u32 write = queue->write_position; + u32 read = queue->read_position; + if (write < read) write += QUEUE_WRAP; + *pending = (i32)(write - read); + + Thread_Group *group = linuxvars.groups + id; + for (i32 i = 0; i < group->count; ++i){ + running[i] = (group->threads[i].running != 0); + } +} +#else +internal +INTERNAL_Sys_Get_Thread_States_Sig(internal_get_thread_states){ + Thread_Group *group = linuxvars.groups + id; + Unbounded_Work_Queue *source_queue = &group->queue; + Work_Queue *queue = linuxvars.queues + id; + u32 write = queue->write_position; + u32 read = queue->read_position; + if (write < read) write += QUEUE_WRAP; + *pending = (i32)(write - read) + source_queue->count - source_queue->skip; + + for (i32 i = 0; i < group->count; ++i){ + running[i] = (group->threads[i].running != 0); + } +} +#endif + +internal +INTERNAL_Sys_Debug_Message_Sig(internal_debug_message){ + fprintf(stderr, "%s", message); +} + +#endif + +// +// Linux rendering/font system functions +// + +#include "system_shared.cpp" +#include "linux_font.cpp" + +internal f32 +size_change(i32 dpi_x, i32 dpi_y){ + // TODO(allen): We're just hoping dpi_x == dpi_y for now I guess. + f32 size_x = dpi_x / 96.f; + f32 size_y = dpi_y / 96.f; + f32 size_max = Max(size_x, size_y); + return(size_max); +} + +internal +Font_Load_Sig(system_draw_font_load){ + b32 success = 0; + i32 attempts = 0; + + LINUX_FN_DEBUG("%s, %dpt, tab_width: %d", filename, pt_size, tab_width); + + if (linuxvars.font_part.base == 0){ + linuxvars.font_part = sysshared_scratch_partition(Mbytes(8)); + } + + i32 oversample = 2; + +#if SUPPORT_DPI + pt_size = ROUND32(pt_size * size_change(linuxvars.dpi_x, linuxvars.dpi_y)); +#endif + + for(; attempts < 3; ++attempts){ +#if LINUX_FONTS + success = linux_font_load(&linuxvars.font_part, font_out, filename, pt_size, tab_width, + linuxvars.settings.use_hinting); +#else + success = font_load( + &linuxvars.font_part, + font_out, + filename, + pt_size, + tab_width, + oversample, + store_texture + ); +#endif + + if(success){ + break; + } else { + fprintf(stderr, "draw_font_load failed, %p %d\n", linuxvars.font_part.base, linuxvars.font_part.max); + sysshared_partition_double(&linuxvars.font_part); + } + } + + return success; +} + +// +// End of system funcs +// + +// +// Linux init functions +// + +internal b32 +LinuxLoadAppCode(String* base_dir){ + b32 result = 0; + App_Get_Functions *get_funcs = 0; + + if(!sysshared_to_binary_path(base_dir, "4ed_app.so")){ + return 0; + } + + linuxvars.app_code = dlopen(base_dir->str, RTLD_LAZY); + if (linuxvars.app_code){ + get_funcs = (App_Get_Functions*) + dlsym(linuxvars.app_code, "app_get_functions"); + } else { + fprintf(stderr, "dlopen failed: %s\n", dlerror()); + } + + if (get_funcs){ + result = 1; + linuxvars.app = get_funcs(); + } + + return(result); +} + +internal void +LinuxLoadSystemCode(){ + + // files + linuxvars.system.set_file_list = system_set_file_list; + linuxvars.system.get_canonical = system_get_canonical; + linuxvars.system.add_listener = system_add_listener; + linuxvars.system.remove_listener = system_remove_listener; + linuxvars.system.get_file_change = system_get_file_change; + linuxvars.system.load_handle = system_load_handle; + linuxvars.system.load_size = system_load_size; + linuxvars.system.load_file = system_load_file; + linuxvars.system.load_close = system_load_close; + linuxvars.system.save_file = system_save_file; + + // time + linuxvars.system.now_time = system_now_time; + + // 4coder_custom.h + linuxvars.system.memory_allocate = system_memory_allocate; + linuxvars.system.memory_set_protection = system_memory_set_protection; + linuxvars.system.memory_free = system_memory_free; + linuxvars.system.file_exists = system_file_exists; + linuxvars.system.directory_cd = system_directory_cd; + linuxvars.system.get_4ed_path = system_get_4ed_path; + linuxvars.system.show_mouse_cursor = system_show_mouse_cursor; + linuxvars.system.toggle_fullscreen = system_toggle_fullscreen; + linuxvars.system.is_fullscreen = system_is_fullscreen; + + // clipboard + linuxvars.system.post_clipboard = system_post_clipboard; + + // coroutine + linuxvars.system.create_coroutine = system_create_coroutine; + linuxvars.system.launch_coroutine = system_launch_coroutine; + linuxvars.system.resume_coroutine = system_resume_coroutine; + linuxvars.system.yield_coroutine = system_yield_coroutine; + + // cli + 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; + + // threads + linuxvars.system.post_job = system_post_job; + linuxvars.system.cancel_job = system_cancel_job; + linuxvars.system.check_cancel = system_check_cancel; + linuxvars.system.grow_thread_memory = system_grow_thread_memory; + linuxvars.system.acquire_lock = system_acquire_lock; + linuxvars.system.release_lock = system_release_lock; + + // debug +#if FRED_INTERNAL + linuxvars.system.internal_sentinel = internal_sentinel; + linuxvars.system.internal_get_thread_states = internal_get_thread_states; + linuxvars.system.internal_debug_message = internal_debug_message; +#endif + + // non-function details + linuxvars.system.slash = '/'; +} + +internal void +LinuxLoadRenderCode(){ + linuxvars.target.push_clip = draw_push_clip; + linuxvars.target.pop_clip = draw_pop_clip; + linuxvars.target.push_piece = draw_push_piece; + + linuxvars.target.font_set.font_load = system_draw_font_load; + linuxvars.target.font_set.release_font = draw_release_font; +} + +// +// Renderer +// + +internal void +LinuxRedrawTarget(){ + launch_rendering(&linuxvars.target); + //glFlush(); + glXSwapBuffers(linuxvars.XDisplay, linuxvars.XWindow); +} + +internal void +LinuxResizeTarget(i32 width, i32 height){ + if (width > 0 && height > 0){ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, width, height, 0, -1, 1); + glScissor(0, 0, width, height); + + linuxvars.target.width = width; + linuxvars.target.height = height; + } +} + +// +// OpenGL init +// + +// NOTE(allen): Thanks to Casey for providing the linux OpenGL launcher. +static bool ctxErrorOccurred = false; + +internal int +ctxErrorHandler( Display *dpy, XErrorEvent *ev ) +{ + ctxErrorOccurred = true; + return 0; +} + +#if FRED_INTERNAL + +static void LinuxGLDebugCallback( + GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam +){ + fprintf(stderr, "GL DEBUG: %s\n", message); +} + +#endif + +internal GLXContext +InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc, b32 &IsLegacy) +{ + IsLegacy = false; + + typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*); + + typedef PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXTProc; + typedef PFNGLXSWAPINTERVALMESAPROC glXSwapIntervalMESAProc; + typedef PFNGLXGETSWAPINTERVALMESAPROC glXGetSwapIntervalMESAProc; + typedef PFNGLXSWAPINTERVALSGIPROC glXSwapIntervalSGIProc; + + const char *glxExts = glXQueryExtensionsString(XDisplay, DefaultScreen(XDisplay)); + + #define GLXLOAD(x) x ## Proc x = (x ## Proc) glXGetProcAddressARB( (const GLubyte*) #x); + + GLXLOAD(glXCreateContextAttribsARB); + + GLXContext ctx = 0; + ctxErrorOccurred = false; + int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&ctxErrorHandler); + + if (!glXCreateContextAttribsARB) + { + fprintf(stderr, "glXCreateContextAttribsARB() not found, using old-style GLX context\n" ); + ctx = glXCreateNewContext( XDisplay, bestFbc, GLX_RGBA_TYPE, 0, True ); + } + else + { + int context_attribs[] = + { + GLX_CONTEXT_MAJOR_VERSION_ARB, 4, + GLX_CONTEXT_MINOR_VERSION_ARB, 3, + GLX_CONTEXT_PROFILE_MASK_ARB , GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, +#if FRED_INTERNAL + GLX_CONTEXT_FLAGS_ARB , GLX_CONTEXT_DEBUG_BIT_ARB, +#endif + None + }; + + fprintf(stderr, "Creating GL 4.3 context...\n"); + ctx = glXCreateContextAttribsARB(XDisplay, bestFbc, 0, True, context_attribs); + + XSync( XDisplay, False ); + if (!ctxErrorOccurred && ctx) + { + fprintf(stderr, "Created GL 4.3 context.\n" ); + } + else + { + ctxErrorOccurred = false; + + context_attribs[1] = 3; + context_attribs[3] = 2; + + fprintf(stderr, "GL 4.3 unavailable, creating GL 3.2 context...\n" ); + ctx = glXCreateContextAttribsARB( XDisplay, bestFbc, 0, True, context_attribs ); + + XSync(XDisplay, False); + + if (!ctxErrorOccurred && ctx) + { + fprintf(stderr, "Created GL 3.2 context.\n" ); + } + else + { + context_attribs[1] = 1; + context_attribs[3] = 2; + + ctxErrorOccurred = false; + + fprintf(stderr, "Failed to create GL 3.2 context, using old-style GLX context\n"); + ctx = glXCreateContextAttribsARB(XDisplay, bestFbc, 0, True, context_attribs); + + IsLegacy = true; + } + } + } + + XSync(XDisplay, False); + XSetErrorHandler(oldHandler); + + if (ctxErrorOccurred || !ctx) + { + fprintf(stderr, "Failed to create an OpenGL context\n"); + exit(1); + } + + b32 Direct; + if (!glXIsDirect(XDisplay, ctx)) + { + fprintf(stderr, "Indirect GLX rendering context obtained\n"); + Direct = 0; + } + else + { + fprintf(stderr, "Direct GLX rendering context obtained\n"); + Direct = 1; + } + + fprintf(stderr, "Making context current\n"); + glXMakeCurrent( XDisplay, XWindow, ctx ); + + char *Vendor = (char *)glGetString(GL_VENDOR); + char *Renderer = (char *)glGetString(GL_RENDERER); + char *Version = (char *)glGetString(GL_VERSION); + + //TODO(inso): glGetStringi is required in core profile if the GL version is >= 3.0 + char *Extensions = (char *)glGetString(GL_EXTENSIONS); + + fprintf(stderr, "GL_VENDOR: %s\n", Vendor); + fprintf(stderr, "GL_RENDERER: %s\n", Renderer); + fprintf(stderr, "GL_VERSION: %s\n", Version); + // fprintf(stderr, "GL_EXTENSIONS: %s\n", Extensions); + + //NOTE(inso): enable vsync if available. this should probably be optional + if(Direct && strstr(glxExts, "GLX_EXT_swap_control ")){ + + GLXLOAD(glXSwapIntervalEXT); + + if(glXSwapIntervalEXT){ + glXSwapIntervalEXT(XDisplay, XWindow, 1); + + unsigned int swap_val = 0; + glXQueryDrawable(XDisplay, XWindow, GLX_SWAP_INTERVAL_EXT, &swap_val); + + linuxvars.vsync = swap_val == 1; + fprintf(stderr, "VSync enabled? %s.\n", linuxvars.vsync ? "Yes" : "No"); + } + + } else if(Direct && strstr(glxExts, "GLX_MESA_swap_control ")){ + + GLXLOAD(glXSwapIntervalMESA); + GLXLOAD(glXGetSwapIntervalMESA); + + if(glXSwapIntervalMESA){ + glXSwapIntervalMESA(1); + + if(glXGetSwapIntervalMESA){ + linuxvars.vsync = glXGetSwapIntervalMESA(); + fprintf(stderr, "VSync enabled? %s (MESA)\n", linuxvars.vsync ? "Yes" : "No"); + } else { + // NOTE(inso): assume it worked? + linuxvars.vsync = 1; + fputs("VSync enabled? possibly (MESA)\n", stderr); + } + } + + } else if(Direct && strstr(glxExts, "GLX_SGI_swap_control ")){ + + GLXLOAD(glXSwapIntervalSGI); + + if(glXSwapIntervalSGI){ + glXSwapIntervalSGI(1); + + //NOTE(inso): The SGI one doesn't seem to have a way to confirm we got it... + linuxvars.vsync = 1; + fputs("VSync enabled? hopefully (SGI)\n", stderr); + } + + } else { + fputs("VSync enabled? nope, no suitable extension\n", stderr); + } + +#if FRED_INTERNAL + typedef PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackProc; + + GLXLOAD(glDebugMessageCallback); + + if(glDebugMessageCallback){ + fputs("Enabling GL Debug Callback\n", stderr); + glDebugMessageCallback(&LinuxGLDebugCallback, 0); + glEnable(GL_DEBUG_OUTPUT); + } +#endif + + glEnable(GL_TEXTURE_2D); + glEnable(GL_SCISSOR_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + +#undef GLXLOAD + + return(ctx); +} + +internal b32 +GLXCanUseFBConfig(Display *XDisplay) +{ + b32 Result = false; + + int GLXMajor, GLXMinor; + + char *XVendor = ServerVendor(XDisplay); + fprintf(stderr, "XWindows vendor: %s\n", XVendor); + if(glXQueryVersion(XDisplay, &GLXMajor, &GLXMinor)) + { + fprintf(stderr, "GLX version %d.%d\n", GLXMajor, GLXMinor); + if(((GLXMajor == 1 ) && (GLXMinor >= 3)) || (GLXMajor > 1)) + { + Result = true; + } + } + + return(Result); +} + +typedef struct glx_config_result{ + b32 Found; + GLXFBConfig BestConfig; + XVisualInfo BestInfo; +} glx_config_result; + +internal glx_config_result +ChooseGLXConfig(Display *XDisplay, int XScreenIndex) +{ + glx_config_result Result = {0}; + + int DesiredAttributes[] = + { + GLX_X_RENDERABLE , True, + GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT, + GLX_RENDER_TYPE , GLX_RGBA_BIT, + GLX_X_VISUAL_TYPE , GLX_TRUE_COLOR, + GLX_RED_SIZE , 8, + GLX_GREEN_SIZE , 8, + GLX_BLUE_SIZE , 8, + GLX_ALPHA_SIZE , 8, + GLX_DEPTH_SIZE , 24, + GLX_STENCIL_SIZE , 8, + GLX_DOUBLEBUFFER , True, + //GLX_SAMPLE_BUFFERS , 1, + //GLX_SAMPLES , 4, + None + }; + + int ConfigCount = 0; + GLXFBConfig *Configs = glXChooseFBConfig(XDisplay, + XScreenIndex, + DesiredAttributes, + &ConfigCount); + if(Configs && ConfigCount > 0) + { + XVisualInfo* VI = glXGetVisualFromFBConfig(XDisplay, Configs[0]); + if(VI) + { + Result.Found = true; + Result.BestConfig = Configs[0]; + Result.BestInfo = *VI; + + int id = 0; + glXGetFBConfigAttrib(XDisplay, Result.BestConfig, GLX_FBCONFIG_ID, &id); + fprintf(stderr, "Using FBConfig: %d (0x%x)\n", id, id); + + XFree(VI); + } + + XFree(Configs); + } + + return(Result); +} + +// +// X11 input / events init +// + +struct Init_Input_Result{ + XIM input_method; + XIMStyle best_style; + XIC xic; +}; + +inline Init_Input_Result +init_input_result_zero(){ + Init_Input_Result result={0}; + return(result); +} + +internal Init_Input_Result +LinuxInputInit(Display *dpy, Window XWindow) +{ + Init_Input_Result result = {}; + XIMStyles *styles = 0; + XIMStyle style; + unsigned long xim_event_mask = 0; + i32 i; + + setlocale(LC_ALL, ""); + XSetLocaleModifiers(""); + fprintf(stderr, "Supported locale?: %s.\n", XSupportsLocale() ? "Yes" : "No"); + // TODO(inso): handle the case where it isn't supported somehow? + + result.input_method = XOpenIM(dpy, 0, 0, 0); + if (!result.input_method){ + // NOTE(inso): Try falling back to the internal XIM implementation that + // should in theory always exist. + + XSetLocaleModifiers("@im=none"); + result.input_method = XOpenIM(dpy, 0, 0, 0); + } + + if (result.input_method){ + if (!XGetIMValues(result.input_method, XNQueryInputStyle, &styles, NULL) && styles){ + for (i = 0; i < styles->count_styles; ++i){ + style = styles->supported_styles[i]; + if (style == (XIMPreeditNothing | XIMStatusNothing)){ + result.best_style = style; + break; + } + } + } + + if (result.best_style){ + XFree(styles); + + result.xic = XCreateIC( + result.input_method, + XNInputStyle, result.best_style, + XNClientWindow, XWindow, + XNFocusWindow, XWindow, + NULL + ); + + if (XGetICValues(result.xic, XNFilterEvents, &xim_event_mask, NULL)){ + xim_event_mask = 0; + } + } + else{ + result = init_input_result_zero(); + fputs("Could not get minimum required input style.\n", stderr); + } + } + else{ + result = init_input_result_zero(); + fputs("Could not open X Input Method.\n", stderr); + } + + XSelectInput( + linuxvars.XDisplay, + linuxvars.XWindow, + ExposureMask | + KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | + EnterWindowMask | LeaveWindowMask | + PointerMotionMask | + FocusChangeMask | + StructureNotifyMask | + MappingNotify | + ExposureMask | + VisibilityChangeMask | + xim_event_mask + ); + + return(result); +} + +// +// Keyboard handling funcs +// + +globalvar u8 keycode_lookup_table[255]; + +internal void +LinuxKeycodeInit(Display* dpy){ + + // NOTE(inso): This looks a bit dumb, but it's the best way I can think of to do it, since: + // KeySyms are the type representing "virtual" keys, like XK_BackSpace, but they are 32-bit ints. + // KeyCodes are guaranteed to fit in 1 byte (and therefore the keycode_lookup_table) but + // have dynamic numbers assigned by the XServer. + // There is XKeysymToKeycode, but it only returns 1 KeyCode for a KeySym. I have my capslock + // rebound to esc, so there are two KeyCodes for the XK_Escape KeyCode but XKeysymToKeycode only + // gets one of them, hence the need for this crazy lookup which works correctly with rebound keys. + + memset(keycode_lookup_table, 0, sizeof(keycode_lookup_table)); + + struct SymMapping { + KeySym sym; + u8 code; + } sym_table[] = { + { XK_BackSpace, key_back }, + { XK_Delete, key_del }, + { XK_Up, key_up }, + { XK_Down, key_down }, + { XK_Left, key_left }, + { XK_Right, key_right }, + { XK_Insert, key_insert }, + { XK_Home, key_home }, + { XK_End, key_end }, + { XK_Page_Up, key_page_up }, + { XK_Page_Down, key_page_down }, + { XK_Escape, key_esc }, + { XK_F1, key_f1 }, + { XK_F2, key_f2 }, + { XK_F3, key_f3 }, + { XK_F4, key_f4 }, + { XK_F5, key_f5 }, + { XK_F6, key_f6 }, + { XK_F7, key_f7 }, + { XK_F8, key_f8 }, + { XK_F9, key_f9 }, + { XK_F10, key_f10 }, + { XK_F11, key_f11 }, + { XK_F12, key_f12 }, + { XK_F13, key_f13 }, + { XK_F14, key_f14 }, + { XK_F15, key_f15 }, + { XK_F16, key_f16 }, + }; + + const int table_size = sizeof(sym_table) / sizeof(struct SymMapping); + + int key_min, key_max, syms_per_code; + XDisplayKeycodes(dpy, &key_min, &key_max); + + int key_count = (key_max - key_min) + 1; + + KeySym* syms = XGetKeyboardMapping( + dpy, + key_min, + key_count, + &syms_per_code + ); + + if(!syms) return; + + int key = key_min; + for(int i = 0; i < key_count * syms_per_code; ++i){ + for(int j = 0; j < table_size; ++j){ + if(sym_table[j].sym == syms[i]){ + keycode_lookup_table[key + (i/syms_per_code)] = sym_table[j].code; + break; + } + } + } + + XFree(syms); + +} + +internal void +LinuxPushKey(u8 code, u8 chr, u8 chr_nocaps, b8 (*mods)[MDFR_INDEX_COUNT], b32 is_hold) +{ + i32 *count; + Key_Event_Data *data; + + if(is_hold){ + count = &linuxvars.input.keys.hold_count; + data = linuxvars.input.keys.hold; + } else { + count = &linuxvars.input.keys.press_count; + data = linuxvars.input.keys.press; + } + + if(*count < KEY_INPUT_BUFFER_SIZE){ + data[*count].keycode = code; + data[*count].character = chr; + data[*count].character_no_caps_lock = chr_nocaps; + + memcpy(data[*count].modifiers, *mods, sizeof(*mods)); + + ++(*count); + } +} + +// +// Misc utility funcs +// + +internal Plat_Handle +LinuxSemToHandle(sem_t* sem){ + return *(Plat_Handle*)&sem; +} + +internal sem_t* +LinuxHandleToSem(Plat_Handle h){ + return *(sem_t**)&h; +} + +internal Plat_Handle +LinuxFDToHandle(int fd){ + return *(Plat_Handle*)&fd; +} + +internal int +LinuxHandleToFD(Plat_Handle h){ + return *(int*)&h; +} + +internal void +LinuxStringDup(String* str, void* data, size_t size){ + if(str->memory_size < size){ + if(str->str){ + LinuxFreeMemory(str->str); + } + str->memory_size = size; + str->str = (char*)LinuxGetMemory(size); + //TODO(inso): handle alloc failure case + } + + str->size = size; + memcpy(str->str, data, size); +} + +internal void +LinuxScheduleStep(void) +{ + u64 now = system_now_time(); + u64 diff = (now - linuxvars.last_step); + + if(diff > (u64)frame_useconds){ + u64 ev = 1; + write(linuxvars.step_event_fd, &ev, sizeof(ev)); + } else { + struct itimerspec its = {}; + timerfd_gettime(linuxvars.step_timer_fd, &its); + + if(its.it_value.tv_sec == 0 && its.it_value.tv_nsec == 0){ + its.it_value.tv_nsec = (frame_useconds - diff) * 1000UL; + timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL); + } + } +} + +// +// X11 utility funcs +// + +internal void +LinuxSetWMState(Display* d, Window w, Atom one, Atom two, int mode) +{ + //NOTE(inso): this will only work after it is mapped + + enum { STATE_REMOVE, STATE_ADD, STATE_TOGGLE }; + + XEvent e = {}; + + e.xany.type = ClientMessage; + e.xclient.message_type = linuxvars.atom__NET_WM_STATE; + e.xclient.format = 32; + e.xclient.window = w; + e.xclient.data.l[0] = mode; + e.xclient.data.l[1] = one; + e.xclient.data.l[2] = two; + e.xclient.data.l[3] = 1L; + + XSendEvent( + d, + RootWindow(d, 0), + 0, + SubstructureNotifyMask | SubstructureRedirectMask, + &e + ); +} + +internal void +LinuxMaximizeWindow(Display* d, Window w, b32 maximize) +{ + LinuxSetWMState(d, + w, + linuxvars.atom__NET_WM_STATE_MAXIMIZED_HORZ, + linuxvars.atom__NET_WM_STATE_MAXIMIZED_VERT, + maximize != 0); +} + +internal void +LinuxToggleFullscreen(Display* d, Window w) +{ + LinuxSetWMState(d, w, linuxvars.atom__NET_WM_STATE_FULLSCREEN, 0, 2); +} + +#include "linux_icon.h" +internal void +LinuxSetIcon(Display* d, Window w) +{ + Atom WM_ICON = XInternAtom(d, "_NET_WM_ICON", False); + + XChangeProperty( + d, + w, + WM_ICON, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char*)linux_icon, + sizeof(linux_icon) / sizeof(long) + ); +} + +internal void +LinuxX11ConnectionWatch(Display* dpy, XPointer cdata, int fd, Bool opening, XPointer* wdata) +{ + struct epoll_event e = {}; + e.events = EPOLLIN | EPOLLET; + e.data.u64 = LINUX_4ED_EVENT_X11_INTERNAL | fd; + + int op = opening ? EPOLL_CTL_ADD : EPOLL_CTL_DEL; + epoll_ctl(linuxvars.epoll, op, fd, &e); +} + +// NOTE(inso): this was a quick hack, might need some cleanup. +internal void +LinuxFatalErrorMsg(const char* msg) +{ + fprintf(stderr, "Fatal Error: %s\n", msg); + + Display *dpy = XOpenDisplay(0); + if(!dpy){ + exit(1); + } + + int win_w = 450; + int win_h = 150 + (strlen(msg) / 40) * 24; + + Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, win_w, win_h, 0, 0, 0x2EA44F); + XStoreName(dpy, w, "4coder Error"); + + XSizeHints* sh = XAllocSizeHints(); + sh->flags = PMinSize; + sh->min_width = win_w; + sh->min_height = win_h; + XSetWMNormalHints(dpy, w, sh); + + Atom type = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); + + XChangeProperty(dpy, w, + XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False), + XA_ATOM, + 32, + PropModeReplace, + (unsigned char*) &type, + 1); + + Atom WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", False); + XSetWMProtocols(dpy, w, &WM_DELETE_WINDOW, 1); + + XMapRaised(dpy, w); + XSync(dpy, False); + + XSelectInput(dpy, w, ExposureMask | StructureNotifyMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask); + + XFontStruct* font = XLoadQueryFont(dpy, "-*-fixed-*-*-*-*-*-140-*-*-*-*-iso8859-1"); + if(!font){ + exit(1); + } + + XGCValues gcv; + gcv.foreground = WhitePixel(dpy, 0); + gcv.background = 0x2EA44F; + gcv.line_width = 2; + gcv.font = font->fid; + + GC gc = XCreateGC(dpy, w, GCForeground | GCBackground | GCFont | GCLineWidth, &gcv); + + gcv.foreground = BlackPixel(dpy, 0); + GC gc2 = XCreateGC(dpy, w, GCForeground | GCBackground | GCFont | GCLineWidth, &gcv); + + int button_trigger = 0; + int button_hi = 0; + + XEvent ev; + while(1){ + XNextEvent(dpy, &ev); + + int redraw = 0; + + if(ev.type == Expose) redraw = 1; + + if(ev.type == ConfigureNotify){ + redraw = 1; + + win_w = ev.xconfigure.width; + win_h = ev.xconfigure.height; + } + + XRectangle button_rect = { win_w/2-40, win_h*0.8f, 80, 20 }; + + if(ev.type == MotionNotify){ + int new_hi = (ev.xmotion.x > button_rect.x && + ev.xmotion.y > button_rect.y && + ev.xmotion.x < button_rect.x + button_rect.width && + ev.xmotion.y < button_rect.y + button_rect.height); + + if(new_hi != button_hi){ + button_hi = new_hi; + redraw = 1; + } + } + + if(ev.type == ButtonPress && ev.xbutton.button == Button1){ + if(button_hi) button_trigger = 1; + redraw = 1; + } + + if(ev.type == ButtonRelease && ev.xbutton.button == Button1){ + if(button_trigger){ + if(button_hi){ + exit(1); + } else { + button_trigger = 0; + } + } + redraw = 1; + } + + if(ev.type == ClientMessage && ev.xclient.window == w && (Atom)ev.xclient.data.l[0] == WM_DELETE_WINDOW){ + exit(1); + } + + if(redraw){ + XClearWindow(dpy, w); + + const char* line_start = msg; + const char* last_space = NULL; + int y = 30; + + { + const char title[] = "4coder - Fatal Error"; + int width = XTextWidth(font, title, sizeof(title)-1); + int x = (win_w/2) - (width/2); + XDrawString(dpy, w, gc2, x+2, y+2, title, sizeof(title)-1); + XDrawString(dpy, w, gc, x, y, title, sizeof(title)-1); + } + + y += 36; + + int width = XTextWidth(font, "x", 1) * 40; + int x = (win_w/2) - (width/2); + for(const char* p = line_start; *p; ++p){ + if(*p == ' ') last_space = p; + if(p - line_start > 40){ + if(!last_space) last_space = p; + + XDrawString(dpy, w, gc2, x+2, y+2, line_start, last_space - line_start); + XDrawString(dpy, w, gc, x, y, line_start, last_space - line_start); + line_start = *last_space == ' ' ? last_space + 1 : p; + last_space = NULL; + y += 18; + } + } + + XDrawString(dpy, w, gc2, x+2, y+2, line_start, strlen(line_start)); + XDrawString(dpy, w, gc, x, y, line_start, strlen(line_start)); + + XDrawRectangles(dpy, w, gc, &button_rect, 1); + if(button_hi || button_trigger){ + XDrawRectangle(dpy, w, gc2, button_rect.x+1, button_rect.y+1, button_rect.width-2, button_rect.height-2); + } + XDrawString(dpy, w, gc2, button_rect.x + 22, button_rect.y + 17, "Drat!", 5); + XDrawString(dpy, w, gc, button_rect.x + 20, button_rect.y + 15, "Drat!", 5); + } + } +} + +internal int +LinuxGetXSettingsDPI(Display* dpy, int screen) +{ + struct XSettingHeader { + u8 type; + u8 pad0; + u16 name_len; + char name[0]; + }; + + struct XSettings { + u8 byte_order; + u8 pad[3]; + u32 serial; + u32 num_settings; + }; + + enum { XSettingsTypeInt, XSettingsTypeString, XSettingsTypeColor }; + + int dpi = -1; + unsigned char* prop = NULL; + char sel_buffer[64]; + struct XSettings* xs; + const char* p; + + snprintf(sel_buffer, sizeof(sel_buffer), "_XSETTINGS_S%d", screen); + + Atom XSET_SEL = XInternAtom(dpy, sel_buffer, True); + Atom XSET_SET = XInternAtom(dpy, "_XSETTINGS_SETTINGS", True); + + if(XSET_SEL == None || XSET_SET == None){ + fputs("XSETTINGS unavailable.\n", stderr); + return dpi; + } + + Window xset_win = XGetSelectionOwner(dpy, XSET_SEL); + if(xset_win == None){ + // TODO(inso): listen for the ClientMessage about it becoming available? + // there's not much point atm if DPI scaling is only done at startup + goto out; + } + + { + Atom type; + int fmt; + unsigned long pad, num; + + if(XGetWindowProperty(dpy, xset_win, XSET_SET, 0, 1024, False, XSET_SET, &type, &fmt, &num, &pad, &prop) != Success){ + fputs("XSETTINGS: GetWindowProperty failed.\n", stderr); + goto out; + } + + if(fmt != 8){ + fputs("XSETTINGS: Wrong format.\n", stderr); + goto out; + } + } + + xs = (struct XSettings*)prop; + p = (char*)(xs + 1); + + if(xs->byte_order != 0){ + fputs("FIXME: XSETTINGS not host byte order?\n", stderr); + goto out; + } + + for(int i = 0; i < xs->num_settings; ++i){ + struct XSettingHeader* h = (struct XSettingHeader*)p; + + // const char* strs[] = { "Int", "String", "Color" }; + // printf("%s:\t\"%.*s\"\n", strs[h->type], h->name_len, h->name); + + p += sizeof(struct XSettingHeader); + p += h->name_len; + p += ((4 - (h->name_len & 3)) & 3); + p += 4; // serial + + switch(h->type){ + case XSettingsTypeInt: { + if(strncmp(h->name, "Xft/DPI", h->name_len) == 0){ + dpi = *(i32*)p; + if(dpi != -1) dpi /= 1024; + } + p += 4; + } break; + + case XSettingsTypeString: { + u32 len = *(u32*)p; + p += 4; + p += len; + p += ((4 - (len & 3)) & 3); + } break; + + case XSettingsTypeColor: { + p += 8; + } break; + + default: { + fputs("XSETTINGS: Got invalid type...\n", stderr); + goto out; + } break; + } + } + +out: + if(prop){ + XFree(prop); + } + + return dpi; +} + +// +// X11 window init +// + +internal b32 +LinuxX11WindowInit(int argc, char** argv, int* WinWidth, int* WinHeight) +{ + // NOTE(allen): Here begins the linux screen setup stuff. + // Behold the true nature of this wonderful OS: + // (thanks again to Casey for providing this stuff) + +#define BASE_W 800 +#define BASE_H 600 + + if (linuxvars.settings.set_window_size){ + *WinWidth = linuxvars.settings.window_w; + *WinHeight = linuxvars.settings.window_h; + } else { + *WinWidth = BASE_W * size_change(linuxvars.dpi_x, linuxvars.dpi_y); + *WinHeight = BASE_H * size_change(linuxvars.dpi_x, linuxvars.dpi_y); + } + + if (!GLXCanUseFBConfig(linuxvars.XDisplay)){ + LinuxFatalErrorMsg("Your XServer's GLX version is too old. GLX 1.3+ is required."); + return false; + } + + glx_config_result Config = ChooseGLXConfig(linuxvars.XDisplay, DefaultScreen(linuxvars.XDisplay)); + if (!Config.Found){ + LinuxFatalErrorMsg("Could not get a matching GLX FBConfig. Check your OpenGL drivers are installed correctly."); + return false; + } + + XSetWindowAttributes swa = {}; + swa.backing_store = WhenMapped; + swa.event_mask = StructureNotifyMask; + swa.bit_gravity = NorthWestGravity; + swa.colormap = XCreateColormap(linuxvars.XDisplay, + RootWindow(linuxvars.XDisplay, Config.BestInfo.screen), + Config.BestInfo.visual, AllocNone); + + linuxvars.XWindow = + XCreateWindow(linuxvars.XDisplay, + RootWindow(linuxvars.XDisplay, Config.BestInfo.screen), + 0, 0, *WinWidth, *WinHeight, + 0, Config.BestInfo.depth, InputOutput, + Config.BestInfo.visual, + CWBackingStore|CWBitGravity|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &swa); + + if (!linuxvars.XWindow){ + LinuxFatalErrorMsg("XCreateWindow failed. Make sure your display is set up correctly."); + return false; + } + + //NOTE(inso): Set the window's type to normal + XChangeProperty( + linuxvars.XDisplay, + linuxvars.XWindow, + linuxvars.atom__NET_WM_WINDOW_TYPE, + XA_ATOM, + 32, + PropModeReplace, + (unsigned char*)&linuxvars.atom__NET_WM_WINDOW_TYPE_NORMAL, + 1 + ); + + //NOTE(inso): window managers want the PID as a window property for some reason. + pid_t pid = getpid(); + XChangeProperty( + linuxvars.XDisplay, + linuxvars.XWindow, + linuxvars.atom__NET_WM_PID, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char*)&pid, + 1 + ); + +#define WINDOW_NAME "4coder 4linux: " VERSION + + //NOTE(inso): set wm properties + XStoreName(linuxvars.XDisplay, linuxvars.XWindow, WINDOW_NAME); + + XSizeHints *sz_hints = XAllocSizeHints(); + XWMHints *wm_hints = XAllocWMHints(); + XClassHint *cl_hints = XAllocClassHint(); + + sz_hints->flags = PMinSize | PMaxSize | PWinGravity; + + sz_hints->min_width = 50; + sz_hints->min_height = 50; + + sz_hints->max_width = sz_hints->max_height = (1UL << 16UL); + +/* NOTE(inso): fluxbox thinks this is minimum, so don't set it + sz_hints->base_width = BASE_W; + sz_hints->base_height = BASE_H; +*/ + sz_hints->win_gravity = NorthWestGravity; + + if (linuxvars.settings.set_window_pos){ + sz_hints->flags |= USPosition; + sz_hints->x = linuxvars.settings.window_x; + sz_hints->y = linuxvars.settings.window_y; + } + + wm_hints->flags |= InputHint | StateHint; + wm_hints->input = True; + wm_hints->initial_state = NormalState; + + cl_hints->res_name = "4coder"; + cl_hints->res_class = "4coder"; + + char* win_name_list[] = { WINDOW_NAME }; + XTextProperty win_name; + XStringListToTextProperty(win_name_list, 1, &win_name); + + XSetWMProperties( + linuxvars.XDisplay, + linuxvars.XWindow, + &win_name, NULL, + argv, argc, + sz_hints, wm_hints, cl_hints + ); + + XFree(win_name.value); + + XFree(sz_hints); + XFree(wm_hints); + XFree(cl_hints); + + LinuxSetIcon(linuxvars.XDisplay, linuxvars.XWindow); + + //NOTE(inso): make the window visible + XMapWindow(linuxvars.XDisplay, linuxvars.XWindow); + + b32 IsLegacy = false; + GLXContext GLContext = + InitializeOpenGLContext(linuxvars.XDisplay, linuxvars.XWindow, Config.BestConfig, IsLegacy); + + XRaiseWindow(linuxvars.XDisplay, linuxvars.XWindow); + + if (linuxvars.settings.set_window_pos){ + XMoveWindow( + linuxvars.XDisplay, + linuxvars.XWindow, + linuxvars.settings.window_x, + linuxvars.settings.window_y + ); + } + + if (linuxvars.settings.maximize_window){ + LinuxMaximizeWindow(linuxvars.XDisplay, linuxvars.XWindow, 1); + } + else if(linuxvars.settings.fullscreen_window){ + LinuxToggleFullscreen(linuxvars.XDisplay, linuxvars.XWindow); + } + + XSync(linuxvars.XDisplay, False); + + XWindowAttributes WinAttribs; + if (XGetWindowAttributes(linuxvars.XDisplay, linuxvars.XWindow, &WinAttribs)) + { + *WinWidth = WinAttribs.width; + *WinHeight = WinAttribs.height; + } + + Atom wm_protos[] = { + linuxvars.atom_WM_DELETE_WINDOW, + linuxvars.atom__NET_WM_PING + }; + + XSetWMProtocols(linuxvars.XDisplay, linuxvars.XWindow, wm_protos, 2); +} + +internal void +LinuxHandleX11Events(void) +{ + static XEvent PrevEvent = {}; + b32 should_step = 0; + + while(XPending(linuxvars.XDisplay)) + { + XEvent Event; + XNextEvent(linuxvars.XDisplay, &Event); + + if (XFilterEvent(&Event, None) == True){ + continue; + } + + switch (Event.type){ + case KeyPress: { + should_step = 1; + + b32 is_hold = (PrevEvent.type == KeyRelease && + PrevEvent.xkey.time == Event.xkey.time && + PrevEvent.xkey.keycode == Event.xkey.keycode); + + b8 mods[MDFR_INDEX_COUNT] = {}; + mods[MDFR_HOLD_INDEX] = is_hold; + + if(Event.xkey.state & ShiftMask) mods[MDFR_SHIFT_INDEX] = 1; + if(Event.xkey.state & ControlMask) mods[MDFR_CONTROL_INDEX] = 1; + if(Event.xkey.state & LockMask) mods[MDFR_CAPS_INDEX] = 1; + if(Event.xkey.state & Mod1Mask) mods[MDFR_ALT_INDEX] = 1; + + Event.xkey.state &= ~(ControlMask); + + Status status; + KeySym keysym = NoSymbol; + char buff[32] = {}; + + Xutf8LookupString( + linuxvars.input_context, + &Event.xkey, + buff, + sizeof(buff) - 1, + &keysym, + &status + ); + + if(status == XBufferOverflow){ + //TODO(inso): handle properly + Xutf8ResetIC(linuxvars.input_context); + XSetICFocus(linuxvars.input_context); + fputs("FIXME: XBufferOverflow from LookupString.\n", stderr); + } + + u8 key = *buff, key_no_caps = key; + + if(mods[MDFR_CAPS_INDEX] && status == XLookupBoth && Event.xkey.keycode){ + char buff_no_caps[32] = {}; + Event.xkey.state &= ~(LockMask); + + XLookupString( + &Event.xkey, + buff_no_caps, + sizeof(buff_no_caps) - 1, + NULL, + NULL + ); + + if(*buff_no_caps){ + key_no_caps = *buff_no_caps; + } + } + + if(key == '\r') key = '\n'; + if(key_no_caps == '\r') key_no_caps = '\n'; + + // don't push modifiers + if(keysym >= XK_Shift_L && keysym <= XK_Hyper_R){ + break; + } + + if(keysym == XK_ISO_Left_Tab){ + key = key_no_caps = '\t'; + mods[MDFR_SHIFT_INDEX] = 1; + } + + u8 special_key = keycode_lookup_table[(u8)Event.xkey.keycode]; + + if(special_key){ + LinuxPushKey(special_key, 0, 0, &mods, is_hold); + } else if(key < 128){ + LinuxPushKey(key, key, key_no_caps, &mods, is_hold); + } else { + LinuxPushKey(0, 0, 0, &mods, is_hold); + } + }break; + + case KeyRelease: { + should_step = 1; + }break; + + case MotionNotify: { + should_step = 1; + linuxvars.input.mouse.x = Event.xmotion.x; + linuxvars.input.mouse.y = Event.xmotion.y; + }break; + + case ButtonPress: { + should_step = 1; + switch(Event.xbutton.button){ + case Button1: { + linuxvars.input.mouse.press_l = 1; + linuxvars.input.mouse.l = 1; + } break; + case Button3: { + linuxvars.input.mouse.press_r = 1; + linuxvars.input.mouse.r = 1; + } break; + + //NOTE(inso): scroll up + case Button4: { + linuxvars.input.mouse.wheel = 1; + }break; + + //NOTE(inso): scroll down + case Button5: { + linuxvars.input.mouse.wheel = -1; + }break; + } + }break; + + case ButtonRelease: { + should_step = 1; + switch(Event.xbutton.button){ + case Button1: { + linuxvars.input.mouse.release_l = 1; + linuxvars.input.mouse.l = 0; + } break; + case Button3: { + linuxvars.input.mouse.release_r = 1; + linuxvars.input.mouse.r = 0; + } break; + } + }break; + + case EnterNotify: { + should_step = 1; + linuxvars.input.mouse.out_of_window = 0; + }break; + + case LeaveNotify: { + should_step = 1; + linuxvars.input.mouse.out_of_window = 1; + }break; + + case FocusIn: + case FocusOut: { + should_step = 1; + linuxvars.input.mouse.l = 0; + linuxvars.input.mouse.r = 0; + }break; + + case ConfigureNotify: { + should_step = 1; + i32 w = Event.xconfigure.width, h = Event.xconfigure.height; + + if(w != linuxvars.target.width || h != linuxvars.target.height){ + LinuxResizeTarget(Event.xconfigure.width, Event.xconfigure.height); + } + }break; + + case MappingNotify: { + if(Event.xmapping.request == MappingModifier || Event.xmapping.request == MappingKeyboard){ + XRefreshKeyboardMapping(&Event.xmapping); + LinuxKeycodeInit(linuxvars.XDisplay); + } + }break; + + case ClientMessage: { + if ((Atom)Event.xclient.data.l[0] == linuxvars.atom_WM_DELETE_WINDOW) { + should_step = 1; + linuxvars.keep_running = 0; + } + else if ((Atom)Event.xclient.data.l[0] == linuxvars.atom__NET_WM_PING) { + Event.xclient.window = DefaultRootWindow(linuxvars.XDisplay); + XSendEvent( + linuxvars.XDisplay, + Event.xclient.window, + False, + SubstructureRedirectMask | SubstructureNotifyMask, + &Event + ); + } + }break; + + // NOTE(inso): Someone wants us to give them the clipboard data. + case SelectionRequest: { + XSelectionRequestEvent request = Event.xselectionrequest; + + XSelectionEvent response = {}; + response.type = SelectionNotify; + response.requestor = request.requestor; + response.selection = request.selection; + response.target = request.target; + response.time = request.time; + response.property = None; + + if ( + linuxvars.clipboard_outgoing.size && + request.selection == linuxvars.atom_CLIPBOARD && + request.property != None && + request.display && + request.requestor + ){ + Atom atoms[] = { + XA_STRING, + linuxvars.atom_UTF8_STRING + }; + + if(request.target == linuxvars.atom_TARGETS){ + + XChangeProperty( + request.display, + request.requestor, + request.property, + XA_ATOM, + 32, + PropModeReplace, + (u8*)atoms, + ArrayCount(atoms) + ); + + response.property = request.property; + + } else { + b32 found = false; + for(int i = 0; i < ArrayCount(atoms); ++i){ + if(request.target == atoms[i]){ + found = true; + break; + } + } + + if(found){ + XChangeProperty( + request.display, + request.requestor, + request.property, + request.target, + 8, + PropModeReplace, + (u8*)linuxvars.clipboard_outgoing.str, + linuxvars.clipboard_outgoing.size + ); + + response.property = request.property; + } + } + } + + XSendEvent(request.display, request.requestor, True, 0, (XEvent*)&response); + + }break; + + // NOTE(inso): Another program is now the clipboard owner. + case SelectionClear: { + if(Event.xselectionclear.selection == linuxvars.atom_CLIPBOARD){ + linuxvars.clipboard_outgoing.size = 0; + } + }break; + + // NOTE(inso): A program is giving us the clipboard data we asked for. + case SelectionNotify: { + XSelectionEvent* e = (XSelectionEvent*)&Event; + if( + e->selection == linuxvars.atom_CLIPBOARD && + e->target == linuxvars.atom_UTF8_STRING && + e->property != None + ){ + Atom type; + int fmt; + unsigned long nitems, bytes_left; + u8 *data; + + int result = XGetWindowProperty( + linuxvars.XDisplay, + linuxvars.XWindow, + linuxvars.atom_CLIPBOARD, + 0L, + LINUX_MAX_PASTE_CHARS/4L, + False, + linuxvars.atom_UTF8_STRING, + &type, + &fmt, + &nitems, + &bytes_left, + &data + ); + + if(result == Success && fmt == 8){ + LinuxStringDup(&linuxvars.clipboard_contents, data, nitems); + should_step = 1; + linuxvars.new_clipboard = 1; + XFree(data); + XDeleteProperty(linuxvars.XDisplay, linuxvars.XWindow, linuxvars.atom_CLIPBOARD); + } + } + }break; + + case Expose: + case VisibilityNotify: { + should_step = 1; + }break; + + default: { + if(Event.type == linuxvars.xfixes_selection_event){ + XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&Event; + if(sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.XWindow){ + XConvertSelection( + linuxvars.XDisplay, + linuxvars.atom_CLIPBOARD, + linuxvars.atom_UTF8_STRING, + linuxvars.atom_CLIPBOARD, + linuxvars.XWindow, + CurrentTime + ); + } + } + }break; + } + + PrevEvent = Event; + } + + if(should_step){ + LinuxScheduleStep(); + } +} + +// +// Entry point +// + +int +main(int argc, char **argv) +{ + // + // System & Memory init + // + +#if FRED_INTERNAL + linuxvars.internal_bubble.next = &linuxvars.internal_bubble; + linuxvars.internal_bubble.prev = &linuxvars.internal_bubble; + linuxvars.internal_bubble.flags = 0; + + pthread_mutex_init(&linuxvars.DEBUG_sysmem_lock, 0); +#endif + + char base_dir_mem[PATH_MAX]; + String base_dir = make_fixed_width_string(base_dir_mem); + + if (!LinuxLoadAppCode(&base_dir)){ + LinuxFatalErrorMsg("Could not load '4ed_app.so'. This file should be in the same directory as the main '4ed' executable."); + return 99; + } + + LinuxLoadSystemCode(); + LinuxLoadRenderCode(); + + memory_vars.vars_memory_size = Mbytes(2); + memory_vars.vars_memory = system_get_memory(memory_vars.vars_memory_size); + memory_vars.target_memory_size = Mbytes(512); + memory_vars.target_memory = system_get_memory(memory_vars.target_memory_size); + memory_vars.user_memory_size = Mbytes(2); + memory_vars.user_memory = system_get_memory(memory_vars.user_memory_size); + + linuxvars.target.max = Mbytes(1); + linuxvars.target.push_buffer = (char*)system_get_memory(linuxvars.target.max); + + if(memory_vars.vars_memory == NULL || memory_vars.target_memory == NULL || memory_vars.user_memory == NULL || linuxvars.target.push_buffer == NULL){ + LinuxFatalErrorMsg("Could not allocate sufficient memory. Please make sure you have atleast 512Mb of RAM free. (This requirement will be relaxed in the future)."); + exit(1); + } + + init_shared_vars(); + + // + // Read command line + // + + char* cwd = get_current_dir_name(); + if(!cwd){ + char buf[1024]; + snprintf(buf, sizeof(buf), "Call to get_current_dir_name failed: %s", strerror(errno)); + LinuxFatalErrorMsg(buf); + return 1; + } + + String current_directory = make_string_slowly(cwd); + + Command_Line_Parameters clparams; + clparams.argv = argv; + clparams.argc = argc; + + char **files; + i32 *file_count; + i32 output_size; + + output_size = + linuxvars.app.read_command_line(&linuxvars.system, + &memory_vars, + current_directory, + &linuxvars.settings, + &files, &file_count, + clparams); + + if (output_size > 0){ + // TODO(allen): crt free version + fprintf(stdout, "%.*s", output_size, (char*)memory_vars.target_memory); + } + if (output_size != 0){ + LinuxFatalErrorMsg("Error reading command-line arguments."); + return 1; + } + + sysshared_filter_real_files(files, file_count); + + // + // Custom layer linkage + // + +#ifdef FRED_SUPER + + char *custom_file_default = "4coder_custom.so"; + sysshared_to_binary_path(&base_dir, custom_file_default); + custom_file_default = base_dir.str; + + char *custom_file; + if (linuxvars.settings.custom_dll){ + custom_file = linuxvars.settings.custom_dll; + } else { + custom_file = custom_file_default; + } + + linuxvars.custom = dlopen(custom_file, RTLD_LAZY); + if (!linuxvars.custom && custom_file != custom_file_default){ + if (!linuxvars.settings.custom_dll_is_strict){ + linuxvars.custom = dlopen(custom_file_default, RTLD_LAZY); + } + } + + if (linuxvars.custom){ + linuxvars.custom_api.get_alpha_4coder_version = (_Get_Version_Function*) + dlsym(linuxvars.custom, "get_alpha_4coder_version"); + + if (linuxvars.custom_api.get_alpha_4coder_version == 0 || + linuxvars.custom_api.get_alpha_4coder_version(MAJOR, MINOR, PATCH) == 0){ + LinuxFatalErrorMsg("Failed to load '4coder_custom.so': Version mismatch. Try rebuilding it with 'buildsuper.sh'."); + exit(1); + } + else{ + linuxvars.custom_api.get_bindings = (Get_Binding_Data_Function*) + dlsym(linuxvars.custom, "get_bindings"); + linuxvars.custom_api.view_routine = (View_Routine_Function*) + dlsym(linuxvars.custom, "view_routine"); + + if (linuxvars.custom_api.get_bindings == 0){ + LinuxFatalErrorMsg("Failed to load '4coder_custom.so': " + "It does not export the required 'get_bindings' function. " + "Try rebuilding it with 'buildsuper.sh'."); + exit(1); + } + else{ + fprintf(stderr, "Successfully loaded 4coder_custom.so\n"); + } + } + } else { + char buf[4096]; + const char* error = dlerror(); + snprintf(buf, sizeof(buf), "Error loading custom: %s. " + "Make sure this file is in the same directory as the main '4ed' executable.", + error ? error : "'4coder_custom.so' missing"); + LinuxFatalErrorMsg(buf); + exit(1); + } +#else + linuxvars.custom_api.get_bindings = get_bindings; +#endif + + linuxvars.custom_api.view_routine = 0; + +#if 0 + if (linuxvars.custom_api.view_routine == 0){ + linuxvars.custom_api.view_routine = view_routine; + } +#endif + + // + // Coroutine / Thread / Semaphore / Mutex init + // + + linuxvars.coroutine_free = linuxvars.coroutine_data; + for (i32 i = 0; i+1 < ArrayCount(linuxvars.coroutine_data); ++i){ + linuxvars.coroutine_data[i].next = linuxvars.coroutine_data + i + 1; + } + + const size_t stack_size = Mbytes(2); + for (i32 i = 0; i < ArrayCount(linuxvars.coroutine_data); ++i){ + linuxvars.coroutine_data[i].stack.ss_size = stack_size; + linuxvars.coroutine_data[i].stack.ss_sp = system_get_memory(stack_size); + } + + Thread_Context background[4] = {}; + linuxvars.groups[BACKGROUND_THREADS].threads = background; + linuxvars.groups[BACKGROUND_THREADS].count = ArrayCount(background); + linuxvars.groups[BACKGROUND_THREADS].cancel_lock0 = CANCEL_LOCK0; + linuxvars.groups[BACKGROUND_THREADS].cancel_cv0 = 0; + + Thread_Memory thread_memory[ArrayCount(background)]; + linuxvars.thread_memory = thread_memory; + + sem_init(&linuxvars.thread_semaphore, 0, 0); + linuxvars.queues[BACKGROUND_THREADS].semaphore = LinuxSemToHandle(&linuxvars.thread_semaphore); + + for(i32 i = 0; i < linuxvars.groups[BACKGROUND_THREADS].count; ++i){ + Thread_Context *thread = linuxvars.groups[BACKGROUND_THREADS].threads + i; + thread->id = i + 1; + thread->group_id = BACKGROUND_THREADS; + + Thread_Memory *memory = linuxvars.thread_memory + i; + *memory = thread_memory_zero(); + memory->id = thread->id; + + thread->queue = &linuxvars.queues[BACKGROUND_THREADS]; + pthread_create(&thread->handle, NULL, &JobThreadProc, thread); + } + + initialize_unbounded_queue(&linuxvars.groups[BACKGROUND_THREADS].queue); + + for(i32 i = 0; i < LOCK_COUNT; ++i){ + pthread_mutex_init(linuxvars.locks + i, NULL); + } + + for(i32 i = 0; i < ArrayCount(linuxvars.conds); ++i){ + pthread_cond_init(linuxvars.conds + i, NULL); + } + + // + // X11 init + // + + linuxvars.XDisplay = XOpenDisplay(0); + if(!linuxvars.XDisplay){ + // NOTE(inso): probably not worth trying the popup in this case... + fprintf(stderr, "Can't open display!\n"); + return 1; + } + +#define LOAD_ATOM(x) linuxvars.atom_##x = XInternAtom(linuxvars.XDisplay, #x, False); + + LOAD_ATOM(TARGETS); + LOAD_ATOM(CLIPBOARD); + LOAD_ATOM(UTF8_STRING); + LOAD_ATOM(_NET_WM_STATE); + LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_HORZ); + LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_VERT); + LOAD_ATOM(_NET_WM_STATE_FULLSCREEN); + LOAD_ATOM(_NET_WM_PING); + LOAD_ATOM(_NET_WM_WINDOW_TYPE); + LOAD_ATOM(_NET_WM_WINDOW_TYPE_NORMAL); + LOAD_ATOM(_NET_WM_PID); + LOAD_ATOM(WM_DELETE_WINDOW); + +#undef LOAD_ATOM + +#if SUPPORT_DPI + linuxvars.dpi_x = linuxvars.dpi_y = LinuxGetXSettingsDPI(linuxvars.XDisplay, DefaultScreen(linuxvars.XDisplay)); + + // fallback + if(linuxvars.dpi_x == -1){ + int scr = DefaultScreen(linuxvars.XDisplay); + + int dw = DisplayWidth(linuxvars.XDisplay, scr); + int dh = DisplayHeight(linuxvars.XDisplay, scr); + + int dw_mm = DisplayWidthMM(linuxvars.XDisplay, scr); + int dh_mm = DisplayHeightMM(linuxvars.XDisplay, scr); + + linuxvars.dpi_x = dw_mm ? dw / (dw_mm / 25.4) : 96; + linuxvars.dpi_y = dh_mm ? dh / (dh_mm / 25.4) : 96; + + fprintf(stderr, "%dx%d - %dmmx%dmm DPI: %dx%d\n", dw, dh, dw_mm, dh_mm, linuxvars.dpi_x, linuxvars.dpi_y); + } else { + fprintf(stderr, "DPI from XSETTINGS: %d\n", linuxvars.dpi_x); + } +#endif + + int WinWidth, WinHeight; + if(!LinuxX11WindowInit(argc, argv, &WinWidth, &WinHeight)){ + return 1; + } + + int xfixes_version_unused, xfixes_err_unused; + linuxvars.has_xfixes = XQueryExtension( + linuxvars.XDisplay, + "XFIXES", + &xfixes_version_unused, + &linuxvars.xfixes_selection_event, + &xfixes_err_unused + ) == True; + + if(linuxvars.has_xfixes){ + XFixesSelectSelectionInput( + linuxvars.XDisplay, + linuxvars.XWindow, + linuxvars.atom_CLIPBOARD, + XFixesSetSelectionOwnerNotifyMask + ); + } else { + fputs("Your X server doesn't support XFIXES, mention this fact if you report any clipboard-related issues.\n", stderr); + } + + Init_Input_Result input_result = + LinuxInputInit(linuxvars.XDisplay, linuxvars.XWindow); + + linuxvars.input_method = input_result.input_method; + linuxvars.input_style = input_result.best_style; + linuxvars.input_context = input_result.xic; + + LinuxKeycodeInit(linuxvars.XDisplay); + + Cursor xcursors[APP_MOUSE_CURSOR_COUNT] = { + None, + XCreateFontCursor(linuxvars.XDisplay, XC_arrow), + XCreateFontCursor(linuxvars.XDisplay, XC_xterm), + XCreateFontCursor(linuxvars.XDisplay, XC_sb_h_double_arrow), + XCreateFontCursor(linuxvars.XDisplay, XC_sb_v_double_arrow) + }; + + { + char data = 0; + XColor c = {}; + Pixmap p = XCreateBitmapFromData(linuxvars.XDisplay, linuxvars.XWindow, &data, 1, 1); + + linuxvars.hidden_cursor = XCreatePixmapCursor(linuxvars.XDisplay, p, p, &c, &c, 0, 0); + + XFreePixmap(linuxvars.XDisplay, p); + } + + + // + // Epoll init + // + + linuxvars.x11_fd = ConnectionNumber(linuxvars.XDisplay); + linuxvars.inotify_fd = inotify_init1(IN_NONBLOCK); + linuxvars.step_event_fd = eventfd(0, EFD_NONBLOCK); + linuxvars.step_timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); + + linuxvars.epoll = epoll_create(16); + + { + struct epoll_event e = {}; + e.events = EPOLLIN | EPOLLET; + + e.data.u64 = LINUX_4ED_EVENT_X11; + epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, linuxvars.x11_fd, &e); + + e.data.u64 = LINUX_4ED_EVENT_STEP; + epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, linuxvars.step_event_fd, &e); + + e.data.u64 = LINUX_4ED_EVENT_STEP_TIMER; + epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, linuxvars.step_timer_fd, &e); + } + + // + // App init + // + + XAddConnectionWatch(linuxvars.XDisplay, &LinuxX11ConnectionWatch, NULL); + + linuxvars.app.init(&linuxvars.system, + &linuxvars.target, + &memory_vars, + linuxvars.clipboard_contents, + current_directory, + linuxvars.custom_api); + + LinuxResizeTarget(WinWidth, WinHeight); + + // + // Main loop + // + + system_acquire_lock(FRAME_LOCK); + + LinuxScheduleStep(); + + linuxvars.keep_running = 1; + linuxvars.input.first_step = 1; + linuxvars.input.dt = (frame_useconds / 1000000.f); + + while(1){ + + if(XEventsQueued(linuxvars.XDisplay, QueuedAlready)){ + LinuxHandleX11Events(); + } + + system_release_lock(FRAME_LOCK); + + struct epoll_event events[16]; + int num_events = epoll_wait(linuxvars.epoll, events, ArrayCount(events), -1); + + system_acquire_lock(FRAME_LOCK); + + if(num_events == -1){ + if(errno != EINTR){ + perror("epoll_wait"); + } + continue; + } + + b32 do_step = 0; + + for(int i = 0; i < num_events; ++i){ + + int fd = events[i].data.u64 & UINT32_MAX; + u64 type = events[i].data.u64 & ~fd; + + switch(type){ + case LINUX_4ED_EVENT_X11: { + LinuxHandleX11Events(); + } break; + + case LINUX_4ED_EVENT_X11_INTERNAL: { + XProcessInternalConnection(linuxvars.XDisplay, fd); + } break; + + case LINUX_4ED_EVENT_STEP: { + u64 ev; + int ret; + do { + ret = read(linuxvars.step_event_fd, &ev, 8); + } while(ret != -1 || errno != EAGAIN); + do_step = 1; + } break; + + case LINUX_4ED_EVENT_STEP_TIMER: { + u64 count; + int ret; + do { + ret = read(linuxvars.step_timer_fd, &count, 8); + } while(ret != -1 || errno != EAGAIN); + do_step = 1; + } break; + + case LINUX_4ED_EVENT_CLI: { + LinuxScheduleStep(); + } break; + } + } + + if(do_step){ + linuxvars.last_step = system_now_time(); + + if(linuxvars.input.first_step || !linuxvars.has_xfixes){ + XConvertSelection( + linuxvars.XDisplay, + linuxvars.atom_CLIPBOARD, + linuxvars.atom_UTF8_STRING, + linuxvars.atom_CLIPBOARD, + linuxvars.XWindow, + CurrentTime + ); + } + + Application_Step_Result result = {}; + result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT; + result.trying_to_kill = !linuxvars.keep_running; + + if(linuxvars.new_clipboard){ + linuxvars.input.clipboard = linuxvars.clipboard_contents; + linuxvars.new_clipboard = 0; + } else { + linuxvars.input.clipboard = null_string; + } + + linuxvars.app.step( + &linuxvars.system, + &linuxvars.target, + &memory_vars, + &linuxvars.input, + &result + ); + + if(result.perform_kill){ + break; + } else { + linuxvars.keep_running = 1; + } + + if(result.animating){ + LinuxScheduleStep(); + } + + LinuxRedrawTarget(); + + if(result.mouse_cursor_type != linuxvars.cursor && !linuxvars.input.mouse.l){ + Cursor c = xcursors[result.mouse_cursor_type]; + if(!linuxvars.hide_cursor){ + XDefineCursor(linuxvars.XDisplay, linuxvars.XWindow, c); + } + linuxvars.cursor = result.mouse_cursor_type; + } + + flush_thread_group(BACKGROUND_THREADS); + + linuxvars.input.first_step = 0; + linuxvars.input.keys = key_input_data_zero(); + linuxvars.input.mouse.press_l = 0; + linuxvars.input.mouse.release_l = 0; + linuxvars.input.mouse.press_r = 0; + linuxvars.input.mouse.release_r = 0; + linuxvars.input.mouse.wheel = 0; + } + } + + return 0; +} + +// BOTTOM +// vim: expandtab:ts=4:sts=4:sw=4 + diff --git a/metagen b/metagen new file mode 100755 index 0000000000000000000000000000000000000000..50a89aca644723e5b67e4877793e2413bc81b7e3 GIT binary patch literal 168440 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 z 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�~0w z^J``=sw%Ipuj`vLyQZwXwlDqF`Yx)g?K`h}cI6@yshl^f@7&q5`z{?asAN!1X63x< zMN2d1Rxj#1Fp^J%j^~>-uf7gH3t3%XURyo0vP4-c!GY_%>bY677cL~vasW&4cxicU z30}`pmxUMdg%_GQ`B{P^62Z&MfZ!(i@@i90U40o0fsEl<3@NSk%NCZ4TJV&W&jAls z5oR&wIufl>lBlxzHO#U4nX@XP1Fx|{G__cp`Fk_=XEePDZ%ebq%)wtf{c+&uYaKDu z=ugaWn+;6>e)HF6?9VHHJ&b=XSY0s_Ojh$}X6�OIGvuW$bT-d*L82Sig(D;Z;#K zhll*}g#0moXU6_vxDl3gvJm}=r9W}>2S4Iub0m_E#E=g2muKuhgzGqY49wr1v0tX^ zZtq`L&7Hf-)?S6j{LvWu23coWI8Y%7u_MUrF5ahR;vtJTJOWp_ui9bWM|4J{NR2TJ-CA|+}2l@K}5 z(*D45c=c<)IN{?9EkuFR2Vb)$JX%8J@X=DB|8wrSJF}ye19WZe%>L)xbMHO(+;h&o zbLY+i;%h;Cm&&OrHI;KJt7koXZN<2Xj*ir-SxV~V>@^kXLn=Dn?=0Pl^Qm#>m@UuQ zt1ED7rw{cvoD)n%kz9k5{SEe-$^y#tT(9(@$$samYDGWF%8Az+!>fLgJnB@1 zr)JcLPM~zo(X4afz!62#KnYR!51qJoh|73!*1jQ7MqIl81gPwLhx+eR?UEged26AV z_t`fT71Or2@U^#t*kRQc`Ib|1FhbF<%;KJ=Df%s@=tqmPwxb5WZ+4D}?X@e)RkSr? z@2!Y7C;^X^qr$C`oV|CYiatCMb(WKq=aM;eZO8_fS68&w=IlKy?KLZ-&L!3Jz#ZMJ z>NcF)T0JhT)-se!q#dQNkS-LiJQeCZT**P5LQTS1g`lI{%y` znR=rn{V26M_^Rq8_@6RuJ?o-7NOH z;iz+QwOTc!MV>9^-d#@S!!G~$)6PX(=}eKzmQnf3)Hf#b&eCJ*jF-%vq-&gjwZXoA zd20H1P#uDqm|=DQ(=ZW){kPd%wDp`W=dtpcDHTn6um6PjlIgLXw5oEJWj*J@t)7=0 zS5rwf1Y|D&Vc8t6c~_b}Uupcdx2s_8?~I_Y-<<;l~@XQrcdnll>)vKtqaC+pM$ z-otDfigdG$Sv(0A^Al9M@>AuI&K#vTbgUFwth)};#lSW0baKr}4>%Q7(Zgz<1grYJ zlk|N8RwAqNS~=Nk1wCAOTWbVeBdglbG*jrBQxnN)F;tA?HBzUvS$e2k=eRz(x=qd2 z<+SU1R?xl4)k*I;YF~ARPS8K>>nl7KMlOfbN$;i~pxvs~l)b(p>Qq$QH?7EvtOv?> z=R9wmyzOC@gy~VLx*X0P@VIJwn4={pn}wADRGIWV`?{59R7!2|9!$kR<`lX50t%IXIiH)!c~i-krd3o8PS3o4mPwD5 zKahLi#O$Hm(^MdiyG(yt|Mab>-c6T#5wFgx#W(${^HxWlE2`DN z*>g#3fVHN~zHwz#-Kl2V)N1>tiuN|=@@n*v$(dEo73v{--HN<@OQouq|H-(jIO|+! z zXF%NnYNx8osq9-LRXRDjJNKAfS83N(JUn}v|IN;x{(R24ChH{ol7T!q0Y$AgeL3{C z^QtH~q|-y-B$BKed$D5A~aW zLVX2*UANN49YZuG8OE|i`~Caw-=}_?&dVPy&wKU_%Nm}aa*kFz$tq`c-?fu!B}_z8 z-Tl;AFR9vc=qtI|Tk|mJsC9m3`c?!nXYz0qgSV>cJUVK{I4mJjd9`iuShcuByq)1H z=Ze1BB}<%-PN;$0%F|Qf62yNZuTWEN4ET=Hn`80Yjg8xxsGmM zl;6*mpH$uhQfBAgr<@gP1xH#N&P>8RYlefj=8fWcvugF+>@2cVNp!>UYUfh5qRm-e zJwJPLR;6ZeMQylM_2*_)#S~}Ft*qX*4;LmBc^L{2(WxVCOD=Fe^lk($YBrL$YbzoY z-k>tGGhliNzWP8~5UI7c{8?OgJZs=>c|=Ba9^oH?SZ&h=YA zPc60KTwCNAS*Nz#OKR0QD7~s7iJ1)P+?Mf^F$^i!Zr#x7 z5@iU{98xu3DyCx5ELu{-oQv%oIpr*UC|LAgGcg1kQIT2a+m;$oujSF=IrW&zo}E#- z{46@-slr)qcJ4UL$NcPE4wBBzpLy&w9{|o$0m{msEuWjkuT%MXH8`XC^J?Fus#H^F zpP_CB*R!sI^i}0osc+KwS>>T2xJ12sUQLZ_6@r6Tb0-k)+t*!A>Dsit<(~7&b`0Q_ zR_Dg&=b*7?5Io~>RWvd`4z|%5`^E|c1?s`5b5S+wa*o1-vSd!JA6%0oWt;}v$LIo= zR`r#umu7hwI1UxR2T_AFep|{}TE)au?S`7!zzi8Si(lak>>5Nd6dJvh^LDCuOMQdeywifif1j`G;fzLkq%@8VyIMZn>mqPmo6Ku=-F_bRm}s-AyM zk64d$m)0YlA0J0(W^Y2sVN&UI?VT0}ok2NZjQ9>=PE zQf#gQ7*HMNr|js;`APd)8neSVpZ3)1<7(E+zq^6!!AaKaoBZx`U_S|qzIq~R->?!Y zI6gnmMhMcF`Q%G$S*b`cY^ce%l|k$1kfATOnl`p+z&X1YsXPzq)#Lbgd)nn#)Tfkf?tQk!IS{0`6M&~DyY7U`Ki2@ zpXT^`=FH5lqv|vz6pzM5N<4f9B8JI6H+ykyRAkLS*@SZE-nPqKj% zi~)`$RV2ERV*6YU%;qtW=K9c0&dHpSIVmDkq_0Fhz+-`umyRKq-9{rzql|PDayPVtCw%=d2{L91& z5el5Ny^{-zE(0~VuEN9on0=$J;iKg<4&n<+`!nawr{)md)4;$_s5{BDB%QJwE1*br z?Mk~t3jiak@|h!dz|ibh`6u?3Mg1PJzFuC zLH{qN@9QR?QFl5|zQ^8BMoGwvknC*dWAAy*`L3n5u2QdK{1Jslp1>d3e=@i>A`L!N zFUP?tr+GFb>2_6EOg5=x1XN_SnJ&%C~Z6xQa6C|lh)f{?&oU+EE* zb0y-1d-`C~Io+hQT&-}@eQ(5|##yx$(W_c@l6(32i}*CO5YcE2m`?Gxl+C#Zd0(Zr zs?=-wDO};&WvQebAcevYb_)`UXcuu5$uE3JrRI^CdnZ?RZN;}R)_N9$ON6JMdWl2R z{Bci@rD^aK1iw@(jC% zkap^6NPEo{EMPKgHk*5!O`M!Np6YWhJ2j6v1z6ZS%@KBR1M;NkEQvqk5>{u0H2)j?7Btwp)W_dbfzKC;0W=+0B$pMo$>!#X>cyvSUxq3^Ho z=_ly>c|LuTzIi5AeUeTQ0IkgQI~QS)PCvilWA?hs6%mFS4$D!f7Bsf7p`CnSLnr|@ zTnJ-4abYW(ez2Xa+Ui_Q)0AcE*C`f?KsNqPOft;NJeHp8)Fw^~SC7m@t~Qp?6of24 z5ZZ5bmQq4Trb?#f#Aj^;gbCur2-5xH@TXsIXVB ze9W${oU)rR8}kIwlSf&N0fK#fCHfZ}ocztJX-osuRiNX|t6R(oTF(5ulVtofeK~ij zm!0cQQO}~E!m(0woSla&q2!uzUd`LLRG_a?bOOd4BvFc06foNA7W%d$mp;PBI_l=O z*1{#uUSv~!N8 zIzX9Fst+U8gK9e8-`}5QLk8TL8h!RF>J!haC!bTFJmdVsGWFEf+myZ$`^VpGq#N9p z^FmpfeeH^~^U3@P-0zgzv^RfCuKp5taF3mxKjUBeeRJtay9|+R(%j89@342Cc8YNG zvQ6g+RfL=OXF5-+GPoqe#=MKjIeRfW7zSf>Uww&Xo=3(+@XZ>qt+fwKIxWJ}f(yTj> zN@ubzR*NJo;)(xzI@&rq_jXvB)X{{Swb~PhI}(Y5&76WTT8m*drIWlW#odMs4jmkw z7_o+9hZ2UrU%aM{?Jc)k=|l$PnX%EV+hEZel7Vyr%tsF;Mvx>HKg5~q3Q^iXeRgBz zh})JpGBKJyn8E6gw42JfSUlp!t$`F4$i#*d?xDmHS{0MA4tm4j4cMiJRoZ*p)Iltr zNe!eDX)BgaW?XDTs!9+ThO}GbQnS?HIFSV7QzNd9xOXm)1(jBRh zRAw-Ns$zLh*3FwPIER8OzRG`_zuh67pY4_1tHM`-T|!0>DsuBkD3FT$LPw4H#B6<2ZlytBpmwf zlCoK`u`y~hZ)3f{RzPdGm8s>Rga=v7eqEt;?!MZH?hX)&=m@C1;c>sYSyq$^|55JN zjuv!|7%N$9XlyX%f;^E<#ocV$OK|gYu}FuZ)Z9f%YB9;#FHCPscSloqzkB=crtUV9 z+%T4BWkmRBvSDbn))>~a4u}NWO--b=4GW=S-cZ(ZQMS~GX(g?Lp=R` z!ZXVqrsZzbXzqbT5_KoZX9iOP(uc@=q_J>~EDQwHAjImY#`yr<5I(dpEx)Q zkC9F$EH8uQdZ=3#E@6lpP}?eB6?V6F?CBx))KRRSM4Tkd?c$P0(d1Buq0tE}1I%R5 zdIwPys5B%O8z#ldpcl(^6h(I?vXmpESb7LMgE~l4>)uX$sok^W$HcQ~^B~R*nkWwG zK*1sTCEnKB>yp)kLD(GfkFhLz-&j^x-q@&~8aE*Srta>}y|CJeLtwB)3{oc3B`VtE zS_9aa8&xG=WNE#1n^5N+L)d)SFGcSz;^Y6OQgwENXQaWH95FT!3E3bcBTfVR)Y9I% zgKCd9bzwBp7HnF^%?`q3j=)8ur;!glnt)>>VbTlK;7k(f3{(`QcQdf$gO&$_znL6+ z4_X2y1sb!XwY`OYj}5^nksh-6{gR^Vw(M-_cAGmpdU~5WdUYjO+sSOUcDFS5w!#I$ zvA8fWXd`av1jT6g_@0qeHeia_IpOVkT4UIr#7Bo|tt&Y}7{|o8I}yvc6QuHf zVYVZu+pS^r_LPoWpwsBwiGx+Fk0?GCtdhBhlEMAKbV?Zpyb)Ga;y#c%j9xK}!cq4P zaNpM5)ZF5BcC}ECLmYwrO8p!PPL7%@<3fxmBIz>K&`J!ajMn?5Z136Cx}z5bg;*2! zS`#sJee^4GY1oKEI*F9kBe@hxgBB2PET)qkwAOsKKj=|9u0VGviky0yQEtkR-6)wi zZ2$rW4yDerMdVCidGM+jDj_=qL}(eT(hW$Xc~=wU0q+%RdX7A|w=}o+_H&M8+l`M3 z7$=le#}@_Bv%TdN%v38VID7{;n=iSY-M!tATd1FEf8tY7cOFS3V`PA>@z@ZYvo;lo zb5m)uNo1H=YJQ?_(v9`;iYp_SlYwC(ogA!Y3gL7hadYSH-A!5tDXQgu%02AYmz_;7el0aIu1E;JXU#t{Uy zGDl=R+9pCVK=Xh|>o1pmN^6rwQJGR7;u!wz;{fmzrSnLZfe@DINo%S73Ora@pp zbky;w{F^w?bIC8uC^oJ z-5>ge?UOYz2*(dn4AiBTmr4>3AuyjruN`? zq|48{xxKRoBWgqnsZk86kHA~PzLVRRP)`h~4p&HKq)9}iWv&GzqJ+Q^0r@p)xgGii z3lm5DFhrp^^$=Dnih)p0_Qrt(2oe|MpD`vKCDFs7*f7s7KxJrbffPC}hkcJFGqnMB z0tV$B-P+5sA(sF2;N48EYy?Ydi7nM&j)hPeftEDURC*is9k zKw|(4Bfx>tG>FsV-V;zX#p~+q=_Nzu(`{?o?zVJnN0DK9X^eoer#AcI5QEb#Mu@KUhEJbus7L%0e4G*ZS?-WPo2T5M>1@Wy{=@x@TNDer#DVl7WA(J|bi3f^sgyAObu_Ssdn%qZ>cN1F zVi1H_Y_Ii%fbLi%R~_YG_)NnIZHD!*T1QJ3&>o z(y8QN*23gmvWmZ;f`w@^g_@`t*$FYKFh_d0s5yIX84WP)7xFt zEBz}_D`BA3o=ljYBBfbgcmORa+C; zShKNaOV#?}tT&Q~vdmI({EVgJgHb$qxqf4P)%s-B`p%lF^#fh4&G;S}U7sDK=}DS* zSr47crs5gk?0eUbrQ!bK+0itvq|sUsMr~cFEzHb}38hIYR7L!6X@{3G=jiA(?OI#2 z&{zgT0AD(-9nI}~wzuffzYk-C-`m>kHudzhboWXGNXF_=A_3vRm(c*Ji+q~ftS7X% zOH=fhkzguR17qf_?v~y?-5rJQey>OK0jP(b_$LE~G6fKXxH~&Ak(xP_8VhudBBd~M zZ#*QW(R*7;o zWkEMNge``fG7k;AKr_&Y)w5nYJTJ@6yc-klB6CoMXMD7)(evmS%F#&6rIE+zzyP@% zL^-j8n0lo{tv=KRiccnyZ!9rE179K4!=zZZH6~MV-Wo$l8&s^K%%sV{Q|1Vu=X9%r=5P+CG8haTF)FaVv)R?k zts^+|WVUWkO2C=JcKP>Z=m%?7CWRmidc?l7gJN*M7%ctHj^6Ihb{Fx-UgE=gVZxIG zqoYHXnUKl`rsB!u2aIQMz8Z$q&w<-kyCaH1c!b`~x2<$jx#QdpMq7**F8Dl{@6Bj# zJ*$LycFa*AAPS7wQq;iGRSJICCfNyJ-bmm+~$$7 zWHV^kbh|W<=<1P??>T+tK^CpMyE`&qga(5@)=?u>17s)(8i4kS7ont-j!su5_ zK*r+xqlH;`Ka)qmY^A$z#To(#RD-ifMTfp;Ds(>28s;=+R2}h<2aZmh;gE4STOzx z3>$Q+qIk%P$3`G%Oci9Zi7{j7Q6znjhV5CPM8*g595%(2 zXaI?|!Z9UzvVzy5BI5FwUXaZrb=YowN6r^jM<>mP z>pSGQkA*1=sJpla>hXTyRk#nt)#ApZd&*6P*-bx?BeyI=U45g80CwaMn1`Cvy>Q$x z98G7*Ly7wDfoIxj@f4~*G~z`Ns6?C_lqTV|>msuekZ((SduvxuYmdbPDy=efcN(2z z2-RlQ(K^Ee2#PfITrEZQ{*Vs=INjstd4IamK;tQlV-XRJku(FQn{F@C{c_`L**5VU zYAR5yKHoHODAbDE@O@Sc;XOrWH0R6t#~}|=9ewMPQ36$x){gi9rSkk9guCP(t!$g>ftTgf=d^>mdvXtP!aV{-_K7s5dRx)!noc z^W&sw+hf^SkYPflhLOqcPUUDzayEH;%Q(?y8;wC*xWdDXV|6bsEZ>1| zEUfI|9y^4&W{e;ajLD=MRV+A}NExF`a>r$X1!FD_p55K>Pc+f69agx5#uFqEi)NB! z)Ws39ZbhC%hc9w>ws&r8YIkYDfZNK`D8Y#s5wP!F$#qlFyg)zH%UswkC5DDlW0@2? z_&Dx`B4i{p1Up8WhFcKi1KFa>vWx&56M&l@DZ@z}4H)-Mx2q*$9t{NAG_fkmUsp>G znbt{AR}Apqj%E}06`Vl`%oJ)HSrlc#g>#o1g$J40UaTQ=>QL)|tu7*l-R{vd!|k*f%+H=Ql7E@$Jd|f|XE!wooE?EnL)*36_NCfffelfl}y!Y3QaDLdIYSi;*h1&Z?pqO!rnD zxQOXQU_FF^=a5M)!_0k=NWc!j1_ZLlaKDvT4HORw+~g>fhg3fxBJR2vMR#KX8y3Hz z^Y4W5>18JRgqbq=Wef?qE6j2i#)W*>m+#Av z>nF8@2X$+#1^1-_wV@Ec6-7hy$ZSS$H)$~WRBcAghzXib4v1DYpvz%A!_#(%x!Fni z6=$oD$(U{|Fc`xv2pW#?dK^7{QPA2jr=S*N0t_J+3_rI5X#=%^)?Yn`Ly-!1a>$cQ zf{vf1dr{Uwa;pW$Aa2ksp}>j@iCNi{qea*fi&@5UC*03MdL5g>Orj&x1TfDbXdkYn zq?bw1bO_(F$Rc9HDMAzz?2wZQba{lMwZR20<5Yff;W`zMr^QQ)?eN#R1=x@VvGxQS zjD`z^C1I(7z;q>uL$?gHG~U{*R|8+ZT_3NO;|+4OLZ2goA8gU|DLIbIF+^_td5@+m z+oO-=a(t5 z=4cj#o1<9;ZjNT@w>g^i-sWf)d7GnI*lmvg;~%yB!|i##-&o;}SH><(=U_{{-jcXu zWlQ2qtVc@X7g(PyiI-bHUD9ZUKaTY#YplE!uB_>j_=Q&0n@Z6ywFXP#*uwL|QuG&F zRVDFDtj49K=r6UpO5&GUm9itQ75F&TGOMa2zT8^!%ToMTSa)C06yTsw9jn5suPTLC zS}&}Rm7rf~{c}nDa_g0n_!ZWxCGjh*S2vX6k3A@5|Lb7pj`e11x+IRBx@8yJVtQ=5 zUEMZ;6j%VdLKtAIGXHf#RtbYtvZ?`eUZQ+A>?CV<%$%{3X7Lzwr}PZua!xb98P4JrqKO%US;5!6ABY214F~P66QuBGY;D-hOh~TDP z9~S(ot2F($h5plmzb^Q91^=qx-+r^Ee_ik&3jVdLi}969biMxO8jUYS`_bnX!C!bw zBmdsT-*_XE;8(s?BI_+H`jpMu}AR?{0k%gc4WJ}S83bF<(#T&w8~pY4LbNAM}(-!J%E zuhaAg1RoXry@HcnpwIgRfBpJK{(X$UE$dGOpSVHerktM_`~|`H2%kB@uf0jrKOlVm zzu->_eoF9*-=yn%aGj>#BluduKPUKc!FLEAy;;-WDtJurcM85+a8K|vf+qz3py1W( zHJ`ZPj|)C2__*M+g1@O+)3*x#g5X_(zeVu8;KPC&y~0aD*q*#B_|Jv@ElT6x*`WCw zJN9oxuV5k0wA@K+i%{yD)vBKTvQG`?N_cV2Co;~ysE?Cdj&V|;4t`M!OhDx4F0I# z=B*h9|B~S5br=T!j^O4k7Y26_vQs(DyDJR7R&etM3WINF9Py{TG2)9N&wjzp`yh+fOtU|-6yzt3xuJ6A8_)6d1;qn;XfmI_ZHn=2L%5+!9Vj`8h52#oQpM|innY0 zxZrC9|ES=P3EnCA=B=7ODfs&YpAy{g|G4145WIQ0PVl#aH+5(}e=dB~CAvK41V1Bq zv*6EkYWmZHzen&RT^cv98vaYce{s9UjokiD@JqWj{;=>Vzf|Y@nBZSV{6U{K!Q*=x z`S(8lwyXicpAq~9!6yaJ3w~JeFA9Fw9gU25g1;*G-wJ-AwAU4v>GJ&jUQOR6^uHze zx;~AY{+<;48Npu{`V)fxS${G8R|Vg`Pvb8L{m%ujyi?=9EBKAeba@^X{NDt>OYjfu z*Ypv=vw}Y(xbg2F6x_N?(;NLcC3sTsR^jt4!9OMV+Xer3!G9pQi7PIHeo?>pkGnPh zcA;M<_>NdH-Xi!3!B-3YUBJsQel#yiG3}cX+`Jp*S)u=3;qw{c(V z^o74*K37}jZ7R#8-OmX9+N7p8dXg9X4+Otov$2-1(Di-uU@?7-;2#paM(8^P|AOFM zf~N()ET#E03I6+ncL`o6_~!)A32xf!{|WvT!G9w3uL=I;do=&g3Qljyp!Pa?NaKGf z_%(vB9MbqzA|Gt+!FJgCxyG**`a?orJ*@HD1V1MDVZomi{Bglok7)W&3;q)GzuLN6 z-e04yTGqb`{oe_FUg(!r>hgbfR8zJ|Ijez_zi5vE&^z~P`tJ$;e!+hzxZ(e2 zf`2Wo>DP;2_<`_$ukbhh;_WMSd44gj=|3*~-y!%PPH6l)V&6V4_&bkkJSq5#g8$1q zHQw!LMweZ#>-9y+S6{U(7dW+J!+SOIqR8R*1i$E*#t&Rz@#n7uAAV5df23jSRl%3P zPvcied8)3^{BQVOjT=4b5d5zMH!rk&x8V8rYx*Au|0e~1;R71~o|N-Pf`9IV8ox{M znk#j_mp`O&Px$N={QZL8F7lxloRS>A{jjG0q|yogTJZ4e)_){;_`T;hU8VVi-$MQl z!NYG1e^~JEJ+AXzBIW;r;NjO}|Eu8PS5;s9W-0$4X+AFrpJu_sFL=%f9)9ofM+FbR z!}zO$hu?GiDsYM?r={PC*sQl*t?@q%;kOI^sSy4y;3WU>yKn!H>ECRbH`Cs2>Cdx* zoA=n7e19T%<7kWt(M=oR+arSP(?-$&>pVrXN2yR{lD&5-p z2f@wDKn=bW0~yNKyoj<<_}2la`i9?07#DoO8wZiD)I8fU=D)(K3C-(1#Q4H_MasSu zpO1kaugF?3pZqlQfzpNMWB;1zD;LZkz9@KjKKXmhXW{(thpQ~Bs>FQn`irPEP_9AU zjt~}qUIU+1HuOPW>}lHlVxc#0t~2zPzSXke!WMj1FM>BPeyO$WpBg!hWNWnmUyb%M z_j7I+j(dPpIn8_YUXq4S3B9==v`Oe6siN}u^Zz#qexL9$Z_hg{_y>iLxo@^s@W%u< z_q$9y@EO6)eX47P{(0fwDC3%4f`0>em7E6;FE4`s6nH6lUi3CCA9H`}ZedmpycGSd z%xB^Kj#lAg?hBgw?q7t@*dlmt5&UuCZ|zirEuL`}nuhu5?|8uFP zH?Mj$`u0PiH}}=H3H|*-Z{93v=&!6QE&qDpR37tkOjDj_#{K(2#?EvDFD2)Li{OWW zCa~1%VB3;5j!KW zwViOt;fwN)Rk$1e^b7r;hV0~k@Hh97Hwyi`fRi1V{>Mf}5`zDp@HcNYHT8;0z07-2 zO})M^xOwNN!5?S-!ZdLB3n`DeFMpj}dlvXI`0;Rkzb@r5?>RN)`Qak`6$D7_XztS+ z{%-+ZNr zAEEkwR^kwWttXkk`Q;x!51j3Ty!_VK+pi0MbD!Om^GAZ4^$9(~>P>63e9V1+V}Gs( zj-ld$&)b2QlG}GK6g@QhX6vM#%m@ClJH~)%uYkD=Z{>mbJEEsl@r+I&?>5rEgT;4=nC4Aljyp$YjfKz$Qx((Cr-AsS!g11FK z$a;%l;lf7YtPgvIk69mbkGUGh&Q4ixU;r=kbKTpTyYXyhPcK$*VI?j0g2HNeJPCj` z$9TjM50biAwd5v;Mh{@E^FcgPhb`1Ry~ztN)~w#tu(_c$5ta;&q-ZZIJkWzh_1JuA zfcAEAvG2z45hMxx;ss4br0%}-k=@ut2Px!~X;@E|VGS-X9GUkDQoxedd!dufu>I3T*<^4J(CTWB$+U%}eNs1{bXwqY@b#T8$a zE+m9VjsF;lX*C}URXA{=xSEkj;2DjsI35lp*=tZg;wNn;S88QZCojtkT?%kQl~SS{ zwR#mOCop-ZM4jvOHQBNZX@nyeqUd5FrBS)!#igbs`f6=MkZ)1r73Z-yVK~1n3m3^2 z6fRQYVsV>dUoP4>&EGc0teThF=*zUK5|0yNPaSjF^!noMUVi5_ABuYUeJ?n^sT z0E@OxBT3ZwmkcMZ&%n(?Vuij!e9YcFhFaQ#_{b%5rNGB*wo%~I;6J*=rdn64#zzec zeZk0jvFi31{Ws{wz zs6Edm@>N)WPZdLJaYnTP%ycRL0;IfvSg<1E`r5|^(eG4I?Q47f{j%Iy;zrcAxWT{Nu~G^s=`B- z!3t~)KY?j#ptF~&fvshN*K4UEidJXq2X5$L8dFy-!Hr=;!v^-;cx_Ut!Uka``If>% zb$F10lx$;oVS1NO0yA8aCKI3uinq3=JoY|iLTYr zwZh``z{>6dZ(6ji-;Z4?{U%u*?mul_%%hGoU%2qQm`c|IREs=cNrl-cIWb9znrxQq zIMBY1B`8c;ORi)OW>Iq2UNmV#_;Fq&+FW=T6+a>k;k^flqVO;>QPdZnf8u>=p$U;l zkN$+nDn%}(q>#B3vadCw&frtvW{VgW^On#9l(eT$SEPPt(H_Y3I1n{h zO^BF-(goB^y4Vi7{9xvSB&JBxj-hM{+eL)SrG*!+0=3Y>9I%@=YS0j3jXihFUKC;G z{p8( zsO7rLlYFwVp=63cmEJeNyW!vpw?(8rw5K2?hlbHJg0w}dukylV3!<>_lV4r&lKn4I zingJPo*5&lLSqWvr;gFWLxEfey37xWiHBN@#(#jiD^h}{u4qe!QY2JN;|7Zv1gsmE zm{ovuMGIrIc>>oLFe0GBTN;ARhn=FNHuM0#T;Z`0s~371~Kc>#6@1gRoeFsUi)OBDjkZHxGdr?#jN9QVJcv)<%jiN_IgSSb;Yn zI#2Dl`0P;vO#fkg9Aw^JTklht4R=bAMK&$icQ9Z^497^__M$C@-F?*YeuI?fsnI55 z01Mj-1_~kuRt$rdxqfgmK(wF*xA4=Ryhjn*tG2!r`C(3K9ij;J&9-dx~a zcsMvvy9F8fsuW}rs?M*^0M4thpN^in3+K#*#bfCOvR^F|PPU0AZ;N(o2`1)nt!{Vl zg*CcSH|ZzlMd|60d1DK^d@*naTT1MNVQ4Xu#}s{JbCb~`|J^%eJU50P%lFeQnx?p5 z(1*g*MzCI?GS*9NWS4rA4dfiQX^8bhw3}&b9(vtCDQc-a#MD)w3n)jeFe~U852=dVXRGYN=Kf2~oAqPra~G=cjKl`eJsce1i;%WN?1gH7u@QvDl%_FW;aP zm|ZE_827vd!4xI$Q9;71k6?3{Uu{DR8t$BbKN;8Efjx6tXcuAJcGdS_%{ewlbz61` z!LIGy1zw#ycJyEm&fX^42O5cJUyZ^oQ)~_t1bFaex!e0Yny`P7wS8|j-px^s*@44{ zT|`3}+PMn*Z@c3)w37^C>c+;M?XBCI-P-Ef>IQ2diydr=As6#g2e8F^#)CeMP^T*1 z`~v+hFx4je7cJOT0#yEVTY;#s=Plo5AWN`df0IQvS>j=d?3I)p#%>~d)Cuw2HjbUr z^v&#Mgq8HBEo{q~I25YY8}G8{x|ACGtYe6kE zRJP<^Dr~f{#bJC9FP;Ckw23*V50hKmo6Ey%m%W`$sIo|j@k^%i|iT&b5Rl-L1k z0BcY(iQ>W(c1@$2!KXnWF0^je#x9wojEcLwm4?f`Z#FLkZU46 zW>wQ%MKz?co?hyqeH{A3aax}`XjRiMyentWsy=vR1pM?7TRHL-x)Vuz%?E$D zxQ0pX7$uOiF}%aBn)_QdPOCARv#RNxaaJ`uv+DFHH&=B68@=-yrNM(>Vt#>pJdRgZ z#S?g=nHCc>)81F}Fz5Hgkq{ZjhOtJ3GNKHD(5_F_=&x3_+4Z>kVB&z6L^|yC3hyL8 zQzHYT<~())1KM%(i+6(*DoD}5lH9EA`fnU*-Des8WZ7L|ADqns;BkPW577ocSQdxf zYW(!Qb|ZdS*f)m{R+T;!zLylv^hpGVVEU}x$QQDb9?RK^KH>D+arGy^{N<=A|08xI z(?1d_{{@U%mRV;nKdla&U=>}V{-3oQ@yo(~J$$el74Dm7RDoy!KKIV7`G`|R>pDu5tWY{N&57vA2!J?m3 zPE&q?t)n=hq8ff?AE7F06nxBjMw7ouZ|Z*>G?acD5#wX_8yb}Kk4S|nJ)XWOwFfI9|Cfr|W82vje|1X5noBf*ZzCa89>!Ah=%kxYq zz1i2PUK(z#&bIKaxfXs}e~;5k@khE%AM?D<3+pvySl;3Mzl$`N;m@Qu`w0EBqz}`F zf6pT= z`F~a)3aP^BSK>O6)D$T6iAi4{!VNofq2@>*qC&ND?KX^sv=*y@Ijq$D3l=dlVu;ug40ho3A#$>bS)0_Osdga