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>
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>
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>
///////////////////////////////////////////////////////////
// Operating system dependent functions
///////////////////////////////////////////////////////////
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 ) ;
}
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 ( )
{
2003-03-27 12:14:51 +00:00
bool ok = true ;
# ifndef DBG
TString16 str = main_app ( ) . name ( ) ;
ok = str = = " ba0100 " ;
1998-03-05 13:54:51 +00:00
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_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 ;
}
}