1998-03-05 13:54:51 +00:00
# define XVT_INCL_NATIVE
1998-12-10 16:25:48 +00:00
# define WIN32_LEAN_AND_MEAN
1998-03-05 13:54:51 +00:00
# include <os_dep.h>
# include <commdlg.h>
1999-07-21 09:41:56 +00:00
# include <winver.h>
1998-03-05 13:54:51 +00:00
# include <ctype.h>
# include <applicat.h>
# include <colors.h>
1998-12-10 16:25:48 +00:00
# include <config.h>
1998-03-05 13:54:51 +00:00
# include <utility.h>
# include <window.h>
///////////////////////////////////////////////////////////
// Win32 event hook
///////////////////////////////////////////////////////////
HIDDEN BOOLEAN event_hook ( HWND hwnd ,
UINT msg ,
UINT wparam ,
ULONG lparam ,
long * ret )
{
switch ( msg )
{
case WM_MENUCHAR :
if ( wparam > ' ' & & wparam < = ' z ' )
{
WINDOW win = cur_win ( ) ;
if ( win ! = NULL_WIN )
{
const KEY key = toupper ( wparam ) + K_CTRL ;
dispatch_e_char ( win , key ) ;
* ret = 2 < < 16 ;
}
}
break ;
case WM_KEYDOWN :
if ( wparam = = VK_F1 )
{
if ( ( lparam & ( 1 < < 29 ) ) = = 0 ) // Il tasto alt non e' premuto
{
KEY k = K_F1 ;
int sc = GetAsyncKeyState ( VK_CONTROL ) ; // Stato del tasto control
if ( sc & 0x8000 ) k + = K_CTRL ;
int ss = GetAsyncKeyState ( VK_SHIFT ) ; // Stato del tasto shift
if ( ss & 0x8000 ) k + = K_SHIFT ;
WINDOW win = cur_win ( ) ;
if ( win ! = NULL_WIN )
dispatch_e_char ( win , k ) ;
}
}
break ;
default :
break ;
}
return TRUE ; // Continua col processo normale
}
///////////////////////////////////////////////////////////
// Operating system dependent functions
///////////////////////////////////////////////////////////
bool os_allow_another_instance ( )
{
return TRUE ;
}
COLOR os_choose_color ( COLOR col , WINDOW win )
{
CHOOSECOLOR cc ;
memset ( & cc , 0 , sizeof ( cc ) ) ; // Azzera struttura
if ( win = = NULL_WIN ) win = TASK_WIN ; // Sceglie una finestra valida
HWND hwnd = ( HWND ) xvt_vobj_get_attr ( win , ATTR_NATIVE_WINDOW ) ;
HDC hdc = GetDC ( hwnd ) ;
// Legge la palette di sistema
PALETTEENTRY * pe = NULL ;
int max_entries = 0 ;
if ( GetDeviceCaps ( hdc , RASTERCAPS ) & RC_PALETTE )
{
max_entries = GetDeviceCaps ( hdc , SIZEPALETTE ) ;
pe = new PALETTEENTRY [ max_entries ] ;
GetSystemPaletteEntries ( hdc , 0 , max_entries , pe ) ;
}
ReleaseDC ( hwnd , hdc ) ;
// Definisce i 16 colori customizzabili
unsigned long custom_colors [ 16 ] ;
for ( int c = 0 ; c < 16 ; c + + )
{
if ( pe )
{
const PALETTEENTRY & e = pe [ c < 8 ? c : max_entries - 16 + c ] ;
custom_colors [ c ] = RGB ( e . peRed , e . peGreen , e . peBlue ) ;
}
else
{
const unsigned char val = ( c & 0x8 ) ? 255 : 127 ;
const unsigned char red = ( c & 0x1 ) ? val : 0 ;
const unsigned char green = ( c & 0x2 ) ? val : 0 ;
const unsigned char blue = ( c & 0x4 ) ? val : 0 ;
custom_colors [ c ] = RGB ( red , green , blue ) ;
}
}
if ( pe )
{
delete pe ;
pe = NULL ;
}
cc . lStructSize = sizeof ( cc ) ; // Setta dimensioni
cc . hwndOwner = hwnd ; // Setta finestra padre
cc . rgbResult = RGB ( XVT_COLOR_GET_RED ( c ) , XVT_COLOR_GET_GREEN ( c ) , XVT_COLOR_GET_BLUE ( c ) ) ;
cc . lpCustColors = custom_colors ; // Fissa colori custom
cc . Flags = CC_RGBINIT ; // Usa col come primo colore
if ( ChooseColor ( & cc ) ! = 0 )
col = RGB2COLOR ( GetRValue ( cc . rgbResult ) , GetGValue ( cc . rgbResult ) , GetBValue ( cc . rgbResult ) ) ;
else
col = COLOR_INVALID ;
return col ;
}
bool os_deny_another_instance ( )
{
return FALSE ;
}
bool os_destroy_native_icon ( unsigned icon )
{
return DestroyIcon ( ( HICON ) icon ) ! = 0 ;
}
void os_draw_native_icon ( WINDOW win , const RCT & rct , unsigned icon )
{
HDC hdc = ( HDC ) xvt_vobj_get_attr ( win , ATTR_NATIVE_GRAPHIC_CONTEXT ) ;
1998-03-30 13:43:36 +00:00
int x = ( rct . right + rct . left - 32 ) / 2 ;
int y = ( rct . bottom + rct . top - 32 ) / 2 ;
1998-03-05 13:54:51 +00:00
DrawIcon ( hdc , x , y , ( HICON ) icon ) ;
}
unsigned long os_get_free_memory ( )
{
MEMORYSTATUS ms ;
GlobalMemoryStatus ( & ms ) ;
return ms . dwAvailPhys ;
}
bool os_is_removable_drive ( const char * path )
{
return GetDriveType ( path ) = = DRIVE_REMOVABLE ;
}
bool os_is_network_drive ( const char * path )
{
return GetDriveType ( path ) = = DRIVE_REMOTE ;
}
bool os_is_fixed_drive ( const char * path )
{
UINT dt = GetDriveType ( path ) ;
2002-05-27 12:59:35 +00:00
return dt = = DRIVE_FIXED ;
1998-03-05 13:54:51 +00:00
}
2003-01-07 12:20:49 +00:00
static unsigned long get_disk_size ( const char * path , bool tot , char unit )
1998-05-04 07:50:46 +00:00
{
2002-12-18 10:56:10 +00:00
char drive [ _MAX_DRIVE + 1 ] ;
_splitpath ( path , drive , NULL , NULL , NULL ) ;
strcat ( drive , " / " ) ;
1998-05-04 07:50:46 +00:00
DWORD nSecPerClust , nBytePerSec , nFreeClust , nTotalClust ;
2002-12-18 10:56:10 +00:00
: : GetDiskFreeSpace ( drive , & nSecPerClust , & nBytePerSec , & nFreeClust , & nTotalClust ) ;
2003-01-07 12:20:49 +00:00
__int64 nBytes = tot ? nTotalClust : nFreeClust ;
nBytes * = nSecPerClust ;
nBytes * = nBytePerSec ;
switch ( unit )
{
case ' K ' : nBytes > > = 10 ; break ; // Kilobytes
case ' M ' : nBytes > > = 20 ; break ; // Megabytes
case ' G ' : nBytes > > = 30 ; break ; // Gigabytes
case ' T ' : nBytes > > = 40 ; break ; // Terabytes
default : break ;
}
unsigned long nVal = nBytes > ULONG_MAX ? ( unsigned long ) ULONG_MAX
: ( unsigned long ) nBytes ;
return nVal ;
}
unsigned long os_get_disk_size ( const char * path , char unit )
{
return get_disk_size ( path , true , unit ) ;
}
unsigned long os_get_disk_free_space ( const char * path , char unit )
{
return get_disk_size ( path , false , unit ) ;
1998-05-04 07:50:46 +00:00
}
2002-12-18 10:56:10 +00:00
bool os_test_disk_free_space ( const char * path , unsigned long filesize )
{
2003-01-07 12:20:49 +00:00
// Arrotonda per eccesso al Kilobyte
unsigned long kb = ( filesize + 1023 ) / 1024 ;
return kb < = os_get_disk_free_space ( path , ' K ' ) ;
2002-12-18 10:56:10 +00:00
}
/*
1998-03-05 13:54:51 +00:00
void os_exec_help_command ( MENU_TAG tag , const char * key )
{
TFilename hlp ( " prassi.hlp " ) ;
TString mod ( key ) ;
1998-03-13 10:35:51 +00:00
if ( mod . not_empty ( ) )
{
mod . cut ( 2 ) ; mod . lower ( ) ;
if ( mod ! = " ba " )
hlp . insert ( mod , 0 ) ;
}
else
{
if ( tag = = M_HELP_ONCONTEXT )
tag = M_HELP_CONTENTS ;
}
1998-03-05 13:54:51 +00:00
HWND hwnd = ( HWND ) xvt_vobj_get_attr ( TASK_WIN , ATTR_NATIVE_WINDOW ) ;
switch ( tag )
{
case M_HELP_CONTENTS :
WinHelp ( hwnd , hlp , HELP_CONTENTS , 0 ) ;
break ;
case M_HELP_SEARCH :
WinHelp ( hwnd , hlp , HELP_PARTIALKEY , ( DWORD ) " " ) ;
break ;
case M_HELP_HELPONHELP :
WinHelp ( hwnd , hlp , HELP_HELPONHELP , 0 ) ;
break ;
case M_HELP_ONCONTEXT :
if ( hlp . exist ( ) )
{
struct MULTIGUY
{
DWORD mkSize ;
TCHAR mkKeylist ;
TCHAR mkKeyphrase [ 16 ] ;
} mk ;
mk . mkSize = sizeof ( MULTIGUY ) ;
mk . mkKeylist = ' M ' ;
strncpy ( mk . mkKeyphrase , key , sizeof ( mk . mkKeyphrase ) ) ;
WinHelp ( hwnd , hlp , HELP_MULTIKEY , ( DWORD ) & mk ) ;
}
break ;
default : break ;
}
}
2002-12-18 10:56:10 +00:00
*/
1998-03-05 13:54:51 +00:00
int os_execute ( const TFilename & path , bool sync , bool iconizetask , bool showchild )
{
int exitcode = - 1 ;
STARTUPINFO start ;
PROCESS_INFORMATION pi ;
memset ( & start , 0 , sizeof ( start ) ) ;
start . cb = sizeof ( start ) ;
start . dwX = start . dwY = start . dwXSize = start . dwYSize = CW_USEDEFAULT ;
start . dwFlags = STARTF_USESHOWWINDOW ;
start . wShowWindow = showchild ? SW_SHOW : SW_HIDE ;
BOOL started = CreateProcess ( NULL , ( char * ) ( const char * ) path , NULL , NULL , FALSE , 0 ,
NULL , NULL , & start , & pi ) ;
if ( started )
{
HANDLE hProcess = pi . hProcess ;
if ( sync )
{
ATOM aBa0Atom = NULL ;
if ( iconizetask & & showchild & & main_app ( ) . name ( ) = = " ba0100 " )
{
TString str ;
str < < " ba0100-> " < < cmd2name ( path ) ;
aBa0Atom = GlobalAddAtom ( str ) ;
}
WaitForInputIdle ( hProcess , INFINITE ) ;
1998-03-13 10:35:51 +00:00
1999-01-19 09:15:17 +00:00
bool was_maximized = FALSE ;
1998-03-13 10:35:51 +00:00
if ( iconizetask )
{
1999-01-19 09:15:17 +00:00
TTemp_window tw ( TASK_WIN ) ;
RCT rct_scr , rct_tsk ;
xvt_vobj_get_client_rect ( SCREEN_WIN , & rct_scr ) ;
xvt_vobj_get_client_rect ( tw . win ( ) , & rct_tsk ) ;
was_maximized = rct_scr . right = = rct_tsk . right ;
1998-03-13 10:35:51 +00:00
tw . iconize ( ) ;
tw . deactivate ( ) ;
}
1998-03-05 13:54:51 +00:00
if ( WaitForSingleObject ( hProcess , INFINITE ) ! = 0xFFFFFFFF )
{
unsigned long exit_code ;
if ( GetExitCodeProcess ( hProcess , & exit_code ) )
exitcode = int ( exit_code ) ;
else
exitcode = - 2 ;
}
if ( aBa0Atom )
GlobalDeleteAtom ( aBa0Atom ) ;
if ( iconizetask )
{
1999-01-19 09:15:17 +00:00
TTemp_window tw ( TASK_WIN ) ;
if ( was_maximized )
tw . maximize ( ) ;
else
os_restore_window ( tw . win ( ) ) ;
1998-03-05 13:54:51 +00:00
tw . activate ( ) ;
1999-04-12 10:00:38 +00:00
// do_events(); non si puo fare qui'"
1998-03-05 13:54:51 +00:00
}
}
else
exitcode = 0 ;
CloseHandle ( pi . hThread ) ;
CloseHandle ( hProcess ) ;
}
1998-03-13 10:35:51 +00:00
else
{
exitcode = GetLastError ( ) ;
error_box ( " Impossibile eseguire '%s': %d " , ( const char * ) path , exitcode ) ;
}
1998-03-05 13:54:51 +00:00
return exitcode ;
}
int os_get_printer_names ( TToken_string & t )
{
1998-03-13 10:35:51 +00:00
char * buf = t . get_buffer ( 4096 ) ; // ammazzao'
GetProfileString ( " devices " , NULL , " " , buf , t . size ( ) ) ;
1998-03-05 13:54:51 +00:00
for ( int i = 0 ; i < t . size ( ) ; i + + )
{
if ( buf [ i ] = = ' \0 ' )
{
1998-03-13 10:35:51 +00:00
if ( buf [ i + 1 ] ! = ' \0 ' )
buf [ i ] = t . separator ( ) ;
else
break ;
1998-03-05 13:54:51 +00:00
}
}
return t . items ( ) ;
}
bool os_set_default_printer ( const char * name )
{
CHECK ( name & & * name > ' ' , " Null printer name " ) ;
TString pdev ( name ) ;
if ( pdev . find ( ' , ' ) < 0 )
{
TString szDevice ( 256 ) ;
GetProfileString ( " devices " , pdev , " " , szDevice . get_buffer ( ) , szDevice . size ( ) ) ;
pdev < < ' , ' < < szDevice ;
}
bool ok = WriteProfileString ( " windows " , " device " , pdev ) ! = 0 ;
return ok ;
}
bool os_get_default_printer ( TString & name )
{
char * buf = name . get_buffer ( 256 ) ;
bool ok = GetProfileString ( " windows " , " device " , " ,,, " , buf , name . size ( ) ) ! = 0 ;
return ok ;
}
bool os_spawn_by_menu ( )
{
1998-03-13 10:35:51 +00:00
# ifdef DBG
bool ok = TRUE ;
# else
1998-03-05 13:54:51 +00:00
TString str = main_app ( ) . name ( ) ;
bool ok = str = = " ba0100 " ;
if ( ! ok )
{
str . insert ( " ba0100-> " , 0 ) ;
ok = GlobalFindAtom ( str ) ! = NULL ;
}
1998-03-13 10:35:51 +00:00
# endif
return ok ;
}
1998-03-05 13:54:51 +00:00
os_type os_get_type ( )
{
1999-07-21 09:41:56 +00:00
os_type t = os_Unknown ;
1998-03-05 13:54:51 +00:00
OSVERSIONINFO ovi ;
1999-07-21 09:41:56 +00:00
if ( GetVersionEx ( & ovi ) )
1998-03-05 13:54:51 +00:00
{
1999-07-21 09:41:56 +00:00
switch ( ovi . dwPlatformId )
{
2002-12-18 10:56:10 +00:00
case VER_PLATFORM_WIN32s :
t = os_Win32s ;
break ;
case VER_PLATFORM_WIN32_NT :
t = os_WindowsNT ;
2001-05-04 10:59:04 +00:00
break ;
case VER_PLATFORM_WIN32_WINDOWS :
2002-12-18 10:56:10 +00:00
t = os_Windows95 ;
if ( ovi . dwMajorVersion = = 4 | | ( ovi . dwMajorVersion > 4 & & ovi . dwMinorVersion > 0 ) )
t = os_Windows98 ;
break ;
default :
t = os_Unknown ;
2001-05-04 10:59:04 +00:00
break ;
1999-07-21 09:41:56 +00:00
}
1998-03-05 13:54:51 +00:00
}
return t ;
}
void os_post_menu_event ( WINDOW win , MENU_TAG tag )
{
HWND w = ( HWND ) xvt_vobj_get_attr ( win , ATTR_NATIVE_WINDOW ) ;
PostMessage ( w , WM_COMMAND , tag , 0L ) ;
}
void os_set_event_hook ( )
{
xvt_vobj_set_attr ( NULL_WIN , ATTR_EVENT_HOOK , ( long ) event_hook ) ;
long twin_style = WSF_ICONIZABLE | WSF_CLOSE | WSF_SIZE ;
const int scx = GetSystemMetrics ( SM_CXSCREEN ) ;
1999-01-19 09:15:17 +00:00
const int scy = GetSystemMetrics ( SM_CYSCREEN ) ;
1998-12-10 16:25:48 +00:00
static RCT rct ;
if ( scx < = 640 & & os_get_type ( ) > = os_Windows95 )
1998-03-05 13:54:51 +00:00
{
const int bcx = GetSystemMetrics ( SM_CXFRAME ) ;
const int bcy = GetSystemMetrics ( SM_CYFRAME ) ;
rct . left = - bcx ;
rct . top = GetSystemMetrics ( SM_CYCAPTION ) - bcy - 1 ;
rct . right = scx + bcx ;
rct . bottom = scy + bcy ;
xvt_vobj_set_attr ( NULL_WIN , ATTR_WIN_PM_TWIN_STARTUP_RCT , long ( & rct ) ) ;
}
else
1998-12-10 16:25:48 +00:00
{
TConfig cfg ( CONFIG_USER , " Colors " ) ;
const int res = cfg . get_int ( " Resolution " ) ;
if ( res > = 640 & & res < scx )
{
1999-01-19 09:15:17 +00:00
const int width = res + 2 * GetSystemMetrics ( SM_CXFRAME ) ;
const int height = ( res * 3 ) / 4 + 2 * GetSystemMetrics ( SM_CYFRAME ) - GetSystemMetrics ( SM_CYCAPTION ) - 1 ;
const int deltax = ( scx - width ) / 2 ;
const int deltay = ( scy - height ) / 2 ;
rct . left = deltax ;
rct . top = deltay ;
rct . right = deltax + width ;
rct . bottom = deltay + height ;
1998-12-10 16:25:48 +00:00
xvt_vobj_set_attr ( NULL_WIN , ATTR_WIN_PM_TWIN_STARTUP_RCT , long ( & rct ) ) ;
}
else
twin_style | = WSF_MAXIMIZED ;
}
1998-03-05 13:54:51 +00:00
xvt_vobj_set_attr ( NULL_WIN , ATTR_WIN_PM_TWIN_STARTUP_STYLE , twin_style ) ;
}
void os_wake_up_caller ( )
{
HWND hwnd = ( HWND ) xvt_vobj_get_attr ( TASK_WIN , ATTR_NATIVE_WINDOW ) ;
}
bool os_file_exist ( const char * file )
{
return FALSE ;
}
bool os_open_spool_row ( const char * device )
{
return TRUE ;
}
bool os_spool_row ( const char * str )
{
return FALSE ;
}
bool os_close_spool_row ( )
{
return TRUE ;
}
void os_iconize_window ( WINDOW win )
{
HWND hwnd = ( HWND ) xvt_vobj_get_attr ( win , ATTR_NATIVE_WINDOW ) ;
ShowWindow ( hwnd , SW_MINIMIZE ) ;
}
void os_maximize_window ( WINDOW win )
{
HWND hwnd = ( HWND ) xvt_vobj_get_attr ( win , ATTR_NATIVE_WINDOW ) ;
1999-01-19 09:15:17 +00:00
HWND twin = ( HWND ) xvt_vobj_get_attr ( TASK_WIN , ATTR_NATIVE_WINDOW ) ;
if ( hwnd ! = twin )
{
HWND pare = GetParent ( hwnd ) ;
RECT rct ; GetClientRect ( pare , & rct ) ;
if ( pare = = twin )
rct . bottom - = 24 ;
SetWindowPos ( hwnd , pare ,
rct . left , rct . top , rct . right , rct . bottom ,
SWP_NOZORDER ) ;
}
else
ShowWindow ( hwnd , SW_SHOWMAXIMIZED ) ;
}
void os_restore_window ( WINDOW win )
{
HWND hwnd = ( HWND ) xvt_vobj_get_attr ( win , ATTR_NATIVE_WINDOW ) ;
ShowWindow ( hwnd , SW_NORMAL ) ;
1998-03-05 13:54:51 +00:00
}
1998-05-28 10:09:12 +00:00
bool os_dongle_server_running ( )
{
ATOM a = GlobalFindAtom ( " DONGLE_SERVER_ATOM " ) ;
return a ! = 0 ;
1999-01-19 09:15:17 +00:00
}
1999-07-21 09:18:16 +00:00
1999-07-21 09:41:56 +00:00
bool os_test_network_version ( )
{
if ( os_get_type ( ) = = os_Windows95 )
{
char * VREDIRNAME = " vredir.vxd " ;
DWORD handle ;
DWORD dwSize = GetFileVersionInfoSize ( VREDIRNAME , & handle ) ;
if ( dwSize )
{
BYTE infoBuffer [ 512 ] ;
GetFileVersionInfo ( VREDIRNAME , handle , dwSize , infoBuffer ) ;
long * language ;
void * lpBuffer ;
UINT Size ;
if ( VerQueryValue ( infoBuffer , " \\ VarFileInfo \\ Translation " , ( void * * ) & language , & Size ) & & Size ! = 0 )
{
char szName [ 128 ] ;
sprintf ( szName , " \\ StringFileInfo \\ %04x%04x \\ FileVersion " , LOWORD ( * language ) , HIWORD ( * language ) ) ;
if ( VerQueryValue ( infoBuffer , szName , & lpBuffer , & Size ) & & Size ! = 0 )
{
TToken_string v ( ( const char * ) lpBuffer , ' . ' ) ;
int subver = atoi ( v . get ( 2 ) ) ;
if ( subver > = 1111 & & subver < = 1115 )
return error_box ( " La versione %s del driver di rete '%s' contiene un bug riconosciuto da Microsoft. \n Consultare la documentazione sul sito AGA per eliminare questo inconveniente. " , ( const char * ) lpBuffer , VREDIRNAME ) ;
else
return TRUE ;
}
}
}
message_box ( " Impossibile determinare la versione del driver di rete '%s' " , VREDIRNAME ) ;
}
return TRUE ;
}
1999-07-21 09:18:16 +00:00
HIDDEN const char * _file_to_find = NULL ;
struct TFindWindowInfo
{
HINSTANCE _instance ;
TFilename _file ;
HWND _hwnd ;
TFindWindowInfo ( ) : _instance ( NULL ) , _hwnd ( NULL ) { }
} ;
BOOL CALLBACK EnumWindowsProc ( HWND hwnd , LPARAM lParam )
{
TFindWindowInfo * w = ( TFindWindowInfo * ) lParam ;
HINSTANCE inst = ( HINSTANCE ) GetWindowLong ( hwnd , GWL_HINSTANCE ) ;
if ( inst = = w - > _instance )
{
const LONG style = GetWindowLong ( hwnd , GWL_STYLE ) ;
if ( ( style & WS_CAPTION ) ! = 0 ) // Ha la caption?
{
w - > _hwnd = hwnd ;
return FALSE ;
}
return TRUE ;
}
TString256 str ;
GetWindowText ( hwnd , str . get_buffer ( ) , str . size ( ) ) ;
str . upper ( ) ;
if ( str . find ( w - > _file ) > = 0 )
{
w - > _hwnd = hwnd ;
return FALSE ;
}
return TRUE ;
}
unsigned long os_execute_in_window ( const TFilename & path , WINDOW win )
{
const unsigned long exitcode = WinExec ( path , SW_SHOWNORMAL ) ;
if ( exitcode < 32 )
return 0 ;
TFindWindowInfo w ;
w . _instance = ( HINSTANCE ) exitcode ;
const int space = path . find ( ' ' ) ;
if ( space > 0 )
w . _file = path . mid ( space + 1 ) ;
else
w . _file = path ;
w . _file = w . _file . name ( ) ;
w . _file . ext ( " " ) ;
w . _file . upper ( ) ;
const clock_t start = clock ( ) ;
while ( w . _hwnd = = NULL & & ( clock ( ) - start ) < 10 * CLOCKS_PER_SEC )
{
xvt_app_process_pending_events ( ) ;
EnumWindows ( EnumWindowsProc , LPARAM ( & w ) ) ;
}
if ( w . _hwnd ! = NULL ) // L'ho trovata!
{
RCT rct ; xvt_vobj_get_client_rect ( win , & rct ) ;
HWND nat = ( HWND ) xvt_vobj_get_attr ( win , ATTR_NATIVE_WINDOW ) ;
SetParent ( w . _hwnd , nat ) ;
// LONG style = GetWindowLong(w._hwnd, GWL_STYLE);
// style |= WS_CHILD;
// SetWindowLong(w._hwnd, GWL_STYLE, style);
const int fx = GetSystemMetrics ( SM_CXFRAME ) ;
const int fy = GetSystemMetrics ( SM_CYFRAME ) ;
int cy = GetSystemMetrics ( SM_CYCAPTION ) + GetSystemMetrics ( SM_CYBORDER ) ;
if ( GetMenu ( w . _hwnd ) ! = NULL )
cy + = GetSystemMetrics ( SM_CYMENU ) ;
SetWindowPos ( w . _hwnd , nat , - fx , - fy - cy , rct . right + 2 * fx , rct . bottom + cy + 2 * fy , SWP_NOZORDER ) ;
}
return ( unsigned long ) w . _hwnd ;
}
2001-05-04 10:59:04 +00:00
void os_sleep ( long m )
{
: : Sleep ( m ) ;
}
2002-02-28 11:35:23 +00:00
void os_beep ( int severity )
{
switch ( severity )
{
case 0 : MessageBeep ( MB_OK ) ; break ;
case 1 : MessageBeep ( MB_ICONEXCLAMATION ) ; break ;
default : MessageBeep ( MB_ICONSTOP ) ; break ;
}
}