Also supply shortcut for start directory in GTK file chooser
[xboard.git] / gtk / xboard.c
index ad3cd5a..4a2731a 100644 (file)
@@ -449,7 +449,7 @@ ChangeFont (int force, char **font, int fnr, int size, char *def, int pix)
        if(fontIsSet[fnr] && !force) return; // unless forced we do not replace an explicitly specified font by a default
        ASSIGN(fontTable[fnr][size], def);   // use default
        fontIsSet[fnr] = False;
-    }
+    } else fontIsSet[fnr] = True;
     FREE(*font); *font = InsertPxlSize(fontTable[fnr][size], pix);
 }
 
@@ -666,7 +666,7 @@ ResizeBoardWindow (int w, int h, int inhibit)
 //    h += marginH + a.height + 1;
     gtk_window_resize(GTK_WINDOW(shellWidget), w, 10);
     DoEvents();
-    gtk_widget_set_size_request(optList[W_BOARD].handle, -1, -1); // liberate board again
+    if(!appData.fixedSize) gtk_widget_set_size_request(optList[W_BOARD].handle, 100, 100); // liberate board again
 }
 
 int
@@ -984,7 +984,9 @@ main (int argc, char **argv)
     }
 
     if ((chessDir = (char *) getenv("CHESSDIR")) == NULL) {
-       chessDir = ".";
+       static char dirName[MSG_SIZ];
+       getcwd(dirName, MSG_SIZ);
+       chessDir = dirName;
     } else {
        if (chdir(chessDir) != 0) {
            fprintf(stderr, _("%s: can't cd to CHESSDIR: "), programName);
@@ -1152,6 +1154,7 @@ main (int argc, char **argv)
     menuBarWidget    = optList[W_MENU].handle;
     dropMenu         = optList[W_DROP].handle;
     titleWidget = optList[optList[W_TITLE].type != Skip ? W_TITLE : W_SMALL].handle;
+    DelayedDrag(); // fake configure event (i3wm tiling window manager fails to send one after initial resize)
 #ifdef TODO_GTK
     formWidget  = XtParent(boardWidget);
     XtSetArg(args[0], XtNbackground, &timerBackgroundPixel);
@@ -1674,9 +1677,7 @@ ReSize (WindowPlacement *wp)
 {
        GtkAllocation a;
        int sqx, sqy, i, w, h, lg = lineGap;
-       static int first = 1;
-//     DisplayBothClocks();
-       if(wp->width == wpMain.width && wp->height == wpMain.height && !first) return; // not sized
+       if(wp->width == wpMain.width && wp->height == wpMain.height) return; // not sized
        gtk_widget_get_allocation(optList[W_DROP+1].handle, &a); // table that should contain everything
        w = a.width; h = a.height;
        gtk_widget_get_allocation(shellWidget, &a);
@@ -1701,8 +1702,8 @@ ReSize (WindowPlacement *wp)
            lg = sqx < 37 ? 1 : sqx < 59 ? 2 : sqx < 116 ? 3 : 4;
            if(sqx == oldSqx + 1 && lg == lineGap + 1) sqx = oldSqx, squareSize = 0; // prevent oscillations, force resize by kludge
        }
-       for(h=0; sizeDefaults[h].name && sizeDefaults[h].squareSize*8 > sqx*BOARD_WIDTH; h++) {}
-       if(initialSquareSize != sizeDefaults[h].squareSize) { // boardSize changed
+       for(h=0; sizeDefaults[h+1].name && sizeDefaults[h].squareSize*8 > sqx*BOARD_WIDTH; h++) {}
+       if(initialSquareSize != sizeDefaults[h].squareSize && !appData.fixedSize) { // boardSize changed
            initialSquareSize = sizeDefaults[h].squareSize; // used for saving font
            ChangeFont(1, &appData.clockFont, CLOCK_FONT, initialSquareSize, CLOCK_FONT_NAME, 2*(sizeDefaults[h].clockFontPxlSize+1)/3);
            ChangeFont(1, &appData.font, MESSAGE_FONT, initialSquareSize, DEFAULT_FONT_NAME, sizeDefaults[h].coordFontPxlSize);
@@ -1710,7 +1711,7 @@ ReSize (WindowPlacement *wp)
            ChangeFont(0, &appData.tagsFont, EDITTAGS_FONT, initialSquareSize, TAGS_FONT_NAME, sizeDefaults[h].coordFontPxlSize);
            ChangeFont(0, &appData.commentFont, COMMENT_FONT, initialSquareSize, COMMENT_FONT_NAME, sizeDefaults[h].coordFontPxlSize);
            ChangeFont(0, &appData.gameListFont, GAMELIST_FONT, initialSquareSize, GAMELIST_FONT_NAME, sizeDefaults[h].coordFontPxlSize);
-           ChangeFont(0, &appData.coordFont, MOVEHISTORY_FONT, initialSquareSize, HISTORY_FONT_NAME, sizeDefaults[h].coordFontPxlSize);
+           ChangeFont(0, &appData.historyFont, MOVEHISTORY_FONT, initialSquareSize, HISTORY_FONT_NAME, sizeDefaults[h].coordFontPxlSize);
            DisplayBothClocks();
            ApplyFont(&mainOptions[W_MESSG], NULL);
            for(i=1; i<6; i++) ApplyFont(&mainOptions[W_BUTTON+i], NULL);
@@ -1736,16 +1737,15 @@ ReSize (WindowPlacement *wp)
            }
        }
 #endif
-       if(sqx != squareSize && !first) {
+       if(sqx != squareSize && !appData.fixedSize) {
            squareSize = sqx; // adopt new square size
-           CreatePNGPieces(); // make newly scaled pieces
+           CreatePNGPieces(appData.pieceDirectory); // make newly scaled pieces
            InitDrawingSizes(0, 0); // creates grid etc.
        } else ResizeBoardWindow(BOARD_WIDTH * (squareSize + lineGap) + lineGap, BOARD_HEIGHT * (squareSize + lineGap) + lineGap, 0);
        w = BOARD_WIDTH * (squareSize + lineGap) + lineGap;
        h = BOARD_HEIGHT * (squareSize + lineGap) + lineGap;
        if(optList[W_BOARD].max   > w) optList[W_BOARD].max = w;
        if(optList[W_BOARD].value > h) optList[W_BOARD].value = h;
-       first = appData.fixedSize;
        if(twoBoards && shellUp[DummyDlg]) {
            SlavePopUp(); dualOptions[3].max = 0; DoEvents(); // calls SlaveResize, kludge to force assigning new canvas
            partnerUp = !partnerUp; flipView = !flipView;
@@ -1759,18 +1759,19 @@ static guint delayedDragTag = 0;
 void
 DragProc ()
 {
-       static int busy;
-       if(busy) { // prevent recursive calling, but postpone interrupting call rather than lose it
-           if(!delayedDragTag) delayedDragTag = g_timeout_add( 200, (GSourceFunc) DragProc, NULL);
-           return;
-       }
-       busy = 1;
+    static int busy;
+    if(busy++) return; // prevent recursive calling, but remember we missed an event in 'busy'
+
+    if(delayedDragTag) g_source_remove(delayedDragTag); // no more timer interrupts from same event!
+    delayedDragTag = 0;
+
+    do {
        GetActualPlacement(shellWidget, &wpNew);
        if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved
           wpNew.width == wpMain.width && wpNew.height == wpMain.height) { // not sized
-           busy = 0; return; // false alarm
+           busy = 0; break; // false alarm
        }
-       ReSize(&wpNew);
+       ReSize(&wpNew); // this can be interrupted by other events
        if(appData.useStickyWindows) {
            if(shellUp[EngOutDlg]) CoDrag(shells[EngOutDlg], &wpEngineOutput);
            if(shellUp[HistoryDlg]) CoDrag(shells[HistoryDlg], &wpMoveHistory);
@@ -1780,9 +1781,8 @@ DragProc ()
         }
        wpMain = wpNew;
        DrawPosition(True, NULL);
-       if(delayedDragTag) g_source_remove(delayedDragTag);
-       delayedDragTag = 0; // now drag executed, make sure next DelayedDrag will not cancel timer event (which could now be used by other)
-       busy = 0;
+       if(busy > 2) busy = 2; // if multiple events were backlogged, only do one more
+    } while(--busy);
 }
 
 void