Баг с кнопками

Kernel-side graphics support
  • Баг давно висел в http://bugs.kolibri-n.org/?id=18

    Я написал крохотную программу (в аттаче), чтобы проверить действительно ли баг имеет место быть.

    Code: Select all

    void main()
    {
    	int i=0;
    	word btn;
    	loop() switch(WaitEvent())
    	{
    		case evButton:
    			btn = GetButtonID();               
    			if (btn == 1) ExitProcess();
    			notify(itoa(btn));
    			break;
    		 
    		case evReDraw:
    			DefineAndDrawWindow(100, 100, 350, 300, 0x34, 0xEEEeee, "Window title",0);
    			if (i==0) for (i=0; i<5000; i++) UnsafeDefineButton(10,10, 80,20, i, 0xcccCCC);
    			break;
    	}
    }
    Она создает 5000 кнопок. После того как кнопки создались, следует щелкнуть на видимую кнопку (которая создалась последней) => через notify отобразится ее ID.
    У меня это получилось 4044.

    Image
    Attachments
    Downloaded 332 times
    Из хаоса в космос
  • Я имел в виду несколько другое.
    Можно сделать программу, которая создает 900 кнопок (30x30) (id = 17..916).
    При нажатии на кнопку, программа выводит на доску отладки id кнопки. Здесь всё правильно, но если запустить три экземпляра такой программы, то кнопки "закрыть" и "свернуть" перестают работать.
    Попробуй сделать так, как на скриншоте и увидишь, что закрыть окна нажатием на крестик будет невозможно (в том числе и окно Eolite).
    Spoiler:
    1.PNG
    1.PNG (40.69 KiB)
    Viewed 17182 times
    Attachments
    BUTTONS (6.85 KiB)
    Downloaded 329 times
  • sysfuncs.txt wrote: * Total number of buttons for all applications is limited to 4095.
    akron1 wrote:здесь же только ~1200 кнопок.
    Надо считать, сколько всего во всей системе в данный момент кнопок.
    Какие-то программы могут работать неправильно: не удалять уже нарисованные кнопки.
    Была похожая проблема с программой @SS - скринсейвер
  • В общем, да, баг есть. Надо смотреть исходник BUTTONS и надо дебажить ядро.
    Из хаоса в космос
  • Добавил в button.inc вывод на доску отладки(DEBUGF) вот тут

    Code: Select all

    syscall_button: ;////////////// system function 8 //////////////
    .................................................................
            ; do we actually need to undefine the button?
            test    edx, 0x80000000
            jnz     .remove_button
    
            ; do we have free button slots available?
            mov     edi, [BTN_ADDR]
            mov     eax, [edi]
            cmp     eax, button.MAX_BUTTONS
            jge     .exit
    DEBUGF  1, "K : Buttons = %d\n", eax
    akron1 wrote:можно проделать с приложением calc
    Попробовал, вывод на BOARD
    Spoiler:
    1.PNG
    1.PNG (27.95 KiB)
    Viewed 17120 times
    При двойном щелчке на кнопки закрытия и сворачивания происходит максимизация окна(если оно sizable), при нажатии правой кнопкой мыши — сворачивание в заголовок, а минимизация и закрытие не работает.

    Ещё вариант:
    • Запустите BOARD
      Запустите Process manager(CPU)
      Наблюдайте постепенное увеличение количества кнопок на BOARD("Buttons = ")
    Spoiler:
    1.PNG
    1.PNG (58.68 KiB)
    Viewed 17120 times
    Если кому интересно — вот моя сборка
    kolibri.img.7z (1.23 MiB)
    Downloaded 324 times
  • Может заодно перенести код:

    Code: Select all

    ;---------------------------------------------------------------
    sys_button_perform_handler:
    ;---------------------------------------------------------------
    ;> eax = pack[8(process slot), 24(button id)]
    ;> ebx = pack[16(button x coord), 16(button y coord)]
    ;> cl = mouse button mask this system button was pressed with
    ;---------------------------------------------------------------
            shl     eax, 8
            mov     al, cl
            movzx   ebx, byte[BTN_COUNT]
            mov     [BTN_BUFF + ebx * 4], eax
            inc     bl
            mov     [BTN_COUNT], bl
            ret
    
    из button.inc в mouse.inc (я не увидел, чтобы где-то ещё использовался вызов call sys_button_perform_handler).

    В обработке курсора мыши есть деактивация системных кнопок, всякое бывает - вдруг как-то срабатывает, повесь обработчик где-то здесь:

    Code: Select all

     ; did we press some button earlier?
            cmp     [mouse.active_sys_button.pbid], 0
            je      .buttons_changed
    
            ; yes we did, deactivate it
            xor     eax, eax
            xchg    eax, [mouse.active_sys_button.pbid]
            mov     ebx, [mouse.active_sys_button.coord]
            mov     cl, [mouse.active_sys_button.buttons]
            push    eax ebx
            call    sys_button_deactivate_handler
            pop     edx ecx
    
            ; is the button under cursor the one we deactivated?
            call    mouse._.find_sys_button_under_cursor
            cmp     eax, ecx
            jne     .exit
            cmp     ebx, edx
            jne     .exit
    
            ; yes it is, perform associated action
            mov     cl, [mouse.active_sys_button.buttons]
            call    sys_button_perform_handler
            jmp     .exit
    К тому же у событий свой буфер нажатых кнопок, который ограничен байтом:

    Code: Select all

    BTN_COUNT           = OS_BASE + 0x000F500
    BTN_BUFF            = OS_BASE + 0x000F501
    Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?
    создаются две стандартные кнопки: закрытия окна с идентификатором 1 и минимизации окна с идентификатором 0xffff.
    Кнопка с идентификатором 0xffff при нажатии интерпретируется системой как кнопка минимизации, система обрабатывает такое нажатие самостоятельно, не обращаясь к приложению. В остальном это обычная кнопка.
    Общее количество кнопок для всех приложений ограничено числом 4095.
  • theonlymirage wrote:Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?

    Code: Select all

    xor dx, dx
    dec dx
    или

    Code: Select all

    mov dx, -1
  • theonlymirage wrote:Может заодно перенести код:

    Code: Select all

    ;---------------------------------------------------------------
    sys_button_perform_handler:
    ;---------------------------------------------------------------
    ;> eax = pack[8(process slot), 24(button id)]
    ;> ebx = pack[16(button x coord), 16(button y coord)]
    ;> cl = mouse button mask this system button was pressed with
    ;---------------------------------------------------------------
            shl     eax, 8
            mov     al, cl
            movzx   ebx, byte[BTN_COUNT]
            mov     [BTN_BUFF + ebx * 4], eax
            inc     bl
            mov     [BTN_COUNT], bl
            ret
    
    из button.inc в mouse.inc (я не увидел, чтобы где-то ещё использовался вызов call sys_button_perform_handler).
    Думаю, не стоит.
    В window.inc тоже есть некоторые handler
    • sys_window_maximize_handler
      sys_window_rollup_handler
      sys_window_end_moving_handler
      sys_window_moving_handler
    Тогда и их по логике тоже надо переносить.
    theonlymirage wrote:Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?
    Одно с другим не связано. Это просто идентификатор и он не обязан быть меньше числа 4096. Вполне может быть равен, например, 8192 и более, если это удобно приложению.
  • Ещё вариант:
    Запустите BOARD
    Запустите Process manager(CPU)
    Наблюдайте постепенное увеличение количества кнопок на BOARD("Buttons = ")
    Вот, точно. Я обычно замечал эффект "отказа" кнопок во время программирования в KolibriOS. А во время кодинга часто приходится открывать Process manager, чтобы прервать программу, которая зациклилась, и обычно через 1-2 часа приходилось перезапускать систему из-за полной неработоспособности кнопок.
  • Лично я трогать не буду, но я бы перенёс только этот кусок, окна бы оставил; но ладно. Если возникнет необходимость, то перенести всегда успеете.
    0CodErr wrote:Это просто идентификатор и он не обязан быть меньше числа 4096. Вполне может быть равен, например, 8192 и более, если это удобно приложению.
    Спросил по тому, что это кнопка, и она получается индивидуальна. Все входят в указанный диапазон, и обрабатываются единым образом. А минимализация избранная, требует специального отличного способа обработки.
  • Pipes при каждом клике создавало все кнопки заново не удаляя старые и на 2 уровне примерно все кнопки отваливались. Cpu тоже нужно сделать чтобы старые кнопки удалялись.
    Из хаоса в космос
  • Еще утечка кнопок есть в главном меню, если открыть меню и водить по нему мышью. Но это не так критично, конечно. А вот CPU каждую секунду создает 24 новые кнопки. Ну что ж, теперь хотя бы понятно, в чем проблема.
  • Проверьте в этой версии CPU проблема с дублирующимися кнопками исправлена?
    Attachments
    cpu.kex (1.79 KiB)
    Downloaded 319 times
    Из хаоса в космос
  • Да, теперь нормально.
  • Who is online

    Users browsing this forum: No registered users and 3 guests