Новая модель ядра
-
А может это плеер не совсем правильно обрабатывает кнопки? Все остальные программы ведь закрываются. Ни у кого больше проблемы с закрытием нет. по крайне мере никто за прошедшее время не написал жалоб.
Mario
Плеер как раз правильно обрабатывает кнопки. Только это не системные кнопки. И поскольку ты закомментировал код он теперь не получает сообщений при клике в области заголовка.
Запускаю KFM, кликаю на пиктограме в меню и не отпуская кнопки веду курсор вниз. Кликаю на зелёной кнопке "Help" и не отпуская кнопки ведут курсор вверх. И причем здесь заголовок ?
Плеер как раз правильно обрабатывает кнопки. Только это не системные кнопки. И поскольку ты закомментировал код он теперь не получает сообщений при клике в области заголовка.
Запускаю KFM, кликаю на пиктограме в меню и не отпуская кнопки веду курсор вниз. Кликаю на зелёной кнопке "Help" и не отпуская кнопки ведут курсор вверх. И причем здесь заголовок ?
Вообще то он не получает события мыши если удерживать кнопку. А когда отпускается кнопка то события продолжают поступать. Ситуация неоднозначная. Если бы проблема была только в KFM, то я бы не парился. Однако код компонента FileBrowser унаследовал код KFM.
Mario
Надо проверять область, где нажата кнопка и ставить флаг, если это список. И снимать флаг когда кнопка отпущена.
Надо проверять область, где нажата кнопка и ставить флаг, если это список. И снимать флаг когда кнопка отпущена.
У меня есть мысль. Если новый флаг маски событий, который ты ввел недавно, используется для плеера, то можно учитывать его наличие и игнорировать мою коррекцию.
Mario
Я сделаю окно со стилем 5. Специально для окон, которые всю работу по перемещению и изменению размеров делают сами.
Я сделаю окно со стилем 5. Специально для окон, которые всю работу по перемещению и изменению размеров делают сами.
get_event_for_app работает для всех окон. Я не понимаю как ты собираешься это обходить? В моей идее все просто - проверяю установлен ли бит 31, если да то код:
не будет выполнятся. Всего то делов! Зачем городить огород с новым типом?
Code: Select all
push eax
; If the window is captured and moved by the user, then no mouse events!!!
mov al, [mouse.active_sys_window.action]
and al, WINDOW_MOVE_AND_RESIZE_FLAGS
test al, al
pop eax
jnz .loop
Mario
Плеер сам изменят размер окна, без участия ядра. Но ядро обрабатывает все события в заголовке, причём положение заголовка определяется ядром. Я не могу разместить его сбоку. Если я в плеере кликаю на кнопке в заголовке и двигаю мышь, ядро перемещает окно. Хотя это не требуется. От ядра требуется только активация окна и правильная карта отсечения. Поэтому я хочу сделать новый тип. Чем меньше ядро обрабатывает оконные события тем больше у меня возможностей. Для ядра это стиль "не делать ничего с этим окном"
Плеер сам изменят размер окна, без участия ядра. Но ядро обрабатывает все события в заголовке, причём положение заголовка определяется ядром. Я не могу разместить его сбоку. Если я в плеере кликаю на кнопке в заголовке и двигаю мышь, ядро перемещает окно. Хотя это не требуется. От ядра требуется только активация окна и правильная карта отсечения. Поэтому я хочу сделать новый тип. Чем меньше ядро обрабатывает оконные события тем больше у меня возможностей. Для ядра это стиль "не делать ничего с этим окном"
Last edited by Serge on Thu Mar 01, 2012 9:21 am, edited 1 time in total.
Ладно делай как знаешь, но для 31 бита я добавляю исключение в существующую схему. Код уже сделал и сейчас залью в SVN.
Mario
Потом эту заплатку надо будет убрать.
Потом эту заплатку надо будет убрать.
Не раньше чем исправлю box_lib и kfm.
З.Ы. Залил SVN r. 2426.
З.Ы. Залил SVN r. 2426.
Я пр исключение для 31 бита.
Сейчас схема такая:
- если бит 31 не установлен и приложение само отлавливает что оно находится на вершине оконного стека (проверка на уровне приложения), то при захвате заголовка (для перемещения окна) или захвате нижнего-правого угла (при изменении размеров окна) события мыши для этого окна фильтруются.
- если бит 31 установлен, и события мыши посылаются только если окно находится на вершине оконного стека (проверка на уровне ядра), то при захвате заголовка (для перемещения окна) или захвате нижнего-правого угла (при изменении размеров окна) события мыши для этого окна не фильтруются.
Когда я исправлю box_lib и kfm, то уберу всю логику:
Хотя если честно, то с такой логикой можно уже ничего не исправлять.
- если бит 31 не установлен и приложение само отлавливает что оно находится на вершине оконного стека (проверка на уровне приложения), то при захвате заголовка (для перемещения окна) или захвате нижнего-правого угла (при изменении размеров окна) события мыши для этого окна фильтруются.
- если бит 31 установлен, и события мыши посылаются только если окно находится на вершине оконного стека (проверка на уровне ядра), то при захвате заголовка (для перемещения окна) или захвате нижнего-правого угла (при изменении размеров окна) события мыши для этого окна не фильтруются.
Когда я исправлю box_lib и kfm, то уберу всю логику:
Spoiler:
Code: Select all
cmp eax, 5; Mouse 5+1=6
jne .no_mouse_check
push eax
mov eax, [TASK_BASE]
mov eax, [eax + TASKDATA.event_mask]
test eax, 0x80000000 ; bit 31: active/inactive filter f.40
jz @f
pop eax
jmp .no_mouse_check
@@:
; If the window is captured and moved by the user, then no mouse events!!!
mov al, [mouse.active_sys_window.action]
and al, WINDOW_MOVE_AND_RESIZE_FLAGS
test al, al
pop eax
jnz .loop
.no_mouse_check:
Прежде, чем пускаться во все тяжкие с long mode, я решил немного почистить ядро. Для начала перенесу все константные переменные вида в data32.inc, чтобы одни выглядели так а другие так и если у меня хватит терпения, сделаю краткое описание некоторых переменных ядра.
Изучение завалов поставило поставило несколько вопросов
Нужно ли массиву DRIVE_DATA 65536 байт ?
Нужно ли по 32768 байт для хранения скина и для BgrAuxTable ?
Сколько на самом деле памяти требуют
BTN_BUFF equ (OS_BASE+0x000F501)
BPSLine_calc_area equ (OS_BASE+0x02C4000) и
d_width_calc_area equ (OS_BASE+0x02CA000) ?
Нужен ли рестарт ядра, если usb клавиатура больше не эмулируется, да и сам рестарт работает не у всех ?
Code: Select all
MOUSE_SCROLL_H equ (OS_BASE+0x000FB08)
MOUSE_X equ (OS_BASE+0x000FB0A)
MOUSE_Y equ (OS_BASE+0x000FB0C)
MOUSE_SCROLL_V equ (OS_BASE+0x000FB0E)
MOUSE_COLOR_MEM equ (OS_BASE+0x000FB10)
COLOR_TEMP equ (OS_BASE+0x000FB30)
BTN_DOWN equ (OS_BASE+0x000FB40)
MOUSE_DOWN equ (OS_BASE+0x000FB44)
X_UNDER equ (OS_BASE+0x000FB4A)
Y_UNDER equ (OS_BASE+0x000FB4C)
Code: Select all
MOUSE_PICTURE rd 1
MOUSE_SCROLL_H rw 1
MOUSE_X: rw 1
MOUSE_Y: rw 1
MOUSE_SCROLL_V rw 1
X_UNDER rw 1
Y_UNDER rw 1
COLOR_TEMP rd 1
MOUSE_COLOR_MEM rd 1
Code: Select all
SLOT_BASE: rb 64*1024
DRIVE_DATA: rb 64*1024
RESERVED_PORTS: rb 64*1024
FLOPPY_BUFF: rb 16*1024
BUTTON_INFO: rb 16*1024
BgrAuxTable: rb 32*1024
skin_data: rb 32*1024
window_data: rb 8192
CURRENT_TASK: rb 8192
draw_data: rb 4096
WIN_STACK: rb 0x400
WIN_POS: rb 0x800
Изучение завалов поставило поставило несколько вопросов
Нужно ли массиву DRIVE_DATA 65536 байт ?
Нужно ли по 32768 байт для хранения скина и для BgrAuxTable ?
Сколько на самом деле памяти требуют
BTN_BUFF equ (OS_BASE+0x000F501)
BPSLine_calc_area equ (OS_BASE+0x02C4000) и
d_width_calc_area equ (OS_BASE+0x02CA000) ?
Нужен ли рестарт ядра, если usb клавиатура больше не эмулируется, да и сам рестарт работает не у всех ?
Last edited by Serge on Mon May 27, 2013 10:36 pm, edited 1 time in total.
Good work serge, perhaps you can get some ideas from the work already done by mike.dld in ostin kernel (https://github.com/ostin-project/ostin-kernel)
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
Who is online
Users browsing this forum: No registered users and 0 guests