Skip to content

Commit

Permalink
Merged core-8-6-branch into core-8-branch.
Browse files Browse the repository at this point in the history
  • Loading branch information
csaba committed Jul 31, 2024
2 parents fafe3ad + f0d3c91 commit fc10c5c
Show file tree
Hide file tree
Showing 6 changed files with 181 additions and 85 deletions.
2 changes: 2 additions & 0 deletions generic/tkInt.h
Original file line number Diff line number Diff line change
Expand Up @@ -1341,6 +1341,8 @@ MODULE_SCOPE void TkpCreateBusy(Tk_FakeWin *winPtr, Tk_Window tkRef,
TkBusy busy);
MODULE_SCOPE int TkBackgroundEvalObjv(Tcl_Interp *interp,
Tcl_Size objc, Tcl_Obj *const *objv, int flags);
MODULE_SCOPE void TkDrawDottedRect(Display *disp, Drawable d, GC gc,
int x, int y, int width, int height);
MODULE_SCOPE Tcl_Command TkMakeEnsemble(Tcl_Interp *interp,
const char *nsname, const char *name,
void *clientData, const TkEnsemble *map);
Expand Down
71 changes: 15 additions & 56 deletions generic/tkListbox.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@
#include "tkInt.h"
#include "default.h"

#ifdef _WIN32
#include "tkWinInt.h"
#endif

typedef struct {
Tk_OptionTable listboxOptionTable;
/* Table defining configuration options
Expand Down Expand Up @@ -1837,6 +1833,7 @@ DisplayListbox(
{
Listbox *listPtr = (Listbox *)clientData;
Tk_Window tkwin = listPtr->tkwin;
Display *disp = listPtr->display;
GC gc;
int i, limit, x, y, prevSelected, freeGC;
Tcl_Size stringLen;
Expand Down Expand Up @@ -1892,7 +1889,7 @@ DisplayListbox(
* screen).
*/

pixmap = Tk_GetPixmap(listPtr->display, Tk_WindowId(tkwin),
pixmap = Tk_GetPixmap(disp, Tk_WindowId(tkwin),
Tk_Width(tkwin), Tk_Height(tkwin), Tk_Depth(tkwin));
#else
pixmap = Tk_WindowId(tkwin);
Expand Down Expand Up @@ -1922,7 +1919,7 @@ DisplayListbox(
int width = Tk_Width(tkwin); /* zeroth approx to silence warning */

x = listPtr->inset;
y = ((i - listPtr->topIndex) * listPtr->lineHeight) + listPtr->inset;
y = (i - listPtr->topIndex) * listPtr->lineHeight + listPtr->inset;
gc = listPtr->textGC;
freeGC = 0;

Expand Down Expand Up @@ -2089,7 +2086,7 @@ DisplayListbox(
- listPtr->xOffset + GetMaxOffset(listPtr)/2;
}

Tk_DrawChars(listPtr->display, pixmap, gc, listPtr->tkfont,
Tk_DrawChars(disp, pixmap, gc, listPtr->tkfont,
stringRep, stringLen, x, y);

/*
Expand All @@ -2102,71 +2099,34 @@ DisplayListbox(
* Underline the text.
*/

Tk_UnderlineChars(listPtr->display, pixmap, gc,
listPtr->tkfont, stringRep, x, y, 0, stringLen);
Tk_UnderlineChars(disp, pixmap, gc, listPtr->tkfont,
stringRep, x, y, 0, stringLen);
} else if (listPtr->activeStyle == ACTIVE_STYLE_DOTBOX) {
#ifdef _WIN32
/*
* This provides for exact default look and feel on Windows.
*/

TkWinDCState state;
HDC dc;
RECT rect;

dc = TkWinGetDrawableDC(listPtr->display, pixmap, &state);
rect.left = listPtr->inset;
rect.top = ((i - listPtr->topIndex) * listPtr->lineHeight)
+ listPtr->inset;
rect.right = rect.left + width;
rect.bottom = rect.top + listPtr->lineHeight;
DrawFocusRect(dc, &rect);
TkWinReleaseDrawableDC(pixmap, dc, &state);
#else /* !_WIN32 */
/*
* Draw a dotted box around the text.
*/

x = listPtr->inset;
y = ((i - listPtr->topIndex) * listPtr->lineHeight)
y = (i - listPtr->topIndex) * listPtr->lineHeight
+ listPtr->inset;
width = Tk_Width(tkwin) - 2*listPtr->inset - 1;

gcValues.line_style = LineOnOffDash;
gcValues.line_width = listPtr->selBorderWidth;
if (gcValues.line_width <= 0) {
gcValues.line_width = 1;
}
gcValues.dash_offset = 0;
gcValues.dashes = 1;
width = Tk_Width(tkwin) - 2*listPtr->inset;

/*
* You would think the XSetDashes was necessary, but it
* appears that the default dotting for just saying we want
* dashes appears to work correctly.
static char dashList[] = { 1 };
static int dashLen = sizeof(dashList);
XSetDashes(listPtr->display, gc, 0, dashList, dashLen);
*/
TkDrawDottedRect(disp, pixmap, gc, x, y,
width, listPtr->lineHeight);

mask = GCLineWidth | GCLineStyle | GCDashList | GCDashOffset;
XChangeGC(listPtr->display, gc, mask, &gcValues);
XDrawRectangle(listPtr->display, pixmap, gc, x, y,
(unsigned) width, (unsigned) listPtr->lineHeight - 1);
if (!freeGC) {
/*
* Don't bother changing if it is about to be freed.
*/

gcValues.line_style = LineSolid;
XChangeGC(listPtr->display, gc, GCLineStyle, &gcValues);
XChangeGC(disp, gc, GCLineStyle, &gcValues);
}
#endif /* _WIN32 */
}
}

if (freeGC) {
Tk_FreeGC(listPtr->display, gc);
Tk_FreeGC(disp, gc);
}
}

Expand Down Expand Up @@ -2194,10 +2154,9 @@ DisplayListbox(
}
}
#ifndef TK_NO_DOUBLE_BUFFERING
XCopyArea(listPtr->display, pixmap, Tk_WindowId(tkwin),
listPtr->textGC, 0, 0, (unsigned) Tk_Width(tkwin),
(unsigned) Tk_Height(tkwin), 0, 0);
Tk_FreePixmap(listPtr->display, pixmap);
XCopyArea(disp, pixmap, Tk_WindowId(tkwin), listPtr->textGC, 0, 0,
(unsigned) Tk_Width(tkwin), (unsigned) Tk_Height(tkwin), 0, 0);
Tk_FreePixmap(disp, pixmap);
#endif /* TK_NO_DOUBLE_BUFFERING */
}

Expand Down
64 changes: 64 additions & 0 deletions generic/tkUtil.c
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,70 @@ Tk_DrawFocusHighlight(
TkDrawInsetFocusHighlight(tkwin, gc, width, drawable, 0);
}

/*
*----------------------------------------------------------------------
*
* TkDrawDottedRect --
*
* This function draws a dotted rectangle, used as focus ring of Ttk
* widgets and for rendering the active element of a listbox.
*
* Results:
* None.
*
* Side effects:
* A dotted rectangle is drawn in the specified Drawable. On the
* windowing systems x11 and aqua the GC components line_style,
* line_width, dashes, and dash_offset are modified as needed.
*
*----------------------------------------------------------------------
*/

void
TkDrawDottedRect(
Display *disp, /* Display containing the dotted rectangle. */
Drawable d, /* Where to draw the rectangle (typically a
* pixmap for double buffering). */
GC gc, /* Graphics context to use for drawing the
* rectangle. */
int x, int y, /* Coordinates of the top-left corner. */
int width, int height) /* Width & height, _including the border_. */
{
#ifdef _WIN32
TkWinDrawDottedRect(disp, d, gc->foreground, x, y, width, height);

#else
XGCValues gcValues;
int widthMod2 = width % 2, heightMod2 = height % 2;
int x2 = x + width - 1, y2 = y + height - 1;

gcValues.line_style = LineOnOffDash;
gcValues.line_width = 1;
gcValues.dashes = 1;
#ifdef MAC_OSX_TK
gcValues.dash_offset = 1;
#else
gcValues.dash_offset = 0;
#endif
XChangeGC(disp, gc, GCLineStyle | GCLineWidth | GCDashList | GCDashOffset,
&gcValues);

if (widthMod2 == 0 && heightMod2 == 0) {
XDrawLine(disp, d, gc, x+1, y, x2-1, y); /* N */
XDrawLine(disp, d, gc, x+2, y2, x2, y2); /* S */
XDrawLine(disp, d, gc, x, y+2, x, y2); /* W */
XDrawLine(disp, d, gc, x2, y+1, x2, y2-1); /* E */
} else {
int dx = 1 - widthMod2, dy = 1 - heightMod2;

XDrawLine(disp, d, gc, x+1, y, x2-dx, y); /* N */
XDrawLine(disp, d, gc, x+1, y2, x2-dx, y2); /* S */
XDrawLine(disp, d, gc, x, y+1, x, y2-dy); /* W */
XDrawLine(disp, d, gc, x2, y+1, x2, y2-dy); /* E */
}
#endif
}

/*
*----------------------------------------------------------------------
*
Expand Down
34 changes: 21 additions & 13 deletions generic/ttk/ttkElements.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ static void FieldElementDraw(
int x1 = b.x, x2 = b.x + b.width - 1;
int y1 = b.y, y2 = b.y + b.height - 1;
int w = WIN32_XDRAWLINE_HACK;
GC bgGC;

/*
* Draw the outer rounded rectangle
Expand All @@ -265,7 +266,7 @@ static void FieldElementDraw(
/*
* Fill the inner rectangle
*/
GC bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC);
bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC);
XFillRectangle(disp, d, bgGC, b.x+1, b.y+1, b.width-2, b.height-2);
} else {
/*
Expand Down Expand Up @@ -371,24 +372,31 @@ static void DrawFocusRing(
Ttk_Box b)
{
XColor *color = Tk_GetColorFromObj(tkwin, colorObj);
unsigned long mask = 0UL;
XGCValues gcvalues;
XGCValues gcValues;
GC gc;
Display *disp = Tk_Display(tkwin);

if (thickness < 1 && solid) {
thickness = 1;
}

gcValues.foreground = color->pixel;
gc = Tk_GetGC(tkwin, GCForeground, &gcValues);

gcvalues.foreground = color->pixel;
gcvalues.line_width = thickness < 1 ? 1 : thickness;
if (solid) {
gcvalues.line_style = LineSolid;
mask = GCForeground | GCLineStyle | GCLineWidth;
XRectangle rects[4] = {
{b.x, b.y, b.width, thickness}, /* N */
{b.x, b.y + b.height - thickness, b.width, thickness}, /* S */
{b.x, b.y + thickness, thickness, b.height - 2*thickness}, /* W */
{b.x + b.width - thickness, b.y + thickness, /* E */
thickness, b.height - 2*thickness}
};

XFillRectangles(disp, d, gc, rects, 4);
} else {
gcvalues.line_style = LineOnOffDash;
gcvalues.dashes = 1;
gcvalues.dash_offset = 1;
mask = GCForeground | GCLineStyle | GCDashList | GCDashOffset | GCLineWidth;
TkDrawDottedRect(disp, d, gc, b.x, b.y, b.width, b.height);
}

gc = Tk_GetGC(tkwin, mask, &gcvalues);
XDrawRectangle(Tk_Display(tkwin), d, gc, b.x, b.y, b.width-1, b.height-1);
Tk_FreeGC(Tk_Display(tkwin), gc);
}

Expand Down
61 changes: 61 additions & 0 deletions win/tkWinDraw.c
Original file line number Diff line number Diff line change
Expand Up @@ -1485,6 +1485,67 @@ Tk_DrawHighlightBorder(
TkDrawInsetFocusHighlight(tkwin, fgGC, highlightWidth, drawable, 0);
}

/*
*----------------------------------------------------------------------
*
* TkWinDrawDottedRect --
*
* This function draws a dotted rectangle, used as focus ring of Ttk
* widgets and for rendering the active element of a listbox.
*
* Results:
* None.
*
* Side effects:
* A dotted rectangle is drawn in the specified Drawable.
*
*----------------------------------------------------------------------
*/

void
TkWinDrawDottedRect(
Display *disp, /* Display containing the dotted rectangle. */
Drawable d, /* Where to draw the rectangle (typically a
* pixmap for double buffering). */
unsigned long pixel, /* color to use for drawing the rectangle. */
int x, int y, /* Coordinates of the top-left corner. */
int width, int height) /* Width & height, _including the border_. */
{
TkWinDCState state;
HDC dc;
LOGBRUSH lb;
HPEN pen;
int widthMod2 = width % 2, heightMod2 = height % 2;
int x2 = x + width - 1, y2 = y + height - 1;

dc = TkWinGetDrawableDC(disp, d, &state);

lb.lbStyle = BS_SOLID;
lb.lbColor = (COLORREF)pixel;
lb.lbHatch = 0;

pen = ExtCreatePen(PS_COSMETIC | PS_ALTERNATE, 1, &lb, 0, NULL);
SelectObject(dc, pen);
SelectObject(dc, GetStockObject(NULL_BRUSH));

if (widthMod2 == 0 && heightMod2 == 0) {
MoveToEx(dc, x+1, y, NULL); LineTo(dc, x2, y); /* N */
MoveToEx(dc, x+2, y2, NULL); LineTo(dc, x2, y2+1); /* S */
MoveToEx(dc, x, y+2, NULL); LineTo(dc, x, y2+1); /* W */
MoveToEx(dc, x2, y+1, NULL); LineTo(dc, x2, y2); /* E */
} else {
int dx = widthMod2, dy = heightMod2;

MoveToEx(dc, x+1, y, NULL); LineTo(dc, x2+dx, y); /* N */
MoveToEx(dc, x+1, y2, NULL); LineTo(dc, x2+dx, y2); /* S */
MoveToEx(dc, x, y+1, NULL); LineTo(dc, x, y2+dy); /* W */
MoveToEx(dc, x2, y+1, NULL); LineTo(dc, x2, y2+dy); /* E */
}

DeleteObject(pen);
TkWinReleaseDrawableDC(d, dc, &state);
}

/*
*----------------------------------------------------------------------
*
Expand Down
Loading

0 comments on commit fc10c5c

Please sign in to comment.