1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-01-08 23:04:15 +01:00

Try to reduce flicker in text widget.

This commit is contained in:
id
1999-04-28 22:50:40 +00:00
parent aac9a006d0
commit 5a156f9131

View File

@@ -633,11 +633,13 @@ paintTextField(TextField *tPtr)
{ {
W_Screen *screen = tPtr->view->screen; W_Screen *screen = tPtr->view->screen;
W_View *view = tPtr->view; W_View *view = tPtr->view;
W_View viewbuffer;
int tx, ty, tw, th; int tx, ty, tw, th;
int rx; int rx;
int bd; int bd;
int totalWidth; int totalWidth;
char *text; char *text;
Pixmap drawbuffer;
if (!view->flags.realized || !view->flags.mapped) if (!view->flags.realized || !view->flags.mapped)
@@ -656,6 +658,16 @@ paintTextField(TextField *tPtr)
} }
totalWidth = tPtr->view->size.width - 2*bd; totalWidth = tPtr->view->size.width - 2*bd;
drawbuffer = XCreatePixmap(screen->display, view->window,
view->size.width, view->size.height, screen->depth);
XFillRectangle(screen->display, drawbuffer, WMColorGC(screen->white),
0,0, view->size.width,view->size.height);
/* this is quite dirty */
viewbuffer.screen = view->screen;
viewbuffer.size = view->size;
viewbuffer.window = drawbuffer;
if (tPtr->textLen > 0) { if (tPtr->textLen > 0) {
tw = WMWidthOfString(tPtr->font, &(text[tPtr->viewPosition]), tw = WMWidthOfString(tPtr->font, &(text[tPtr->viewPosition]),
@@ -665,12 +677,12 @@ paintTextField(TextField *tPtr)
ty = tPtr->offsetWidth; ty = tPtr->offsetWidth;
switch (tPtr->flags.alignment) { switch (tPtr->flags.alignment) {
case WALeft: case WALeft:
tx = tPtr->offsetWidth + 1; tx = tPtr->offsetWidth + 1;
if (tw < tPtr->usableWidth) if (tw < tPtr->usableWidth)
XClearArea(screen->display, view->window, bd+tw, bd, XFillRectangle(screen->display, drawbuffer,
totalWidth-tw, view->size.height-2*bd, WMColorGC(screen->white),
False); bd+tw,bd, totalWidth-tw,view->size.height-2*bd);
break; break;
case WACenter: case WACenter:
@@ -692,58 +704,62 @@ paintTextField(TextField *tPtr)
if (!tPtr->flags.enabled) if (!tPtr->flags.enabled)
WMSetColorInGC(screen->darkGray, screen->textFieldGC); WMSetColorInGC(screen->darkGray, screen->textFieldGC);
WMDrawImageString(screen, view->window, screen->textFieldGC, WMDrawImageString(screen, drawbuffer, screen->textFieldGC,
tPtr->font, tx, ty, tPtr->font, tx, ty,
&(text[tPtr->viewPosition]), &(text[tPtr->viewPosition]),
tPtr->textLen - tPtr->viewPosition); tPtr->textLen - tPtr->viewPosition);
if (tPtr->selection.count) { if (tPtr->selection.count) {
int count; int count,count2;
count = tPtr->selection.count < 0 count = tPtr->selection.count < 0
? tPtr->selection.position + tPtr->selection.count ? tPtr->selection.position + tPtr->selection.count
: tPtr->selection.position; : tPtr->selection.position;
count2 = abs(tPtr->selection.count);
if (count < tPtr->viewPosition) {
count2 = abs(count2 - abs(tPtr->viewPosition - count));
count = tPtr->viewPosition;
}
/*
rx = tx + WMWidthOfString(tPtr->font,
&(text[tPtr->viewPosition]),
count)
- WMWidthOfString(tPtr->font,
text,tPtr->viewPosition);
*/
rx = tPtr->offsetWidth + 1 + WMWidthOfString(tPtr->font,text,count) rx = tPtr->offsetWidth + 1 + WMWidthOfString(tPtr->font,text,count)
- WMWidthOfString(tPtr->font,text,tPtr->viewPosition); - WMWidthOfString(tPtr->font,text,tPtr->viewPosition);
XSetBackground(screen->display, screen->textFieldGC, XSetBackground(screen->display, screen->textFieldGC,
screen->gray->color.pixel); screen->gray->color.pixel);
WMDrawImageString(screen, view->window, screen->textFieldGC, WMDrawImageString(screen, drawbuffer, screen->textFieldGC,
tPtr->font, rx, ty, &(text[count]), tPtr->font, rx, ty, &(text[count]),
abs(tPtr->selection.count)); abs(tPtr->selection.count));
XSetBackground(screen->display, screen->textFieldGC, XSetBackground(screen->display, screen->textFieldGC,
screen->white->color.pixel); screen->white->color.pixel);
} }
if (!tPtr->flags.enabled) if (!tPtr->flags.enabled)
WMSetColorInGC(screen->black, screen->textFieldGC); WMSetColorInGC(screen->black, screen->textFieldGC);
} else { } else {
XClearArea(screen->display, view->window, bd, bd, totalWidth, XFillRectangle(screen->display, drawbuffer,
view->size.height - 2*bd, False); WMColorGC(screen->white),
bd,bd, totalWidth,view->size.height-2*bd);
} }
/* draw cursor */
if (tPtr->flags.focused && tPtr->flags.enabled && tPtr->flags.cursorOn) {
paintCursor(tPtr);
}
/* draw relief */ /* draw relief */
if (tPtr->flags.bordered) { if (tPtr->flags.bordered) {
drawRelief(view, tPtr->flags.beveled); drawRelief(&viewbuffer, tPtr->flags.beveled);
} }
if (tPtr->flags.secure) if (tPtr->flags.secure)
free(text); free(text);
XCopyArea(screen->display, drawbuffer, view->window,
screen->copyGC, 0,0, view->size.width,
view->size.height,0,0);
XFreePixmap(screen->display, drawbuffer);
/* draw cursor */
if (tPtr->flags.focused && tPtr->flags.enabled && tPtr->flags.cursorOn) {
paintCursor(tPtr);
}
} }