openFrameworks icon indicating copy to clipboard operation
openFrameworks copied to clipboard

defaultName ofSystemSaveDialog and ofSystemLoadDialog(not working in Windows 10

Open Bk8 opened this issue 6 years ago • 2 comments

The default name and messageName parameters on the ofSystemSaveDialog and ofSystemLoadDialog functions are not working, this is a really old bug (look links below). I don't know why is not solved, help please. I'm using Windows 10 and of_v0.10.1.

SoulRyder Apr '16 I found the ofSystemUtils.cpp doesn’t do anything on windows with the strings defaultname and messagename. It is solved.

https://forum.openframeworks.cc/t/cannot-use-common-language-runtime-support/22999

fakob Apr '14 Is this a bug on the windows side? At least it wasn’t there in OSX, but it is now on windows.

https://forum.openframeworks.cc/t/ofsystemsavedialog-defaultname-messagename-have-no-influence/15264

Bk8 avatar Jul 11 '19 03:07 Bk8

I made I small patch to be able to use it, I don't really know win 32 api but the variables sent to the function where unused

ofFileDialogResult ofSystemSaveDialog(string defaultName, string fileExt){

ofFileDialogResult results;

//----------------------------------------------------------------------------------------
//------------------------------------------------------------------------------       OSX
//----------------------------------------------------------------------------------------

#ifdef TARGET_OSX @autoreleasepool { NSSavePanel * saveDialog = [NSSavePanel savePanel]; NSOpenGLContext *context = [NSOpenGLContext currentContext]; [saveDialog setMessage:[NSString stringWithUTF8String:messageName.c_str()]]; [saveDialog setNameFieldStringValue:[NSString stringWithUTF8String:defaultName.c_str()]];

	NSInteger buttonClicked = [saveDialog runModal];
	restoreAppWindowFocus();
	[context makeCurrentContext];

	if(buttonClicked == NSFileHandlingPanelOKButton){
		results.filePath = string([[[saveDialog URL] path] UTF8String]);
	}
}

#endif //---------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------
//------------------------------------------------------------------------------   windoze
//----------------------------------------------------------------------------------------

#ifdef TARGET_WIN32

wchar_t fileName[MAX_PATH] = L"";

for(int i =0; i <defaultName.size();i++)
	fileName[i] = defaultName[i];

wchar_t ext[10] = L"";

for (int i = 0; i <fileExt.size(); i++)
	ext[i] = fileExt[i];


OPENFILENAMEW ofn;
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
HWND hwnd = WindowFromDC(wglGetCurrentDC());
ofn.hwndOwner = hwnd;
ofn.hInstance = GetModuleHandle(0);
ofn.nMaxFileTitle = 31;
ofn.lpstrFile = fileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = ext;
ofn.lpstrDefExt = ext;	// we could do .rxml here?
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
ofn.lpstrTitle = L"Select Output File";

if (GetSaveFileNameW(&ofn)){
	results.filePath = convertWideToNarrow(fileName);
}

#endif

Bk8 avatar Jul 15 '19 00:07 Bk8

Seems to have never been fixed, just ran into this issue myself. Tried to cook up a dirty fix for my own project but I can't get past an allocation crash. If someone more familiar with the windows API than me could take a crack at a more stable/permanent fix to this it'd be very appreciated 🙏

fearn-e avatar Mar 19 '24 00:03 fearn-e