diff --git a/libs_win32/app.h b/libs_win32/app.h index f2b76aa..9456767 100644 --- a/libs_win32/app.h +++ b/libs_win32/app.h @@ -24,8 +24,8 @@ before you include this file in *one* C/C++ file to create the implementation. #define APP_U64 unsigned long long #endif +#include "app_types.h" -typedef struct app_t app_t; int app_run( int (*app_proc)( app_t*, void* ), void* user_data, void* memctx, void* logctx, void* fatalctx ); @@ -43,7 +43,6 @@ char const* app_appdata( app_t* app ); APP_U64 app_time_count( app_t* app ); APP_U64 app_time_freq( app_t* app ); -typedef enum app_log_level_t { APP_LOG_LEVEL_INFO, APP_LOG_LEVEL_WARNING, APP_LOG_LEVEL_ERROR, } app_log_level_t; void app_log( app_t* app, app_log_level_t level, char const* message ); void app_fatal_error( app_t* app, char const* message ); @@ -57,10 +56,8 @@ int app_pointer_y( app_t* app ); void app_pointer_limit( app_t* app, int x, int y, int width, int height ); void app_pointer_limit_off( app_t* app ); -typedef enum app_interpolation_t { APP_INTERPOLATION_NONE, APP_INTERPOLATION_LINEAR, } app_interpolation_t; void app_interpolation( app_t* app, app_interpolation_t interpolation ); -typedef enum app_screenmode_t { APP_SCREENMODE_WINDOW, APP_SCREENMODE_FULLSCREEN, } app_screenmode_t; void app_screenmode( app_t* app, app_screenmode_t screenmode ); void app_window_size( app_t* app, int width, int height ); @@ -71,16 +68,7 @@ void app_window_pos( app_t* app, int x, int y ); int app_window_x( app_t* app ); int app_window_y( app_t* app ); -typedef struct app_display_t - { - char id[ 64 ]; - int x; - int y; - int width; - int height; - } app_display_t ; -typedef struct app_displays_t { app_display_t* displays; int count; } app_displays_t; app_displays_t app_displays( app_t* app ); void app_present( app_t* app, APP_U32 const* pixels_xbgr, int width, int height, APP_U32 mod_xbgr, APP_U32 border_xbgr ); @@ -89,52 +77,9 @@ void app_sound( app_t* app, int sample_pairs_count, void (*sound_callback)( APP_S16* sample_pairs, int sample_pairs_count, void* user_data ), void* user_data ); void app_sound_volume( app_t* app, float volume ); -typedef enum app_key_t { APP_KEY_INVALID, APP_KEY_LBUTTON, APP_KEY_RBUTTON, APP_KEY_CANCEL, APP_KEY_MBUTTON, - APP_KEY_XBUTTON1, APP_KEY_XBUTTON2, APP_KEY_BACK, APP_KEY_TAB, APP_KEY_CLEAR, APP_KEY_RETURN, APP_KEY_SHIFT, - APP_KEY_CONTROL, APP_KEY_MENU, APP_KEY_PAUSE, APP_KEY_CAPITAL, APP_KEY_KANA, APP_KEY_HANGUL = APP_KEY_KANA, - APP_KEY_JUNJA, APP_KEY_FINAL, APP_KEY_HANJA, APP_KEY_KANJI = APP_KEY_HANJA, APP_KEY_ESCAPE, APP_KEY_CONVERT, - APP_KEY_NONCONVERT, APP_KEY_ACCEPT, APP_KEY_MODECHANGE, APP_KEY_SPACE, APP_KEY_PRIOR, APP_KEY_NEXT, APP_KEY_END, - APP_KEY_HOME, APP_KEY_LEFT, APP_KEY_UP, APP_KEY_RIGHT, APP_KEY_DOWN, APP_KEY_SELECT, APP_KEY_PRINT, APP_KEY_EXEC, - APP_KEY_SNAPSHOT, APP_KEY_INSERT, APP_KEY_DELETE, APP_KEY_HELP, APP_KEY_0, APP_KEY_1, APP_KEY_2, APP_KEY_3, - APP_KEY_4, APP_KEY_5, APP_KEY_6, APP_KEY_7, APP_KEY_8, APP_KEY_9, APP_KEY_A, APP_KEY_B, APP_KEY_C, APP_KEY_D, - APP_KEY_E, APP_KEY_F, APP_KEY_G, APP_KEY_H, APP_KEY_I, APP_KEY_J, APP_KEY_K, APP_KEY_L, APP_KEY_M, APP_KEY_N, - APP_KEY_O, APP_KEY_P, APP_KEY_Q, APP_KEY_R, APP_KEY_S, APP_KEY_T, APP_KEY_U, APP_KEY_V, APP_KEY_W, APP_KEY_X, - APP_KEY_Y, APP_KEY_Z, APP_KEY_LWIN, APP_KEY_RWIN, APP_KEY_APPS, APP_KEY_SLEEP, APP_KEY_NUMPAD0, APP_KEY_NUMPAD1, - APP_KEY_NUMPAD2, APP_KEY_NUMPAD3, APP_KEY_NUMPAD4, APP_KEY_NUMPAD5, APP_KEY_NUMPAD6, APP_KEY_NUMPAD7, - APP_KEY_NUMPAD8, APP_KEY_NUMPAD9, APP_KEY_MULTIPLY, APP_KEY_ADD, APP_KEY_SEPARATOR, APP_KEY_SUBTRACT, - APP_KEY_DECIMAL, APP_KEY_DIVIDE, APP_KEY_F1, APP_KEY_F2, APP_KEY_F3, APP_KEY_F4, APP_KEY_F5, APP_KEY_F6, APP_KEY_F7, - APP_KEY_F8, APP_KEY_F9, APP_KEY_F10, APP_KEY_F11, APP_KEY_F12, APP_KEY_F13, APP_KEY_F14, APP_KEY_F15, APP_KEY_F16, - APP_KEY_F17, APP_KEY_F18, APP_KEY_F19, APP_KEY_F20, APP_KEY_F21, APP_KEY_F22, APP_KEY_F23, APP_KEY_F24, - APP_KEY_NUMLOCK, APP_KEY_SCROLL, APP_KEY_LSHIFT, APP_KEY_RSHIFT, APP_KEY_LCONTROL, APP_KEY_RCONTROL, APP_KEY_LMENU, - APP_KEY_RMENU, APP_KEY_BROWSER_BACK, APP_KEY_BROWSER_FORWARD, APP_KEY_BROWSER_REFRESH, APP_KEY_BROWSER_STOP, - APP_KEY_BROWSER_SEARCH, APP_KEY_BROWSER_FAVORITES, APP_KEY_BROWSER_HOME, APP_KEY_VOLUME_MUTE, APP_KEY_VOLUME_DOWN, - APP_KEY_VOLUME_UP, APP_KEY_MEDIA_NEXT_TRACK, APP_KEY_MEDIA_PREV_TRACK, APP_KEY_MEDIA_STOP, APP_KEY_MEDIA_PLAY_PAUSE, - APP_KEY_LAUNCH_MAIL, APP_KEY_LAUNCH_MEDIA_SELECT, APP_KEY_LAUNCH_APP1, APP_KEY_LAUNCH_APP2, APP_KEY_OEM_1, - APP_KEY_OEM_PLUS, APP_KEY_OEM_COMMA, APP_KEY_OEM_MINUS, APP_KEY_OEM_PERIOD, APP_KEY_OEM_2, APP_KEY_OEM_3, - APP_KEY_OEM_4, APP_KEY_OEM_5, APP_KEY_OEM_6, APP_KEY_OEM_7, APP_KEY_OEM_8, APP_KEY_OEM_102, APP_KEY_PROCESSKEY, - APP_KEY_ATTN, APP_KEY_CRSEL, APP_KEY_EXSEL, APP_KEY_EREOF, APP_KEY_PLAY, APP_KEY_ZOOM, APP_KEY_NONAME, APP_KEY_PA1, - APP_KEY_OEM_CLEAR, APP_KEYCOUNT } app_key_t; -typedef enum app_input_type_t { APP_INPUT_KEY_DOWN, APP_INPUT_KEY_UP, APP_INPUT_DOUBLE_CLICK, APP_INPUT_CHAR, - APP_INPUT_MOUSE_MOVE, APP_INPUT_MOUSE_DELTA, APP_INPUT_SCROLL_WHEEL, APP_INPUT_TABLET } app_input_type_t; -typedef enum app_pressed_t { APP_NOT_PRESSED, APP_PRESSED, } app_pressed_t; -typedef struct app_input_event_t - { - app_input_type_t type; - union data_t - { - app_key_t key; - char char_code; - struct { int x; int y; } mouse_pos; - struct { float x; float y; } mouse_delta; - float wheel_delta; - struct { int x; int y; float pressure; app_pressed_t tip; app_pressed_t lower; app_pressed_t upper; } tablet; - } data; - } app_input_event_t; - -typedef struct app_input_t { app_input_event_t* events; int count; } app_input_t; app_input_t app_input( app_t* app ); void app_coordinates_window_to_bitmap( app_t* app, int width, int height, int* x, int* y ); @@ -1142,7 +1087,6 @@ static void app_internal_opengl_interpolation( struct app_internal_opengl_t* gl, #if defined( APP_NULL ) -struct app_t { void* dummy; }; int app_run( int (*app_proc)( app_t*, void* ), void* user_data, void* memctx, void* logctx, void* fatalctx ) { app_t app; return app_proc( &app, user_data ); } app_state_t app_yield( app_t* app ) { return APP_STATE_NORMAL; } void app_cancel_exit( app_t* app ) { } @@ -1292,232 +1236,10 @@ DECLARE_HANDLE( APP_HCTX ); ////// DSOUND DEFINITIONS //////// -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus -typedef struct _DSOUND_WAVEFORMATEX - { - WORD wFormatTag; - WORD nChannels; - DWORD nSamplesPerSec; - DWORD nAvgBytesPerSec; - WORD nBlockAlign; - WORD wBitsPerSample; - WORD cbSize; - } DSOUND_WAVEFORMATEX; - -typedef struct _DSBUFFERDESC - { - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - DSOUND_WAVEFORMATEX* lpwfxFormat; - } DSBUFFERDESC; - -typedef struct _DSBPOSITIONNOTIFY - { - DWORD dwOffset; - HANDLE hEventNotify; - } DSBPOSITIONNOTIFY; -typedef struct _DSCAPS DSCAPS; -typedef struct _DSBCAPS DSBCAPS; -typedef struct _DSEFFECTDESC DSEFFECTDESC; -struct IDirectSound8; - -typedef struct IDirectSoundBuffer8 { struct IDirectSoundBuffer8Vtbl* lpVtbl; } IDirectSoundBuffer8; -typedef struct IDirectSoundBuffer8Vtbl IDirectSoundBuffer8Vtbl; - -struct IDirectSoundBuffer8Vtbl -{ - // IUnknown methods - HRESULT (STDMETHODCALLTYPE *QueryInterface) (IDirectSoundBuffer8*, REFIID, LPVOID*); - ULONG (STDMETHODCALLTYPE *AddRef) (IDirectSoundBuffer8*); - ULONG (STDMETHODCALLTYPE *Release) (IDirectSoundBuffer8*); - - // IDirectSoundBuffer methods - HRESULT (STDMETHODCALLTYPE *GetCaps) (IDirectSoundBuffer8*, DSBCAPS* pDSBufferCaps); - HRESULT (STDMETHODCALLTYPE *GetCurrentPosition) (IDirectSoundBuffer8*, LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor); - HRESULT (STDMETHODCALLTYPE *GetFormat) (IDirectSoundBuffer8*, DSOUND_WAVEFORMATEX* pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten); - HRESULT (STDMETHODCALLTYPE *GetVolume) (IDirectSoundBuffer8*, LPLONG plVolume); - HRESULT (STDMETHODCALLTYPE *GetPan) (IDirectSoundBuffer8*, LPLONG plPan); - HRESULT (STDMETHODCALLTYPE *GetFrequency) (IDirectSoundBuffer8*, LPDWORD pdwFrequency); - HRESULT (STDMETHODCALLTYPE *GetStatus) (IDirectSoundBuffer8*, LPDWORD pdwStatus); - HRESULT (STDMETHODCALLTYPE *Initialize) (IDirectSoundBuffer8*, struct IDirectSound8* pDirectSound, DSBUFFERDESC* pcDSBufferDesc); - HRESULT (STDMETHODCALLTYPE *Lock) (IDirectSoundBuffer8*, DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags); - HRESULT (STDMETHODCALLTYPE *Play) (IDirectSoundBuffer8*, DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags); - HRESULT (STDMETHODCALLTYPE *SetCurrentPosition) (IDirectSoundBuffer8*, DWORD dwNewPosition); - HRESULT (STDMETHODCALLTYPE *SetFormat) (IDirectSoundBuffer8*, DSOUND_WAVEFORMATEX* pcfxFormat); - HRESULT (STDMETHODCALLTYPE *SetVolume) (IDirectSoundBuffer8*, LONG lVolume); - HRESULT (STDMETHODCALLTYPE *SetPan) (IDirectSoundBuffer8*, LONG lPan); - HRESULT (STDMETHODCALLTYPE *SetFrequency) (IDirectSoundBuffer8*, DWORD dwFrequency); - HRESULT (STDMETHODCALLTYPE *Stop) (IDirectSoundBuffer8*); - HRESULT (STDMETHODCALLTYPE *Unlock) (IDirectSoundBuffer8*, LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2); - HRESULT (STDMETHODCALLTYPE *Restore) (IDirectSoundBuffer8*); - - // IDirectSoundBuffer8 methods - HRESULT (STDMETHODCALLTYPE *SetFX) (IDirectSoundBuffer8*, DWORD dwEffectsCount, DSEFFECTDESC* pDSFXDesc, LPDWORD pdwResultCodes); - HRESULT (STDMETHODCALLTYPE *AcquireResources) (IDirectSoundBuffer8*, DWORD dwFlags, DWORD dwEffectsCount, LPDWORD pdwResultCodes); - HRESULT (STDMETHODCALLTYPE *GetObjectInPath) (IDirectSoundBuffer8*, REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject); -}; - -#define IDirectSoundBuffer8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectSoundBuffer8_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) -#define IDirectSoundBuffer8_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) -#define IDirectSoundBuffer8_Restore(p) (p)->lpVtbl->Restore(p) -#define IDirectSoundBuffer8_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b) -#define IDirectSoundBuffer8_Play(p,a,b,c) (p)->lpVtbl->Play(p,a,b,c) -#define IDirectSoundBuffer8_SetVolume(p,a) (p)->lpVtbl->SetVolume(p,a) -#define IDirectSoundBuffer8_Release(p) (p)->lpVtbl->Release(p) - - -typedef struct IDirectSound8 { struct IDirectSound8Vtbl* lpVtbl; } IDirectSound8; -typedef struct IDirectSound8Vtbl IDirectSound8Vtbl; - -struct IDirectSound8Vtbl -{ - // IUnknown methods - HRESULT (STDMETHODCALLTYPE *QueryInterface)(IDirectSound8*, REFIID, LPVOID*); - ULONG (STDMETHODCALLTYPE *AddRef) (IDirectSound8*); - ULONG (STDMETHODCALLTYPE *Release) (IDirectSound8*); - - // IDirectSound methods - HRESULT (STDMETHODCALLTYPE *CreateSoundBuffer) (IDirectSound8*, DSBUFFERDESC* pcDSBufferDesc, struct IDirectSoundBuffer8** ppDSBuffer, void* pUnkOuter); - HRESULT (STDMETHODCALLTYPE *GetCaps) (IDirectSound8*, DSCAPS* pDSCaps); - HRESULT (STDMETHODCALLTYPE *DuplicateSoundBuffer) (IDirectSound8*, struct IDirectSoundBuffer8* pDSBufferOriginal, struct IDirectSoundBuffer8* *ppDSBufferDuplicate); - HRESULT (STDMETHODCALLTYPE *SetCooperativeLevel) (IDirectSound8*, HWND hwnd, DWORD dwLevel); - HRESULT (STDMETHODCALLTYPE *Compact) (IDirectSound8*); - HRESULT (STDMETHODCALLTYPE *GetSpeakerConfig) (IDirectSound8*, LPDWORD pdwSpeakerConfig); - HRESULT (STDMETHODCALLTYPE *SetSpeakerConfig) (IDirectSound8*, DWORD dwSpeakerConfig); - HRESULT (STDMETHODCALLTYPE *Initialize) (IDirectSound8*, LPCGUID pcGuidDevice); - - // IDirectSound8 methods - HRESULT (STDMETHODCALLTYPE *VerifyCertification) (IDirectSound8*, LPDWORD pdwCertified); -}; - -#define IDirectSound8_Release(p) (p)->lpVtbl->Release(p) -#define IDirectSound8_CreateSoundBuffer(p,a,b,c) (p)->lpVtbl->CreateSoundBuffer(p,a,b,c) -#define IDirectSound8_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) - - -typedef struct IDirectSoundNotify { struct IDirectSoundNotifyVtbl* lpVtbl; } IDirectSoundNotify; -typedef struct IDirectSoundNotifyVtbl IDirectSoundNotifyVtbl; - -struct IDirectSoundNotifyVtbl -{ - HRESULT (STDMETHODCALLTYPE *QueryInterface)(IDirectSoundNotify*, REFIID, LPVOID*); - ULONG (STDMETHODCALLTYPE *AddRef) (IDirectSoundNotify*); - ULONG (STDMETHODCALLTYPE *Release) (IDirectSoundNotify*); - HRESULT (STDMETHODCALLTYPE *SetNotificationPositions) (IDirectSoundNotify*, DWORD dwPositionNotifies, DSBPOSITIONNOTIFY* pcPositionNotifies); -}; - -#define IDirectSoundNotify_Release(p) (p)->lpVtbl->Release(p) -#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->lpVtbl->SetNotificationPositions(p,a,b) - - -#define DS_OK S_OK -#define DSERR_BUFFERLOST MAKE_HRESULT(1, 0x878, 150) - -#define DSSCL_NORMAL 0x00000001 -#define DSBCAPS_CTRLVOLUME 0x00000080 -#define DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100 -#define DSBCAPS_GLOBALFOCUS 0x00008000 -#define DSBCAPS_GETCURRENTPOSITION2 0x00010000 -#define DSBPLAY_LOOPING 0x00000001 -#define DSBVOLUME_MIN -10000 - - -#ifdef __cplusplus -}; -#endif // __cplusplus - - -///// END DSOUND DEFINITIONS ////// - - -struct app_t - { - void* memctx; - void* logctx; - void* fatalctx; - app_interpolation_t interpolation; - app_screenmode_t screenmode; - - BOOL initialized; - BOOL closed; - - char exe_path[ 260 ]; - char userdata_path[ 260 ]; - char appdata_path[ 260 ]; - char const* cmdline; - - HINSTANCE hinstance; - HWND hwnd; - LRESULT (CALLBACK *user_wndproc)( app_t*, HWND, UINT, WPARAM, LPARAM ); - - HDC hdc; - HICON icon; - BOOL has_focus; - BOOL is_minimized; - - struct app_internal_opengl_t gl; - HMODULE gl_dll; - HGLRC gl_context; - PROC (APP_GLCALLTYPE* wglGetProcAddress) (LPCSTR); - HGLRC (APP_GLCALLTYPE* wglCreateContext) (HDC); - BOOL (APP_GLCALLTYPE* wglDeleteContext) (HGLRC); - BOOL (APP_GLCALLTYPE* wglMakeCurrent) (HDC, HGLRC); - BOOL (APP_GLCALLTYPE* wglSwapIntervalEXT) (int); - - UINT (WINAPI *GetRawInputDataPtr)( HRAWINPUT, UINT, LPVOID, PUINT, UINT ); - - HANDLE sound_notifications[ 2 ]; - HMODULE dsound_dll; - struct IDirectSound8* dsound; - struct IDirectSoundBuffer8* dsoundbuf; - HANDLE sound_thread_handle; - volatile LONG exit_sound_thread; - int sample_pairs_count; - int sound_level; - void (*sound_callback)( APP_S16* sample_pairs, int sample_pairs_count, void* user_data ); - void* sound_user_data; - - HCURSOR current_pointer; - - BOOL clip_cursor; - RECT clip_rect; - - app_input_event_t input_events[ 1024 ]; - int input_count; - - int windowed_x; - int windowed_y; - int windowed_h; - int windowed_w; - int fullscreen_width; - int fullscreen_height; - - int display_count; - app_display_t displays[ 16 ]; - HMONITOR displays_hmonitor[ 16 ]; - - struct - { - HMODULE wintab_dll; - APP_HCTX context; - int max_pressure; - - UINT (WINAPI *WTInfo)( UINT, UINT, LPVOID ); - APP_HCTX (WINAPI *WTOpen)( HWND, APP_LOGCONTEXTA*, BOOL ); - BOOL (WINAPI *WTClose)( APP_HCTX ); - BOOL (WINAPI *WTEnable)( APP_HCTX, BOOL ); - BOOL (WINAPI *WTPacket)( APP_HCTX, UINT, LPVOID ); - } tablet; - }; static app_key_t app_internal_vkcode_to_appkey( app_t* app, int vkcode ) @@ -3330,43 +3052,14 @@ void app_coordinates_bitmap_to_window( app_t* app, int width, int height, int* x #endif #endif -#include -#include -#include "SDL.h" #ifndef APP_FATAL_ERROR #define APP_FATAL_ERROR( ctx, message ) { \ SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, "Fatal Error!", message, NULL ); exit( 0xff ); } #endif -struct app_t - { - void* memctx; - void* logctx; - void* fatalctx; - struct app_internal_opengl_t gl; - int initialized; - int exit_requested; - int has_focus; - app_interpolation_t interpolation; - app_screenmode_t screenmode; - SDL_Window* window; - SDL_Cursor* cursor; - - SDL_AudioDeviceID sound_device; - void (*sound_callback)( APP_S16* sample_pairs, int sample_pairs_count, void* user_data ); - void* sound_user_data; - int volume; - - app_input_event_t input_events[ 1024 ]; - int input_count; - - int display_count; - app_display_t displays[ 16 ]; - - }; int app_run( int (*app_proc)( app_t*, void* ), void* user_data, void* memctx, void* logctx, void* fatalctx ) @@ -4078,26 +3771,7 @@ WAJIC(void, app_js_print, (const char* msg), #define APP_FATAL_ERROR( ctx, message ) { app_js_print(message); abort(); } #endif -struct app_t - { - void* memctx; - void* logctx; - void* fatalctx; - struct app_internal_opengl_t gl; - int has_focus; - app_interpolation_t interpolation; - void (*sound_callback)( APP_S16* sample_pairs, int sample_pairs_count, void* user_data ); - void* sound_user_data; - int sound_buffer_size; - APP_S16* sound_buffer; - int volume; - - app_input_event_t input_events[ 1024 ]; - int input_count; - int pointer_x; - int pointer_y; - }; // The javascript event handling keeps a simple buffer of events with 3 ints per event diff --git a/libs_win32/app_types.h b/libs_win32/app_types.h new file mode 100644 index 0000000..3a6245f --- /dev/null +++ b/libs_win32/app_types.h @@ -0,0 +1,579 @@ +#ifndef APP_TYPES_H +#define APP_TYPES_H +typedef enum app_log_level_t { + APP_LOG_LEVEL_INFO, + APP_LOG_LEVEL_WARNING, + APP_LOG_LEVEL_ERROR, +} app_log_level_t; + +typedef enum app_interpolation_t { + APP_INTERPOLATION_NONE, + APP_INTERPOLATION_LINEAR, +} app_interpolation_t; + +typedef enum app_screenmode_t { + APP_SCREENMODE_WINDOW, + APP_SCREENMODE_FULLSCREEN, +} app_screenmode_t; + +typedef struct app_display_t { + char id[64]; + int x; + int y; + int width; + int height; +} app_display_t; + +typedef struct app_displays_t { + app_display_t *displays; + int count; +} app_displays_t; + +typedef enum app_key_t { + APP_KEY_INVALID, + APP_KEY_LBUTTON, + APP_KEY_RBUTTON, + APP_KEY_CANCEL, + APP_KEY_MBUTTON, + APP_KEY_XBUTTON1, + APP_KEY_XBUTTON2, + APP_KEY_BACK, + APP_KEY_TAB, + APP_KEY_CLEAR, + APP_KEY_RETURN, + APP_KEY_SHIFT, + APP_KEY_CONTROL, + APP_KEY_MENU, + APP_KEY_PAUSE, + APP_KEY_CAPITAL, + APP_KEY_KANA, + APP_KEY_HANGUL = APP_KEY_KANA, + APP_KEY_JUNJA, + APP_KEY_FINAL, + APP_KEY_HANJA, + APP_KEY_KANJI = APP_KEY_HANJA, + APP_KEY_ESCAPE, + APP_KEY_CONVERT, + APP_KEY_NONCONVERT, + APP_KEY_ACCEPT, + APP_KEY_MODECHANGE, + APP_KEY_SPACE, + APP_KEY_PRIOR, + APP_KEY_NEXT, + APP_KEY_END, + APP_KEY_HOME, + APP_KEY_LEFT, + APP_KEY_UP, + APP_KEY_RIGHT, + APP_KEY_DOWN, + APP_KEY_SELECT, + APP_KEY_PRINT, + APP_KEY_EXEC, + APP_KEY_SNAPSHOT, + APP_KEY_INSERT, + APP_KEY_DELETE, + APP_KEY_HELP, + APP_KEY_0, + APP_KEY_1, + APP_KEY_2, + APP_KEY_3, + APP_KEY_4, + APP_KEY_5, + APP_KEY_6, + APP_KEY_7, + APP_KEY_8, + APP_KEY_9, + APP_KEY_A, + APP_KEY_B, + APP_KEY_C, + APP_KEY_D, + APP_KEY_E, + APP_KEY_F, + APP_KEY_G, + APP_KEY_H, + APP_KEY_I, + APP_KEY_J, + APP_KEY_K, + APP_KEY_L, + APP_KEY_M, + APP_KEY_N, + APP_KEY_O, + APP_KEY_P, + APP_KEY_Q, + APP_KEY_R, + APP_KEY_S, + APP_KEY_T, + APP_KEY_U, + APP_KEY_V, + APP_KEY_W, + APP_KEY_X, + APP_KEY_Y, + APP_KEY_Z, + APP_KEY_LWIN, + APP_KEY_RWIN, + APP_KEY_APPS, + APP_KEY_SLEEP, + APP_KEY_NUMPAD0, + APP_KEY_NUMPAD1, + APP_KEY_NUMPAD2, + APP_KEY_NUMPAD3, + APP_KEY_NUMPAD4, + APP_KEY_NUMPAD5, + APP_KEY_NUMPAD6, + APP_KEY_NUMPAD7, + APP_KEY_NUMPAD8, + APP_KEY_NUMPAD9, + APP_KEY_MULTIPLY, + APP_KEY_ADD, + APP_KEY_SEPARATOR, + APP_KEY_SUBTRACT, + APP_KEY_DECIMAL, + APP_KEY_DIVIDE, + APP_KEY_F1, + APP_KEY_F2, + APP_KEY_F3, + APP_KEY_F4, + APP_KEY_F5, + APP_KEY_F6, + APP_KEY_F7, + APP_KEY_F8, + APP_KEY_F9, + APP_KEY_F10, + APP_KEY_F11, + APP_KEY_F12, + APP_KEY_F13, + APP_KEY_F14, + APP_KEY_F15, + APP_KEY_F16, + APP_KEY_F17, + APP_KEY_F18, + APP_KEY_F19, + APP_KEY_F20, + APP_KEY_F21, + APP_KEY_F22, + APP_KEY_F23, + APP_KEY_F24, + APP_KEY_NUMLOCK, + APP_KEY_SCROLL, + APP_KEY_LSHIFT, + APP_KEY_RSHIFT, + APP_KEY_LCONTROL, + APP_KEY_RCONTROL, + APP_KEY_LMENU, + APP_KEY_RMENU, + APP_KEY_BROWSER_BACK, + APP_KEY_BROWSER_FORWARD, + APP_KEY_BROWSER_REFRESH, + APP_KEY_BROWSER_STOP, + APP_KEY_BROWSER_SEARCH, + APP_KEY_BROWSER_FAVORITES, + APP_KEY_BROWSER_HOME, + APP_KEY_VOLUME_MUTE, + APP_KEY_VOLUME_DOWN, + APP_KEY_VOLUME_UP, + APP_KEY_MEDIA_NEXT_TRACK, + APP_KEY_MEDIA_PREV_TRACK, + APP_KEY_MEDIA_STOP, + APP_KEY_MEDIA_PLAY_PAUSE, + APP_KEY_LAUNCH_MAIL, + APP_KEY_LAUNCH_MEDIA_SELECT, + APP_KEY_LAUNCH_APP1, + APP_KEY_LAUNCH_APP2, + APP_KEY_OEM_1, + APP_KEY_OEM_PLUS, + APP_KEY_OEM_COMMA, + APP_KEY_OEM_MINUS, + APP_KEY_OEM_PERIOD, + APP_KEY_OEM_2, + APP_KEY_OEM_3, + APP_KEY_OEM_4, + APP_KEY_OEM_5, + APP_KEY_OEM_6, + APP_KEY_OEM_7, + APP_KEY_OEM_8, + APP_KEY_OEM_102, + APP_KEY_PROCESSKEY, + APP_KEY_ATTN, + APP_KEY_CRSEL, + APP_KEY_EXSEL, + APP_KEY_EREOF, + APP_KEY_PLAY, + APP_KEY_ZOOM, + APP_KEY_NONAME, + APP_KEY_PA1, + APP_KEY_OEM_CLEAR, + APP_KEYCOUNT +} app_key_t; + +typedef enum app_input_type_t { + APP_INPUT_KEY_DOWN, + APP_INPUT_KEY_UP, + APP_INPUT_DOUBLE_CLICK, + APP_INPUT_CHAR, + APP_INPUT_MOUSE_MOVE, + APP_INPUT_MOUSE_DELTA, + APP_INPUT_SCROLL_WHEEL, + APP_INPUT_TABLET +} app_input_type_t; + +typedef enum app_pressed_t { + APP_NOT_PRESSED, + APP_PRESSED, +} app_pressed_t; + +typedef struct app_input_event_t { + app_input_type_t type; + union data_t { + app_key_t key; + char char_code; + struct { + int x; + int y; + } mouse_pos; + struct { + float x; + float y; + } mouse_delta; + float wheel_delta; + struct { + int x; + int y; + float pressure; + app_pressed_t tip; + app_pressed_t lower; + app_pressed_t upper; + } tablet; + } data; +} app_input_event_t; + +typedef struct app_input_t { + app_input_event_t *events; + int count; +} app_input_t; + +#if defined(APP_NULL) +struct app_t { + void *dummy; +}; +#elif defined(APP_WINDOWS) +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus +typedef struct _DSOUND_WAVEFORMATEX { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wBitsPerSample; + WORD cbSize; +} DSOUND_WAVEFORMATEX; + +typedef struct _DSBUFFERDESC { + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + DSOUND_WAVEFORMATEX *lpwfxFormat; +} DSBUFFERDESC; + +typedef struct _DSBPOSITIONNOTIFY { + DWORD dwOffset; + HANDLE hEventNotify; +} DSBPOSITIONNOTIFY; + +typedef struct _DSCAPS DSCAPS; +typedef struct _DSBCAPS DSBCAPS; +typedef struct _DSEFFECTDESC DSEFFECTDESC; +struct IDirectSound8; + +typedef struct IDirectSoundBuffer8 { + struct IDirectSoundBuffer8Vtbl *lpVtbl; +} IDirectSoundBuffer8; +typedef struct IDirectSoundBuffer8Vtbl IDirectSoundBuffer8Vtbl; + +struct IDirectSoundBuffer8Vtbl { + // IUnknown methods + HRESULT(STDMETHODCALLTYPE *QueryInterface)(IDirectSoundBuffer8 *, REFIID, + LPVOID *); + ULONG(STDMETHODCALLTYPE *AddRef)(IDirectSoundBuffer8 *); + ULONG(STDMETHODCALLTYPE *Release)(IDirectSoundBuffer8 *); + + // IDirectSoundBuffer methods + HRESULT(STDMETHODCALLTYPE *GetCaps)(IDirectSoundBuffer8 *, + DSBCAPS *pDSBufferCaps); + HRESULT(STDMETHODCALLTYPE *GetCurrentPosition)(IDirectSoundBuffer8 *, + LPDWORD pdwCurrentPlayCursor, + LPDWORD pdwCurrentWriteCursor); + HRESULT(STDMETHODCALLTYPE *GetFormat)(IDirectSoundBuffer8 *, + DSOUND_WAVEFORMATEX *pwfxFormat, + DWORD dwSizeAllocated, + LPDWORD pdwSizeWritten); + HRESULT(STDMETHODCALLTYPE *GetVolume)(IDirectSoundBuffer8 *, LPLONG plVolume); + HRESULT(STDMETHODCALLTYPE *GetPan)(IDirectSoundBuffer8 *, LPLONG plPan); + HRESULT(STDMETHODCALLTYPE *GetFrequency)(IDirectSoundBuffer8 *, + LPDWORD pdwFrequency); + HRESULT(STDMETHODCALLTYPE *GetStatus)(IDirectSoundBuffer8 *, + LPDWORD pdwStatus); + HRESULT(STDMETHODCALLTYPE *Initialize)(IDirectSoundBuffer8 *, + struct IDirectSound8 *pDirectSound, + DSBUFFERDESC *pcDSBufferDesc); + HRESULT(STDMETHODCALLTYPE *Lock)(IDirectSoundBuffer8 *, DWORD dwOffset, + DWORD dwBytes, LPVOID *ppvAudioPtr1, + LPDWORD pdwAudioBytes1, LPVOID *ppvAudioPtr2, + LPDWORD pdwAudioBytes2, DWORD dwFlags); + HRESULT(STDMETHODCALLTYPE *Play)(IDirectSoundBuffer8 *, DWORD dwReserved1, + DWORD dwPriority, DWORD dwFlags); + HRESULT(STDMETHODCALLTYPE *SetCurrentPosition)(IDirectSoundBuffer8 *, + DWORD dwNewPosition); + HRESULT(STDMETHODCALLTYPE *SetFormat)(IDirectSoundBuffer8 *, + DSOUND_WAVEFORMATEX *pcfxFormat); + HRESULT(STDMETHODCALLTYPE *SetVolume)(IDirectSoundBuffer8 *, LONG lVolume); + HRESULT(STDMETHODCALLTYPE *SetPan)(IDirectSoundBuffer8 *, LONG lPan); + HRESULT(STDMETHODCALLTYPE *SetFrequency)(IDirectSoundBuffer8 *, + DWORD dwFrequency); + HRESULT(STDMETHODCALLTYPE *Stop)(IDirectSoundBuffer8 *); + HRESULT(STDMETHODCALLTYPE *Unlock)(IDirectSoundBuffer8 *, LPVOID pvAudioPtr1, + DWORD dwAudioBytes1, LPVOID pvAudioPtr2, + DWORD dwAudioBytes2); + HRESULT(STDMETHODCALLTYPE *Restore)(IDirectSoundBuffer8 *); + + // IDirectSoundBuffer8 methods + HRESULT(STDMETHODCALLTYPE *SetFX)(IDirectSoundBuffer8 *, DWORD dwEffectsCount, + DSEFFECTDESC *pDSFXDesc, + LPDWORD pdwResultCodes); + HRESULT(STDMETHODCALLTYPE *AcquireResources)(IDirectSoundBuffer8 *, + DWORD dwFlags, + DWORD dwEffectsCount, + LPDWORD pdwResultCodes); + HRESULT(STDMETHODCALLTYPE *GetObjectInPath)(IDirectSoundBuffer8 *, + REFGUID rguidObject, + DWORD dwIndex, + REFGUID rguidInterface, + LPVOID *ppObject); +}; + +#define IDirectSoundBuffer8_QueryInterface(p, a, b) \ + (p)->lpVtbl->QueryInterface(p, a, b) +#define IDirectSoundBuffer8_Lock(p, a, b, c, d, e, f, g) \ + (p)->lpVtbl->Lock(p, a, b, c, d, e, f, g) +#define IDirectSoundBuffer8_Unlock(p, a, b, c, d) \ + (p)->lpVtbl->Unlock(p, a, b, c, d) +#define IDirectSoundBuffer8_Restore(p) (p)->lpVtbl->Restore(p) +#define IDirectSoundBuffer8_GetCurrentPosition(p, a, b) \ + (p)->lpVtbl->GetCurrentPosition(p, a, b) +#define IDirectSoundBuffer8_Play(p, a, b, c) (p)->lpVtbl->Play(p, a, b, c) +#define IDirectSoundBuffer8_SetVolume(p, a) (p)->lpVtbl->SetVolume(p, a) +#define IDirectSoundBuffer8_Release(p) (p)->lpVtbl->Release(p) + +typedef struct IDirectSound8 { + struct IDirectSound8Vtbl *lpVtbl; +} IDirectSound8; +typedef struct IDirectSound8Vtbl IDirectSound8Vtbl; + +struct IDirectSound8Vtbl { + // IUnknown methods + HRESULT(STDMETHODCALLTYPE *QueryInterface)(IDirectSound8 *, REFIID, LPVOID *); + ULONG(STDMETHODCALLTYPE *AddRef)(IDirectSound8 *); + ULONG(STDMETHODCALLTYPE *Release)(IDirectSound8 *); + + // IDirectSound methods + HRESULT(STDMETHODCALLTYPE *CreateSoundBuffer)( + IDirectSound8 *, DSBUFFERDESC *pcDSBufferDesc, + struct IDirectSoundBuffer8 **ppDSBuffer, void *pUnkOuter); + HRESULT(STDMETHODCALLTYPE *GetCaps)(IDirectSound8 *, DSCAPS *pDSCaps); + HRESULT(STDMETHODCALLTYPE *DuplicateSoundBuffer)( + IDirectSound8 *, struct IDirectSoundBuffer8 *pDSBufferOriginal, + struct IDirectSoundBuffer8 **ppDSBufferDuplicate); + HRESULT(STDMETHODCALLTYPE *SetCooperativeLevel)(IDirectSound8 *, HWND hwnd, + DWORD dwLevel); + HRESULT(STDMETHODCALLTYPE *Compact)(IDirectSound8 *); + HRESULT(STDMETHODCALLTYPE *GetSpeakerConfig)(IDirectSound8 *, + LPDWORD pdwSpeakerConfig); + HRESULT(STDMETHODCALLTYPE *SetSpeakerConfig)(IDirectSound8 *, + DWORD dwSpeakerConfig); + HRESULT(STDMETHODCALLTYPE *Initialize)(IDirectSound8 *, LPCGUID pcGuidDevice); + + // IDirectSound8 methods + HRESULT(STDMETHODCALLTYPE *VerifyCertification)(IDirectSound8 *, + LPDWORD pdwCertified); +}; + +#define IDirectSound8_Release(p) (p)->lpVtbl->Release(p) +#define IDirectSound8_CreateSoundBuffer(p, a, b, c) \ + (p)->lpVtbl->CreateSoundBuffer(p, a, b, c) +#define IDirectSound8_SetCooperativeLevel(p, a, b) \ + (p)->lpVtbl->SetCooperativeLevel(p, a, b) + +typedef struct IDirectSoundNotify { + struct IDirectSoundNotifyVtbl *lpVtbl; +} IDirectSoundNotify; +typedef struct IDirectSoundNotifyVtbl IDirectSoundNotifyVtbl; + +struct IDirectSoundNotifyVtbl { + HRESULT(STDMETHODCALLTYPE *QueryInterface)(IDirectSoundNotify *, REFIID, + LPVOID *); + ULONG(STDMETHODCALLTYPE *AddRef)(IDirectSoundNotify *); + ULONG(STDMETHODCALLTYPE *Release)(IDirectSoundNotify *); + HRESULT(STDMETHODCALLTYPE *SetNotificationPositions)( + IDirectSoundNotify *, DWORD dwPositionNotifies, + DSBPOSITIONNOTIFY *pcPositionNotifies); +}; + +#define IDirectSoundNotify_Release(p) (p)->lpVtbl->Release(p) +#define IDirectSoundNotify_SetNotificationPositions(p, a, b) \ + (p)->lpVtbl->SetNotificationPositions(p, a, b) + +#define DS_OK S_OK +#define DSERR_BUFFERLOST MAKE_HRESULT(1, 0x878, 150) + +#define DSSCL_NORMAL 0x00000001 +#define DSBCAPS_CTRLVOLUME 0x00000080 +#define DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100 +#define DSBCAPS_GLOBALFOCUS 0x00008000 +#define DSBCAPS_GETCURRENTPOSITION2 0x00010000 +#define DSBPLAY_LOOPING 0x00000001 +#define DSBVOLUME_MIN -10000 + +#ifdef __cplusplus +}; +#endif // __cplusplus + +///// END DSOUND DEFINITIONS ////// + +struct app_t { + void *memctx; + void *logctx; + void *fatalctx; + app_interpolation_t interpolation; + app_screenmode_t screenmode; + + BOOL initialized; + BOOL closed; + + char exe_path[260]; + char userdata_path[260]; + char appdata_path[260]; + char const *cmdline; + + HINSTANCE hinstance; + HWND hwnd; + LRESULT(CALLBACK *user_wndproc)(app_t *, HWND, UINT, WPARAM, LPARAM); + + HDC hdc; + HICON icon; + BOOL has_focus; + BOOL is_minimized; + + struct app_internal_opengl_t gl; + HMODULE gl_dll; + HGLRC gl_context; + PROC(APP_GLCALLTYPE *wglGetProcAddress)(LPCSTR); + HGLRC(APP_GLCALLTYPE *wglCreateContext)(HDC); + BOOL(APP_GLCALLTYPE *wglDeleteContext)(HGLRC); + BOOL(APP_GLCALLTYPE *wglMakeCurrent)(HDC, HGLRC); + BOOL(APP_GLCALLTYPE *wglSwapIntervalEXT)(int); + + UINT(WINAPI *GetRawInputDataPtr)(HRAWINPUT, UINT, LPVOID, PUINT, UINT); + + HANDLE sound_notifications[2]; + HMODULE dsound_dll; + struct IDirectSound8 *dsound; + struct IDirectSoundBuffer8 *dsoundbuf; + HANDLE sound_thread_handle; + volatile LONG exit_sound_thread; + int sample_pairs_count; + int sound_level; + void (*sound_callback)(APP_S16 *sample_pairs, int sample_pairs_count, + void *user_data); + void *sound_user_data; + + HCURSOR current_pointer; + + BOOL clip_cursor; + RECT clip_rect; + + app_input_event_t input_events[1024]; + int input_count; + + int windowed_x; + int windowed_y; + int windowed_h; + int windowed_w; + int fullscreen_width; + int fullscreen_height; + + int display_count; + app_display_t displays[16]; + HMONITOR displays_hmonitor[16]; + + struct { + HMODULE wintab_dll; + APP_HCTX context; + int max_pressure; + + UINT(WINAPI *WTInfo)(UINT, UINT, LPVOID); + APP_HCTX(WINAPI *WTOpen)(HWND, APP_LOGCONTEXTA *, BOOL); + BOOL(WINAPI *WTClose)(APP_HCTX); + BOOL(WINAPI *WTEnable)(APP_HCTX, BOOL); + BOOL(WINAPI *WTPacket)(APP_HCTX, UINT, LPVOID); + } tablet; +}; +#elif defined(APP_SDL) +#include +#include + + +#include "SDL.h" +struct app_t { + void *memctx; + void *logctx; + void *fatalctx; + struct app_internal_opengl_t gl; + int initialized; + int exit_requested; + int has_focus; + app_interpolation_t interpolation; + app_screenmode_t screenmode; + + SDL_Window *window; + SDL_Cursor *cursor; + + SDL_AudioDeviceID sound_device; + void (*sound_callback)(APP_S16 *sample_pairs, int sample_pairs_count, + void *user_data); + void *sound_user_data; + int volume; + + app_input_event_t input_events[1024]; + int input_count; + + int display_count; + app_display_t displays[16]; +}; + +#elif defined(APP_WASM) +struct app_t { + void *memctx; + void *logctx; + void *fatalctx; + struct app_internal_opengl_t gl; + int has_focus; + app_interpolation_t interpolation; + + void (*sound_callback)(APP_S16 *sample_pairs, int sample_pairs_count, + void *user_data); + void *sound_user_data; + int sound_buffer_size; + APP_S16 *sound_buffer; + int volume; + + app_input_event_t input_events[1024]; + int input_count; + int pointer_x; + int pointer_y; +}; +#endif +typedef struct app_t app_t; + +#endif \ No newline at end of file