Hi, I guess this list has been abandoned (no activity since the last
release at all), still wanted to share my patch that

1. Further fixes bitblt race for 8bpp graphics on Windows during
window init phase (first repaint event sent/processed
too fast), locking the DC (and leaving the window white, not always
but intermittently across multiple app starts);

2. Fixes LIBBCC.H decls for C++ (posted earlier);

3. Replaces an outdated header <values.h> in speedtst.c;

4. Adds processing of Shift-Tab on Windows, a very popular choice of a
key for moving backwards on controls
(lbgrx provided it undistinguishable from a regular Tab as returned by
GrKeyRead());

5. And finally, removes optimization (-O2) in debug builds (which
otherwise clobbers the source code
line sequencing and makes it very difficult to use in a debugger).

Hope this helps,
AL

1. is also useful for > 8 bpp graphics

added a small makefile.w32 bug cleanup

ML

*** include/libbcc.h.orig	Thu Mar  8 22:21:40 2007
--- include/libbcc.h	Wed Oct 24 07:35:15 2012
*************** void __gr_set_BGI_mode_whc(int *gd, int
*** 494,503 ****
  int  __gr_get_BGI_mode_pages(void);
  void __gr_set_BGI_mode_pages(int p);
  
- #ifdef __cplusplus
- }
- #endif
- 
  /* ----------------------------------------------------------------- */
  /* ---           API functions with macro equivalents            --- */
  /* ---                      (for inlining)                       --- */
--- 494,499 ----
*************** int getactivepage(void);
*** 551,556 ****
--- 547,556 ----
  void setvisualpage(int p);
  int getvisualpage(void);
  
+ #ifdef __cplusplus
+ }
+ #endif
+ 
  /* ----------------------------------------------------------------- */
  #define restorecrtmode() __gr_restorecrtmode()
  #define getgraphmode() (__gr_INIT ? __gr_Mode : (__gr_Result=grNoInitGraph))
*** makedefs.grx.orig	Tue Jul 10 20:21:50 2012
--- makedefs.grx	Wed Oct 24 07:35:19 2012
*************** WIN32_GCC_i386_STATIC = $(SYSTEM_TAG_PRE
*** 70,76 ****
  ANY_GCC_SDL_STATIC    = $(SYSTEM_TAG_PREFIX).008
  
  ifdef   DEBUG
! CCOPT = -O2 -fno-strict-aliasing -Wall -g -DDEBUG=$(DEBUG)
  LDOPT = -g
  else
  CCOPT = -O2 -fno-strict-aliasing -Wall
--- 70,76 ----
  ANY_GCC_SDL_STATIC    = $(SYSTEM_TAG_PREFIX).008
  
  ifdef   DEBUG
! CCOPT = -fno-strict-aliasing -Wall -g -DDEBUG=$(DEBUG)
  LDOPT = -g
  else
  CCOPT = -O2 -fno-strict-aliasing -Wall
*** src/mouse/w32inp.c.orig	Sat Jul  7 14:29:18 2012
--- src/mouse/w32inp.c	Wed Oct 24 07:35:21 2012
*************** static GrKeyType StdKeyTranslate(int win
*** 225,230 ****
--- 225,231 ----
  
  static int DequeueW32Event(GrMouseEvent * ev)
  {
+     static int kbd_lastkey = 0;
      W32Event evaux;
      int key;
      int buttons;
*************** static int DequeueW32Event(GrMouseEvent
*** 247,258 ****
      switch (evaux.uMsg) {
  
      case WM_CHAR:
          fill_keybd_ev((*ev), evaux.wParam, evaux.kbstat);
          kbd_lastmod = evaux.kbstat;
          return 1;
  
      case WM_SYSCHAR:
! 	key = 0;
  	if (evaux.wParam >= 'a' && evaux.wParam <= 'z')
  	    key = altletters[evaux.wParam - 'a'];
  	if (evaux.wParam >= 'A' && evaux.wParam <= 'Z')
--- 248,263 ----
      switch (evaux.uMsg) {
  
      case WM_CHAR:
+         key = kbd_lastkey;
+         kbd_lastkey = 0;
+         if (evaux.wParam == GrKey_Tab && key == GrKey_BackTab)
+             return -1;
          fill_keybd_ev((*ev), evaux.wParam, evaux.kbstat);
          kbd_lastmod = evaux.kbstat;
          return 1;
  
      case WM_SYSCHAR:
! 	kbd_lastkey = key = 0;
  	if (evaux.wParam >= 'a' && evaux.wParam <= 'z')
  	    key = altletters[evaux.wParam - 'a'];
  	if (evaux.wParam >= 'A' && evaux.wParam <= 'Z')
*************** static int DequeueW32Event(GrMouseEvent
*** 267,273 ****
  
      case WM_KEYDOWN:
      case WM_SYSKEYDOWN:
! 	key = StdKeyTranslate(evaux.wParam, evaux.kbstat);
  	if (key == 0)
  	    return -1;
  	fill_keybd_ev((*ev), key, evaux.kbstat);
--- 272,278 ----
  
      case WM_KEYDOWN:
      case WM_SYSKEYDOWN:
! 	kbd_lastkey = key = StdKeyTranslate(evaux.wParam, evaux.kbstat);
  	if (key == 0)
  	    return -1;
  	fill_keybd_ev((*ev), key, evaux.kbstat);
*** src/mouse/w32input.h.orig	Mon Feb  4 23:38:30 2002
--- src/mouse/w32input.h	Wed Oct 24 07:35:23 2012
*************** typedef struct {
*** 24,30 ****
      GrKeyType grkey;
  } keytrans;
  
! #define NSTDKEYS 22
  
  static keytrans stdkeys[NSTDKEYS] = {
      {VK_PRIOR, GrKey_PageUp},
--- 24,30 ----
      GrKeyType grkey;
  } keytrans;
  
! #define NSTDKEYS 23
  
  static keytrans stdkeys[NSTDKEYS] = {
      {VK_PRIOR, GrKey_PageUp},
*************** static keytrans stdkeys[NSTDKEYS] = {
*** 37,42 ****
--- 37,43 ----
      {VK_DOWN, GrKey_Down},
      {VK_INSERT, GrKey_Insert},
      {VK_DELETE, GrKey_Delete},
+     {VK_TAB, 0},
      {VK_F1, GrKey_F1},
      {VK_F2, GrKey_F2},
      {VK_F3, GrKey_F3},
*************** static keytrans altstdkeys[NSTDKEYS] = {
*** 62,67 ****
--- 63,69 ----
      {VK_DOWN, GrKey_Alt_Down},
      {VK_INSERT, GrKey_Alt_Insert},
      {VK_DELETE, GrKey_Alt_Delete},
+     {VK_TAB, 0},
      {VK_F1, GrKey_Alt_F1},
      {VK_F2, GrKey_Alt_F2},
      {VK_F3, GrKey_Alt_F3},
*************** static keytrans controlstdkeys[NSTDKEYS]
*** 87,92 ****
--- 89,95 ----
      {VK_DOWN, GrKey_Control_Down},
      {VK_INSERT, GrKey_Control_Insert},
      {VK_DELETE, GrKey_Control_Delete},
+     {VK_TAB, 0},
      {VK_F1, GrKey_Control_F1},
      {VK_F2, GrKey_Control_F2},
      {VK_F3, GrKey_Control_F3},
*************** static keytrans shiftstdkeys[NSTDKEYS] =
*** 112,117 ****
--- 115,121 ----
      {VK_DOWN, GrKey_Shift_Down},
      {VK_INSERT, GrKey_Shift_Insert},
      {VK_DELETE, 0},
+     {VK_TAB, GrKey_BackTab},
      {VK_F1, GrKey_Shift_F1},
      {VK_F2, GrKey_Shift_F2},
      {VK_F3, GrKey_Shift_F3},
*** src/vdrivers/vd_win32.c.orig	Sat Jul  7 14:29:18 2012
--- src/vdrivers/vd_win32.c	Wed Oct 24 07:35:25 2012
*************** static int setmode(GrVideoMode * mp, int
*** 220,226 ****
  	SetWindowPos(hGRXWnd, NULL,
  		     Rect.left, Rect.top,
  		     maxWindowWidth, maxWindowHeight,
! 		     SWP_DRAWFRAME | SWP_NOZORDER | SWP_SHOWWINDOW);
  
          if (hBmpDIB != NULL) {
              DeleteObject(hBmpDIB);
--- 220,226 ----
  	SetWindowPos(hGRXWnd, NULL,
  		     Rect.left, Rect.top,
  		     maxWindowWidth, maxWindowHeight,
! 		     SWP_DEFERERASE | SWP_DRAWFRAME | SWP_NOZORDER | SWP_SHOWWINDOW);
  
          if (hBmpDIB != NULL) {
              DeleteObject(hBmpDIB);
*** test/speedtst.c.orig	Sat Jul  7 14:21:56 2012
--- test/speedtst.c	Wed Oct 24 07:35:28 2012
***************
*** 29,35 ****
  /*#include <wcdefs.h>*/
  #include <conio.h>
  #else
! #include <values.h>
  #endif
  #include <math.h>
  #include "rand.h"
--- 29,35 ----
  /*#include <wcdefs.h>*/
  #include <conio.h>
  #else
! #include <limits.h>
  #endif
  #include <math.h>
  #include "rand.h"
*** src/makefile.w32.orig	Sat Jul  7 14:33:22 2012
--- src/makefile.w32	Thu Oct 25 08:09:43 2012
*************** endif
*** 131,137 ****
  
  cleanall: clean
  ifeq ($(HAVE_UNIX_TOOLS),y)
! 	rm -f $(GRX20STdos) ../bin/*.exe
  else
  	if exist $(GRX20STdos) del $(GRX20STdos)
  	if exist ..\bin\*.exe del ..\bin\*.exe
--- 131,137 ----
  
  cleanall: clean
  ifeq ($(HAVE_UNIX_TOOLS),y)
! 	rm -f $(GRX20ST) ../bin/*.exe
  else
  	if exist $(GRX20STdos) del $(GRX20STdos)
  	if exist ..\bin\*.exe del ..\bin\*.exe
