Subversion Repositories Kolibri OS

Rev

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