Subversion Repositories Kolibri OS

Rev

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