finished switching over linux logging

This commit is contained in:
Allen Webster 2017-07-03 11:59:39 -04:00
parent 9491068bfe
commit b8107e74df
2 changed files with 149 additions and 152 deletions

View File

@ -105,7 +105,7 @@ open_all_files_with_extension_internal(Application_Links *app, String dir, char
for (uint32_t i = 0; i < list.count; ++i){ for (uint32_t i = 0; i < list.count; ++i){
File_Info *info = list.infos + i; File_Info *info = list.infos + i;
if (info->folder){ if (info->folder){
if (recursive){ if (recursive && info->filename[0] != '.'){
dir.size = dir_size; dir.size = dir_size;
append(&dir, info->filename); append(&dir, info->filename);
append(&dir, "/"); append(&dir, "/");

View File

@ -285,7 +285,7 @@ internal Linux_Coroutine*
LinuxAllocCoroutine(){ LinuxAllocCoroutine(){
Linux_Coroutine *result = linuxvars.coroutine_free; Linux_Coroutine *result = linuxvars.coroutine_free;
Assert(result != 0); Assert(result != 0);
if(getcontext(&result->ctx) == -1){ if (getcontext(&result->ctx) == -1){
perror("getcontext"); perror("getcontext");
} }
result->ctx.uc_stack = result->stack; result->ctx.uc_stack = result->stack;
@ -396,14 +396,14 @@ Sys_CLI_Call_Sig(system_cli_call){
dup2(pipe_fds[PIPE_FD_WRITE], STDOUT_FILENO); dup2(pipe_fds[PIPE_FD_WRITE], STDOUT_FILENO);
dup2(pipe_fds[PIPE_FD_WRITE], STDERR_FILENO); dup2(pipe_fds[PIPE_FD_WRITE], STDERR_FILENO);
if(chdir(path) == -1){ if (chdir(path) == -1){
perror("system_cli_call: chdir"); perror("system_cli_call: chdir");
exit(1); exit(1);
}; }
char* argv[] = { "sh", "-c", script_name, NULL }; char* argv[] = { "sh", "-c", script_name, NULL };
if(execv("/bin/sh", argv) == -1){ if (execv("/bin/sh", argv) == -1){
perror("system_cli_call: execv"); perror("system_cli_call: execv");
} }
exit(1); exit(1);
@ -444,9 +444,9 @@ Sys_CLI_Update_Step_Sig(system_cli_update_step){
while(space_left > 0 && select(pipe_read_fd + 1, &fds, NULL, NULL, &tv) == 1){ while(space_left > 0 && select(pipe_read_fd + 1, &fds, NULL, NULL, &tv) == 1){
ssize_t num = read(pipe_read_fd, ptr, space_left); ssize_t num = read(pipe_read_fd, ptr, space_left);
if(num == -1){ if (num == -1){
perror("system_cli_update_step: read"); perror("system_cli_update_step: read");
} else if(num == 0){ } else if (num == 0){
// NOTE(inso): EOF // NOTE(inso): EOF
break; break;
} else { } else {
@ -465,7 +465,7 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
b32 close_me = false; b32 close_me = false;
int status; int status;
if(pid && waitpid(pid, &status, WNOHANG) > 0){ if (pid && waitpid(pid, &status, WNOHANG) > 0){
close_me = true; close_me = true;
cli->exit = WEXITSTATUS(status); cli->exit = WEXITSTATUS(status);
@ -843,7 +843,7 @@ LinuxLoadAppCode(String* base_dir){
b32 result = 0; b32 result = 0;
App_Get_Functions *get_funcs = 0; App_Get_Functions *get_funcs = 0;
if(!sysshared_to_binary_path(base_dir, "4ed_app.so")){ if (!sysshared_to_binary_path(base_dir, "4ed_app.so")){
return 0; return 0;
} }
@ -852,7 +852,7 @@ LinuxLoadAppCode(String* base_dir){
get_funcs = (App_Get_Functions*) get_funcs = (App_Get_Functions*)
dlsym(linuxvars.app_code, "app_get_functions"); dlsym(linuxvars.app_code, "app_get_functions");
} else { } else {
fprintf(stderr, "dlopen failed: %s\n", dlerror()); LOGF("dlopen failed: %s\n", dlerror());
} }
if (get_funcs){ if (get_funcs){
@ -979,7 +979,7 @@ GLsizei length,
const GLchar* message, const GLchar* message,
const void* userParam const void* userParam
){ ){
fprintf(stderr, "GL DEBUG: %s\n", message); LOGF("GL DEBUG: %s\n", message);
} }
#endif #endif
@ -1008,7 +1008,7 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
if (!glXCreateContextAttribsARB) if (!glXCreateContextAttribsARB)
{ {
fprintf(stderr, "glXCreateContextAttribsARB() not found, using old-style GLX context\n" ); LOG("glXCreateContextAttribsARB() not found, using old-style GLX context\n" );
ctx = glXCreateNewContext( XDisplay, bestFbc, GLX_RGBA_TYPE, 0, True ); ctx = glXCreateNewContext( XDisplay, bestFbc, GLX_RGBA_TYPE, 0, True );
} }
else else
@ -1024,13 +1024,13 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
None None
}; };
fprintf(stderr, "Creating GL 4.3 context...\n"); LOG("Creating GL 4.3 context...\n");
ctx = glXCreateContextAttribsARB(XDisplay, bestFbc, 0, True, context_attribs); ctx = glXCreateContextAttribsARB(XDisplay, bestFbc, 0, True, context_attribs);
XSync( XDisplay, False ); XSync( XDisplay, False );
if (!ctxErrorOccurred && ctx) if (!ctxErrorOccurred && ctx)
{ {
fprintf(stderr, "Created GL 4.3 context.\n" ); LOG("Created GL 4.3 context.\n" );
} }
else else
{ {
@ -1039,14 +1039,14 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
context_attribs[1] = 3; context_attribs[1] = 3;
context_attribs[3] = 2; context_attribs[3] = 2;
fprintf(stderr, "GL 4.3 unavailable, creating GL 3.2 context...\n" ); LOG("GL 4.3 unavailable, creating GL 3.2 context...\n" );
ctx = glXCreateContextAttribsARB( XDisplay, bestFbc, 0, True, context_attribs ); ctx = glXCreateContextAttribsARB( XDisplay, bestFbc, 0, True, context_attribs );
XSync(XDisplay, False); XSync(XDisplay, False);
if (!ctxErrorOccurred && ctx) if (!ctxErrorOccurred && ctx)
{ {
fprintf(stderr, "Created GL 3.2 context.\n" ); LOG("Created GL 3.2 context.\n" );
} }
else else
{ {
@ -1055,7 +1055,7 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
ctxErrorOccurred = false; ctxErrorOccurred = false;
fprintf(stderr, "Failed to create GL 3.2 context, using old-style GLX context\n"); LOG("Failed to create GL 3.2 context, using old-style GLX context\n");
ctx = glXCreateContextAttribsARB(XDisplay, bestFbc, 0, True, context_attribs); ctx = glXCreateContextAttribsARB(XDisplay, bestFbc, 0, True, context_attribs);
IsLegacy = true; IsLegacy = true;
@ -1066,25 +1066,23 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
XSync(XDisplay, False); XSync(XDisplay, False);
XSetErrorHandler(oldHandler); XSetErrorHandler(oldHandler);
if (ctxErrorOccurred || !ctx) if (ctxErrorOccurred || !ctx){
{ LOG("Failed to create an OpenGL context\n");
fprintf(stderr, "Failed to create an OpenGL context\n");
exit(1); exit(1);
} }
b32 Direct; b32 Direct;
if (!glXIsDirect(XDisplay, ctx)) if (!glXIsDirect(XDisplay, ctx))
{ {
fprintf(stderr, "Indirect GLX rendering context obtained\n"); LOG("Indirect GLX rendering context obtained\n");
Direct = 0; Direct = false;
} }
else else{
{ LOG("Direct GLX rendering context obtained\n");
fprintf(stderr, "Direct GLX rendering context obtained\n"); Direct = true;
Direct = 1;
} }
fprintf(stderr, "Making context current\n"); LOG("Making context current\n");
glXMakeCurrent( XDisplay, XWindow, ctx ); glXMakeCurrent( XDisplay, XWindow, ctx );
char *Vendor = (char *)glGetString(GL_VENDOR); char *Vendor = (char *)glGetString(GL_VENDOR);
@ -1094,58 +1092,59 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
//TODO(inso): glGetStringi is required in core profile if the GL version is >= 3.0 //TODO(inso): glGetStringi is required in core profile if the GL version is >= 3.0
char *Extensions = (char *)glGetString(GL_EXTENSIONS); char *Extensions = (char *)glGetString(GL_EXTENSIONS);
fprintf(stderr, "GL_VENDOR: %s\n", Vendor); LOGF("GL_VENDOR: %s\n", Vendor);
fprintf(stderr, "GL_RENDERER: %s\n", Renderer); LOGF("GL_RENDERER: %s\n", Renderer);
fprintf(stderr, "GL_VERSION: %s\n", Version); LOGF("GL_VERSION: %s\n", Version);
// fprintf(stderr, "GL_EXTENSIONS: %s\n", Extensions);
//NOTE(inso): enable vsync if available. this should probably be optional //NOTE(inso): enable vsync if available. this should probably be optional
if(Direct && strstr(glxExts, "GLX_EXT_swap_control ")){ if (Direct && strstr(glxExts, "GLX_EXT_swap_control ")){
GLXLOAD(glXSwapIntervalEXT); GLXLOAD(glXSwapIntervalEXT);
if(glXSwapIntervalEXT){ if (glXSwapIntervalEXT){
glXSwapIntervalEXT(XDisplay, XWindow, 1); glXSwapIntervalEXT(XDisplay, XWindow, 1);
unsigned int swap_val = 0; unsigned int swap_val = 0;
glXQueryDrawable(XDisplay, XWindow, GLX_SWAP_INTERVAL_EXT, &swap_val); glXQueryDrawable(XDisplay, XWindow, GLX_SWAP_INTERVAL_EXT, &swap_val);
linuxvars.vsync = swap_val == 1; linuxvars.vsync = swap_val == 1;
fprintf(stderr, "VSync enabled? %s.\n", linuxvars.vsync ? "Yes" : "No"); LOGF("VSync enabled? %s.\n", linuxvars.vsync ? "Yes" : "No");
} }
} else if(Direct && strstr(glxExts, "GLX_MESA_swap_control ")){ }
else if (Direct && strstr(glxExts, "GLX_MESA_swap_control ")){
GLXLOAD(glXSwapIntervalMESA); GLXLOAD(glXSwapIntervalMESA);
GLXLOAD(glXGetSwapIntervalMESA); GLXLOAD(glXGetSwapIntervalMESA);
if(glXSwapIntervalMESA){ if (glXSwapIntervalMESA){
glXSwapIntervalMESA(1); glXSwapIntervalMESA(1);
if(glXGetSwapIntervalMESA){ if (glXGetSwapIntervalMESA){
linuxvars.vsync = glXGetSwapIntervalMESA(); linuxvars.vsync = glXGetSwapIntervalMESA();
fprintf(stderr, "VSync enabled? %s (MESA)\n", linuxvars.vsync ? "Yes" : "No"); LOGF("VSync enabled? %s (MESA)\n", linuxvars.vsync ? "Yes" : "No");
} else { } else {
// NOTE(inso): assume it worked? // NOTE(inso): assume it worked?
linuxvars.vsync = 1; linuxvars.vsync = 1;
fputs("VSync enabled? possibly (MESA)\n", stderr); LOG("VSync enabled? possibly (MESA)\n");
} }
} }
} else if(Direct && strstr(glxExts, "GLX_SGI_swap_control ")){ }
else if (Direct && strstr(glxExts, "GLX_SGI_swap_control ")){
GLXLOAD(glXSwapIntervalSGI); GLXLOAD(glXSwapIntervalSGI);
if(glXSwapIntervalSGI){ if (glXSwapIntervalSGI){
glXSwapIntervalSGI(1); glXSwapIntervalSGI(1);
//NOTE(inso): The SGI one doesn't seem to have a way to confirm we got it... //NOTE(inso): The SGI one doesn't seem to have a way to confirm we got it...
linuxvars.vsync = 1; linuxvars.vsync = 1;
fputs("VSync enabled? hopefully (SGI)\n", stderr); LOG("VSync enabled? hopefully (SGI)\n");
} }
} else { }
fputs("VSync enabled? nope, no suitable extension\n", stderr); else{
LOG("VSync enabled? nope, no suitable extension\n");
} }
#if FRED_INTERNAL #if FRED_INTERNAL
@ -1153,8 +1152,8 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig &bestFbc,
GLXLOAD(glDebugMessageCallback); GLXLOAD(glDebugMessageCallback);
if(glDebugMessageCallback){ if (glDebugMessageCallback){
fputs("Enabling GL Debug Callback\n", stderr); LOG("Enabling GL Debug Callback\n");
glDebugMessageCallback(&LinuxGLDebugCallback, 0); glDebugMessageCallback(&LinuxGLDebugCallback, 0);
glEnable(GL_DEBUG_OUTPUT); glEnable(GL_DEBUG_OUTPUT);
} }
@ -1178,11 +1177,11 @@ GLXCanUseFBConfig(Display *XDisplay)
int GLXMajor, GLXMinor; int GLXMajor, GLXMinor;
char *XVendor = ServerVendor(XDisplay); char *XVendor = ServerVendor(XDisplay);
fprintf(stderr, "XWindows vendor: %s\n", XVendor); LOGF("XWindows vendor: %s\n", XVendor);
if(glXQueryVersion(XDisplay, &GLXMajor, &GLXMinor)) if (glXQueryVersion(XDisplay, &GLXMajor, &GLXMinor))
{ {
fprintf(stderr, "GLX version %d.%d\n", GLXMajor, GLXMinor); LOGF("GLX version %d.%d\n", GLXMajor, GLXMinor);
if(((GLXMajor == 1 ) && (GLXMinor >= 3)) || (GLXMajor > 1)) if (((GLXMajor == 1 ) && (GLXMinor >= 3)) || (GLXMajor > 1))
{ {
Result = true; Result = true;
} }
@ -1225,10 +1224,10 @@ ChooseGLXConfig(Display *XDisplay, int XScreenIndex)
XScreenIndex, XScreenIndex,
DesiredAttributes, DesiredAttributes,
&ConfigCount); &ConfigCount);
if(Configs && ConfigCount > 0) if (Configs && ConfigCount > 0)
{ {
XVisualInfo* VI = glXGetVisualFromFBConfig(XDisplay, Configs[0]); XVisualInfo* VI = glXGetVisualFromFBConfig(XDisplay, Configs[0]);
if(VI) if (VI)
{ {
Result.Found = true; Result.Found = true;
Result.BestConfig = Configs[0]; Result.BestConfig = Configs[0];
@ -1236,7 +1235,7 @@ ChooseGLXConfig(Display *XDisplay, int XScreenIndex)
int id = 0; int id = 0;
glXGetFBConfigAttrib(XDisplay, Result.BestConfig, GLX_FBCONFIG_ID, &id); glXGetFBConfigAttrib(XDisplay, Result.BestConfig, GLX_FBCONFIG_ID, &id);
fprintf(stderr, "Using FBConfig: %d (0x%x)\n", id, id); LOGF("Using FBConfig: %d (0x%x)\n", id, id);
XFree(VI); XFree(VI);
} }
@ -1268,12 +1267,12 @@ LinuxInputInit(Display *dpy, Window XWindow){
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
XSetLocaleModifiers(""); XSetLocaleModifiers("");
b32 locale_supported = XSupportsLocale(); b32 locale_supported = XSupportsLocale();
fprintf(stderr, "Supported locale?: %s.\n", locale_supported ? "Yes" : "No"); LOGF("Supported locale?: %s.\n", locale_supported ? "Yes" : "No");
if (!locale_supported){ if (!locale_supported){
fprintf(stderr, "Reverting to 'C' ... "); LOG("Reverting to 'C' ... ");
setlocale(LC_ALL, "C"); setlocale(LC_ALL, "C");
locale_supported = XSupportsLocale(); locale_supported = XSupportsLocale();
fprintf(stderr, "C is supported? %s.\n", locale_supported ? "Yes" : "No"); LOGF("C is supported? %s.\n", locale_supported ? "Yes" : "No");
} }
result.input_method = XOpenIM(dpy, 0, 0, 0); result.input_method = XOpenIM(dpy, 0, 0, 0);
@ -1307,13 +1306,13 @@ LinuxInputInit(Display *dpy, Window XWindow){
} }
else{ else{
result = null_init_input_result; result = null_init_input_result;
fputs("Could not get minimum required input style.\n", stderr); LOG("Could not get minimum required input style.\n");
exit(1); exit(1);
} }
} }
else{ else{
result = null_init_input_result; result = null_init_input_result;
fprintf(stderr, "Could not open X Input Method.\n"); LOG("Could not open X Input Method.\n");
exit(1); exit(1);
} }
@ -1391,12 +1390,12 @@ LinuxKeycodeInit(Display* dpy){
&syms_per_code &syms_per_code
); );
if(!syms) return; if (!syms) return;
int key = key_min; int key = key_min;
for(int i = 0; i < key_count * syms_per_code; ++i){ for(int i = 0; i < key_count * syms_per_code; ++i){
for(int j = 0; j < table_size; ++j){ for(int j = 0; j < table_size; ++j){
if(sym_table[j].sym == syms[i]){ if (sym_table[j].sym == syms[i]){
keycode_lookup_table[key + (i/syms_per_code)] = sym_table[j].code; keycode_lookup_table[key + (i/syms_per_code)] = sym_table[j].code;
break; break;
} }
@ -1413,7 +1412,7 @@ LinuxPushKey(Key_Code code, Key_Code chr, Key_Code chr_nocaps, b8 (*mods)[MDFR_I
i32 *count = &linuxvars.input.keys.count; i32 *count = &linuxvars.input.keys.count;
Key_Event_Data *data = linuxvars.input.keys.keys; Key_Event_Data *data = linuxvars.input.keys.keys;
if(*count < KEY_INPUT_BUFFER_SIZE){ if (*count < KEY_INPUT_BUFFER_SIZE){
data[*count].keycode = code; data[*count].keycode = code;
data[*count].character = chr; data[*count].character = chr;
data[*count].character_no_caps_lock = chr_nocaps; data[*count].character_no_caps_lock = chr_nocaps;
@ -1543,10 +1542,10 @@ LinuxX11ConnectionWatch(Display* dpy, XPointer cdata, int fd, Bool opening, XPoi
internal void internal void
LinuxFatalErrorMsg(const char* msg) LinuxFatalErrorMsg(const char* msg)
{ {
fprintf(stderr, "Fatal Error: %s\n", msg); LOGF("Fatal Error: %s\n", msg);
Display *dpy = XOpenDisplay(0); Display *dpy = XOpenDisplay(0);
if(!dpy){ if (!dpy){
exit(1); exit(1);
} }
@ -1557,8 +1556,8 @@ LinuxFatalErrorMsg(const char* msg)
{ {
const char *start_p = msg, *space_p = NULL; const char *start_p = msg, *space_p = NULL;
for(const char* p = msg; *p; ++p){ for(const char* p = msg; *p; ++p){
if(*p == ' ') space_p = p; if (*p == ' ') space_p = p;
if(*p == '\n' || p - start_p > num_cols){ if (*p == '\n' || p - start_p > num_cols){
win_h += 18; win_h += 18;
start_p = space_p ? space_p + 1 : p; start_p = space_p ? space_p + 1 : p;
space_p = NULL; space_p = NULL;
@ -1596,7 +1595,7 @@ LinuxFatalErrorMsg(const char* msg)
XSelectInput(dpy, w, ExposureMask | StructureNotifyMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask); XSelectInput(dpy, w, ExposureMask | StructureNotifyMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask);
XFontStruct* font = XLoadQueryFont(dpy, "-*-fixed-bold-*-*-*-*-140-*-*-*-*-iso8859-1"); XFontStruct* font = XLoadQueryFont(dpy, "-*-fixed-bold-*-*-*-*-140-*-*-*-*-iso8859-1");
if(!font){ if (!font){
exit(1); exit(1);
} }
@ -1618,9 +1617,9 @@ LinuxFatalErrorMsg(const char* msg)
int redraw = 0; int redraw = 0;
if(ev.type == Expose) redraw = 1; if (ev.type == Expose) redraw = 1;
if(ev.type == ConfigureNotify){ if (ev.type == ConfigureNotify){
redraw = 1; redraw = 1;
win_w = ev.xconfigure.width; win_w = ev.xconfigure.width;
win_h = ev.xconfigure.height; win_h = ev.xconfigure.height;
@ -1628,33 +1627,33 @@ LinuxFatalErrorMsg(const char* msg)
XRectangle button_rect = { win_w/2-40, win_h*0.8f, 80, 20 }; XRectangle button_rect = { win_w/2-40, win_h*0.8f, 80, 20 };
if(ev.type == MotionNotify){ if (ev.type == MotionNotify){
int new_hi = (ev.xmotion.x > button_rect.x && int new_hi = (ev.xmotion.x > button_rect.x &&
ev.xmotion.y > button_rect.y && ev.xmotion.y > button_rect.y &&
ev.xmotion.x < button_rect.x + button_rect.width && ev.xmotion.x < button_rect.x + button_rect.width &&
ev.xmotion.y < button_rect.y + button_rect.height); ev.xmotion.y < button_rect.y + button_rect.height);
if(new_hi != button_hi){ if (new_hi != button_hi){
button_hi = new_hi; button_hi = new_hi;
redraw = 1; redraw = 1;
} }
} }
if(ev.type == KeyPress){ if (ev.type == KeyPress){
KeySym sym = XLookupKeysym(&ev.xkey, 0); KeySym sym = XLookupKeysym(&ev.xkey, 0);
if(sym == XK_Escape || sym == XK_Return){ if (sym == XK_Escape || sym == XK_Return){
exit(1); exit(1);
} }
} }
if(ev.type == ButtonPress && ev.xbutton.button == Button1){ if (ev.type == ButtonPress && ev.xbutton.button == Button1){
if(button_hi) button_trigger = 1; if (button_hi) button_trigger = 1;
redraw = 1; redraw = 1;
} }
if(ev.type == ButtonRelease && ev.xbutton.button == Button1){ if (ev.type == ButtonRelease && ev.xbutton.button == Button1){
if(button_trigger){ if (button_trigger){
if(button_hi){ if (button_hi){
exit(1); exit(1);
} else { } else {
button_trigger = 0; button_trigger = 0;
@ -1663,7 +1662,7 @@ LinuxFatalErrorMsg(const char* msg)
redraw = 1; redraw = 1;
} }
if(ev.type == ClientMessage && ev.xclient.window == w && (Atom)ev.xclient.data.l[0] == WM_DELETE_WINDOW){ if (ev.type == ClientMessage && ev.xclient.window == w && (Atom)ev.xclient.data.l[0] == WM_DELETE_WINDOW){
exit(1); exit(1);
} }
@ -1671,7 +1670,7 @@ LinuxFatalErrorMsg(const char* msg)
XDrawString(dpy, w, gc2, (x)+1, (y)+1, (str), (len)); \ XDrawString(dpy, w, gc2, (x)+1, (y)+1, (str), (len)); \
XDrawString(dpy, w, gc1, (x) , (y) , (str), (len)) XDrawString(dpy, w, gc1, (x) , (y) , (str), (len))
if(redraw){ if (redraw){
XClearWindow(dpy, w); XClearWindow(dpy, w);
const char* line_start = msg; const char* line_start = msg;
@ -1690,11 +1689,11 @@ LinuxFatalErrorMsg(const char* msg)
int x = (win_w/2) - (width/2); int x = (win_w/2) - (width/2);
for(const char* p = line_start; *p; ++p){ for(const char* p = line_start; *p; ++p){
if(*p == ' ') last_space = p; if (*p == ' ') last_space = p;
if(p - line_start > num_cols || *p == '\n' || !p[1]){ if (p - line_start > num_cols || *p == '\n' || !p[1]){
const char* new_line_start = last_space + 1; const char* new_line_start = last_space + 1;
if(!last_space || *p == '\n' || !p[1]){ if (!last_space || *p == '\n' || !p[1]){
new_line_start = last_space = (p + !p[1]); new_line_start = last_space = (p + !p[1]);
} }
@ -1707,7 +1706,7 @@ LinuxFatalErrorMsg(const char* msg)
} }
XDrawRectangles(dpy, w, gc1, &button_rect, 1); XDrawRectangles(dpy, w, gc1, &button_rect, 1);
if(button_hi || button_trigger){ 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); XDrawRectangle(dpy, w, gc2, button_rect.x+1, button_rect.y+1, button_rect.width-2, button_rect.height-2);
} }
@ -1747,13 +1746,13 @@ LinuxGetXSettingsDPI(Display* dpy, int screen)
Atom XSET_SEL = XInternAtom(dpy, sel_buffer, True); Atom XSET_SEL = XInternAtom(dpy, sel_buffer, True);
Atom XSET_SET = XInternAtom(dpy, "_XSETTINGS_SETTINGS", True); Atom XSET_SET = XInternAtom(dpy, "_XSETTINGS_SETTINGS", True);
if(XSET_SEL == None || XSET_SET == None){ if (XSET_SEL == None || XSET_SET == None){
fputs("XSETTINGS unavailable.\n", stderr); LOG("XSETTINGS unavailable.\n");
return dpi; return(dpi);
} }
Window xset_win = XGetSelectionOwner(dpy, XSET_SEL); Window xset_win = XGetSelectionOwner(dpy, XSET_SEL);
if(xset_win == None){ if (xset_win == None){
// TODO(inso): listen for the ClientMessage about it becoming available? // TODO(inso): listen for the ClientMessage about it becoming available?
// there's not much point atm if DPI scaling is only done at startup // there's not much point atm if DPI scaling is only done at startup
goto out; goto out;
@ -1764,13 +1763,13 @@ LinuxGetXSettingsDPI(Display* dpy, int screen)
int fmt; int fmt;
unsigned long pad, num; unsigned long pad, num;
if(XGetWindowProperty(dpy, xset_win, XSET_SET, 0, 1024, False, XSET_SET, &type, &fmt, &num, &pad, &prop) != Success){ if (XGetWindowProperty(dpy, xset_win, XSET_SET, 0, 1024, False, XSET_SET, &type, &fmt, &num, &pad, &prop) != Success){
fputs("XSETTINGS: GetWindowProperty failed.\n", stderr); LOG("XSETTINGS: GetWindowProperty failed.\n");
goto out; goto out;
} }
if(fmt != 8){ if (fmt != 8){
fputs("XSETTINGS: Wrong format.\n", stderr); LOG("XSETTINGS: Wrong format.\n");
goto out; goto out;
} }
} }
@ -1778,27 +1777,24 @@ LinuxGetXSettingsDPI(Display* dpy, int screen)
xs = (struct XSettings*)prop; xs = (struct XSettings*)prop;
p = (char*)(xs + 1); p = (char*)(xs + 1);
if(xs->byte_order != 0){ if (xs->byte_order != 0){
fputs("FIXME: XSETTINGS not host byte order?\n", stderr); LOG("FIXME: XSETTINGS not host byte order?\n");
goto out; goto out;
} }
for(int i = 0; i < xs->num_settings; ++i){ for (int i = 0; i < xs->num_settings; ++i){
struct XSettingHeader* h = (struct XSettingHeader*)p; 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 += sizeof(struct XSettingHeader);
p += h->name_len; p += h->name_len;
p += ((4 - (h->name_len & 3)) & 3); p += ((4 - (h->name_len & 3)) & 3);
p += 4; // serial p += 4; // serial
switch(h->type){ switch (h->type){
case XSettingsTypeInt: { case XSettingsTypeInt: {
if(strncmp(h->name, "Xft/DPI", h->name_len) == 0){ if (strncmp(h->name, "Xft/DPI", h->name_len) == 0){
dpi = *(i32*)p; dpi = *(i32*)p;
if(dpi != -1) dpi /= 1024; if (dpi != -1) dpi /= 1024;
} }
p += 4; p += 4;
} break; } break;
@ -1815,14 +1811,14 @@ LinuxGetXSettingsDPI(Display* dpy, int screen)
} break; } break;
default: { default: {
fputs("XSETTINGS: Got invalid type...\n", stderr); LOG("XSETTINGS: Got invalid type...\n");
goto out; goto out;
} break; } break;
} }
} }
out: out:
if(prop){ if (prop){
XFree(prop); XFree(prop);
} }
@ -1954,7 +1950,7 @@ LinuxX11WindowInit(int argc, char** argv, int* window_width, int* window_height)
if (linuxvars.settings.maximize_window){ if (linuxvars.settings.maximize_window){
LinuxMaximizeWindow(linuxvars.XDisplay, linuxvars.XWindow, 1); LinuxMaximizeWindow(linuxvars.XDisplay, linuxvars.XWindow, 1);
} }
else if(linuxvars.settings.fullscreen_window){ else if (linuxvars.settings.fullscreen_window){
LinuxToggleFullscreen(linuxvars.XDisplay, linuxvars.XWindow); LinuxToggleFullscreen(linuxvars.XDisplay, linuxvars.XWindow);
} }
@ -2003,10 +1999,10 @@ LinuxHandleX11Events(void)
b8 mods[MDFR_INDEX_COUNT] = {}; b8 mods[MDFR_INDEX_COUNT] = {};
mods[MDFR_HOLD_INDEX] = is_hold; mods[MDFR_HOLD_INDEX] = is_hold;
if(Event.xkey.state & ShiftMask) mods[MDFR_SHIFT_INDEX] = 1; if (Event.xkey.state & ShiftMask) mods[MDFR_SHIFT_INDEX] = 1;
if(Event.xkey.state & ControlMask) mods[MDFR_CONTROL_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 & LockMask) mods[MDFR_CAPS_INDEX] = 1;
if(Event.xkey.state & Mod1Mask) mods[MDFR_ALT_INDEX] = 1; if (Event.xkey.state & Mod1Mask) mods[MDFR_ALT_INDEX] = 1;
Event.xkey.state &= ~(ControlMask); Event.xkey.state &= ~(ControlMask);
@ -2016,45 +2012,45 @@ LinuxHandleX11Events(void)
Xutf8LookupString(linuxvars.input_context, &Event.xkey, (char*)buff, sizeof(buff) - 1, &keysym, &status); Xutf8LookupString(linuxvars.input_context, &Event.xkey, (char*)buff, sizeof(buff) - 1, &keysym, &status);
if(status == XBufferOverflow){ if (status == XBufferOverflow){
//TODO(inso): handle properly //TODO(inso): handle properly
Xutf8ResetIC(linuxvars.input_context); Xutf8ResetIC(linuxvars.input_context);
XSetICFocus(linuxvars.input_context); XSetICFocus(linuxvars.input_context);
fputs("FIXME: XBufferOverflow from LookupString.\n", stderr); LOG("FIXME: XBufferOverflow from LookupString.\n");
} }
u32 key = utf8_to_u32_unchecked(buff); u32 key = utf8_to_u32_unchecked(buff);
u32 key_no_caps = key; u32 key_no_caps = key;
if(mods[MDFR_CAPS_INDEX] && status == XLookupBoth && Event.xkey.keycode){ if (mods[MDFR_CAPS_INDEX] && status == XLookupBoth && Event.xkey.keycode){
u8 buff_no_caps[32] = {0}; u8 buff_no_caps[32] = {0};
Event.xkey.state &= ~(LockMask); Event.xkey.state &= ~(LockMask);
XLookupString(&Event.xkey, (char*)buff_no_caps, sizeof(buff_no_caps) - 1, NULL, NULL); XLookupString(&Event.xkey, (char*)buff_no_caps, sizeof(buff_no_caps) - 1, NULL, NULL);
if(*buff_no_caps){ if (*buff_no_caps){
key_no_caps = utf8_to_u32_unchecked(buff_no_caps); key_no_caps = utf8_to_u32_unchecked(buff_no_caps);
} }
} }
if(key == '\r') key = '\n'; if (key == '\r') key = '\n';
if(key_no_caps == '\r') key_no_caps = '\n'; if (key_no_caps == '\r') key_no_caps = '\n';
// don't push modifiers // don't push modifiers
if(keysym >= XK_Shift_L && keysym <= XK_Hyper_R){ if (keysym >= XK_Shift_L && keysym <= XK_Hyper_R){
break; break;
} }
if(keysym == XK_ISO_Left_Tab){ if (keysym == XK_ISO_Left_Tab){
key = key_no_caps = '\t'; key = key_no_caps = '\t';
mods[MDFR_SHIFT_INDEX] = 1; mods[MDFR_SHIFT_INDEX] = 1;
} }
Key_Code special_key = keycode_lookup_table[(u8)Event.xkey.keycode]; Key_Code special_key = keycode_lookup_table[(u8)Event.xkey.keycode];
if(special_key){ if (special_key){
LinuxPushKey(special_key, 0, 0, &mods); LinuxPushKey(special_key, 0, 0, &mods);
} else if(key < 256){ } else if (key < 256){
LinuxPushKey(key, key, key_no_caps, &mods); LinuxPushKey(key, key, key_no_caps, &mods);
} else { } else {
LinuxPushKey(0, 0, 0, &mods); LinuxPushKey(0, 0, 0, &mods);
@ -2131,13 +2127,13 @@ LinuxHandleX11Events(void)
i32 w = Event.xconfigure.width; i32 w = Event.xconfigure.width;
i32 h = Event.xconfigure.height; i32 h = Event.xconfigure.height;
if(w != linuxvars.target.width || h != linuxvars.target.height){ if (w != linuxvars.target.width || h != linuxvars.target.height){
LinuxResizeTarget(w, h); LinuxResizeTarget(w, h);
} }
}break; }break;
case MappingNotify: { case MappingNotify: {
if(Event.xmapping.request == MappingModifier || Event.xmapping.request == MappingKeyboard){ if (Event.xmapping.request == MappingModifier || Event.xmapping.request == MappingKeyboard){
XRefreshKeyboardMapping(&Event.xmapping); XRefreshKeyboardMapping(&Event.xmapping);
LinuxKeycodeInit(linuxvars.XDisplay); LinuxKeycodeInit(linuxvars.XDisplay);
} }
@ -2184,7 +2180,7 @@ LinuxHandleX11Events(void)
linuxvars.atom_UTF8_STRING linuxvars.atom_UTF8_STRING
}; };
if(request.target == linuxvars.atom_TARGETS){ if (request.target == linuxvars.atom_TARGETS){
XChangeProperty( XChangeProperty(
request.display, request.display,
@ -2202,13 +2198,13 @@ LinuxHandleX11Events(void)
} else { } else {
b32 found = false; b32 found = false;
for(int i = 0; i < ArrayCount(atoms); ++i){ for(int i = 0; i < ArrayCount(atoms); ++i){
if(request.target == atoms[i]){ if (request.target == atoms[i]){
found = true; found = true;
break; break;
} }
} }
if(found){ if (found){
XChangeProperty( XChangeProperty(
request.display, request.display,
request.requestor, request.requestor,
@ -2231,7 +2227,7 @@ LinuxHandleX11Events(void)
// NOTE(inso): Another program is now the clipboard owner. // NOTE(inso): Another program is now the clipboard owner.
case SelectionClear: { case SelectionClear: {
if(Event.xselectionclear.selection == linuxvars.atom_CLIPBOARD){ if (Event.xselectionclear.selection == linuxvars.atom_CLIPBOARD){
linuxvars.clipboard_outgoing.size = 0; linuxvars.clipboard_outgoing.size = 0;
} }
}break; }break;
@ -2239,7 +2235,7 @@ LinuxHandleX11Events(void)
// NOTE(inso): A program is giving us the clipboard data we asked for. // NOTE(inso): A program is giving us the clipboard data we asked for.
case SelectionNotify: { case SelectionNotify: {
XSelectionEvent* e = (XSelectionEvent*)&Event; XSelectionEvent* e = (XSelectionEvent*)&Event;
if(e->selection == linuxvars.atom_CLIPBOARD && e->target == linuxvars.atom_UTF8_STRING && e->property != None){ if (e->selection == linuxvars.atom_CLIPBOARD && e->target == linuxvars.atom_UTF8_STRING && e->property != None){
Atom type; Atom type;
int fmt; int fmt;
unsigned long nitems, bytes_left; unsigned long nitems, bytes_left;
@ -2247,7 +2243,7 @@ LinuxHandleX11Events(void)
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); 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){ if (result == Success && fmt == 8){
LinuxStringDup(&linuxvars.clipboard_contents, data, nitems); LinuxStringDup(&linuxvars.clipboard_contents, data, nitems);
should_step = 1; should_step = 1;
linuxvars.new_clipboard = 1; linuxvars.new_clipboard = 1;
@ -2263,9 +2259,9 @@ LinuxHandleX11Events(void)
}break; }break;
default: { default: {
if(Event.type == linuxvars.xfixes_selection_event){ if (Event.type == linuxvars.xfixes_selection_event){
XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&Event; XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&Event;
if(sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.XWindow){ if (sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.XWindow){
XConvertSelection(linuxvars.XDisplay, linuxvars.atom_CLIPBOARD, linuxvars.atom_UTF8_STRING, linuxvars.atom_CLIPBOARD, linuxvars.XWindow, CurrentTime); XConvertSelection(linuxvars.XDisplay, linuxvars.atom_CLIPBOARD, linuxvars.atom_UTF8_STRING, linuxvars.atom_CLIPBOARD, linuxvars.XWindow, CurrentTime);
} }
} }
@ -2275,7 +2271,7 @@ LinuxHandleX11Events(void)
PrevEvent = Event; PrevEvent = Event;
} }
if(should_step){ if (should_step){
LinuxScheduleStep(); LinuxScheduleStep();
} }
} }
@ -2311,7 +2307,7 @@ main(int argc, char **argv){
linuxvars.target.max = MB(1); linuxvars.target.max = MB(1);
linuxvars.target.push_buffer = (char*)system_memory_allocate(linuxvars.target.max); linuxvars.target.push_buffer = (char*)system_memory_allocate(linuxvars.target.max);
if(memory_vars.vars_memory == NULL || memory_vars.target_memory == NULL || memory_vars.user_memory == NULL || linuxvars.target.push_buffer == NULL){ 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)."); 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); exit(1);
} }
@ -2323,7 +2319,7 @@ main(int argc, char **argv){
// //
char* cwd = get_current_dir_name(); char* cwd = get_current_dir_name();
if(!cwd){ if (!cwd){
char buf[1024]; char buf[1024];
snprintf(buf, sizeof(buf), "Call to get_current_dir_name failed: %s", strerror(errno)); snprintf(buf, sizeof(buf), "Call to get_current_dir_name failed: %s", strerror(errno));
LinuxFatalErrorMsg(buf); LinuxFatalErrorMsg(buf);
@ -2343,8 +2339,7 @@ main(int argc, char **argv){
output_size = linuxvars.app.read_command_line(&linuxvars.system, &memory_vars, current_directory, &linuxvars.settings, &files, &file_count, clparams); output_size = linuxvars.app.read_command_line(&linuxvars.system, &memory_vars, current_directory, &linuxvars.settings, &files, &file_count, clparams);
if (output_size > 0){ if (output_size > 0){
// TODO(allen): crt free version LOGF("%.*s", output_size, (char*)memory_vars.target_memory);
fprintf(stdout, "%.*s", output_size, (char*)memory_vars.target_memory);
} }
if (output_size != 0){ if (output_size != 0){
LinuxFatalErrorMsg("Error reading command-line arguments."); LinuxFatalErrorMsg("Error reading command-line arguments.");
@ -2399,7 +2394,7 @@ main(int argc, char **argv){
exit(1); exit(1);
} }
else{ else{
fprintf(stderr, "Successfully loaded custom_4coder.so\n"); LOG("Successfully loaded custom_4coder.so\n");
} }
} }
} else { } else {
@ -2470,10 +2465,10 @@ main(int argc, char **argv){
// //
linuxvars.XDisplay = XOpenDisplay(0); linuxvars.XDisplay = XOpenDisplay(0);
if(!linuxvars.XDisplay){ if (!linuxvars.XDisplay){
// NOTE(inso): probably not worth trying the popup in this case... // NOTE(inso): probably not worth trying the popup in this case...
fprintf(stderr, "Can't open display!\n"); LOG("Can't open display!\n");
return 1; return(1);
} }
#define LOAD_ATOM(x) linuxvars.atom_##x = XInternAtom(linuxvars.XDisplay, #x, False); #define LOAD_ATOM(x) linuxvars.atom_##x = XInternAtom(linuxvars.XDisplay, #x, False);
@ -2496,7 +2491,7 @@ main(int argc, char **argv){
linuxvars.dpi_x = linuxvars.dpi_y = LinuxGetXSettingsDPI(linuxvars.XDisplay, DefaultScreen(linuxvars.XDisplay)); linuxvars.dpi_x = linuxvars.dpi_y = LinuxGetXSettingsDPI(linuxvars.XDisplay, DefaultScreen(linuxvars.XDisplay));
// fallback // fallback
if(linuxvars.dpi_x == -1){ if (linuxvars.dpi_x == -1){
int scr = DefaultScreen(linuxvars.XDisplay); int scr = DefaultScreen(linuxvars.XDisplay);
int dw = DisplayWidth(linuxvars.XDisplay, scr); int dw = DisplayWidth(linuxvars.XDisplay, scr);
@ -2508,10 +2503,10 @@ main(int argc, char **argv){
linuxvars.dpi_x = dw_mm ? dw / (dw_mm / 25.4) : 96; linuxvars.dpi_x = dw_mm ? dw / (dw_mm / 25.4) : 96;
linuxvars.dpi_y = dh_mm ? dh / (dh_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); LOGF("%dx%d - %dmmx%dmm DPI: %dx%d\n", dw, dh, dw_mm, dh_mm, linuxvars.dpi_x, linuxvars.dpi_y);
} }
else{ else{
fprintf(stderr, "DPI from XSETTINGS: %d\n", linuxvars.dpi_x); LOGF("DPI from XSETTINGS: %d\n", linuxvars.dpi_x);
} }
int window_width, window_height; int window_width, window_height;
@ -2527,7 +2522,7 @@ main(int argc, char **argv){
XFixesSelectSelectionInput(linuxvars.XDisplay, linuxvars.XWindow, linuxvars.atom_CLIPBOARD, XFixesSetSelectionOwnerNotifyMask); XFixesSelectSelectionInput(linuxvars.XDisplay, linuxvars.XWindow, linuxvars.atom_CLIPBOARD, XFixesSetSelectionOwnerNotifyMask);
} }
else{ else{
fprintf(stderr, "Your X server doesn't support XFIXES, mention this fact if you report any clipboard-related issues.\n"); LOG("Your X server doesn't support XFIXES, mention this fact if you report any clipboard-related issues.\n");
} }
Init_Input_Result input_result = LinuxInputInit(linuxvars.XDisplay, linuxvars.XWindow); Init_Input_Result input_result = LinuxInputInit(linuxvars.XDisplay, linuxvars.XWindow);
@ -2624,7 +2619,7 @@ main(int argc, char **argv){
if (num_events == -1){ if (num_events == -1){
if (errno != EINTR){ if (errno != EINTR){
fprintf(stderr, "epoll_wait\n"); LOG("epoll_wait\n");
} }
continue; continue;
} }
@ -2668,10 +2663,10 @@ main(int argc, char **argv){
} }
} }
if(do_step){ if (do_step){
linuxvars.last_step = system_now_time(); linuxvars.last_step = system_now_time();
if(linuxvars.input.first_step || !linuxvars.has_xfixes){ if (linuxvars.input.first_step || !linuxvars.has_xfixes){
XConvertSelection( XConvertSelection(
linuxvars.XDisplay, linuxvars.XDisplay,
linuxvars.atom_CLIPBOARD, linuxvars.atom_CLIPBOARD,
@ -2686,7 +2681,7 @@ main(int argc, char **argv){
result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT; result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT;
result.trying_to_kill = !linuxvars.keep_running; result.trying_to_kill = !linuxvars.keep_running;
if(linuxvars.new_clipboard){ if (linuxvars.new_clipboard){
linuxvars.input.clipboard = linuxvars.clipboard_contents; linuxvars.input.clipboard = linuxvars.clipboard_contents;
linuxvars.new_clipboard = 0; linuxvars.new_clipboard = 0;
} else { } else {
@ -2704,21 +2699,21 @@ main(int argc, char **argv){
clparams clparams
); );
if(result.perform_kill){ if (result.perform_kill){
break; break;
} else if(!keep_running && !linuxvars.keep_running){ } else if (!keep_running && !linuxvars.keep_running){
linuxvars.keep_running = 1; linuxvars.keep_running = 1;
} }
if(result.animating){ if (result.animating){
LinuxScheduleStep(); LinuxScheduleStep();
} }
LinuxRedrawTarget(); LinuxRedrawTarget();
if(result.mouse_cursor_type != linuxvars.cursor && !linuxvars.input.mouse.l){ if (result.mouse_cursor_type != linuxvars.cursor && !linuxvars.input.mouse.l){
Cursor c = xcursors[result.mouse_cursor_type]; Cursor c = xcursors[result.mouse_cursor_type];
if(!linuxvars.hide_cursor){ if (!linuxvars.hide_cursor){
XDefineCursor(linuxvars.XDisplay, linuxvars.XWindow, c); XDefineCursor(linuxvars.XDisplay, linuxvars.XWindow, c);
} }
linuxvars.cursor = result.mouse_cursor_type; linuxvars.cursor = result.mouse_cursor_type;
@ -2736,8 +2731,10 @@ main(int argc, char **argv){
} }
} }
if(linuxvars.XDisplay){ if (linuxvars.XDisplay){
if(linuxvars.XWindow) XDestroyWindow(linuxvars.XDisplay, linuxvars.XWindow); if (linuxvars.XWindow){
XDestroyWindow(linuxvars.XDisplay, linuxvars.XWindow);
}
XCloseDisplay(linuxvars.XDisplay); XCloseDisplay(linuxvars.XDisplay);
} }