Tk Source Code

View Ticket
Login
Ticket UUID: 2a0a8340227f0ab5de373a59d855dc3d71c88b63
Title: pixel values can report false list lengths
Type: Bug Version: 9.0
Submitter: dgp Created on: 2025-09-05 15:40:38
Subsystem: 27. Objects Assigned To: jan.nijtmans
Priority: 5 Medium Severity: Important
Status: Closed Last Modified: 2025-11-03 21:04:50
Resolution: Fixed Closed By: jan.nijtmans
    Closed on: 2025-11-03 21:04:50
Description:
Tk 8.6 got this right...

% package require Tk
8.6.18
% [button .b] configure -padx "3 m"
% llength [.b cget -padx]
2

Tk 9 gets it wrong:

% package require Tk
9.0.3
% [button .b] configure -padx "3 m"
% llength [.b cget -padx]
1
User Comments: jan.nijtmans added on 2025-11-03 21:04:50:

Simple fix [526669416126d796|here]


jan.nijtmans added on 2025-10-31 19:14:25:

Ping


dgp added on 2025-09-08 16:38:06:
At least on Linux, the Tk test suite does not have
any tests of pixel or mm values that have whitespace
between the number and the units designation.

dgp added on 2025-09-05 16:28:34:
The "mm" Tcl_ObjType suffers from the same bug.

The "pixel" and "mm" types are 95%+ identical.
Is there truly a need for both of them?  Even
if there is, couldn't they be refactored to share
a large fraction of their implementation?

dgp added on 2025-09-05 16:09:44:
A corner case to consider:

% [button .b] configure -padx "0x10 c"
% .b cget -padx
0x10 c

dgp added on 2025-09-05 16:01:05:
The simplest fix is to revert the adoption of the extended
Tcl_ObjType functionality.

An alternative would be to revise the "lengthProc" in the
pixel Tcl_ObjType to report the correct length, taking the
steps to distinguish the length 1 values from the length 2 values.

A mildly incompatible alternative would be to revise
the SetPixelFromAny() function so that values with whitespace
between the number and the units are rejected, so that length 2
list values are no longer accepted as pixel values.

The choice between these options (or another one) would be better
made by Tk developers who can anticipate the effect on other
parts of the Tk code base, and the world of Tk code out there.

dgp added on 2025-09-05 15:54:05:
In Tk 9, the "pixel" Tcl_ObjType is using the abstract list features
of Tcl_ObjType to report that when used as a list, every pixel value
is a list of length 1, which the demo script shows to be false.