Bug 3092

Summary: delphi apps minimize/restore
Product: WINE@Etersoft Reporter: alexander barakin <alex.barakin>
Component: Окна / фокус / перерисовкаAssignee: Илья Шпигорь <shpigor>
Status: CLOSED FIXED QA Contact:
Severity: major    
Priority: P3 CC: baraka, ivan, kondratyuk, lav, night, vitperov, vostok
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: Mandriva   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 42, 3995, 5618    
Attachments: скриншоты и вывод xprop
тестовое приложение с исходниками

Description alexander barakin 2008-12-08 19:44:11 MSK
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 для отображенных на скриншоте окон.
Comment 1 alexander barakin 2008-12-08 21:03:12 MSK
Created attachment 958 [details]
тестовое приложение с исходниками

тестовое приложение с исходниками.
Comment 2 Денис Баранов 2009-01-08 14:55:29 MSK
Ошибка подтвердилась на текущей сборке.
При чем при нажатии на кнопку появляется окно, но сворачивая и разворачивая такого же результата не удалось достигнуть, как с главным. Видимо окно особенное.

Бутылка: bugs/3092.
Comment 3 Vitaly Lipatov 2009-01-20 14:35:41 MSK
Повышаю приоритет, касается многих программ на Delphi.
Comment 4 Илья Шпигорь 2009-01-21 17:52:29 MSK
Этот же баг в багзиле winehq:

http://bugs.winehq.org/show_bug.cgi?id=15069
Comment 5 Илья Шпигорь 2009-01-22 17:54:46 MSK
Выложил патч.

Это решение 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.
Comment 6 Анатолий Лютин 2009-01-23 11:26:34 MSK
(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 приложение, а из-за такого перехвата там не будет работать половина виджетов :)))

Comment 7 Илья Шпигорь 2009-01-26 10:15:18 MSK
*** Bug 1669 has been marked as a duplicate of this bug. ***
Comment 8 Andrey Vusik 2009-01-30 14:01:11 MSK
Сборка 40/17
Заявленной проблемы нет.
Comment 9 Виталий Перов 2010-05-27 12:57:46 MSD
Откатил патч:
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 );

Возможно это и есть корректное решение баги