;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                   ;
;    MENUBAR for KolibriOS  - Compile with fasm     ;
;                                                   ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

use32
  org  0x0
  db   'MENUET01'   ; 8 byte id
  dd   0x01         ; header version
  dd   START        ; program start
  dd   I_END        ; program image size
  dd   0xA000       ; reguired amount of memory - 10 Kb
  dd   0xA000       ; esp
  dd   0x0,0x0      ; param, icon

include 'lang.inc'
include '..\..\..\macros.inc'

width           dd  305
buttons         dd    1  ;  0 no frames  ; 1 frames
soften_up       dd    1  ;  0 no         ; 1 yes
soften_down     dd    0  ;  0 no         ; 1 yes
minimize_left   dd    1
minimize_right  dd    1
icons_position  dd   95
menu_enable     dd    1
setup_enable    dd    0
graph_text      dd    1
soften_middle   dd    1  ;  0 no         ; 1 yes
icons           dd    1  ;  0 defaults   ; 1 activate

PANEL_HEIGHT = 18

handle_key:

    mcall 18, 7
    mov  [active_process],eax

        mcall 2
        cmp     al, 2
        jnz     begin_1.ret
        mov     ebx, exec_fileinfo
        shr     eax, 8
        cmp     al, 15
        jz      alt_tab_pressed
        cmp     al, 88
        jz      start_end_application
        cmp     al, 91
        jz      start_menu_application
        cmp     al, 92
        jz      start_menu_application
        cmp     al, 62
        jz      kill_active_application
        cmp     al, 71
        jz      page_list_next
        cmp     al, 72
        jz      page_list_prev
        cmp     [current_alt_tab_app], -1
        jz      @f
        test    ah, 0x30
        jz      alt_tab_released
@@:
; this is hotkey Ctrl+Shift ;or LShift+RShift
        mov     ebx, setup_exec
;        test    ah, 001100b
;        jz      change_sys_lang
change_key_lang:
        mov     dword [ebx+8], chlang
        mcall   70
        call    chlang_music
;       mcall   5, 25
begin_1:
    mov  ecx,[active_process]
    mcall 18, 3
    mcall 5, 25
.ret:
        ret

;change_sys_lang:
;        mov     dword [ebx+8], syslang
;        mcall   70
;        call    syslang_music
;;       mcall   5, 25
;        jmp     begin_1

  start_end_application:
        mov     dword [ebx+21], end_name
        mcall   70
     mcall 5 ,50
     jmp   begin_1.ret

   kill_active_application:
     mcall  18, 7
     mov    ecx,eax
     
     ;//{SPraid.simba do not kill panel and icon
     push eax
     mov eax,9
     mov ebx, process_info_buffer
     int 0x40
     mov eax,process_info_buffer
     add eax,10
     mov ebx,[eax]
     cmp ebx,'ICON'
     je  no_kill
     cmp ebx,'@PAN'
     jne  kill_app
     add eax,4
     mov ebx,[eax]
     and ebx,0x0000FFFF
     cmp ebx,'EL'
     je  no_kill
   kill_app:  
     pop ecx
     mcall  18, 2
     jmp if_kill
   no_kill:
     pop eax
   if_kill:
     ;// }SPraid.simba
     
     jmp    begin_1.ret

   start_menu_application:
        mov     [draw_window_1], 1
        mov     dword [ebx+21], menu_name
        mcall   70
        call    menu_music
     mcall 5,50
     jmp   begin_1.ret

page_list_next:
    cmp  [page_list],15
    je     @f
    inc  [page_list]
    mov  [draw_window_1],1
  @@:
    jmp  begin_1.ret

page_list_prev:
    cmp  [page_list],0
    je     @f
    dec  [page_list]
    mov  [draw_window_1],1
  @@:
    jmp  begin_1.ret

alt_tab_pressed:
; handle Alt+Tab and Alt+Shift+Tab
        mov     ebp, eax
        cmp     [current_alt_tab_app], -1
        jnz     has_alt_tab_app
; заполняем таблицу приложений, подлежащих переключению
        xor     edx, edx
        mov     ebx, 0x8000
        mov     ecx, 1
        mov     eax, 9
.fill:
        inc     ecx
        int     0x40
        call    need_window_tab
        jz      @f
        cmp     edx, 256
        jz      @f
        mov     [alt_tab_list+edx*8], ecx
        movzx   esi, word [ebx+4]
        mov     [alt_tab_list+edx*8+4], esi
        inc     edx
@@:
        cmp     ecx, eax
        mov     eax, 9
        jb      .fill
        mov     [alt_tab_list_size], edx
        test    edx, edx
        jz      begin_1.ret
        mcall   66,4,0,0        ; ловим момент отпускания всех управляющих клавиш
        test    eax, eax
        jnz     begin_1.ret
        xor     edx, edx
        mov     eax, [alt_tab_list+4]
        xor     ecx, ecx
        inc     ecx
.findmax:
        cmp     [alt_tab_list+ecx*8+4], eax
        jb      @f
        mov     edx, ecx
        mov     eax, [alt_tab_list+ecx*8+4]
@@:
        inc     ecx
        cmp     ecx, [alt_tab_list_size]
        jb      .findmax
        mov     [current_alt_tab_app], edx
has_alt_tab_app:
        mov     eax, [current_alt_tab_app]
        mov     edx, [alt_tab_list+eax*8+4]     ; slot
        xor     ecx, ecx
        or      eax, -1
        test    ebp, 300h
        jz      .notshift
        or      esi, -1
.loop1:
        cmp     [alt_tab_list+ecx*8+4], edx
        jbe     @f
        cmp     [alt_tab_list+ecx*8+4], esi
        jae     @f
        mov     eax, ecx
        mov     esi, [alt_tab_list+ecx*8+4]
@@:
        inc     ecx
        cmp     ecx, [alt_tab_list_size]
        jb      .loop1
        cmp     eax, -1
        jnz     .found
        xor     edx, edx
        xor     ecx, ecx
        jmp     .loop1
.notshift:
        xor     esi, esi
.loop2:
        cmp     [alt_tab_list+ecx*8+4], edx
        jae     @f
        cmp     [alt_tab_list+ecx*8+4], esi
        jbe     @f
        mov     eax, ecx
        mov     esi, [alt_tab_list+ecx*8+4]
@@:
        inc     ecx
        cmp     ecx, [alt_tab_list_size]
        jb      .loop2
        cmp     eax, -1
        jnz     .found
        or      edx, -1
        xor     ecx, ecx
        jmp     .loop2
.found:
        mov     [current_alt_tab_app], eax
        push    eax
        xor     edx, edx
        div     [max_applications]
        mov     [page_list], eax
        mov     [draw_window_1], 1
        mov     edi, app_list
        push    edi
        mov     ecx, 20
        or      eax, -1
        rep     stosd
        pop     edi
        pop     ecx
        sub     ecx, edx
@@:
        cmp     ecx, [alt_tab_list_size]
        jae     redraw_window_tabs
        mov     eax, [alt_tab_list+ecx*8]
        stosd
        inc     ecx
        jmp     @b

alt_tab_released:
        mcall   66,5,0,0        ; уже поймали, хватит :)
        or      eax, -1
        xchg    eax, [current_alt_tab_app]
        mov     ecx, [alt_tab_list+eax*8]
        mov     eax, 18
        mov     ebx, 3
        int     0x40
        jmp     redraw_window_tabs

active_process  dd 0

calendar_music:
    mcall 55, eax, , , calendarmusic
    ret
setup_music:
    mcall 55,eax, , ,setupmusic
    ret
sysmeter_music:
    mcall 55,eax, , ,sysmetermusic
    ret
button_music:
    mcall 55,eax, , ,buttonmusic
    ret
;syslang_music:
;    mcall 55, eax, , , syslangmusic
;    ret
chlang_music:
    mcall 55, eax, , , chlangmusic
    ret
menu_music:
    mcall 55,eax, , ,menumusic
    ret

chlangmusic:    db 0x82,0x60,0x83,0x65,0x82,0x60,0

;syslangmusic:   db 0x82,0x65,0x83,0x70,0x82,0x65,0

menumusic:      db 0x82,0x50,0x84,0x48,0x82,0x50,0x84,0x53,0x82,0x51,0

activatemusic:  db 0x83,0x30,0x85,0x60,0

buttonmusic:    db 0x85,0x25,0x85,0x40,0

sysmetermusic:  db 0x85,0x35,0x85,0x45,0

setupmusic:     db 0x85,0x40,0x85,0x50,0

calendarmusic:  db 0x85,0x37,0x85,0x48,0

;  .exit: mcall -1


START:
        mcall 66,4,0,2          ; LShift+RShift
        mcall 66, , ,11h        ; Ctrl+Shift
        mcall 66,,88,110h       ; Alt+Ctrl+F12
        mcall 66,,91,100h       ; Alt+LWin
        mcall 66,,92            ; Alt+RWin
        mcall 66,,62            ; Alt+F4
        mcall 66,,71            ; Alt+Home
        mcall 66,,72            ; Alt+Up
        mcall 66,,15            ; Alt+Tab
        mcall 66,,,101h         ; Alt+Shift+Tab
    mcall 18, 8, 1
    test eax, eax
    jne  @f
    mcall 18, 8, 2
  @@:
        mov     eax, 70
        mov     ebx, dat_fileinfo
        int     0x40

    mov  edi,width
    mov  esi,I_END
    xor  eax,eax
  new_number:
    cmp  [esi],byte ';'
    je   number_ready
    imul eax,10
    movzx ebx,byte [esi]
    sub  ebx,'0'
    add  eax,ebx
    inc  esi
    jmp  new_number
  number_ready:
    stosd
    xor  eax,eax
    inc  esi
    cmp  [esi],byte 'x'
    jne  new_number

        mcall   14
        mov     [screen_size],eax

        mcall   48,5
        mov     ecx,eax
        lea     edx,[ebx-PANEL_HEIGHT-1]
        mcall   48,6

    call set_variables

start_after_minimize:

    call draw_window
    call draw_info
    call draw_running_applications

    mov  eax, 23
    mov  ebx, 30
    int  0x40

still:
;     mcall  13,<390,70>,<3,11>,0xffffff
;     mov    ecx,[button_presssed_alt]
;     mcall  47,0x80100,ecx ,400 shl 16+5,0

    call draw_info
    call draw_running_applications

    mov  eax, 23
    mov  ebx, 20
    int  0x40

    cmp  eax,1          ; redraw ?
    jz   red
    cmp  eax,3          ; button ?
    jz   button
        call    handle_key
        jmp     still

  red:                   ; redraw window

        mcall   14
        movzx   ecx,ax
        mov     edx,eax
        shr     edx,16
        cmp     [screen_size.height],ax
        jne     @f
        rol     eax,16
        cmp     [screen_size.width],ax
        je      .lp1
        rol     eax,16
    @@: mov     [screen_size],eax
        sub     ecx,PANEL_HEIGHT
        mcall   67,0,,,PANEL_HEIGHT

  .lp1:
    call draw_window
    call draw_info
    jmp  still

  button:                ; button
    mov  eax,17
    int  0x40

    cmp  ah,50
    jb   no_activate
    cmp  ah,70
    jg   no_activate

    movzx ecx,byte ah
    sub  ecx,52
    shl  ecx,2

    mov  eax,18
    mov  ebx,3
    mov  ecx,[app_list+ecx]
    int  0x40
;    cmp  [music_type],0
;    je   still
    mcall 55,eax, , ,activatemusic
    jmp  still
  no_activate:


    cmp  ah,101           ; minimize to left
    je   left_button

    cmp  ah,102           ; minimize to right
    je   right_button

    cmp  ah,byte 1        ; start/terminate menu
    jnz  noselect
    call menu_handler
;    cmp  [music_type],0
;    je   still
    call menu_music
    jmp  still
  noselect:

        mov     ebx, exec_fileinfo
    cmp  ah,byte 2             ; start calendar
    jnz  noid15  ;noclock
        mov     dword [ebx+21], calendar_name
        mov     eax, 70
        int     0x40
    call calendar_music
    jmp  still

  noid15:
    cmp  ah,16
    jne  noid16
        mov     ebx, setup_exec
        mov     dword [ebx+8], chlang
        mov     eax, 70
        int     0x40
    call chlang_music
    mcall 5, 25
    jmp  still

  noid16:
;    cmp  ah,17
;    jne  noid17
;        mov     ebx, setup_exec
;        mov     dword [ebx+8], syslang
;        mov     eax, 70
;        int     0x40
;    call syslang_music
;    mcall 5, 25
;    jmp  still
;
;  noid17:
    cmp  ah,18
    jne  noid18
        mov     dword [ebx+21], sysmeter_name
        mov     eax, 70
        int     0x40
    call sysmeter_music
    jmp  still

  noid18:
    cmp  ah,19
    jne  noid19
;    inc  [music_type]
;    and  [music_type],1
    mcall 18,8,2
;    mcall 18,8
;    mov [sound_flag],al

;    mcall 15,4,2
    mcall 15,3
    jmp  red

  noid19:
    cmp  ah,20             ; start system setup
    jnz  noid20
        mov     ebx, setup_exec
        and     dword [ebx+8], 0
        mov     eax, 70
        int     0x40
    call setup_music
    jmp still

 noid20:
    cmp  ah,21
    jnz  noid21
    cmp  [page_list],15
    je     @f
    inc  [page_list]
    jmp  red
  @@:
    jmp still

 noid21:
    cmp  ah,22
    jnz  noid22
    cmp  [page_list],0
    je     @f
    dec  [page_list]
    jmp  red
  @@:
    jmp  still

 noid22:

    jmp  still



draw_running_applications:

    pusha

    cmp  [icons],1
    jne  dr_ret

    call calculate_applications

    cmp  edi,[running_applications]
    jne  noret
    popa
    ret
  noret:

;    cmp  edi,[running_applications]
;    jge  no_application_decrease
    call draw_window
;  no_application_decrease:

    mov  [running_applications],edi

        call    redraw_window_tabs

  dr_ret:

    popa

    ret

need_window_tab:
; in: ebx->process info
; out: ZF set <=> do not draw
        cmp     byte [ebx+10], '@'
        jz      .nodraw
; \begin{diamond}[29.03.2007]
; do not draw undefined (zero-sized) windows
        cmp     dword [ebx+42], 0
        jnz     @f
        cmp     dword [ebx+46], 0
        jz      .nodraw
@@:
; \end{diamond}[29.03.2007]
        cmp     dword [ebx+10], 'ICON'
        jnz     @f
        cmp     [ebx+42], dword 51
        jnz     @f
        cmp     [ebx+46], dword 51
        jz      .nodraw
@@:
        cmp     [ebx+10], dword '    '
.nodraw:
        ret

redraw_window_tabs:
        xor     edi, edi
        mov     [contrast], 0
.loop:
        mov     ecx, [app_list+edi*4]
        cmp     ecx, -1
        jz      .done

        push    ecx
        mov     eax, 9
        mov     ebx, 0x8000
        int     0x40

        mov     eax, 13
        imul    ebx, edi, 6*10*10000h
        add     ebx, 6*10*10000h + 7*10000h + 54
        mov     ecx, 3*10000h + 14
        xor     edx, edx
        int     0x40
        sub     ebx, 10000h + 53
        mov     ecx, 4*10000h + 12
        int     0x40
        sub     ebx, 10000h
        mov     ecx, 5*10000h + 10
        int     0x40
        add     ebx, 56*10000h
        mov     ecx, 4*10000h + 12
        int     0x40
        add     ebx, 10000h
        mov     ecx, 5*10000h + 10
        int     0x40

        mov     edx, 0x88FF
        xor     [contrast], 1
        jz      @f
        mov     dh, 0x55
@@:
        pop     ecx
        mov     esi, [current_alt_tab_app]
        cmp     esi, -1
        jz      @f
        cmp     ecx, [alt_tab_list+esi*8]
        jnz     @f
;        xor     edx, 0xFFFFFF
        mov     edx, 0xFF8000
@@:
        sub     ebx, 55*10000h - 53
        mov     ecx, 4*10000h + 12
        int     0x40
        sub     ebx, 10000h + 53
        mov     ecx, 5*10000h + 10
        int     0x40
        add     ebx, 55*10000h
        int     0x40

        mov     eax, 4
        sub     ebx, 51*10000h - 6
        mov     ecx, 0xffffff   ;[wcolor]
        mov     edx, 0x8000+10
        mov     esi, 11
        int     0x40

        inc     edi
        cmp     edi, [max_applications]
        jb      .loop
.done:
        ret

calculate_applications:

    mov  eax,[max_applications]
    mul  [page_list]
    test eax,eax
    je    @f
    inc  eax
  @@:
    mov  [draw_start_position],eax

    mov  edi,app_list
    mov  ecx,20
    mov  eax,-1
    cld
    rep  stosd

    mov  edi,0
    mov  ecx,2

  cnewpr:

    mov  eax,9
    mov  ebx,0x8000
    int  0x40

        call    need_window_tab
        jz      cnorpl
        sub     [draw_start_position], 1
        jg      cnorpl

    mov  [app_list+edi*4],ecx

    inc  edi

  cnorpl:
    inc  ecx

    cmp  eax,ecx
    jge  cnewpr

    ret


draw_application_buttons:

    pusha

    cmp [icons],1
    jne da_ret

    mov  eax,14
    int  0x40

    shr  eax,16

    cmp  eax,639
    jne  now1
    mov  [max_applications],7   ;6
  now1:
    cmp  eax,799
    jne  now2
    mov  [max_applications],9 ;10    ;8
  now2:
    cmp  eax,1023
    jne  now3
    mov  [max_applications],12 ;13   ;8
  now3:
    cmp  eax,1279
    jne  now4
    mov  [max_applications],17 ;18    ;8
  now4:
    mov  edi,1

  nb:

    mov  eax,8
    mov  ebx,edi
    shl  ebx,16
    imul ebx,6*10            ;13
    add  ebx,15*65536+10*6-1  ;13
    mov  ecx,1*65536+17
    mov  edx,edi
    add  edx,51
    cmp  [buttons],1
    je   bufr
    or   edx,0x60000000
  bufr:
    mov  esi,[wcolor]
    sub  ebx,11 shl 16
    int  0x40

    inc  edi
    cmp  edi,[max_applications]
    jbe  nb

  da_ret:

    popa

    ret


menu_handler:
        mov     eax, 70
        mov     ebx, exec_fileinfo
        mov     dword [ebx+21], menu_name
        int     0x40
        ret

draw_small_right:

    pusha

    mov  eax,12
    mov  ebx,1
    int  0x40

    mov  eax,0
    mov  edx,[wcolor]
    mov  esi,edx
    mov  edi,edx
    or   edx, 0x01000000
    int  0x40

    mov  eax,8
    mov  ebx,0*65536+9
    mov  ecx,0*65536
    mov  cx,[b_size_y]
    mov  edx,1
    mov  esi,[wcolor]
    int  0x40

    mov  eax,4
    mov  ebx,2*65536+16
    cmp  [graph_text],1
    jne  nos3
    mov  ebx,2*65536+7
  nos3:
    mov  ecx,[wcolor]
    add  ecx,0x303030
    mov  edx,hidetext
    mov  esi,1
    int  0x40

    mov  eax,12
    mov  ebx,2
    int  0x40

    popa

    ret



draw_small_left:

    pusha

    mov  eax,12
    mov  ebx,1
    int  0x40

    mov  eax,0
    mov  edx,[wcolor]
    mov  esi,edx
    mov  edi,edx
    or   edx, 0x01000000
    int  0x40

    cmp  [graph_text],1
    je   nos4

    mov  eax,8
    mov  ebx,0*65536+9
    mov  ecx,0*65536+18-6
    mov  edx,2
    mov  esi,[wcolor]
    int  0x40

    mov  eax,4
    mov  ebx,2*65536+4
    mov  ecx,[wcolor]
    add  ecx,0x303030
    mov  edx,hidetext+2
    mov  esi,1
    int  0x40

  nos4:

    mov  eax,8
    mov  ebx,0*65536+9
    mov  ecx,13*65536+25
    cmp  [graph_text],1
    jne  nos6
    mov  ecx,0*65536
    mov  cx,word [b_size_y]
  nos6:
    mov  edx,1
    mov  esi,[wcolor]
    int  0x40

    mov  eax,4
    mov  ebx,3*65536+22
    cmp  [graph_text],1
    jne  nos7
    mov  ebx,3*65536+7
  nos7:
    mov  ecx,[wcolor]
    add  ecx,0x303030
    mov  edx,hidetext+1
    mov  esi,1
    int  0x40

    mov  eax,12
    mov  ebx,2
    int  0x40

    popa
    ret


;-------------------------------------------------

right_button:

    call button_music

    mov  [small_draw],dword draw_small_right

    mcall 14
    shr eax, 16
    mov ebx, eax
    mov ecx, -1
    mov edx, 9
    sub ebx, edx
    mov esi, -1
    mcall 67

    call draw_small_right

    jmp  small_wait

;-------------------------------------------------

left_button:

    call  button_music

    mov  [small_draw],dword draw_small_left

    mov   ebx, 0
    mov   edx, 9
    mov   ecx, -1
    mov   esi, -1
    mcall 67

    call draw_small_left

;-------------------------------------------------

  small_wait:

    mov  eax, 10
    int  0x40

    cmp  eax,1
    jne  no_win
    call [small_draw]
    jmp  small_wait
  no_win:
    cmp  eax,2
    jne  no_key
    call handle_key
    jmp  small_wait
no_key:

    mov  eax,17
    int  0x40

    cmp  ah,1
    jne  no_full

    mov   eax, 14                   ; get screen max x & max y
    int   0x40
    mov   edx, eax
    shr   edx, 16
    xor   ebx, ebx
    mov   ecx, -1
    mov   esi, -1
    mcall 67 ; x0 y0 xs ys

    call  button_music

    jmp   still


  no_full:

    call menu_handler

    jmp  small_wait



set_variables:

     pusha

     mov  [b_size_y],dword 38
     cmp  [graph_text],1
     jne  noy2
     mov  [b_size_y],dword 18
   noy2:

     mov  [button_frames],0x0
     cmp  [buttons],0
     jne  no_frames
     mov  [button_frames],0x40000000
   no_frames:


     mov  eax,48           ; 3d button look
     mov  ebx,1
     mov  ecx,1
     int  0x40

     mov  eax,0x40404040   ; dividers for processes
     mov  edi,pros
     mov  ecx,10
     cld
     rep  stosd

     popa
     ret



; eax = number (1 or 2)
; ebx = language id
draw_flag:
    pusha

;    cmp  [graph_text],0
;    je   mini_flag

; eax = 2 BIG
; eax = 1 small

    mov  edx,ebx

    mov  ebx,[maxx]
    and  eax,1
    imul eax,17  ;17
    sub  ebx,eax
    sub  ebx,76 ;79 ;28

    pushad
;    dec  ebx
    sub  ebx,2
    shl  ebx, 16
    add  ebx, 15 ;25
    mov  ecx, 4*65536+13
    mov  edx,0
    mov  eax,13
    int  0x40
    add  ebx,1 shl 16
    sub  ebx,2
    mov  ecx, 5 shl 16+11
    cmp  [type_lang],1
    je  label_1
    mov  edx,0xff ;[wcolor]
    jmp  label_2
label_1:
    mov  edx,0x7700
label_2:
    mov  eax, 13
    int  0x40
    popad

    shl  ebx,16
    add  ebx,7  ;24

    mov  ecx,[bte] ; color

    dec  edx
    shl  edx,1
    add  edx,flag_text
    mov  esi,2
    mov  eax,4
    int  0x40

    mov  ebx,[maxx]
    sub  ebx,48
    shl  ebx,16
    mov  bx,34
    mov  ecx,3 shl 16+14
    xor  edx,edx
    mov  eax,13
    int  0x40
    add  ebx,1 shl 16
    sub  ebx,2
    mov  ecx,4 shl 16+12
    mov  edx,0x66cc
    int  0x40

    popa
    ret

;mini_flag:
;    popa
;    ret




; ***************************************************
; ********* WINDOW DEFINITIONS AND DRAW *************
; ***************************************************


draw_window:

    pusha

    mov  [running_applications],-1
    mov  [checks],-1

    mov  eax, 12                   ; tell os about redraw
    mov  ebx, 1
    int  0x40

    mov  eax, 48
    mov  ebx, 3
    mov  ecx, system_colours
    mov  edx, 10*4
    int  0x40

    mov  eax, [system_colours+4*6]
    sub  eax, 0x101010
    mov  [wcolor], eax

    mov  eax,14                    ; get screen max x & max y
    int  0x40

    cmp  [width],0
    je   no_def_width
    and  eax,0xffff
    mov  ebx,[width]
    shl  ebx,16
    add  eax,ebx
  no_def_width:

    mov  ebx,eax
    mov  [screenxy],ebx
    shr  ebx,16
    sub  ax,38
    shl  eax,16
    mov  ecx,eax
    add  ecx,0*65536+38
    cmp  [graph_text],1
    jne  no_text_1
    mov  cx,PANEL_HEIGHT
    add  ecx,20*65536
  no_text_1:
    mov  eax, 0                     ; DEFINE AND DRAW WINDOW
    mov  edx, [wcolor]
    or   edx, 0x01000000 ; do not draw the window
    mov  esi, [wcolor]
    or   esi, 0x01000000 ; unmovable window
    mov  edi, [wcolor]
    int  0x40

    movzx ebx,word [screenxy+2]
    mov  ecx,0*65536+0
    mov  edx,[wcolor]
    add  edx,0x161616
  newline:
    sub  edx,0x040404
    mov  eax,38
    cmp  [soften_up],1
    jne  no_su
    and  edx,0x00FFFFFF
    int  0x40
  no_su:

    pusha
    cmp  [soften_down],1
    jne  no_sd
    sub  edx,0x141414
    mov  edi,[b_size_y]
    shl  edi,16
    add  edi,[b_size_y]
    add  ecx,edi
    sub  ecx,3*65536+3
    and  edx,0x00FFFFFF
    int  0x40
  no_sd:
    popa

    add  ecx,1*65536+1
    cmp  cx,5
    jb   newline

    cmp   [soften_middle],1
    jne   no_sm

    movzx ebx,word [screenxy+2]
    mov   ecx,5*65536+5
    mov   esi,stripe
    mov   edx,[wcolor]
  newline3:
    add  edx,[esi]
    add  esi,4

    mov  eax,38
    and  edx,0x00FFFFFF
    int  0x40
    add  ecx,1*65536+1
    cmp  cx,15
    jb   newline3

  no_sm:

    cmp  [minimize_left],1
    jne  no_mleft
    mov  eax,8                               ; ABS LEFT
    mov  ebx,0 *65536+9
    mov  ecx,1 *65536
    add  ecx,[b_size_y]
    dec  ecx
    mov  edx,101
    add  edx,[button_frames]
    mov  esi,[wcolor]
    int  0x40
    mov  eax,4                               ; HIDE TEXT
    mov  ebx,2*65536+17
    cmp  [graph_text],1
    jne  no_y1
    mov  bx,7
  no_y1:
    mov  ecx,[wcolor]
    add  ecx,0x303030
    mov  edx,hidetext
    mov  esi,1
    int  0x40
  no_mleft:

    movzx eax,word [screenxy+2]
    mov  [maxx],eax

    cmp  [minimize_right],1
    jne  no_mright
    mov  eax,[maxx]
    sub  eax,77
    shl  eax,16
    mov  ebx,eax
    add  ebx,67
    mov  eax,8                               ; ABS RIGHT
    mov  ecx,1 *65536
    add  ecx,[b_size_y]
    dec  ecx
    add  ebx,68*65536
    mov  bx,9
    mov  edx,102
    add  edx,[button_frames]
    mov  esi,[wcolor]
    int  0x40
    mov  edx,hidetext+1
    mov  eax,4
    mov  ebx,[maxx]
    sub  ebx,6
    shl  ebx,16
    mov  bx,17
    cmp  [graph_text],1
    jne  no_y2
    mov  bx,7
  no_y2:
    mov  ecx,[wcolor]
    add  ecx,0x303030
    mov  esi,1
    int  0x40
  no_mright:

    call draw_menuet_icon

    call draw_program_icons

    mov  [ptime],0
    call draw_info

    call draw_application_buttons

;     mov    ecx,[button_presssed_alt]
;     mcall  47,0x80100,ecx ,400 shl 16+5,0

    mov  eax,12
    mov  ebx,2
    int  0x40

    popa
    ret



draw_menuet_icon:

    pusha

    cmp  [menu_enable],1
    jne  no_menu


    mov  eax, 8                               ; M BUTTON
    mov  ebx, 10*65536 + 47
    cmp  [minimize_left], 0
    jne  @f
    sub  ebx, 10*65536
  @@:
    mov  ecx, 1*65536
    add  ecx, [b_size_y]
    dec  ecx
    mov  edx, 0x20000001
    add  edx, [button_frames]
    mov  esi, [wcolor]
    int  0x40

    cmp  [graph_text], 1
    jne  no_mtext

    push ebx
    mov  eax,13
    mov  ebx,12 shl 16+44  ;51
    mov  ecx,1 shl 16+17
    xor  edx,edx
    int  0x40
;    mov  ebx,63 shl 16+1
    mov  ebx,56 shl 16+1
    mov  ecx,2 shl 16+15
    int  0x40
    mov  ebx,57 shl 16+1
    mov  ecx,4 shl 16+11
    int  0x40
    mov  ebx,58 shl 16+1
    mov  ecx,6  shl 16+7
    int  0x40
;    mov  ebx,66  shl 16+1
;    mov  ecx,9 shl 16+1
;    int  0x40
    mov  ebx,13 shl 16+43 ;50
    mov  ecx,2 shl 16+15
    mov  edx,0x7700
    int  0x40
;    mov  ebx,62 shl 16+1
;    mov  ecx,3 shl 16+14
;    int  0x40
    mov  ebx,56 shl 16+1
    mov  ecx,4 shl 16+11
    int  0x40
    mov  ebx,57 shl 16+1
    mov  ecx,6 shl 16+7
    int  0x40
    pop  ebx

    mov  eax, 4
    mov  bx,  7
    add  ebx, 8*65536
    mov  ecx, 0x10ffffff
    mov  edx, m_text
    mov  esi, 4
    int  0x40

    popa
    ret

  no_mtext:



    mov  eax,[wcolor]
    mov  [m_icon+4],eax

; load & display menuet.bmp
        mov     eax, 70
        mov     ebx, m_bmp_fileinfo
        int     0x40

    mov  eax,40
    mov  ebx,0
    mov  edi,image+53

   new_m_pix:

;    movzx ecx,byte [edi]
;    shr  ecx,5

    cmp    byte [edi], 10
    jb     nopix
    cmp    byte [edi+1], 10
    jb     nopix
    cmp    byte [edi+2], 10
    jb     nopix

    pusha
    cmp  [minimize_left],0
    jne  no_m_s2
    sub  ebx,10
  no_m_s2:
;    mov  edx,[ecx*4+m_icon]
    mov  edx,[edi+1]

    mov  ecx,eax
    mov  eax,1
    add  ebx,12
    int  0x40
    popa

   nopix:

    add  edi,3
    add  ebx,1
    cmp  ebx,40
    jnz  new_m_pix

    mov  ebx,0
    dec  eax
    jnz  new_m_pix

  no_menu:

    popa
    ret


draw_program_icons:

    pusha

    cmp  [icons],0
    jne  dp_ret

    mov  edi,1
    push edi

  new_icon_file:

    pusha
    mov  edx,[esp+32]
    add  edx,10
    push edx
    mov  esi,[wcolor]
    mov  ecx,1*65536
    add  ecx,[b_size_y]
    dec  ecx
    mov  eax,edi
    dec  eax
    imul eax,40
    mov  ebx,eax
    add  ebx,[icons_position]
    shl  ebx,16
    mov  bx,39
    pop  edx
    add  edx,[button_frames]
    or   edx, 0x20000000
    mov  eax,8
    int  0x40
    popa

    mov  ecx,[esp]
    add  ecx,48
    mov  [iconf+6],cl

        mov     eax, 70
        mov     ebx, iconf_fileinfo
        int     0x40

    mov  eax,0
    mov  ebx,32
    mov  edi,image+51+32*33*3

   np2:                             ; new pixel of file

    mov  edx,[edi]
    and  edx,0xffffff

    cmp  eax,3                      ; Y draw limits
    jb   nopix2
    cmp  eax,36
    jg   nopix2
    cmp  ebx,38                     ; X draw limits
    jg   nopix2
    cmp  ebx,2
    jb   nopix2

    cmp  edx,0
    jz   nopix2

    cmp  [graph_text],1
    jne  no_icon_text

    pusha

    mov  ebx,[esp+32]
    dec  ebx
    imul ebx,40
    add  ebx,8
    add  ebx,[icons_position]
    shl  ebx,16
    mov  bx,7

    mov  eax,4
    mov  ecx,0xffffff
    mov  edx,[esp+32]
    dec  edx
    imul edx,4
    add  edx,mi_text
    mov  esi,4
    int  0x40

    popa

    jmp  nopix2

  no_icon_text:

    mov  esi,[esp]
    pusha
    push edx
    mov  ecx,eax
    add  ecx,2
    mov  eax,esi
    dec  eax
    imul eax,40
    add  ebx,eax
    add  ebx,3
    add  ebx,[icons_position]
    pop  edx
    mov  eax,1
    int  0x40
    popa

  nopix2:

    sub  edi,3
    dec  ebx
    jnz  np2

    mov  ebx,32
    add  eax,1
    cmp  eax,32
    jnz  np2

    add  dword [esp],1
    mov  edi,[esp]
    cmp  dword [esp],4
    jbe  new_icon_file
    add  esp,4

    mov  eax,4
    mov  ebx,40
    imul ebx,3
    add  ebx,[icons_position]
    add  ebx,10
    shl  ebx,16
    mov  bx,23
    mov  ecx,[wcolor]
    mov  edx,gpl
    mov  esi,3
    int  0x40

  dp_ret:

    popa
    ret



draw_info:    ; draw cpu usage, time, date

    pusha

    cmp  [setup_enable],1
    jne  no_setup

    cmp  [minimize_right],0
    jne  no_m_r
    add  [maxx],10

   no_m_r:

    mov  eax,3
    int  0x40
    cmp  eax,[ptime]
    jz   _ret
    mov  [ptime],eax

    call draw_cpu_usage

    mov  eax,[maxx]   ; blink sec
    sub  eax,33
    shl  eax,16
    mov  ebx,eax
    add  ebx,9
    mov  eax,3
    int  0x40
    cmp  [graph_text],1
    jne  no_y4
    sub  bx,2
  no_y4:
    mov  ecx,eax
    shr  ecx,16
    and  ecx,1
    mov  edx,[bte]
    sub  edx,[wcolor]
    imul ecx,edx
    add  ecx,[wcolor]
    mov  edx,sec
    mov  eax,4
    mov  esi,1
    int  0x40


;    mov  eax,26          ; check for change in time or country
;    mov  ebx,5
;    int  0x40
;    mov  edx,eax
    mov  eax,26
    mov  ebx,2
    mov  ecx,9
    int  0x40
;    add  edx,eax
    mov  edx,eax
    mov  eax,3
    int  0x40
    and  eax,0xffff
    add  edx,eax
    cmp  edx,[checks]
    je   _ret
    mov  [checks],edx

    mov  ebx,[maxx]
    sub  ebx,48 ;;94 ;;74
    shl  ebx,16
    add  ebx,33 ;;84 ;;64

    mov  eax,8               ; time/date button
    mov  ecx,3 *65536
    add  ecx,[b_size_y]
;    dec  ecx
    sub  cx,5
    mov  edx,2+0x20000000
    mov  esi,[wcolor]
    int  0x40
    pusha
    mov  eax,13
    add  ebx,10*65536-16
    add  ecx,5*65536-8
    mov  edx,[wcolor]
    int  0x40
    popa
    and  edx,0xffff
    add  edx,[button_frames]
    int  0x40

    mov  eax,8
    mov  ebx,[maxx]
    sub  ebx,77 ;80
    shl  ebx,16
    add  ebx,12
    mov  ecx,5 shl 16+10
    mov  edx,16+0x20000000  ;button 16
    mov  esi,[wcolor]
    int  0x40
    sub  ebx,17 shl 16
    inc  edx                ;button 17
;    int  0x40
    add  ebx,33 shl 16
    mov  bx,8
    inc  edx                ;button 18
    int  0x40
    sub  ebx,30 shl 16
    mov  bx,10
    inc  edx                ;button 19
    int  0x40
    sub  ebx,14 shl 16
    inc  edx                ;button 20
    int  0x40
    sub  ebx,12 shl 16
    mov  bx,8
    mov  ecx,6 shl 16+10
    inc  edx        ;button 21
    int  0x40
    sub  ebx,18 shl 16
    inc  edx        ;button 22
    int  0x40

    ; flags

;    mov  eax,26
;    mov  ebx,5
;    int  0x40
;    mov  ebx,eax
;
;    mov  eax,1
;    mov  [type_lang],al
;    call draw_flag

    mov  eax,26
    mov  ebx,2
    mov  ecx,9
    int  0x40
    mov  ebx,eax

    mov  eax,2
    mov  [type_lang],al
    call draw_flag

    mcall 18,8,1
    mov  [sound_flag],al

    mov  ebx,[maxx]
    sub  ebx,92 ;109 ;112 ;28
    shl  ebx,16
    mov  bx,12
    mov  ecx, 4*65536+13
    mov  edx,0
    mov  eax,13
    int  0x40
    add  ebx,1 shl 16
    sub  bx,2
    mov  ecx,5 shl 16+11
    mov  edx,0xcc
    int  0x40
    add  ebx,1 shl 16
    mov  bx,5
    mov  ecx,8 shl 16+5
    mov  edx,0xdddd00
    int  0x40
    add  ebx,5 shl 16
    mov  bx,1
    mov  ecx,7 shl 16+7
    int  0x40
    add  ebx,1 shl 16
    mov  ecx,6 shl 16+9
    int  0x40
    add  ebx,1 shl 16
    mov  ecx,5 shl 16+11
    int  0x40

;    cmp  [music_type],0
;    jne   dalshe
    cmp  [sound_flag],0
    je   dalshe

    sub  ebx,8 shl 16
    ror  ebx,16
    mov  cx,bx
    rol  ebx,16
    mov  bx,cx
    add  bx,8
    mov  ecx,5 shl 16+15
    mov  edx,0xff0000
    mov  eax,38
    int  0x40
    add  ebx,1 shl 16
    inc  bx
    int  0x40
    rol  ecx,16
    int  0x40
    sub  ebx,1 shl 16
    dec  bx
    int  0x40

dalshe:

    mov  ebx,[maxx]
    sub  ebx,106;123
    shl  ebx,16
    mov  bx,12
    mov  ecx, 4*65536+13
    mov  edx,0
    mov  eax,13
    int  0x40
    add  ebx,1 shl 16
    sub  bx,2
    mov  ecx,5 shl 16+11
    mov  edx,0xffcc00
    int  0x40
    mov  eax,4
    mov  ebx,[maxx]
    sub  ebx,104;121
    shl  ebx,16
    mov  bx,7
    mov  ecx,0x10000000
    mov  edx,file_sys
    mov  esi,1
    int  0x40
    add  ebx,1 shl 16
    int  0x40

    mov  edx,0
    mov  eax,13
    mov  ebx,[maxx]
    sub  ebx,117;134
    shl  ebx,16
    mov  bx,9
    mov  ecx,6 shl 16+11
    int  0x40
    sub  ebx,18 shl 16
    int  0x40
    add  ebx,19 shl 16
    sub  bx,2
    mov  ecx,7 shl 16+9
    mov  edx,0xffffff
    int  0x40
    sub  ebx,18 shl 16
    int  0x40

    mov  eax,4
    mov  edx,page_a1
    mov  ebx,[maxx]
    sub  ebx,133;150
    shl  ebx,16
    mov  bx,8
    mov  esi,4
    int  0x40
    add  ebx,1 shl 16
    int  0x40

    mov  eax,47
    mov  ebx,0x10100
    mov  ecx,[page_list]
    mov  edx,[maxx]
    sub  edx,124;141
    shl  edx,16
    mov  dx,7
    mov  esi,0xffffff
    int  0x40

;    sub  ebx,14 shl 16
;    mov  bx,7
;    mov  edx,turn_text
;    mov  esi,1

;    mov  ecx,0x60a060 ;[wcolor]
;    add  ecx,0x303030
;    mov  eax,4
;    int  0x40
;    add  ebx,1 shl 16
;    int  0x40
;    add  ebx,1 shl 16
;    int  0x40
;    add  ebx,1 shl 16
;    int  0x40

;    add  ebx,1 shl 16
;    mov  ecx,0x60a060 ;[wcolor]
;    int  0x40
;    add  ebx,1 shl 16
;    int  0x40
;    add  ebx,1 shl 16
;    sub  ecx,0x303030
;    int  0x40

;    sub  ebx,6 shl 16
;    mov  bx,1
;    mov  ecx,2 shl 16+15
;    mov  edx,0x60a060  ;[wcolor]
;    add  edx,0x303030
;    mov  eax,13
;    int  0x40
;    add  ebx,1 shl 16
;    mov  bx,1
;    mov  edx,0x60a060  ;[wcolor]
;    int  0x40
;    add  ebx,1 shl 16
;    mov  bx,1
;    sub  edx,0x303030
;    int  0x40
;    add  ebx,1 shl 16
;    mov  edx,[wcolor]
;    int  0x40

    mov  eax,3                  ; get time
    int  0x40

    movzx ebx,al
    shr   eax,8
    movzx ecx,al
    shr   eax,8
    movzx edx,al

    ; ebx ecx edx h m s

    push ebx
    push ecx

    mov  eax,[maxx]
    sub  eax,32
    shl  eax,16
    mov  ebx,eax
    add  ebx,9

    mov  ecx,[bte]

    cmp  [graph_text],1
    jne  no_y3
    sub  bx,2
    mov  ecx,0xffffff
  no_y3:


    mov  edx,[esp]             ; __:_X
    and  edx,15
    mov  eax,4
    add  ebx,10*65536
    add  edx,text
    mov  esi,1
    int  0x40

    pop  edx                    ; __:X_
    shr  edx,4
    and  edx,15
    mov  eax,4
    sub  ebx,6*65536
    add  edx,text
    mov  esi,1
    int  0x40

    mov  edx,[esp]             ; _X:__
    and  edx,15
    mov  eax,4
    sub  ebx,11*65536
    add  edx,text
    mov  esi,1
    int  0x40

    pop  edx                    ; X_:__
    shr  edx,4
    and  edx,15
    mov  eax,4
    sub  ebx,6*65536
    add  edx,text
    mov  esi,1
    int  0x40

    call draw_cpu_usage

  _ret:

    cmp  [minimize_right],0
    jne  no_m_r2
    sub  [maxx],10
   no_m_r2:

   no_setup:

    popa
    ret



draw_cpu_usage:

    pushad

    mov  [ysi],30
    cmp  [graph_text],1
    jne  @f
    mov  [ysi],12
  @@:


    mov  eax,18    ; TSC / SEC
    mov  ebx,5
    int  0x40
    shr  eax,20
    push eax
    mov  eax,18    ; IDLE / SEC
    mov  ebx,4
    int  0x40
    shr  eax,20
    xor  edx,edx
    imul eax,[ysi]

    cdq
    pop  ebx
    inc  ebx
    div  ebx
    cmp  eax,[ysi]
    jng  no_bug
    mov  eax,[ysi]
no_bug:
    push eax

    mov  eax,13
    mov  ebx,[maxx]
    sub  ebx,60
    shl  ebx,16
    add  ebx,8
    mov  ecx,5 shl 16
    add  ecx,[ysi]
    mov  edx,0xdd2222
    int  0x40

    pop  eax
    mov  ecx,5 shl 16
    add  ecx,eax
    mov  eax,13
    mov  edx,0x44aa44
    int  0x40

    popad
    ret

; DATA

stripe:
    dd  -0x010101
    dd  -0x010101
    dd  -0x020202
    dd  -0x010101
    dd  -0x000000

    dd   0x000000
    dd   0x010101
    dd   0x020202
    dd   0x010101
    dd   0x010101

m_icon:
    dd  0x0
    dd  0x808080
    dd  0x000000
    dd  0x000000
    dd  0xffffff


lsz m_text,\
  ru, "МЕНЮ",\
  en, "MENU",\
  et, "MEN▄▄"

mi_text   db   'WAVETETRBGRDGPL '

flag_text db 'EnFiGeRuFrEt'

type_lang db 0
;music_type db 1
sound_flag db 0
button_frames  dd  0x0

checks    dd -1
hidetext  db 0x11,0x10,0x1e

turn_text db  '><'
gpl       db  'GPL'

chlang db 'LANG',0
;syslang db 'SLAN',0

contrast  db 0

running_applications  dd  0x100
max_applications      dd  11

current_alt_tab_app     dd      -1

page_list  dd 0
draw_start_position dd 0
draw_window_1 db 0

b_size_y:  dd  0x0
ysi  dd  0
small_draw dd 0x0

ptime   dd 0x0
maxx    dd 0x0
text    db '0123456789'
page_a1 db '<  >'
bte     dd 0xccddee

wcolor  dd 0x506070

sec     db ': '
pros    db '                                                  '
        db '                                                  '

screenxy    dd  0x0
stcount     dd  0x0

setup_exec:
        dd      7
        dd      0
.cmdline dd     ?
        dd      0
        dd      0
        db      '/sys/'
file_sys db     'SETUP',0

exec_fileinfo:
        dd      7
        dd      0
        dd      0
        dd      0
        dd      0
        db      0
.name   dd      ?

end_name        db      '/sys/END',0
menu_name       db      '/sys/@MENU',0
calendar_name   db      '/sys/CALENDAR',0
sysmeter_name   db      '/sys/GMON',0

dat_fileinfo:
        dd      0
        dd      0
        dd      0
        dd      1024
        dd      I_END
        db      '/sys/PANEL.DAT',0

m_bmp_fileinfo:
        dd      0
        dd      0
        dd      0
        dd      8192
        dd      image
        db      '/sys/MENUET.BMP',0

iconf_fileinfo:
        dd      0
        dd      0
        dd      0
        dd      8192
        dd      image
        db      '/sys/'
iconf   db      'MBAR_IX.BMP',0

I_END:

screen_size:
  .height dw ?
  .width  dw ?

system_colours rd 10
app_list rd 50
alt_tab_list    rd      256*2
alt_tab_list_size dd    ?
process_info_buffer  rb 1024
tictable:
  rd 256
image:
