2016-11-02 15:30:45 +01:00
# define MEMSIZE 4096*20
//===================================================//
// //
// LIB //
// //
//===================================================//
2016-10-28 18:06:18 +02:00
# include "../lib/gui.h"
2016-11-02 15:30:45 +01:00
# include "../lib/list_box.h"
# include "../lib/obj/box_lib.h"
# include "../lib/obj/libio_lib.h"
# include "../lib/obj/libini.h"
2016-11-02 19:18:50 +01:00
# include "../lib/collection.h"
# include "../lib/io.h"
2016-11-02 15:30:45 +01:00
# include "../lib/patterns/select_list.h"
//===================================================//
// //
// DATA //
// //
//===================================================//
2016-10-28 18:06:18 +02:00
proc_info Form ;
# define WINDOW_TITLE "Driver Installer"
# define T_CAUTION_TITLE "CAUTION"
# define T_CAUTION_PARAGRAPH "Installing additional drivers can be harmful to the stability of the operation system and potentionally can harm hardware."
# define T_ASSEPT_RISK "I assept the risk"
2016-11-02 13:19:15 +01:00
# define T_README "Readme"
# define T_INSTALL "Install"
2016-10-28 18:06:18 +02:00
# define BUTTON_ID_ASSEPT_RISK 10
2016-11-02 13:19:15 +01:00
# define BUTTON_ID_README 11
# define BUTTON_ID_INSTALL 12
2016-10-28 18:06:18 +02:00
2016-11-02 13:19:15 +01:00
//WINDOW STEPS
# define WINDOW_STEP_INTRO 1;
# define WINDOW_STEP_DRIVER_LIST 2;
char window_step = WINDOW_STEP_INTRO ;
2016-10-28 18:06:18 +02:00
2016-11-02 19:18:50 +01:00
collection ini_sections ;
2016-11-02 19:35:13 +01:00
char drvinf_path [ 4096 ] = " /kolibrios/drivers/drvinf.ini " ;
2016-11-02 19:18:50 +01:00
char cur_version [ 64 ] ;
char cur_description [ 1024 ] ;
char cur_readme_path [ 4096 ] ;
char cur_install_path [ 4096 ] ;
2016-11-02 15:30:45 +01:00
//===================================================//
// //
// CODE //
// //
//===================================================//
void GetIniData ( )
{
2016-11-02 19:18:50 +01:00
select_list . count = 0 ;
ini_enum_sections stdcall ( # drvinf_path , # process_sections ) ;
2016-11-02 15:30:45 +01:00
}
byte process_sections ( dword sec_name , f_name )
{
2016-11-02 19:18:50 +01:00
select_list . count + + ;
ini_sections . add ( sec_name ) ;
2016-11-02 15:30:45 +01:00
return true ;
}
2016-10-28 18:06:18 +02:00
void main ( )
{
2016-11-02 15:30:45 +01:00
int id ;
load_dll ( libio , # libio_init , 1 ) ;
load_dll ( libini , # lib_init , 1 ) ;
load_dll ( boxlib , # box_lib_init , 0 ) ;
2016-11-02 19:18:50 +01:00
GetIniData ( ) ;
2016-11-02 15:30:45 +01:00
SetEventMask ( 0x27 ) ;
2016-10-28 18:06:18 +02:00
loop ( ) switch ( WaitEvent ( ) )
{
2016-11-02 15:30:45 +01:00
case evMouse :
2016-11-02 19:18:50 +01:00
if ( ! CheckActiveProcess ( Form . ID ) ) break ;
2016-11-02 15:30:45 +01:00
SelectList_ProcessMouse ( ) ;
break ;
2016-10-28 18:06:18 +02:00
case evButton :
id = GetButtonID ( ) ;
if ( id = = 1 ) ExitProcess ( ) ;
2016-11-02 15:30:45 +01:00
if ( id = = BUTTON_ID_ASSEPT_RISK ) Event_AsseptRisk ( ) ;
if ( id = = BUTTON_ID_README ) Event_ShowReadme ( ) ;
if ( id = = BUTTON_ID_INSTALL ) Event_RunInstall ( ) ;
2016-10-28 18:06:18 +02:00
break ;
case evKey :
GetKeys ( ) ;
2016-11-02 15:30:45 +01:00
if ( select_list . ProcessKey ( key_scancode ) ) SelectList_LineChanged ( ) ;
2016-10-28 18:06:18 +02:00
break ;
case evReDraw :
2016-11-02 15:30:45 +01:00
Event_DrawWindow ( ) ;
2016-10-28 18:06:18 +02:00
}
}
2016-11-02 13:19:15 +01:00
void draw_intro_window ( )
2016-10-28 18:06:18 +02:00
{
incn y ;
2016-11-02 13:19:15 +01:00
y . n = Form . cheight / 2 - 80 ;
2016-10-28 18:06:18 +02:00
WriteTextB ( 30 + 2 , y . n + 2 , 0x81 , MixColors ( system . color . work , 0xB92234 , 220 ) , T_CAUTION_TITLE ) ;
WriteTextB ( 30 , y . n , 0x81 , 0xB92234 , T_CAUTION_TITLE ) ;
2016-11-02 13:19:15 +01:00
y . n = DrawTextViewArea ( 30 , y . inc ( 30 ) , Form . cwidth - 60 , Form . cheight - 140 ,
2016-10-28 18:06:18 +02:00
T_CAUTION_PARAGRAPH , - 1 , system . color . work_text ) ;
DrawStandartCaptButton ( 30 , y . inc ( 10 ) , BUTTON_ID_ASSEPT_RISK , T_ASSEPT_RISK ) ;
}
2016-11-02 13:19:15 +01:00
void draw_driver_list_window ( )
{
int PADDING = 12 ;
2016-11-02 19:18:50 +01:00
int right_frame_x = Form . cwidth * 46 / 100 ;
int readme_w = 0 ;
2016-11-02 13:19:15 +01:00
//LEFT FRAME
2016-11-02 15:30:45 +01:00
SelectList_Init ( PADDING ,
PADDING ,
2016-11-02 19:18:50 +01:00
right_frame_x - PADDING - PADDING - 8 - scroll1 . size_x ,
2016-11-02 15:30:45 +01:00
Form . cheight - PADDING - PADDING ,
false ) ;
SelectList_Draw ( ) ;
2016-11-02 13:19:15 +01:00
//RIGHT FRAME
2016-11-02 19:18:50 +01:00
GetCurrentSectionData ( ) ;
DrawBar ( right_frame_x , PADDING + 3 , Form . cwidth - right_frame_x - PADDING , 80 , system . color . work ) ;
WriteTextB ( right_frame_x , PADDING + 3 , 0x81 , system . color . work_text , ini_sections . get ( select_list . cur_y ) ) ;
WriteText ( right_frame_x , PADDING + 23 , 0x80 , system . color . work_text , # cur_version ) ;
if ( cur_readme_path [ 0 ] ) readme_w = DrawStandartCaptButton ( right_frame_x , PADDING + 45 , BUTTON_ID_README , T_README ) ;
DrawStandartCaptButton ( right_frame_x + readme_w , PADDING + 45 , BUTTON_ID_INSTALL , T_INSTALL ) ;
DrawTextViewArea ( right_frame_x - 2 , PADDING + 83 , Form . cwidth - right_frame_x - PADDING , Form . cheight - PADDING - PADDING ,
# cur_description, system.color.work, system.color.work_text);
2016-11-02 13:19:15 +01:00
}
2016-11-02 15:30:45 +01:00
void SelectList_DrawLine ( dword i )
{
int yyy , list_last ;
yyy = i * select_list . item_h + select_list . y ;
if ( select_list . cur_y - select_list . first = = i )
{
DrawBar ( select_list . x , yyy , select_list . w , select_list . item_h , system . color . work_button ) ;
2016-11-02 19:18:50 +01:00
WriteText ( select_list . x + 12 , yyy + select_list . text_y , select_list . font_type , system . color . work_button_text , ini_sections . get ( i ) ) ;
2016-11-02 15:30:45 +01:00
}
else
{
DrawBar ( select_list . x , yyy , select_list . w , select_list . item_h , 0xFFFfff ) ;
2016-11-02 19:18:50 +01:00
WriteText ( select_list . x + 12 , yyy + select_list . text_y , select_list . font_type , 0 , ini_sections . get ( i ) ) ;
2016-11-02 15:30:45 +01:00
}
}
void SelectList_LineChanged ( )
{
2016-11-02 19:18:50 +01:00
draw_driver_list_window ( ) ;
}
void GetCurrentSectionData ( )
{
dword cur_section_name = ini_sections . get ( select_list . cur_y ) ;
ini_get_str stdcall ( # drvinf_path , cur_section_name , " ver " , # cur_version , sizeof ( cur_version ) , 0 ) ;
ini_get_str stdcall ( # drvinf_path , cur_section_name , " description " , # cur_description , sizeof ( cur_description ) , 0 ) ;
ini_get_str stdcall ( # drvinf_path , cur_section_name , " readme " , # cur_readme_path , sizeof ( cur_readme_path ) , 0 ) ;
ini_get_str stdcall ( # drvinf_path , cur_section_name , " install " , # cur_install_path , sizeof ( cur_install_path ) , 0 ) ;
2016-11-02 15:30:45 +01:00
}
//===================================================//
// //
// EVENTS //
// //
//===================================================//
void Event_DrawWindow ( )
{
system . color . get ( ) ;
DefineAndDrawWindow ( 215 , 100 , 600 , 400 , 0x33 , system . color . work , WINDOW_TITLE ) ;
GetProcessInfo ( # Form , SelfInfo ) ;
2016-11-02 19:18:50 +01:00
if ( Form . status_window > 2 ) return ;
if ( Form . width < 450 ) { MoveSize ( OLD , OLD , 450 , OLD ) ; return ; }
if ( Form . height < 250 ) { MoveSize ( OLD , OLD , OLD , 250 ) ; return ; }
2016-11-02 15:30:45 +01:00
if ( window_step = = WINDOW_STEP_INTRO ) draw_intro_window ( ) ;
if ( window_step = = WINDOW_STEP_DRIVER_LIST ) draw_driver_list_window ( ) ;
return ;
}
void Event_AsseptRisk ( )
{
window_step = WINDOW_STEP_DRIVER_LIST ;
Event_DrawWindow ( ) ;
}
void Event_ShowReadme ( )
{
2016-11-02 19:18:50 +01:00
io . run ( " /sys/textreader " , # cur_readme_path ) ;
2016-11-02 15:30:45 +01:00
}
void Event_RunInstall ( )
{
2016-11-02 19:18:50 +01:00
io . run ( # cur_install_path , NULL ) ;
2016-11-02 15:30:45 +01:00
}