Новая модель ядра

Kernel architecture questions
  • Mario
    Плеер как раз правильно обрабатывает кнопки. Только это не системные кнопки. И поскольку ты закомментировал код он теперь не получает сообщений при клике в области заголовка.
    Запускаю KFM, кликаю на пиктограме в меню и не отпуская кнопки веду курсор вниз. Кликаю на зелёной кнопке "Help" и не отпуская кнопки ведут курсор вверх. И причем здесь заголовок ?
  • Вообще то он не получает события мыши если удерживать кнопку. А когда отпускается кнопка то события продолжают поступать. Ситуация неоднозначная. Если бы проблема была только в KFM, то я бы не парился. Однако код компонента FileBrowser унаследовал код KFM.
  • Mario
    Надо проверять область, где нажата кнопка и ставить флаг, если это список. И снимать флаг когда кнопка отпущена.
  • У меня есть мысль. Если новый флаг маски событий, который ты ввел недавно, используется для плеера, то можно учитывать его наличие и игнорировать мою коррекцию.
  • Mario
    Я сделаю окно со стилем 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.
  • Я пр исключение для 31 бита.
  • Сейчас схема такая:
    - если бит 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:
    
    Хотя если честно, то с такой логикой можно уже ничего не исправлять. :lol:
  • Прежде, чем пускаться во все тяжкие с long mode, я решил немного почистить ядро. Для начала перенесу все константные переменные вида

    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)
    
    в data32.inc, чтобы одни выглядели так

    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 1 guest