From bd0955cc9454262657b6b7c12303a7769b843802 Mon Sep 17 00:00:00 2001 From: GerdtR Date: Sun, 4 Aug 2013 20:43:44 +0000 Subject: [PATCH] The new manager of desktop icons git-svn-id: svn://kolibrios.org@3850 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/system/@ICON.ASM | 1453 +++++++++++++++++++++++++++++++++++ programs/system/DLGADD.INC | 633 +++++++++++++++ programs/system/ICON.INI | 173 +++++ programs/system/MOVING.INC | 121 +++ programs/system/RBUTTON.INC | 545 +++++++++++++ programs/system/readme.txt | 5 + 6 files changed, 2930 insertions(+) create mode 100644 programs/system/@ICON.ASM create mode 100644 programs/system/DLGADD.INC create mode 100644 programs/system/ICON.INI create mode 100644 programs/system/MOVING.INC create mode 100644 programs/system/RBUTTON.INC create mode 100644 programs/system/readme.txt diff --git a/programs/system/@ICON.ASM b/programs/system/@ICON.ASM new file mode 100644 index 0000000000..f954545c59 --- /dev/null +++ b/programs/system/@ICON.ASM @@ -0,0 +1,1453 @@ +;На потом: добавит загрузку ico и возможность выбора иконки не из iconstrp + +ICONS_DAT equ '/rd/1/icons.dat' +ICON_STRIP equ '/rd/1/iconstrp.png' +ICON_SIZE equ 68 +IMG_SIZE equ 32 +TEXT_BOTTOM_Y equ 14 +IMAGE_TOP_Y equ 10 ;>=1 +ALIGN_SIZE equ 68 +NAME_LENGTH equ 11 +MIN_NO_MOVING equ 8 + ;для диалога создания/редактирования +ICONSX equ 20 +ICONSY equ 100 +ICONS_DRAW_COUNTW equ 10 ;количество иконок в ширину +ICONS_DRAW_COUNTH equ 2 ;количество иконок в высоту +SPCW equ 3 ;пробел между иконками по горизонтали +SPCH equ 3 +END_ICONS_AREAW equ ICONSX+(IMG_SIZE+SPCW)*ICONS_DRAW_COUNTW-SPCW +END_ICONS_AREAH equ ICONSY+(IMG_SIZE+SPCH)*ICONS_DRAW_COUNTH-SPCH + + + +SizeData equ bufStdIco+32 +BegData equ fiStdIco.point +;------------------------------------------------------------------------------ + use32 + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd I_END ; size of image + dd ENDMEM ; memory for app + dd stack_area ; esp + dd 0 ; boot parameters + dd 0 ; path +;------------------------------------------------------------------------------ +include 'lang.inc' +include '../../macros.inc' +include '../../proc32.inc' +;include '../../API.inc' +include '../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../dll.inc' +;include '../../debug.inc' + +;------------------------------------------------------------------------------ +START: ; start of execution + mcall 68,11 + stdcall dll.Load,IMPORTS + test eax,eax + jnz ErrLoadLibs + +; unpack deflate + mov eax,[unpack_DeflateUnpack2] + mov [deflate_unpack],eax +;--------------------------------------------------------------------- +; get size of file ICONSTRP.PNG + mcall 70,fiStdIco + test eax,eax + jnz ErrorStrp +; get memory for ICONSTRP.PNG + mov ecx,dword[bufStdIco+32] + mov [fiStdIco.size],ecx + mov [img_size],ecx + mcall 68,12 + mov [fiStdIco.point],eax + mov [image_file],eax +; load ICONSTRP.PNG + mov dword[fiStdIco],0 + mcall 70,fiStdIco + test eax,eax + jnz close +; convert PNG to RAW + xor eax,eax + mov [return_code],eax +;int3 + + push image_file + call [cnv_png_import.Start] + + mov eax,[raw_pointer] + mov ebx,[eax+32] + mov [strip_file_size],ebx + mov eax,[eax+28] + add eax,[raw_pointer] + mov [strip_file],eax +; back memory to system + mcall 68,13,[fiStdIco.point] + + mov eax,[raw_pointer] + mov eax,[eax+8] + shr eax,5 + mov [icon_count],eax + + and eax,0x7 + mov [cur_band_compensation],eax + +;########## загружаем данные иконок в память ########################## + + mcall 70,fiIni ;выделяем память, достаточной для хранения ini файла. Её точно хватит для хранения данных об иконках + test eax,eax + jnz ErrorIni + + cmp dword[bufIni+32],0 + je ErrorIni + mcall 68,12,dword[bufIni+32] + mov dword[BegData],eax + jmp NoErrIni + + ErrorIni: + mcall 70,fiRunProg + mcall -1 + + NoErrIni: + m2m [PIcoDB],[BegData] + + stdcall [ini_enum_sections],IconIni,LoadIconsData +;int3 + mov eax,dword[PIcoDB] + sub eax,[BegData] + mov dword[SizeData],eax + mov eax,[BegData] + cmp eax,[PIcoDB] + jne @f + mov dword[eax],0 + mov dword[SizeData],0 + @@: +;###################################################################### + + call FillIconsOffs + + mcall 40,0110000b + + mov eax,[icon_count] + mov bl,ICONS_DRAW_COUNTH + div bl + test ah,ah + jz @f + inc al + @@: + and eax,0FFh + mov [sbIcons.max_area],eax + + ; int3 +; mov eax,1 +; mov eax,[IconsOffs+eax*4] +; stdcall [ini_del_section],IconIni,eax +; ret + jmp MSGRedrawIcons + +messages: + mcall 10 + sub eax,5 + jz MSGRedrawIcons + dec eax + jz MSGMouse + + jmp messages + +MSGRedrawIcons: + + mcall 48,5 + mov dx,ax + shr eax,16 + sub dx,ax + mov [ScreenX],dx + mov ax,bx + shr ebx,16 + sub ax,bx + mov [ScreenY],ax + + mov ecx,[MaxNumIcon] + test ecx,ecx + jz .NoDraw + xor ebx,ebx + @@: push ecx + stdcall DrawIcon,ebx,0 + inc ebx + pop ecx + loop @b + .NoDraw: + jmp messages + +MSGMouse: + mcall 37,0 ;GetMousePos + xor ebx,ebx + mov bx,ax + shr eax,16 + mov ecx,ebx + mov ebx,eax + + mcall 34 + cmp eax,1 + jne messages + + cmp [RButtonActiv],1 + je messages + + mov [MouseY],ecx + mov [MouseX],ebx + + + mcall 37,2 + test al,001b + jnz LButtonPress + test al,010b + jnz RButtonPress + jmp messages + +ErrLoadLibs: + ;dps 'Не удалось загрузить необходимые библиотеки' + ;debug_newline + jmp close +ErrorStrp: + ;dps 'Ошибка открытия iconstrp.png' + ;debug_newline +close: + mcall -1 + +LButtonPress: + stdcall GetNumIcon,[MouseX],[MouseY],-1 +;int3 + cmp eax,-1 + jnz @f + + WaitLB1: + mcall 37,2 + test al,001b + jz messages + ;Yield + mcall 5,1 + jmp WaitLB1 + + + @@: + push eax + stdcall DrawIcon,eax,1 + WaitLB: + mcall 37,2 + test al,001b + jz endWaitLB + + mcall 37,0 + xor ebx,ebx + mov bx,ax + shr eax,16 + sub eax,[MouseX] + jns @f + neg eax + @@: + sub ebx,[MouseY] + jns @f + neg ebx + @@: + cmp [bFixIcons],0 + jne @f + cmp eax,MIN_NO_MOVING + ja MovingIcon + cmp ebx,MIN_NO_MOVING + ja MovingIcon + @@: + ;Yield + mcall 5,1 ;Sleep 1 + jmp WaitLB + endWaitLB: + + mcall 37,0 + xor ebx,ebx + mov bx,ax + shr eax,16 + mov ecx,ebx + mov ebx,eax + mov [MouseX],ebx + mov [MouseY],ecx + + stdcall GetNumIcon,[MouseX],[MouseY],-1 + cmp eax,[esp] ;[esp] = номер иконки + jne @f + + mov edi,[IconsOffs+eax*4] + or ecx,-1 + xor al,al + repne scasb + mov ebx,edi + repne scasb + ;run program + mov dword[fiRunProg+8],edi + mov dword[fiRunProg+21],ebx + mcall 70,fiRunProg + test eax,80000000h + jz @f + + mov dword[fiRunProg+8],ErrRunProg + mov dword[fiRunProg+21],pthNotify + mcall 70,fiRunProg + + @@: + pop eax + stdcall RestoreBackgrnd,eax + jmp messages + +;------------------------------------------------------------------------------- +MovingIcon: + stdcall GetNumIcon,[MouseX],[MouseY],-1 + mov [SelIcon],eax + stdcall RestoreBackgrnd,[SelIcon] + +; mov ecx,[MaxNumIcon] +; xor ebx,ebx +; .MI: push ecx +; cmp ebx,[SelIcon] +; je @f +; stdcall DrawIcon,ebx,0 +; @@: +; inc ebx +; pop ecx +; loop .MI + + + +;dps 'Moving' +;debug_newline +; mov edi,[SelIcon] +; mov edi,[IconsOffs+edi*4] +; or ecx,-1 +; xor al,al +; repne scasb +; repne scasb +; repne scasb +; repne scasb +; xor ebx,ebx +; xor esi,esi +; mov bx,word[edi+2] +; mov si,word[edi] +; stdcall GetNumIcon,ebx,esi,[SelIcon] +; cmp eax,-1 +; je @f +; dps 'Q' +; stdcall DrawIcon,eax,0 +; @@: +; +; add ebx,ICON_SIZE-1 +; stdcall GetNumIcon,ebx,esi,[SelIcon] +; cmp eax,-1 +; je @f +; dps 'Q' +; stdcall DrawIcon,eax,0 +; +; @@: +; add esi,ICON_SIZE-1 +; stdcall GetNumIcon,ebx,esi,[SelIcon] +; cmp eax,-1 +; je @f +; dps 'Q' +; stdcall DrawIcon,eax,0 +; +; @@: +; sub ebx,ICON_SIZE-1 +; stdcall GetNumIcon,ebx,esi,[SelIcon] +; cmp eax,-1 +; je @f +; dps 'Q' +; stdcall DrawIcon,eax,0 +; @@: + + +; Sleep 40 + +;qweqwe: + + mov [MovingActiv],1 + mcall 51,1,MovingWnd,stack_dlg ;CreateThread MovingWnd,stack_dlg + .WaitLB: + mcall 37,2 ;GetMouseKey + test al,001b + jz .endWaitLB + + ;Yield + mcall 5,1 ;Sleep 1 + jmp .WaitLB + .endWaitLB: + mov [MovingActiv],0 + + mcall 37,0 ;GetMousePos + xor ebx,ebx + mov bx,ax + shr eax,16 + + add ebx,7 + dec eax + + sub eax,ICON_SIZE/2 + jns @f + xor eax,eax + @@: + sub ebx,ICON_SIZE/2 + jns @f + xor ebx,ebx + @@: + + movzx edx,[ScreenX] + sub edx,ICON_SIZE + cmp eax,edx + jbe @f + mov eax,edx + @@: + + movzx edx,[ScreenY] + sub edx,ICON_SIZE + cmp ebx,edx + jbe @f + mov ebx,edx + @@: + + xor edx,edx + mov dx,[ScreenX] + shr edx,1 + cmp eax,edx + jbe @f + sub ax,[ScreenX] + inc ax + @@: + + xor edx,edx + mov dx,[ScreenY] + shr edx,1 + cmp ebx,edx + jbe @f + sub bx,[ScreenY] + inc bx + @@: + + stdcall SetPosition,[SelIcon],eax,ebx + mcall 15,3 + + m2m [PIcoDB],[BegData] + stdcall [ini_enum_sections],IconIni,Ini_SavePos ;in RButton.inc + +; mov dword[fInfo],2 +; mcall 70,fInfo + + mov [bNotSave],1 + + jmp messages + +;------------------------------------------------------------------------------- + +RButtonPress: + cmp [RButtonActiv],1 + je messages + mov [RButtonActiv],1 + + @@: + mcall 37,2 ;GetMouseKey + test al,010b + jz @f + mcall 5,1 ;Yield + jmp @b + @@: + + mcall 51,1,RButtonWin,stack_dlg ;CreateThread RButtonWin,stack_dlg + + jmp messages + + +;############################################################################### +;ret eax = 1/0 = удача/ошибка +proc DrawIcon NumIcon:DWORD,Activ:DWORD ;NumIcon = 0..n +local IconData:DWORD + ; int3 + push ebx edi esi + + mov ecx,ICON_SIZE*ICON_SIZE + xor eax,eax + ;mov eax,0FFFFFFFh + mov edi,IconArea + rep stosd + + mov eax,[NumIcon] + cmp eax,[MaxNumIcon] + jb @f + xor eax,eax + pop esi edi ebx + ret + @@: + + mov esi,[IconsOffs+eax*4] + mov [IconData],esi + + ;рисуем текст + mov edi,esi + xor al,al + or ecx,-1 + repne scasb + mov edx,esi + mov eax,edi + sub eax,esi + dec eax + shl eax,1 ;*6 + lea eax,[eax*2+eax] + mov ebx,ICON_SIZE + sub ebx,eax + shr ebx,1 ;ebx = x текста + shl ebx,16 + mov bx,ICON_SIZE + sub bx,TEXT_BOTTOM_Y + mov ecx,88000000h + mov edi,IconAreaH + add ebx,-1*10000h+0 + mcall 4 + add ebx,2*10000h+0 + mcall 4 + add ebx,-1*10000h-1 + mcall 4 + add ebx,0*10000h+2 + mcall 4 + add ebx,1*10000h+0 + mcall 4 + add ebx,0*10000h+1 + mcall 4 + add ebx,-1*10000h+0 + mcall 4 + add ebx,0*10000h-2 + mov ecx,88FFFFFFh + mcall 4 + ;рисуем картинку + + mov edi,esi + xor al,al + or ecx,-1 + repne scasb + repne scasb + repne scasb + mov al,[edi] + cmp al,'9' + ja PathToIcon + cmp al,'/' + jne GetIconInd + + PathToIcon: + ;stdcall LoadIcon,edi + ;mov esi,eax + mov al,30h ;заглушка!!!!!!!!!!!!! + mov byte[edi+1],0 + + jmp CopyToMem + GetIconInd: + + sub al,30h + cmp byte[edi+1],0 + je @f + shl eax,1 + lea eax,[eax*4+eax] + xor edx,edx + mov dl,[edi+1] + sub dl,30h + add eax,edx + @@: ;eax=num icon + cmp eax,[icon_count] + jb @f + xor eax,eax + @@: + test eax,eax + je DI1 + mov ecx,eax + xor eax,eax + @@: + add eax,IMG_SIZE*IMG_SIZE*4 + loop @b + DI1: + mov esi,eax + add esi,[raw_pointer] + add esi,0+4*11 + + CopyToMem: + mov edi,IconArea+((IMAGE_TOP_Y*ICON_SIZE)+((ICON_SIZE-IMG_SIZE)/2))*4 + + mov eax,IMG_SIZE + mov edx,eax + @@: + mov ecx,eax + rep movsd + add edi,(ICON_SIZE-IMG_SIZE)*4 + dec edx + jnz @b + +;----------------- + ;если надо, то рисуем обводку + cmp [Activ],0 + je .NoSelect + + mov edi,IconArea + mov eax,0FF000000h + mov ecx,ICON_SIZE + rep stosd + ;mov edi,IconArea+ICON_SIZE*1 + + mov ecx,ICON_SIZE-1 + @@: mov dword[edi],eax + add edi,(ICON_SIZE)*4 + loop @b + + mov edi,IconArea+ICON_SIZE*2*4-4 + mov ecx,ICON_SIZE-1 + @@: mov dword[edi],eax + add edi,(ICON_SIZE)*4 + loop @b + + mov edi,IconArea+ICON_SIZE*(ICON_SIZE-1)*4+4 + mov ecx,ICON_SIZE-2 + rep stosd + + + mov edi,IconArea+ICON_SIZE*4+4 + mov eax,0FFFFFFFFh + mov ecx,ICON_SIZE-2 + rep stosd + + mov edi,IconArea+ICON_SIZE*4+4 + mov ecx,ICON_SIZE-2 + @@: mov dword[edi],eax + add edi,(ICON_SIZE)*4 + loop @b + + mov edi,IconArea+ICON_SIZE*2*4-4*2 + mov ecx,ICON_SIZE-3 + @@: mov dword[edi],eax + add edi,(ICON_SIZE)*4 + loop @b + + mov edi,IconArea+ICON_SIZE*(ICON_SIZE-2)*4+4*2 + mov ecx,ICON_SIZE-3 + rep stosd +;-------------- + + .NoSelect: + mov edi,[IconData] + xor al,al + or ecx,-1 + repne scasb + repne scasb + repne scasb + repne scasb + mov edx,[edi] + + test edx,00008000h + jz @f + add dx,[ScreenY] + @@: + test edx,80000000h + jz @f + rol edx,16 + add dx,[ScreenX] + rol edx,16 + @@: + + mov ebx,IconArea + mov ecx,ICON_SIZE*10000h+ICON_SIZE + mcall 25 + +; mov eax,1 + pop esi edi ebx + ret +endp + + + +proc RestoreBackgrnd,NumIcon:DWORD + push ebx edi + mov eax,[NumIcon] + cmp eax,[MaxNumIcon] + jb @f + xor eax,eax + pop edi ebx + ret + @@: + + mov edi,[IconsOffs+eax*4] + xor al,al + or ecx,-1 + repne scasb + repne scasb + repne scasb + repne scasb + + mov ax,[edi+2] + test ax,8000h + jz @f + add ax,[ScreenX] + @@: + + mov bx,[edi] + test bx,8000h + jz @f + add bx,[ScreenY] + @@: + + mov cx,ax + shl ecx,16 + add ax,ICON_SIZE + mov cx,ax + mov dx,bx + shl edx,16 + add bx,ICON_SIZE + mov dx,bx + dec ecx + dec edx + mcall 15,9 + pop edi ebx + ret +endp + +;ret eax=numIcon +proc AddIcon stdcall,x,y,lpIcon,lpName,lpExeFile,lpParams + push ebx edi esi + + mov eax,[x] + mov ebx,[y] + + xor edx,edx + test eax,8000h + jnz @f + mov dx,[ScreenX] ;если надо, то преобразовываем в + shr edx,1 ;отрицательные координаты + cmp eax,edx + jbe @f + sub ax,[ScreenX] + inc eax + @@: + + test ebx,8000h + jnz @f + mov dx,[ScreenY] + shr edx,1 + cmp ebx,edx + jbe @f + sub bx,[ScreenY] + inc ebx + @@: + ;поправка на случай выхода за край экрана + + test eax,8000h + jnz @f + mov dx,[ScreenX] + sub edx,ICON_SIZE + cmp eax,edx + jbe @f + mov eax,edx + @@: + + test ebx,8000h + jnz @f + mov dx,[ScreenY] + sub edx,ICON_SIZE + cmp ebx,edx + jbe @f + mov ebx,edx + @@: + + mov [x],eax + mov [y],ebx + + xor al,al + or ecx,-1 + mov edi,[lpName] + repne scasb + sub edi,[lpName] + mov ebx,edi + mov edi,[lpExeFile] + repne scasb + sub edi,[lpExeFile] + add ebx,edi + mov edi,[lpParams] + repne scasb + sub edi,[lpParams] + add ebx,edi + mov edi,[lpIcon] + repne scasb + sub edi,[lpIcon] + add ebx,edi + add ebx,4 + mov ecx,dword[SizeData] + add ecx,ebx + mov edx,[IconsOffs] + mcall 68,20 + + mov edx,dword[SizeData] + mov dword[SizeData],ecx + mov dword[BegData],eax + mov edi,eax + add edi,edx + mov esi,[lpName] + @@: lodsb + stosb + test al,al + jnz @b + + mov esi,[lpExeFile] + @@: lodsb + stosb + test al,al + jnz @b + + mov esi,[lpParams] + @@: lodsb + stosb + test al,al + jnz @b + + mov esi,[lpIcon] + @@: lodsb + stosb + test al,al + jnz @b + + mov eax,[x] + mov ebx,[y] + shl eax,16 + mov ax,bx + mov dword[edi],eax + + stdcall FillIconsOffs + + pop esi edi ebx + ret +endp + + +proc EditIcon stdcall,NumIcon,lpIcon,lpName,lpExeFile,lpParams + push edi + mov eax,[NumIcon] + mov edi,[IconsOffs+eax*4] + xor al,al + or ecx,-1 + repne scasb + repne scasb + repne scasb + repne scasb + push dword[edi] + stdcall DelIcon,[NumIcon] + pop edx + xor eax,eax + mov ax,dx + shr edx,16 + stdcall AddIcon,edx,eax,DAreaIcon,DAreaName,DAreaPath,DAreaParams + pop edi + ret +endp + +proc SetPosition stdcall,NumIcon,x,y + push edi + mov eax,[NumIcon] + mov edi,[IconsOffs+eax*4] + xor al,al + or ecx,-1 + repne scasb + repne scasb + repne scasb + repne scasb + mov eax,[x] + shl eax,16 + mov ax,word[y] + mov dword[edi],eax + pop edi + ret +endp + +proc GetNumIcon stdcall,x,y,NumIconI ;номер иконки, который проверять не надо или -1 +local posX:WORD,\ + posY:WORD + push ebx edi + mov ecx,[MaxNumIcon] + test ecx,ecx + jnz @f + or eax,-1 + pop edi ebx + ret + @@: + + xor ebx,ebx + .TestIcon: + cmp dword[NumIconI],-1 + je @f + + cmp ebx,[NumIconI] + jne @f + inc ebx + dec ecx + test ecx,ecx + jz .NoIcon + @@: + + push ecx + + or ecx,-1 + xor al,al + mov edi,[IconsOffs+ebx*4] + repne scasb + repne scasb + repne scasb + repne scasb + + mov ax,[edi+2] + test ax,8000h + jz @f + add ax,[ScreenX] + @@: + mov [posX],ax + + mov ax,[edi] + test ax,8000h + jz @f + add ax,[ScreenY] + @@: + mov [posY],ax + + mov eax,[x] + mov edx,[y] + + cmp ax,[posX] + jb @f + add word[posX],ICON_SIZE + cmp ax,[posX] + ja @f + + cmp dx,[posY] + jb @f + add word[posY],ICON_SIZE + cmp dx,[posY] + ja @f + + jmp .OkIcon + @@: + + inc ebx + pop ecx + + ;loop .TestIcon + dec ecx + jnz .TestIcon + jmp .NoIcon + .OkIcon: + mov eax,ebx + pop edi ebx + ret + .NoIcon: + or eax,-1 + pop edi ebx + ret +endp + +proc DelIcon stdcall,NumIcon + push ebx edi esi + + cmp [MaxNumIcon],0 + je .end + + cmp [MaxNumIcon],1 + je .OhneIco + + mov ebx,[NumIcon] + + mov eax,[MaxNumIcon] + dec eax + mov [MaxNumIcon],eax + cmp ebx,eax + je @f + + shl ebx,2 + + mov ecx,dword[BegData] + add ecx,dword[SizeData] + sub ecx,[IconsOffs+4+ebx] + + mov edx,[IconsOffs+4+ebx] + sub edx,[IconsOffs+ebx] + sub dword[SizeData],edx + + mov esi,[IconsOffs+4+ebx] + mov edi,[IconsOffs+ebx] + rep movsb + jmp .endDel + + @@: + mov ecx,dword[BegData] + add ecx,dword[SizeData] + sub ecx,[IconsOffs+ebx*4] + sub dword[SizeData],ecx + + .endDel: + stdcall FillIconsOffs + jmp .end + +.OhneIco: + mov edi,[BegData] + mov [SizeData],0 + mov dword[edi],0 + mov [MaxNumIcon],0 + mov dword[IconsOffs],0 + .end: + mcall 15,3 + pop esi edi ebx + ret +endp + ;заполняет MaxNumIcon,IconsOffs +proc FillIconsOffs + push ebx edi + mov edi,[BegData] + mov dword[MaxNumIcon],0 + cmp dword[edi],0 + jne @f + mov dword[IconsOffs],0 + pop edi ebx + ret + @@: + + mov [IconsOffs],edi + xor al,al + xor edx,edx + mov ebx,dword[SizeData] + add ebx,dword[BegData] + or ecx,-1 + .CalcNumIc: + repne scasb + repne scasb + repne scasb + repne scasb + add edi,4 + mov dword[IconsOffs+edx+4],edi + inc dword[MaxNumIcon] + add edx,4 + + cmp edi,ebx + jae @f + jmp .CalcNumIc + @@: + + mov dword[IconsOffs+edx],0 + pop edi ebx + ret +endp + +proc LoadIconsData stdcall,f_name,sec_name + push ebx esi edi + + mov edi,secRButt + mov esi,[sec_name] + @@: lodsb + scasb + jnz .lid1 + test al,al + jnz @b + + mov eax,1 + pop edi esi ebx + ret + .lid1: + + mov edi,[PIcoDB] + mov esi,[sec_name] + @@: lodsb + stosb + test al,al + jnz @b + + stdcall [ini_get_str],[f_name],[sec_name],keyPath,edi,4096,0 + test eax,eax + jz @f + xor eax,eax + pop edi esi ebx + ret + @@: + xor al,al + or ecx,-1 + repne scasb + + stdcall [ini_get_str],[f_name],[sec_name],keyParams,edi,4096,0 + test eax,eax + jz @f + xor eax,eax + pop edi esi ebx + ret + @@: + xor al,al + or ecx,-1 + repne scasb + + stdcall [ini_get_str],[f_name],[sec_name],keyIco,edi,4096,0 + test eax,eax + jz @f + xor eax,eax + pop edi esi ebx + ret + @@: + xor al,al + or ecx,-1 + repne scasb + + stdcall [ini_get_int],[f_name],[sec_name],keyX,80000000h + cmp eax,80000000h + jne @f + xor eax,eax + pop edi esi ebx + ret + @@: + mov word[edi+2],ax + + stdcall [ini_get_int],[f_name],[sec_name],keyY,80000000h + cmp eax,80000000h + jne @f + xor eax,eax + pop edi esi ebx + ret + @@: + mov word[edi],ax + add edi,4 + mov [PIcoDB],edi + + mov eax,1 + pop edi esi ebx + ret +endp + +include 'RButton.inc' +include 'DlgAdd.inc' +include 'Moving.inc' +;include 'Ico.inc' + +;'Eolite',0,'/sys/File managers/eolite',0,'/hd0/3/Muzik',0,'1',0,00010001h +;------------------------------------------------------------------------------- +;##### DATA #################################################################### +;------------------------------------------------------------------------------- +; not change this section!!! +; start section +;------------------------------------------------------------------------------ +align 4 +image_file dd 0 ;+0 +raw_pointer dd 0 ;+4 +return_code dd 0 ;+8 +img_size dd 0 ;+12 +deflate_unpack dd 0 ;+16 ; not use for scaling +raw_pointer_2 dd 0 ;+20 ; not use for scaling +;------------------------------------------------------------------------------ +; end section +;------------------------------------------------------------------------------ + + +align 4 +fiStdIco: + dd 5 + dd 0 + dd 0 +.size dd 0 +.point dd bufStdIco + db ICON_STRIP,0 + + +align 4 +fiRunProg: ;для запуска программ + dd 7 + dd 0 + dd 0 + dd 0 + dd ErrNotFoundIni + db 0 + dd pthNotify + +fiIni dd 5 ;для ini файла + dd 0 + dd 0 + dd 0 + dd bufIni + db '/rd/1/icon.ini',0 + + +IconsFile db ICON_STRIP,0 +NameIconsDat db ICONS_DAT,0 +align 4 +MaxNumIcon dd 0 ;количество иконок + +bFixIcons dd 1 +bNotSave dd 0 + +LButtonActiv dd 0 +RButtonActiv dd 0 +MovingActiv dd 0 + +IconIni db '/rd/1/icon.ini',0 + + +;keyName db 'name',0 +keyPath db 'path',0 +keyParams db 'param',0 +keyIco db 'ico',0 +keyX db 'x',0 +keyY db 'y',0 + +;------------------------------------------------------------------------------- +IMPORTS: +library cnv_png,'cnv_png.obj',\ + archiver,'archiver.obj',\ + box_lib,'box_lib.obj',\ + proc_lib,'proc_lib.obj',\ + libini,'libini.obj' + +import cnv_png,\ + cnv_png_import.Start,'START',\ + cnv_png_import.Version,'version',\ + cnv_png_import.Check,'Check_Header',\ + cnv_png_import.Assoc,'Associations' + +import archiver,\ + unpack_DeflateUnpack2,'deflate_unpack2' + +import box_lib,\ + edit_box_draw,'edit_box',\ + edit_box_key,'edit_box_key',\ + edit_box_mouse,'edit_box_mouse',\ + scrollbar_h_draw,'scrollbar_h_draw',\ + scrollbar_h_mouse,'scrollbar_h_mouse' + +import proc_lib,\ + OpenDialog_Init,'OpenDialog_init',\ + OpenDialog_Start,'OpenDialog_start' + +import libini,\ + ini_enum_sections,'ini_enum_sections',\ + ini_enum_keys,'ini_enum_keys',\ + ini_get_str,'ini_get_str',\ + ini_set_str,'ini_set_str',\ + ini_get_color,'ini_get_color',\ + ini_get_int,'ini_get_int',\ + ini_set_int,'ini_set_int',\ + ini_del_section,'ini_del_section' + + +;ini.get_str (f_name, sec_name, key_name, buffer, buf_len, def_val) +;ini.set_str (f_name, sec_name, key_name, buffer, buf_len) + + +;------------------------------------------------------------------------------- +;----- RButton.inc ------------------------------------------------------------- +;------------------------------------------------------------------------------- +secRButt db 'rbmenu',0 + +if lang eq ru + RMenuRedrawFon db 'Перерисовать',0 + RMenuAlign db 'Выровнять по сетке',0 + RMenuAdd db 'Добавить',0 + RMenuDel db 'Удалить',0 + RMenuProp db 'Свойства',0 + RMenuOffMoving db 'Закрепить иконки',0 + RMenuOnMoving db 'Открепить иконки',0 + +else + + RMenuRedrawFon db 'Redraw',0 + RMenuAlign db 'Snap to Grid',0 + RMenuAdd db 'Add',0 + RMenuDel db 'Delete',0 + RMenuProp db 'Properties',0 + RMenuOffMoving db 'Fix the icons',0 + RMenuOnMoving db 'Unfix the icons',0 + +end if + +if lang eq ru + + ErrRunProg db 'Ошибка запуска программы',0 + WarningSave db 'Не забудьте сохранить изменения, запустить RDSave',0 + ErrNotFoundIni db 'Не найден icon.ini',0 + +else + + ErrRunProg db 'Error runing program',0 + WarningSave db 'Do not forget to save the changes, run the RDSave',0 + ErrNotFoundIni db 'icon.ini not found',0 + +end if + + +pthNotify db '/rd/1/@notify',0 + +;------------------------------------------------------------------------------- +;------- AddDlg.inc --------------------------------------------------------------- +;------------------------------------------------------------------------------- +if lang eq ru +DTitle db 'Добавить иконку',0 + +DCaptName db 'Имя',0 +DCaptPath db 'Путь',0 +DCaptParams db 'Параметры',0 +DCaptIcon db 'Иконка',0 +;DCaptChange db '.',0 +DCaptCreate db 'Создать',0 +DCaptProperties db 'Изменить',0 +DCaptCancel db 'Отменить',0 + +else +DTitle db 'Add icon',0 + +DCaptName db 'Name',0 +DCaptPath db 'Path',0 +DCaptParams db 'Parameters',0 +DCaptIcon db 'Icon',0 +;DCaptChange db '.',0 +DCaptCreate db 'Create',0 +DCaptProperties db 'Change',0 +DCaptCancel db 'Cancel',0 +end if + +;/не менять положение +edtName edit_box NAME_LENGTH*6+4,70+20+IMG_SIZE,6,0FFFFFFh,06F9480h,0FFh,0h,0,NAME_LENGTH,\ + DAreaName,mouse_dd,0,0,0 +edtExePath edit_box 281-3-20-IMG_SIZE,70+20+IMG_SIZE,26,0FFFFFFh,06F9480h,0FFh,0h,0,256,\ + DAreaPath,mouse_dd,0,0,0 +edtParams edit_box 295-20-IMG_SIZE,70+20+IMG_SIZE,46,0FFFFFFh,06F9480h,0FFh,0h,0,256,\ + DAreaParams,mouse_dd,0,0,0 +edtIcon edit_box 295-20-IMG_SIZE,70+20+IMG_SIZE,66,0FFFFFFh,06F9480h,0FFh,0h,0,256,\ + DAreaIcon,mouse_dd,0,0,0 +endEdits: +;\ + +sbIcons: + dw END_ICONS_AREAW-ICONSX + dw ICONSX + dw 15 + dw END_ICONS_AREAH+3 + dd 0 + dd 1 + .max_area dd 0 + .cur_area dd ICONS_DRAW_COUNTW + .position dd 0 + .bckg_col dd 0 + .frnt_col dd 0 + .line_col dd 0 + .redraw dd 0 + .delta dd 0 + .delta2 dd 0 + .r_size_x dw 0 + .r_start_x dw 0 + .r_size_y dw 0 + .r_start_y dw 0 + .m_pos dd 0 + .m_pos2 dd 0 + .m_keys dd 0 + .run_size dd 0 + .position2 dd 0 + .work_size dd 0 + .all_redraw dd 0 + .ar_offset dd 0 + +;------------------------------------------------------------------------------- +OpenDialog_data: +.type dd 0 +.procinfo dd RBProcInfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_pach dd temp_dir_pach ;+16 +.dir_default_pach dd communication_area_default_pach ;+20 +.start_path dd open_dialog_path ;+24 +.draw_window dd DRedraw;draw_window_for_OD ;+28 +.status dd 0 ;+32 +.openfile_pach dd DAreaPath;fname_Info ;+36 +.filename_area dd 0;DAreaPath ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 100 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 100 ;+54 ; Window Y position + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_path: + db '/sys/File managers/opendial',0 + +communication_area_default_pach: + db '/sys',0 + +Filter dd 0 + +;open_dialog db 0 +;------------------------------------------------------------------------------- + +;/не разделять +align 4 +IconAreaH dd ICON_SIZE,ICON_SIZE +I_END: +;##### UDATA ################################################################### +IconArea rb 4*ICON_SIZE*ICON_SIZE +;\ + +ScreenX rw 1 +ScreenY rw 1 + +MouseX rd 1 +MouseY rd 1 + +RBSlot rd 1 + +AddX rd 1 +AddY rd 1 + +SelIcon rd 1 + +sc system_colors + +align 4 +bufStdIco rb 40 +IconsOffs rd 100 +PIcoDB rd 1 + +align 4 +icon_count rd 1 +strip_file rd 1 +strip_file_size rd 1 + +cur_band_compensation rd 1 + +;---- RButton ----------------------------------------------------------------------- +bufIni rb 40 +NumUserButt rd 1 +RBUser rd 16*2+1 +RMenuW rw 1 +RMenuH rw 1 +RMenuHsb rw 1 + +MaxPage rd 1 + +mouse_dd rd 1 + +DAreaName rb NAME_LENGTH+1 +DAreaPath rb 256+1 +DAreaParams rb 256+1 +DAreaIcon rb 256+1 + +align 4 +RBProcInfo rb 1024 +align 4 + +; OpenDialog +temp_dir_pach rb 1024 +fname_Info rb 1024 +;------------------------------------------------------------------------------- + rb 1024 +stack_dlg: +align 4 + rb 1024 +stack_area: +;------------------------------------------------------------------------------ +ENDMEM: \ No newline at end of file diff --git a/programs/system/DLGADD.INC b/programs/system/DLGADD.INC new file mode 100644 index 0000000000..7c4874df4a --- /dev/null +++ b/programs/system/DLGADD.INC @@ -0,0 +1,633 @@ +idbChange equ 2 +idbCreate equ 3 +idbLeft equ 4 +idbRight equ 5 +idbCancel equ 1 + +DlgAdd: +DlgProp: + mov eax,[SelIcon] + cmp eax,-1 + jne SetProp + + m2m dword[AddX],dword[MouseX] + m2m dword[AddY],dword[MouseY] + + mov ecx,NAME_LENGTH + mov edi,DAreaName + xor al,al + rep stosb + mov dword[edtName.size],0 + mov dword[edtName.pos],0 + + mov ecx,256 + mov edi,DAreaPath + rep stosb + mov dword[edtExePath.size],0 + mov dword[edtExePath.pos],0 + + mov ecx,256 + mov edi,DAreaParams + rep stosb + mov dword[edtParams.size],0 + mov dword[edtParams.pos],0 + + mov ecx,256 + mov edi,DAreaIcon + rep stosb + mov dword[edtIcon.size],0 + mov dword[edtIcon.pos],0 + + jmp startDlg + ;-------- +SetProp: + mov esi,[IconsOffs+eax*4] + mov edi,DAreaName + xor ecx,ecx + @@: + lodsb + stosb + inc ecx + test al,al + jnz @b + dec ecx + mov dword[edtName.size],ecx + mov dword[edtName.pos],ecx + + xor ecx,ecx + mov edi,DAreaPath + @@: + lodsb + stosb + inc ecx + test al,al + jnz @b + dec ecx + mov dword[edtExePath.size],ecx + mov dword[edtExePath.pos],ecx + + xor ecx,ecx + mov edi,DAreaParams + @@: + lodsb + stosb + inc ecx + test al,al + jnz @b + dec ecx + mov dword[edtParams.size],ecx + mov dword[edtParams.pos],ecx + + xor ecx,ecx + mov edi,DAreaIcon + @@: + lodsb + stosb + inc ecx + test al,al + jnz @b + dec ecx + mov dword[edtIcon.size],ecx + mov dword[edtIcon.pos],ecx + + +startDlg: + or [edtName.flags],ed_focus + + mcall 40,100111b ;SetMaskMessage 100111b + xor eax,eax + mov dword[MaxPage],0 + @@: + add eax,ICONS_DRAW_COUNTW + inc dword[MaxPage] + cmp eax,[icon_count] + jb @b + dec dword[MaxPage] + cmp dword[MaxPage],0 + jne @f + mov dword[MaxPage],1 + @@: + + stdcall [OpenDialog_Init],OpenDialog_data + +DReDraw: + mcall 48,3,sc,40 + + mov eax,[sc.work] + rol eax,16 + add al,9 + jnc @f + mov al,0FFh + @@: + rol eax,16 + add al,9 + jnc @f + mov al,0FFh + @@: + add ah,9 + jnc @f + mov ah,0FFh + @@: + + mov [sbIcons.bckg_col],eax + m2m [sbIcons.frnt_col],[sc.work] + m2m [sbIcons.line_col],[sc.work_graph] + + edit_boxes_set_sys_color edtName,edtExePath,sc + edit_boxes_set_sys_color edtExePath,edtParams,sc + edit_boxes_set_sys_color edtParams,edtIcon,sc + edit_boxes_set_sys_color edtIcon,endEdits,sc + + call DRedraw + +DMessages: + mcall 10 ;WaitMessage + + dec eax + jz DReDraw + dec eax + jz DKey + dec eax + jz DButton + sub eax,3 + jz DMouse + + jmp DMessages + + +;--------------------------------------------------------------------- +DKey: + mcall 2 ;GetKeyPressed + cmp ah,1Bh + je DExit + cmp ah,9 ;Tab + je DNextEdit + stdcall [edit_box_key],edtName + stdcall [edit_box_key],edtExePath + stdcall [edit_box_key],edtParams + stdcall [edit_box_key],edtIcon + + jmp DMessages + + +DNextEdit: + test [edtName.flags],ed_focus + jne .DNE1 + test [edtExePath.flags],ed_focus + jne .DNE2 + test [edtParams.flags],ed_focus + jne .DNE3 + test [edtIcon.flags],ed_focus + jne .DNE4 + jmp DMessages + + .DNE1: + and [edtName.flags],not ed_focus + or [edtExePath.flags],ed_focus + stdcall [edit_box_draw],edtName + stdcall [edit_box_draw],edtExePath + jmp DMessages + + .DNE2: + and [edtExePath.flags],not ed_focus + or [edtParams.flags],ed_focus + stdcall [edit_box_draw],edtExePath + stdcall [edit_box_draw],edtParams + jmp DMessages + + .DNE3: + and [edtParams.flags],not ed_focus + or [edtIcon.flags],ed_focus + stdcall [edit_box_draw],edtParams + stdcall [edit_box_draw],edtIcon + jmp DMessages + + .DNE4: + and [edtIcon.flags],not ed_focus + or [edtName.flags],ed_focus + stdcall [edit_box_draw],edtName + stdcall [edit_box_draw],edtIcon + jmp DMessages +;--------------------------------------------------------------------- +DButton: + mcall 17 ;GetButtonPressed + cmp ah, idbCancel + je DExit + cmp ah,idbChange + je DSetExePath + cmp ah,idbCreate + je DSaveIcon + + jmp DMessages +;------------------------------------------------------------------------------- +DMouse: + stdcall [edit_box_mouse],edtName + stdcall [edit_box_mouse],edtExePath + stdcall [edit_box_mouse],edtParams + stdcall [edit_box_mouse],edtIcon + + push [sbIcons.position] + stdcall [scrollbar_h_mouse],sbIcons + pop eax + cmp eax,[sbIcons.position] + je @f + call DrawStdIcons + @@: + + mcall 37,2 ;GetMouseKey + test eax,1 + jz DMessages + mcall 37,1 ;GetMouseWinPos + + test eax,10001000h + jne DMessages + xor edx,edx + mov dx,ax ;y + shr eax,16 ;x + + sub eax,ICONSX + js DMessages + sub edx,ICONSY + js DMessages + + cmp eax,(IMG_SIZE+SPCW)*ICONS_DRAW_COUNTW-SPCW + ja DMessages + cmp edx,(IMG_SIZE+SPCH)*ICONS_DRAW_COUNTH-SPCH + ja DMessages + + xor ebx,ebx + mov ecx,[sbIcons.position] + test ecx,ecx + jz .DM + @@: + add ebx,ICONS_DRAW_COUNTH + loop @b + .DM: + + sub eax,IMG_SIZE+SPCW + js .DM1 + @@: + add ebx,ICONS_DRAW_COUNTH + sub eax,IMG_SIZE+SPCW + jns @b + .DM1: + + + sub edx,IMG_SIZE+SPCH + js .DM2 + @@: + inc ebx + sub edx,IMG_SIZE+SPCH + jns @b + .DM2: + + mov eax,ebx + + cmp eax,[icon_count] + jae DMessages + + mov bl,10 + div bl + + add ah,30h + test al,al + jz @f + + add al,30h + mov byte[DAreaIcon],al + mov byte[DAreaIcon+1],ah + mov byte[DAreaIcon+2],0 + mov dword[edtIcon.size],2 + jmp .RedrawNum + + @@: + mov byte[DAreaIcon],ah + mov byte[DAreaIcon+1],0 + mov dword[edtIcon.size],1 + jmp .RedrawNum + .RedrawNum: + + + stdcall [edit_box_draw],edtIcon + + + call DrawSelIcon + jmp DReDraw;DMessages; +;------------------------------------------------------------------------------- +DSetExePath: + stdcall [OpenDialog_Start],OpenDialog_data + mov edi,DAreaPath + xor al,al + or ecx,-1 + repne scasb + sub edi,DAreaPath + dec edi + mov dword[edtExePath+12*4],edi + + jmp DMessages;DReDraw; + +DSaveIcon: + mov dword[fiRunProg+8],WarningSave + mov dword[fiRunProg+21],pthNotify + mcall 70,fiRunProg + + + cmp [SelIcon],-1 + je @f + ;удаляем из ini старую иконку + mov ebx,[SelIcon] + mov eax,[IconsOffs+ebx*4] + stdcall [ini_del_section],IconIni,eax + + stdcall EditIcon,[SelIcon],DAreaIcon,DAreaName,DAreaPath,DAreaParams + jmp DExitAndSave + @@: + stdcall AddIcon,[AddX],[AddY],DAreaIcon,DAreaName,DAreaPath,DAreaParams + ;jmp DExitAndSave +;------------------------------------------------------------------------------- +DExitAndSave: + + stdcall [ini_set_str],IconIni,DAreaName,keyPath,DAreaPath,dword[edtExePath.size] + stdcall [ini_set_str],IconIni,DAreaName,keyParams,DAreaParams,dword[edtParams.size] + stdcall [ini_set_str],IconIni,DAreaName,keyIco,DAreaIcon,dword[edtIcon.size] + stdcall [ini_set_int],IconIni,DAreaName,keyX,[MouseX] + stdcall [ini_set_int],IconIni,DAreaName,keyY,[MouseY] + +DExit: + mcall -1 ;ExitProcess + +;################################################################## +proc DRedraw + mcall 12,1 ;RedrawWinBeg + mov edx,[sc.work] + or edx,33000000h + mcall 0,<100,400>,<100,(IMG_SIZE+SPCH)*ICONS_DRAW_COUNTH+185>,,,DTitle + + stdcall [edit_box_draw],edtName + stdcall [edit_box_draw],edtExePath + stdcall [edit_box_draw],edtParams + stdcall [edit_box_draw],edtIcon + + call DrawStdIcons + + + stdcall [scrollbar_h_draw],sbIcons + mcall 38,,\ + ,\ + [sc.work_graph] + mcall ,,\ + ,\ + [sc.work_graph] + + mcall ,,\ + ,\ + [sc.work_graph] + mcall ,,\ + ,\ + [sc.work_graph] + + ;BUTTONS + mcall 8,<250,49>,<30+END_ICONS_AREAH,16>,idbCreate,[sc.work_button] + mcall ,<305,54>, ,idbCancel + mcall ,<351,14>,<26,14> ,idbChange + + ;CAPTIONS + mov ecx,[sc.work_text] + or ecx,80000000h + mcall 4,<30+IMG_SIZE,10>,,DCaptName + mcall ,<30+IMG_SIZE,30>,,DCaptPath + mcall ,<30+IMG_SIZE,50>,,DCaptParams + mcall ,<30+IMG_SIZE,70>,,DCaptIcon + +if lang eq ru + mov ecx,[sc.work_button_text] + or ecx,80000000h + mcall ,<309,35+END_ICONS_AREAH>,,DCaptCancel + + cmp [SelIcon],-1 + jne @f + mpack ebx,255,35+END_ICONS_AREAH + mov edx,DCaptCreate + jmp .DRD1 + @@: + mpack ebx,252,35+END_ICONS_AREAH + mov edx,DCaptProperties + .DRD1: +else + mov ecx,[sc.work_button_text] + or ecx,80000000h + mcall ,<315,35+END_ICONS_AREAH>,,DCaptCancel + + + cmp [SelIcon],-1 + jne @f + mpack ebx,257,35+END_ICONS_AREAH + mov edx,DCaptCreate + jmp .DRD1 + @@: + mpack ebx,257,35+END_ICONS_AREAH + mov edx,DCaptProperties + .DRD1: +end if + mcall + + mcall 1,351+4 ,26+10,[sc.work_button_text] + mcall ,351+4+3,26+10, + mcall ,351+4+6,26+10, + + call DrawSelIcon + + mcall 12,2 ;RedrawWinEnd + ret +endp + + +proc DrawStdIcons +local IcoX:DWORD,\ + IcoY:DWORD,\ + iIcon:DWORD + + mov ecx,[sbIcons.position] + xor eax,eax + m2m dword[iIcon],0 + + test ecx,ecx + jz .DST1 + @@: + add [iIcon],ICONS_DRAW_COUNTH + add eax,IMG_SIZE*IMG_SIZE*4*ICONS_DRAW_COUNTH + loop @b + .DST1: + + lea esi,[eax+44] + add esi,[raw_pointer] + + mov [IcoX],ICONSX + + + mov ecx,ICONS_DRAW_COUNTW + .DrawIcons: + push ecx + + mov [IcoY],ICONSY + + mov ecx,ICONS_DRAW_COUNTH + .DrawIcoStolb: + push ecx + + mov edi,IconArea + mov edx,IMG_SIZE + + .DrawLine: + + + mov ecx,IMG_SIZE + .DrawPix: + + lodsd + test eax,0FF000000h + jnz @f + mov eax,[sc.work] + @@: + + mov word[edi],ax + shr eax,16 + mov [edi+2],al + add edi,3 + + loop .DrawPix + + dec edx + jnz .DrawLine + + mov edx,[IcoX] + shl edx,16 + mov dx,word[IcoY] + mcall 7,IconArea, + + inc [iIcon] + mov eax,[iIcon] + cmp eax,[icon_count] + jae .endDrawIcon + + add dword[IcoY],IMG_SIZE+SPCH + pop ecx + loop .DrawIcoStolb + + add dword[IcoX],IMG_SIZE+SPCW + pop ecx + loop .DrawIcons + jmp .endProc + + .endDrawIcon: + + mov ecx,IMG_SIZE*IMG_SIZE + mov edi,IconArea + mov eax,[sc.work] + mov ebx,eax + shr ebx,16 + @@: + mov word[edi],ax + mov [edi+2],bl + add edi,3 + loop @b + + ;затирание не использованых мест + jmp .Dalee + + .DrawIcons2: + push ecx + + mov [IcoY],ICONSY + mov ecx,ICONS_DRAW_COUNTH + .DrawIcoStolb2: + push ecx + + mov edx,[IcoX] + shl edx,16 + mov dx,word[IcoY] + mcall 7,IconArea, + + .Dalee: + add dword[IcoY],IMG_SIZE+SPCH + pop ecx + loop .DrawIcoStolb2 + + add dword[IcoX],IMG_SIZE+SPCW + pop ecx + loop .DrawIcons2 + + .endProc: + ret +endp + +proc DrawSelIcon + mov edi,DAreaIcon + cmp byte[edi],0 + jne @f + ret + @@: + + mov al,[edi] + cmp al,'9' + ja .PathToIcon + cmp al,'/' + jne .GetIconInd + .PathToIcon: + mov al,30h ;заглушка!!!!!!!!!!!!! + mov byte[edi+1],0 + .GetIconInd: +;int3 + sub al,30h + cmp byte[edi+1],0 + je @f + shl eax,1 + lea eax,[eax*4+eax] + xor edx,edx + mov dl,[edi+1] + sub dl,30h + add eax,edx + @@: ;eax=num icon + cmp eax,[icon_count] + jb @f + xor eax,eax + @@: + test eax,eax + je .DI1 + mov ecx,eax + xor eax,eax + @@: + add eax,IMG_SIZE*IMG_SIZE*4 + loop @b + .DI1: + mov esi,eax + add esi,[raw_pointer] + add esi,44 + + mov edi,IconArea + mov edx,IMG_SIZE + .DrawLine: + + mov ecx,IMG_SIZE + .DrawPix: + + lodsd + test eax,0FF000000h + jnz @f + mov eax,[sc.work] + @@: + + mov word[edi],ax + shr eax,16 + mov [edi+2],al + add edi,3 + + loop .DrawPix + + dec edx + jnz .DrawLine + + mcall 7,IconArea,,<15,25> + + ret +endp \ No newline at end of file diff --git a/programs/system/ICON.INI b/programs/system/ICON.INI new file mode 100644 index 0000000000..19b9fa0867 --- /dev/null +++ b/programs/system/ICON.INI @@ -0,0 +1,173 @@ +[rbmenu] +Консоль=/rd/1/shell +Диспетчер процессов=/rd/1/cpu +Управление темой=desktop +Настройка устройств=setup +[KFM] +path=/SYS/FILE MANAGERS/KFM +param= +ico=5 +x=0 +y=0 +[TINYPAD] +path=/SYS/TINYPAD +param= +ico=9 +x=0 +y=68 +[EOLITE] +path=/SYS/FILE MANAGERS/EOLITE +param= +ico=2 +x=68 +y=0 +[SHELL] +path=/SYS/SHELL +param= +ico=20 +x=136 +y=0 +[KFAR] +path=/SYS/FILE MANAGERS/KFAR +param= +ico=16 +x=68 +y=68 +[RDSAVE] +path=/SYS/RDSAVE +param= +ico=17 +x=0 +y=136 +[CALC] +path=/SYS/CALC +param= +ico=4 +x=68 +y=136 +[ANIMAGE] +path=/SYS/MEDIA/ANIMAGE +param= +ico=15 +x=136 +y=68 +[KPACK] +path=/SYS/KPACK +param= +ico=10 +x=-67 +y=0 +[SNAKE] +path=/SYS/GAMES/SNAKE +param= +ico=3 +x=-135 +y=-135 +[MINE] +path=/SYS/GAMES/MINE +param= +ico=14 +x=-67 +y=-67 +[LIFE2] +path=/SYS/DEMOS/LIFE2 +param= +ico=13 +x=-135 +y=-67 +[MBLOCKS] +path=/SYS/GAMES/MBLOCKS +param= +ico=11 +x=-67 +y=-135 +[PONG] +path=/SYS/GAMES/PONG3 +param= +ico=12 +x=-203 +y=-67 +[15] +path=/SYS/GAMES/15 +param= +ico=0 +x=-271 +y=-67 +[DOCPACK] +path=/SYS/DOCPACK +param= +ico=8 +x=-67 +y=68 +[BOARD] +path=/SYS/DEVELOP/BOARD +param= +ico=19 +x=-135 +y=0 +[HEXEDIT] +path=/SYS/DEVELOP/HEED +param= +ico=22 +x=-67 +y=136 +[MTDBG] +path=/SYS/DEVELOP/MTDBG +param= +ico=6 +x=-203 +y=0 +[PIPES] +path=/SYS/GAMES/PIPES +param= +ico=26 +x=0 +y=-135 +[SUDOKU] +path=/SYS/GAMES/SUDOKU +param= +ico=25 +x=0 +y=-67 +[GOMOKU] +path=/SYS/GAMES/GOMOKU +param= +ico=24 +x=68 +y=-67 +[XONIX] +path=/SYS/GAMES/XONIX +param= +ico=21 +x=68 +y=-135 +[CHECKERS] +path=/SYS/GAMES/CHECKERS +param= +ico=1 +x=-271 +y=-135 +[KOSILKA] +path=/SYS/GAMES/KOSILKA +param= +ico=23 +x=136 +y=-67 +[FLOOD-IT] +path=/SYS/GAMES/FLOOD-IT +param= +ico=27 +x=136 +y=-135 +[FASM] +path=/SYS/DEVELOP/FASM +param= +ico=10 +x=-135 +y=68 +[CLICKS] +path=/SYS/GAMES/CLICKS +param= +ico=18 +x=513 +y=287 diff --git a/programs/system/MOVING.INC b/programs/system/MOVING.INC new file mode 100644 index 0000000000..0e4bd5869c --- /dev/null +++ b/programs/system/MOVING.INC @@ -0,0 +1,121 @@ +proc MovingWnd +local MySlot:DWORD + mcall 40,0 ;SetMaskMessage 000b + + mcall 12,1 ;RedrawWinBeg + + mcall 14 + xor ebx,ebx + xor ecx,ecx + mov cx,ax + shr eax,16 + mov cx,ax + dec ebx + dec ecx + mcall 0,,,01000000h + ;mcall 0,IMG_SIZE,IMG_SIZE,01000000h + mcall 12,2 ;RedrawWinEnd + + + mov eax,[SelIcon] + call DrawIconToArea + + mcall 37,4,IconArea,10100002h + push eax + test eax,eax + jz @f + mov ecx,eax + mcall 37,5 + + @@: + mcall 9,RBProcInfo,-1 ;+30 + mcall 18,21,dword[RBProcInfo+30] + mov [MySlot],eax + + .messages: + cmp [MovingActiv],1 + jne .close + mcall 18,7 + cmp eax,[MySlot] + je @f + mcall 18,3,[MySlot] + @@: + + mcall 5,1 ;Yield + jmp .messages + +.close: + pop ecx + test ecx,ecx + jz @f + mcall 37,6 + @@: + + + mcall -1 + +endp + + + +;eax = NumIcon +proc DrawIconToArea ;предназначен для иконок размером = 32x32 + push edi esi + + ;mov eax,[NumIcon] + mov edi,[IconsOffs+eax*4] + xor al,al + or ecx,-1 + repne scasb + repne scasb + repne scasb + mov al,[edi] + cmp al,'9' + ja .PathToIcon + cmp al,'/' + jne .GetIconInd + .PathToIcon: + mov al,30h ;заглушка!!!!!!!!!!!!! + mov byte[edi+1],0 + .GetIconInd: +;int3 + sub al,30h + cmp byte[edi+1],0 + je @f + shl eax,1 + lea eax,[eax*4+eax] + xor edx,edx + mov dl,[edi+1] + sub dl,30h + add eax,edx + @@: ;eax=num icon + cmp eax,[icon_count] + jb @f + xor eax,eax + @@: + test eax,eax + je .DIA + mov ecx,eax + xor eax,eax + @@: + add eax,32*32*4;IMG_SIZE*IMG_SIZE*4 + loop @b + .DIA: + mov esi,eax + add esi,[raw_pointer] + add esi,44 + + mov edi,IconArea;+((IMAGE_TOP_Y*ICON_SIZE)+((ICON_SIZE-IMG_SIZE)/2))*4 +;int3 + mov eax,32;IMG_SIZE + mov edx,eax + @@: + mov ecx,eax + rep movsd + ; add edi,32*4 + dec edx + jnz @b + + pop esi edi + ret +endp diff --git a/programs/system/RBUTTON.INC b/programs/system/RBUTTON.INC new file mode 100644 index 0000000000..0bfb5659a8 --- /dev/null +++ b/programs/system/RBUTTON.INC @@ -0,0 +1,545 @@ +if lang eq ru +MinRMenuW equ 18*6+10 +else +MinRMenuW equ 15*6+10 +end if + +idbRRedrawFon equ 100 +idbRAlign equ 101 +idbRFixIcons equ 102 +idbRAdd equ 103 +idbRDel equ 104 +idbRProp equ 105 + +;---- thread for rbutton ----------------------------------------------------------------------- +RButtonWin: + mcall 40,100101b ;SetMaskMessage 100101b + + stdcall GetNumIcon,[MouseX],[MouseY],-1 + mov [SelIcon],eax + + cmp eax,-1 + jne @f + mov [RMenuH],16*4+3+3 + mov [RMenuHsb],16*4+3+3 + jmp .rbw1 + @@: + mov [RMenuH],16*5+3+3 + mov [RMenuHsb],16*5+3+3 + .rbw1: + + mov [NumUserButt],0 + mov [RMenuW],0 + mcall 70,fiIni + mcall 68,12,dword[bufIni+32] + mov [RBUser],eax + stdcall [ini_enum_keys],IconIni,secRButt,GetUserBut + + +RBWRedraw: + mcall 12,1 ;RedrawWinBeg + mov ebx,[MouseX] + shl ebx,16 + mov bx,[RMenuW] + mov ecx,[MouseY] + shl ecx,16 + mov cx,[RMenuH] + mov edx,0177CCFFh + mov esi,01000000h + xor eax,eax + int 40h + + ;----------- + mov ecx,[NumUserButt] + .DrawUB: + push ecx + + mov eax,[NumUserButt] + sub eax,ecx + mov edx,eax ;button ID + shl eax,4+16 ;*16*10000h + mov ecx,eax + mov cx,16 + + xor ebx,ebx + mov bx,[RMenuW] + mov esi,0888888h + mcall 8 + + mov ebx,50000h + shr ecx,16 + mov bx,cx + add bx,5 + + mov ecx,80000000h + + mov eax,[NumUserButt] + sub eax,[esp] + mov edx,[RBUser+eax*8] + + mcall 4 + + pop ecx + loop .DrawUB + + ;----------- + xor ebx,ebx + mov bx,[RMenuW] + mov cx,[RMenuH] + sub cx,[RMenuHsb] + push ecx + mov dx,cx + shl ecx,16 + mov cx,dx + + ;первая разделительная линия + mcall 38,,,0888888h + add ecx,00010001h + mcall ,,, + + ;------------ + mov ecx,[esp] + add ecx,2 + shl ecx,16 + mov cx,16 + + mcall 8,,,idbRRedrawFon,0888888h ;3 кнопки второго блока + add ecx,00100000h + mcall ,,,idbRAlign + add ecx,00100000h + mcall ,,,idbRFixIcons + + mov ebx,50000h + mov bx,word[esp] + add bx,2+5 + mcall 4,,80000000h,RMenuRedrawFon + add ebx,16 + mcall ,,,RMenuAlign + + add ebx,16 + cmp [bFixIcons],0 + jne @f + mov edx,RMenuOffMoving + jmp .RBWR1 + @@: + mov edx,RMenuOnMoving + .RBWR1: + mcall + + ;------------ + xor ebx,ebx ;вторая разделительная линия + mov bx,[RMenuW] + mov ecx,[esp] + add ecx,16*3+2 + mov dx,cx + shl ecx,16 + mov cx,dx + mcall 38,,,0888888h + add ecx,00010001h + mcall ,,, + ;------------ + ;1 или 2 кнопки третьего блока + mov ecx,[esp] + add ecx,16*3+4 + shl ecx,16 + mov cx,16 + cmp dword[SelIcon],-1 + je @f + + mcall 8,,,idbRDel,0888888h + add ecx,00100000h + mcall ,,,idbRProp,0888888h + + mov ebx,50000h + mov bx,word[esp] + add bx,16*3+4+5 + mcall 4,,80000000h,RMenuDel + add bx,16 + mcall ,, ,RMenuProp + + jmp .endRM + @@: + + mcall 8,,,idbRAdd,0888888h + mov ebx,50000h + mov bx,word[esp] + add bx,16*3+4+5 + mcall 4,,80000000h,RMenuAdd + + .endRM: + + pop ecx + mcall 12,2 ;RedrawWinEnd + + mcall 9,RBProcInfo,-1 ;GetThreadInfo RBProcInfo,-1 + mcall 18,21,dword[RBProcInfo+30] + m2m dword[RBSlot],eax + +RBWMessages: + mcall 10 ;WaitMessage + dec eax + jz RBWRedraw + sub eax,2 + jz RBWButton + sub eax,3 + jz RBWMouse + jmp RBWMessages + +RBWButton: + mcall 17 ;GetButtonPressed + shr eax,8 + cmp eax,idbRRedrawFon + jz RBRedrawFon + cmp eax,idbRAlign + jz RBAlign + cmp eax,idbRFixIcons + jz RBFixIcons + cmp eax,idbRAdd + jz RBAdd + cmp eax,idbRDel + jz RBDelete + cmp eax,idbRProp + jz RBPropeties + + cmp eax,[NumUserButt] + ja @f + + mov eax,[RBUser+eax*8+4] + mov dword[fiRunProg+8],0 + mov dword[fiRunProg+21],eax + mcall 70,fiRunProg + @@: + jmp RBWExit + +RBWMouse: + mcall 37,2 ;GetMouseKey + test eax,111b + jz RBWMessages + mcall 37,0 ;GetMousePos + xor ebx,ebx + mov bx,ax ;y + shr eax,16 ;x + + xor ecx,ecx + mov cx,bx + mov bx,ax + + mcall 34 + cmp eax,[RBSlot] + je RBWMessages + +RBWExit: + mcall 68,13,[RBUser] + mov [RButtonActiv],0 + mcall -1 ;ExitProcess + + +RBRedrawFon: + mcall 15,3 + jmp RBWExit + +RBAlign: + call AlignIcons + + m2m [PIcoDB],[BegData] + stdcall [ini_enum_sections],IconIni,Ini_SavePos + + mov dword[fiRunProg+8],WarningSave + mov dword[fiRunProg+21],pthNotify + mcall 70,fiRunProg + mov [bNotSave],0 + + jmp RBRedrawFon + +RBFixIcons: + xor dword[bFixIcons],1 + + cmp [bNotSave],0 + je @f + + mov dword[fiRunProg+8],WarningSave + mov dword[fiRunProg+21],pthNotify + mcall 70,fiRunProg + mov [bNotSave],0 + + @@: + jmp RBWExit + +RBAdd: + ; mov [DlgAddActiv],1 + mcall 51,1,DlgAdd,stack_dlg ;CreateThread DlgAdd,stack_dlg + jmp RBWExit + +RBDelete: + + mov eax,[SelIcon] + mov eax,[IconsOffs+eax*4] + stdcall [ini_del_section],IconIni,eax + + stdcall DelIcon,[SelIcon] + ; mov dword[fiStdIco],2 + ; m2m dword[fInfo+12],dword[SizeData] + ; mcall 70,fInfo + + mov dword[fiRunProg+8],WarningSave + mov dword[fiRunProg+21],pthNotify + mcall 70,fiRunProg + mov [bNotSave],0 + + jmp RBRedrawFon + +RBPropeties: + ; mov [DlgAddActiv],1 + mcall 51,1,DlgProp,stack_dlg ;CreateThread DlgProp,stack_dlg + jmp RBWExit + + + +proc AlignIcons +local posX:WORD,\ + posY:WORD,\ + negatX:WORD,\ + negatY:WORD + + xor ebx,ebx + + mov ecx,[MaxNumIcon] + test ecx,ecx + jnz .AlignIco + ret + .AlignIco: + push ecx + or ecx,-1 + mov edi,dword[IconsOffs+ebx] + xor eax,eax + repne scasb + repne scasb + repne scasb + repne scasb + + mov dword[negatX],0 + + ;-------- преобразуем координаты в положительные + mov ax,[edi+2] + test ax,8000h + jz @f + neg ax + mov word[negatX],1 + @@: + mov [posX],ax + + mov ax,[edi] + test ax,8000h + jz @f + neg ax + mov word[negatY],1 + @@: + mov [posY],ax + + ;----- + mov ax,[posY] + mov dx,ALIGN_SIZE + + cmp ax,dx + jb .AI0 + @@: sub ax,dx + cmp ax,dx + jae @b + .AI0: + + mov dx,ax + cmp dx,ALIGN_SIZE/2 + jb .AI1 + + mov ax,ALIGN_SIZE + sub ax,dx + add [posY],ax + + jmp .AI2 + .AI1: + sub [posY],dx + .AI2: + ;----- + mov ax,[posX] + mov dx,ALIGN_SIZE + + cmp ax,dx + jb .AI3 + @@: sub ax,dx + cmp ax,dx + jae @b + .AI3: + + mov dx,ax + cmp dx,ALIGN_SIZE/2 + jb .AI4 + + mov ax,ALIGN_SIZE + sub ax,dx + add [posX],ax + + jmp .AI5 + .AI4: + sub [posX],dx + .AI5: + + ;----- преобразование назад и поправка в отрицательных координат + mov ax,[posX] + + cmp [negatX],1 + jne @f + neg ax + inc ax + jmp .AI6 + @@: + + mov dx,[ScreenX] + shr dx,1 + cmp ax,dx + jbe .AI6 + sub ax,[ScreenX] + .AI6: + mov word[edi+2],ax + + + mov ax,[posY] + cmp [negatY],1 + jne @f + neg ax + inc ax + jmp .AI7 + @@: + + mov dx,[ScreenY] + shr dx,1 + cmp ax,dx + jbe .AI7 + sub ax,[ScreenY] + .AI7: + mov word[edi],ax + + ;-------- + + + + pop ecx + add ebx,4 + dec ecx + jnz .AlignIco +; loop .AlignIco + + +; mov dword[fInfo],2 +; mcall 70,fInfo + ret +endp + +;------------------------------------------------------------------------------- +proc GetUserBut stdcall,f_name,sec_name,key_name,key_value + cmp [NumUserButt],16 + jne @f + ret + @@: + + push ebx esi edi + + mov edi,[key_name] ;определяем ширину меню + xor eax,eax + or ecx,-1 + repne scasb + sub edi,[key_name] + mov eax,edi + shl eax,1 + lea eax,[eax*2+eax+5*2] + cmp ax,[RMenuW] + jbe @f + mov [RMenuW],ax + @@: + cmp [RMenuW],MinRMenuW + jae @f + mov [RMenuW],MinRMenuW + @@: + + mov ebx,[NumUserButt] + + mov esi,[key_name] + mov edi,[RBUser+ebx*8] + @@: lodsb + stosb + test al,al + jnz @b + +;debug_newline + + + mov [RBUser+ebx*8+4],edi + mov esi,[key_value] + @@: lodsb + stosb + test al,al + jnz @b + + mov [RBUser+ebx*8+8],edi + + inc [NumUserButt] + add [RMenuH],16 + + pop edi esi ebx + mov eax,1 + ret +endp + +proc Ini_SavePos stdcall,f_name,sec_name + push ebx edi esi +;int3 + xor ebx,ebx + .SearchSect: + mov edi,[IconsOffs+ebx*4] + mov esi,[sec_name] + @@: + lodsb + scasb + jne @f + test al,al + jnz @b + + jmp .IcoDataFound + @@: + + inc ebx + cmp ebx,[MaxNumIcon] + jb .SearchSect + + mov eax,1 + pop esi edi ebx + ret + +.IcoDataFound: + or ecx,-1 + repne scasb + repne scasb + repne scasb + + movzx eax,word[edi+2] + test eax,8000h + jz @f + or eax,0FFFF0000h + @@: + + stdcall [ini_set_int],[f_name],[sec_name],keyX,eax + + movzx eax,word[edi] + test eax,8000h + jz @f + or eax,0FFFF0000h + @@: + + stdcall [ini_set_int],[f_name],[sec_name],keyY,eax + + mov eax,1 + pop esi edi ebx + ret +endp + + + diff --git a/programs/system/readme.txt b/programs/system/readme.txt new file mode 100644 index 0000000000..c867877545 --- /dev/null +++ b/programs/system/readme.txt @@ -0,0 +1,5 @@ + ─рээр  яЁюуЁрььр чрьхэ хЄ ёЄрэфрЁЄэ√щ icon. + ─ы  єёЄрэютъш т ёшёЄхьє ёъюяшЁєщЄх @icon ш icon.ini т ёшёЄхьэ√щ +фшёъ. ╙схЁшЄх шч Autorun.dat ёЄЁюъш ё чряєёъюь @rb ш icon ш фюсрт№Єх +ёЄЁюъє ё чряєёъюь @icon (схч ярЁрьхЄЁют, їюЄ  ¤Єю эх трцэю). ╤юїЁрэшЄх +ёшёЄхьэ√щ фшёъ ш яхЁхчруЁєчшЄх. ┬ё╕, яЁюуЁрььр єёЄрэютыхэр. \ No newline at end of file