2008-11-01 17:52 UTC+0200 Viktor Szakats (harbour.01 syenar hu)

* source/rtl/gtwvt/gtwvt.c
    + Added support for HB_GTI_ICONRES, HB_GTI_ICONFILE 
      before the window is created.
    ! Fixed resource leak when HB_GTI_ICONFILE was used.
    ! Fixed problem with HB_GTI_ICONRES when it was resetting 
      the icon if a non-string/non-numeric parameter was passed
      passed, which included simply trying to read the value 
      using hb_gtInfo( HB_GTI_ICONRES ). If this was an intented 
      feature, pls speak up.
    ; Please review these changes.

(this file somehow didn't get committed previously)
This commit is contained in:
Viktor Szakats
2008-11-01 21:18:52 +00:00
parent 709ab59c03
commit a7df2a4a46

View File

@@ -97,7 +97,7 @@ static HB_CRITICAL_NEW( s_wvtMtx );
#define HB_WVT_LOCK hb_threadEnterCriticalSection( &s_wvtMtx );
#define HB_WVT_UNLOCK hb_threadLeaveCriticalSection( &s_wvtMtx );
static PHB_GTWVT s_wvtWindows[WVT_MAX_WINDOWS];
static PHB_GTWVT s_wvtWindows[ WVT_MAX_WINDOWS ];
static int s_wvtCount = 0;
static const TCHAR s_szClassName[] = TEXT( "Harbour_WVT_Class" );
@@ -119,13 +119,13 @@ static void hb_gt_wvt_RegisterClass( HINSTANCE hInstance )
memset( &wndclass, 0, sizeof( WNDCLASS ) );
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wndclass.lpfnWndProc = hb_gt_wvt_WndProc;
/* wndclass.cbClsExtra = 0; */
/* wndclass.cbWndExtra = 0; */
/* wndclass.cbClsExtra = 0; */
/* wndclass.cbWndExtra = 0; */
wndclass.hInstance = hInstance;
/* wndclass.hIcon = NULL; */
/* wndclass.hIcon = 0; */
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
/* wndclass.hbrBackground = NULL; */
/* wndclass.lpszMenuName = NULL; */
/* wndclass.hbrBackground = NULL; */
/* wndclass.lpszMenuName = NULL; */
wndclass.lpszClassName = s_szClassName;
if( ! RegisterClass( &wndclass ) )
@@ -141,11 +141,11 @@ static PHB_GTWVT hb_gt_wvt_Find( HWND hWnd )
while( iCount && iPos < WVT_MAX_WINDOWS )
{
if( s_wvtWindows[iPos] )
if( s_wvtWindows[ iPos ] )
{
if( s_wvtWindows[iPos]->hWnd == hWnd )
if( s_wvtWindows[ iPos ]->hWnd == hWnd )
{
pWVT = s_wvtWindows[iPos];
pWVT = s_wvtWindows[ iPos ];
break;
}
--iCount;
@@ -169,9 +169,9 @@ static BOOL hb_gt_wvt_Alloc( PHB_GTWVT pWVT )
int iPos = 0;
do
{
if( s_wvtWindows[iPos] == NULL )
if( s_wvtWindows[ iPos ] == NULL )
{
s_wvtWindows[iPos] = pWVT;
s_wvtWindows[ iPos ] = pWVT;
pWVT->iHandle = iPos;
if( ++s_wvtCount == 1 )
hb_gt_wvt_RegisterClass( pWVT->hInstance );
@@ -192,7 +192,7 @@ static void hb_gt_wvt_Free( PHB_GTWVT pWVT )
{
HB_WVT_LOCK
s_wvtWindows[pWVT->iHandle] = NULL;
s_wvtWindows[ pWVT->iHandle ] = NULL;
if( --s_wvtCount == 0 )
{
@@ -208,6 +208,9 @@ static void hb_gt_wvt_Free( PHB_GTWVT pWVT )
if( pWVT->hWnd )
DestroyWindow( pWVT->hWnd );
if( pWVT->hIcon && pWVT->bIconToFree )
DestroyIcon( pWVT->hIcon );
hb_xfree( pWVT );
}
@@ -347,11 +350,11 @@ static HFONT hb_gt_wvt_GetFont( const char * pszFace, int iHeight, int iWidth, i
logfont.lfItalic = 0;
logfont.lfUnderline = 0;
logfont.lfStrikeOut = 0;
logfont.lfCharSet = ( BYTE ) iCodePage; /* OEM_CHARSET; */
logfont.lfCharSet = ( BYTE ) iCodePage; /* OEM_CHARSET */
logfont.lfOutPrecision = 0;
logfont.lfClipPrecision = 0;
logfont.lfQuality = ( BYTE ) iQuality; /* DEFAULT_QUALITY, DRAFT_QUALITY or PROOF_QUALITY */
logfont.lfPitchAndFamily = FIXED_PITCH+FF_MODERN; /* all mapping depends on fixed width fonts! */
logfont.lfQuality = ( BYTE ) iQuality; /* DEFAULT_QUALITY, DRAFT_QUALITY or PROOF_QUALITY */
logfont.lfPitchAndFamily = FIXED_PITCH + FF_MODERN; /* all mapping depends on fixed width fonts! */
logfont.lfHeight = iHeight;
logfont.lfWidth = iWidth < 0 ? -iWidth : iWidth;
@@ -1704,6 +1707,13 @@ static BOOL hb_gt_wvt_CreateConsoleWindow( PHB_GTWVT pWVT )
hb_gt_wvt_InitWindow( pWVT, pWVT->ROWS, pWVT->COLS );
/* Set icon */
if( pWVT->hIcon )
{
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) pWVT->hIcon ); /* Set Title Bar Icon */
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) pWVT->hIcon ); /* Set Task List Icon */
}
/* Set default window title */
{
PHB_FNAME pFileName = hb_fsFNameSplit( hb_cmdargARGV()[ 0 ] );
@@ -2157,49 +2167,72 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo )
case HB_GTI_ICONFILE:
{
HICON hIcon = 0;
if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) && pWVT->hWnd )
if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) )
{
LPTSTR lpImage = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) );
hIcon = ( HICON ) LoadImage( ( HINSTANCE ) NULL, lpImage,
IMAGE_ICON, 0, 0, LR_LOADFROMFILE );
HICON hIconToFree = ( pWVT->hIcon && pWVT->bIconToFree ) ? pWVT->hIcon : NULL;
LPTSTR lpImage;
lpImage = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) );
pWVT->bIconToFree = TRUE;
pWVT->hIcon = ( HICON ) LoadImage( ( HINSTANCE ) NULL, lpImage,
IMAGE_ICON, 0, 0, LR_LOADFROMFILE );
HB_TCHAR_FREE( lpImage );
if( hIcon )
if( pWVT->hWnd )
{
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) hIcon ); /* Set Title Bar Icon */
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) hIcon ); /* Set Task List Icon */
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) pWVT->hIcon ); /* Set Title Bar Icon */
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) pWVT->hIcon ); /* Set Task List Icon */
}
if( hIconToFree )
DestroyIcon( hIconToFree );
}
pInfo->pResult = hb_itemPutNInt( pInfo->pResult, ( HB_PTRDIFF ) hIcon );
pInfo->pResult = hb_itemPutNInt( pInfo->pResult, ( HB_PTRDIFF ) pWVT->hIcon );
break;
}
case HB_GTI_ICONRES:
{
HICON hIcon = 0;
if( pWVT->hWnd )
if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING )
{
if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING )
HICON hIconToFree = ( pWVT->hIcon && pWVT->bIconToFree ) ? pWVT->hIcon : NULL;
LPTSTR lpIcon;
lpIcon = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) );
pWVT->bIconToFree = FALSE;
pWVT->hIcon = LoadIcon( pWVT->hInstance, lpIcon );
HB_TCHAR_FREE( lpIcon );
if( pWVT->hWnd )
{
LPTSTR lpIcon = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) );
hIcon = LoadIcon( pWVT->hInstance, lpIcon );
HB_TCHAR_FREE( lpIcon );
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) pWVT->hIcon ); /* Set Title Bar Icon */
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) pWVT->hIcon ); /* Set Task List Icon */
}
else if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC )
{
hIcon = LoadIcon( pWVT->hInstance,
MAKEINTRESOURCE( ( HB_LONG )
hb_itemGetNInt( pInfo->pNewVal ) ) );
}
if( hIcon )
{
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) hIcon ); /* Set Title Bar Icon */
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) hIcon ); /* Set Task List Icon */
}
pInfo->pResult = hb_itemPutNInt( pInfo->pResult, ( HB_PTRDIFF ) hIcon );
if( hIconToFree )
DestroyIcon( hIconToFree );
}
else if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC )
{
HICON hIconToFree = ( pWVT->hIcon && pWVT->bIconToFree ) ? pWVT->hIcon : NULL;
pWVT->bIconToFree = FALSE;
pWVT->hIcon = LoadIcon( pWVT->hInstance,
MAKEINTRESOURCE( ( HB_LONG )
hb_itemGetNInt( pInfo->pNewVal ) ) );
if( pWVT->hWnd )
{
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) pWVT->hIcon ); /* Set Title Bar Icon */
SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) pWVT->hIcon ); /* Set Task List Icon */
}
if( hIconToFree )
DestroyIcon( hIconToFree );
}
pInfo->pResult = hb_itemPutNInt( pInfo->pResult, ( HB_PTRDIFF ) pWVT->hIcon );
break;
}
case HB_GTI_VIEWMAXWIDTH:
pInfo->pResult = hb_itemPutNI( pInfo->pResult, pWVT->COLS );
break;