[Gtkradiant] File Saving in Windows Vista / 7 - fixed!

Willi willi at schinmeyer.de
Fri Mar 12 09:03:02 CST 2010

I figured out why saving fails in Vista and 7!

In gtkmisc.cpp there's
const char* file_dialog (void *parent, gboolean open, const char* title, 
const char* path, const char* pattern, const char *baseSubDir)
and somewhere around line 1250 there's the windows part.

Reading the MSDN I really wonder why the customfilter part ever worked. 
It's not used they way it's intended to be used and I don't know why it 
ever worked... Well, since Vista it doesn't work anymore. Why?
type = typelist.GetTypeForWin32Filter(customfilter+1);
sets type to an invalid (empty) type. This results in the file being 
stripped from its extension later in the function and 
CSynapseClientRadiant::ExportMap() being unable to choose a format based 
on the (missing) extension. (Hence the WARNING: no module found for map 
interface type ''.)

A workaround is to disable the "Win32 file load dialog" in the layout 
section of the preferences since the GTK dialog works. That way you can 
also get 1.4 to save in Vista and 7.

I also found a fix. Customfilter seem to be meant for users to set their 
own filters and have nothing to do with what the user selected (unless 
it's a custom filter).
In order to get the selected filter (that's what we want here, right?) 
the nFilterIndex should be checked after calling GetSaveFileName().

I thus removed everything having to do with customfilters and added 
support for using the index:

    * In *radiant/gtkmisc.cpp*:
    * In the function *file_dialog()*:
    * I deleted the variable
      char customfilter[FILEDLG_CUSTOM_FILTER_LENGTH];
    * and its assignment
      customfilter[0] = customfilter[1] = customfilter[2] = '\0';
    * ofn.nFilterIndex should always be set to 0, so take it out of the
      if(pattern) block and delete the else block.
    * The whole else block can be deleted.
    * Since we don't use custom filters we can delete
      ofn.lpstrCustomFilter = customfilter;
    * the if(pattern != NULL) needs to be changed, too. Replace
      type = typelist.GetTypeForWin32Filter(customfilter+1);
      type = typelist.GetTypeFromIndex(ofn.nFilterIndex-1);
    * The GetTypeFromIndex() method does not yet exist. We need to add
      it to CFileType somewhere in the public scope:
         filetype_t GetTypeFromIndex(int index)
             if(index < m_nTypes && index >= 0)
                 return filetype_t(m_pTypes[index].m_name.c_str(),
             return filetype_t();

That fixes the save problem. At least in Windows 7 - I'm too lazy to 
switch to XP and see if it still works there...

And why are most plugins not active?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://zerowing.idsoftware.com/pipermail/gtkradiant/attachments/20100312/2285d370/attachment.htm 

More information about the Gtkradiant mailing list