From 751529e39515a7968bd597326de78c0f9f220f44 Mon Sep 17 00:00:00 2001 From: dkf Date: Fri, 10 Feb 2012 15:51:52 +0000 Subject: * win/tkWinDialog.c (GetFileNameW): Ensure that we do not convert a result list to a string inadvertently, as this causes problems with Tkinter's handling of multiple filename results. Issue was reported via StackOverflow: http://stackoverflow.com/q/9227859/301832 --- ChangeLog | 7 +++++++ win/tkWinDialog.c | 13 ++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3673abf..49fffe4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-02-10 Donal K. Fellows + + * win/tkWinDialog.c (GetFileNameW): Ensure that we do not convert a + result list to a string inadvertently, as this causes problems with + Tkinter's handling of multiple filename results. Issue was reported + via StackOverflow: http://stackoverflow.com/q/9227859/301832 + 2012-01-29 Jan Nijtmans * win/tkImgPhoto.c: [Bug 3480634]: PNG Images missing in menus on Mac diff --git a/win/tkWinDialog.c b/win/tkWinDialog.c index 64fca8b..55152e9 100644 --- a/win/tkWinDialog.c +++ b/win/tkWinDialog.c @@ -834,6 +834,11 @@ GetFileNameW( if ((winCode != 0) || ((cdlgerr == FNERR_BUFFERTOOSMALL) && (ofn.Flags & OFN_ALLOWMULTISELECT))) { + int gotFilename = 0; /* Flag for tracking whether we have any + * filename at all. For details, see + * http://stackoverflow.com/q/9227859/301832 + */ + if (ofn.Flags & OFN_ALLOWMULTISELECT) { /* * The result in dynFileBuffer contains many items, separated by @@ -870,6 +875,7 @@ GetFileNameW( Tcl_AppendToObj(fullnameObj, "/", -1); Tcl_AppendToObj(fullnameObj, Tcl_DStringValue(&filenameBuf), Tcl_DStringLength(&filenameBuf)); + gotFilename = 1; Tcl_DStringFree(&filenameBuf); Tcl_ListObjAppendElement(NULL, returnList, fullnameObj); } @@ -883,18 +889,19 @@ GetFileNameW( Tcl_ListObjAppendElement(NULL, returnList, Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds))); + gotFilename |= (Tcl_DStringLength(&ds) > 0); } Tcl_SetObjResult(interp, returnList); Tcl_DStringFree(&ds); } else { Tcl_AppendResult(interp, ConvertExternalFilename(unicodeEncoding, (char *) ofn.lpstrFile, &ds), NULL); + gotFilename = (Tcl_DStringLength(&ds) > 0); Tcl_DStringFree(&ds); } result = TCL_OK; - if ((ofn.nFilterIndex > 0) && - Tcl_GetCharLength(Tcl_GetObjResult(interp)) > 0 && - typeVariableObj && filterObj) { + if ((ofn.nFilterIndex > 0) && gotFilename && typeVariableObj + && filterObj) { int listObjc, count; Tcl_Obj **listObjv = NULL; Tcl_Obj **typeInfo = NULL; -- cgit v0.12