Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. .586
  2. .Model Flat, StdCall
  3. Option CaseMap: None
  4.  
  5. Public EXPORTS
  6.  
  7. FALSE = 0
  8. TRUE  = Not FALSE
  9.  
  10. CStr Macro QuotedText:VarArg
  11. Local LocalText
  12. .Const
  13. LocalText db QuotedText,0
  14. .Code
  15. ExitM <Offset LocalText>
  16. EndM
  17.  
  18. RepArg Macro Arg
  19.   Local NewStr
  20.     Quot SubStr <Arg>, 1, 1
  21.   IfIdn Quot, <">
  22.    .Data
  23.      NewStr db Arg,0
  24.    .Code
  25.    ExitM <ADDR NewStr>
  26.  Else
  27.    ExitM <Arg>
  28.  EndIf
  29. EndM
  30.  
  31. @ Macro Function:Req, Args:VarArg
  32.  Arg equ <Invoke Function>
  33.  For Var, <Args>
  34.    Arg CatStr Arg, <, RepArg(Var)>
  35.  EndM
  36.  Arg
  37.  ExitM <eax>
  38. EndM
  39.  
  40. TMem Struct
  41.  State   Dword ?
  42.  Caption Dword ?
  43.  Prompt  Dword ?
  44.  Default Dword ?
  45.  Flags   Dword ?
  46.  Error   Dword ?
  47.  Result  Dword ?
  48. TMem EndS
  49.  
  50. TEditBox Struct
  51.  x_size             Dword  ?
  52.  left               SDword ?
  53.  top                SDword ?
  54.  color              Dword  ?
  55.  shift_color        Dword  ?
  56.  focus_border_color Dword  ?
  57.  blur_border_color  Dword  ?
  58.  text_color         Dword  ?
  59.  max                Dword  ?
  60.  text               Dword  ?
  61.  mouse_variable     Dword  ?
  62.  flags              Dword  ?
  63.  count              Dword  ?
  64.  pos                Dword  ?
  65.  offs               Dword  ?
  66.  cl_curs_x          SWord  ?
  67.  cl_curs_y          SWord  ?
  68.  shift              Word   ?
  69.  shift_old          Word   ?
  70.  height             Dword  ?
  71.  char_width         Dword  ?
  72. TEditBox EndS
  73.  
  74. TStandartColors Struct
  75.  frames           Dword ?
  76.  grab             Dword ?
  77.  grab_button      Dword ?
  78.  grab_button_text Dword ?
  79.  grab_text        Dword ?
  80.  work             Dword ?
  81.  work_button      Dword ?
  82.  work_button_text Dword ?
  83.  work_text        Dword ?
  84.  work_graph       Dword ?
  85. TStandartColors EndS
  86.  
  87. TRect Struct
  88.  Left   SDword ?
  89.  Top    SDword ?
  90.  Right  SDword ?
  91.  Bottom SDword ?
  92. TRect EndS
  93.  
  94. TBox Struct
  95.  Left  SDword ?
  96.  Top   SDword ?
  97.  SizeX Dword  ?
  98.  SizeY Dword  ?
  99. TBox EndS
  100.  
  101. TSize Struct
  102.  SizeY Word ?
  103.  SizeX Word ?
  104. TSize EndS
  105.  
  106. TLongPoint Struct
  107.  Y SDword ?
  108.  X SDword ?
  109. TLongPoint EndS
  110.  
  111. TPoint Struct
  112.  Y SWord ?
  113.  X SWord ?
  114. TPoint EndS
  115.  
  116. TKeyboardInput Struct
  117.  Flag Byte ?
  118.  Code Byte ?
  119.  Union
  120.    Scan    Byte ?
  121.    Control Word ?
  122.  EndS
  123. TKeyboardInput EndS
  124.  
  125. TButtonInput Struct
  126.  MouseButton Byte ?
  127.  ID          Word ?
  128.  HiID        Byte ?
  129. TButtonInput EndS
  130.  
  131. TThreadInfo Struct
  132.  CpuUsage     Dword ?
  133.  WinStackPos  Word ?
  134.  reserved0    Word ?
  135.  reserved1    Word ?
  136.  ThreadName   Byte 11 Dup (?)
  137.  reserved2    Byte ?
  138.  MemAddress   Dword ?
  139.  MemUsage     Dword ?
  140.  Identifier   Dword ?
  141.  Window       TBox <>
  142.  ThreadState  Word ?
  143.  reserved3    Word ?
  144.  Client       TBox <>
  145.  WindowState  Byte ?
  146.  EventMask    Dword ?
  147.  KeyboardMode Byte ?
  148.  reserved4    Byte 948 Dup (?)
  149. TThreadInfo EndS
  150.  
  151. IfDef     LANG_IT
  152.  szCancel equ <CStr("Annulla ")>
  153. ElseIfDef LANG_SP
  154.  szCancel equ <CStr("Cancelar")>
  155. ElseIfDef LANG_RU
  156.  szCancel equ <CStr(" Žâ¬¥­  ")>
  157. ElseIfDef LANG_EN
  158.  szCancel equ <CStr(" Cancel ")>
  159. Else
  160.  .Err LANG_??
  161. EndIf
  162.  
  163. WINDOW_BORDER_SIZE = 5
  164.  
  165. ; Events
  166. REDRAW_EVENT      = 1
  167. KEY_EVENT         = 2
  168. BUTTON_EVENT      = 3
  169. BACKGROUND_EVENT  = 5
  170. MOUSE_EVENT       = 6
  171. IPC_EVENT         = 7
  172. NETWORK_EVENT     = 8
  173. DEBUG_EVENT       = 9
  174.  
  175. ; Window Style Constants
  176. WS_SKINNED_FIXED  = 4000000H
  177. WS_COORD_CLIENT   = 20000000H
  178. WS_CAPTION        = 10000000H
  179.  
  180. ; Caption Style Constants
  181. CS_MOVABLE        = 0
  182.  
  183. ; Event Mask Constants
  184. EM_REDRAW         = 001H
  185. EM_KEY            = 002H
  186. EM_BUTTON         = 004H
  187. EM_BACKGROUND     = 010H
  188. EM_MOUSE          = 020H
  189. EM_IPC            = 040H
  190. EM_NETWORK        = 080H
  191. EM_DEBUG          = 100H
  192.  
  193. ; Draw zero terminated string for DrawText
  194. DT_ZSTRING        = 080000000H
  195.  
  196. ; Charset specifiers for DrawText
  197. DT_CP866_8X16     = 10000000H
  198. DT_CP866_6X9      = 00000000H
  199.  
  200. ; Button identifiers
  201. BUTTON_CLOSE      = 1
  202. BUTTON_OK         = 10
  203. BUTTON_CANCEL     = 20
  204.  
  205. KEY_CODE_ENTER   = 13
  206. KEY_CODE_ESCAPE  = 27
  207.  
  208. ; Flags = [mouse|screen|parent][number|string]
  209. IBF_STRING = 0      ; ¢ ¡ãä¥à ¡ã¤¥â § ¯¨á ­  áâப          ; string will be written to the buffer
  210. IBF_NUMBER = 1      ; ¢ ¡ãä¥à ¡ã¤¥â § ¯¨á ­® ç¨á«®          ; number will be written to the buffer
  211. IBF_MOUSE_REL = 0   ; ®â­®á¨â¥«ì­® ¯®«®¦¥­¨ï 㪠§ â¥«ï ¬ëè¨ ; relative to the mouse pointer
  212. IBF_SCREEN_REL = 8  ; ®â­®á¨â¥«ì­® íªà ­                    ; relative to the screen
  213. IBF_PARENT_REL = 16 ; ®â­®á¨â¥«ì­® த¨â¥«ì᪮£® ®ª­        ; relative to the parent window
  214.  
  215. ; Errors
  216. IBE_NO_ERROR = 0        ; ãᯥ譮, ­¥â ®è¨¡ª¨            ; success
  217. IBE_NUMBER_OVERFLOW = 1 ; ¯¥à¥¯®«­¥­¨¥ ¯à¨ ¢¢®¤¥ ç¨á«    ; number greater than 0xFFFFFFFFFFFFFFFF
  218. IBE_RESULT_TOO_LONG = 2 ; १ã«ìâ â ­¥ 㬥頥âáï ¢ ¡ãä¥à ; result does not fit into buffer
  219.  
  220. EDIT1_TEXT_BUFFER_SIZE = 1000
  221.  
  222. EditBoxDraw_proto     TypeDef Proto :Ptr
  223. EditBoxKey_proto      TypeDef Proto :Ptr
  224. EditBoxMouse_proto    TypeDef Proto :Ptr
  225. EditBoxSetText_proto  TypeDef Proto :Ptr, :Ptr
  226.  
  227. EditBoxDraw_proc      TypeDef Ptr EditBoxDraw_proto
  228. EditBoxKey_proc       TypeDef Ptr EditBoxKey_proto
  229. EditBoxMouse_proc     TypeDef Ptr EditBoxMouse_proto
  230. EditBoxSetText_proc   TypeDef Ptr EditBoxSetText_proto
  231.  
  232. InputBox Proto Buffer:Ptr, Caption:Ptr, Prompt:Ptr, Default:Ptr, Flags:Dword, BufferSize:Dword, RedrawProc:Ptr
  233.  
  234. ; -------------------------------------------------------- ;
  235. .Data; --------------------------------------------------- ;
  236. ; -------------------------------------------------------- ;
  237. Edit1 TEditBox <\
  238.      0,\
  239.      5,\
  240.      26,\
  241.      00FFFFFFH,\
  242.      00A4C4E4H,\
  243.      0,\
  244.      0,\
  245.      DT_CP866_8X16,\
  246.      EDIT1_TEXT_BUFFER_SIZE,\
  247.      Offset Edit1TextBuffer,\
  248.      Offset Edit1MouseVariable,\
  249.      4002H,\
  250.      0,\
  251.      0,\
  252.      0,\
  253.      0,\
  254.      0,\
  255.      0,\
  256.      0\
  257. >
  258.  
  259. Mem Dword Offset InpuBox_Mem
  260.  
  261. FontHeight Dword 9
  262.  
  263. Initialized db FALSE
  264.  
  265. ; -------------------------------------------------------- ;
  266. .Data? ; ------------------------------------------------- ;
  267. ; -------------------------------------------------------- ;
  268. BoxLib         Dword ?
  269.  
  270. EditBoxDraw     EditBoxDraw_proc    ?
  271. EditBoxKey      EditBoxKey_proc     ?
  272. EditBoxMouse    EditBoxMouse_proc   ?
  273. EditBoxSetText  EditBoxSetText_proc ?
  274.  
  275. SC TStandartColors <>
  276. Window TBox <>
  277. Screen TSize <>
  278.  
  279. Key TKeyboardInput <>
  280. Button TButtonInput <>
  281.  
  282. Align 4
  283. ThreadInfo TThreadInfo <>
  284.  
  285. Align 4
  286. ParentThreadInfo TThreadInfo <>
  287.  
  288. Align 4
  289. Margin Dword ?
  290. PromptPos TLongPoint <>
  291. ButtonCancel TBox <>
  292. ButtonOK TBox <>
  293.  
  294. WinCaption Dword ?
  295. TextPrompt Dword ?
  296. TextDefault Dword ?
  297. TextOK Dword ?
  298. TextCancel Dword ?
  299.  
  300. TextOKLeft     Dword ?
  301. TextOKTop      Dword ?
  302. TextCancelLeft Dword ?
  303. TextCancelTop  Dword ?
  304.  
  305. TextFlags Dword ?
  306.  
  307. FontWidth Dword ?
  308.  
  309. MousePos TPoint <>
  310.  
  311. ParentID Dword ?
  312. ParentSlot Dword ?
  313.  
  314. Edit1MouseVariable Dword ?
  315.  
  316. Align 4
  317. Edit1TextBuffer Byte EDIT1_TEXT_BUFFER_SIZE + 2 Dup (?) ; buffer for Edit1.text
  318.  
  319. Align 4
  320. InpuBox_Mem Byte SizeOf(TMem) + SizeOf(Qword) Dup (?)
  321.  
  322. Align 4
  323. Byte 256 Dup (?)
  324. InputBox_Thread_StackTop Label Dword
  325. ; -------------------------------------------------------- ;
  326. .Code ; -------------------------------------------------- ;
  327. ; -------------------------------------------------------- ;
  328. ; convert a string, which represents an signed integer to a number
  329. ; if a number too large(greater than 0xFFFFFFFFFFFFFFFF) then return 0xFFFFFFFFFFFFFFFF and the CARRY flag
  330. a2i Proc Uses ebx esi edi S:Ptr
  331. Local LoDword:Dword, HiDword:Dword, Tmp:Dword
  332.   mov    edi, 10
  333.   mov    esi, S
  334.   xor    eax, eax
  335.   xor    edx, edx
  336.   xor    ebx, ebx
  337.   mov    LoDword, eax
  338.   mov    HiDword, eax
  339.   movzx  ecx, Byte Ptr [esi]
  340.   inc    esi
  341.   cmp    cl, '-'
  342.   jne    @no_sign
  343.   dec    ebx
  344. @next:
  345.   movzx  ecx, Byte Ptr [esi]
  346.   inc    esi
  347. @no_sign:
  348.   sub    cl, 48
  349.   cmp    cl, 9
  350.   jnbe   @done
  351.   mov    eax, HiDword
  352.   mul    edi           ; multiply by 10
  353.   jc     @overflow     ; CF flag are set if edx is not 0
  354.   mov    Tmp, eax
  355.   mov    eax, LoDword
  356.   mul    edi           ; multiply by 10
  357.   add    edx, Tmp
  358.   jc     @overflow
  359.   add    eax, ecx
  360.   adc    edx, 0
  361.   mov    LoDword, eax
  362.   mov    HiDword, edx
  363.   jnc    @next
  364. @overflow:
  365.   mov    eax, -1       ; RETURN 0xFFFFFFFFFFFFFFFF
  366.   mov    edx, eax
  367.   jmp    @exit
  368. @done:
  369.   add    eax, ebx
  370.   adc    edx, ebx
  371.   xor    eax, ebx
  372.   xor    edx, ebx
  373. @exit:
  374.  ret
  375. a2i EndP
  376. ; -------------------------------------------------------- ;
  377. Align 4
  378. MemCpy Proc Uses esi edi Src:Ptr, Dst:Ptr, Count:Dword
  379.  mov    edi, Dst
  380.  mov    esi, Src
  381.  mov    ecx, Count
  382.  mov    edx, ecx
  383.  shr    ecx, 2
  384.  and    edx, 3
  385.  rep movsd
  386.  mov    ecx, edx
  387.  rep movsb
  388.  ret
  389. MemCpy EndP
  390. ; -------------------------------------------------------- ;
  391. Align 4
  392. StrLen Proc Uses edi Src:Ptr
  393.  mov    edi, Src
  394.  mov    ecx, 0FFFFFFFFH
  395.  xor    al, al
  396.  repne scasb
  397.  mov    eax, 0FFFFFFFEH
  398.  sub    eax, ecx
  399.  ret
  400. StrLen EndP
  401. ; -------------------------------------------------------- ;
  402. Align 4
  403. StrCpy Proc Uses esi edi Src:Ptr, Dst:Ptr
  404.  mov    edi, Src
  405.  mov    ecx, 0FFFFFFFFH
  406.  mov    esi, edi
  407.  xor    eax, eax
  408.  repne scasb
  409.  not    ecx
  410.  mov    edi, Dst
  411.  mov    edx, ecx
  412.  shr    ecx, 2
  413.  and    edx, 3
  414.  rep movsd
  415.  mov    ecx, edx
  416.  rep movsb
  417.  mov    eax, edi
  418.  ret
  419. StrCpy EndP
  420. ; -------------------------------------------------------- ;
  421. Align 4
  422. GetThreadInfo Proc Uses ebx Slot:Dword, Buffer: Ptr TThreadInfo
  423.  mov    eax, 9
  424.  mov    ebx, Buffer
  425.  mov    ecx, Slot
  426.  int    64
  427.  ret
  428. GetThreadInfo EndP
  429. ; -------------------------------------------------------- ;
  430. Align 4
  431. ActivateWindow Proc Uses ebx Slot:Dword
  432.  mov    eax, 18
  433.  mov    ebx, 3
  434.  mov    ecx, Slot
  435.  int    64
  436.  ret
  437. ActivateWindow  EndP
  438. ; -------------------------------------------------------- ;
  439. Align 4
  440. GetSlotById Proc Uses ebx ID:Dword
  441.  mov    eax, 18
  442.  mov    ebx, 21
  443.  mov    ecx, ID
  444.  int    64
  445.  ret
  446. GetSlotById  EndP
  447. ; -------------------------------------------------------- ;
  448. Align 4
  449. SetEventMask Proc Uses ebx EventMask:Dword
  450.  mov    eax, 40
  451.  mov    ebx, EventMask
  452.  int    64
  453.  ret
  454. SetEventMask EndP
  455. ; -------------------------------------------------------- ;
  456. Align 4
  457. WaitEvent Proc
  458.  mov    eax, 10
  459.  int    64
  460.  ret
  461. WaitEvent EndP
  462. ; -------------------------------------------------------- ;
  463. Align 4
  464. GetButton Proc
  465.  mov    eax, 17
  466.  int    64
  467.  ret
  468. GetButton EndP
  469. ; -------------------------------------------------------- ;
  470. Align 4
  471. GetKey Proc
  472.  mov    eax, 2
  473.  int    64
  474.  ret
  475. GetKey EndP
  476. ; -------------------------------------------------------- ;
  477. Align 4
  478. BeginDraw Proc
  479.  push   ebx
  480.  mov    eax, 12
  481.  mov    ebx, 1
  482.  int    64
  483.  pop    ebx
  484.  ret
  485. BeginDraw EndP
  486. ; -------------------------------------------------------- ;
  487. Align 4
  488. EndDraw Proc
  489.  push   ebx
  490.  mov    eax, 12
  491.  mov    ebx, 2
  492.  int    64
  493.  pop    ebx
  494.  ret
  495. EndDraw EndP
  496. ; -------------------------------------------------------- ;
  497. Align 4
  498. DrawWindow Proc Left:SDword, Top:SDword, Right:SDword, Bottom:SDword, Caption:Ptr, BackColor:Dword, Style:Dword, CapStyle:Dword
  499.  push   ebx
  500.  push   edi
  501.  push   esi
  502.  xor    eax, eax
  503.  mov    ebx, Left
  504.  mov    ecx, Top
  505.  shl    ebx, 16
  506.  shl    ecx, 16
  507.  or     ebx, Right
  508.  or     ecx, Bottom
  509.  mov    edx, Style
  510.  or     edx, BackColor
  511.  mov    edi, Caption
  512.  mov    esi, CapStyle
  513.  int    64
  514.  pop    esi
  515.  pop    edi
  516.  pop    ebx
  517.  ret
  518. DrawWindow EndP
  519. ; -------------------------------------------------------- ;
  520. Align 4
  521. ThreadTerminate Proc
  522.  mov    eax, 0FFFFFFFFH
  523.  int    64
  524.  ret
  525. ThreadTerminate EndP
  526. ; -------------------------------------------------------- ;
  527. Align 4
  528. LoadLibrary Proc Path:Ptr
  529.  push   ebx
  530.  mov    eax, 68
  531.  mov    ebx, 19
  532.  mov    ecx, Path
  533.  int    64
  534.  pop    ebx
  535.  ret
  536. LoadLibrary EndP
  537. ; -------------------------------------------------------- ;
  538. Align 4
  539. GetProcAddress Proc hLib:Ptr, ProcName:Ptr
  540.  push   esi
  541.  push   edi
  542.  push   ebx
  543.  mov    edx, hLib
  544.  xor    eax, eax
  545.  test   edx, edx
  546.  jz     @end
  547.  mov    edi, ProcName
  548.  mov    ecx, 0FFFFFFFFH
  549.  repne scasb
  550.  mov    ebx, ecx
  551.  not    ebx
  552. @next:
  553.  mov    esi, [edx]
  554.  test   esi, esi
  555.  jz     @end
  556.  mov    ecx, ebx
  557.  mov    edi, ProcName
  558.  add    edx, 8
  559.  repe cmpsb
  560.  jne    @next
  561.  mov    eax, [edx - 4]
  562. @end:
  563.  pop    ebx
  564.  pop    edi
  565.  pop    esi
  566.  ret
  567. GetProcAddress EndP
  568. ; -------------------------------------------------------- ;
  569. Align 4
  570. GetScreenSize Proc
  571.  push   ebx
  572.  mov    eax, 61
  573.  mov    ebx, 1
  574.  int    64
  575.  pop    ebx
  576.  ret
  577. GetScreenSize EndP
  578. ; -------------------------------------------------------- ;
  579. Align 4
  580. GetSkinHeight Proc
  581.  push   ebx
  582.  mov    eax, 48
  583.  mov    ebx, 4
  584.  int    64
  585.  pop    ebx
  586.  ret
  587. GetSkinHeight EndP
  588. ; -------------------------------------------------------- ;
  589. Align 4
  590. GetFontHeight Proc
  591.  push   ebx
  592.  mov    eax, 48
  593.  mov    ebx, 11
  594.  int    64
  595.  pop    ebx
  596.  ret
  597. GetFontHeight EndP
  598. ; -------------------------------------------------------- ;
  599. Align 4
  600. DrawButton Proc Left:SDword, Top:SDword, Right:SDword, Bottom:SDword, BackColor:Dword, Style:Dword, ID:Dword
  601.  push   ebx
  602.  push   esi
  603.  mov    eax, 8
  604.  mov    ebx, Left
  605.  mov    ecx, Top
  606.  shl    ebx, 16
  607.  shl    ecx, 16
  608.  or     ebx, Right
  609.  or     ecx, Bottom
  610.  mov    edx, ID
  611.  or     edx, Style
  612.  mov    esi, BackColor
  613.  int    64
  614.  pop    esi
  615.  pop    ebx
  616.  ret
  617. DrawButton EndP
  618. ; -------------------------------------------------------- ;
  619. Align 4
  620. GetStandardColors Proc ColorTable:Ptr, TableSize:Dword
  621.  push   ebx
  622.  mov    eax, 48
  623.  mov    ebx, 3
  624.  mov    ecx, ColorTable
  625.  mov    edx, TableSize
  626.  int    64
  627.  pop    ebx
  628.  ret
  629. GetStandardColors EndP
  630. ; -------------------------------------------------------- ;
  631. Align 4
  632. DrawText Proc X:SDword, Y:SDword, Text:Ptr, ForeColor:Dword, BackColor:Dword, Flags:Dword, Count:Dword
  633.  push   ebx
  634.  push   edi
  635.  push   esi
  636.  mov    eax, 4
  637.  mov    ebx, X
  638.  shl    ebx, 16
  639.  or     ebx, Y
  640.  mov    ecx, Flags
  641.  or     ecx, ForeColor
  642.  mov    edx, Text
  643.  mov    edi, BackColor
  644.  mov    esi, Count
  645.  int    64
  646.  pop    esi
  647.  pop    edi
  648.  pop    ebx
  649.  ret
  650. DrawText EndP
  651. ; -------------------------------------------------------- ;
  652. Align 4
  653. GetMousePos Proc
  654.  push   ebx
  655.  mov    eax, 37
  656.  mov    ebx, 0
  657.  int    64
  658.  pop    ebx
  659.  ret
  660. GetMousePos EndP
  661. ; -------------------------------------------------------- ;
  662. Align 4
  663. ThreadCreate Proc Uses ebx Entry:Ptr, Stack:Ptr
  664.  mov    eax, 51
  665.  mov    ebx, 1
  666.  mov    ecx, Entry
  667.  mov    edx, Stack
  668.  int    64
  669.  ret
  670. ThreadCreate EndP
  671. ; -------------------------------------------------------- ;
  672. Align 4
  673. InputBox Proc Uses ebx esi edi Buffer:Ptr, Caption:Ptr, Prompt:Ptr, Default:Ptr, Flags:Dword, BufferSize:Dword, RedrawProc:Ptr
  674. Local InputBoxID:Dword, InputBoxSlot:Dword, SharedMemorySize:Dword
  675. Local EventMask:Dword, Result:Dword
  676.  Invoke GetThreadInfo, 0FFFFFFFFH, Offset ParentThreadInfo
  677.  
  678.  mov eax, ParentThreadInfo.Identifier
  679.  mov ParentID, eax
  680.  mov ParentSlot, @(GetSlotById, ParentID)
  681.  
  682.  mov ebx, Mem
  683.  mov [ebx][TMem.State], FALSE
  684.  
  685.  mov eax, Caption
  686.  mov [ebx][TMem.Caption], eax
  687.  
  688.  mov eax, Prompt
  689.  mov [ebx][TMem.Prompt], eax
  690.  
  691.  mov eax, Default
  692.  mov [ebx][TMem.Default], eax
  693.  
  694.  mov eax, Flags
  695.  mov [ebx][TMem.Flags], eax
  696.  
  697.  mov EventMask, @(SetEventMask, EM_REDRAW)
  698.  
  699.  mov InputBoxID, @(ThreadCreate, Offset InputBox_Thread, Offset InputBox_Thread_StackTop)
  700.  mov InputBoxSlot, @(GetSlotById, InputBoxID)
  701.  .Repeat
  702.    Invoke WaitEvent
  703.    Invoke ActivateWindow, InputBoxSlot
  704.    .If RedrawProc != 0
  705.      call RedrawProc
  706.    .EndIf
  707.  .Until Dword Ptr [ebx][TMem.State] == TRUE
  708.  
  709.  .If Flags & IBF_NUMBER
  710.    .If [ebx][TMem.Error] != IBE_NUMBER_OVERFLOW
  711.      mov edi, [ebx][TMem.Result]
  712.      add edi, SizeOf(Qword) - 1
  713.      mov edx, edi
  714.      mov ecx, SizeOf(Qword)
  715.      std
  716.      xor al, al
  717.      repe scasb
  718.      cld
  719.      lea eax, [ecx + 1]
  720.      .If eax > BufferSize
  721.        mov [ebx][TMem.Error], IBE_RESULT_TOO_LONG
  722.      .EndIf
  723.      Invoke MemCpy, [ebx][TMem.Result], Buffer, BufferSize
  724.    .EndIf
  725.  .Else
  726.    .If @(StrLen, [ebx][TMem.Result]) <= BufferSize
  727.      Invoke StrCpy, [ebx][TMem.Result], Buffer
  728.    .Else
  729.      mov [ebx][TMem.Error], IBE_RESULT_TOO_LONG
  730.      mov eax, BufferSize
  731.      dec eax
  732.      mov edi, Buffer
  733.      add edi, eax
  734.      mov Byte Ptr [edi], 0
  735.      Invoke MemCpy, [ebx][TMem.Result], Buffer, eax
  736.    .EndIf
  737.  .EndIf
  738.  
  739.  mov eax, [ebx][TMem.Error]
  740.  mov Result, eax
  741.  
  742.  Invoke SetEventMask, EventMask
  743.  Invoke ActivateWindow, @(GetSlotById, ParentThreadInfo.Identifier)
  744.  
  745.  mov eax, Result
  746.  ret
  747. InputBox EndP
  748. ; -------------------------------------------------------- ;
  749. Align 4
  750. OnRedraw Proc
  751.        Invoke BeginDraw
  752.        Invoke GetStandardColors, Offset SC, SizeOf(SC)
  753.        mov MousePos, @(GetMousePos)
  754.        mov FontHeight, @(GetFontHeight)
  755.        .If FontHeight > 9
  756.          mov FontHeight, 16
  757.        .EndIf
  758. ;
  759.        .If FontHeight > 9
  760.          mov eax, DT_ZSTRING + DT_CP866_8X16
  761.          mov Edit1.text_color, DT_CP866_8X16
  762.          mov FontWidth, 8
  763.        .Else
  764.          mov eax, DT_ZSTRING + DT_CP866_6X9
  765.          mov Edit1.text_color, DT_CP866_6X9
  766.          mov FontWidth, 6
  767.        .EndIf
  768.        mov TextFlags, eax
  769. ;
  770.        mov ebx, Mem
  771.  
  772.        mov eax, [ebx][TMem.Caption]
  773.        mov WinCaption, eax
  774.        mov eax, [ebx][TMem.Prompt]
  775.        mov TextPrompt, eax
  776.  
  777.        mov TextOK, CStr("   OK   ")
  778.        mov TextCancel, szCancel
  779.  
  780.        mov eax, SC.work_graph
  781.        mov Edit1.focus_border_color, eax
  782. ; Margin = FontHeight / 2
  783.        mov eax, FontHeight
  784.        shr eax, 1
  785.        mov Margin, eax
  786. ; Window.SizeY =
  787. ;   GetSkinHeight + Margin + FontHeight + Margin + 1 + FontHeight + 1 + Margin + FontHeight + Margin + FontWidth + Margin + WINDOW_BORDER_SIZE
  788.        Invoke GetSkinHeight
  789.        add eax, Margin
  790.        add eax, FontHeight
  791.        add eax, Margin
  792.        add eax, 1
  793.        add eax, FontHeight
  794.        add eax, 1
  795.        add eax, Margin
  796.        add eax, FontHeight
  797.        add eax, Margin
  798.        add eax, FontWidth
  799.        add eax, Margin
  800.        add eax, WINDOW_BORDER_SIZE
  801.        mov Window.SizeY, eax
  802. ; Window.SizeX = Screen.SizeX / 4
  803.        mov Screen, @(GetScreenSize)
  804.        movzx  eax, Screen.SizeX
  805.        shr eax, 2
  806.        mov Window.SizeX, eax
  807.        .If (ebx != 0) && ([ebx][TMem.Flags] & IBF_SCREEN_REL)
  808. ; Window.Left = (Screen.SizeX - Window.SizeX) / 2
  809.          movzx eax, Screen.SizeX
  810.          sub eax, Window.SizeX
  811.          shr eax, 1
  812.          mov Window.Left, eax
  813. ; Window.Top = (Screen.SizeY - Window.SizeY) / 2
  814.          movzx eax, Screen.SizeY
  815.          sub eax, Window.SizeX
  816.          shr eax, 1
  817.          mov Window.Top, eax
  818.        .ElseIf (ebx != 0) && ([ebx][TMem.Flags] & IBF_PARENT_REL)
  819.          Invoke GetThreadInfo, ParentSlot, Offset ThreadInfo
  820. ; Window.Left = (Parent.SizeX - Window.SizeX) / 2 + Parent.Left
  821.          mov    eax, ThreadInfo.Window.SizeX
  822.          sub    eax, Window.SizeX
  823.          shr    eax, 1
  824.          cdq             ;
  825.          xor    eax, edx ; eax = abs(eax)
  826.          sub    eax, edx ;
  827.          mov    edx, eax
  828.          mov    eax, ThreadInfo.Window.Left
  829.          add    eax, edx
  830.          mov    Window.Left, eax
  831. ; Window.Left = (Parent.SizeY - Window.SizeY) / 2 + Parent.Top
  832.          mov    eax, ThreadInfo.Window.SizeY
  833.          sub    eax, Window.SizeY
  834.          shr    eax, 1
  835.          cdq             ;
  836.          xor    eax, edx ; eax = abs(eax)
  837.          sub    eax, edx ;
  838.          mov    edx, eax
  839.          mov    eax, ThreadInfo.Window.Top
  840.          add    eax, edx
  841.          mov    Window.Top, eax
  842.        .Else ;------------------------------------------------
  843. ; Window.Left = MousePos.X - Window.SizeX / 2
  844.          movzx eax, MousePos.X
  845.          mov ecx, Window.SizeX
  846.          shr ecx, 1
  847.          sub eax, ecx
  848.          .If SIGN?
  849.            xor eax, eax
  850.          .EndIf
  851.          mov Window.Left, eax
  852. ; Window.Top = MousePos.Y - Window.SizeY / 2
  853.          movzx eax, MousePos.Y
  854.          mov ecx, Window.SizeY
  855.          shr ecx, 1
  856.          sub eax, ecx
  857.          .If SIGN?
  858.            xor eax, eax
  859.          .EndIf
  860.          mov Window.Top, eax
  861.        .EndIf ;-----------------------------------------------
  862. ; PromptPos.X = Margin
  863. ; PromptPos.Y = Margin
  864. ; Edit1.left = Margin
  865.        mov eax, Margin
  866.        mov PromptPos.X, eax
  867.        mov PromptPos.Y, eax
  868.        mov Edit1.left, eax
  869. ; Edit1.x_size = Window.SizeX - WINDOW_BORDER_SIZE * 2
  870.        mov eax, Window.SizeX
  871.        sub eax, WINDOW_BORDER_SIZE * 2
  872.        sub eax, Margin
  873.        sub eax, Margin
  874.        mov Edit1.x_size, eax
  875. ; Edit1.top = Margin + FontHeight + Margin
  876.        mov eax, Margin
  877.        add eax, FontHeight
  878.        add eax, Margin
  879.        mov Edit1.top, eax
  880. ; ButtonCancel.SizeX = StrLen(szCancel) * FontWidth + FontWidth
  881. ; ButtonOK.SizeX = ButtonCancel.SizeX
  882.        mov eax, FontWidth
  883.        imul eax, 8
  884.        mov ecx, FontWidth
  885.        add eax, ecx
  886.        mov ButtonCancel.SizeX, eax
  887.        mov ButtonOK.SizeX, eax
  888. ; ButtonCancel.SizeY = FontHeight + FontWidth
  889. ; ButtonOK.SizeY = ButtonCancel.SizeY
  890.        mov eax, FontHeight
  891.        mov ecx, FontWidth
  892.        add eax, ecx
  893.        mov ButtonCancel.SizeY, eax
  894.        mov ButtonOK.SizeY, eax
  895. ; ButtonCancel.Top = Edit1.top + 1 + FontHeight + 1 + Margin + Margin
  896. ; ButtonOK.Top = ButtonCancel.Top
  897.        mov eax, Edit1.top
  898.        add eax, 1
  899.        add eax, FontHeight
  900.        add eax, 1
  901.        add eax, Margin
  902.        add eax, Margin
  903.        mov ButtonCancel.Top, eax
  904.        mov ButtonOK.Top, eax
  905. ; ButtonCancel.Left = Window.SizeX - WINDOW_BORDER_SIZE * 2 - Margin - ButtonCancel.SizeX
  906. ; ButtonOK.Left = ButtonCancel.Left - Margin - ButtonOK.SizeX
  907.        mov eax, Window.SizeX
  908.        sub eax, WINDOW_BORDER_SIZE * 2
  909.        sub eax, Margin
  910.        sub eax, ButtonCancel.SizeX
  911.        mov ButtonCancel.Left, eax
  912.        sub eax, Margin
  913.        sub eax, ButtonOK.SizeX
  914.        mov ButtonOK.Left, eax
  915. ; TextOKLeft = ButtonOK.Left + FontWidth / 2 + 1
  916. ; TextOKTop = ButtonOK.Top + FontWidth / 2 + 1
  917.        mov eax, ButtonOK.Left
  918.        mov edx, ButtonOK.Top
  919.        mov ecx, FontWidth
  920.        shr ecx, 1
  921.        add ecx, 1
  922.        add eax, ecx
  923.        add edx, ecx
  924.        mov TextOKLeft, eax
  925.        mov TextOKTop, edx
  926. ; TextCancelLeft = ButtonCancel.Left + FontWidth / 2 + 1
  927. ; TextCancelTop = ButtonCancel.Top + FontWidth / 2 + 1
  928.        mov eax, ButtonCancel.Left
  929.        mov edx, ButtonCancel.Top
  930.        mov ecx, FontWidth
  931.        shr ecx, 1
  932.        add ecx, 1
  933.        add eax, ecx
  934.        add edx, ecx
  935.        mov TextCancelLeft, eax
  936.        mov TextCancelTop, edx
  937. ;
  938.        Invoke DrawWindow, Window.Left, Window.Top, Window.SizeX, Window.SizeY, WinCaption, SC.work, WS_SKINNED_FIXED + WS_COORD_CLIENT + WS_CAPTION, CS_MOVABLE
  939.        Invoke DrawText, PromptPos.X, PromptPos.Y, TextPrompt, SC.work_text, 0, TextFlags, 0
  940.        Invoke DrawButton, ButtonOK.Left, ButtonOK.Top, ButtonOK.SizeX, ButtonOK.SizeY, SC.work_button, 0, BUTTON_OK
  941.        Invoke DrawText, TextOKLeft, TextOKTop, TextOK, SC.work_button_text, 0, TextFlags, 0
  942.        Invoke DrawButton, ButtonCancel.Left, ButtonCancel.Top, ButtonCancel.SizeX, ButtonCancel.SizeY, SC.work_button, 0, BUTTON_CANCEL
  943.        Invoke DrawText, TextCancelLeft, TextCancelTop, TextCancel, SC.work_button_text, 0, TextFlags, 0
  944.        Invoke EditBoxDraw, Offset Edit1
  945.        Invoke EndDraw
  946.        ret
  947. OnRedraw Endp
  948. ; -------------------------------------------------------- ;
  949. Align 4
  950. OK Proc
  951.  mov ebx, Mem
  952.  .If [ebx][TMem.Flags] & IBF_NUMBER
  953.  
  954.    lea edi, [ebx + SizeOf(TMem)]
  955.    mov [ebx][TMem.Result], edi
  956.  
  957.    mov [edi], @(a2i, Edit1.text)
  958.    mov [edi + SizeOf(Dword)], edx
  959.    .If CARRY?
  960.      mov [ebx][TMem.Error], IBE_NUMBER_OVERFLOW
  961.    .Else
  962.      mov [ebx][TMem.Error], IBE_NO_ERROR
  963.    .EndIf
  964.  .Else
  965.    mov eax, Edit1.text
  966.    mov [ebx][TMem.Result], eax
  967.    mov [ebx][TMem.Error], IBE_NO_ERROR
  968.  .EndIf
  969.  mov [ebx][TMem.State], TRUE
  970.  Invoke ActivateWindow, ParentSlot
  971.  Invoke ThreadTerminate
  972.  ret
  973. OK Endp
  974. ; -------------------------------------------------------- ;
  975. Align 4
  976. Cancel Proc
  977.  mov ebx, Mem
  978.  .If [ebx][TMem.Flags] & IBF_NUMBER
  979.  
  980.     lea edi, [ebx + SizeOf(TMem)]
  981.  
  982.     mov [ebx][TMem.Result], edi
  983.     mov [edi], @(a2i, [ebx][TMem.Default])
  984.     mov [edi + SizeOf(Dword)], edx
  985.    .If CARRY?
  986.      mov [ebx][TMem.Error], IBE_NUMBER_OVERFLOW
  987.    .Else
  988.      mov [ebx][TMem.Error], IBE_NO_ERROR
  989.    .EndIf
  990.  .Else
  991.    mov eax, [ebx][TMem.Default]
  992.    mov [ebx][TMem.Result], eax
  993.    mov [ebx][TMem.Error], IBE_NO_ERROR
  994.  .EndIf
  995.  mov [ebx][TMem.State], TRUE
  996.  Invoke ActivateWindow, ParentSlot
  997.  Invoke ThreadTerminate
  998.  ret
  999. Cancel Endp
  1000. ; -------------------------------------------------------- ;
  1001. Align 4
  1002. InputBox_Thread:
  1003. .If Initialized == FALSE
  1004.   mov BoxLib,         @(LoadLibrary, CStr("/sys/lib/box_lib.obj"))
  1005.   mov EditBoxDraw,    @(GetProcAddress, BoxLib, CStr("edit_box"))
  1006.   mov EditBoxKey,     @(GetProcAddress, BoxLib, CStr("edit_box_key"))
  1007.   mov EditBoxMouse,   @(GetProcAddress, BoxLib, CStr("edit_box_mouse"))
  1008.   mov EditBoxSetText, @(GetProcAddress, BoxLib, CStr("edit_box_set_text"))
  1009.  
  1010.   mov Initialized, TRUE
  1011. .EndIf
  1012.  
  1013.  mov ebx, Mem
  1014.  
  1015.  Invoke EditBoxSetText, Offset Edit1, [ebx][TMem.Default]
  1016.  
  1017.  Invoke SetEventMask, EM_REDRAW + EM_KEY + EM_BUTTON + EM_MOUSE
  1018.  
  1019.  .Repeat
  1020.    Invoke WaitEvent
  1021.    .If eax == REDRAW_EVENT
  1022.      Invoke  OnRedraw
  1023.    .ElseIf eax == KEY_EVENT
  1024.      mov Key, @(GetKey)
  1025.      .If Key.Code == KEY_CODE_ENTER
  1026.        Invoke OK
  1027.      .ElseIf Key.Code == KEY_CODE_ESCAPE
  1028.        Invoke Cancel
  1029.      .Else
  1030.        Invoke EditBoxKey, Offset Edit1
  1031.      .EndIf
  1032.    .ElseIf eax == BUTTON_EVENT
  1033.      mov Button, @(GetButton)
  1034.      .If Button.ID == BUTTON_CLOSE
  1035.        Invoke Cancel
  1036.      .ElseIf Button.ID == BUTTON_OK
  1037.        Invoke OK
  1038.      .ElseIf Button.ID == BUTTON_CANCEL
  1039.        Invoke Cancel
  1040.      .EndIf
  1041.    .ElseIf eax == MOUSE_EVENT
  1042.      Invoke EditBoxMouse, Offset Edit1
  1043.    .EndIf
  1044.  .Until 0
  1045. ; -------------------------------------------------------- ;
  1046. Align 16
  1047. EXPORTS Label Dword
  1048. Dword   CStr("InputBox"),       Offset InputBox
  1049. Dword   0, 0
  1050. ; -------------------------------------------------------- ;
  1051. END
  1052.