From 11b9b3e1df6897dbac076aa0d346823370183cf0 Mon Sep 17 00:00:00 2001 From: dkf Date: Mon, 14 Nov 2005 16:29:14 +0000 Subject: Fix problem in default selection handler outlined by test select-9.5 --- ChangeLog | 5 +++++ generic/tkSelect.c | 26 ++++++++++++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index bf6b966..2519cb4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-11-14 Donal K. Fellows + + * generic/tkSelect.c (TkSelDefaultSelection): Test select-9.5 + highlighted further brokenness in this function. + 2005-11-13 Donal K. Fellows * unix/tkUnixSelect.c (SelCvtToX): Arrange for the parsing code to diff --git a/generic/tkSelect.c b/generic/tkSelect.c index 396237e..a12bcc2 100644 --- a/generic/tkSelect.c +++ b/generic/tkSelect.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkSelect.c,v 1.16 2005/10/17 22:02:44 dkf Exp $ + * RCS: @(#) $Id: tkSelect.c,v 1.17 2005/11/14 16:29:15 dkf Exp $ */ #include "tkInt.h" @@ -1479,29 +1479,31 @@ TkSelDefaultSelection( if (target == dispPtr->targetsAtom) { register TkSelHandler *selPtr; - CONST char *atomString; - int length, atomLength; + int length; + Tcl_DString ds; if (maxBytes < 50) { return -1; } - strcpy(buffer, "MULTIPLE TARGETS TIMESTAMP TK_APPLICATION TK_WINDOW"); - length = strlen(buffer); + Tcl_DStringInit(&ds); + Tcl_DStringAppend(&ds, + "MULTIPLE TARGETS TIMESTAMP TK_APPLICATION TK_WINDOW", -1); for (selPtr = winPtr->selHandlerList; selPtr != NULL; selPtr = selPtr->nextPtr) { if ((selPtr->selection == infoPtr->selection) && (selPtr->target != dispPtr->applicationAtom) && (selPtr->target != dispPtr->windowAtom)) { - atomString = Tk_GetAtomName((Tk_Window) winPtr, + CONST char *atomString = Tk_GetAtomName((Tk_Window) winPtr, selPtr->target); - atomLength = strlen(atomString) + 1; - if ((length + atomLength) >= maxBytes) { - return -1; - } - sprintf(buffer+length, " %s", atomString); - length += atomLength; + Tcl_DStringAppendElement(&ds, atomString); } } + length = Tcl_DStringLength(&ds); + if (length >= maxBytes) { + return -1; + } + memcpy(buffer, Tcl_DStringValue(&ds), (unsigned) (1+length)); + Tcl_DStringFree(&ds); *typePtr = XA_ATOM; return length; } -- cgit v0.12