From fe0f60a15e91fe6de8803331a845cc26d1b9f806 Mon Sep 17 00:00:00 2001 From: IgorA Date: Tue, 24 Nov 2020 15:42:12 +0000 Subject: [PATCH] life2: use open dialog, big font in caption git-svn-id: svn://kolibrios.org@8252 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/common/demos/life2 | Bin 15864 -> 16332 bytes programs/demos/life2/include/kolibri.h | 27 +--- programs/demos/life2/include/kos_func.inc | 6 +- programs/demos/life2/include/kos_start.inc | 16 +- programs/demos/life2/include/l_proc_lib.h | 62 ++++++++ programs/demos/life2/include/load_lib.h | 18 +++ programs/demos/life2/kos_cdlg.h | 100 ------------ programs/demos/life2/kos_cdlg.inc | 167 --------------------- programs/demos/life2/kos_cdlg_win.cpp | 115 -------------- programs/demos/life2/kos_make.inc | 5 +- programs/demos/life2/life2.cpp | 93 ++++++------ programs/other/cnc_editor/cnc_editor.asm | 40 +---- 12 files changed, 157 insertions(+), 492 deletions(-) create mode 100644 programs/demos/life2/include/l_proc_lib.h create mode 100644 programs/demos/life2/include/load_lib.h delete mode 100644 programs/demos/life2/kos_cdlg.h delete mode 100644 programs/demos/life2/kos_cdlg.inc delete mode 100644 programs/demos/life2/kos_cdlg_win.cpp diff --git a/data/common/demos/life2 b/data/common/demos/life2 index 3463da58b7f36f8ff9eaaa7d6be0b758a6e768a6..b0ba227b88f3914e47bea8f9033dcba3ebfa8384 100644 GIT binary patch literal 16332 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 OTyt6GntCY$0002L^u!wg diff --git a/programs/demos/life2/include/kolibri.h b/programs/demos/life2/include/kolibri.h index 1723267155..9f0f2ca600 100644 --- a/programs/demos/life2/include/kolibri.h +++ b/programs/demos/life2/include/kolibri.h @@ -8,7 +8,7 @@ namespace Kolibri // All kolibri functions, types and data are nested in the (Kolibri) namespace. { const char *DebugPrefix = "User program: "; - char CommandLine[257]; + char CommandLine[2048]; struct TWindowData // Data for drawing a window. { @@ -510,31 +510,6 @@ namespace Kolibri } } -#else // def __KOLIBRI__ - -namespace Kolibri -{ - struct TMutex - { - unsigned int mut; - - TMutex(); - ~TMutex(); - }; -#undef KOLIBRI_MUTEX_INIT -#define KOLIBRI_MUTEX_INIT TMutex() - - struct TRecMutex - { - unsigned int mut; - - TRecMutex(); - ~TRecMutex(); - }; -#undef KOLIBRI_REC_MUTEX_INIT -#define KOLIBRI_REC_MUTEX_INIT TRecMutex() -} - #endif // else: def __KOLIBRI__ #endif // ndef __KOLIBRI_H_INCLUDED_ diff --git a/programs/demos/life2/include/kos_func.inc b/programs/demos/life2/include/kos_func.inc index a7753c72e8..d7c798f887 100644 --- a/programs/demos/life2/include/kos_func.inc +++ b/programs/demos/life2/include/kos_func.inc @@ -84,9 +84,6 @@ proc @Kolibri@Main$qv cmp esp,eax cmova esp,eax and esp,not 3 -if defined @Kolibri@CommandLine - mov byte [@Kolibri@CommandLine+256], 0 -end if xor eax,eax cld mov edi,@Kolibri@_ThreadTable @@ -389,8 +386,9 @@ proc @Kolibri@Redraw$qippv dec esi jz .window_defined mov eax,SF_DRAW_TEXT - mov ebx,0x00070007 + mov ebx,0x00070005 mov ecx,[ebp+KOLIBRI_THREAD_DATA_C_TITLE*4] + or ecx,1 shl 28 ;make big font int 0x40 .window_defined: .redraw_picture: diff --git a/programs/demos/life2/include/kos_start.inc b/programs/demos/life2/include/kos_start.inc index e8b0d3b986..b6fecd335d 100644 --- a/programs/demos/life2/include/kos_start.inc +++ b/programs/demos/life2/include/kos_start.inc @@ -4,12 +4,24 @@ org 0 dd 1 dd @Kolibri@Main$qv dd I_END - dd U_END+STACKSIZE+HEAPSIZE + dd U_END+STACKSIZE ;+HEAPSIZE dd U_END+STACKSIZE - dd @Kolibri@CommandLine,0 +if defined @Kolibri@CommandLine + dd @Kolibri@CommandLine +else + dd 0 +end if +if defined @Kolibri@CurrentDirectoryPath + dd @Kolibri@CurrentDirectoryPath +else + dd 0 +end if include "..\..\KOSfuncs.inc" include "..\..\proc32.inc" +include "..\..\macros.inc" +include "..\..\dll.inc" +include "..\..\load_lib.mac" ptr equ offset equ diff --git a/programs/demos/life2/include/l_proc_lib.h b/programs/demos/life2/include/l_proc_lib.h new file mode 100644 index 0000000000..97725340a4 --- /dev/null +++ b/programs/demos/life2/include/l_proc_lib.h @@ -0,0 +1,62 @@ +#ifndef __L_PROC_LIB_H_INCLUDED_ +#define __L_PROC_LIB_H_INCLUDED_ +// +// proc_lib.obj +// + +struct od_filter +{ + long size; //size = len(#ext) + sizeof(long) + char ext[25]; +}; + +struct OpenDialog_data{ + long type; + void* procinfo; // + char* com_area_name; + void* com_area; // + char* opendir_path; + char* dir_default_path; + char* start_path; + void (__stdcall* draw_window)(); + long status; + char* openfile_path; + char* filename_area; + od_filter* filter_area; + short int x_size; // Window X size + short int x_start; // Window X position + short int y_size; // Window y size + short int y_start; // Window Y position +}; + +struct ColorDialog_data{ + long type; + void* procinfo; // + char* com_area_name; + void* com_area; // + char* start_path; + void (__stdcall* draw_window)(); + long status; + short int x_size; // Window X size + short int x_start; // Window X position + short int y_size; // Window y size + short int y_start; // Window Y position + long color_type; // 0- RGB, 1 or other - reserved + long color; // Selected color +}; + +// +// proc_lib - import table +// +void (__stdcall* import_proc_lib)() = (void (__stdcall*)())&"lib_init"; +void (__stdcall* OpenDialog_Init)(OpenDialog_data* odd) = (void (__stdcall*)(OpenDialog_data*))&"OpenDialog_init"; +void (__stdcall* OpenDialog_Start)(OpenDialog_data* odd) = (void (__stdcall*)(OpenDialog_data*))&"OpenDialog_start"; +void (__stdcall* OpenDialog_SetFileName)(OpenDialog_data* odd, char* name) = (void (__stdcall*)(OpenDialog_data*, char*))&"OpenDialog_set_file_name"; +void (__stdcall* OpenDialog_SetFileExt)(OpenDialog_data* odd, char* ext) = (void (__stdcall*)(OpenDialog_data*, char*))&"OpenDialog_set_file_ext"; +void (__stdcall* ColorDialog_Init)(ColorDialog_data* cdd) = (void (__stdcall*)(ColorDialog_data*))&"ColorDialog_init"; +void (__stdcall* ColorDialog_Start)(ColorDialog_data* cdd) = (void (__stdcall*)(ColorDialog_data*))&"ColorDialog_start"; +asm{ + dd 0,0 +} + +#endif \ No newline at end of file diff --git a/programs/demos/life2/include/load_lib.h b/programs/demos/life2/include/load_lib.h new file mode 100644 index 0000000000..e60106c4f0 --- /dev/null +++ b/programs/demos/life2/include/load_lib.h @@ -0,0 +1,18 @@ +#ifndef __LOAD_LIB_H_LINCLUDED_ +#define __LOAD_LIB_H_INCLUDED_ + +// macros '@use_library' and 'load_library' defined in file 'load_lib.mac' + +asm{ + @use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +} + +bool LoadLibrary(const char* lib_name, char* lib_path, const char* system_path, void* myimport) +{ + asm{ + load_library [ebp+8], [ebp+12], [ebp+16], [ebp+20] + } + return true; +} + +#endif \ No newline at end of file diff --git a/programs/demos/life2/kos_cdlg.h b/programs/demos/life2/kos_cdlg.h deleted file mode 100644 index d12febb333..0000000000 --- a/programs/demos/life2/kos_cdlg.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef __KOLIBRI_FILE_OPEN_H_INCLUDED_ -#define __KOLIBRI_FILE_OPEN_H_INCLUDED_ - -#include - -// Kolibri interface. - -namespace Kolibri // All kolibri functions, types and data are nested in the (Kolibri) namespace. -{ - struct TOpenFileStruct; // Data for a file open dialog. -#define KOLIBRI_OPEN_FILE_INIT {} // Initializer of the file open struct, cat be redefined in a realization of the library - - void OpenFileInit(TOpenFileStruct &ofs); - void OpenFileDelete(TOpenFileStruct &ofs); - bool OpenFileDialog(TOpenFileStruct &ofs); - int OpenFileGetState(const TOpenFileStruct &ofs); - bool OpenFileSetState(TOpenFileStruct &ofs, int state); - char *OpenFileGetName(const TOpenFileStruct &ofs); - bool OpenFileSetName(TOpenFileStruct &ofs, char *name); -} - -#ifdef __KOLIBRI__ - -namespace Kolibri -{ -// Structures. - - struct TOpenFileStruct - { - int state; - char *name; - }; -#undef KOLIBRI_OPEN_FILE_INIT -#define KOLIBRI_OPEN_FILE_INIT {0,0} - -// Inline functions. - - inline void OpenFileInit(TOpenFileStruct &ofs) - { - ofs.state = 0; - ofs.name = 0; - } - - inline void OpenFileDelete(TOpenFileStruct &ofs) - { - if (ofs.name) {Free(ofs.name); ofs.name = 0;} - } - - inline int OpenFileGetState(const TOpenFileStruct &ofs) - { - return ofs.state; - } - - inline char *OpenFileGetName(const TOpenFileStruct &ofs) - { - return ofs.name; - } - -// Functions. - - bool OpenFileSetState(TOpenFileStruct &ofs, int state) - { - if (!ofs.state) return !state; - if (ofs.state == state) return true; - if (state < 0) return false; - ofs.state = state; - return true; - } - - bool OpenFileSetName(TOpenFileStruct &ofs, char *name) - { - if (!ofs.name && !name) return true; - if (ofs.name) Free(ofs.name); - if (!name) {ofs.name = 0; return true;} - ofs.name = (char*)Alloc(StrLen(name) + 1); - if (!ofs.name) return false; - StrCopy(ofs.name, name); - return true; - } -} - -#else // else: def __KOLIBRI__ - -namespace Kolibri -{ - struct TOpenFileStruct - { - unsigned int data; - - TOpenFileStruct(); - ~TOpenFileStruct(); - }; -#undef KOLIBRI_OPEN_FILE_INIT -#define KOLIBRI_OPEN_FILE_INIT TOpenFileStruct() -} - -#endif // __KOLIBRI__ - -#endif // __KOLIBRI_FILE_OPEN_H_INCLUDED_ - diff --git a/programs/demos/life2/kos_cdlg.inc b/programs/demos/life2/kos_cdlg.inc deleted file mode 100644 index 1e785cfbee..0000000000 --- a/programs/demos/life2/kos_cdlg.inc +++ /dev/null @@ -1,167 +0,0 @@ -proc @Kolibri@OpenFileDialog$qr23Kolibri@TOpenFileStruct uses ebx esi edi ebp - call @Kolibri@GetThreadData$qv - mov ebp,eax - mov ebx,[esp+20] - cmp dword [ebx+4],0 - jnz .open_file_dlg_str - mov esi,7 - jmp .open_file_dlg_alloc -.open_file_dlg_str: - cld - mov edi,[ebx+4] - mov ecx,-1 - xor al,al - repnz scas byte [edi] - not ecx - mov esi,ecx -.open_file_dlg_alloc: - push esi - call @Kolibri@Alloc$qul - pop ecx - test eax,eax - jz .open_file_dlg_ret - mov ecx,esi - dec ecx - push esi - push ecx - push eax - mov dword [ebx],-1 - cmp dword [ebx+4],0 - jnz .open_file_dlg_copy - mov dword [eax],0x2F64722F - mov word [eax+4],0x2F31 - jmp .open_file_dlg_redraw -.open_file_dlg_copy: - cld - mov ecx,esi - mov esi,[ebx+4] - mov edi,eax - rep movs byte [edi],[esi] -.open_file_dlg_redraw: - mov eax,12 - mov ebx,1 - int 0x40 - xor eax,eax - mov ebx,[ebp+KOLIBRI_THREAD_DATA_X*4] - mov ecx,[ebp+KOLIBRI_THREAD_DATA_Y*4] - mov edx,[ebp+KOLIBRI_THREAD_DATA_C_WINDOW*4] - mov esi,[ebp+KOLIBRI_THREAD_DATA_C_HEADER*4] - mov edi,[ebp+KOLIBRI_THREAD_DATA_C_BORDER*4] - int 0x40 - mov eax,4 - mov ebx,0x00070007 - mov ecx,[ebp+KOLIBRI_THREAD_DATA_C_TITLE*4] - mov edx,Kolibri_open_file_dlg_name - mov esi,Kolibri_open_file_dlg_name_end - Kolibri_open_file_dlg_name - int 0x40 - mov eax,4 - mov ebx,0x000C001E - xor ecx,ecx - mov edx,[esp] - mov esi,[esp+4] - int 0x40 - mov eax,12 - mov ebx,2 - int 0x40 -.open_file_dlg_loop: - mov eax,10 - int 0x40 - dec eax - jz .open_file_dlg_redraw - dec eax - jz .open_file_dlg_key - dec eax - jz .open_file_dlg_end - jmp .open_file_dlg_loop -.open_file_dlg_key: - xor edi,edi -.open_file_dlg_key_loop: - mov eax,2 - int 0x40 - test al,al - jnz .open_file_dlg_key_end - cmp ah,27 - jz .open_file_dlg_end - cmp ah,13 - jz .open_file_dlg_apply - cmp ah,8 - jz .open_file_dlg_key_bsp - cmp ah,32 - jna .open_file_dlg_key_loop - mov ebx,[esp+4] - cmp ebx,[esp+8] - jb .open_file_dlg_key_any - lea esi,[ebx+2*ebx] - shr esi,1 - inc esi - push eax - push esi - push dword [esp+8] - call @Kolibri@ReAlloc$qpvul - add esp,8 - mov ecx,eax - pop eax - test ecx,ecx - jz .open_file_dlg_key - mov [esp+8],esi - mov [esp],ecx -.open_file_dlg_key_any: - mov esi,ebx - add esi,[esp] - mov byte [esi],ah - inc ebx - mov edi,1 - mov [esp+4],ebx - jmp .open_file_dlg_key_loop -.open_file_dlg_key_bsp: - mov eax,[esp+4] - test eax,eax - jz .open_file_dlg_key_loop - dec eax - mov edi,1 - mov [esp+4],eax - jmp .open_file_dlg_key_loop -.open_file_dlg_key_end: - test edi,edi - jnz .open_file_dlg_redraw - jmp .open_file_dlg_loop -.open_file_dlg_apply: - mov eax,[esp+4] - inc eax - mov [esp+8],eax - push eax - push dword [esp+4] - call @Kolibri@ReAlloc$qpvul - add esp,8 - test eax,eax - jz .open_file_dlg_end - mov eax,[esp] - mov esi,eax - add eax,[esp+4] - mov byte [eax],0 - add esp,12 - mov ebx,[esp+20] - mov dword [ebx],2 - push dword [ebx+4] - call @Kolibri@Free$qpv - pop ecx - mov [ebx+4],esi - jmp .open_file_dlg_invalidate -.open_file_dlg_end: - call @Kolibri@Free$qpv - add esp,12 - mov ebx,[esp+20] - mov dword [ebx],1 -.open_file_dlg_invalidate: - push ebp - push dword 1 - call @@Kolibri@Invalidate$qippv - add esp,8 -.open_file_dlg_ret: - ret -endp - -Kolibri_open_file_dlg_name: - db 'Open file' -Kolibri_open_file_dlg_name_end: - diff --git a/programs/demos/life2/kos_cdlg_win.cpp b/programs/demos/life2/kos_cdlg_win.cpp deleted file mode 100644 index c2f17f937a..0000000000 --- a/programs/demos/life2/kos_cdlg_win.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include - -#include -#include -#include "kos_cdlg.h" - -using namespace Kolibri; - -extern HINSTANCE hInstance; - -struct TThreadDataStruct -{ - void *user; - void *stack_begin; - TWindowData *win_data; - HWND hwnd; - int flag; - unsigned int win_time, me_time; - void *picture; - unsigned int picture_width, picture_height; - void *keys; - unsigned int bmp_data_length; - unsigned int *bmp_data; - unsigned int mouse_state; -}; - -struct TOpenFileData -{ - int state; - char name[1]; -}; - -namespace Kolibri -{ - TOpenFileStruct::TOpenFileStruct() : data(0) {} - - TOpenFileStruct::~TOpenFileStruct() - { - if (data) {delete[] (char*)data; data = 0;} - } - - void OpenFileInit(TOpenFileStruct &ofs) {ofs.data = 0;} - - void OpenFileDelete(TOpenFileStruct &ofs) - { - if (ofs.data) {delete[] (char*)ofs.data; ofs.data = 0;} - } - - bool OpenFileDialog(TOpenFileStruct &ofs) - { - char CustomFilter[300], *name; - int size; - CustomFilter[0] = 0; CustomFilter[1] = 0; - if (!OpenFileSetState(ofs, 0)) return false; - OPENFILENAME ofn = {sizeof(OPENFILENAME), ((TThreadDataStruct*)GetThreadData())->hwnd, - hInstance, "All files (*.*)\0*.*\0", - CustomFilter, sizeof(CustomFilter)-1, 1, NULL, 0, NULL, 0, NULL, NULL, - OFN_HIDEREADONLY | OFN_EXPLORER, 0, 0, "", 0, NULL, 0}; - size = 0; - if (ofs.data) size = strlen(((TOpenFileData*)ofs.data)->name) + 1; - if (size < 10000) size = 10000; - name = new char[size + 1]; - if (!name) return false; - if (ofs.data) strcpy(name, ((TOpenFileData*)ofs.data)->name); - else name[0] = 0; - ofn.lpstrFile = &name[0]; ofn.nMaxFile = size; - size = GetOpenFileName(&ofn) == TRUE; - if (OpenFileSetName(ofs, name)) - { - ((TOpenFileData*)ofs.data)->state = (size ? 2 : 1); - } - else size = 0; - delete[] name; - return (bool)size; - } - - int OpenFileGetState(const TOpenFileStruct &ofs) - { - return ofs.data ? ((TOpenFileData*)ofs.data)->state : 0; - } - - bool OpenFileSetState(TOpenFileStruct &ofs, int state) - { - if (!ofs.data || !((TOpenFileData*)ofs.data)->state) return !state; - if (((TOpenFileData*)ofs.data)->state == state) return true; - if (state < 0) return false; - ((TOpenFileData*)ofs.data)->state = state; - return true; - } - - char *OpenFileGetName(const TOpenFileStruct &ofs) - { - if (!ofs.data) return 0; - else return ((TOpenFileData*)ofs.data)->name; - } - - bool OpenFileSetName(TOpenFileStruct &ofs, char *name) - { - if (!ofs.data && !name) return true; - int size = (unsigned int)(((TOpenFileData*)0)->name) + 1; - int state = 0; - if (name) size += strlen(name); - if (ofs.data) - { - state = ((TOpenFileData*)ofs.data)->state; - delete[] (char*)ofs.data; - } - ofs.data = (unsigned int)(new char[size]); - if (!ofs.data) return false; - ((TOpenFileData*)ofs.data)->state = state; - if (name) strcpy(((TOpenFileData*)ofs.data)->name, name); - else ((TOpenFileData*)ofs.data)->name[0] = 0; - return true; - } -} \ No newline at end of file diff --git a/programs/demos/life2/kos_make.inc b/programs/demos/life2/kos_make.inc index e17f5ec64d..9253118f7e 100644 --- a/programs/demos/life2/kos_make.inc +++ b/programs/demos/life2/kos_make.inc @@ -2,12 +2,11 @@ ;//COMPILER// bcc32 -S -v- -R- -6 -a4 -O2 -Og -Oi -Ov -OS -k- -D__KOLIBRI__ -Iinclude ;//UTIL_PATH// . -STACKSIZE equ 102400 -HEAPSIZE equ 102400 +STACKSIZE equ 8196 +HEAPSIZE equ 0 include "include\kos_start.inc" include "include\kos_func.inc" include "include\kos_heap.inc" -include "kos_cdlg.inc" include "mmxlife.inc" ;include "sse2life.inc" diff --git a/programs/demos/life2/life2.cpp b/programs/demos/life2/life2.cpp index 30e0847198..3b545b03af 100644 --- a/programs/demos/life2/life2.cpp +++ b/programs/demos/life2/life2.cpp @@ -1,42 +1,36 @@ #include #include #include +#include +#include #include "lifegen.h" #include "life_bmp.h" -#include "kos_cdlg.h" using namespace Kolibri; -/*** -#define StrLen LibbStrLen -#define StrCopy LibbStrCopy -#define MemCopy LibbMemCopy -#define MemSet LibbMemSet -#define Floor LibbFloor +char library_path[2048]; -unsigned int (*StrLen)(const char *str) = 0; -char *(*StrCopy)(char *dest, const char *src) = 0; -void *(*MemCopy)(void *dest, const void *src, unsigned int n) = 0; -void *(*MemSet)(void *s, char c, unsigned int n) = 0; -double (*Floor)(double x) = 0; +OpenDialog_data ofd; +unsigned char procinfo[1024]; +char plugin_path[4096], filename_area[256]; +od_filter filter1 = { 8, "LIF\0\0" }; -void LibbInit() -{ - HINSTANCE hLib = LoadLibrary("Libb.dll"); - if (!hLib) - { - DebugPutString("Can't load the library.\n"); - Kolibri::Abort(); - } - StrLen = (unsigned int(*)(const char *str))GetProcAddress(hLib, "StrLen"); - StrCopy = (char *(*)(char *dest, const char *src))GetProcAddress(hLib, "StrCopy"); - MemCopy = (void *(*)(void *dest, const void *src, unsigned int n))GetProcAddress(hLib, "MemCopy"); - MemSet = (void *(*)(void *s, char c, unsigned int n))GetProcAddress(hLib, "MemSet"); - Floor = (double (*)(double x))GetProcAddress(hLib, "Floor"); +namespace Kolibri{ + char CurrentDirectoryPath[2048]; } -#pragma startup LibbInit -/**/ +void __stdcall DrawWindow() +{ + asm{ + push ebx + mcall SF_REDRAW,SSF_BEGIN_DRAW + } + //KolibriOnPaint(); + asm{ + mcall SF_REDRAW,SSF_END_DRAW + pop ebx + } +} void __stdcall OneGeneration(int w, int h, void *dest, const void *src, int flag); @@ -107,7 +101,7 @@ AxisParam xpar = {0, 0, 0}; AxisParam ypar = {0, 0, 0}; MouseParam mpar = {0, 0, 0, 0, 0, MouseParam::HitNull}; MenuParam menu; -TOpenFileStruct open_file_str = KOLIBRI_OPEN_FILE_INIT; +bool open_file_str = false; TimeGeneration timegen[TimeGenLength]; int timegenpos = 0; @@ -1356,11 +1350,9 @@ void LifeScreenPutPicture(const unsigned char *pict, int size, TThreadData th) void MenuOpenDialogEnd(TThreadData th) { - int state = OpenFileGetState(open_file_str); - if (state <= 0) return; - OpenFileSetState(open_file_str, 0); - if (state != 2) return; - char *name = OpenFileGetName(open_file_str); + if(!ofd.openfile_path[0] || !open_file_str) return; + open_file_str = false; + char *name = ofd.openfile_path; if (!name) return; FileInfoBlock* file = FileOpen(name); if (!file) return; @@ -1467,8 +1459,9 @@ void MenuMouseClick(int x, int y, int m, TThreadData th) MenuClearClick(th); break; case MenuIOpen: - if (OpenFileGetState(open_file_str) < 0) break; - OpenFileDialog(open_file_str); + ofd.type = 0; // 0 - open + OpenDialog_Start(&ofd); + if(ofd.status==1) open_file_str = true; break; case MenuIAbout: MenuAboutClick(th); @@ -1706,11 +1699,26 @@ bool KolibriOnStart(TStartData &me_start, TThreadData th) me_start.Width = 500; me_start.Height = 400; InitGenerate(); InitMenuButton(); - if (CommandLine[0]) + if(LoadLibrary("proc_lib.obj", library_path, "/sys/lib/proc_lib.obj", &import_proc_lib)) { - open_file_str.state = 2; - OpenFileSetName(open_file_str, CommandLine); - } + ofd.procinfo = procinfo; + ofd.com_area_name = "FFFFFFFF_open_dialog"; + ofd.com_area = 0; + ofd.opendir_path = plugin_path; + ofd.dir_default_path = "/rd/1"; + ofd.start_path = "/rd/1/File managers/opendial"; + ofd.draw_window = DrawWindow; + ofd.status = 0; + ofd.openfile_path = CommandLine; + ofd.filename_area = filename_area; + ofd.filter_area = &filter1; + ofd.x_size = 420; + ofd.x_start = 10; + ofd.y_size = 320; + ofd.y_start = 10; + OpenDialog_Init(&ofd); + } else return false; + if (CommandLine[0]) open_file_str = true; return true; } @@ -1725,7 +1733,7 @@ int KolibriOnIdle(TThreadData th) { static const unsigned int WAIT_TIME = 2, GEN_TIME = 1; int res = -1; - if (OpenFileGetState(open_file_str) > 0) + if (open_file_str) { MenuOpenDialogEnd(th); res = 0; @@ -1826,8 +1834,9 @@ void KolibriOnKeyPress(TThreadData th) break; case 'o': case 'O': - if (OpenFileGetState(open_file_str) < 0) break; - OpenFileDialog(open_file_str); + ofd.type = 0; // 0 - open + OpenDialog_Start(&ofd); + if(ofd.status==1) open_file_str=true; break; case 'a': case 'A': diff --git a/programs/other/cnc_editor/cnc_editor.asm b/programs/other/cnc_editor/cnc_editor.asm index a1c9183eeb..357c49d20b 100644 --- a/programs/other/cnc_editor/cnc_editor.asm +++ b/programs/other/cnc_editor/cnc_editor.asm @@ -7,13 +7,14 @@ include '../../macros.inc' include '../../proc32.inc' include '../../KOSfuncs.inc' include '../../load_img.inc' +include '../../load_lib.mac' include '../../develop/libraries/libs-dev/libimg/libimg.inc' include '../../develop/libraries/box_lib/trunk/box_lib.mac' include 'lang.inc' include 'cnc_editor.inc' include '../../develop/info3ds/info_fun_float.inc' -@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load caption db 'CNC editor 23.05.19',0 ;подпись окна run_file_70 FileInfoBlock @@ -2096,39 +2097,12 @@ lib_name_2 db 'buf2d.obj',0 system_dir_3 db '/sys/lib/' lib_name_3 db 'box_lib.obj',0 -head_f_i: -if lang eq ru - head_f_l db '"Системная ошибка',0 - err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,'" -tE',0 - err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,'" -tW',0 - err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,'" -tE',0 - err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,'" -tW',0 - err_msg_found_lib_2 db 'Не найдена библиотека ',39,'buf2d.obj',39,'" -tE',0 - err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,'" -tW',0 - err_msg_found_lib_3 db 'Не найдена библиотека ',39,'box_lib.obj',39,'" -tE',0 - err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,'" -tW',0 -else - head_f_l db '"System error',0 - err_message_found_lib_0 db 'Sorry I cannot found library ',39,'proc_lib.obj',39,'" -tE',0 - err_message_import_0 db 'Error on load import library ',39,'proc_lib.obj',39,'" -tW',0 - err_message_found_lib_1 db 'Sorry I cannot found library ',39,'libimg.obj',39,'" -tE',0 - err_message_import_1 db 'Error on load import library ',39,'libimg.obj',39,'" -tW',0 - err_msg_found_lib_2 db 'Sorry I cannot found library ',39,'buf2d.obj',39,'" -tE',0 - err_msg_import_2 db 'Error on load import library ',39,'buf2d',39,'" -tW',0 - err_msg_found_lib_3 db 'Sorry I cannot found library ',39,'box_lib.obj',39,'" -tE',0 - err_msg_import_3 db 'Error on load import library ',39,'box_lib',39,'" -tW',0 -end if - align 4 l_libs_start: - lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\ - err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i - lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\ - err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i - lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\ - err_msg_found_lib_2,head_f_l,import_buf2d,err_msg_import_2,head_f_i - lib_3 l_libs lib_name_3, sys_path, file_name, system_dir_3,\ - err_msg_found_lib_3, head_f_l, import_box_lib,err_msg_import_3,head_f_i + lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib + lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg + lib_2 l_libs lib_name_2, library_path, system_dir_2, import_buf2d + lib_3 l_libs lib_name_3, file_name, system_dir_3, import_box_lib l_libs_end: align 4 @@ -2179,7 +2153,7 @@ import_libimg: aimg_draw db 'img_draw',0 align 4 -proclib_import: ;описание экспортируемых функций +import_proclib: OpenDialog_Init dd aOpenDialog_Init OpenDialog_Start dd aOpenDialog_Start OpenDialog_Set_file_name dd aOpenDialog_Set_file_name