Let expose requests pay proper attenton to widget
authorH.G. Muller <h.g.muller@hccnet.nl>
Wed, 10 Oct 2012 17:45:39 +0000 (19:45 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 21 Oct 2012 09:28:19 +0000 (11:28 +0200)
So far, expose requests were always assumed to be for the board widget,
preventing display of the labels.

board.c
board.h
draw.c
draw.h
xoptions.c

diff --git a/board.c b/board.c
index e0f0649..b8be924 100644 (file)
--- a/board.c
+++ b/board.c
@@ -98,6 +98,7 @@ extern char *getenv();
 #include "backend.h"
 #include "moves.h"
 #include "board.h"
+#include "draw.h"
 
 
 #ifdef __EMX__
@@ -812,10 +813,10 @@ DrawSquare (int row, int column, ChessSquare piece, int do_flash)
     if (do_flash && piece != EmptySquare && appData.flashCount > 0) {
        for (i=0; i<appData.flashCount; ++i) {
            DrawOneSquare(x, y, piece, square_color, 0, string, 0);
-           DrawExpose(NULL, x, y, squareSize, squareSize);
+           GraphExpose(currBoard, x, y, squareSize, squareSize);
            FlashDelay(flash_delay);
            DrawOneSquare(x, y, EmptySquare, square_color, 0, string, 0);
-           DrawExpose(NULL, x, y, squareSize, squareSize);
+           GraphExpose(currBoard, x, y, squareSize, squareSize);
            FlashDelay(flash_delay);
        }
     }
@@ -1000,7 +1001,7 @@ DrawPosition (int repaint, Board board)
     DrawDragPiece();
 
     if(exposeAll)
-       DrawExpose(NULL, 0, 0, BOARD_WIDTH*(squareSize + lineGap) + lineGap, BOARD_HEIGHT*(squareSize + lineGap) + lineGap);
+       GraphExpose(currBoard, 0, 0, BOARD_WIDTH*(squareSize + lineGap) + lineGap, BOARD_HEIGHT*(squareSize + lineGap) + lineGap);
     else {
        for (i = 0; i < BOARD_HEIGHT; i++)
            for (j = 0; j < BOARD_WIDTH; j++)
@@ -1016,9 +1017,9 @@ DrawPosition (int repaint, Board board)
                          (squareSize + lineGap);
                    }
                    if(damage[nr][i][j] & 2) // damage by old or new arrow
-                       DrawExpose(NULL, x - lineGap, y - lineGap, squareSize + 2*lineGap, squareSize  + 2*lineGap);
+                       GraphExpose(currBoard, x - lineGap, y - lineGap, squareSize + 2*lineGap, squareSize  + 2*lineGap);
                    else
-                       DrawExpose(NULL, x, y, squareSize, squareSize);
+                       GraphExpose(currBoard, x, y, squareSize, squareSize);
                    damage[nr][i][j] &= ~2; // remember damage by newly drawn error in '2' bit, to schedule it for erasure next draw
                }
     }
diff --git a/board.h b/board.h
index c95e54a..400fb98 100644 (file)
--- a/board.h
+++ b/board.h
@@ -95,4 +95,5 @@ void FlashDelay P((int flash_delay));
 void SwitchWindow P((void));
 
 extern int damage[2][BOARD_RANKS][BOARD_FILES];
+extern Option *currBoard;
 
diff --git a/draw.c b/draw.c
index eab7e87..7571850 100644 (file)
--- a/draw.c
+++ b/draw.c
@@ -110,7 +110,8 @@ extern char *getenv();
 #define SOLID 0
 #define OUTLINE 1
 Boolean cairoAnimate;
-static cairo_surface_t *csBoardWindow, *csDualBoard;
+Option *currBoard;
+static cairo_surface_t *csBoardWindow;
 static cairo_surface_t *pngPieceImages[2][(int)BlackPawn+4];   // png 256 x 256 images
 static cairo_surface_t *pngPieceBitmaps[2][(int)BlackPawn];    // scaled pieces as used
 static cairo_surface_t *pngPieceBitmaps2[2][(int)BlackPawn+4]; // scaled pieces in store
@@ -131,14 +132,9 @@ static int dual = 0;
 void
 SwitchWindow ()
 {
-    cairo_surface_t *cstmp = csBoardWindow;
-    csBoardWindow = csDualBoard;
     dual = !dual;
-    if(!csDualBoard) {
-       csBoardWindow = DRAWABLE(dualOptions+3);
-       dual = 1;
-    }
-    csDualBoard = cstmp;
+    currBoard = (dual ? &mainOptions[W_BOARD] : &dualOptions[3]);
+    csBoardWindow = DRAWABLE(currBoard);
 }
 
 #define BoardSize int
@@ -437,6 +433,7 @@ void
 DrawSeekOpen ()
 {
     csBoardWindow = (cairo_surface_t *) mainOptions[W_BOARD].choice;
+    currBoard = &mainOptions[W_BOARD];
 }
 
 void
@@ -516,7 +513,7 @@ DrawBorder (int x, int y, int type)
     SetPen(cr, lineGap, col, 0);
     cairo_stroke(cr);
     cairo_destroy(cr);
-    DrawExpose(NULL, x - lineGap/2, y - lineGap/2, squareSize+2*lineGap, squareSize+2*lineGap);
+    GraphExpose(currBoard, x - lineGap/2, y - lineGap/2, squareSize+2*lineGap, squareSize+2*lineGap);
 }
 
 static int
@@ -742,7 +739,7 @@ void CopyRectangle (AnimNr anr, int srcBuf, int destBuf,
        cairo_fill (cr);
        cairo_destroy (cr);
        if(c_animBufs[anr+destBuf] == csBoardWindow)
-           DrawExpose(NULL, destX, destY, squareSize, squareSize);
+           GraphExpose(currBoard, destX, destY, squareSize, squareSize);
 }
 
 void
diff --git a/draw.h b/draw.h
index a606214..3ba9efe 100644 (file)
--- a/draw.h
+++ b/draw.h
@@ -59,7 +59,6 @@ void CreateGCs P((int redo));
 void DelayedDrag P((void));
 void ReadBitmap P((Pixmap *pm, String name, unsigned char bits[],
                   u_int wreq, u_int hreq));
-cairo_surface_t *GetOutputSurface P((Option *opt, int w, int h));
 
 extern XFontStruct *coordFontStruct, *countFontStruct;
 extern Font coordFontID, countFontID;
@@ -76,6 +75,5 @@ void CreatePNGPieces P((void));
 void CreateGrid P((void));
 
 // defined in xoptions.c
-void DrawExpose P((Option *opt, int x, int y, int w, int h));
-
+void GraphExpose P((Option *opt, int x, int y, int w, int h));
 
index 70ab431..6993ab2 100644 (file)
@@ -599,10 +599,9 @@ GraphEventProc(Widget widget, caddr_t client_data, XEvent *event)
 }
 
 void
-DrawExpose (Option *opt, int x, int y, int w, int h)
+GraphExpose (Option *opt, int x, int y, int w, int h)
 {
   XExposeEvent e;
-  opt = &mainOptions[W_BOARD];
   if(!opt->handle) return;
   e.x = x; e.y = y; e.width = w; e.height = h; e.count = -1; e.type = Expose; // count = -1: kludge to suppress sizing
   GraphEventProc(opt->handle, (caddr_t) opt, (XEvent *) &e); // fake expose event