Page 1 of 2
Получение слота потока по его идентификатору
Posted: Sat Aug 18, 2007 4:26 pm
by Alver
Просматривая функции ядра Kolibri, я не нашел каким образом можно получить номер слота потока(процесса) по его PID/TID. В тоже время большинство системных функций работают со слотами, а программы при создании потоков и запуске приложений получают идентификаторы.
Предлагаю добавить подфункцию 21 к функции 18 для определения номера слота по идентификатору, благо это займет всего несколько десятков байт и немного добавлений в файл 'kernel.asm':
В конец таблицы 'sys_system_table' добавить:
Code: Select all
dd sysfn_pid_to_slot ; 21 = get slot number for pid
А среди процедур, следующих за 'sys_system' вставить:
Code: Select all
sysfn_pid_to_slot:
mov eax, ebx
call pid_to_slot
mov [esp+36], eax
ret
И получим:
Function 18,21
Получение номера слота потока по его идентификатору
---------------------------------------------------
Параметры:
* eax = 18 - номер функции
* ebx = 21 - номер подфункции
* ecx = PID/TID (идентификатор процесса/потока)
Возвращаемое значение:
* eax = номер слота потока если он существует или 0, если PID/TID ложный.
Posted: Sat Aug 18, 2007 10:09 pm
by Mario79
Alver
Собственно я может, и туплю, но где сама процедура pid_to_slot?
Posted: Sun Aug 19, 2007 1:02 pm
by Serge
Mario79
В taskman.inc
Posted: Sun Aug 19, 2007 5:57 pm
by Alver
Mario79
Да, 'pid_to_slot' есть в ядре, и используется некоторыми функциями, но прямого вызова пока почемуто не было предусмотрено.
Прежде чем предлагать, я cкомпилил эту фишку в ядре, проверял простенькой прогой через CPUID - работало.
Вообще я хотел расширить ядро еще функциями сворачивания/восстановления окна указанного процесса (сейчас есть только своего). Это моглобы позволить добавить в интерфейс панели кнопки расчистки рабочего стола и даже подобие виртуальных рабочих мест, но не вышло, не врубился как работают функции 'minimize_window' и 'restore_minimized_window'.

Posted: Sun Aug 19, 2007 6:36 pm
by mike.dld
Отдельная функция такого рода не нужна (для мнимизации окна). Нужна функция для установки состояния окна, то есть свернуть/развернуть, максимировать/восстановить, roll-up/roll-down. Вот это было бы действительно полезно.
Posted: Sun Aug 19, 2007 7:16 pm
by Alver
Только успел запоститься и обнаружил причину неудачи с минимизацией.
Ленин
Отдельная функция такого рода не нужна (для мнимизации окна). Нужна функция для установки состояния окна, то есть свернуть/развернуть, максимировать/восстановить, roll-up/roll-down. Вот это было бы действительно полезно.
Никаких проблем не вижу, состояние устанавливается в процессе, все функции уже есть в ядре, нет только соответствующих входов.
Привожу доработку:
Code: Select all
Function 18,22
Минимизация/восстановление окна процесса.
----------------------------------------------------
Параметры:
* eax = 18 - номер функции
* ebx = 22 - номер подфункции
* ecx = Тип операции
0 - минимизация окна (сворачивание на панель) по номеру слота потока
1 - минимизация окна по идентификатору PID/TID
2 - Восстановление минимизированного окна по слоту потока
3 - Восстановление минимизированного окна по идентификатору PID/TID
* edx = Параметр операции (Номер слота или PID/TID)
Возвращаемое значение:
* eax = 0 - Завершилась успешно
-1 - Не получилось.
Дополнительные изменения в файле 'kernel.asm'
В конец таблицы 'sys_system_table' добавить:
Code: Select all
dd sysfn_min_rest_window ; 22 = minimize and restore any window
Среди процедур, следующих за 'sys_system' вставить:
Code: Select all
sysfn_min_rest_window:
pushad
mov eax, ecx ; ebx - operating
shr ebx, 1
jnc @f
call pid_to_slot
@@: ; eax - Номер слота потока
or eax, eax ; eax - number of slot
jz .error
xor ecx, ecx
mov cx, [WIN_STACK + eax*2] ; ecx - window number
mov eax, ecx
shr ebx, 1
jc .restore
; .minimize:
call minimize_window
jmp .exit
.restore:
call restore_minimized_window
.exit:
popad
xor eax, eax
mov [esp+36], eax
ret
.error:
popad
xor eax, eax
dec eax
mov [esp+36], eax
ret
Максимизация пока не поддерживается, не понял я как она производится.
Posted: Sun Aug 19, 2007 10:10 pm
by Alver
Я извиняюсь конечно что отошел от заявленной темы, но раз уж начал...
Состряпал маленькую прогу для сворачивания окошек рабочего стола, использующую новые функции.
Исходник здесь:
http://alver-mage.narod.ru/Kolibri/clean_src.7z
Posted: Mon Aug 20, 2007 7:37 am
by Mario79
Alver
Не пора ли в таком случае залить на SVN?
Попроси у Mike.dld (Ленин) регистрацию и вперед.
Posted: Mon Aug 20, 2007 10:51 am
by vectoroc
Не лучше ли ввести подобие сообщений в виндовс? Послал окну сообщение свернуться - оно и свернулось само, если захочет...
Так на каждое действие прийдётся новую функцию клепать
Posted: Mon Aug 20, 2007 5:07 pm
by bw
А так придется новые сообщения и обработчики клепать, не вижу разницы.
К тому же это совсем др. вешь и служит она для др. целей. И вообще то, в винде окна сворачиваются вызовом функции, а не посылкой сообщения.
..bw
Posted: Mon Aug 20, 2007 8:31 pm
by Alver
В проце sysfn_min_rest_window пожалуй стоит добавить ограничение на максимальный слот иначе может какая уязвимость выплывет.
Code: Select all
sysfn_min_rest_window:
pushad
mov eax, ecx ; ebx - operating
shr ebx, 1
jnc @f
call pid_to_slot
@@: ; eax - Номер слота потока.
or eax, eax ; eax - number of slot
jz .error
cmp eax, 255 ; varify maximal slot number
ja .error ; Проверка на выход за пределы слотов
xor ecx, ecx
mov cx, [WIN_STACK + eax*2] ; ecx - window number
mov eax, ecx
shr ebx, 1
jc .restore
; .minimize:
call minimize_window
jmp .exit
.restore:
call restore_minimized_window
.exit:
popad
xor eax, eax
mov [esp+36], eax
ret
.error:
popad
xor eax, eax
dec eax
mov [esp+36], eax
ret
Я не знаю есть ли в Kolibri константа или переменная, указывающая максимально возможное число слотов, если есть то правильнее было бы конечно использовать ее вместо 255.
Posted: Mon Aug 20, 2007 8:45 pm
by Alver
Mario79
Не пора ли в таком случае залить на SVN?
Попроси у Mike.dld (Ленин) регистрацию и вперед.
Если честно то я с SVN как то не очень, скачивать через kdesvn научился, но лезть на сервер пожалуй побоюсь.
Если кто может залить то пожалуйста.
Описание изменений поместил здесь:
http://alver-mage.narod.ru/Kolibri/koos_kernel.htm
Скомпилированное ядро:
http://alver-mage.narod.ru/Kolibri/Kernel_M.7z
Програмка сворачивания стола:
http://alver-mage.narod.ru/Kolibri/clean.7z
Ее исходник:
http://alver-mage.narod.ru/Kolibri/clean_asm.7z
Да думаю програмку в SVN пихать не нужно, она скорее для прикола.

Posted: Mon Aug 20, 2007 10:21 pm
by vectoroc
Alver сходи на
http://wiki.kolibrios.org/index.php/Как ... ом_Kolibri
bw в итоге всё сводится к фунциям, абстрагируясь, можно помоему более гибко реализовать этот сервис через сообщения
Posted: Mon Aug 20, 2007 10:46 pm
by bw
> в итоге всё сводится к фунциям, абстрагируясь, можно помоему более гибко реализовать этот сервис через сообщения
Реализуй сообщения через IPC, зачем впутывать ядро. К тому же это сомнительная гибкость, как я сказал. Всеравно нужно реализовывать обработчик. Удобство в основном состоит в том что бы вызывать фукнциональность процесса (окна) не предусмотренную ядром (графической системой). Ну да ладно, сейчас мы уйдем в спор, который ни к чему не приведет. Только зафлудим тему.
..bw
Posted: Tue Aug 21, 2007 9:27 pm
by Alver
Mario79
Ввиду того что от изначально заявленной темы осталось только 3.5 первых поста, не мог бы ты как администратор поменять название темы на более подходящее, или перенести последние посты в другую тему, скажем "О минимизации окон и т.п." или чтото в этом духе.
vectoroc
Использовать сообщения для минимизации окна, помоему больший геморой, и меньшая функциональность.
Попробую обьяснить свою позицию. Минимизация и восстановление окна фактически является элементом интерфейса рабочего стола, и служит для освобождения от нагромождений открытых приложений. Используя новые функции, можно доработать код панели, для быстрой очистки-восстановления desktopа, можно даже сделать возможность разделить окна на группы, получив подобие виртуальных рабочих мест как в GNOME,KDE и т.п. Если использовать для этих целей сообщения, вопервых время отклика возрастет, во вторых в kolibri насколько я понял, обработка кнопки сворачивания ведется ядром а не программой, если передать контроль этой функции программе, то придется переписывать все приложения, если сделать для программ возможность выбора контролировать/нет то передача сообщений неконтролирующим программам будет бесполезна.