package native; #if windows @:buildXml(' ') // majority is taken from microsofts doc @:cppFileCode(' #include "mmdeviceapi.h" #include "combaseapi.h" #include #include #include #include #include #include #include #include #include #include #define SAFE_RELEASE(punk) \\ if ((punk) != NULL) \\ { (punk)->Release(); (punk) = NULL; } static long lastDefId = 0; class AudioFixClient : public IMMNotificationClient { LONG _cRef; IMMDeviceEnumerator *_pEnumerator; public: AudioFixClient() : _cRef(1), _pEnumerator(NULL) { HRESULT result = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (void**)&_pEnumerator); if (result == S_OK) { _pEnumerator->RegisterEndpointNotificationCallback(this); } } ~AudioFixClient() { SAFE_RELEASE(_pEnumerator); } ULONG STDMETHODCALLTYPE AddRef() { return InterlockedIncrement(&_cRef); } ULONG STDMETHODCALLTYPE Release() { ULONG ulRef = InterlockedDecrement(&_cRef); if (0 == ulRef) { delete this; } return ulRef; } HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, VOID **ppvInterface) { return S_OK; } HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR pwstrDeviceId) { return S_OK; }; HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR pwstrDeviceId) { return S_OK; } HRESULT STDMETHODCALLTYPE OnDeviceStateChanged( LPCWSTR pwstrDeviceId, DWORD dwNewState) { return S_OK; } HRESULT STDMETHODCALLTYPE OnPropertyValueChanged( LPCWSTR pwstrDeviceId, const PROPERTYKEY key) { return S_OK; } HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged( EDataFlow flow, ERole role, LPCWSTR pwstrDeviceId) { std::cout << "fuck"; ::funkin::_hx_system::Main_obj::audioDisconnected = true; return S_OK; }; }; AudioFixClient *curAudioFix; ') @:dox(hide) class WinAPI { public static var __audioChangeCallback:Void->Void = function() { trace("test"); }; @:functionCode(' if (!curAudioFix) curAudioFix = new AudioFixClient(); ') public static function registerAudio() { funkin.system.Main.audioDisconnected = false; } @:functionCode(' int darkMode = enable ? 1 : 0; HWND window = GetActiveWindow(); if (S_OK != DwmSetWindowAttribute(window, 19, &darkMode, sizeof(darkMode))) { DwmSetWindowAttribute(window, 20, &darkMode, sizeof(darkMode)); } ') public static function setDarkMode(enable:Bool) {} @:functionCode(' // https://stackoverflow.com/questions/15543571/allocconsole-not-displaying-cout if (!AllocConsole()) return; FILE* fDummy; freopen_s(&fDummy, "CONOUT$", "w", stdout); freopen_s(&fDummy, "CONOUT$", "w", stderr); freopen_s(&fDummy, "CONIN$", "r", stdin); std::cout.clear(); std::clog.clear(); std::cerr.clear(); std::cin.clear(); // std::wcout, std::wclog, std::wcerr, std::wcin HANDLE hConOut = CreateFile(_T("CONOUT$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); HANDLE hConIn = CreateFile(_T("CONIN$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); SetStdHandle(STD_OUTPUT_HANDLE, hConOut); SetStdHandle(STD_ERROR_HANDLE, hConOut); SetStdHandle(STD_INPUT_HANDLE, hConIn); std::wcout.clear(); std::wclog.clear(); std::wcerr.clear(); std::wcin.clear(); ') public static function allocConsole() { // LogsOverlay.consoleOpened = LogsOverlay.consoleVisible = true; haxe.Log.trace = function(v:Dynamic, ?infos:haxe.PosInfos) { // nothing here so that it keeps shit clean } } } #end