/*\r
* wgamelist.c -- Game list window for WinBoard\r
*\r
- * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.\r
+ * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free\r
+ * Software Foundation, Inc.\r
*\r
* Enhancements Copyright 2005 Alessandro Scotti\r
*\r
static FILE* gameFile;\r
static char* gameFileName = NULL;\r
\r
-struct GameListStats\r
-{\r
- int white_wins;\r
- int black_wins;\r
- int drawn;\r
- int unfinished;\r
-};\r
-\r
/* [AS] Setup the game list according to the specified filter */\r
-static int GameListToListBox( HWND hDlg, BOOL boReset, char * pszFilter, struct GameListStats * stats, BOOL byPos, BOOL narrow )\r
+int GameListToListBox( HWND hDlg, BOOL boReset, char * pszFilter, struct GameListStats * stats, BOOL byPos, BOOL narrow )\r
{\r
ListGame * lg = (ListGame *) gameList.head;\r
int nItem;\r
int count = 0;\r
struct GameListStats dummy;\r
\r
+ if(!hDlg) hDlg = gameListDialog; // [HGM] to allow calling from Game List Options dialog\r
+ if(!hDlg) return 0;\r
+\r
/* Initialize stats (use a dummy variable if caller not interested in them) */\r
if( stats == NULL ) {\r
stats = &dummy;\r
\r
if(nItem % 2000 == 0) {\r
snprintf(buf, MSG_SIZ, _("Scanning through games (%d)"), nItem);\r
- SetWindowText(hwndMain, buf);\r
+ SetWindowText(hwndMain, buf); DoEvents();\r
}\r
\r
if(!narrow || lg->position >= 0) {\r
VOID GameListHighlight(int index)\r
{\r
char buf[MSG_SIZ];\r
- int i, res = 0;\r
+ int i, j, k, n, res = 0;\r
if (gameListDialog == NULL) return;\r
- for(i=0; res != LB_ERR; i++) {\r
+ for(i=64; ; i+=i) {\r
res = SendDlgItemMessage( gameListDialog, OPT_GameListText, LB_GETTEXT, i, (LPARAM)buf );\r
- if(index <= atoi( buf )) break;\r
+ if(res == LB_ERR || index < atoi( buf )) break;\r
+ }\r
+ j = i/2;\r
+ while(i-j > 1) {\r
+ n = (i + j) >> 1;\r
+ res = SendDlgItemMessage( gameListDialog, OPT_GameListText, LB_GETTEXT, n, (LPARAM)buf );\r
+ if(res == LB_ERR || index < (k = atoi( buf ))) i = n; else {\r
+ j = n;\r
+ if(index == k) break;\r
+ }\r
}\r
- SendDlgItemMessage(gameListDialog, OPT_GameListText,\r
- LB_SETCURSEL, i, 0);\r
+ SendDlgItemMessage(gameListDialog, OPT_GameListText, LB_SETCURSEL, j, 0);\r
}\r
\r
\r