diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2012-02-10 15:54:25 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2012-02-10 15:54:25 (GMT) |
commit | da13c5e294143c51bdee3d5d9f42c72b1843dc51 (patch) | |
tree | 831dac83c71f933f472362ac8526296f540174b3 /win | |
parent | af35ce6a64f4b7491095ba1201ec2cb8759b27b9 (diff) | |
parent | 751529e39515a7968bd597326de78c0f9f220f44 (diff) | |
download | tk-da13c5e294143c51bdee3d5d9f42c72b1843dc51.zip tk-da13c5e294143c51bdee3d5d9f42c72b1843dc51.tar.gz tk-da13c5e294143c51bdee3d5d9f42c72b1843dc51.tar.bz2 |
* win/tkWinDialog.c (GetFileName): 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
Diffstat (limited to 'win')
-rw-r--r-- | win/tkWinDialog.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/win/tkWinDialog.c b/win/tkWinDialog.c index f26905b..9a6f76b 100644 --- a/win/tkWinDialog.c +++ b/win/tkWinDialog.c @@ -818,6 +818,11 @@ GetFileName( 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 @@ -854,6 +859,7 @@ GetFileName( Tcl_AppendToObj(fullnameObj, "/", -1); Tcl_AppendToObj(fullnameObj, Tcl_DStringValue(&filenameBuf), Tcl_DStringLength(&filenameBuf)); + gotFilename = 1; Tcl_DStringFree(&filenameBuf); Tcl_ListObjAppendElement(NULL, returnList, fullnameObj); } @@ -867,18 +873,19 @@ GetFileName( 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; |