Cure flicker in Move History window, fix highlighting
authorH.G. Muller <h.g.muller@hccnet.nl>
Sun, 19 Jun 2011 08:56:25 +0000 (10:56 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Tue, 21 Jun 2011 10:07:07 +0000 (12:07 +0200)
The highlighting of the current move in the Move List window by selecting
it did not always work, because some other windows were clearing their text
widgets by selecting the contents and killing it, thus snatching the
selection away. This has been changed to setting XtNstring to an empty
string as a method for clearing without side effects on the selection.
As a bonus the Engine Output window now also no longer has the black flicker
on clearing it.
  In addition, triggering a scroll by setting the insertion point to the
end of the text caused excessive flicker in the Move List window, apparently
clearing it and redrawing from scratch, (even if there was no scroll motion),
to the point where on my slow laptop the move history stayed entirely blank
during a rapid succession of moves. This has been combatted by using the
end-of-line action procedure (which does not seem to suffer from this) to put
the insertion point at the end, when we need to scroll to close to the end.

history.c
xengineoutput.c
xhistory.c
xoptions.c

index 503f6a0..6226889 100644 (file)
--- a/history.c
+++ b/history.c
@@ -175,7 +175,6 @@ void MemoContentUpdated()
     int caretPos;
 
     if(lastCurrent <= currLast) DoHighlight( lastCurrent, FALSE );
-    DoHighlight( currCurrent, TRUE );
 
     lastFirst = currFirst;
     lastLast = currLast;
@@ -195,6 +194,7 @@ void MemoContentUpdated()
     }
 
     ScrollToCurrent(caretPos);
+    DoHighlight( currCurrent, TRUE ); // [HGM] moved last, because in X some scrolling methods spoil highlighting
 }
 
 // back-end. Must be called as double-click call-back on move-history text edit
index 57a32d3..3067fc1 100644 (file)
@@ -198,11 +198,12 @@ void SetIcon( int which, int field, int nIcon )
 
 void DoClearMemo(int which)
 {
-    Widget edit;
-
-    edit = XtNameToWidget(engineOutputShell, which ? "*form2.text" : "*form.text");
-    XtCallActionProc(edit, "select-all", NULL, NULL, 0);
-    XtCallActionProc(edit, "kill-selection", NULL, NULL, 0);
+    Widget edit = XtNameToWidget(engineOutputShell, which ? "*form2.text" : "*form.text");
+    Arg arg;
+//    XtCallActionProc(edit, "select-all", NULL, NULL, 0);
+//    XtCallActionProc(edit, "kill-selection", NULL, NULL, 0);
+    XtSetArg(arg, XtNstring, ""); // clear without disturbing selection!
+    XtSetValues(edit, &arg, 1);
 }
 
 // cloned from CopyPositionProc. Abuse selected_fen_position to hold selection
index 7dc3c9f..d79e7e8 100644 (file)
@@ -63,7 +63,7 @@ void RefreshMemoContent P((void));
 void MemoContentUpdated P((void));
 void FindMoveByCharIndex P(( int char_index ));
 
-void AppendText P((Option *opt, char *s));
+int AppendText P((Option *opt, char *s));
 int GenericPopUp P((Option *option, char *title, int dlgNr));
 void MarkMenu P((char *item, int dlgNr));
 void GetWidgetText P((Option *opt, char **buf));
@@ -76,8 +76,8 @@ extern Boolean shellUp[10];
 
 void HighlightMove( int from, int to, Boolean highlight )
 {
-    if(!highlight) from = to = 0;
-    XawTextSetSelection( historyOptions[0].handle, from, to ); // for lack of a better method, use selection for highighting
+    if(highlight)
+       XawTextSetSelection( historyOptions[0].handle, from, to ); // for lack of a better method, use selection for highighting
 }
 
 void ClearHistoryMemo()
@@ -90,20 +90,25 @@ void ClearHistoryMemo()
 int AppendToHistoryMemo( char * text, int bold, int colorNr )
 {
     Arg args[10];
-    char *s;
-    GetWidgetText(&historyOptions[0], &s);
-    AppendText(&historyOptions[0], text); // for now ignore bold & color stuff, as Xaw cannot handle that
-    return strlen(s);
+    return AppendText(&historyOptions[0], text); // for now ignore bold & color stuff, as Xaw cannot handle that
 }
 
 void ScrollToCurrent(int caretPos)
 {
     Arg args[10];
     char *s;
+    int len;
     GetWidgetText(&historyOptions[0], &s);
-    if(caretPos < 0 || caretPos > strlen(s)) caretPos = strlen(s);
-    XtSetArg(args[0], XtNdisplayCaret, False);
-    XtSetArg(args[1], XtNinsertPosition, caretPos); // this triggers scrolling in Xaw
+    len = strlen(s);
+    if(caretPos < 0 || caretPos > len) caretPos = len;
+    if(caretPos > len-30) { // scroll to end, which causes no flicker
+      static XEvent event;
+      XtCallActionProc(historyOptions[0].handle, "end-of-file", &event, NULL, 0);
+      return;
+    }
+    // the following leads to a very annoying flicker, even when no scrolling is done at all.
+    XtSetArg(args[0], XtNinsertPosition, caretPos); // this triggers scrolling in Xaw
+    XtSetArg(args[1], XtNdisplayCaret, False);
     XtSetValues(historyOptions[0].handle, args, 2);
 }
 
index a6a3059..575fc32 100644 (file)
@@ -303,11 +303,16 @@ extern Option installOptions[], matchOptions[];
 char *engineNr[] = { N_("First Engine"), N_("Second Engine"), NULL };
 char *engineList[100] = {" "}, *engineMnemonic[100] = {""};
 
-void AppendText(Option *opt, char *s)
+int AppendText(Option *opt, char *s)
 {
     XawTextBlock t;
+    char *v;
+    int len;
+    GetWidgetText(opt, &v);
+    len = strlen(v);
     t.ptr = s; t.firstPos = 0; t.length = strlen(s); t.format = XawFmt8Bit;
-    XawTextReplace(opt->handle, 9999, 9999, &t);
+    XawTextReplace(opt->handle, len, len, &t);
+    return len;
 }
 
 void AddLine(Option *opt, char *s)
@@ -1401,8 +1406,11 @@ Option commentOptions[] = {
 
 void ClearTextWidget(Option *opt)
 {
-    XtCallActionProc(opt->handle, "select-all", NULL, NULL, 0);
-    XtCallActionProc(opt->handle, "kill-selection", NULL, NULL, 0);
+//    XtCallActionProc(opt->handle, "select-all", NULL, NULL, 0);
+//    XtCallActionProc(opt->handle, "kill-selection", NULL, NULL, 0);
+    Arg arg;
+    XtSetArg(arg, XtNstring, ""); // clear without disturbing selection!
+    XtSetValues(opt->handle, &arg, 1);
 }
 
 void ClearComment(int n)