Subversion Repositories Kolibri OS

Rev

Rev 4505 | Rev 4566 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4487 mario79 1
;-----------------------------------------------------------------------------
2
put_to_clipboard:
3
; we have allocated memory?
4
	mov	edi,[clipboard_buf]
5
	test	edi,edi
6
	jz	.end
7
; convert from Tinypad format to the kernel clipboard format
8
	add	edi,3*4
9
	mov	esi,[copy_buf]
10
	mov	ecx,[copy_count]
11
	cld
12
;--------------------------------------
13
@@:
14
	push	ecx
15
	lodsd
16
	mov	ecx,eax
17
	lodsw
18
	rep	movsb
4552 mario79 19
	mov	ax,0x0a0d ; EOS (end of string)
4487 mario79 20
	stosw
21
;	mov	ax,0x0d
22
;	stosb
23
	pop	ecx
24
	dec	ecx
25
	jnz	@b
26
 
4552 mario79 27
	sub	edi,2 ; delete last EOS (0x0a0d)
4487 mario79 28
	xor	eax,eax
29
	stosb
30
; building the clipboard slot header
31
	mov	esi,[clipboard_buf]
32
	sub	edi,esi
33
	mov	[esi],edi ; clipboard area size
34
	xor	eax,eax
35
	mov	[esi+4],eax ;	; type 'text'
36
	inc	eax
37
	mov	[esi+8],eax	; cp866 text encoding
38
; put slot to the kernel clipboard
39
	mov	edx,[clipboard_buf]
40
	mov	ecx,[edx]
41
	mcall	54,2
42
; remove unnecessary memory area
43
	xor	eax,eax
44
        stdcall mem.ReAlloc,[clipboard_buf],eax
45
        mov     [clipboard_buf],eax
46
	xor	eax,eax
47
	mov	[copy_size],eax
48
        mov     [copy_count],eax
49
        stdcall mem.ReAlloc,[copy_buf],eax
50
        mov     [copy_buf],eax
51
;--------------------------------------
52
.end:
53
	ret
54
;-----------------------------------------------------------------------------
55
get_from_clipboard:
56
	pushad
57
	mcall	54,0
58
; no slots of clipboard ?
59
	test	eax,eax
60
	jz	.exit
61
; main list area not found ?
62
	inc	eax
63
	test	eax,eax
64
	jz	.exit
65
 
66
	sub	eax,2
67
	mov	ecx,eax
68
	mcall	54,1
69
; main list area not found ?
70
	inc	eax
71
	test	eax,eax
72
	jz	.exit
73
; error ?
74
	sub	eax,2
75
	test	eax,eax
76
	jz	.exit
77
 
78
	inc	eax
79
	mov	[clipboard_buf],eax
80
; check contents of container
81
	mov	ebx,[eax+4]
82
; check for text
83
	test	ebx,ebx
84
	jnz	.no_valid_text
85
 
86
	mov	ebx,[eax+8]
87
; check for cp866
88
	cmp	bl,1
89
	jz	.yes_valid_text
90
 
91
.no_valid_text:
92
	xor	eax,eax
93
	mov	[copy_size],eax
94
	jmp	.remove_area
95
;--------------------------------------
96
.yes_valid_text:
97
	call	know_number_line_breaks
98
        mov     [copy_count],ebx
99
 
100
	mov	eax,[clipboard_buf]
101
	sub	esi,eax
102
	mov	[eax],esi
103
 
104
	shl	ebx,1
105
	lea	ebx,[ebx*3]
106
 
107
	mov	eax,[clipboard_buf]
108
	mov	eax,[eax]
109
	sub	eax,4*3
110
	add	eax,ebx
111
        mov     [copy_size],eax
112
 
113
        stdcall mem.ReAlloc,[copy_buf],eax
114
        mov     [copy_buf],eax
115
 
116
	call	convert_clipboard_buf_to_copy_buf
117
; remove unnecessary memory area
118
.remove_area:
119
	xor	eax,eax
120
        stdcall mem.ReAlloc,[clipboard_buf],eax
121
        mov     [clipboard_buf],eax
122
;--------------------------------------
123
.exit:
124
	popad
125
	ret
126
;-----------------------------------------------------------------------------
4489 mario79 127
check_clipboard_for_popup:
128
	pushad
129
	mov	[popup_valid_text],0
130
	mcall	54,0
131
; no slots of clipboard ?
132
	test	eax,eax
133
	jz	.exit
134
; main list area not found ?
135
	inc	eax
136
	test	eax,eax
137
	jz	.exit
138
 
139
	sub	eax,2
140
	mov	ecx,eax
141
	mcall	54,1
142
; main list area not found ?
143
	inc	eax
144
	test	eax,eax
145
	jz	.exit
146
; error ?
147
	sub	eax,2
148
	test	eax,eax
149
	jz	.exit
150
 
151
	inc	eax
152
	mov	[clipboard_buf],eax
153
; check contents of container
154
	mov	ebx,[eax+4]
155
; check for text
156
	test	ebx,ebx
157
	jnz	.remove_area
158
 
159
	mov	ebx,[eax+8]
160
; check for cp866
161
	cmp	bl,1
162
	jnz	.remove_area
163
 
164
.yes_valid_text:
165
	mov	[popup_valid_text],1
166
; remove unnecessary memory area
167
.remove_area:
168
	xor	eax,eax
169
        stdcall mem.ReAlloc,[clipboard_buf],eax
170
        mov     [clipboard_buf],eax
171
;--------------------------------------
172
.exit:
173
	popad
174
	ret
175
;-----------------------------------------------------------------------------
4487 mario79 176
convert_clipboard_buf_to_copy_buf:
177
	mov	edi,[copy_buf]
178
	mov	ebx,edi
179
	add	edi,6
180
	mov	eax,[clipboard_buf]
181
	mov	esi,eax
182
	add	esi,4*3
183
	mov	ecx,[eax]
4552 mario79 184
	sub	ecx,4*3-1
4487 mario79 185
	xor	edx,edx
186
	cld
187
;--------------------------------------
188
.loop:
189
	lodsb
4552 mario79 190
 
4487 mario79 191
	test	al,al
4552 mario79 192
	jz	.end_of_data
4487 mario79 193
 
194
	cmp	al,0x0d
195
	je	.check_0x0a
196
 
197
	cmp	al,0x0a
198
	je	.inc_counter
4552 mario79 199
 
4487 mario79 200
	dec	ecx
201
	jz	.end_of_data
202
 
203
	stosb
204
	jmp	.loop
205
;--------------------------------------
206
.check_0x0a:
207
	dec	ecx
208
	jz	.end_of_data
209
 
210
	cmp	[esi],byte 0x0a
211
	jne	@f
212
 
213
	lodsb
214
;--------------------------------------
215
.inc_counter:
216
	dec	ecx
217
	jz	.end_of_data
218
;--------------------------------------
219
@@:
220
	mov	eax,edi
221
	sub	eax,ebx
222
	sub	eax,6
4505 mario79 223
	mov	[ebx],eax ; size of current string
4487 mario79 224
	mov	ebx,edi
225
	add	edi,6
226
	inc	edx
227
	jmp	.loop
228
;--------------------------------------
229
.end_of_data:
4552 mario79 230
	mov	eax,edi
231
	sub	eax,ebx
232
	sub	eax,6
233
	mov	[ebx],eax ; size of current string
4487 mario79 234
	sub	edi,[copy_buf]
235
        mov     [copy_size],edi
236
	ret
237
;-----------------------------------------------------------------------------
238
know_number_line_breaks:
239
; to know the number of line breaks
240
	mov	eax,[clipboard_buf]
241
	mov	esi,eax
242
	add	esi,4*3
243
	mov	ecx,[eax]
244
	sub	ecx,4*3
245
	xor	ebx,ebx
246
	cld
247
;--------------------------------------
248
@@:
249
	lodsb
250
 
251
	test	al,al
252
	jz	.end_of_data_1
253
 
254
	cmp	al,0x0d
255
	je	.check_0x0a
256
 
257
	cmp	al,0x0a
258
	je	.inc_counter
259
 
260
	dec	ecx
261
	jnz	@b
262
 
263
	jmp	.end_of_data
264
;--------------------------------------
265
.check_0x0a:
266
	inc	ebx
267
	dec	ecx
268
	jz	.end_of_data
269
 
270
	cmp	[esi],byte 0x0a
271
	jne	@b
272
 
273
	lodsb
274
	dec	ecx
275
	jnz	@b
276
 
277
	jmp	.end_of_data
278
;--------------------------------------
279
.inc_counter:
280
	inc	ebx
281
	dec	ecx
282
	jnz	@b
283
;--------------------------------------
284
.end_of_data_1:
285
	cmp	[esi-2],byte 0x0d
286
	je	.end_of_data
287
 
288
	cmp	[esi-2],byte 0x0a
289
	je	.end_of_data
290
 
291
	inc	ebx
292
	inc	esi
293
;--------------------------------------
294
.end_of_data:
4552 mario79 295
	inc	ebx
4487 mario79 296
	ret
297
;-----------------------------------------------------------------------------