2013-11-06 23:09 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)

* include/hbgtinfo.ch
    + added new hb_gtInfo() switch: HB_GTI_CLOSEMODE
      It controls close event (i.e. ALT+F4 and/or [x] button in MS-Windows)
      behavior:
         == 0 - terminate application
         >= 1 - generate HB_K_CLOSE
         == 2 - disable close button

  * contrib/gtqtc/gtqtc.h
  * contrib/gtqtc/gtqtc1.cpp
    % optimized setWindowFlags() and setWindowState() to not
      execute show() when flags/state are not changed.
    + added support for HB_GTI_CLOSEMODE
    * changed HB_GTI_CLOSABLE to work line in GTXWC and GTWVT

  * src/rtl/gtxwc/gtxwc.c
    ! fixed setting window position by HB_GTI_SETPOS_XY
    + added support for HB_GTI_CLOSEMODE
    ; note: in GTXWC we cannot easy disable close button so
            HB_GTI_CLOSEMODE==2 will work like 1 until we
            do not find some portable way to inform WM that
            is should hide close button

  * src/rtl/gtwin/gtwin.c
    * added type checking in few HB_GTI_* settings
    + added support for HB_GTI_CLOSEMODE
    ; note: in GTWIN we cannot catch close event so
            HB_GTI_CLOSEMODE==1 works like 2
            In this GT HB_GTI_CLOSABLE also has to work like
            HB_GTI_CLOSEMODE==2

  * src/rtl/gtwvt/gtwvt.h
  * src/rtl/gtwvt/gtwvt.c
    * added range checking in HB_GTI_RESIZEMODE setting
    + added support for HB_GTI_CLOSEMODE
This commit is contained in:
Przemysław Czerpak
2013-11-06 23:09:59 +01:00
parent 119dad6cfc
commit 548cc2df3a
8 changed files with 157 additions and 35 deletions

View File

@@ -1825,7 +1825,8 @@ static HB_BOOL hb_gt_win_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
UINT uiCodePage = GetConsoleCP();
UINT uiCodePageNew = hb_itemGetNI( pInfo->pNewVal );
pInfo->pResult = hb_itemPutNI( pInfo->pResult, uiCodePage );
if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) && uiCodePageNew != uiCodePage )
if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) &&
uiCodePageNew != uiCodePage )
{
SetConsoleCP( uiCodePageNew );
SetConsoleOutputCP( uiCodePageNew );
@@ -1851,7 +1852,7 @@ static HB_BOOL hb_gt_win_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
case HB_GTI_CLOSABLE:
pInfo->pResult = hb_itemPutL( pInfo->pResult, s_bClosable );
if( pInfo->pNewVal )
if( hb_itemType( pInfo->pNewVal ) & HB_IT_LOGICAL )
{
HB_BOOL bNewValue = hb_itemGetL( pInfo->pNewVal );
if( bNewValue != s_bClosable )
@@ -1862,6 +1863,20 @@ static HB_BOOL hb_gt_win_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
}
break;
case HB_GTI_CLOSEMODE:
pInfo->pResult = hb_itemPutNI( pInfo->pResult, s_bClosable ? 0 : 2 );
if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC )
{
int iVal = hb_itemGetNI( pInfo->pNewVal );
if( iVal >= 0 && iVal <= 2 &&
( s_bClosable ? ( iVal != 0 ) : ( iVal == 0 ) ) )
{
s_bClosable = iVal == 0;
hb_gt_win_SetCloseButton( HB_TRUE, s_bClosable );
}
}
break;
case HB_GTI_RESIZABLE:
pInfo->pResult = hb_itemPutL( pInfo->pResult, HB_FALSE );
break;

View File

@@ -384,10 +384,8 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow )
}
pWVT->bResizable = HB_TRUE;
pWVT->bClosable = HB_TRUE;
pWVT->CloseMode = 0;
pWVT->ResizeMode = HB_GTI_RESIZEMODE_FONT;
pWVT->bResizing = HB_FALSE;
pWVT->bAlreadySizing = HB_FALSE;
@@ -2161,6 +2159,15 @@ static void hb_gt_wvt_Composited( PHB_GTWVT pWVT, HB_BOOL fEnable )
#endif
}
static void hb_gt_wvt_SetCloseButton( PHB_GTWVT pWVT )
{
HMENU hSysMenu = GetSystemMenu( pWVT->hWnd, FALSE );
if( hSysMenu )
EnableMenuItem( hSysMenu, SC_CLOSE, MF_BYCOMMAND |
( pWVT->CloseMode < 2 ? MF_ENABLED : MF_GRAYED ) );
}
static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, LPARAM lParam )
{
SHORT keyCode = 0;
@@ -2895,7 +2902,7 @@ static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wPara
return 0;
case WM_CLOSE: /* Clicked 'X' on system menu */
if( pWVT->bClosable )
if( pWVT->CloseMode == 0 )
{
PHB_ITEM pItem = hb_itemPutL( NULL, HB_TRUE );
hb_setSetItem( HB_SET_CANCEL, pItem );
@@ -3960,9 +3967,30 @@ static HB_BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
break;
case HB_GTI_CLOSABLE:
pInfo->pResult = hb_itemPutL( pInfo->pResult, pWVT->bClosable );
if( pInfo->pNewVal )
pWVT->bClosable = hb_itemGetL( pInfo->pNewVal );
pInfo->pResult = hb_itemPutL( pInfo->pResult, pWVT->CloseMode == 0 );
if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_LOGICAL ) &&
( hb_itemGetL( pInfo->pNewVal ) ? ( pWVT->CloseMode != 0 ) :
( pWVT->CloseMode == 0 ) ) )
{
iVal = pWVT->CloseMode;
pWVT->CloseMode = iVal == 0 ? 1 : 0;
if( pWVT->hWnd )
hb_gt_wvt_SetCloseButton( pWVT );
}
break;
case HB_GTI_CLOSEMODE:
pInfo->pResult = hb_itemPutNI( pInfo->pResult, pWVT->CloseMode );
if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC )
{
iVal = hb_itemGetNI( pInfo->pNewVal );
if( iVal >= 0 && iVal <= 2 && pWVT->CloseMode != iVal )
{
pWVT->CloseMode = iVal;
if( pWVT->hWnd )
hb_gt_wvt_SetCloseButton( pWVT );
}
}
break;
case HB_GTI_PALETTE:
@@ -4009,7 +4037,16 @@ static HB_BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
case HB_GTI_RESIZEMODE:
pInfo->pResult = hb_itemPutNI( pInfo->pResult, pWVT->ResizeMode );
if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC )
pWVT->ResizeMode = hb_itemGetNI( pInfo->pNewVal );
{
iVal = hb_itemGetNI( pInfo->pNewVal );
switch( iVal )
{
case HB_GTI_RESIZEMODE_FONT:
case HB_GTI_RESIZEMODE_ROWS:
pWVT->ResizeMode = iVal;
break;
}
}
break;
case HB_GTI_SETPOS_XY:

View File

@@ -325,7 +325,7 @@ typedef struct
HB_BOOL IgnoreWM_SYSCHAR;
HB_BOOL bResizable;
HB_BOOL bClosable;
HB_BOOL bMaximized; /* Flag is set when window has been maximized */
HB_BOOL bFullScreen;
HB_BOOL bAltEnter; /* Can use Alt+Enter to enter full screen mode */
int MarginTop;
@@ -334,7 +334,6 @@ typedef struct
int iNewPosX;
int iNewPosY;
HB_BOOL bMaximized; /* Flag is set when window has been maximized */
HB_BOOL bBeingMarked; /* Flag to control DOS window like copy operation */
HB_BOOL bBeginMarked;
@@ -345,6 +344,7 @@ typedef struct
RECT sRectNew;
RECT sRectOld;
int CloseMode;
int ResizeMode; /* Sets the resizing mode either to FONT or ROWS */
HB_BOOL bResizing;

View File

@@ -4367,7 +4367,7 @@ static void hb_gt_xwc_SetResizing( PXWND_DEF wnd )
/* xsize.flags = PWinGravity | PBaseSize | PResizeInc | PMinSize; */
xsize.flags = PWinGravity | PResizeInc | PMinSize | PMaxSize | PBaseSize;
xsize.win_gravity = CenterGravity;
xsize.win_gravity = StaticGravity;
if( wnd->fResizable )
{
xsize.width_inc = wnd->fontWidth;
@@ -5046,6 +5046,16 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
wnd->fClosable = hb_itemGetL( pInfo->pNewVal );
break;
case HB_GTI_CLOSEMODE:
pInfo->pResult = hb_itemPutNI( pInfo->pResult, wnd->fClosable ? 0 : 1 );
if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC )
{
iVal = hb_itemGetNI( pInfo->pNewVal );
if( iVal >= 0 && iVal <= 2 )
wnd->fClosable = iVal == 0;
}
break;
case HB_GTI_RESIZABLE:
pInfo->pResult = hb_itemPutL( pInfo->pResult, wnd->fResizable );
if( hb_itemType( pInfo->pNewVal ) & HB_IT_LOGICAL )