Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6951 leency 1
; Программа запускает OpenDialog с указанным фильтром и после выбора файла
2
; запускает указанную программу, передавая в качестве параметра выбранный путь.
3
; Например:
4
; LOD *pdf,xps*/hd0/1/mupdf
5
; LOD *mp3*/hd0/1/minimp3
6
; LOD *asm,inc,mac*/sys/tinypad
7
 
8
; Author 0CodErr
9
; http://board.kolibrios.org/viewtopic.php?f=9&t=2486
10
 
11
ORG 0
12
BITS 32
13
; ---------------------------------------------------------------------------- ;
14
PARAMS_SIZE        equ 256
15
STACK_SIZE         equ 256
16
; ---------------------------------------------------------------------------- ;
17
PROCINFO_SIZE      equ 1024
18
FILENAME_AREA_SIZE equ 256
19
OPENDIR_PATH_SIZE  equ 4096
20
OPENFILE_PATH_SIZE equ 4096
21
FILTER_AREA_SIZE   equ 256
22
FILTER_BRACKET     equ "*" ; and for example: LOD *bmp,png,jpeg*/sys/media/kiv
23
; ---------------------------------------------------------------------------- ;
24
MENUET01           db 'MENUET01'
25
version            dd 1
26
program.start      dd START
27
program.end        dd END
28
program.memory     dd END + PARAMS_SIZE + STACK_SIZE
29
program.stack      dd END + PARAMS_SIZE + STACK_SIZE
30
program.params     dd END
31
program.path       dd 0
32
; ---------------------------------------------------------------------------- ;
33
START:
34
		mov    edi,[program.params]
35
		cmp    [edi],dword 0
36
		je     terminate
37
 
38
        call   FakeDrawWindow
39
        call   OpenDialogInit
40
        call   OpenDialogSetFilter
41
        call   OpenDialogOpen
42
        cmp    [od.status], dword 0
43
        je     terminate
44
        mov    [file_info.params], eax
45
launch_program:
46
        mov    eax, 70
47
        mov    ebx, file_info
48
        int    64
49
terminate:
50
        or     eax, -1
51
        int    64
52
; ---------------------------------------------------------------------------- ;
53
OpenDialogInit:
54
; load.library
55
        mov    eax, 68
56
        mov    ebx, 19
57
        mov    ecx, sz_proc_lib
58
        int    64
59
        mov    [proclib], eax
60
 
61
        push   dword[proclib]
62
        push   sz_OpenDialog_init
63
        call   GetProcAddress
64
        mov    [opendialog_init], eax
65
 
66
        push   dword[proclib]
67
        push   sz_OpenDialog_start
68
        call   GetProcAddress
69
        mov    [opendialog_start], eax
70
; memory.allocate
71
        mov    eax, 68
72
        mov    ebx, 12
73
        mov    ecx, PROCINFO_SIZE + FILENAME_AREA_SIZE + OPENDIR_PATH_SIZE + OPENFILE_PATH_SIZE
74
        int    64
75
 
76
        mov    [od.procinfo], eax
77
        add    eax, PROCINFO_SIZE
78
        mov    [od.filename_area], eax
79
        add    eax, FILENAME_AREA_SIZE
80
        mov    [od.opendir_path], eax
81
        add    eax, OPENDIR_PATH_SIZE
82
        mov    [od.openfile_path], eax
83
 
84
        push   od
85
        call   [opendialog_init]
86
        ret
87
; ---------------------------------------------------------------------------- ;
88
OpenDialogOpen:
89
        mov    eax, [od.openfile_path]
90
        mov    [eax], byte 0
91
        push   od
92
        call   [opendialog_start]
93
        mov    eax, [od.openfile_path]
94
        ret
95
; ---------------------------------------------------------------------------- ;
96
GetProcAddress:
97
        mov    edx, [esp + 8]
98
        xor    eax, eax
99
        test   edx, edx
100
        jz     .end
101
.next:
102
        xor    eax, eax
103
        cmp    [edx], dword 0
104
        jz     .end
105
        mov    esi, [edx]
106
        mov    edi, [esp + 4]
107
.next_:
108
        lodsb
109
        scasb
110
        jne    .fail
111
        or     al, al
112
        jnz    .next_
113
        jmp    .ok
114
.fail:
115
        add    edx, 8
116
        jmp    .next
117
.ok:
118
        mov    eax, [edx + 4]
119
.end:
120
        ret    8
121
; ---------------------------------------------------------------------------- ;
122
FakeDrawWindow:
123
; redraw.start
124
        mov    eax, 12
125
        mov    ebx, 1
126
        int    64
127
; get.screen.size
128
        mov    eax, 61
129
        mov    ebx, 1
130
        int    64
131
        shr    eax, 1
132
        and    eax, 0x7FFF7FFF
133
; draw.window
134
        movzx  ecx, ax
135
        shl    ecx, 16
136
        shr    eax, 16
137
        movzx  ebx, ax
138
        shl    ebx, 16
139
        mov    edx, 0x01000000
140
        xor    eax, eax
141
        int    64
142
; redraw.finish
143
        mov    eax, 12
144
        mov    ebx, 2
145
        int    64
146
        ret
147
; ---------------------------------------------------------------------------- ;
148
OpenDialogSetFilter:
149
        mov    edi, [program.params]
150
        mov    esi, filefilter + 4
151
; skip spaces
152
        or     ecx, -1
153
        mov    al, " "
154
        repe scasb
155
        dec    edi
156
        cmp    [edi], byte FILTER_BRACKET
157
        xchg   esi, edi
158
        jne    .no_filter
159
        inc    esi
160
        mov    ecx, FILTER_AREA_SIZE
161
; copy filter string to filter area
162
; and replace commas with zeroes
163
.next:
164
        lodsb
165
        test   al, al
166
        jnz    .bracket?
167
        stosb
168
        jmp    .done
169
.bracket?:
170
        cmp    al, FILTER_BRACKET
171
        jne    .comma?
172
        xor    al, al
173
        stosb
174
        jmp    .done
175
.comma?:
176
        cmp    al, ","
177
        jne    .not_comma
178
        xor    al, al
179
.not_comma:
180
        stosb
181
        loop   .next
182
.done:
183
        sub    edi, filefilter
184
        mov    [filefilter], edi
185
.no_filter:
186
        mov    edi, esi
187
; skip spaces
188
        or     ecx, -1
189
        mov    al, " "
190
        repe scasb
191
        dec    edi
192
        mov    [file_info.file_path], edi
193
        ret    4
194
; ---------------------------------------------------------------------------- ;
195
LaunchProgram:
196
        mov    eax, [od.openfile_path]
197
        mov    [file_info.params], eax
198
        mov    eax, 70
199
        mov    ebx, file_info
200
        int    64
201
        ret
202
; ---------------------------------------------------------------------------- ;
203
file_info:
204
                    dd 7
205
                    dd 0
206
.params             dd 0
207
                    dd 0
208
                    dd 0
209
                    db 0
210
.file_path          dd 0
211
; ---------------------------------------------------------------------------- ;
212
filefilter          dd 0
213
                    resb FILTER_AREA_SIZE
214
.end                db 0
215
; ---------------------------------------------------------------------------- ;
216
od:
217
.mode               dd 0
218
.procinfo           dd 0
219
.com_area_name      dd sz_com_area_name
220
.com_area           dd 0
221
.opendir_path       dd 0
222
.dir_default_path   dd sz_dir_default_path
223
.start_path         dd sz_start_path
224
.draw_window        dd FakeDrawWindow
225
.status             dd 0
226
.openfile_path      dd 0
227
.filename_area      dd 0
228
.filter_area        dd filefilter
229
.x_size             dw 444
230
.x_start            dw 0
231
.y_size             dw 444
232
.y_start            dw 0
233
; ---------------------------------------------------------------------------- ;
234
sz_proc_lib         db "/sys/lib/proc_lib.obj",0
235
sz_OpenDialog_init  db "OpenDialog_init",0
236
sz_OpenDialog_start db "OpenDialog_start",0
237
sz_com_area_name    db "FFFFFFFF_open_dialog",0
238
sz_dir_default_path db "/sys",0
239
sz_start_path       db "/sys/File managers/opendial",0
240
; ---------------------------------------------------------------------------- ;
241
proclib             dd 0
242
opendialog_init     dd 0
243
opendialog_start    dd 0
244
; ---------------------------------------------------------------------------- ;
245
END: