Page 6 of 13

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 8:16 pm
by Serge
Хорошо, сделаю. Но сначала надо API придумать.
Какие данные должен хранить буфер и в каком формате. Как читать и писать ?

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 8:42 pm
by Leency
Я не силён в придумывании API, что-то вроде:

=== Функция 73 ===
- Подфункция 1 - поместить данные в буфер обмена
- Подфункция 2 - прочитать данные
- Подфункция 3 - очистить буфер обмена

Обмен через структуру:
а) тип данных - 1 - число, 2 - строка, 3 - файл где есть адрес файла/его имя затем идут данные, 4 - просто двоичные данные
б) имя программы/её PID, которая поместила данные в буфер

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 8:46 pm
by SoUrcerer
Предлагаю использовать строку с MIME-типом в качестве типа данных. Кому нужно будет просто текст - будет её игнорировать. Вместо содержимого файла/файлов лучше хранить их адреса - будет куда быстрее. Хотя можно оба варианта.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:02 pm
by Serge
Я бы свел всё к трём типам:
1. Текстовая UTF-16 ( или 32 ? ) строка с указанием длины.
2. Битмап 24 и 32 bpp с указанием размеров.
3. Raw данные с укзанием размера. В этом случае может храниться всё что угодно, вначале следует заголовок стандартного размера, затем данные.

Ядро одновременно хранит по одному объекту каждого типа. Запись нового объекта уничтожает предыдущий.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:07 pm
by Leency
Нормально, а имя программы, которая поместила данные в буфер и её PID?

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:09 pm
by Serge
А зачем ? Не проблема конечно.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:16 pm
by SoUrcerer
А как узнать, что вставлять? По ctrl+shift+v можно организовать помещение asciiz-строки в буфер клавиш, полученных от клавы?

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:27 pm
by Serge
Это сама программа должна обрабатывать нажатие клавиш. И потом читать буфер обмена.
Кстати строка должна быть в unicode.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:32 pm
by Leency
Serge wrote:А зачем ? Не проблема конечно.
Я думаю, пригодиться. Можно будет даже организовать чат между программами по типу IPC, только быстрее и проще. Ещё могут быть скопированые специфические данные для какой-то конкретной программы.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:35 pm
by 0CodErr
Такой вариант:


SysFnXX: Работа с общесистемным буфером обмена
eax = XX

Подфункция 1: Скопировать в буфер
ebx = 1
ecx = количество копируемых байт
edx = тип данных
esi = указатель на копируемые данные

Подфункция 2: Прочитать из буфера
ebx = 2
ecx = количество читаемых байт
edi = указатель на буфер-приёмник

Подфункция 3: Узнать тип данных в буфере
ebx = 3

Подфункция 4: Узнать количество байт в буфере
ebx = 4

Подфункция 5: Очистить буфер
ebx = 5


Соглашение о типах только между приложениями. Ядру должно быть всё равно что в буфере.
Сначала приложение узнаёт тип данных, и если оно может с ним работать, то читает данные.

Какой будет максимально возможный размер буфера?
А то кто-нибудь скопирует туда очень много и будет оно там висеть.

PID программы, поместившей данные, думаю, что не нужен.



Подфункции 3 и 4 можно объединить в одну "Получить информацию о данных буфера".
Возвращаемые значения: eax = тип данных; edx = количество байт.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:53 pm
by Serge
Можно будет даже организовать чат между программами по типу IPC, только быстрее и проще.
Так и подумал. Вот за это надо будет сразу бить по рукам. Для IPC есть свои функции. Если они кривые и неудобные сделайте новые прямые и удобные.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 9:55 pm
by Serge
0CodErr
Прежде чем работать с буфером его надо заблокировать. А потом разблокировать.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 10:25 pm
by SoUrcerer
Serge wrote:Если они кривые и неудобные сделайте новые прямые и удобные.
Ты это о руках, конечно?:)

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 10:47 pm
by Serge
Думаю надо делать два отдельных режима хранения текста. ASCIIZ с указанием локали (кодовой таблицы) и unicode.

Re: Общесистемный буфер обмена

Posted: Fri Dec 07, 2012 10:48 pm
by johnfound
Serge wrote:0CodErr
Прежде чем работать с буфером его надо заблокировать. А потом разблокировать.
О синхронизации должно заботится ядро ИМХО. Для приложении все должно работать прозрачно.