From ea76b6988ccafaa6a4d4ed90f2489d0e49e1f180 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Sat, 5 Sep 2015 09:32:30 -0400 Subject: Imported Upstream version 0.40.24 --- g_src/win32_compat.cpp | 184 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100755 g_src/win32_compat.cpp (limited to 'g_src/win32_compat.cpp') diff --git a/g_src/win32_compat.cpp b/g_src/win32_compat.cpp new file mode 100755 index 0000000..44d6ace --- /dev/null +++ b/g_src/win32_compat.cpp @@ -0,0 +1,184 @@ +#include + +#include "enabler.h" +#include "platform.h" +#ifndef WIN32 +# include +# include +# include +# include +# include +# include +# include +# ifdef __APPLE__ +# include "osx_messagebox.h" +# elif defined(unix) +# include +# endif +#endif + +#ifndef WIN32 +BOOL CreateDirectory(const char* pathname, void*) +{ + if (mkdir(pathname, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) { + if (errno != EEXIST) { + std::string emsg = "mkdir("; + emsg.append(pathname); + emsg.append(") failed"); + perror(emsg.c_str()); + } + return FALSE; + } else { + return TRUE; + } +} + +BOOL DeleteFile(const char* filename) +{ + return !unlink(filename); +} + +void ZeroMemory(void* dest, int len) +{ + memset(dest, 0, len); +} + +/* Returns milliseconds since 1970 + * Wraps every 24 days (assuming 32-bit signed dwords) + */ +DWORD GetTickCount() +{ + struct timeval tp; + gettimeofday(&tp, NULL); + return (tp.tv_sec * 1000) + (tp.tv_usec / 1000); +} + +char* itoa(int value, char* result, int base) +{ + // check that the base is valid + if (base < 2 || base > 16) { *result = 0; return result; } + + char* out = result; + int quot = value; + + do + { + *out = "0123456789abcdef"[ /*std::*/abs(quot % base) ]; + ++out; + quot /= base; + } + while (quot); + + if (value < 0) *out++ = '-'; + + std::reverse(result, out); + *out = 0; + return result; +} + +// Fills performanceCount with microseconds passed since 1970 +// Wraps in twenty-nine thousand years or so +BOOL QueryPerformanceCounter(LARGE_INTEGER* performanceCount) +{ + struct timeval tp; + gettimeofday(&tp, NULL); + performanceCount->QuadPart = ((long long)tp.tv_sec * 1000000) + tp.tv_usec; + return TRUE; +} + +BOOL QueryPerformanceFrequency(LARGE_INTEGER* performanceCount) +{ + /* A constant, 10^6, as we give microseconds since 1970 in + * QueryPerformanceCounter. */ + performanceCount->QuadPart = 1000000; + + return TRUE; +} + +int MessageBox(HWND *dummy, const char *text, const char *caption, UINT type) +{ + bool toggle_screen = false; + int ret = IDOK; + if (enabler.is_fullscreen()) { + enabler.toggle_fullscreen(); + toggle_screen = true; + } +# ifdef __APPLE__ // Cocoa code + if (type & MB_YESNO) { + ret = CocoaAlertPanel(caption, text, "Yes", "No", NULL); + ret = (ret == 0 ? IDNO : IDYES); + } else { + CocoaAlertPanel(caption, text, "OK", NULL, NULL); + } +# else // GTK code + if (getenv("DISPLAY")) { + // Have X, will dialog + GtkWidget *dialog = gtk_message_dialog_new(NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + type & MB_YESNO ? + GTK_MESSAGE_QUESTION : + GTK_MESSAGE_ERROR, + type & MB_YESNO ? + GTK_BUTTONS_YES_NO : + GTK_BUTTONS_OK, + "%s", text); + gtk_window_set_position((GtkWindow*)dialog, GTK_WIN_POS_CENTER_ALWAYS); + gtk_window_set_title((GtkWindow*)dialog, caption); + gint dialog_ret = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + while (gtk_events_pending()) + gtk_main_iteration(); + + if (type & MB_YESNO) { + switch (dialog_ret) { + default: + case GTK_RESPONSE_DELETE_EVENT: + case GTK_RESPONSE_NO: + ret = IDNO; + break; + case GTK_RESPONSE_YES: + ret = IDYES; + break; + } + } + } else { + // Use curses + init_curses(); + erase(); + gps.force_full_display_count = 1; + wattrset(*stdscr_p, A_NORMAL | COLOR_PAIR(1)); + + mvwaddstr(*stdscr_p, 0, 5, caption); + mvwaddstr(*stdscr_p, 2, 2, text); + nodelay(*stdscr_p, false); + if (type & MB_YESNO) { + mvwaddstr(*stdscr_p, 5, 0, "Press 'y' or 'n'."); + refresh(); + while (1) { + char i = wgetch(*stdscr_p); + if (i == 'y') { + ret = IDYES; + break; + } + else if (i == 'n') { + ret = IDNO; + break; + } + } + } + else { + mvwaddstr(*stdscr_p, 5, 0, "Press any key to continue."); + refresh(); + wgetch(*stdscr_p); + } + nodelay(*stdscr_p, -1); + } +# endif + + if (toggle_screen) { + enabler.toggle_fullscreen(); + } + + return ret; +} +#endif -- cgit v1.2.3