Не знаю, куда это писать, напишу здесь. Давно уже заметил этот баг. Во время длительной работы с системой, связанной с частым запуском и завершением приложений, происходит "отказ" кнопок в программах. Сначала отваливаются кнопки заголовков окон, а затем и все остальные. Долго мне было непонятно отчего это происходит и как воспроизвести этот баг, но вот я нашел
способ. Запускаем программу period в 10 экземплярах, и кнопки закрыть/свернуть перестают работать. То же самое можно проделать с приложением calc, но тогда его нужно запустить в 28 экземплярах. Очевидно, что быстрота достижения этого эффекта зависит от количества кнопок в программе. В описании функции 8 сказано, что максимальное число кнопок во всех программах - 4095, здесь же только ~1200 кнопок.
Вряд ли от этого что-то зависит, но на всякий случай: VMware, 2Gb, 1366x768.
Баг с кнопками
Баг давно висел в http://bugs.kolibri-n.org/?id=18
Я написал крохотную программу (в аттаче), чтобы проверить действительно ли баг имеет место быть.
Она создает 5000 кнопок. После того как кнопки создались, следует щелкнуть на видимую кнопку (которая создалась последней) => через notify отобразится ее ID.
У меня это получилось 4044.
Я написал крохотную программу (в аттаче), чтобы проверить действительно ли баг имеет место быть.
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;
}
}
У меня это получилось 4044.
- Attachments
-
-
bug_with_buttons.zip (1.75 KiB)Downloaded 342 times
-
Из хаоса в космос
Я имел в виду несколько другое.
Можно сделать программу, которая создает 900 кнопок (30x30) (id = 17..916).
При нажатии на кнопку, программа выводит на доску отладки id кнопки. Здесь всё правильно, но если запустить три экземпляра такой программы, то кнопки "закрыть" и "свернуть" перестают работать.
Попробуй сделать так, как на скриншоте и увидишь, что закрыть окна нажатием на крестик будет невозможно (в том числе и окно Eolite).
Можно сделать программу, которая создает 900 кнопок (30x30) (id = 17..916).
При нажатии на кнопку, программа выводит на доску отладки id кнопки. Здесь всё правильно, но если запустить три экземпляра такой программы, то кнопки "закрыть" и "свернуть" перестают работать.
Попробуй сделать так, как на скриншоте и увидишь, что закрыть окна нажатием на крестик будет невозможно (в том числе и окно Eolite).
Spoiler:
- Attachments
-
-
BUTTONS (6.85 KiB)Downloaded 343 times
-
sysfuncs.txt wrote: * Total number of buttons for all applications is limited to 4095.
Надо считать, сколько всего во всей системе в данный момент кнопок.akron1 wrote:здесь же только ~1200 кнопок.
Какие-то программы могут работать неправильно: не удалять уже нарисованные кнопки.
Была похожая проблема с программой @SS - скринсейвер
В общем, да, баг есть. Надо смотреть исходник BUTTONS и надо дебажить ядро.
Из хаоса в космос
Добавил в button.inc вывод на доску отладки(DEBUGF) вот тутПри двойном щелчке на кнопки закрытия и сворачивания происходит максимизация окна(если оно sizable), при нажатии правой кнопкой мыши — сворачивание в заголовок, а минимизация и закрытие не работает.
Ещё вариант:Если кому интересно — вот моя сборка
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
Попробовал, вывод на BOARDakron1 wrote:можно проделать с приложением calc
Spoiler:
Ещё вариант:
- Запустите BOARD
Запустите Process manager(CPU)
Наблюдайте постепенное увеличение количества кнопок на BOARD("Buttons = ")
Spoiler:
Может заодно перенести код:
из button.inc в mouse.inc (я не увидел, чтобы где-то ещё использовался вызов call sys_button_perform_handler).
В обработке курсора мыши есть деактивация системных кнопок, всякое бывает - вдруг как-то срабатывает, повесь обработчик где-то здесь:
К тому же у событий свой буфер нажатых кнопок, который ограничен байтом:
Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?
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
В обработке курсора мыши есть деактивация системных кнопок, всякое бывает - вдруг как-то срабатывает, повесь обработчик где-то здесь:
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
создаются две стандартные кнопки: закрытия окна с идентификатором 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:Может заодно перенести код:из button.inc в mouse.inc (я не увидел, чтобы где-то ещё использовался вызов call sys_button_perform_handler).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
В window.inc тоже есть некоторые handler-ы
- sys_window_maximize_handler
sys_window_rollup_handler
sys_window_end_moving_handler
sys_window_moving_handler
Одно с другим не связано. Это просто идентификатор и он не обязан быть меньше числа 4096. Вполне может быть равен, например, 8192 и более, если это удобно приложению.theonlymirage wrote:Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?
Вот, точно. Я обычно замечал эффект "отказа" кнопок во время программирования в KolibriOS. А во время кодинга часто приходится открывать Process manager, чтобы прервать программу, которая зациклилась, и обычно через 1-2 часа приходилось перезапускать систему из-за полной неработоспособности кнопок.Ещё вариант:
Запустите BOARD
Запустите Process manager(CPU)
Наблюдайте постепенное увеличение количества кнопок на BOARD("Buttons = ")
Лично я трогать не буду, но я бы перенёс только этот кусок, окна бы оставил; но ладно. Если возникнет необходимость, то перенести всегда успеете.
Спросил по тому, что это кнопка, и она получается индивидуальна. Все входят в указанный диапазон, и обрабатываются единым образом. А минимализация избранная, требует специального отличного способа обработки.0CodErr wrote:Это просто идентификатор и он не обязан быть меньше числа 4096. Вполне может быть равен, например, 8192 и более, если это удобно приложению.
Pipes при каждом клике создавало все кнопки заново не удаляя старые и на 2 уровне примерно все кнопки отваливались. Cpu тоже нужно сделать чтобы старые кнопки удалялись.
Из хаоса в космос
Еще утечка кнопок есть в главном меню, если открыть меню и водить по нему мышью. Но это не так критично, конечно. А вот CPU каждую секунду создает 24 новые кнопки. Ну что ж, теперь хотя бы понятно, в чем проблема.
Проверьте в этой версии CPU проблема с дублирующимися кнопками исправлена?
- Attachments
-
-
cpu.kex (1.79 KiB)Downloaded 331 times
-
Из хаоса в космос
Да, теперь нормально.
Who is online
Users browsing this forum: No registered users and 6 guests