Неправильное состояние кнопок мыши при щелчке по заголовку

Internal structure and you change requests/suggestions
  • theonlymirage wrote: Багов с подобным механизмом много (имею в виду особый механизм обработки мыши в заголовке и кнопок заголовка), например:
    Запускаем калькулятор. Ставим его окно рядом с доком, но желательно не вплотную. Нажимаем по заголовку окна калькулятора правой кнопкой мыши, чтобы окно сжалось в заголовок. Нажимаем кнопку свернуть в заголовке окна калькулятора. Наводим курсор мыши на док, док появляется. Отводим мышь обратно на то место, где был калькулятор: док исчезает, а сжатое в заголовок окно калькулятора появляется на экране (напомню, мы его свернули и явно не раскрывали). Теперь развернуть окно калькулятора почти никак нельзя, только перезапускать.
    С Tinypad в этом случае ещё хуже. Зато у EOLite всё ок, он принудительно разворачивает своё окно.

    Видео по описанному багу с зависанием системы при выключении/перезагрузке системы (последнее воспроизводится редко, точная суть явления зависания не выяснена).
  • theonlymirage wrote:
    theonlymirage wrote: Багов с подобным механизмом много (имею в виду особый механизм обработки мыши в заголовке и кнопок заголовка), например:
    Запускаем калькулятор. Ставим его окно рядом с доком, но желательно не вплотную. Нажимаем по заголовку окна калькулятора правой кнопкой мыши, чтобы окно сжалось в заголовок. Нажимаем кнопку свернуть в заголовке окна калькулятора. Наводим курсор мыши на док, док появляется. Отводим мышь обратно на то место, где был калькулятор: док исчезает, а сжатое в заголовок окно калькулятора появляется на экране (напомню, мы его свернули и явно не раскрывали). Теперь развернуть окно калькулятора почти никак нельзя, только перезапускать.
    С Tinypad в этом случае ещё хуже. Зато у EOLite всё ок, он принудительно разворачивает своё окно.
    Видео по описанному багу с зависанием системы при выключении/перезагрузке системы (последнее воспроизводится редко, точная суть явления зависания не выяснена).
    Это действие каким-то образом меняет HEIGHT и CLIENT_HEIGHT у окон.
    Attachments
    bug.png
    bug.png (69.94 KiB)
    Viewed 5254 times
    Из хаоса в космос
  • То, что меняет размер это ожидаемо. Я ошибался, когда считал, что окно нужно подносить к доку и потом курсор обратно вести на область окна. Не нужно. Просто откройте любое окно, сверните его, наведите курсор на док и верните мышь поверх рабочего стола. Свёрнутое окно появится само.
    Так воспроизвести баг значительно проще!

    Возможно, в этом участке кода и меняется размер нашего активного окошка (но судя по коду, здесь изменение своего окна):

    Code: Select all

    wnd_hide:
        cmp     byte[win.state], 0
        je      main_loop
     
        mov     byte[nwin.close], 1
     
        mcall   18, 3, [win.psid]
     
        mov     byte[win.state], 0
        mov     byte[win.button_index], -1
     
        cmp     byte[dock_items.ashow],1
        je     .do_no_hide
     
        mov     eax, [win.width_hdn]
        mov     [win.width], eax
     
        mov     eax, [win.x_hdn]
        mov     [win.x], eax
     
        mov     eax, [win.height_hdn]
        mov     [win.height], eax
     
        mov     eax, [win.y_hdn]
        mov     [win.y], eax
     
        mcall   67, [win.x], [win.y], [win.width], [win.height]
     
    Ведь доку нужно на время стать активным, а потом вернуть как было. И видимо, он не думает, что мы могли свернуть последнее активное окно перед его стартом. Он при старте сохраняет его свёрнутым, а потом восстанавливает таким.
    Почему после сворачивания активного окна, оно всё ещё остаётся активным? И как это завешивает систему при выключении?
  • Leency wrote:Это действие каким-то образом меняет HEIGHT и CLIENT_HEIGHT у окон.
    4294967294 = 0xfffffffe = -2
    И об этом уже сообщалось.
    Вот в этом чате http://board.kolibrios.org/chatlogs/cha ... 03-25.html
    1.png
    1.png (8.91 KiB)
    Viewed 5239 times
  • В коде, что я скинул выше, закомментировал строчку:

    Code: Select all

    ;mcall   18, 3, [win.psid]
    Баг пропал и не проявляется. Значит здесь мы имеем два бага и похоже оба в системных функциях.

    Первый при сворачивании активного окна оставляет поток активным, а второй - функция сделать окно потока активным портит структуру потока (размеры окна, если окно было сжато или свёрнуто).
    Вероятно можно сделать кривой fix внутри самого @DOCKY: перед вызовом функции 18 проверить свёрнуто ли сейчас окно потока или нет, если свёрнуто (или сжато в заголовок), то не делать этот вызов.
  • Who is online

    Users browsing this forum: No registered users and 11 guests