Subversion Repositories Kolibri OS

Rev

Rev 528 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;    UNIFORM WINDOW COLOURS & SKIN
  3. ;
  4. ;    Compile with FASM for Menuet
  5. ;
  6. ;    < russian edition by Ivan Poddubny >
  7. ;    < skin selection by Mike Semenyako >
  8. ;
  9.  
  10. ;******************************************************************************
  11.    use32
  12.    org     0
  13.    db      'MENUET01'  ; identifier
  14.    dd      1           ; header version
  15.    dd      START       ; start address
  16.    dd      I_END       ; file size
  17.    dd      28000h      ; memory
  18.    dd      10000h      ; stack pointer
  19.    dd      param,0     ; parameters, reserved
  20.  
  21.    include 'lang.inc'
  22.    include '..\..\..\macros.inc'
  23.    include 'kglobals.inc'
  24.    include 'unpacker.inc'
  25. ;******************************************************************************
  26.  
  27.  
  28. struct SKIN_HEADER
  29.   ident   dd ?
  30.   version dd ?
  31.   params  dd ?
  32.   buttons dd ?
  33.   bitmaps dd ?
  34. ends
  35.  
  36. struct SKIN_PARAMS
  37.   skin_height    dd ?
  38.   margin.right   dw ?
  39.   margin.left    dw ?
  40.   margin.bottom  dw ?
  41.   margin.top     dw ?
  42.   colors.inner   dd ?
  43.   colors.outer   dd ?
  44.   colors.frame   dd ?
  45.   colors_1.inner dd ?
  46.   colors_1.outer dd ?
  47.   colors_1.frame dd ?
  48.   dtp.size       dd ?
  49.   dtp.data       db 40 dup (?)
  50. ends
  51.  
  52. struct SKIN_BUTTONS
  53.   type     dd ?
  54.   pos:
  55.     left   dw ?
  56.     top    dw ?
  57.   size:
  58.     width  dw ?
  59.     height dw ?
  60. ends
  61.  
  62. struct SKIN_BITMAPS
  63.   kind  dw ?
  64.   type  dw ?
  65.   _data  dd ?
  66. ends
  67.  
  68.  
  69. START:                          ; start of execution
  70.     mov  eax,48                 ; get current colors
  71.     mov  ebx,3
  72.     mov  ecx,color_table
  73.     mov  edx,4*10
  74.     mcall
  75.  
  76.         mov     esi, param
  77.         cmp     byte [esi], 0
  78.         jnz     has_param
  79.  
  80.     mov  esi,default_skn
  81.     mov  edi,fname
  82.     mov  ecx,default_skn.size
  83.     rep  movsb
  84.     jmp  @f
  85. has_param:
  86.         mov     ecx, 256/4
  87.         mov     edi, fname
  88.         rep     movsd
  89. @@:
  90.     call load_skin_file
  91.  
  92. ;    mov  esi, default_dtp
  93. ;    mov  edi, fname
  94. ;    mov  ecx, default_dtp.size
  95. ;    rep  movsb
  96.  
  97. red:
  98.     call draw_window            ; at first, draw the window
  99.  
  100. still:
  101.  
  102.     mov  eax,23                 ; wait here for event
  103.     mov  ebx,5
  104.     mcall
  105.  
  106.     dec  eax                    ; redraw request ?
  107.     jz   red
  108.     dec  eax                    ; key in buffer ?
  109.     jz   key
  110.     dec  eax                    ; button in buffer ?
  111.     jz   button
  112.  
  113.     call draw_cursor
  114.  
  115.     jmp  still
  116.  
  117.  
  118.   key:                          ; key
  119.     mov  al,2                   ; just read it and ignore
  120.     mcall
  121.     jmp  still
  122.  
  123.   button:                       ; button
  124.     mov  al,17                  ; get id
  125.     mcall
  126.  
  127.     cmp  ah,11                  ; read string
  128.     jne  no_string
  129.     call read_string
  130.     jmp  still
  131.   no_string:
  132.  
  133.     cmp  ah,12                  ; load file
  134.     jne  no_load
  135.     call load_file
  136.     call draw_window
  137.     jmp  still
  138.   no_load:
  139.  
  140.     cmp  ah,13                  ; save file
  141.     jne  no_save
  142.     call save_file
  143.     jmp  still
  144.   no_save:
  145.  
  146.     cmp  ah,14                  ; set 3d buttons
  147.     jne  no_3d
  148.     mov  eax,48
  149.     mov  ebx,1
  150.     mov  ecx,1
  151.     mcall
  152.     jmp  doapply
  153.    no_3d:
  154.  
  155.     cmp  ah,15                  ; set flat buttons
  156.     jne  no_flat
  157.     mcall 48, 1, 0
  158. doapply:
  159.     mcall 48, 0, 0
  160.     jmp  still
  161.   no_flat:
  162.  
  163.     cmp  ah,16                  ; apply
  164.     jne  no_apply
  165.   apply_direct:
  166.     mov  eax,48
  167.     mov  ebx,2
  168.     mov  ecx,color_table
  169.     mov  edx,10*4
  170.     mcall
  171.     jmp  doapply
  172.   no_apply:
  173.  
  174.     cmp  ah,17                  ; load skin file
  175.     jne  no_load_skin
  176.     call load_skin_file
  177.     call draw_window
  178.     jmp  still
  179.   no_load_skin:
  180.  
  181.     cmp   ah,18                 ; apply skin
  182.     jne   no_apply_skin
  183.     cmp   [skin_info.fname],0
  184.     je    no_apply_skin
  185.     mcall 48,8,skin_info.fname
  186.     call  draw_window
  187.     jmp   still
  188.   no_apply_skin:
  189.  
  190.     cmp  ah,31
  191.     jb   no_new_colour
  192.     cmp  ah,41
  193.     jg   no_new_colour
  194.     shr  eax,8
  195.     sub  eax,31
  196.     shl  eax,2
  197.     mov  ebx,[color]
  198.     mov  [eax+color_table],ebx
  199.     cmp  dword[0x18000+SKIN_HEADER.ident],'SKIN'
  200.     jne  @f
  201.     mov  edi,[0x18000+SKIN_HEADER.params]
  202.     mov  dword[edi+0x18000+SKIN_PARAMS.dtp.data+eax],ebx
  203.     call draw_skin
  204. @@: call draw_colours
  205.     jmp  still
  206.   no_new_colour:
  207.  
  208.     cmp  ah,1                   ; terminate
  209.     jnz  noid1
  210.     or   eax,-1
  211.     mcall
  212.   noid1:
  213.  
  214.     jmp  still
  215.  
  216.  
  217. draw_cursor:
  218.  
  219.     pusha
  220.     mov  eax,37
  221.     mov  ebx,2
  222.     mcall
  223.  
  224.     cmp  eax,0
  225.     jne  dc1
  226.     popa
  227.     ret
  228.  
  229.  dc1:
  230.  
  231.     mov  eax,37
  232.     mov  ebx,1
  233.     mcall
  234.  
  235.     mov  ebx,eax
  236.     shr  ebx,16
  237.     mov  ecx,eax
  238.     and  ecx,0xffff
  239.  
  240.     cmp  ecx,32
  241.     jbe  no_color
  242.     cmp  ebx,32
  243.     jbe  no_color
  244.  
  245.     cmp  ebx,266           ; CHANGE COLOR
  246.     jb   no_color
  247.     cmp  ebx,266+20*3
  248.     jg   no_color
  249.  
  250.     cmp  ecx,30+128
  251.     jge  no_color
  252.     cmp  ecx,30
  253.     jb   no_color
  254.  
  255.     sub  ebx,266
  256.     mov  eax,ebx
  257.     cdq
  258.     mov  ebx,20
  259.     div  ebx
  260.     mov  ebx,2
  261.     sub  ebx,eax
  262.  
  263.     add  ecx,-30
  264.     not  ecx
  265.     shl  ecx,1
  266.  
  267.     mov  byte [ebx+color],cl
  268.     call draw_color
  269.  
  270.     popa
  271.     ret
  272.  
  273.   no_color:
  274.  
  275.     popa
  276.     ret
  277.  
  278.  
  279. load_file:
  280.         xor     eax, eax
  281.         mov     ebx, read_info
  282.         mov     dword [ebx], eax       ; subfunction: read
  283.         mov     dword [ebx+4], eax     ; offset (low dword)
  284.         mov     dword [ebx+8], eax     ; offset (high dword)
  285.         mov     dword [ebx+12], 40     ; read colors file: 4*10 bytes
  286.         mov     dword [ebx+16], color_table ; address
  287.         mcall   70
  288.         ret
  289.  
  290. load_skin_file:
  291.         xor     eax, eax
  292.         mov     ebx, read_info
  293.         mov     dword [ebx], eax       ; subfunction: read
  294.         mov     dword [ebx+4], eax     ; offset (low dword)
  295.         mov     dword [ebx+8], eax     ; offset (high dword)
  296.         mov     dword [ebx+12], 32*1024 ; read: max 32 KBytes
  297.         mov     dword [ebx+16], 0x10000 ; address
  298.         mcall   70
  299.  
  300.         mov     esi, 0x10000
  301.  
  302.         cmp     dword [esi], 'KPCK'
  303.         jnz     notpacked
  304.         cmp     dword [esi+4], 32*1024 ; max 32 KBytes
  305.         ja      doret
  306.         push    0x20000
  307.         push    esi
  308.         call    unpack
  309.         mov     esi, 0x20000
  310. notpacked:
  311.  
  312.     cmp   dword[esi+SKIN_HEADER.ident],'SKIN'
  313.     jne   doret
  314.  
  315.     mov   edi,0x18000
  316.     mov   ecx,0x8000/4
  317.     rep   movsd
  318.  
  319.     mov   esi,fname
  320.     mov   edi,skin_info.fname
  321.     mov   ecx,257
  322.     rep   movsb
  323.  
  324.     mov   ebp,0x18000
  325.     mov   esi,[ebp+SKIN_HEADER.params]
  326.     add   esi,ebp
  327.     lea   esi,[esi+SKIN_PARAMS.dtp.data]
  328.     mov   edi,color_table
  329.     mov   ecx,10
  330.     rep   movsd
  331.   doret:
  332.  
  333. ret
  334.  
  335.  
  336. save_file:
  337.         mov     ebx, write_info
  338.         mov     dword [ebx], 2         ; subfunction: write
  339.         and     dword [ebx+4], 0       ; (reserved)
  340.         and     dword [ebx+8], 0       ; (reserved)
  341.         mov     dword [ebx+12], 10*4   ; bytes to write
  342.         mov     dword [ebx+16], color_table ; address
  343.         mcall   70
  344.         ret
  345.  
  346. read_string:
  347.  
  348.     pusha
  349.  
  350.     mov  edi,fname
  351.     mov  al,'_'
  352.     mov  ecx,87
  353.     cld
  354.     rep  stosb
  355.  
  356.     call print_text
  357.  
  358.     mov  edi,fname
  359.  
  360.   f11:
  361.     mov  eax,10
  362.     mcall
  363.     cmp  eax,2
  364.     jne  read_done
  365. ;    mov  eax,2
  366.     mcall
  367.     shr  eax,8
  368.     cmp  eax,13
  369.     je   read_done
  370.     cmp  eax,8
  371.     jne  nobsl
  372.     cmp  edi,fname
  373.     je   f11
  374.     dec  edi
  375.     mov  [edi],byte '_'
  376.     call print_text
  377.     jmp  f11
  378.    nobsl:
  379.     mov  [edi],al
  380.  
  381.     call print_text
  382.  
  383.     inc  edi
  384.     cmp  edi, fname+87
  385.     jne  f11
  386.  
  387.   read_done:
  388.  
  389.     mov  ecx, fname+88
  390.     sub  ecx, edi
  391.     mov  eax, 0
  392.     cld
  393.     rep  stosb
  394.  
  395.     call print_text
  396.  
  397.     popa
  398.  
  399.     ret
  400.  
  401.  
  402. print_text:
  403.     pushad
  404.  
  405.     mpack ebx,15,6*87+4
  406.     mpack ecx,(30+18*10+2),11
  407.     mcall 13,,,[w_work]
  408.  
  409.     mpack ebx,17,(30+18*10+4)
  410.     mcall 4,,[w_work_text],fname,87
  411.  
  412.     popad
  413. ret
  414.  
  415.  
  416. draw_color:
  417.  
  418.     pusha
  419.  
  420.     mov  eax,13
  421.     mov  ebx,266*65536+60
  422.     mov  ecx,170*65536+30
  423.     mov  edx,[color]
  424.     mcall
  425.  
  426. ;   mov  eax,13
  427.     mov  ebx,266*65536+60
  428.     mov  ecx,200*65536+10
  429.     mov  edx,[w_work]
  430.     mcall
  431.  
  432.     mov  eax,47
  433.     mov  ebx,0+1*256+8*65536
  434.     mov  ecx,[color]
  435.     mov  edx,272*65536+201
  436.     mov  esi,[w_work_text]
  437.     mcall
  438.  
  439.     popa
  440.  
  441.     ret
  442.  
  443.  
  444. draw_colours:
  445.  
  446.     pusha
  447.  
  448.     mov  esi,color_table
  449.  
  450.     mov  ebx,225*65536+32
  451.     mov  ecx,32*65536+12
  452.   newcol:
  453.     mov  eax,13
  454.     mov  edx,[esi]
  455.     mcall
  456.     add  ecx,18*65536
  457.     add  esi,4
  458.     cmp  esi,color_table+4*9
  459.     jbe  newcol
  460.  
  461.     popa
  462.  
  463.     ret
  464.  
  465.  
  466. draw_framerect: ; ebx,ecx
  467.         push    ebx ecx
  468.         add     bx,[esp+6]
  469.         mov     cx,[esp+2]
  470.         dec     ebx
  471.         mcall   38
  472.         add     cx,[esp]
  473.         rol     ecx,16
  474.         add     cx,[esp]
  475.         sub     ecx,0x00010001
  476.         mcall
  477.         mov     ebx,[esp+4]
  478.         mov     ecx,[esp]
  479.         mov     bx,[esp+6]
  480.         add     cx,[esp+2]
  481.         dec     ecx
  482.         mcall
  483.         add     bx,[esp+4]
  484.         rol     ebx,16
  485.         add     bx,[esp+4]
  486.         sub     ebx,0x00010001
  487.         mcall
  488.         add     esp,8
  489.         ret
  490.  
  491. find_bitmap:
  492.         mov     edi,[ebp+SKIN_HEADER.bitmaps]
  493.         add     edi,ebp
  494.         xor     ebx,ebx
  495.   .lp1: cmp     dword[edi],0
  496.         je      .lp2
  497.         cmp     dword[edi+0],eax
  498.         jne     @f
  499.         mov     ebx,[edi+SKIN_BITMAPS._data]
  500.         add     ebx,ebp
  501.         mov     ecx,[ebx-2]
  502.         mov     cx,[ebx+4]
  503.         add     ebx,8
  504.   .lp2: ret
  505.     @@: add     edi,8
  506.         jmp     .lp1
  507.  
  508. dec_edx:
  509.         sub     dl,4
  510.         jnc     @f
  511.         xor     dl,dl
  512.     @@: sub     dh,4
  513.         jnc     @f
  514.         xor     dh,dh
  515.     @@: rol     edx,16
  516.         sub     dl,4
  517.         jnc     @f
  518.         xor     dl,dl
  519.     @@: rol     edx,16
  520.         ret
  521.  
  522. area:
  523.   .x      = 345
  524.   .y      = 20
  525.   .width  = 206
  526.   .height = 191
  527.  
  528. wnd1:
  529.   .x      = area.x+49
  530.   .y      = area.y+5
  531.   .width  = 150
  532.   .height = 90
  533. wnd2:
  534.   .x      = area.x+35
  535.   .y      = area.y+35
  536.   .width  = 150
  537.   .height = 90
  538. wnd3:
  539.   .x      = area.x+21
  540.   .y      = area.y+65
  541.   .width  = 150
  542.   .height = 90
  543. wnd4:
  544.   .x      = area.x+7
  545.   .y      = area.y+95
  546.   .width  = 150
  547.   .height = 90
  548.  
  549. virtual at edi+SKIN_PARAMS.dtp.data
  550.   dtp system_colors
  551. end virtual
  552.  
  553. draw_skin:
  554.         mcall   13,<area.x,area.width>,<area.y+2,area.height-2>,0x00FFFFFF
  555.  
  556.         mov     ebp,0x18000
  557.         mov     edi,[ebp+SKIN_HEADER.params]
  558.         add     edi,ebp
  559.         mpack   ebx,wnd1.x,wnd1.width
  560.         mpack   ecx,wnd1.y,wnd1.height
  561.         mov     edx,[dtp.frame]
  562.         call    draw_framerect
  563.         mcall   13,<wnd1.x+1,wnd1.width-2>,<wnd1.y+1,wnd1.height-2>,dword[dtp.work]
  564.  
  565.         mov     eax,38
  566.         mpack   ebx,wnd1.x+1,wnd1.x+wnd1.width-2
  567.         mpack   ecx,wnd1.y+1,wnd1.y+1
  568.         mov     edx,[dtp.grab]
  569.         mov     esi,20
  570.     @@: mcall
  571.         call    dec_edx
  572.         add     ecx,0x00010001
  573.         dec     esi
  574.         jnz     @b
  575.  
  576.         mov     edi,[ebp+SKIN_HEADER.params]
  577.         add     edi,ebp
  578.         mcall   4,<wnd1.x+6,wnd1.y+7>,dword[dtp.grab_text],caption_text,caption_text.size
  579.  
  580.         mcall   8,<wnd1.x+wnd1.width-18,12>,<wnd1.y+4,12>,0,[dtp.grab_button]
  581.         mcall   4,<wnd1.x+wnd1.width-18+4,wnd1.y+4+2>,dword[dtp.grab_button_text],close_text,close_text.size
  582.  
  583. ;----------------------------------------------------------------------
  584.  
  585.         mov     edi,[ebp+SKIN_HEADER.params]
  586.         add     edi,ebp
  587.         mpack   ebx,wnd2.x,wnd2.width
  588.         mpack   ecx,wnd2.y,wnd2.height
  589.         mov     edx,[dtp.frame]
  590.         shr     edx,1
  591.         and     edx,0x007F7F7F
  592.         call    draw_framerect
  593.         mpack   ebx,wnd2.x+4,wnd2.width-8
  594.         mpack   ecx,wnd2.y+4,wnd2.height-8
  595.         call    draw_framerect
  596.         mcall   13,<wnd2.x+1,wnd2.width-2>,<wnd2.y+1,3>,[dtp.frame]
  597.         add     ecx,(wnd2.height-5)*65536
  598.         mcall
  599.         mcall   ,<wnd2.x+1,3>,<wnd2.y+1,wnd2.height-2>
  600.         add     ebx,(wnd2.width-5)*65536
  601.         mcall
  602.         mcall   ,<wnd2.x+5,wnd2.width-10>,<wnd2.y+5,wnd2.height-10>,dword[dtp.work]
  603.  
  604.         mov     eax,38
  605.         mpack   ebx,wnd2.x+4,wnd2.x+wnd2.width-5
  606.         mpack   ecx,wnd2.y+4,wnd2.y+4
  607.         mov     edx,[dtp.grab]
  608.         mov     esi,16
  609.     @@: mcall
  610.         call    dec_edx
  611.         add     ecx,0x00010001
  612.         dec     esi
  613.         jnz     @b
  614.  
  615.         mov     edi,[ebp+SKIN_HEADER.params]
  616.         add     edi,ebp
  617.         mcall   4,<wnd2.x+8,wnd2.y+7>,dword[dtp.grab_text],caption_text,caption_text.size
  618.  
  619.         mcall   8,<wnd2.x+wnd2.width-20,12>,<wnd2.y+4,12>,0,[dtp.grab_button]
  620.         mcall   4,<wnd2.x+wnd2.width-20+4,wnd2.y+4+2>,dword[dtp.grab_button_text],close_text,close_text.size
  621.  
  622. ;----------------------------------------------------------------------
  623.  
  624.         mov     edi,[ebp+SKIN_HEADER.params]
  625.         add     edi,ebp
  626.         mpack   ebx,wnd3.x,wnd3.width
  627.         mpack   ecx,wnd3.y,wnd3.height
  628.         mov     edx,[edi+SKIN_PARAMS.colors_1.outer]
  629.         call    draw_framerect
  630.         mpack   ebx,wnd3.x+4,wnd3.width-8
  631.         mpack   ecx,wnd3.y+4,wnd3.height-8
  632.         mov     edx,[edi+SKIN_PARAMS.colors_1.inner]
  633.         call    draw_framerect
  634.         mcall   13,<wnd3.x+1,wnd3.width-2>,<wnd3.y+1,3>,[edi+SKIN_PARAMS.colors_1.frame]
  635.         add     ecx,(wnd3.height-5)*65536
  636.         mcall
  637.         mcall   ,<wnd3.x+1,3>,<wnd3.y+1,wnd3.height-2>
  638.         add     ebx,(wnd3.width-5)*65536
  639.         mcall
  640.         mcall   ,<wnd3.x+5,wnd3.width-10>,<wnd3.y+5,wnd3.height-10>,dword[dtp.work]
  641.  
  642.         mov     eax,0x00000001 ; left, inactive
  643.         call    find_bitmap
  644.         mcall   7,,,<wnd3.x,wnd3.y>
  645.  
  646.         pushd   [ebx-8]
  647.         mov     eax,0x00000003 ; base, inactive
  648.         call    find_bitmap
  649.         pop     edx
  650.         mov     esi,wnd3.x+wnd3.width-1
  651.         sub     esi,edx
  652.         shl     edx,16
  653.         add     edx,wnd3.x*65536+wnd3.y
  654.         mcall   7
  655.     @@: rol     edx,16
  656.         add     dx,[ebx-8]
  657.         cmp     dx,si
  658.         ja      @f
  659.         rol     edx,16
  660.         mcall   7
  661.         jmp     @b
  662.     @@:
  663.  
  664.         mov     eax,0x00000002 ; oper, inactive
  665.         call    find_bitmap
  666.         mov     edx,ecx
  667.         shr     edx,16
  668.         neg     edx
  669.         shl     edx,16
  670.         add     edx,(wnd3.x+wnd3.width)*65536+wnd3.y
  671.         mcall   7
  672.  
  673.         mov     ebp,0x18000
  674.         mov     edi,[ebp+SKIN_HEADER.params]
  675.         add     edi,ebp
  676.         mov     eax,dword[edi+SKIN_PARAMS.margin.left-2]
  677.         mov     ax,word[edi+SKIN_PARAMS.skin_height]
  678.         sub     ax,[edi+SKIN_PARAMS.margin.bottom]
  679.         shr     ax,1
  680.         add     ax,[edi+SKIN_PARAMS.margin.top]
  681.         add     ax,-4
  682.         push    eax
  683.         lea     ebx,[eax+wnd3.x*65536+wnd3.y]
  684.         mcall   4,,dword[dtp.grab_text],caption_text,caption_text.size
  685.  
  686. ;---------------------------------------------------------
  687.  
  688.         mov     edi,[ebp+SKIN_HEADER.params]
  689.         add     edi,ebp
  690.         mpack   ebx,wnd4.x,wnd4.width
  691.         mpack   ecx,wnd4.y,wnd4.height
  692.         mov     edx,[edi+SKIN_PARAMS.colors.outer]
  693.         call    draw_framerect
  694.         mpack   ebx,wnd4.x+4,wnd4.width-8
  695.         mpack   ecx,wnd4.y+4,wnd4.height-8
  696.         mov     edx,[edi+SKIN_PARAMS.colors.inner]
  697.         call    draw_framerect
  698.         mcall   13,<wnd4.x+1,wnd4.width-2>,<wnd4.y+1,3>,[edi+SKIN_PARAMS.colors.frame]
  699.         add     ecx,(wnd4.height-5)*65536
  700.         mcall
  701.         mcall   ,<wnd4.x+1,3>,<wnd4.y+1,wnd4.height-2>
  702.         add     ebx,(wnd4.width-5)*65536
  703.         mcall
  704.         mcall   ,<wnd4.x+5,wnd4.width-10>,<wnd4.y+5,wnd4.height-10>,dword[dtp.work]
  705.  
  706.         mov     eax,0x00010001 ; left, inactive
  707.         call    find_bitmap
  708.         mcall   7,,,<wnd4.x,wnd4.y>
  709.  
  710.         pushd   [ebx-8]
  711.         mov     eax,0x00010003 ; base, inactive
  712.         call    find_bitmap
  713.         pop     edx
  714.         mov     esi,wnd4.x+wnd4.width-1
  715.         sub     esi,edx
  716.         shl     edx,16
  717.         add     edx,wnd4.x*65536+wnd4.y
  718.         mcall   7
  719.     @@: rol     edx,16
  720.         add     dx,[ebx-8]
  721.         cmp     dx,si
  722.         ja      @f
  723.         rol     edx,16
  724.         mcall   7
  725.         jmp     @b
  726.     @@:
  727.  
  728.         mov     eax,0x00010002 ; oper, inactive
  729.         call    find_bitmap
  730.         mov     edx,ecx
  731.         shr     edx,16
  732.         neg     edx
  733.         shl     edx,16
  734.         add     edx,(wnd4.x+wnd4.width)*65536+wnd4.y
  735.         mcall   7
  736.  
  737.         mov     ebp,0x18000
  738.         mov     edi,[ebp+SKIN_HEADER.params]
  739.         add     edi,ebp
  740.         pop     eax
  741.         lea     ebx,[eax+wnd4.x*65536+wnd4.y]
  742.         mcall   4,,dword[dtp.grab_text],caption_text,caption_text.size
  743.  
  744. ;----------------------------------------------------------------------
  745.  
  746.         mov     edi,[ebp+SKIN_HEADER.buttons]
  747.         add     edi,ebp
  748.   .lp1: cmp     dword[edi],0
  749.         je      .lp2
  750.         mov     ebx,dword[edi+SKIN_BUTTONS.left-2]
  751.         mov     bx,[edi+SKIN_BUTTONS.width]
  752.         mov     ecx,dword[edi+SKIN_BUTTONS.top-2]
  753.         mov     cx,[edi+SKIN_BUTTONS.height]
  754.         add     ebx,(wnd4.x+wnd4.width)*65536
  755.         add     ecx,wnd4.y*65536
  756.         dec     ebx
  757.         dec     ecx
  758.         mcall   8,,,0x40000000
  759.         add     edi,12
  760.         jmp     .lp1
  761.   .lp2:
  762.  
  763.         mov     edi,[ebp+SKIN_HEADER.params]
  764.         add     edi,ebp
  765.         mpack   ebx,wnd4.x+10,wnd4.y+10
  766.         add     bx,word[edi+SKIN_PARAMS.skin_height]
  767.         mcall   4,,[dtp.work_text],window_text,window_text.size
  768.  
  769.         mov     ecx,[edi+SKIN_PARAMS.skin_height]
  770.         shl     ecx,16
  771.         add     ecx,(wnd4.y+8)*65536+10
  772.         mcall   13,<wnd4.x+window_text.size*6+20,wnd4.x+wnd4.width-10-\
  773.                    (wnd4.x+window_text.size*6+20)>,,[dtp.work_graph]
  774.  
  775.         add     ecx,25*65536+8
  776.         mcall   8,<wnd4.x+wnd4.width/2-button_text.size*3-6,\
  777.                   button_text.size*6+11>,,0,[dtp.work_button]
  778.  
  779.         shr     ecx,16
  780.         mov     bx,cx
  781.         add     ebx,0x00060006
  782.         mcall   4,,[dtp.work_button_text],button_text,button_text.size
  783.  
  784.         ret
  785.  
  786. ;   *********************************************
  787. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  788. ;   *********************************************
  789.  
  790.  
  791. draw_window:
  792.  
  793.     mov  eax,12                    ; function 12:tell os about windowdraw
  794.     mov  ebx,1                     ; 1, start of draw
  795.     mcall
  796.  
  797.     mov  eax,48
  798.     mov  ebx,3
  799.     mov  ecx,app_colours
  800.     mov  edx,10*4
  801.     mcall
  802.  
  803.     mov  eax,14
  804.     mcall
  805.  
  806.                                       ; DRAW WINDOW
  807.     mov  eax,0                     ; function 0 : define and draw window
  808.     mov  ebx,110*65536+555         ; [x start] *65536 + [x size]
  809.     mov  ecx,50*65536+255          ; [y start] *65536 + [y size]
  810.     mov  edx,[w_work]              ; color of work area RRGGBB,8->color
  811.     or   edx,0x13000000
  812.     mov  edi,title                ; WINDOW LABEL
  813.     mcall
  814.  
  815. if lang eq ru
  816.   load_w  = (5*2+6*9)
  817.   save_w  = (5*2+6*9)
  818.   flat_w  = (5*2+6*7)
  819.   apply_w = (5*2+6*9)
  820. else
  821.   load_w  = (5*2+6*6)
  822.   save_w  = (5*2+6*6)
  823.   flat_w  = (5*2+6*4)
  824.   apply_w = (5*2+6*7)
  825. end if
  826.  
  827.     mov  eax,8                    ; FILENAME BUTTON
  828.     mov  ebx,5*65536+545
  829.     mov  ecx,212*65536+10
  830.     mov  edx,0x4000000B
  831.     mov  esi,[w_grab_button]       ; button color RRGGBB
  832.     mcall
  833.  
  834. ;   mov  eax,8                    ; LOAD BUTTON
  835.     mov  ebx,15*65536+load_w
  836.     mov  ecx,(30+18*11)*65536+14
  837.     mov  edx,12
  838.     mov  esi,[w_work_button]
  839.     mcall
  840.  
  841. ;   mov  eax,8                    ; SAVE BUTTON
  842.     add  ebx,(load_w+2)*65536-load_w+save_w
  843.     inc  edx
  844.     mcall
  845.  
  846. ;   mov  eax,8                    ; 3D
  847. ;   mov  ebx,15*65536+35
  848. ;   mov  ecx,(30+18*12)*65536+14
  849.     mov  ebx,(340-t1.size*6-13)*65536+(5*2+6*4)
  850.     inc  edx
  851.     mcall
  852.  
  853. ;   mov  eax,8                    ; FLAT
  854.     add  ebx,(5*2+6*4+2)*65536-(5*2+6*4)+flat_w
  855.     inc  edx
  856.     mcall
  857.  
  858. ;   mov  eax,8                    ; APPLY BUTTON
  859.     add  ebx,(flat_w+6+2)*65536-flat_w+apply_w
  860.     inc  edx
  861.     mcall
  862.  
  863. ;   mov  eax,8                    ; LOAD SKIN BUTTON
  864.     mov  ebx,(336+(555-335)/2-t2.size*6/2)*65536+load_w
  865.     inc  edx
  866.     mcall
  867.  
  868. ;   mov  eax,8                    ; APPLY SKIN BUTTON
  869.     add  ebx,(load_w+6+2)*65536-load_w+apply_w
  870.     inc  edx
  871.     mcall
  872.  
  873.     mov  eax, 4
  874.     mov  ebx, (339-t1.size*6-12)*65536+(30+18*11+4)
  875.     mov  ecx, [w_work_button_text]
  876.     mov  edx, t1
  877.     mov  esi, t1.size
  878.     mcall
  879.  
  880.     mov  ebx,(336+(555-335)/2-t2.size*6/2)*65536+(30+18*11+4)
  881.     mov  edx,t2
  882.     mov  esi,t2.size
  883.     mcall
  884.  
  885. ;   mov  eax, 4
  886. ;    mov  ebx, 277*65536+(30+18*12+4)
  887. ;    mov  edx, t2
  888. ;    mov  esi, t2.size
  889. ;    mcall
  890.  
  891.     mov  eax,38                    ; R G B COLOR GLIDES
  892.     mov  ebx,266*65536+285
  893.     mov  ecx,30*65536+30
  894.     mov  edx,0xff0000
  895.   .newl:
  896.     mcall
  897.     pusha
  898.     add  ebx,20*65536+20
  899.     shr  edx,8
  900.     mcall
  901.     add  ebx,20*65536+20
  902.     shr  edx,8
  903.     mcall
  904.     popa
  905.     sub  edx,0x020000
  906.     add  ecx,0x00010001
  907.     cmp  ecx,158*65536+158
  908.     jnz  .newl
  909.  
  910.     call draw_color
  911.  
  912.     mov  edx,31                    ; BUTTON ROW
  913.     mov  ebx,15*65536+200
  914.     mov  ecx,30*65536+14
  915.     mov  esi,[w_work_button]
  916.   newb:
  917.     mov  eax,8
  918.     mcall
  919.     add  ecx,18*65536
  920.     inc  edx
  921.     cmp  edx,40
  922.     jbe  newb
  923.  
  924.     mov  ebx,15*65536+34           ; ROW OF TEXTS
  925.     mov  ecx,[w_work_button_text]
  926.     mov  edx,text
  927.     mov  esi,32
  928.   newline:
  929.     mov  eax,4
  930.     mcall
  931.     add  ebx,18
  932.     add  edx,32
  933.     cmp  [edx],byte 'x'
  934.     jne  newline
  935.  
  936.     call draw_colours
  937.  
  938.     mcall 13,<5,546>,<212,11>,[w_work]
  939.     mcall 13,<337,7>,<2,250>,[w_frame]
  940.     shr   edx,1
  941.     and   edx,0x007F7F7F
  942.     mcall 38,<336,336>,<20,250>
  943.     add   ebx,0x00080008
  944.     mcall
  945.     sub   ebx,0x00040004
  946.     mcall ,,<0,255>
  947.     mcall ,<5,550>,<211,211>
  948.     add   ecx,0x000C000C
  949.     mcall
  950.  
  951.     call print_text
  952.  
  953.     cmp  dword[0x18000+SKIN_HEADER.ident],'SKIN'
  954.     jne  @f
  955.     call draw_skin
  956.   @@:
  957.  
  958.     mov  eax,12                    ; function 12:tell os about windowdraw
  959.     mov  ebx,2                     ; 2, end of draw
  960.     mcall
  961.  
  962.     ret
  963.  
  964.  
  965. ; DATA AREA
  966.  
  967. lsz text,\
  968.     ru,  ' РАМКА ОКНА                     ',\
  969.     ru,  ' ПОЛОСА ЗАГОЛОВКА               ',\
  970.     ru,  ' КНОПКА НА ПОЛОСЕ ЗАГОЛОВКА     ',\
  971.     ru,  ' ТЕКСТ НА КНОПКЕ НА ЗАГОЛОВКЕ   ',\
  972.     ru,  ' ТЕКСТ ЗАГОЛОВОКА               ',\
  973.     ru,  ' РАБОЧАЯ ОБЛАСТЬ                ',\
  974.     ru,  ' КНОПКА В РАБОЧЕЙ ОБЛАСТИ       ',\
  975.     ru,  ' ТЕКСТ НА КНОПКЕ                ',\
  976.     ru,  ' ТЕКСТ В РАБОЧЕЙ ОБЛАСТИ        ',\
  977.     ru,  ' ГРАФИКА В РАБОЧЕЙ ОБЛАСТИ      ',\
  978.     ru,  '                                ',\
  979.     ru,  ' ЗАГРУЗИТЬ  СОХРАНИТЬ           ',\
  980.     ru,  'x',\
  981.     en,  ' WINDOW FRAME                   ',\
  982.     en,  ' WINDOW GRAB BAR                ',\
  983.     en,  ' WINDOW GRAB BUTTON             ',\
  984.     en,  ' WINDOW GRAB BUTTON TEXT        ',\
  985.     en,  ' WINDOW GRAB TITLE              ',\
  986.     en,  ' WINDOW WORK AREA               ',\
  987.     en,  ' WINDOW WORK AREA BUTTON        ',\
  988.     en,  ' WINDOW WORK AREA BUTTON TEXT   ',\
  989.     en,  ' WINDOW WORK AREA TEXT          ',\
  990.     en,  ' WINDOW WORK AREA GRAPH         ',\
  991.     en,  '                                ',\
  992.     en,  '  LOAD    SAVE                  ',\
  993.     en,  'x',\
  994.     et,  ' AKNA RAAM                      ',\
  995.     et,  ' AKNA HAARAMISE RIBA            ',\
  996.     et,  ' AKNA HAARAMISE NUPP            ',\
  997.     et,  ' AKNA HAARAMISE NUPU TEKST      ',\
  998.     et,  ' AKNA HAARAMISE PEALKIRI        ',\
  999.     et,  ' AKNA T╓╓PIIRKOND               ',\
  1000.     et,  ' AKNA T╓╓PIIRKONNA NUPP         ',\
  1001.     et,  ' AKNA T╓╓PIIRKONNA NUPPU TEKST  ',\
  1002.     et,  ' AKNA T╓╓PIIRKONNA TEKST        ',\
  1003.     et,  ' AKNA T╓╓PIIRKONNA GRAAFIKA     ',\
  1004.     et,  '                                ',\
  1005.     et,  '  LAADI SALVESTA                ',\
  1006.     et,  'x'
  1007.  
  1008. lsz t1,\
  1009.     ru, '  3D   ПЛОСКИЕ   ПРИМЕНИТЬ ',\
  1010.     en, '  3D   FLAT    APPLY  ',\
  1011.     et, '  3D   LAME   KINNITA '
  1012.  
  1013. lsz t2,\
  1014.     ru,  ' ЗАГРУЗИТЬ   ПРИМЕНИТЬ ',\
  1015.     en,  '  LOAD     APPLY  ',\
  1016.     et,  '  LAADI   KINNITA '
  1017.  
  1018. lsz caption_text,\
  1019.     ru, 'Заголовок',\
  1020.     en, 'Caption',\
  1021.     et, 'Pealkiri'
  1022.  
  1023. sz  close_text,'x'
  1024.  
  1025. lsz window_text,\
  1026.     ru, 'Текст в окне',\
  1027.     en, 'Window text',\
  1028.     et, 'Akna tekst'
  1029.  
  1030. lsz button_text,\
  1031.     ru, 'Текст на кнопке',\
  1032.     en, 'Button text',\
  1033.     et, 'Nupu tekst'
  1034.  
  1035. sz  default_skn, '/sys/DEFAULT.SKN',0
  1036.  
  1037. if lang eq ru
  1038.   title db 'НАСТРОЙКА ОКОН',0
  1039. else if lang eq et
  1040.   title db 'AKNA SEADED - VALI V─RV JA VAJUTA OBJEKTILE',0
  1041. else
  1042.   title db 'WINDOWS SETTINGS - DEFINE COLOR AND CLICK ON TARGET',0
  1043. end if
  1044.  
  1045.  
  1046. color dd  0
  1047.  
  1048. IncludeIGlobals
  1049.  
  1050. I_END:
  1051.  
  1052. IncludeUGlobals
  1053.  
  1054. read_info:
  1055.   .mode         dd ?            ; read
  1056.   .start_block  dd ?            ; first block
  1057.   .blocks       dd ?            ; 512 bytes
  1058.   .address      dd ?
  1059.   .workarea     dd ?
  1060. fname rb 256+1            ; filename (+1 - for zero at the end)
  1061.  
  1062. virtual at read_info
  1063.  write_info:
  1064.   .mode         dd ?
  1065.   rd 1
  1066.   .bytes2write  dd ?
  1067.   .address      dd ?
  1068.   .workarea     dd ?
  1069. end virtual
  1070.  
  1071. skin_info:
  1072.   .fname rb 256+1
  1073.  
  1074. param   rb      257
  1075.  
  1076. align 4
  1077. app_colours:
  1078.  
  1079. w_frame              dd ?
  1080. w_grab               dd ?
  1081. w_grab_button        dd ?
  1082. w_grab_button_text   dd ?
  1083. w_grab_text          dd ?
  1084. w_work               dd ?
  1085. w_work_button        dd ?
  1086. w_work_button_text   dd ?
  1087. w_work_text          dd ?
  1088. w_work_graph         dd ?
  1089.  
  1090. color_table:
  1091.   times 10 dd ?
  1092.