Created attachment 957 [details] скриншоты и вывод xprop после сворачивания/разворачивания окна: 1. пропадает кнопка minimize (сравните скриншоты 001.jpg и 002.jpg). 2. ровно по центру экрана появляется дополнительное окно (003.jpg). 3. если растянуть это дополнительное окно, то видно, что на нём кнопка minimize — присутствует (004.jpg). программа после разворачивания становится полностью неработоспособной. тестировавшиеся программы собраны в delphi7. установлена mandriva: $ cat /etc/release Mandriva Linux release 2009.0 (Official) for i586 kde: $ konqueror --version Qt: 3.3.8b KDE: 3.5.10 Konqueror: 3.5.10 wine: $ rpm -qa|grep wine wine-1.0.9-eter36mdv libwine-1.0.9-eter36mdv приложены скриншоты и вывод команды xprop для отображенных на скриншоте окон.
Created attachment 958 [details] тестовое приложение с исходниками тестовое приложение с исходниками.
Ошибка подтвердилась на текущей сборке. При чем при нажатии на кнопку появляется окно, но сворачивая и разворачивая такого же результата не удалось достигнуть, как с главным. Видимо окно особенное. Бутылка: bugs/3092.
Повышаю приоритет, касается многих программ на Delphi.
Этот же баг в багзиле winehq: http://bugs.winehq.org/show_bug.cgi?id=15069
Выложил патч. Это решение Paul Romanyszyn - откатиться обратно до использования ShowWindow вместо посылки сообщения WM_SYSCOMMAND. Проблема в том, что для delphi программ, помимо окон форм, существует окно приложения (TApplication). Это окно является owner'ом по отношению ко всем формам. Оно перехватывает WM_SYSCOMMAND и обрабатывает по своему. Как только это происходит - создается X окно для TApplication (это и есть дополнительное окно). Можно было бы попробовать реализовать поведение TApplication как в windows, но KDE и Gnome ведут в этом случае себя немного по-разному.В KDE у окна с owner'ом нет кнопки minimize, а в Gnome эта кнопка есть. Не совсем понятно - это проблема KDE или wine. Без этого патча в Gnome окно формы вообще не поднимается - только окно приложения. Думаю, проще будет обойти перехват WM_SYSCOMMAND окном приложения TApplication.
(In reply to comment #5) > Выложил патч. > > > Проблема в том, что для delphi программ, помимо > окон форм, существует окно приложения > (TApplication). Это окно является owner'ом по > отношению ко всем формам. Оно > перехватывает WM_SYSCOMMAND и обрабатывает по > своему. Как только это происходит - > создается X окно для TApplication (это и есть > дополнительное окно). Значит при создании дочерних окон посылается WM_SYSCOMMAND, надо пересмотреть тесты. Замена WM_SYSCOMMAND на ShowWindow, по-моему не оправдана, так как совершает над окнами гораздо больше действий (проверка флагов, позиционирование, проверка видимости), чем реакция на WM_SYSCOMMAND. > В KDE у > окна с owner'ом нет кнопки minimize, а в Gnome эта > кнопка есть. Gnome просто больше придерживается стандартов, чем KDE, насколько я знаю, и поэтому когда wine по стандарту говорить оси "сделай кнопку", Gnome делает, а KDE имеет свой взгляд на это (поэтому, кстати, с KDE больше проблем, связанных с выставлением фокуса ввода). > Не совсем понятно - это > проблема KDE или wine. С одной стороны KDE, с другой Wine. Но больше KDE. > Без этого патча в Gnome окно формы вообще не > поднимается - только окно приложения. Логично. > Думаю, проще будет обойти перехват WM_SYSCOMMAND > окном приложения TApplication. Потом эта бага всплывёт опять, когда придётся поддерживать какое-нибудь важное Delphi приложение, а из-за такого перехвата там не будет работать половина виджетов :)))
*** Bug 1669 has been marked as a duplicate of this bug. ***
Сборка 40/17 Заявленной проблемы нет.
Откатил патч: commit d3d60abdb3ee1aa215177e863997f4fb5cd86f28 Author: Ilya Shpigor <shpigor@etersoft.ru> Date: Thu Jan 22 17:57:16 2009 +0300 winex11.drv: Revert to using ShowWindow instead WM_SYSCOMMAND sending in handle_wm_state_notify (eterbug #3092) Патч переделать не сложно, но думаю, что стоит сначала проверить оригинальную версию. Том добавлено условие, при котором вместо SendMessageW( data->hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0 ); вызывается ShowWindow( data->hwnd, SW_RESTORE ); Возможно это и есть корректное решение баги