forked from KolibriOS/kolibrios
Kernel Clipboard. f.54.
git-svn-id: svn://kolibrios.org@4199 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
2671910c07
commit
9c4fa92828
148
kernel/trunk/core/clipboard.inc
Normal file
148
kernel/trunk/core/clipboard.inc
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
;------------------------------------------------------------------------------
|
||||||
|
align 4
|
||||||
|
sys_clipboard:
|
||||||
|
xor eax, eax
|
||||||
|
dec eax
|
||||||
|
; check availability of main list
|
||||||
|
cmp [clipboard_main_list], eax
|
||||||
|
je .exit_1 ; main list area not found
|
||||||
|
|
||||||
|
test ebx, ebx ; 0 - Get the number of slots in the clipboard
|
||||||
|
jnz .1
|
||||||
|
; get the number of slots
|
||||||
|
mov eax, [clipboard_slots]
|
||||||
|
jmp .exit_1
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
align 4
|
||||||
|
.1:
|
||||||
|
dec ebx ; 1 - Read the data from the clipboard
|
||||||
|
jnz .2
|
||||||
|
; verify the existence of slot
|
||||||
|
cmp ecx, [clipboard_slots]
|
||||||
|
jae .exit_2
|
||||||
|
; get a pointer to the data of slot
|
||||||
|
shl ecx, 2
|
||||||
|
add ecx, [clipboard_main_list]
|
||||||
|
mov esi, [ecx]
|
||||||
|
mov ecx, [esi]
|
||||||
|
; allocate memory for application for copy the data of slots
|
||||||
|
push ecx
|
||||||
|
stdcall user_alloc, ecx
|
||||||
|
pop ecx
|
||||||
|
; copying data of slots
|
||||||
|
mov edi, eax
|
||||||
|
cld
|
||||||
|
rep movsb
|
||||||
|
jmp .exit_1
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
align 4
|
||||||
|
.2:
|
||||||
|
dec ebx ; 2 - Write the data to the clipboard
|
||||||
|
jnz .3
|
||||||
|
; check the lock
|
||||||
|
mov ebx, clipboard_write_lock
|
||||||
|
xor eax, eax
|
||||||
|
cmp [ebx], eax
|
||||||
|
jne .exit_2
|
||||||
|
; lock last slot
|
||||||
|
inc eax
|
||||||
|
mov [ebx], eax
|
||||||
|
; check the overflow pointer of slots
|
||||||
|
cmp [clipboard_slots], 1024
|
||||||
|
jae .exit_3
|
||||||
|
; get memory for new slot
|
||||||
|
push ebx ecx edx
|
||||||
|
stdcall kernel_alloc, ecx
|
||||||
|
pop edx ecx ebx
|
||||||
|
test eax, eax
|
||||||
|
jz .exit_3
|
||||||
|
; create a new slot
|
||||||
|
mov edi, eax
|
||||||
|
mov eax, [clipboard_slots]
|
||||||
|
shl eax, 2
|
||||||
|
add eax, [clipboard_main_list]
|
||||||
|
mov [eax], edi
|
||||||
|
; copy the data into the slot
|
||||||
|
mov esi, edx
|
||||||
|
mov eax, ecx
|
||||||
|
cld
|
||||||
|
stosd ; store size of slot
|
||||||
|
sub ecx, 4
|
||||||
|
add esi, 4
|
||||||
|
rep movsb ; store slot data
|
||||||
|
; increase the counter of slots
|
||||||
|
inc [clipboard_slots]
|
||||||
|
; unlock last slot
|
||||||
|
xor eax, eax
|
||||||
|
mov [ebx], eax
|
||||||
|
jmp .exit_1
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
align 4
|
||||||
|
.3:
|
||||||
|
dec ebx ; 3 - Delete the last slot in the clipboard
|
||||||
|
jnz .4
|
||||||
|
; check the availability of slots
|
||||||
|
mov eax, [clipboard_slots]
|
||||||
|
test eax, eax
|
||||||
|
jz .exit_2
|
||||||
|
; check the lock
|
||||||
|
mov ebx, clipboard_write_lock
|
||||||
|
xor eax, eax
|
||||||
|
cmp [ebx], eax
|
||||||
|
jne .exit_2
|
||||||
|
; lock last slot
|
||||||
|
inc eax
|
||||||
|
mov [ebx], eax
|
||||||
|
; decrease the counter of slots
|
||||||
|
mov eax, clipboard_slots
|
||||||
|
dec dword [eax]
|
||||||
|
; free of kernel memory allocated for the slot
|
||||||
|
mov eax, [eax]
|
||||||
|
shl eax, 2
|
||||||
|
add eax, [clipboard_main_list]
|
||||||
|
mov eax, [eax]
|
||||||
|
push ebx
|
||||||
|
stdcall kernel_free, eax
|
||||||
|
pop ebx
|
||||||
|
; unlock last slot
|
||||||
|
xor eax, eax
|
||||||
|
mov [ebx], eax
|
||||||
|
jmp .exit_1
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
align 4
|
||||||
|
.4:
|
||||||
|
dec ebx ; 4 - Emergency discharge of clipboard
|
||||||
|
jnz .exit
|
||||||
|
; check the lock
|
||||||
|
mov ebx, clipboard_write_lock
|
||||||
|
xor eax, eax
|
||||||
|
cmp [ebx], eax
|
||||||
|
je .exit_2
|
||||||
|
|
||||||
|
; there should be a procedure for checking the integrity of the slots
|
||||||
|
; and I will do so in the future
|
||||||
|
|
||||||
|
; unlock last slot
|
||||||
|
mov [ebx], eax
|
||||||
|
jmp .exit
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
align 4
|
||||||
|
.exit_3:
|
||||||
|
; unlock last slot
|
||||||
|
xor eax, eax
|
||||||
|
mov [ebx], eax
|
||||||
|
.exit_2:
|
||||||
|
xor eax, eax
|
||||||
|
inc eax ; error
|
||||||
|
.exit_1:
|
||||||
|
mov [esp + 32], eax
|
||||||
|
.exit:
|
||||||
|
ret
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
uglobal
|
||||||
|
align 4
|
||||||
|
clipboard_slots dd ?
|
||||||
|
clipboard_main_list dd ?
|
||||||
|
clipboard_write_lock dd ?
|
||||||
|
endg
|
||||||
|
;------------------------------------------------------------------------------
|
@ -184,7 +184,7 @@ iglobal
|
|||||||
dd syscall_threads ; 51-Threads
|
dd syscall_threads ; 51-Threads
|
||||||
dd undefined_syscall ; 52- deprecated Stack driver status
|
dd undefined_syscall ; 52- deprecated Stack driver status
|
||||||
dd undefined_syscall ; 53- deprecated Socket interface
|
dd undefined_syscall ; 53- deprecated Socket interface
|
||||||
dd undefined_syscall ; 54-reserved
|
dd sys_clipboard ; 54-Custom clipboard
|
||||||
dd sound_interface ; 55-Sound interface
|
dd sound_interface ; 55-Sound interface
|
||||||
dd undefined_syscall ; 56-reserved
|
dd undefined_syscall ; 56-reserved
|
||||||
dd sys_pcibios ; 57-PCI BIOS32
|
dd sys_pcibios ; 57-PCI BIOS32
|
||||||
|
@ -2427,6 +2427,70 @@ dword-значение цвета 0x00RRGGBB
|
|||||||
* eax = -1 - ошибка (в системе слишком много потоков)
|
* eax = -1 - ошибка (в системе слишком много потоков)
|
||||||
* иначе eax = TID - идентификатор потока
|
* иначе eax = TID - идентификатор потока
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
====================== Функция 54, подфункция 0 ======================
|
||||||
|
============== Узнать количество слотов в буфере обмена. =============
|
||||||
|
======================================================================
|
||||||
|
Параметры:
|
||||||
|
* eax = 54 - номер функции
|
||||||
|
* ebx = 0 - номер подфункции
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = количество слотов в буфере
|
||||||
|
* eax = -1 - отсутствует область главного списка
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
====================== Функция 54, подфункция 1 ======================
|
||||||
|
================== Считать данные из буфера обмена. ==================
|
||||||
|
======================================================================
|
||||||
|
Параметры:
|
||||||
|
* eax = 54 - номер функции
|
||||||
|
* ebx = 1 - номер подфункции
|
||||||
|
* eсx = номер слота
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = если успешно - указатель на область памяти с данными
|
||||||
|
* eax = 1 - ошибка
|
||||||
|
* eax = -1 - отсутствует область главного списка
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
====================== Функция 54, подфункция 2 ======================
|
||||||
|
================== Записать данные в буфер обмена. ===================
|
||||||
|
======================================================================
|
||||||
|
Параметры:
|
||||||
|
* eax = 54 - номер функции
|
||||||
|
* ebx = 2 - номер подфункции
|
||||||
|
* eсx = количество копируемых байт
|
||||||
|
* edx = указатель на буфер под копируемые данные
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = 0 - успешно
|
||||||
|
* eax = 1 - ошибка
|
||||||
|
* eax = -1 - отсутствует область главного списка
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
====================== Функция 54, подфункция 3 ======================
|
||||||
|
========= Удалить последний слот с данными в буфере обмена ===========
|
||||||
|
======================================================================
|
||||||
|
Параметры:
|
||||||
|
* eax = 54 - номер функции
|
||||||
|
* ebx = 3 - номер подфункции
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = 0 - успешно
|
||||||
|
* eax = 1 - ошибка
|
||||||
|
* eax = -1 - отсутствует область главного списка
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
====================== Функция 54, подфункция 4 ======================
|
||||||
|
=================== Аварийный сброс блокировки буфера ================
|
||||||
|
======================================================================
|
||||||
|
Параметры:
|
||||||
|
* eax = 54 - номер функции
|
||||||
|
* ebx = 4 - номер подфункции
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = 0 - успешно
|
||||||
|
* eax = -1 - отсутствует область главного списка или нет блокировки
|
||||||
|
Замечания:
|
||||||
|
* Используется в исключительных случаях, когда зависшее или убитое
|
||||||
|
приложение заблокировало работу с буфером обмена.
|
||||||
|
|
||||||
======================================================================
|
======================================================================
|
||||||
====================== Функция 55, подфункция 55 =====================
|
====================== Функция 55, подфункция 55 =====================
|
||||||
========== Начать проигрывать данные на встроенном спикере. ==========
|
========== Начать проигрывать данные на встроенном спикере. ==========
|
||||||
|
@ -2410,6 +2410,70 @@ Returned value:
|
|||||||
* otherwise eax = TID - thread identifier
|
* otherwise eax = TID - thread identifier
|
||||||
</UL>
|
</UL>
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
==================== Function 54, subfunction 0 ======================
|
||||||
|
============== Get the number of slots in the clipboard. =============
|
||||||
|
======================================================================
|
||||||
|
Parameters:
|
||||||
|
* eax = 54 - function number
|
||||||
|
* ebx = 0 - subfunction number
|
||||||
|
Returned value:
|
||||||
|
* eax = slots in the clipboard
|
||||||
|
* eax = -1 - main list area not found
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
==================== Function 54, subfunction 1 ======================
|
||||||
|
================= Read the data from the clipboard. ==================
|
||||||
|
======================================================================
|
||||||
|
Parameters:
|
||||||
|
* eax = 54 - function number
|
||||||
|
* ebx = 1 - subfunction number
|
||||||
|
* eсx = slot number
|
||||||
|
Returned value:
|
||||||
|
* eax = if successful - pointer to a memory with data
|
||||||
|
* eax = 1 - error
|
||||||
|
* eax = -1 - main list area not found
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
==================== Function 54, subfunction 2 ======================
|
||||||
|
================= Write the data to the clipboard. ===================
|
||||||
|
======================================================================
|
||||||
|
Parameters:
|
||||||
|
* eax = 54 - function number
|
||||||
|
* ebx = 2 - subfunction number
|
||||||
|
* eсx = the number of bytes to be copied
|
||||||
|
* edx = a pointer to a buffer for data to be copied
|
||||||
|
Returned value:
|
||||||
|
* eax = 0 - success
|
||||||
|
* eax = 1 - error
|
||||||
|
* eax = -1 - main list area not found
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
===================== Function 54, subfunction 3 =====================
|
||||||
|
================ Delete the last slot in the clipboard ===============
|
||||||
|
======================================================================
|
||||||
|
Parameters:
|
||||||
|
* eax = 54 - function number
|
||||||
|
* ebx = 3 - subfunction number
|
||||||
|
Returned value:
|
||||||
|
* eax = 0 - success
|
||||||
|
* eax = 1 - error
|
||||||
|
* eax = -1 - main list area not found
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
===================== Function 54, subfunction 4 =====================
|
||||||
|
===================== Alarm reset the lock buffer ====================
|
||||||
|
======================================================================
|
||||||
|
Parameters:
|
||||||
|
* eax = 54 - function number
|
||||||
|
* ebx = 4 - subfunction number
|
||||||
|
Returned value:
|
||||||
|
* eax = 0 - success
|
||||||
|
* eax = -1 - main list area not found or no blocking
|
||||||
|
Remarks:
|
||||||
|
* Used in exceptional cases, where no responsible or killed
|
||||||
|
application blocked the clipboard operations.
|
||||||
|
|
||||||
======================================================================
|
======================================================================
|
||||||
Function 55, subfunction 55 - begin to play data on built-in speaker.
|
Function 55, subfunction 55 - begin to play data on built-in speaker.
|
||||||
======================================================================
|
======================================================================
|
||||||
|
@ -698,6 +698,19 @@ no_mode_0x12:
|
|||||||
mov [mem_BACKGROUND], 4
|
mov [mem_BACKGROUND], 4
|
||||||
mov [img_background], static_background_data
|
mov [img_background], static_background_data
|
||||||
|
|
||||||
|
; set clipboard
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
mov [clipboard_slots], eax
|
||||||
|
mov [clipboard_write_lock], eax
|
||||||
|
stdcall kernel_alloc, 4096
|
||||||
|
test eax, eax
|
||||||
|
jnz @f
|
||||||
|
|
||||||
|
dec eax
|
||||||
|
@@:
|
||||||
|
mov [clipboard_main_list], eax
|
||||||
|
|
||||||
; SET UP OS TASK
|
; SET UP OS TASK
|
||||||
|
|
||||||
mov esi, boot_setostask
|
mov esi, boot_setostask
|
||||||
|
@ -171,6 +171,7 @@ include "core/v86.inc" ; virtual-8086 manager
|
|||||||
include "core/irq.inc" ; irq handling functions
|
include "core/irq.inc" ; irq handling functions
|
||||||
include "core/apic.inc" ; Interrupt Controller functions
|
include "core/apic.inc" ; Interrupt Controller functions
|
||||||
include "core/timers.inc"
|
include "core/timers.inc"
|
||||||
|
include "core/clipboard.inc" ; custom clipboard
|
||||||
|
|
||||||
; GUI stuff
|
; GUI stuff
|
||||||
include "gui/window.inc"
|
include "gui/window.inc"
|
||||||
|
Loading…
Reference in New Issue
Block a user