From 1e9b0b7f3ecc04f4d878cc9baf196ef34ef2d423 Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Sat, 7 Jun 2008 04:31:50 +0000 Subject: [PATCH] 2008-06-06 20:45 UTC+0800 Pritpal Bedi (pritpal@vouchcac.com) * harbour/source/rtl/hbgtcore.c * harbour/include/hbgtcore.h * harbour/include/hbgtinfo.ch * harbour/source/rtl/gtwvt/gtwvt.c * harbour/source/rtl/gtwvt/gtwvt.h + Added building blocks for CallBacks to be set with Hb_GtInfo( GTI_* ). * harbour/tests/wvtext.prg + Test program to taste few of the callbacks. /* This also sets the ground for futuristic multi-window GT I have kept MW GT code out of current implementation. This implementation does not interfere nor affects current functionality. A work in progress. Viktor, I have found a way to implement 'consol shearing, working on it and for that to happen these building blocks are a must. Przemek, please review the structure of . I have added a few members. Please bear with my meagre knowledge if I did something stupid, just correct it. */ --- harbour/include/hbgtcore.h | 36 +++- harbour/include/hbgtinfo.ch | 161 ++++++++++------- harbour/source/rtl/gtwvt/gtwvt.c | 293 +++++++++++++++++++++++++++++++ harbour/source/rtl/gtwvt/gtwvt.h | 2 + harbour/source/rtl/hbgtcore.c | 138 ++++++++++++++- harbour/tests/wvtext.prg | 86 +++++++++ 6 files changed, 647 insertions(+), 69 deletions(-) create mode 100644 harbour/tests/wvtext.prg diff --git a/harbour/include/hbgtcore.h b/harbour/include/hbgtcore.h index 885c0fb9a3..417bc96519 100644 --- a/harbour/include/hbgtcore.h +++ b/harbour/include/hbgtcore.h @@ -51,8 +51,8 @@ */ /* NOTE: The declaration of hb_gtSetPos(), hb_gtGetPos(), hb_gtWrite(), - hb_gtWriteAt(), hb_gtRepChar(), hb_gtBox(), hb_gtBoxS(), hb_gtBoxD() - hb_gtInit() differs in parameter types from the original CA-Cl*pper + hb_gtWriteAt(), hb_gtRepChar(), hb_gtBox(), hb_gtBoxS(), hb_gtBoxD() + hb_gtInit() differs in parameter types from the original CA-Cl*pper versions. [vszakats] */ #ifndef HB_GTCORE_H_ @@ -349,6 +349,38 @@ typedef struct _HB_GT_BASE void * pGTData[HB_GT_MAX_]; /* local GT data */ + /* Members holding information to Fire Events */ + /* Pritpal Bedi */ + + int iLocalGTHandle; /* local GT handle - FUTURISTIC */ + + PHB_DYNS pDynSymINKEY; /* for any key event independant of INKEY Loop - Useful with TCP/IP Terminals */ + PHB_ITEM pDynSymINKEYdata; + + PHB_DYNS pDynSymCLOSE; /* when close button is pressed */ + PHB_ITEM pDynSymCLOSEdata; + + PHB_DYNS pDynSymCOMMAND; /* though not being processed currently but FUTURISTIC */ + PHB_ITEM pDynSymCOMMANDdata; + + PHB_DYNS pDynSymTIMER; /* very useful for many jobs , I use it extensively */ + PHB_ITEM pDynSymTIMERdata; + + PHB_DYNS pDynSymACTIVATE; /* FUTURISTIC */ + PHB_ITEM pDynSymACTIVATEdata; + + PHB_DYNS pDynSymSETFOCUS; /* when window gets WM_SETFOCUS message */ + PHB_ITEM pDynSymSETFOCUSdata; + + PHB_DYNS pDynSymKILLFOCUS; /* when window gets WM_KILLFOCUS message */ + PHB_ITEM pDynSymKILLFOCUSdata; + + PHB_DYNS pDynSymMOUSE; /* when mouse activity is detected */ + PHB_ITEM pDynSymMOUSEdata; + + PHB_DYNS pDynSymSIZE; /* after a window is resized by mouse */ + PHB_ITEM pDynSymSIZEdata; + } HB_GT_BASE, * PHB_GT_BASE, * PHB_GT; extern PHB_GT hb_gt_Base( void ); diff --git a/harbour/include/hbgtinfo.ch b/harbour/include/hbgtinfo.ch index 8faa535b60..b606f710ec 100644 --- a/harbour/include/hbgtinfo.ch +++ b/harbour/include/hbgtinfo.ch @@ -118,7 +118,13 @@ #define HB_GTI_ISUNICODE 47 /* is Unicode input/output enabled? */ -/* Font weights */ +/* Additional constants to enhance GT */ +#define HB_GTI_CALLBACK 51 /* holds information about callback fired when a key is pressed */ +#define HB_GTI_SCREENSIZE 52 /* Get/Set height/width of application window in pixels */ +#define HB_GTI_SETTIMER 53 /* Sets the Timer with ID, callback will be defined with GTI_CALLBACK */ +#define HB_GTI_KILLTIMER 54 /* Deactivates the Timer set with GTI_SETTIMER */ + +/* Font weights */ #define HB_GTI_FONTW_THIN 1 #define HB_GTI_FONTW_NORMAL 2 #define HB_GTI_FONTW_BOLD 3 @@ -145,83 +151,110 @@ #define HB_GTI_KBD_ACCENT3 16384 #define HB_GTI_KBD_ACCENT4 32768 +/* Callback constants - list has a room for future extensions */ +#define HB_GTI_CB_INKEY 1 +#define HB_GTI_CB_TIMER 2 +#define HB_GTI_CB_ACTIVATE 3 +#define HB_GTI_CB_SETFOCUS 4 +#define HB_GTI_CB_KILLFOCUS 5 +#define HB_GTI_CB_MOUSE 6 +#define HB_GTI_CB_CLOSE 7 +#define HB_GTI_CB_COMMAND 8 +#define HB_GTI_CB_SIZE 9 + /* Compatibility #defines */ #ifndef HB_GT_NO_XHB -#define GTI_ISGRAPHIC HB_GTI_ISGRAPHIC -#define GTI_SCREENWIDTH HB_GTI_SCREENWIDTH -#define GTI_SCREENHEIGHT HB_GTI_SCREENHEIGHT -#define GTI_SCREENDEPTH HB_GTI_SCREENDEPTH -#define GTI_FONTSIZE HB_GTI_FONTSIZE -#define GTI_FONTWIDTH HB_GTI_FONTWIDTH -#define GTI_DESKTOPWIDTH HB_GTI_DESKTOPWIDTH -#define GTI_DESKTOPHEIGHT HB_GTI_DESKTOPHEIGHT -#define GTI_DESKTOPDEPTH HB_GTI_DESKTOPDEPTH -#define GTI_COMPATBUFFER HB_GTI_COMPATBUFFER -#define GTI_KBDSHIFTS HB_GTI_KBDSHIFTS -#define GTI_KBDSPECIAL HB_GTI_KBDSPECIAL -#define GTI_KBDALT HB_GTI_KBDALT -#define GTI_FULLSCREEN HB_GTI_FULLSCREEN -#define GTI_KBDSUPPORT HB_GTI_KBDSUPPORT -#define GTI_CLIPBOARDDATA HB_GTI_CLIPBOARDDATA -#define GTI_CLIPBOARDPAST HB_GTI_CLIPBOARDPAST +#define GTI_ISGRAPHIC HB_GTI_ISGRAPHIC +#define GTI_SCREENWIDTH HB_GTI_SCREENWIDTH +#define GTI_SCREENHEIGHT HB_GTI_SCREENHEIGHT +#define GTI_SCREENDEPTH HB_GTI_SCREENDEPTH +#define GTI_FONTSIZE HB_GTI_FONTSIZE +#define GTI_FONTWIDTH HB_GTI_FONTWIDTH +#define GTI_DESKTOPWIDTH HB_GTI_DESKTOPWIDTH +#define GTI_DESKTOPHEIGHT HB_GTI_DESKTOPHEIGHT +#define GTI_DESKTOPDEPTH HB_GTI_DESKTOPDEPTH +#define GTI_COMPATBUFFER HB_GTI_COMPATBUFFER +#define GTI_KBDSHIFTS HB_GTI_KBDSHIFTS +#define GTI_KBDSPECIAL HB_GTI_KBDSPECIAL +#define GTI_KBDALT HB_GTI_KBDALT +#define GTI_FULLSCREEN HB_GTI_FULLSCREEN +#define GTI_KBDSUPPORT HB_GTI_KBDSUPPORT +#define GTI_CLIPBOARDDATA HB_GTI_CLIPBOARDDATA +#define GTI_CLIPBOARDPAST HB_GTI_CLIPBOARDPAST #define GTI_CURSORBLINKRATE HB_GTI_CURSORBLINKRATE -#define GTI_DESKTOPROWS HB_GTI_DESKTOPROWS -#define GTI_DESKTOPCOLS HB_GTI_DESKTOPCOLS -#define GTI_FONTWEIGHT HB_GTI_FONTWEIGHT -#define GTI_FONTQUALITY HB_GTI_FONTQUALITY -#define GTI_FONTNAME HB_GTI_FONTNAME -#define GTI_CODEPAGE HB_GTI_CODEPAGE -#define GTI_WINTITLE HB_GTI_WINTITLE -#define GTI_ICONFILE HB_GTI_ICONFILE -#define GTI_ICONRES HB_GTI_ICONRES -#define GTI_MOUSESTATUS HB_GTI_MOUSESTATUS -#define GTI_INPUTFD HB_GTI_INPUTFD -#define GTI_OUTPUTFD HB_GTI_OUTPUTFD -#define GTI_ERRORFD HB_GTI_ERRORFD -#define GTI_ESCDELAY HB_GTI_ESCDELAY -#define GTI_VIEWMAXHEIGHT HB_GTI_VIEWMAXHEIGHT -#define GTI_VIEWMAXWIDTH HB_GTI_VIEWMAXWIDTH -#define GTI_VIEWPORTHEIGHT HB_GTI_VIEWPORTHEIGHT -#define GTI_VIEWPORTWIDTH HB_GTI_VIEWPORTWIDTH -#define GTI_STDOUTCON HB_GTI_STDOUTCON -#define GTI_STDERRCON HB_GTI_STDERRCON -#define GTI_ISCTWIN HB_GTI_ISCTWIN -#define GTI_ISMULTIWIN HB_GTI_ISMULTIWIN -#define GTI_GETWIN HB_GTI_GETWIN -#define GTI_SETWIN HB_GTI_SETWIN -#define GTI_NEWWIN HB_GTI_NEWWIN -#define GTI_ADDKEYMAP HB_GTI_ADDKEYMAP -#define GTI_DELKEYMAP HB_GTI_DELKEYMAP +#define GTI_DESKTOPROWS HB_GTI_DESKTOPROWS +#define GTI_DESKTOPCOLS HB_GTI_DESKTOPCOLS +#define GTI_FONTWEIGHT HB_GTI_FONTWEIGHT +#define GTI_FONTQUALITY HB_GTI_FONTQUALITY +#define GTI_FONTNAME HB_GTI_FONTNAME +#define GTI_CODEPAGE HB_GTI_CODEPAGE +#define GTI_WINTITLE HB_GTI_WINTITLE +#define GTI_ICONFILE HB_GTI_ICONFILE +#define GTI_ICONRES HB_GTI_ICONRES +#define GTI_MOUSESTATUS HB_GTI_MOUSESTATUS +#define GTI_INPUTFD HB_GTI_INPUTFD +#define GTI_OUTPUTFD HB_GTI_OUTPUTFD +#define GTI_ERRORFD HB_GTI_ERRORFD +#define GTI_ESCDELAY HB_GTI_ESCDELAY +#define GTI_VIEWMAXHEIGHT HB_GTI_VIEWMAXHEIGHT +#define GTI_VIEWMAXWIDTH HB_GTI_VIEWMAXWIDTH +#define GTI_VIEWPORTHEIGHT HB_GTI_VIEWPORTHEIGHT +#define GTI_VIEWPORTWIDTH HB_GTI_VIEWPORTWIDTH +#define GTI_STDOUTCON HB_GTI_STDOUTCON +#define GTI_STDERRCON HB_GTI_STDERRCON +#define GTI_ISCTWIN HB_GTI_ISCTWIN +#define GTI_ISMULTIWIN HB_GTI_ISMULTIWIN +#define GTI_GETWIN HB_GTI_GETWIN +#define GTI_SETWIN HB_GTI_SETWIN +#define GTI_NEWWIN HB_GTI_NEWWIN +#define GTI_ADDKEYMAP HB_GTI_ADDKEYMAP +#define GTI_DELKEYMAP HB_GTI_DELKEYMAP #define GTI_ISUNICODE HB_GTI_ISUNICODE +#define GTI_CALLBACK HB_GTI_CALLBACK +#define GTI_SCREENSIZE HB_GTI_SCREENSIZE +#define GTI_SETTIMER HB_GTI_SETTIMER +#define GTI_KILLTIMER HB_GTI_KILLTIMER + /* Font weights */ -#define GTI_FONTW_THIN HB_GTI_FONTW_THIN +#define GTI_FONTW_THIN HB_GTI_FONTW_THIN #define GTI_FONTW_NORMAL HB_GTI_FONTW_NORMAL -#define GTI_FONTW_BOLD HB_GTI_FONTW_BOLD +#define GTI_FONTW_BOLD HB_GTI_FONTW_BOLD /* Font sizes */ -#define GTI_FONTQ_DRAFT HB_GTI_FONTQ_DRAFT +#define GTI_FONTQ_DRAFT HB_GTI_FONTQ_DRAFT #define GTI_FONTQ_NORMAL HB_GTI_FONTQ_NORMAL -#define GTI_FONTQ_HIGH HB_GTI_FONTQ_HIGH +#define GTI_FONTQ_HIGH HB_GTI_FONTQ_HIGH /* Keyboard shifts states */ -#define GTI_KBD_SHIFT HB_GTI_KBD_SHIFT -#define GTI_KBD_CTRL HB_GTI_KBD_CTRL -#define GTI_KBD_ALT HB_GTI_KBD_ALT -#define GTI_KBD_LWIN HB_GTI_KBD_LWIN -#define GTI_KBD_RWIN HB_GTI_KBD_RWIN -#define GTI_KBD_MENU HB_GTI_KBD_MENU -#define GTI_KBD_INSERT HB_GTI_KBD_INSERT -#define GTI_KBD_SCROLOCK HB_GTI_KBD_SCROLOCK -#define GTI_KBD_NUMLOCK HB_GTI_KBD_NUMLOCK -#define GTI_KBD_CAPSLOCK HB_GTI_KBD_CAPSLOCK -#define GTI_KBD_INALTSEQ HB_GTI_KBD_INALTSEQ -#define GTI_KBD_ACCENT1 HB_GTI_KBD_ACCENT1 -#define GTI_KBD_ACCENT2 HB_GTI_KBD_ACCENT2 -#define GTI_KBD_ACCENT3 HB_GTI_KBD_ACCENT3 -#define GTI_KBD_ACCENT4 HB_GTI_KBD_ACCENT4 +#define GTI_KBD_SHIFT HB_GTI_KBD_SHIFT +#define GTI_KBD_CTRL HB_GTI_KBD_CTRL +#define GTI_KBD_ALT HB_GTI_KBD_ALT +#define GTI_KBD_LWIN HB_GTI_KBD_LWIN +#define GTI_KBD_RWIN HB_GTI_KBD_RWIN +#define GTI_KBD_MENU HB_GTI_KBD_MENU +#define GTI_KBD_INSERT HB_GTI_KBD_INSERT +#define GTI_KBD_SCROLOCK HB_GTI_KBD_SCROLOCK +#define GTI_KBD_NUMLOCK HB_GTI_KBD_NUMLOCK +#define GTI_KBD_CAPSLOCK HB_GTI_KBD_CAPSLOCK +#define GTI_KBD_INALTSEQ HB_GTI_KBD_INALTSEQ +#define GTI_KBD_ACCENT1 HB_GTI_KBD_ACCENT1 +#define GTI_KBD_ACCENT2 HB_GTI_KBD_ACCENT2 +#define GTI_KBD_ACCENT3 HB_GTI_KBD_ACCENT3 +#define GTI_KBD_ACCENT4 HB_GTI_KBD_ACCENT4 + +/* Callback constants - list has a room for future extensions */ +#define GTI_CB_INKEY HB_GTI_CB_INKEY +#define GTI_CB_TIMER HB_GTI_CB_TIMER +#define GTI_CB_ACTIVATE HB_GTI_CB_ACTIVATE +#define GTI_CB_SETFOCUS HB_GTI_CB_SETFOCUS +#define GTI_CB_KILLFOCUS HB_GTI_CB_KILLFOCUS +#define GTI_CB_MOUSE HB_GTI_CB_MOUSE +#define GTI_CB_CLOSE HB_GTI_CB_CLOSE +#define GTI_CB_COMMAND HB_GTI_CB_COMMAND +#define GTI_CB_SIZE HB_GTI_CB_SIZE #endif diff --git a/harbour/source/rtl/gtwvt/gtwvt.c b/harbour/source/rtl/gtwvt/gtwvt.c index 90ed4a9a22..7955e31ca2 100644 --- a/harbour/source/rtl/gtwvt/gtwvt.c +++ b/harbour/source/rtl/gtwvt/gtwvt.c @@ -221,9 +221,255 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT ) pWVT->IgnoreWM_SYSCHAR = FALSE; + pWVT->bMaximized = FALSE; + return pWVT; } +static void hb_gt_wvt_FireEvent( PHB_GTWVT pWVT, int message, WPARAM wParam, LPARAM lParam ) +{ + switch( message ) + { + case GTI_CB_CLOSE: + { + if( pWVT->pGT->pDynSymCLOSE ) + { + if( hb_vmRequestReenter() ) + { + if( hb_itemType( pWVT->pGT->pDynSymCLOSE ) & HB_IT_BLOCK ) + { + hb_vmPushEvalSym(); + hb_vmPush( pWVT->pGT->pDynSymCLOSE ); + } + else + { + hb_vmPushDynSym( pWVT->pGT->pDynSymCLOSE ); + hb_vmPushNil(); + } + hb_vmPushNumInt( message ); + hb_vmPushNumInt( pWVT->iHandle ); + if ( pWVT->pGT->pDynSymCLOSEdata ) + { + hb_vmPushItemRef( pWVT->pGT->pDynSymCLOSEdata ); + } + else + { + hb_vmPushNil(); + } + hb_vmDo( 3 ); + hb_vmRequestRestore(); + } + } + break; + } + + case GTI_CB_INKEY: + { + if( pWVT->pGT->pDynSymINKEY ) + { + if( hb_vmRequestReenter() ) + { + if( hb_itemType( pWVT->pGT->pDynSymINKEY ) & HB_IT_BLOCK ) + { + hb_vmPushEvalSym(); + hb_vmPush( pWVT->pGT->pDynSymINKEY ); + } + else + { + hb_vmPushDynSym( pWVT->pGT->pDynSymINKEY ); + hb_vmPushNil(); + } + hb_vmPushNumInt( message ); + hb_vmPushNumInt( pWVT->iHandle ); + if ( pWVT->pGT->pDynSymINKEYdata ) + { + hb_vmPushItemRef( pWVT->pGT->pDynSymINKEYdata ); + } + else + { + hb_vmPushNil(); + } + hb_vmPushNumInt( wParam ); + hb_vmDo( 4 ); + hb_vmRequestRestore(); + } + } + break; + } + + case GTI_CB_SIZE: + { + if( pWVT->pGT->pDynSymSIZE ) + { + if( hb_vmRequestReenter() ) + { + if( hb_itemType( pWVT->pGT->pDynSymSIZE ) & HB_IT_BLOCK ) + { + hb_vmPushEvalSym(); + hb_vmPush( pWVT->pGT->pDynSymSIZE ); + } + else + { + hb_vmPushDynSym( pWVT->pGT->pDynSymSIZE ); + hb_vmPushNil(); + } + hb_vmPushNumInt( message ); + hb_vmPushNumInt( pWVT->iHandle ); + if ( pWVT->pGT->pDynSymSIZEdata ) + { + hb_vmPushItemRef( pWVT->pGT->pDynSymSIZEdata ); + } + else + { + hb_vmPushNil(); + } + hb_vmPushInteger( (int) wParam ); + hb_vmPushInteger( (int) lParam ); + hb_vmDo( 5 ); + hb_vmRequestRestore(); + } + } + break; + } + + case GTI_CB_SETFOCUS: + { + if( pWVT->pGT->pDynSymSETFOCUS ) + { + if( hb_vmRequestReenter() ) + { + if( hb_itemType( pWVT->pGT->pDynSymSETFOCUS ) & HB_IT_BLOCK ) + { + hb_vmPushEvalSym(); + hb_vmPush( pWVT->pGT->pDynSymSETFOCUS ); + } + else + { + hb_vmPushDynSym( pWVT->pGT->pDynSymSETFOCUS ); + hb_vmPushNil(); + } + hb_vmPushNumInt( message ); + hb_vmPushNumInt( pWVT->iHandle ); + if ( pWVT->pGT->pDynSymSETFOCUSdata ) + { + hb_vmPushItemRef( pWVT->pGT->pDynSymSETFOCUSdata ); + } + else + { + hb_vmPushNil(); + } + hb_vmDo( 3 ); + hb_vmRequestRestore(); + } + } + break; + } + + case GTI_CB_KILLFOCUS: + { + if( pWVT->pGT->pDynSymKILLFOCUS ) + { + if( hb_vmRequestReenter() ) + { + if( hb_itemType( pWVT->pGT->pDynSymKILLFOCUS ) & HB_IT_BLOCK ) + { + hb_vmPushEvalSym(); + hb_vmPush( pWVT->pGT->pDynSymKILLFOCUS ); + } + else + { + hb_vmPushDynSym( pWVT->pGT->pDynSymKILLFOCUS ); + hb_vmPushNil(); + } + hb_vmPushNumInt( message ); + hb_vmPushNumInt( pWVT->iHandle ); + if ( pWVT->pGT->pDynSymKILLFOCUSdata ) + { + hb_vmPushItemRef( pWVT->pGT->pDynSymKILLFOCUSdata ); + } + else + { + hb_vmPushNil(); + } + hb_vmDo( 3 ); + hb_vmRequestRestore(); + } + } + break; + } + + case GTI_CB_COMMAND: + { + if( pWVT->pGT->pDynSymCOMMAND ) + { + if( hb_vmRequestReenter() ) + { + if( hb_itemType( pWVT->pGT->pDynSymCOMMAND ) & HB_IT_BLOCK ) + { + hb_vmPushEvalSym(); + hb_vmPush( pWVT->pGT->pDynSymCOMMAND ); + } + else + { + hb_vmPushDynSym( pWVT->pGT->pDynSymCOMMAND ); + hb_vmPushNil(); + } + hb_vmPushNumInt( message ); + hb_vmPushNumInt( pWVT->iHandle ); + if ( pWVT->pGT->pDynSymCOMMANDdata ) + { + hb_vmPushItemRef( pWVT->pGT->pDynSymCOMMANDdata ); + } + else + { + hb_vmPushNil(); + } + hb_vmPushNumInt( wParam ); + hb_vmPushNumInt( lParam ); + hb_vmDo( 5 ); + hb_vmRequestRestore(); + } + } + break; + } + + case GTI_CB_TIMER: + { + if( pWVT->pGT->pDynSymTIMER ) + { + if( hb_vmRequestReenter() ) + { + if( hb_itemType( pWVT->pGT->pDynSymTIMER ) & HB_IT_BLOCK ) + { + hb_vmPushEvalSym(); + hb_vmPush( pWVT->pGT->pDynSymTIMER ); + } + else + { + hb_vmPushDynSym( pWVT->pGT->pDynSymTIMER ); + hb_vmPushNil(); + } + hb_vmPushNumInt( message ); + hb_vmPushNumInt( pWVT->iHandle ); + if ( pWVT->pGT->pDynSymTIMERdata ) + { + hb_vmPushItemRef( pWVT->pGT->pDynSymTIMERdata ); + } + else + { + hb_vmPushNil(); + } + hb_vmPushNumInt( wParam ); + hb_vmPushNumInt( lParam ); + hb_vmDo( 5 ); + hb_vmRequestRestore(); + } + } + break; + } + } +} + static BOOL hb_gt_wvt_SetWindowSize( PHB_GTWVT pWVT, int iRow, int iCol ) { if( HB_GTSELF_RESIZE( pWVT->pGT, iRow, iCol ) ) @@ -453,6 +699,9 @@ static void hb_gt_wvt_AddCharToInputQueue( PHB_GTWVT pWVT, int iKey ) iPos = 0; if( iPos != pWVT->keyPointerOut ) pWVT->keyPointerIn = iPos; + + /* Pritpal Bedi - 06 Jun 2008 */ + hb_gt_wvt_FireEvent( pWVT, GTI_CB_INKEY, iKey, 0 ); } static BOOL hb_gt_wvt_GetCharFromInputQueue( PHB_GTWVT pWVT, int * iKey ) @@ -1121,6 +1370,10 @@ static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wPara return 0; case WM_CLOSE: /* Clicked 'X' on system menu */ + /* NOTE: this follows more code . will post later as it needs to be cleaned */ + /* But it demonstrates the concept */ + hb_gt_wvt_FireEvent( pWVT, GTI_CB_CLOSE, wParam, lParam ); + if( hb_set.HB_SET_CANCEL ) hb_vmRequestCancel(); return 0; @@ -1149,6 +1402,46 @@ static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wPara } return 0; */ + /* Pritpal Bedi - 06 Jun 2008 */ + case WM_ACTIVATE: + hb_gt_wvt_FireEvent( pWVT, ( LOWORD( wParam ) == WA_INACTIVE ? GTI_CB_KILLFOCUS : GTI_CB_SETFOCUS ), wParam, lParam ); + return 0; + + case WM_COMMAND: + hb_gt_wvt_FireEvent( pWVT, GTI_CB_COMMAND, wParam, lParam ); + return 0; + + case WM_SIZE: + if( !pWVT->bMaximized ) + { + hb_gt_wvt_FireEvent( pWVT, GTI_CB_SIZE, (WPARAM) LOWORD( lParam ), (LPARAM) HIWORD( lParam ) ); + } + else + { + pWVT->bMaximized = FALSE; + } + return 0; + /* NOTE: This message has more powerful features than what I implemented as above commented out */ + case WM_TIMER: + hb_gt_wvt_FireEvent( pWVT, GTI_CB_TIMER, wParam, lParam ); + return 0; + + case WM_SYSCOMMAND: + switch(wParam) + { + case SC_MAXIMIZE: + { + RECT rc = {0,0,0,0}; + pWVT->bMaximized = TRUE; + + SystemParametersInfo( SPI_GETWORKAREA,0, &rc, 0 ); + + hb_gt_wvt_FireEvent( pWVT, GTI_CB_SIZE, (WPARAM) (rc.right-rc.left-pWVT->PTEXTSIZE.x), + (LPARAM) (rc.bottom-rc.top-(pWVT->PTEXTSIZE.y*1)) ); + return 0; + } + } + break; } return DefWindowProc( hWnd, message, wParam, lParam ); diff --git a/harbour/source/rtl/gtwvt/gtwvt.h b/harbour/source/rtl/gtwvt/gtwvt.h index ee941c38f4..fe6407425a 100644 --- a/harbour/source/rtl/gtwvt/gtwvt.h +++ b/harbour/source/rtl/gtwvt/gtwvt.h @@ -154,6 +154,8 @@ typedef struct BOOL IgnoreWM_SYSCHAR; + BOOL bMaximized; /* Flag is set when window has been maximized */ + } HB_GTWVT, * PHB_GTWVT; /* xHarbour compatible definitions */ diff --git a/harbour/source/rtl/hbgtcore.c b/harbour/source/rtl/hbgtcore.c index 53865ae946..0761cc2e47 100644 --- a/harbour/source/rtl/hbgtcore.c +++ b/harbour/source/rtl/hbgtcore.c @@ -152,6 +152,52 @@ static void hb_gt_def_Free( PHB_GT pGT ) if( pGT->iColorCount > 0 ) hb_xfree( pGT->pColor ); + /* Pritpal Bedi */ + if( hb_itemType( pGT->pDynSymINKEY ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymINKEY ); + if( pGT->pDynSymINKEYdata ) + hb_itemRelease( pGT->pDynSymINKEYdata ); + + if( hb_itemType( pGT->pDynSymCLOSE ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymCLOSE ); + if( pGT->pDynSymCLOSEdata ) + hb_itemRelease( pGT->pDynSymCLOSEdata ); + + if( hb_itemType( pGT->pDynSymCOMMAND ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymCOMMAND ); + if( pGT->pDynSymCOMMANDdata ) + hb_itemRelease( pGT->pDynSymCOMMANDdata ); + + if( hb_itemType( pGT->pDynSymTIMER ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymTIMER ); + if( pGT->pDynSymTIMERdata ) + hb_itemRelease( pGT->pDynSymTIMERdata ); + + if( hb_itemType( pGT->pDynSymACTIVATE ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymACTIVATE ); + if( pGT->pDynSymACTIVATEdata ) + hb_itemRelease( pGT->pDynSymACTIVATEdata ); + + if( hb_itemType( pGT->pDynSymSETFOCUS ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymSETFOCUS ); + if( pGT->pDynSymSETFOCUSdata ) + hb_itemRelease( pGT->pDynSymSETFOCUSdata ); + + if( hb_itemType( pGT->pDynSymKILLFOCUS ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymKILLFOCUS ); + if( pGT->pDynSymKILLFOCUSdata ) + hb_itemRelease( pGT->pDynSymKILLFOCUSdata ); + + if( hb_itemType( pGT->pDynSymMOUSE ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymMOUSE ); + if( pGT->pDynSymMOUSEdata ) + hb_itemRelease( pGT->pDynSymMOUSEdata ); + + if( hb_itemType( pGT->pDynSymSIZE ) & HB_IT_BLOCK ) + hb_itemRelease( pGT->pDynSymSIZE ); + if( pGT->pDynSymSIZEdata ) + hb_itemRelease( pGT->pDynSymSIZEdata ); + if( s_curGT == pGT ) s_curGT = NULL; hb_xfree( pGT ); @@ -1539,6 +1585,92 @@ static BOOL hb_gt_def_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) } break; + case GTI_CALLBACK: + { + BOOL bSet = TRUE; + int iElems = hb_arrayLen( pInfo->pNewVal ); + PHB_DYNS pDynSym; + + if( iElems >= 2 ) + { + if( hb_itemType( hb_arrayGetItemPtr( pInfo->pNewVal,2 ) ) & HB_IT_STRING ) + { + pDynSym = hb_dynsymFind( hb_arrayGetCPtr( pInfo->pNewVal,2 ) ); + } + else if( hb_itemType( hb_arrayGetItemPtr( pInfo->pNewVal,2 ) ) & HB_IT_BLOCK ) + { + pDynSym = hb_itemNew( hb_arrayGetItemPtr( pInfo->pNewVal,2 ) ); + } + + if ( pDynSym ) + { + switch ( hb_arrayGetNI( pInfo->pNewVal,1 ) ) + { + case GTI_CB_CLOSE: + pGT->pDynSymCLOSE = pDynSym; + if ( iElems >= 3 ) + { + pGT->pDynSymCLOSEdata = hb_itemNew( hb_arrayGetItemPtr( pInfo->pNewVal,3 ) ); + } + break; + + case GTI_CB_INKEY: + pGT->pDynSymINKEY = pDynSym; + if ( iElems >= 3 ) + { + pGT->pDynSymINKEYdata = hb_itemNew( hb_arrayGetItemPtr( pInfo->pNewVal,3 ) ); + } + break; + + case GTI_CB_TIMER: + pGT->pDynSymTIMER = pDynSym; + if ( iElems >= 3 ) + { + pGT->pDynSymTIMERdata = hb_itemNew( hb_arrayGetItemPtr( pInfo->pNewVal,3 ) ); + } + break; + + case GTI_CB_ACTIVATE: + pGT->pDynSymACTIVATE = pDynSym; + break; + + case GTI_CB_SETFOCUS: + pGT->pDynSymSETFOCUS = pDynSym; + if ( iElems >= 3 ) + { + pGT->pDynSymSETFOCUSdata = hb_itemNew( hb_arrayGetItemPtr( pInfo->pNewVal,3 ) ); + } + break; + + case GTI_CB_KILLFOCUS: + pGT->pDynSymKILLFOCUS = pDynSym; + if ( iElems >= 3 ) + { + pGT->pDynSymKILLFOCUSdata = hb_itemNew( hb_arrayGetItemPtr( pInfo->pNewVal,3 ) ); + } + break; + + case GTI_CB_MOUSE: + pGT->pDynSymMOUSE = pDynSym; + if ( iElems >= 3 ) + { + pGT->pDynSymKILLFOCUSdata = hb_itemNew( hb_arrayGetItemPtr( pInfo->pNewVal,3 ) ); + } + break; + + case GTI_CB_SIZE: + pGT->pDynSymSIZE = pDynSym; + if ( iElems >= 3 ) + { + pGT->pDynSymSIZEdata = hb_itemNew( hb_arrayGetItemPtr( pInfo->pNewVal,3 ) ); + } + break; + } + } + } + break; + } + default: return FALSE; } @@ -1868,7 +2000,7 @@ static int hb_gt_def_Alert( PHB_GT pGT, PHB_ITEM pMessage, PHB_ITEM pOptions, } if( iKey >= 32 && iKey <= 255 ) { - char szVal[2]; + char szVal[2]; szVal[ 0 ] = ( char ) iKey; szVal[ 1 ] = '\0'; HB_GTSELF_WRITECON( pGT, ( BYTE * ) szVal, 1 ); @@ -1999,7 +2131,7 @@ static void hb_gt_def_ColdArea( PHB_GT pGT, int iTop, int iLeft, int iBottom, in if( iLeft > iRight ) { i = iLeft; - iLeft = iRight; + iLeft = iRight; iRight = i; } while( iTop <= iBottom ) @@ -2032,7 +2164,7 @@ static void hb_gt_def_ExposeArea( PHB_GT pGT, int iTop, int iLeft, int iBottom, if( iLeft > iRight ) { i = iLeft; - iLeft = iRight; + iLeft = iRight; iRight = i; } while( iTop <= iBottom ) diff --git a/harbour/tests/wvtext.prg b/harbour/tests/wvtext.prg new file mode 100644 index 0000000000..c78ad99c09 --- /dev/null +++ b/harbour/tests/wvtext.prg @@ -0,0 +1,86 @@ +//----------------------------------------------------------------------// +//----------------------------------------------------------------------// +//----------------------------------------------------------------------// +// +// [x]Harbour Extended Features Deno +// . +// Pritpal Bedi +// +//----------------------------------------------------------------------// +//----------------------------------------------------------------------// +//----------------------------------------------------------------------// + +#include 'HbGtInfo.ch' + +//----------------------------------------------------------------------// + +FUNCTION Main() + Local nKey + + SetMode( 25,80 ) + SetCursor( 0 ) + SetColor( 'n/w' ) + + + // Any CALLBACK function receive 5 parameters PLUS any additional parameters + // supplied with the CALLBACK Block. + // + HB_GtInfo( GTI_CALLBACK, { GTI_CB_SETFOCUS, {|a,b,c,d,e| MyCallBacks( a,b,c,d,e,'MyParam' ) }, { 'MyCargo' } } ) + HB_GtInfo( GTI_CALLBACK, { GTI_CB_CLOSE , {|a,b,c,d,e| MyCallBacks( a,b,c,d,e ) } } ) + + DispScreen() + + DO WHILE .T. + nKey := Inkey() + if nKey == 27 + exit + endif + + DO CASE + CASE nKey == 13 + Alert( ' Pressed' ) + + ENDCASE + ENDDO + + RETURN NIL +//----------------------------------------------------------------------// + +STATIC FUNCTION MyCallBacks( nEvent, iGT, xCargo, wParam, lParam, xSentByMe ) + + DO CASE + + CASE nEvent == GTI_CB_SETFOCUS + DispOutAt( 5,10, xCargo[ 1 ], 'N/W' ) // We have sent { 'MyCargo' } + DispOutAt( 6,10, xSentByMe , 'R/W' ) // We are sending 'MyParam' + + CASE nEvent == GTI_CB_CLOSE + DispScreen() + if Alert( 'Close Application', {'Yes','No' } ) == 1 + QUIT + endif + + ENDCASE + + RETURN 0 + +//----------------------------------------------------------------------// + +STATIC FUNCTION DispScreen() + + CLS + DispOutAt( 0,0,padc( '[x]Harbour GT - New Features', maxcol()+1 ), 'N/GR*' ) + DispOutAt( maxrow(),0,padc( ' ', maxcol()+1 ), 'N/G*' ) + + RETURN NIL + +//----------------------------------------------------------------------// + +FUNCTION HB_GTSYS() + + REQUEST HB_GT_WVT_DEFAULT + + RETURN nil + +//----------------------------------------------------------------------// +