diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 4b32001490..b03deead82 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,47 @@ 2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2008-10-21 22:18 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbapigt.h + * harbour/source/rtl/console.c + * harbour/source/rtl/filesys.c + * use HB_STD{IN,OUT,ERR}_HANDLE macros instead of hard coded values + + * harbour/include/hbgtcore.h + * harbour/source/rtl/hbgtcore.c + * harbour/source/rtl/gtapi.c + + added optional support for dynamic supertables + + added reference counter to HB_GT_BASE structure + - removed hb_gtUnLoad() function + + added hb_gtAlloc(), hb_gtRelease(), hb_gtAttach() + + added hb_gtRealod() function which unloads current GT driver + and loads given new one + + added .prg function HB_GTRELOAD( ) -> + This function allow to switch active GT driver at run time. + It can be also used to simulate removed HB_NOSTARTUPWINDOW() + functionality. F.e.: + + REQUEST HB_GT_WVT + REQUEST HB_GT_NUL_DEFAULT + proc main() + // do some initializations... + hb_gtReload( "WVT" ) + // rest of code... + return + + Please remember that some GTs may refuse initialization due to + missing required resources and instead of return FALSE they can + interrupt program with internal error, just like at application + startup so it's not guarantied that this function always returns. + + * harbour/contrib/hbct/ctwin.c + * updated for new GT API + + added support for dynamic supertable to allow using CTWIN in the + same time with different GTs. + + * harbour/contrib/xhb/hbcompat.h + - removed hb_retclenAdoptRaw translation + 2008-10-21 14:58 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * source/rtl/box.c ! Fixed GPF in hb_dispBox() when box drawing chars diff --git a/harbour/contrib/hbct/ctwin.c b/harbour/contrib/hbct/ctwin.c index 6896209924..4ca5b157aa 100644 --- a/harbour/contrib/hbct/ctwin.c +++ b/harbour/contrib/hbct/ctwin.c @@ -62,11 +62,11 @@ #include "ctwin.h" static int s_GtId; -static HB_GT_FUNCS SuperTable; -#define HB_GTSUPER (&SuperTable) -#define HB_GTID_PTR (&s_GtId) +#undef HB_GTSUPERTABLE +#define HB_GTSUPERTABLE(g) ( &( HB_GTCTW_GET( g )->SuperTable ) ) +#define HB_GTID_PTR (&s_GtId) -#define HB_GTCTW_GET(p) ( ( PHB_GTCTW ) HB_GTLOCAL( p ) ) +#define HB_GTCTW_GET(p) ( ( PHB_GTCTW ) HB_GTLOCAL( p ) ) #define HB_CTWIN_ALLOC 16 #define HB_CTWIN_MINROWS 1 @@ -108,6 +108,7 @@ typedef struct typedef struct { PHB_GT pGT; + HB_GT_FUNCS SuperTable; int iShadowWidth; int iShadowAttr; @@ -798,28 +799,23 @@ static int hb_ctw_AddWindowBox( PHB_GTCTW pCTW, int iWindow, BYTE * szBox, int i /* ********************************************************************** */ -static void hb_ctw_Init( PHB_GT pGT ) +static void hb_ctw_Init( PHB_GTCTW pCTW ) { - PHB_GTCTW pCTW; int iRow, iCol; - HB_TRACE(HB_TR_DEBUG, ("hb_ctw_Init(%p)",pGT)); + HB_TRACE(HB_TR_DEBUG, ("hb_ctw_Init(%p)",pCTW)); - pCTW = ( PHB_GTCTW ) hb_xgrab( sizeof( HB_GTCTW ) ); - memset( pCTW, 0, sizeof( HB_GTCTW ) ); - HB_GTLOCAL( pGT ) = pCTW; - pCTW->pGT = pGT; pCTW->iShadowWidth = 2; pCTW->iShadowAttr = -1; pCTW->iMoveMode = 1; pCTW->iVerticalStep = 2; pCTW->iHorizontalStep = 5; - HB_GTSUPER_GETSIZE( pGT, &pCTW->iMapHeight, &pCTW->iMapWidth ); + HB_GTSUPER_GETSIZE( pCTW->pGT, &pCTW->iMapHeight, &pCTW->iMapWidth ); /* update cursor position to the rules used by CTWIN */ - HB_GTSELF_GETPOS( pGT, &iRow, &iCol ); - HB_GTSELF_SETPOS( pGT, iRow, iCol ); + HB_GTSELF_GETPOS( pCTW->pGT, &iRow, &iCol ); + HB_GTSELF_SETPOS( pCTW->pGT, iRow, iCol ); } /* ********************************************************************** */ @@ -828,17 +824,29 @@ static PHB_GTCTW hb_ctw_base( void ) { PHB_GT pGT; - HB_TRACE(HB_TR_DEBUG, ("hb_ctw_base(%p)")); + HB_TRACE(HB_TR_DEBUG, ("hb_ctw_base()")); pGT = hb_gt_Base(); if( pGT ) { - if( *HB_GTID_PTR != 0 || hb_gtLoad( HB_GT_DRVNAME( HB_GT_NAME ), NULL ) ) + if( HB_GTCTW_GET( pGT ) ) + return HB_GTCTW_GET( pGT ); + else { - if( ! HB_GTCTW_GET( pGT ) ) - hb_ctw_Init( pGT ); - if( HB_GTCTW_GET( pGT ) ) - return HB_GTCTW_GET( pGT ); + PHB_GTCTW pCTW = ( PHB_GTCTW ) hb_xgrab( sizeof( HB_GTCTW ) ); + + memset( pCTW, 0, sizeof( HB_GTCTW ) ); + HB_GTLOCAL( pGT ) = pCTW; + pCTW->pGT = pGT; + + if( hb_gtLoad( HB_GT_DRVNAME( HB_GT_NAME ), pGT, HB_GTSUPERTABLE( pGT ) ) ) + { + hb_ctw_Init( pCTW ); + return pCTW; + } + + HB_GTLOCAL( pGT ) = NULL; + hb_xfree( pCTW ); } hb_gt_BaseFree( pGT ); } @@ -846,14 +854,6 @@ static PHB_GTCTW hb_ctw_base( void ) return NULL; } -static void hb_ctw_gt_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) -{ - HB_TRACE(HB_TR_DEBUG, ("hb_ctw_gt_Init(%p,%p,%p,%p)", pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr)); - - HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); - hb_ctw_Init( pGT ); -} - static void hb_ctw_gt_Exit( PHB_GT pGT ) { PHB_GTCTW pCTW; @@ -1981,7 +1981,6 @@ static BOOL hb_gt_FuncInit( PHB_GT_FUNCS pFuncTable ) { HB_TRACE(HB_TR_DEBUG, ("hb_gt_FuncInit(%p)", pFuncTable)); - pFuncTable->Init = hb_ctw_gt_Init; pFuncTable->Exit = hb_ctw_gt_Exit; pFuncTable->MouseRow = hb_ctw_MouseRow; pFuncTable->MouseCol = hb_ctw_MouseCol; @@ -2013,7 +2012,7 @@ static BOOL hb_gt_FuncInit( PHB_GT_FUNCS pFuncTable ) static const HB_GT_INIT gtInit = { HB_GT_DRVNAME( HB_GT_NAME ), hb_gt_FuncInit, - HB_GTSUPER, + NULL, HB_GTID_PTR }; HB_GT_ANNOUNCE( HB_GT_NAME ) diff --git a/harbour/contrib/xhb/hbcompat.h b/harbour/contrib/xhb/hbcompat.h index e0c2530e51..ec61b96be5 100644 --- a/harbour/contrib/xhb/hbcompat.h +++ b/harbour/contrib/xhb/hbcompat.h @@ -63,14 +63,13 @@ #define hb_retc_buffer( szText ) hb_retcAdopt( (szText) ) #define hb_retclen_buffer( szText, ulLen ) hb_retclenAdopt( (szText), (ulLen) ) #define hb_retc_const( szText ) hb_retcStatic( (szText) ) - #define hb_storclen_buffer hb_storclenAdopt + #define hb_storclen_buffer hb_storclenAdopt #define hb_itemPutCLConst hb_itemPutCRawStatic #else #define hb_retcAdopt( szText ) hb_retc_buffer( (szText) ) #define hb_retclenAdopt( szText, ulLen ) hb_retclen_buffer( (szText), (ulLen) ) - #define hb_retclenAdoptRaw( szText, ulLen ) hb_retclen_buffer( (szText), (ulLen) ) #define hb_retcStatic( szText ) hb_retc_const( (szText) ) #define hb_storclenAdopt hb_storclen_buffer #define hb_itemPutCRawStatic hb_itemPutCLConst diff --git a/harbour/include/hbapigt.h b/harbour/include/hbapigt.h index d02ba4fe1f..10e3332f3d 100644 --- a/harbour/include/hbapigt.h +++ b/harbour/include/hbapigt.h @@ -129,6 +129,18 @@ HB_EXTERN_BEGIN #endif +/* standard input/output handles + * when HB_WIN32_IO is set file handles with numbers 0, 1, 2 are + * transalted inside filesys to + * GetStdHandle( STD_INPUT_HANDLE ) + * GetStdHandle( STD_OUTPUT_HANDLE ) + * GetStdHandle( STD_ERROR_HANDLE ) + */ +#define HB_STDIN_HANDLE 0 +#define HB_STDOUT_HANDLE 1 +#define HB_STDERR_HANDLE 2 + + /* structure used to pass/receive parameters in hb_gtInfo() */ typedef struct diff --git a/harbour/include/hbgtcore.h b/harbour/include/hbgtcore.h index 62fa153bf5..cad1c6fed7 100644 --- a/harbour/include/hbgtcore.h +++ b/harbour/include/hbgtcore.h @@ -296,6 +296,7 @@ typedef struct _HB_GT_BASE PHB_GT_FUNCS pFuncTable; PHB_ITEM pMutex; + int iUsed; int iRow; /* cursor row position */ int iCol; /* cursor column position */ @@ -479,129 +480,138 @@ extern void hb_gt_BaseFree( PHB_GT pGT ); #define HB_GTSELF_GFXTEXT(g,t,l,s,c,h,w) (g)->pFuncTable->GfxText(g,t,l,s,c,h,w) #define HB_GTSELF_WHOCARES(g,p) (g)->pFuncTable->WhoCares(g,p) -#define HB_GTSUPER_LOCK(g) (HB_GTSUPER)->Lock(g) -#define HB_GTSUPER_UNLOCK(g) (HB_GTSUPER)->Unlock(g) -#define HB_GTSUPER_INIT(g,i,o,e) (HB_GTSUPER)->Init(g,i,o,e) -#define HB_GTSUPER_EXIT(g) (HB_GTSUPER)->Exit(g) -#define HB_GTSUPER_NEW(g) (HB_GTSUPER)->New(g) -#define HB_GTSUPER_FREE(g) (HB_GTSUPER)->Free(g) -#define HB_GTSUPER_RESIZE(g,r,c) (HB_GTSUPER)->Resize(g,r,c) -#define HB_GTSUPER_SETMODE(g,r,c) (HB_GTSUPER)->SetMode(g,r,c) -#define HB_GTSUPER_GETSIZE(g,pr,pc) (HB_GTSUPER)->GetSize(g,pr,pc) -#define HB_GTSUPER_SEMICOLD(g) (HB_GTSUPER)->SemiCold(g) -#define HB_GTSUPER_COLDAREA(g,t,l,b,r) (HB_GTSUPER)->ColdArea(g,t,l,b,r) -#define HB_GTSUPER_EXPOSEAREA(g,t,l,b,r) (HB_GTSUPER)->ExposeArea(g,t,l,b,r) -#define HB_GTSUPER_SCROLLAREA(g,t,l,b,r,m,u,v,h) (HB_GTSUPER)->ScrollArea(g,t,l,b,r,m,u,v,h) -#define HB_GTSUPER_TOUCHCELL(g,r,c) (HB_GTSUPER)->TouchCell(g,r,c) -#define HB_GTSUPER_REDRAW(g,r,c,l) (HB_GTSUPER)->Redraw(g,r,c,l) -#define HB_GTSUPER_REFRESH(g) (HB_GTSUPER)->Refresh(g) -#define HB_GTSUPER_FLUSH(g) (HB_GTSUPER)->Flush(g) -#define HB_GTSUPER_MAXCOL(g) (HB_GTSUPER)->MaxCol(g) -#define HB_GTSUPER_MAXROW(g) (HB_GTSUPER)->MaxRow(g) -#define HB_GTSUPER_CHECKPOS(g,r,c,l) (HB_GTSUPER)->CheckPos(g,r,c,l) -#define HB_GTSUPER_SETPOS(g,r,c) (HB_GTSUPER)->SetPos(g,r,c) -#define HB_GTSUPER_GETPOS(g,pr,pc) (HB_GTSUPER)->GetPos(g,pr,pc) -#define HB_GTSUPER_ISCOLOR(g) (HB_GTSUPER)->IsColor(g) -#define HB_GTSUPER_GETCOLORSTR(g,s) (HB_GTSUPER)->GetColorStr(g,s) -#define HB_GTSUPER_SETCOLORSTR(g,s) (HB_GTSUPER)->SetColorStr(g,s) -#define HB_GTSUPER_COLORSELECT(g,c) (HB_GTSUPER)->ColorSelect(g,c) -#define HB_GTSUPER_GETCOLOR(g) (HB_GTSUPER)->GetColor(g) -#define HB_GTSUPER_COLORNUM(g,s) (HB_GTSUPER)->ColorNum(g,s) -#define HB_GTSUPER_COLORSTOSTRING(g,pc,i,ps,n) (HB_GTSUPER)->ColorsToString(g,pc,i,ps,n) -#define HB_GTSUPER_STRINGTOCOLORS(g,ps,pc,pi) (HB_GTSUPER)->StringToColors(g,ps,pc,pi) -#define HB_GTSUPER_GETCOLORDATA(g,pc,pn,pi) (HB_GTSUPER)->GetColorData(g,pc,pn,pi) -#define HB_GTSUPER_GETCLEARCOLOR(g) (HB_GTSUPER)->GetClearColor(g) -#define HB_GTSUPER_SETCLEARCOLOR(g,c) (HB_GTSUPER)->SetClearColor(g,c) -#define HB_GTSUPER_GETCLEARCHAR(g) (HB_GTSUPER)->GetClearChar(g) -#define HB_GTSUPER_SETCLEARCHAR(g,c) (HB_GTSUPER)->SetClearChar(g,c) -#define HB_GTSUPER_GETCURSORSTYLE(g) (HB_GTSUPER)->GetCursorStyle(g) -#define HB_GTSUPER_SETCURSORSTYLE(g,s) (HB_GTSUPER)->SetCursorStyle(g,s) -#define HB_GTSUPER_GETSCRCURSOR(g,pr,pc,ps) (HB_GTSUPER)->GetScrCursor(g,pr,pc,ps) -#define HB_GTSUPER_GETSCRCHAR(g,r,c,pm,pa,pc) (HB_GTSUPER)->GetScrChar(g,r,c,pm,pa,pc) -#define HB_GTSUPER_PUTSCRCHAR(g,r,c,m,a,u) (HB_GTSUPER)->PutScrChar(g,r,c,m,a,u) -#define HB_GTSUPER_DISPBEGIN(g) (HB_GTSUPER)->DispBegin(g) -#define HB_GTSUPER_DISPEND(g) (HB_GTSUPER)->DispEnd(g) -#define HB_GTSUPER_DISPCOUNT(g) (HB_GTSUPER)->DispCount(g) -#define HB_GTSUPER_GETCHAR(g,r,c,pm,pa,pc) (HB_GTSUPER)->GetChar(g,r,c,pm,pa,pc) -#define HB_GTSUPER_PUTCHAR(g,r,c,m,a,u) (HB_GTSUPER)->PutChar(g,r,c,m,a,u) -#define HB_GTSUPER_RECTSIZE(g,t,l,b,r) (HB_GTSUPER)->RectSize(g,t,l,b,r) -#define HB_GTSUPER_SAVE(g,t,l,b,r,p) (HB_GTSUPER)->Save(g,t,l,b,r,p) -#define HB_GTSUPER_REST(g,t,l,b,r,p) (HB_GTSUPER)->Rest(g,t,l,b,r,p) -#define HB_GTSUPER_PUTTEXT(g,r,c,m,s,l) (HB_GTSUPER)->PutText(g,r,c,m,s,l) -#define HB_GTSUPER_REPLICATE(g,r,c,m,a,u,l) (HB_GTSUPER)->Replicate(g,r,c,m,a,u,l) -#define HB_GTSUPER_WRITEAT(g,r,c,s,l) (HB_GTSUPER)->WriteAt(g,r,c,s,l) -#define HB_GTSUPER_WRITE(g,s,l) (HB_GTSUPER)->Write(g,s,l) -#define HB_GTSUPER_WRITECON(g,s,l) (HB_GTSUPER)->WriteCon(g,s,l) -#define HB_GTSUPER_SETATTRIBUTE(g,t,l,b,r,m) (HB_GTSUPER)->SetAttribute(g,t,l,b,r,m) -#define HB_GTSUPER_DRAWSHADOW(g,t,l,b,r,m) (HB_GTSUPER)->DrawShadow(g,t,l,b,r,m) -#define HB_GTSUPER_SCROLL(g,t,l,b,r,m,u,v,h) (HB_GTSUPER)->Scroll(g,t,l,b,r,m,u,v,h) -#define HB_GTSUPER_SCROLLUP(g,r,m,u) (HB_GTSUPER)->ScrollUp(g,r,m,u) -#define HB_GTSUPER_BOX(g,t,l,b,r,f,m) (HB_GTSUPER)->Box(g,t,l,b,r,f,m) -#define HB_GTSUPER_BOXD(g,t,l,b,r,f,m) (HB_GTSUPER)->BoxD(g,t,l,b,r,f,m) -#define HB_GTSUPER_BOXS(g,t,l,b,r,f,m) (HB_GTSUPER)->BoxS(g,t,l,b,r,f,m) -#define HB_GTSUPER_HORIZLINE(g,h,l,r,u,m) (HB_GTSUPER)->HorizLine(g,h,l,r,u,m) -#define HB_GTSUPER_VERTLINE(g,c,t,b,u,m) (HB_GTSUPER)->VertLine(g,c,t,b,u,m) -#define HB_GTSUPER_GETBLINK(g) (HB_GTSUPER)->GetBlink(g) -#define HB_GTSUPER_SETBLINK(g,b) (HB_GTSUPER)->SetBlink(g,b) -#define HB_GTSUPER_SETSNOWFLAG(g,b) (HB_GTSUPER)->SetSnowFlag(g,b) -#define HB_GTSUPER_VERSION(g,i) (HB_GTSUPER)->Version(g,i) -#define HB_GTSUPER_SUSPEND(g) (HB_GTSUPER)->Suspend(g) -#define HB_GTSUPER_RESUME(g) (HB_GTSUPER)->Resume(g) -#define HB_GTSUPER_PREEXT(g) (HB_GTSUPER)->PreExt(g) -#define HB_GTSUPER_POSTEXT(g) (HB_GTSUPER)->PostExt(g) -#define HB_GTSUPER_OUTSTD(g,s,l) (HB_GTSUPER)->OutStd(g,s,l) -#define HB_GTSUPER_OUTERR(g,s,l) (HB_GTSUPER)->OutErr(g,s,l) -#define HB_GTSUPER_TONE(g,f,d) (HB_GTSUPER)->Tone(g,f,d) -#define HB_GTSUPER_BELL(g) (HB_GTSUPER)->Bell(g) -#define HB_GTSUPER_INFO(g,i,p) (HB_GTSUPER)->Info(g,i,p) -#define HB_GTSUPER_ALERT(g,m,o,n,h,d) (HB_GTSUPER)->Alert(g,m,o,n,h,d) -#define HB_GTSUPER_SETFLAG(g,i,f) (HB_GTSUPER)->SetFlag(g,i,f) -#define HB_GTSUPER_SETDISPCP(g,t,h,b) (HB_GTSUPER)->SetDispCP(g,t,h,b) -#define HB_GTSUPER_SETKEYCP(g,t,h) (HB_GTSUPER)->SetKeyCP(g,t,h) -#define HB_GTSUPER_READKEY(g,m) (HB_GTSUPER)->ReadKey(g,m) -#define HB_GTSUPER_INKEYGET(g,w,d,m) (HB_GTSUPER)->InkeyGet(g,w,d,m) -#define HB_GTSUPER_INKEYPUT(g,k) (HB_GTSUPER)->InkeyPut(g,k) -#define HB_GTSUPER_INKEYINS(g,k) (HB_GTSUPER)->InkeyIns(g,k) -#define HB_GTSUPER_INKEYLAST(g,m) (HB_GTSUPER)->InkeyLast(g,m) -#define HB_GTSUPER_INKEYNEXT(g,m) (HB_GTSUPER)->InkeyNext(g,m) -#define HB_GTSUPER_INKEYPOLL(g) (HB_GTSUPER)->InkeyPoll(g) -#define HB_GTSUPER_INKEYSETTEXT(g,s,l) (HB_GTSUPER)->InkeySetText(g,s,l) -#define HB_GTSUPER_INKEYSETLAST(g,k) (HB_GTSUPER)->InkeySetLast(g,k) -#define HB_GTSUPER_INKEYRESET(g) (HB_GTSUPER)->InkeyReset(g) -#define HB_GTSUPER_INKEYEXIT(g) (HB_GTSUPER)->InkeyExit(g) -#define HB_GTSUPER_MOUSEINIT(g) (HB_GTSUPER)->MouseInit(g) -#define HB_GTSUPER_MOUSEEXIT(g) (HB_GTSUPER)->MouseExit(g) -#define HB_GTSUPER_MOUSEISPRESENT(g) (HB_GTSUPER)->MouseIsPresent(g) -#define HB_GTSUPER_MOUSESHOW(g) (HB_GTSUPER)->MouseShow(g) -#define HB_GTSUPER_MOUSEHIDE(g) (HB_GTSUPER)->MouseHide(g) -#define HB_GTSUPER_MOUSEGETCURSOR(g) (HB_GTSUPER)->MouseGetCursor(g) -#define HB_GTSUPER_MOUSESETCURSOR(g,v) (HB_GTSUPER)->MouseSetCursor(g,v) -#define HB_GTSUPER_MOUSECOL(g) (HB_GTSUPER)->MouseCol(g) -#define HB_GTSUPER_MOUSEROW(g) (HB_GTSUPER)->MouseRow(g) -#define HB_GTSUPER_MOUSEGETPOS(g,pr,pc) (HB_GTSUPER)->MouseGetPos(g,pr,pc) -#define HB_GTSUPER_MOUSESETPOS(g,r,c) (HB_GTSUPER)->MouseSetPos(g,r,c) -#define HB_GTSUPER_MOUSESETBOUNDS(g,t,l,b,r) (HB_GTSUPER)->MouseSetBounds(g,t,l,b,r) -#define HB_GTSUPER_MOUSEGETBOUNDS(g,t,l,b,r) (HB_GTSUPER)->MouseGetBounds(g,t,l,b,r) -#define HB_GTSUPER_MOUSESTORAGESIZE(g) (HB_GTSUPER)->MouseStorageSize(g) -#define HB_GTSUPER_MOUSESAVESTATE(g,p) (HB_GTSUPER)->MouseSaveState(g,p) -#define HB_GTSUPER_MOUSERESTORESTATE(g,p) (HB_GTSUPER)->MouseRestoreState(g,p) -#define HB_GTSUPER_MOUSEGETDOUBLECLICKSPEED(g) (HB_GTSUPER)->MouseGetDoubleClickSpeed(g) -#define HB_GTSUPER_MOUSESETDOUBLECLICKSPEED(g,i) (HB_GTSUPER)->MouseSetDoubleClickSpeed(g,i) -#define HB_GTSUPER_MOUSECOUNTBUTTON(g) (HB_GTSUPER)->MouseCountButton(g) -#define HB_GTSUPER_MOUSEBUTTONSTATE(g,b) (HB_GTSUPER)->MouseButtonState(g,b) -#define HB_GTSUPER_MOUSEBUTTONPRESSED(g,b,r,c) (HB_GTSUPER)->MouseButtonPressed(g,b,r,c) -#define HB_GTSUPER_MOUSEBUTTONRELEASED(g,b,r,c) (HB_GTSUPER)->MouseButtonReleased(g,b,r,c) -#define HB_GTSUPER_MOUSEREADKEY(g,m) (HB_GTSUPER)->MouseReadKey(g,m) -#define HB_GTSUPER_GFXPRIMITIVE(g,i,t,l,b,r,c) (HB_GTSUPER)->GfxPrimitive(g,i,t,l,b,r,c) -#define HB_GTSUPER_GFXTEXT(g,t,l,s,c,h,w) (HB_GTSUPER)->GfxText(g,t,l,s,c,h,w) -#define HB_GTSUPER_WHOCARES(g,p) (HB_GTSUPER)->WhoCares(g,p) +#ifndef HB_GTSUPERTABLE +# define HB_GTSUPERTABLE(g) HB_GTSUPER +#endif -extern HB_EXPORT void hb_gtSetDefault( const char * szGtName ); -extern HB_EXPORT BOOL hb_gtRegister( const HB_GT_INIT * gtInit ); -extern HB_EXPORT BOOL hb_gtLoad( const char * szGtName, PHB_GT_FUNCS pFuncTable ); -extern HB_EXPORT BOOL hb_gtUnLoad( void ); -extern HB_EXPORT void hb_gtStartupInit( void ); +#define HB_GTSUPER_LOCK(g) (HB_GTSUPERTABLE(g))->Lock(g) +#define HB_GTSUPER_UNLOCK(g) (HB_GTSUPERTABLE(g))->Unlock(g) +#define HB_GTSUPER_INIT(g,i,o,e) (HB_GTSUPERTABLE(g))->Init(g,i,o,e) +#define HB_GTSUPER_EXIT(g) (HB_GTSUPERTABLE(g))->Exit(g) +#define HB_GTSUPER_NEW(g) (HB_GTSUPERTABLE(g))->New(g) +#define HB_GTSUPER_FREE(g) (HB_GTSUPERTABLE(g))->Free(g) +#define HB_GTSUPER_RESIZE(g,r,c) (HB_GTSUPERTABLE(g))->Resize(g,r,c) +#define HB_GTSUPER_SETMODE(g,r,c) (HB_GTSUPERTABLE(g))->SetMode(g,r,c) +#define HB_GTSUPER_GETSIZE(g,pr,pc) (HB_GTSUPERTABLE(g))->GetSize(g,pr,pc) +#define HB_GTSUPER_SEMICOLD(g) (HB_GTSUPERTABLE(g))->SemiCold(g) +#define HB_GTSUPER_COLDAREA(g,t,l,b,r) (HB_GTSUPERTABLE(g))->ColdArea(g,t,l,b,r) +#define HB_GTSUPER_EXPOSEAREA(g,t,l,b,r) (HB_GTSUPERTABLE(g))->ExposeArea(g,t,l,b,r) +#define HB_GTSUPER_SCROLLAREA(g,t,l,b,r,m,u,v,h) (HB_GTSUPERTABLE(g))->ScrollArea(g,t,l,b,r,m,u,v,h) +#define HB_GTSUPER_TOUCHCELL(g,r,c) (HB_GTSUPERTABLE(g))->TouchCell(g,r,c) +#define HB_GTSUPER_REDRAW(g,r,c,l) (HB_GTSUPERTABLE(g))->Redraw(g,r,c,l) +#define HB_GTSUPER_REFRESH(g) (HB_GTSUPERTABLE(g))->Refresh(g) +#define HB_GTSUPER_FLUSH(g) (HB_GTSUPERTABLE(g))->Flush(g) +#define HB_GTSUPER_MAXCOL(g) (HB_GTSUPERTABLE(g))->MaxCol(g) +#define HB_GTSUPER_MAXROW(g) (HB_GTSUPERTABLE(g))->MaxRow(g) +#define HB_GTSUPER_CHECKPOS(g,r,c,l) (HB_GTSUPERTABLE(g))->CheckPos(g,r,c,l) +#define HB_GTSUPER_SETPOS(g,r,c) (HB_GTSUPERTABLE(g))->SetPos(g,r,c) +#define HB_GTSUPER_GETPOS(g,pr,pc) (HB_GTSUPERTABLE(g))->GetPos(g,pr,pc) +#define HB_GTSUPER_ISCOLOR(g) (HB_GTSUPERTABLE(g))->IsColor(g) +#define HB_GTSUPER_GETCOLORSTR(g,s) (HB_GTSUPERTABLE(g))->GetColorStr(g,s) +#define HB_GTSUPER_SETCOLORSTR(g,s) (HB_GTSUPERTABLE(g))->SetColorStr(g,s) +#define HB_GTSUPER_COLORSELECT(g,c) (HB_GTSUPERTABLE(g))->ColorSelect(g,c) +#define HB_GTSUPER_GETCOLOR(g) (HB_GTSUPERTABLE(g))->GetColor(g) +#define HB_GTSUPER_COLORNUM(g,s) (HB_GTSUPERTABLE(g))->ColorNum(g,s) +#define HB_GTSUPER_COLORSTOSTRING(g,pc,i,ps,n) (HB_GTSUPERTABLE(g))->ColorsToString(g,pc,i,ps,n) +#define HB_GTSUPER_STRINGTOCOLORS(g,ps,pc,pi) (HB_GTSUPERTABLE(g))->StringToColors(g,ps,pc,pi) +#define HB_GTSUPER_GETCOLORDATA(g,pc,pn,pi) (HB_GTSUPERTABLE(g))->GetColorData(g,pc,pn,pi) +#define HB_GTSUPER_GETCLEARCOLOR(g) (HB_GTSUPERTABLE(g))->GetClearColor(g) +#define HB_GTSUPER_SETCLEARCOLOR(g,c) (HB_GTSUPERTABLE(g))->SetClearColor(g,c) +#define HB_GTSUPER_GETCLEARCHAR(g) (HB_GTSUPERTABLE(g))->GetClearChar(g) +#define HB_GTSUPER_SETCLEARCHAR(g,c) (HB_GTSUPERTABLE(g))->SetClearChar(g,c) +#define HB_GTSUPER_GETCURSORSTYLE(g) (HB_GTSUPERTABLE(g))->GetCursorStyle(g) +#define HB_GTSUPER_SETCURSORSTYLE(g,s) (HB_GTSUPERTABLE(g))->SetCursorStyle(g,s) +#define HB_GTSUPER_GETSCRCURSOR(g,pr,pc,ps) (HB_GTSUPERTABLE(g))->GetScrCursor(g,pr,pc,ps) +#define HB_GTSUPER_GETSCRCHAR(g,r,c,pm,pa,pc) (HB_GTSUPERTABLE(g))->GetScrChar(g,r,c,pm,pa,pc) +#define HB_GTSUPER_PUTSCRCHAR(g,r,c,m,a,u) (HB_GTSUPERTABLE(g))->PutScrChar(g,r,c,m,a,u) +#define HB_GTSUPER_DISPBEGIN(g) (HB_GTSUPERTABLE(g))->DispBegin(g) +#define HB_GTSUPER_DISPEND(g) (HB_GTSUPERTABLE(g))->DispEnd(g) +#define HB_GTSUPER_DISPCOUNT(g) (HB_GTSUPERTABLE(g))->DispCount(g) +#define HB_GTSUPER_GETCHAR(g,r,c,pm,pa,pc) (HB_GTSUPERTABLE(g))->GetChar(g,r,c,pm,pa,pc) +#define HB_GTSUPER_PUTCHAR(g,r,c,m,a,u) (HB_GTSUPERTABLE(g))->PutChar(g,r,c,m,a,u) +#define HB_GTSUPER_RECTSIZE(g,t,l,b,r) (HB_GTSUPERTABLE(g))->RectSize(g,t,l,b,r) +#define HB_GTSUPER_SAVE(g,t,l,b,r,p) (HB_GTSUPERTABLE(g))->Save(g,t,l,b,r,p) +#define HB_GTSUPER_REST(g,t,l,b,r,p) (HB_GTSUPERTABLE(g))->Rest(g,t,l,b,r,p) +#define HB_GTSUPER_PUTTEXT(g,r,c,m,s,l) (HB_GTSUPERTABLE(g))->PutText(g,r,c,m,s,l) +#define HB_GTSUPER_REPLICATE(g,r,c,m,a,u,l) (HB_GTSUPERTABLE(g))->Replicate(g,r,c,m,a,u,l) +#define HB_GTSUPER_WRITEAT(g,r,c,s,l) (HB_GTSUPERTABLE(g))->WriteAt(g,r,c,s,l) +#define HB_GTSUPER_WRITE(g,s,l) (HB_GTSUPERTABLE(g))->Write(g,s,l) +#define HB_GTSUPER_WRITECON(g,s,l) (HB_GTSUPERTABLE(g))->WriteCon(g,s,l) +#define HB_GTSUPER_SETATTRIBUTE(g,t,l,b,r,m) (HB_GTSUPERTABLE(g))->SetAttribute(g,t,l,b,r,m) +#define HB_GTSUPER_DRAWSHADOW(g,t,l,b,r,m) (HB_GTSUPERTABLE(g))->DrawShadow(g,t,l,b,r,m) +#define HB_GTSUPER_SCROLL(g,t,l,b,r,m,u,v,h) (HB_GTSUPERTABLE(g))->Scroll(g,t,l,b,r,m,u,v,h) +#define HB_GTSUPER_SCROLLUP(g,r,m,u) (HB_GTSUPERTABLE(g))->ScrollUp(g,r,m,u) +#define HB_GTSUPER_BOX(g,t,l,b,r,f,m) (HB_GTSUPERTABLE(g))->Box(g,t,l,b,r,f,m) +#define HB_GTSUPER_BOXD(g,t,l,b,r,f,m) (HB_GTSUPERTABLE(g))->BoxD(g,t,l,b,r,f,m) +#define HB_GTSUPER_BOXS(g,t,l,b,r,f,m) (HB_GTSUPERTABLE(g))->BoxS(g,t,l,b,r,f,m) +#define HB_GTSUPER_HORIZLINE(g,h,l,r,u,m) (HB_GTSUPERTABLE(g))->HorizLine(g,h,l,r,u,m) +#define HB_GTSUPER_VERTLINE(g,c,t,b,u,m) (HB_GTSUPERTABLE(g))->VertLine(g,c,t,b,u,m) +#define HB_GTSUPER_GETBLINK(g) (HB_GTSUPERTABLE(g))->GetBlink(g) +#define HB_GTSUPER_SETBLINK(g,b) (HB_GTSUPERTABLE(g))->SetBlink(g,b) +#define HB_GTSUPER_SETSNOWFLAG(g,b) (HB_GTSUPERTABLE(g))->SetSnowFlag(g,b) +#define HB_GTSUPER_VERSION(g,i) (HB_GTSUPERTABLE(g))->Version(g,i) +#define HB_GTSUPER_SUSPEND(g) (HB_GTSUPERTABLE(g))->Suspend(g) +#define HB_GTSUPER_RESUME(g) (HB_GTSUPERTABLE(g))->Resume(g) +#define HB_GTSUPER_PREEXT(g) (HB_GTSUPERTABLE(g))->PreExt(g) +#define HB_GTSUPER_POSTEXT(g) (HB_GTSUPERTABLE(g))->PostExt(g) +#define HB_GTSUPER_OUTSTD(g,s,l) (HB_GTSUPERTABLE(g))->OutStd(g,s,l) +#define HB_GTSUPER_OUTERR(g,s,l) (HB_GTSUPERTABLE(g))->OutErr(g,s,l) +#define HB_GTSUPER_TONE(g,f,d) (HB_GTSUPERTABLE(g))->Tone(g,f,d) +#define HB_GTSUPER_BELL(g) (HB_GTSUPERTABLE(g))->Bell(g) +#define HB_GTSUPER_INFO(g,i,p) (HB_GTSUPERTABLE(g))->Info(g,i,p) +#define HB_GTSUPER_ALERT(g,m,o,n,h,d) (HB_GTSUPERTABLE(g))->Alert(g,m,o,n,h,d) +#define HB_GTSUPER_SETFLAG(g,i,f) (HB_GTSUPERTABLE(g))->SetFlag(g,i,f) +#define HB_GTSUPER_SETDISPCP(g,t,h,b) (HB_GTSUPERTABLE(g))->SetDispCP(g,t,h,b) +#define HB_GTSUPER_SETKEYCP(g,t,h) (HB_GTSUPERTABLE(g))->SetKeyCP(g,t,h) +#define HB_GTSUPER_READKEY(g,m) (HB_GTSUPERTABLE(g))->ReadKey(g,m) +#define HB_GTSUPER_INKEYGET(g,w,d,m) (HB_GTSUPERTABLE(g))->InkeyGet(g,w,d,m) +#define HB_GTSUPER_INKEYPUT(g,k) (HB_GTSUPERTABLE(g))->InkeyPut(g,k) +#define HB_GTSUPER_INKEYINS(g,k) (HB_GTSUPERTABLE(g))->InkeyIns(g,k) +#define HB_GTSUPER_INKEYLAST(g,m) (HB_GTSUPERTABLE(g))->InkeyLast(g,m) +#define HB_GTSUPER_INKEYNEXT(g,m) (HB_GTSUPERTABLE(g))->InkeyNext(g,m) +#define HB_GTSUPER_INKEYPOLL(g) (HB_GTSUPERTABLE(g))->InkeyPoll(g) +#define HB_GTSUPER_INKEYSETTEXT(g,s,l) (HB_GTSUPERTABLE(g))->InkeySetText(g,s,l) +#define HB_GTSUPER_INKEYSETLAST(g,k) (HB_GTSUPERTABLE(g))->InkeySetLast(g,k) +#define HB_GTSUPER_INKEYRESET(g) (HB_GTSUPERTABLE(g))->InkeyReset(g) +#define HB_GTSUPER_INKEYEXIT(g) (HB_GTSUPERTABLE(g))->InkeyExit(g) +#define HB_GTSUPER_MOUSEINIT(g) (HB_GTSUPERTABLE(g))->MouseInit(g) +#define HB_GTSUPER_MOUSEEXIT(g) (HB_GTSUPERTABLE(g))->MouseExit(g) +#define HB_GTSUPER_MOUSEISPRESENT(g) (HB_GTSUPERTABLE(g))->MouseIsPresent(g) +#define HB_GTSUPER_MOUSESHOW(g) (HB_GTSUPERTABLE(g))->MouseShow(g) +#define HB_GTSUPER_MOUSEHIDE(g) (HB_GTSUPERTABLE(g))->MouseHide(g) +#define HB_GTSUPER_MOUSEGETCURSOR(g) (HB_GTSUPERTABLE(g))->MouseGetCursor(g) +#define HB_GTSUPER_MOUSESETCURSOR(g,v) (HB_GTSUPERTABLE(g))->MouseSetCursor(g,v) +#define HB_GTSUPER_MOUSECOL(g) (HB_GTSUPERTABLE(g))->MouseCol(g) +#define HB_GTSUPER_MOUSEROW(g) (HB_GTSUPERTABLE(g))->MouseRow(g) +#define HB_GTSUPER_MOUSEGETPOS(g,pr,pc) (HB_GTSUPERTABLE(g))->MouseGetPos(g,pr,pc) +#define HB_GTSUPER_MOUSESETPOS(g,r,c) (HB_GTSUPERTABLE(g))->MouseSetPos(g,r,c) +#define HB_GTSUPER_MOUSESETBOUNDS(g,t,l,b,r) (HB_GTSUPERTABLE(g))->MouseSetBounds(g,t,l,b,r) +#define HB_GTSUPER_MOUSEGETBOUNDS(g,t,l,b,r) (HB_GTSUPERTABLE(g))->MouseGetBounds(g,t,l,b,r) +#define HB_GTSUPER_MOUSESTORAGESIZE(g) (HB_GTSUPERTABLE(g))->MouseStorageSize(g) +#define HB_GTSUPER_MOUSESAVESTATE(g,p) (HB_GTSUPERTABLE(g))->MouseSaveState(g,p) +#define HB_GTSUPER_MOUSERESTORESTATE(g,p) (HB_GTSUPERTABLE(g))->MouseRestoreState(g,p) +#define HB_GTSUPER_MOUSEGETDOUBLECLICKSPEED(g) (HB_GTSUPERTABLE(g))->MouseGetDoubleClickSpeed(g) +#define HB_GTSUPER_MOUSESETDOUBLECLICKSPEED(g,i) (HB_GTSUPERTABLE(g))->MouseSetDoubleClickSpeed(g,i) +#define HB_GTSUPER_MOUSECOUNTBUTTON(g) (HB_GTSUPERTABLE(g))->MouseCountButton(g) +#define HB_GTSUPER_MOUSEBUTTONSTATE(g,b) (HB_GTSUPERTABLE(g))->MouseButtonState(g,b) +#define HB_GTSUPER_MOUSEBUTTONPRESSED(g,b,r,c) (HB_GTSUPERTABLE(g))->MouseButtonPressed(g,b,r,c) +#define HB_GTSUPER_MOUSEBUTTONRELEASED(g,b,r,c) (HB_GTSUPERTABLE(g))->MouseButtonReleased(g,b,r,c) +#define HB_GTSUPER_MOUSEREADKEY(g,m) (HB_GTSUPERTABLE(g))->MouseReadKey(g,m) +#define HB_GTSUPER_GFXPRIMITIVE(g,i,t,l,b,r,c) (HB_GTSUPERTABLE(g))->GfxPrimitive(g,i,t,l,b,r,c) +#define HB_GTSUPER_GFXTEXT(g,t,l,s,c,h,w) (HB_GTSUPERTABLE(g))->GfxText(g,t,l,s,c,h,w) +#define HB_GTSUPER_WHOCARES(g,p) (HB_GTSUPERTABLE(g))->WhoCares(g,p) +extern HB_EXPORT void hb_gtSetDefault( const char * szGtName ); +extern HB_EXPORT BOOL hb_gtRegister( const HB_GT_INIT * gtInit ); +extern HB_EXPORT PHB_GT hb_gtLoad( const char * szGtName, PHB_GT pGT, PHB_GT_FUNCS pSuperTable ); +extern HB_EXPORT void * hb_gtAlloc( void ); +extern HB_EXPORT void hb_gtRelease( void * hGT ); +extern HB_EXPORT void hb_gtAttach( void * hGT ); +extern HB_EXPORT void hb_gtStartupInit( void ); +extern HB_EXPORT BOOL hb_gtReload( const char * szGtName, + HB_FHANDLE hFilenoStdin, + HB_FHANDLE hFilenoStdout, + HB_FHANDLE hFilenoStderr ); /* low level GT functions common to different GTs supported by RTL */ extern int hb_gt_chrmapinit( int *piTransTbl, const char *pszTerm, BOOL fSetACSC ); diff --git a/harbour/source/rtl/console.c b/harbour/source/rtl/console.c index 6fd85305f2..5e608d4124 100644 --- a/harbour/source/rtl/console.c +++ b/harbour/source/rtl/console.c @@ -99,9 +99,9 @@ static const int s_iCrLfLen = 2; #endif -static HB_FHANDLE s_hFilenoStdin = ( HB_FHANDLE ) 0; -static HB_FHANDLE s_hFilenoStdout = ( HB_FHANDLE ) 1; -static HB_FHANDLE s_hFilenoStderr = ( HB_FHANDLE ) 2; +static HB_FHANDLE s_hFilenoStdin = ( HB_FHANDLE ) HB_STDIN_HANDLE; +static HB_FHANDLE s_hFilenoStdout = ( HB_FHANDLE ) HB_STDOUT_HANDLE; +static HB_FHANDLE s_hFilenoStderr = ( HB_FHANDLE ) HB_STDERR_HANDLE; typedef struct { diff --git a/harbour/source/rtl/filesys.c b/harbour/source/rtl/filesys.c index b83343bd87..e4b3ae61ff 100644 --- a/harbour/source/rtl/filesys.c +++ b/harbour/source/rtl/filesys.c @@ -310,13 +310,13 @@ static BOOL s_fUseWaitLocks = TRUE; static HANDLE DosToWinHandle( HB_FHANDLE fHandle ) { - if( fHandle == ( HB_FHANDLE ) 0 ) + if( fHandle == ( HB_FHANDLE ) HB_STDIN_HANDLE ) return GetStdHandle( STD_INPUT_HANDLE ); - else if( fHandle == ( HB_FHANDLE ) 1 ) + else if( fHandle == ( HB_FHANDLE ) HB_STDOUT_HANDLE ) return GetStdHandle( STD_OUTPUT_HANDLE ); - else if( fHandle == ( HB_FHANDLE ) 2 ) + else if( fHandle == ( HB_FHANDLE ) HB_STDERR_HANDLE ) return GetStdHandle( STD_ERROR_HANDLE ); else @@ -861,18 +861,20 @@ HB_EXPORT BOOL hb_fsSetDevMode( HB_FHANDLE hFileHandle, USHORT uiDevMode ) int iRet = 0; #if defined(HB_WIN32_IO) - if( hFileHandle > 2 ) + if( hFileHandle != ( HB_FHANDLE ) 0 && + hFileHandle != ( HB_FHANDLE ) 1 && + hFileHandle != ( HB_FHANDLE ) 2 ) iRet = -1; else #endif switch( uiDevMode ) { case FD_BINARY: - iRet = setmode( hFileHandle, O_BINARY ); + iRet = setmode( ( HB_NHANDLE ) hFileHandle, O_BINARY ); break; case FD_TEXT: - iRet = setmode( hFileHandle, O_TEXT ); + iRet = setmode( ( HB_NHANDLE ) hFileHandle, O_TEXT ); break; } @@ -886,7 +888,9 @@ HB_EXPORT BOOL hb_fsSetDevMode( HB_FHANDLE hFileHandle, USHORT uiDevMode ) int iRet = 0; #if defined(HB_WIN32_IO) - if( ( HB_NHANDLE ) hFileHandle > 2 ) + if( hFileHandle != ( HB_FHANDLE ) 0 && + hFileHandle != ( HB_FHANDLE ) 1 && + hFileHandle != ( HB_FHANDLE ) 2 ) iRet = -1; else #endif diff --git a/harbour/source/rtl/gtapi.c b/harbour/source/rtl/gtapi.c index bdf73227e6..928d491ac8 100644 --- a/harbour/source/rtl/gtapi.c +++ b/harbour/source/rtl/gtapi.c @@ -81,9 +81,6 @@ #include "hbgtcore.h" #include "hbset.h" -#define HB_STDOUT_HANDLE 1 -#define HB_STDERR_HANDLE 2 - /* gt API functions */ HB_EXPORT ERRCODE hb_gtInit( HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_FHANDLE hFilenoStderr ) @@ -109,26 +106,13 @@ HB_EXPORT ERRCODE hb_gtInit( HB_FHANDLE hFilenoStdin, HB_FHANDLE hFilenoStdout, HB_EXPORT ERRCODE hb_gtExit( void ) { - PHB_GT pGT; - HB_TRACE(HB_TR_DEBUG, ("hb_gtExit()")); - pGT = hb_gt_Base(); - if( pGT ) - { - while( HB_GTSELF_DISPCOUNT( pGT ) ) - HB_GTSELF_DISPEND( pGT ); - - HB_GTSELF_FLUSH( pGT ); - HB_GTSELF_EXIT( pGT ); - /* hb_gt_BaseFree( pGT ); */ - } + hb_gtRelease( NULL ); /* clear internal clipboard data */ hb_gt_setClipboard( NULL, 0 ); - hb_gtUnLoad(); - return SUCCESS; } diff --git a/harbour/source/rtl/hbgtcore.c b/harbour/source/rtl/hbgtcore.c index d5928501ed..103b03b51d 100644 --- a/harbour/source/rtl/hbgtcore.c +++ b/harbour/source/rtl/hbgtcore.c @@ -68,13 +68,6 @@ #include "hbvm.h" #include "hbthread.h" -/* these variables are used for stdout/stderr output when GT subsystem - * is not initialized - */ -static HB_FHANDLE s_hStdIn = ( HB_FHANDLE ) 0; -static HB_FHANDLE s_hStdOut = ( HB_FHANDLE ) 1; -static HB_FHANDLE s_hStdErr = ( HB_FHANDLE ) 2; - /* base GT strucure */ static PHB_GT_BASE s_curGT = NULL; @@ -107,9 +100,9 @@ static void hb_gt_def_BaseInit( PHB_GT_BASE pGT ) pGT->bClearColor = 0x07; pGT->iHeight = 24; pGT->iWidth = 80; - pGT->hStdIn = s_hStdIn; - pGT->hStdOut = s_hStdOut; - pGT->hStdErr = s_hStdErr; + pGT->hStdIn = HB_STDIN_HANDLE; + pGT->hStdOut = HB_STDOUT_HANDLE; + pGT->hStdErr = HB_STDERR_HANDLE; pGT->iDoubleClickSpeed = 168; /* In milliseconds */ @@ -175,6 +168,9 @@ static void hb_gt_def_Free( PHB_GT pGT ) if( pGT->pMutex ) hb_itemRelease( pGT->pMutex ); + if( pGT->pFuncTable ) + hb_xfree( pGT->pFuncTable ); + hb_xfree( pGT ); } @@ -3077,8 +3073,6 @@ static char s_gtNameBuf[ HB_GT_NAME_MAX_ + 1 ]; #endif static const HB_GT_INIT * s_gtInit[ HB_GT_MAX_ ]; -static int s_gtLinkOrder[ HB_GT_MAX_ ]; -static int s_iGtLinkCount = 0; static int s_iGtCount = 0; HB_FUNC_EXTERN( HB_GTSYS ); @@ -3125,15 +3119,17 @@ HB_EXPORT void hb_gtSetDefault( const char * szGtName ) HB_EXPORT BOOL hb_gtRegister( const HB_GT_INIT * gtInit ) { - if( hb_gt_FindEntry( gtInit->id ) == -1 ) + if( s_iGtCount < HB_GT_MAX_ && hb_gt_FindEntry( gtInit->id ) == -1 ) { + if( gtInit->pGtId ) + *gtInit->pGtId = s_iGtCount; s_gtInit[ s_iGtCount++ ] = gtInit; return TRUE; } return FALSE; } -HB_EXPORT BOOL hb_gtLoad( const char * szGtName, PHB_GT_FUNCS pFuncTable ) +HB_EXPORT PHB_GT hb_gtLoad( const char * szGtName, PHB_GT pGT, PHB_GT_FUNCS pSuperTable ) { int iPos; @@ -3141,87 +3137,142 @@ HB_EXPORT BOOL hb_gtLoad( const char * szGtName, PHB_GT_FUNCS pFuncTable ) { if( hb_stricmp( szGtName, "nul" ) == 0 || hb_stricmp( szGtName, "null" ) == 0 ) { - if( pFuncTable == NULL ) - pFuncTable = &s_gtCoreFunc; - if( !s_curGT ) - { - s_curGT = ( PHB_GT_BASE ) hb_xgrab( sizeof( HB_GT_BASE ) ); - memset( s_curGT, 0, sizeof( HB_GT_BASE ) ); - } - s_curGT->pFuncTable = pFuncTable; - return TRUE; + if( pGT || pSuperTable ) + hb_errInternal( 9998, "Screen driver initialization failure", NULL, NULL ); + + pGT = ( PHB_GT_BASE ) hb_xgrab( sizeof( HB_GT_BASE ) ); + memset( pGT, 0, sizeof( HB_GT_BASE ) ); + pGT->pFuncTable = ( PHB_GT_FUNCS ) hb_xgrab( sizeof( HB_GT_FUNCS ) ); + memcpy( pGT->pFuncTable, &s_gtCoreFunc, sizeof( HB_GT_FUNCS ) ); + pGT->iUsed++; + return pGT; } iPos = hb_gt_FindEntry( szGtName ); if( iPos != -1 ) { - if( pFuncTable == NULL ) - pFuncTable = &s_gtCoreFunc; - memcpy( s_gtInit[ iPos ]->pSuperTable, pFuncTable, sizeof( HB_GT_FUNCS ) ); - if( !s_gtInit[ iPos ]->init( pFuncTable ) ) - { - hb_errInternal( 6001, "Screen driver initialization failure", NULL, NULL ); - } - if( s_gtInit[ iPos ]->pGtId ) - *s_gtInit[ iPos ]->pGtId = s_iGtLinkCount; - s_gtLinkOrder[ s_iGtLinkCount++ ] = iPos; + BOOL fNew = pGT == NULL; - if( !s_curGT ) + if( fNew ) { - s_curGT = ( PHB_GT_BASE ) hb_xgrab( sizeof( HB_GT_BASE ) ); - memset( s_curGT, 0, sizeof( HB_GT_BASE ) ); + pGT = ( PHB_GT_BASE ) hb_xgrab( sizeof( HB_GT_BASE ) ); + memset( pGT, 0, sizeof( HB_GT_BASE ) ); + pGT->pFuncTable = ( PHB_GT_FUNCS ) hb_xgrab( sizeof( HB_GT_FUNCS ) ); + memcpy( pGT->pFuncTable, &s_gtCoreFunc, sizeof( HB_GT_FUNCS ) ); + pGT->iUsed++; } - s_curGT->pFuncTable = pFuncTable; - return TRUE; + if( pSuperTable == NULL ) + pSuperTable = s_gtInit[ iPos ]->pSuperTable; + if( pSuperTable != NULL ) + memcpy( pSuperTable, pGT->pFuncTable, sizeof( HB_GT_FUNCS ) ); + + if( s_gtInit[ iPos ]->init( pGT->pFuncTable ) ) + return pGT; + else if( fNew ) + { + hb_xfree( pGT->pFuncTable ); + hb_xfree( pGT ); + } } } - return FALSE; + return NULL; } -HB_EXPORT BOOL hb_gtUnLoad( void ) +HB_EXPORT void * hb_gtAlloc( void ) { - while( s_iGtLinkCount > 0 ) + PHB_GT pGT = hb_gt_Base(); + + if( pGT ) { - if( --s_iGtLinkCount == 0 ) - memcpy( &s_gtCoreFunc, - s_gtInit[ s_gtLinkOrder[ s_iGtLinkCount ] ]->pSuperTable, - sizeof( HB_GT_FUNCS ) ); + pGT->iUsed++; + hb_gt_BaseFree( pGT ); } - return TRUE; + return ( void * ) pGT; +} + +HB_EXPORT void hb_gtRelease( void * hGT ) +{ + PHB_GT pGT; + + if( hGT ) + { + pGT = ( PHB_GT ) hGT; + if( !HB_GTSELF_LOCK( pGT ) ) + pGT = NULL; + } + else + pGT = hb_gt_Base(); + + if( pGT ) + { + if( --pGT->iUsed == 0 ) + { + while( HB_GTSELF_DISPCOUNT( pGT ) ) + HB_GTSELF_DISPEND( pGT ); + HB_GTSELF_FLUSH( pGT ); + HB_GTSELF_EXIT( pGT ); + } + else + hb_gt_BaseFree( pGT ); + } +} + +HB_EXPORT void hb_gtAttach( void * hGT ) +{ + if( s_curGT != hGT ) + { + hb_gtRelease( NULL ); + s_curGT = ( PHB_GT ) hGT; + } +} + +HB_EXPORT BOOL hb_gtReload( const char * szGtName, + HB_FHANDLE hFilenoStdin, + HB_FHANDLE hFilenoStdout, + HB_FHANDLE hFilenoStderr ) +{ + BOOL fResult = FALSE; + if( szGtName && hb_gt_FindEntry( szGtName ) != -1 ) + { + hb_gtRelease( NULL ); + s_curGT = hb_gtLoad( szGtName, NULL, NULL ); + fResult = s_curGT != NULL; + hb_gtInit( hFilenoStdin, hFilenoStdout, hFilenoStderr ); + } + return fResult; +} + +static BOOL hb_gtTryInit( const char * szGtName, BOOL fFree ) +{ + if( szGtName ) + { + if( s_curGT == NULL ) + s_curGT = hb_gtLoad( szGtName, NULL, NULL ); + + if( fFree ) + hb_xfree( ( void * ) szGtName ); + } + + return s_curGT != NULL; } HB_EXPORT void hb_gtStartupInit( void ) { - char * szGtName; - BOOL fInit; - - szGtName = hb_cmdargString( "GT" ); - if( szGtName ) - { - fInit = hb_gtLoad( szGtName, &s_gtCoreFunc ); - hb_xfree( szGtName ); - if( fInit ) - return; - } - szGtName = hb_getenv( "HB_GT" ); - if( szGtName ) - { - fInit = hb_gtLoad( szGtName, &s_gtCoreFunc ); - hb_xfree( szGtName ); - if( fInit ) - return; - } - if( hb_gtLoad( hb_gt_FindDefault(), &s_gtCoreFunc ) ) + if( hb_gtTryInit( hb_cmdargString( "GT" ), TRUE ) ) return; - if( hb_gtLoad( hb_gt_szNameDefault, &s_gtCoreFunc ) ) + if( hb_gtTryInit( hb_getenv( "HB_GT" ), TRUE ) ) + return; + if( hb_gtTryInit( hb_gt_FindDefault(), FALSE ) ) + return; + if( hb_gtTryInit( hb_gt_szNameDefault, FALSE ) ) return; if( hb_dynsymFind( "HB_GT_NUL" ) ) /* GTNUL was explicitly REQUESTed */ { - if( hb_gtLoad( "NUL", &s_gtCoreFunc ) ) + if( hb_gtTryInit( "NUL", FALSE ) ) return; } @@ -3232,3 +3283,11 @@ HB_EXPORT void hb_gtStartupInit( void ) } HB_GT_ANNOUNCE( HB_GT_NAME ) + +HB_FUNC( HB_GTRELOAD ) +{ + hb_retl( hb_gtReload( hb_parc( 1 ), + ISNUM( 2 ) ? hb_numToHandle( hb_parnint( 1 ) ) : HB_STDIN_HANDLE, + ISNUM( 3 ) ? hb_numToHandle( hb_parnint( 2 ) ) : HB_STDOUT_HANDLE, + ISNUM( 4 ) ? hb_numToHandle( hb_parnint( 3 ) ) : HB_STDERR_HANDLE ) ); +}