From 3533831e62bfce6f215daeb149552262af78c013 Mon Sep 17 00:00:00 2001
From: Ivan Baravy <dunkaist@gmail.com>
Date: Fri, 23 Jul 2010 15:28:48 +0000
Subject: [PATCH] rtfread: fixed crash when the window was _too_ minimised,
 scroll_bar horrible blinking fixed, version 1.034

git-svn-id: svn://kolibrios.org@1524 a494cfbc-eb01-0410-851d-a64ba20cac60
---
 programs/other/rtfread/trunk/reader.rtf  |   2 +-
 programs/other/rtfread/trunk/rtfread.asm | 113 ++++++++++++++++-------
 2 files changed, 81 insertions(+), 34 deletions(-)

diff --git a/programs/other/rtfread/trunk/reader.rtf b/programs/other/rtfread/trunk/reader.rtf
index a34e7ed82b..621f44e900 100644
--- a/programs/other/rtfread/trunk/reader.rtf
+++ b/programs/other/rtfread/trunk/reader.rtf
@@ -2,7 +2,7 @@
 \red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;
 \red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}\pard\plain 
 \qc \li0\ri0\faauto\rin0\lin0 \fs24\cgrid\langnp1049 {\b\fs28\cf11 RTF Reader for KolibriOS
-\par }{\f36\fs20 \'e2\'e5\'f0\'f1\'e8\'ff 1}{\f1\fs20 .}{\f36\fs20 033}{\b\f1\fs20\cf11 
+\par }{\f36\fs20 \'e2\'e5\'f0\'f1\'e8\'ff 1}{\f1\fs20 .}{\f36\fs20 034}{\b\f1\fs20\cf11 
 \par }{\f36\fs20 
 \par }\pard \qr \li0\ri0\faauto\rin0\lin0 {\f36\fs20 \'ed\'e0\'ef\'e8\'f1\'e0\'ed \'ed\'e0 \'f7\'e8\'f1\'f2\'ee\'ec \'e0\'f1\'f1\'e5\'ec\'e1\'eb\'e5\'f0\'e5 \'c8\'e2\'f3\'f8\'ea\'e8\'ed\'fb\'ec \'c0\'ed\'e4\'f0
 \'e5\'e5\'ec}{\f1\fs20  aka Willow
diff --git a/programs/other/rtfread/trunk/rtfread.asm b/programs/other/rtfread/trunk/rtfread.asm
index a93b68848b..73761827cf 100644
--- a/programs/other/rtfread/trunk/rtfread.asm
+++ b/programs/other/rtfread/trunk/rtfread.asm
@@ -1,4 +1,4 @@
-;   RTF READER FOR MENUET v1.
+;   RTF READER FOR KOLIBRI >= 0.7.7.0
 ;   Written in pure assembler by Ivushkin Andrey aka Willow
 ;   Menu_bar and scroll_bar from box_lib provided by dunkaist
 ;---------------------------------------------------------------------
@@ -104,6 +104,7 @@ load_libraries l_libs_start,end_l_libs
     je   load_file;top_red
     jmp  noactivate
  prep_load:
+    mov  [is_scroll_bar_needed],    0
 ;    mcall 18,3,dword[prcinfo+30]
  noactivate:
 ;    and  ebp,not RTF_OPENING
@@ -168,6 +169,7 @@ still:
     cmp  ah,104         ; HELP
     jne  .nohelp
   .help:
+    mov  [is_scroll_bar_needed],    0
     xor  [mode],RTF_HELP
     test [mode],RTF_HELP
     jz   load_file
@@ -221,7 +223,7 @@ still:
     cmp  ah,180         ; Home
     je   top_red
     
-    cmp  byte[is_scroll_bar_needed], 0
+    cmp  dword[is_scroll_bar_needed], 0
      je  still
     
     mov  ebx,dword[prcinfo+46]
@@ -230,7 +232,7 @@ still:
     jne  .nopgdn
 ;    sub  [top],bx
 
-    cmp  byte[is_scroll_bar_needed], 0
+    cmp  dword[is_scroll_bar_needed], 0
      je  still
     
     mov  eax, [scroll_bar_data_vertical.position]
@@ -249,7 +251,7 @@ still:
     jne  .noardn
 ;    sub  [top],CHARH
 
-    cmp  byte[is_scroll_bar_needed], 0
+    cmp  dword[is_scroll_bar_needed], 0
      je  still
     
     mov  eax, [scroll_bar_data_vertical.position]
@@ -275,7 +277,7 @@ still:
 ;    cmp  cx,[top]
 ;    je   still
 
-    cmp  byte[is_scroll_bar_needed], 0
+    cmp  dword[is_scroll_bar_needed], 0
      je  still
     
     cmp  dword[scroll_bar_data_vertical.position], AR_OFFSET*7
@@ -290,7 +292,7 @@ still:
     jne  .noarup
 ;    add  [top],CHARH
 
-    cmp  byte[is_scroll_bar_needed], 0
+    cmp  dword[is_scroll_bar_needed], 0
      je  still
     
     cmp  dword[scroll_bar_data_vertical.position], AR_OFFSET
@@ -329,10 +331,12 @@ still:
     jne  .pre_file_open
   .end:
 
-    cmp  byte[is_scroll_bar_needed], 0
+    cmp  dword[is_scroll_bar_needed], 0
      je  still
     
-    mov  dword[scroll_bar_data_vertical.position], 250
+    mov  eax, [scroll_bar_data_vertical.max_area]
+    sub  eax, [scroll_bar_data_vertical.cur_area]
+    mov  dword[scroll_bar_data_vertical.position], eax
     call Set_position
     jmp  red
   .pre_file_open:
@@ -446,7 +450,7 @@ mouse:
         jmp     red
 
 .scroll_bar:
-        cmp     [is_scroll_bar_needed], 0
+        cmp     dword[is_scroll_bar_needed], 0
         je      still
 .vertical:
         mov     eax,[scroll_bar_data_vertical.max_area]
@@ -476,12 +480,47 @@ mouse:
 
 draw_window:
 
-    mcall 12, 1
+    mcall 9, procinfo2, -1
+    mov  edx, -1
+    mov  esi, -1
+    
+    mov  eax, [procinfo2.box.width]
+    cmp  eax, 140
+     je  @f
+    mov  [is_scroll_bar_needed],    0
+     jg  @f
+    mov  edx, 140
+  @@:
 
+    mov  eax, [procinfo2.box.height]
+    cmp  eax, 80
+     je  @f
+    mov  [is_scroll_bar_needed],    0
+     jg  @f
+    mov  esi, 80
+  @@:
+
+    mcall 67, -1, -1
+
+    mcall 12, 1
 ;    mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x805080D0, 0x005080D0
 ;    mcall 4, <8,8>, 0x10DDEEFF, title, titlesize-title
     mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x80000000, window_title
-
+;---------------------------------------------
+    cmp  [is_scroll_bar_needed],    0
+     je  @f
+    call Set_scroll_position
+        xor     eax,eax
+        inc     eax
+        mov     [scroll_bar_data_vertical.all_redraw],eax
+; draw for Vertical ScrollBar
+        push    dword scroll_bar_data_vertical
+        call    [scrollbar_ver_draw]
+; reset all_redraw flag 
+        xor     eax,eax
+        mov     [scroll_bar_data_vertical.all_redraw],eax
+  @@:
+;---------------------------------------------
     mov  esi,ecx
     mcall 47,0x30000,isymImplemented,<114,8>
     add  edx,36 shl 16
@@ -492,7 +531,7 @@ draw_window:
     jne  .noNA
     mov  esi,0x10ff0000
   .noNA:
-    mcall 4,edx,esi,fileinfo.name,[fname_size]
+;    mcall 4,edx,esi,fileinfo.name,[fname_size]
     mov  edi,prcinfo
     mcall 9,edi,-1
     and  [mode],not RTF_TOEOF
@@ -508,13 +547,7 @@ draw_window:
   .nochg:
 
 ;---------------------------------------------
-    mov eax, dword[prcinfo+0x3E]
-    sub eax, scroll_width_size
-    mov word[scroll_bar_data_vertical.start_x], ax
-
-    mov eax, dword[prcinfo+0x42]
-    sub eax, 17
-    mov word[scroll_bar_data_vertical.size_y], ax
+    call  Set_scroll_position
 
     mov ebx, dword[prcinfo+0x3E]
     mcall     38, , 65536*18+18, 0x8b8b89
@@ -613,7 +646,7 @@ end if
  .ex:
 call Set_position
 ;---------------------------------------------
-    cmp  [is_scroll_bar_needed], 0
+    cmp  dword[is_scroll_bar_needed], 0
      je  @f
         xor     eax,eax
         inc     eax
@@ -631,12 +664,11 @@ call Set_position
 
 ;---------------------------------------------------------------------
 Set_position:
-
     mov  eax, dword[prcinfo+46]
     cmp  eax, [HDoc]
-    mov  byte[is_scroll_bar_needed], 0
+    mov  dword[is_scroll_bar_needed], 0
      jnl .quit
-    mov  byte[is_scroll_bar_needed], 1
+    mov  dword[is_scroll_bar_needed], 1
 
     mov  eax, [scroll_bar_data_vertical.max_area]
     mul  dword[prcinfo+46]
@@ -650,7 +682,7 @@ Set_position:
     mov eax, [HDoc]
     cmp eax, dword[prcinfo+46]
     sub eax, dword[prcinfo+46]
-    add eax, 100                    ; height of clear area under text when you are at the end of document
+    add eax, 20                    ; height of clear area under text when you are at the end of document
      jg @f
     mov eax, 0
   @@:
@@ -665,6 +697,19 @@ Set_position:
   .quit:
     ret
 ;---------------------------------------------------------------------
+Set_scroll_position:
+    mcall 9, procinfo2, -1
+    mov eax, dword[procinfo2+0x3E]
+    sub eax, scroll_width_size
+    mov word[scroll_bar_data_vertical.start_x], ax
+
+    mov eax, dword[procinfo2+0x42]
+    sub eax, 17
+    mov word[scroll_bar_data_vertical.size_y], ax
+    
+    ret
+;---------------------------------------------------------------------
+
 if GUTTER eq 1
    arrow db 0x19
 end if
@@ -675,16 +720,16 @@ end if
 ; ����䥩� �ணࠬ�� ���������
 ;  �� ����� ������ �� � MACROS.INC (lang fix ��)
 
-window_title:           db      'RtfRead v1.033',0
-buf_cmd_lin             rb      0
-is_scroll_bar_needed    db      0
+window_title:           db      'RtfRead v1.034',0
+buf_cmd_lin             dd      0x0
+is_scroll_bar_needed    dd      0x0
 ;---------------------------------------------------------------------
 l_libs_start:
 
 library01  l_libs system_dir_ProcLib+9, cur_dir_path, library_path, system_dir_ProcLib, \
 err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i
 
-library02  l_libs system_dir_Boxlib+9, cur_dir_path, buf_cmd_lin, system_dir_Boxlib, \
+library02  l_libs system_dir_Boxlib+9, cur_dir_path, library_path, system_dir_Boxlib, \
 err_message_found_lib1, head_f_l, Box_lib_import, err_message_import1, head_f_i
 
 end_l_libs:
@@ -776,7 +821,7 @@ else
 end if
   Free BGIfree FONT_NAME,0,0,1.0,1.0,char,1,0x44000000,0
 end if
-I_END0:
+;I_END0:
 fname_buf:
         rb      1024+16
 fileattr rd 40/4
@@ -948,8 +993,8 @@ menu_text_area_2:
 .1:
         db 'Zoom +',0
         db 'Zoom -',0
-        db ' >  >',0
-        db '  << ',0
+        db ' > >',0
+        db ' << ',0
         db 'Align',0
         db 'Color',0
 .end:
@@ -1037,14 +1082,14 @@ scroll_bar_data_vertical:
 .all_redraw     dd 0    ;+80
 .ar_offset      dd AR_OFFSET   ;+84
 ;---------------------------------------------------------------------
+I_END0:
 I_END:                             ; ��⪠ ���� �ணࠬ��
 
 procinfo process_information
 rb RTFSIZE
 esp1:
 rb ESPSIZE
-sys_mem:
-rb ESPSIZE
+procinfo2 process_information
 ;---------------------------------------------------------------------
 temp_dir_pach:
         rb 4096
@@ -1053,4 +1098,6 @@ cur_dir_path:
 library_path:
         rb 4096
 ;---------------------------------------------------------------------
+    rb ESPSIZE                      ;stack
 esp_end:
+sys_mem: