summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--generic/ttk/ttkLabel.c22
2 files changed, 25 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 12b560d..af9ccad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2012-06-11 Donal K. Fellows <dkf@users.sf.net>
+
+ * generic/ttk/ttkLabel.c (TextDraw): [Bug 3294450]: Get the clipping
+ of text in Ttk text elements (e.g., buttons, entries, etc.) correct.
+ Stops a whole range of visual problems, including loss of the second
+ and subsequent lines of a label when the first line doesn't entirely
+ fit, and failing to draw the last character of an entry at all if it
+ doesn't all exactly fit in the space available (a problem I've noticed
+ in tkchat, and been very frustrated with).
+
2012-06-10 Jan Nijtmans <nijtmans@users.sf.net>
* library/*.tcl: [Bug 3534137]: $tcl_platform(platform) !=
diff --git a/generic/ttk/ttkLabel.c b/generic/ttk/ttkLabel.c
index 90ed9e7..6abc847 100644
--- a/generic/ttk/ttkLabel.c
+++ b/generic/ttk/ttkLabel.c
@@ -7,7 +7,7 @@
*/
#include <tcl.h>
-#include <tk.h>
+#include <tkInt.h>
#include "ttkTheme.h"
/*----------------------------------------------------------------------
@@ -128,7 +128,6 @@ static void TextDraw(TextElement *text, Tk_Window tkwin, Drawable d, Ttk_Box b)
{
XColor *color = Tk_GetColorFromObj(tkwin, text->foregroundObj);
int underline = -1;
- int lastChar = -1;
XGCValues gcValues;
GC gc1, gc2;
Tk_Anchor anchor = TK_ANCHOR_CENTER;
@@ -147,21 +146,30 @@ static void TextDraw(TextElement *text, Tk_Window tkwin, Drawable d, Ttk_Box b)
/*
* Clip text if it's too wide:
- * @@@ BUG: This will overclip multi-line text.
*/
if (b.width < text->width) {
- lastChar = Tk_PointToChar(text->textLayout, b.width, 1) + 1;
+ TkRegion clipRegion = TkCreateRegion();
+ XRectangle rect;
+
+ rect.x = b.x;
+ rect.y = b.y;
+ rect.width = b.width + (text->embossed ? 1 : 0);
+ rect.height = b.height + (text->embossed ? 1 : 0);
+ TkUnionRectWithRegion(&rect, clipRegion, clipRegion);
+ TkSetRegion(Tk_Display(tkwin), gc1, clipRegion);
+ TkSetRegion(Tk_Display(tkwin), gc2, clipRegion);
+ TkDestroyRegion(clipRegion);
}
if (text->embossed) {
Tk_DrawTextLayout(Tk_Display(tkwin), d, gc2,
- text->textLayout, b.x+1, b.y+1, 0/*firstChar*/, lastChar);
+ text->textLayout, b.x+1, b.y+1, 0/*firstChar*/, -1/*lastChar*/);
}
Tk_DrawTextLayout(Tk_Display(tkwin), d, gc1,
- text->textLayout, b.x, b.y, 0/*firstChar*/, lastChar);
+ text->textLayout, b.x, b.y, 0/*firstChar*/, -1/*lastChar*/);
Tcl_GetIntFromObj(NULL, text->underlineObj, &underline);
- if (underline >= 0 && (lastChar == -1 || underline <= lastChar)) {
+ if (underline >= 0) {
if (text->embossed) {
Tk_UnderlineTextLayout(Tk_Display(tkwin), d, gc2,
text->textLayout, b.x+1, b.y+1, underline);