Bug 1949

Summary: Генерация лишних сообщений WM_PAINT
Product: WINE@Etersoft Reporter: Илья Шпигорь <shpigor>
Component: ОбщееAssignee: Илья Шпигорь <shpigor>
Status: CLOSED WONTFIX QA Contact:
Severity: major    
Priority: P5 CC: lav, vostok
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 1217    
Attachments: WindowTest.exe

Description Илья Шпигорь 2008-06-19 16:10:33 MSD
При вызове функции GetDC() генерируется сообщение WM_PAINT. В Windows этого нет.
Comment 1 Анатолий Лютин 2008-06-20 08:30:11 MSD
Илья:
В первую очередь стоит написать тест в user32:msg, чтобы убедиться, что это сообщение лишнее во всех случаях, а не для конкретного стиля окна..

lav:
Стоит обратить на это внимание, может увеличить производительность при работе через nx-клиент.
Comment 2 Анатолий Лютин 2008-06-30 15:53:36 MSD
Илья, какие-нибудь результаты исследования есть? Стоит в багу записывать результаты и наблюдения.
Comment 3 Илья Шпигорь 2008-07-03 13:11:30 MSD
Возможное решение, найденное случайно - убрать вызов SelectVisRgn в ф-ции update_visible_region (painting.c:166). 
В результате WM_PAINT вызывется при старте приложения только 1 раз вместо 2х или 3х.
Сейчас пишу тест.
Comment 4 Илья Шпигорь 2008-07-03 16:44:36 MSD
Есть тест. 
Лишнее WM_PAINT генерируется для WS_OVERLAPPEDWINDOW, WS_TILEDWINDOW, WS_POPUPWINDOW (только когда WS_MAXIMIZE), WS_CHILD (только WS_MAXIMIZE).
Для любых WS_MINIMIZE окон лишнего WM_PAINT нет.
Comment 5 Анатолий Лютин 2008-07-03 16:45:47 MSD
(In reply to comment #4)
> Есть тест. 
> Лишнее WM_PAINT генерируется для WS_OVERLAPPEDWINDOW,
> WS_TILEDWINDOW, WS_POPUPWINDOW (только когда WS_MAXIMIZE), WS_CHILD
> (только WS_MAXIMIZE).
> Для любых WS_MINIMIZE окон лишнего WM_PAINT нет.
> 

Хорошо, тогда нужно его отослать в wine-patches.
Comment 6 Илья Шпигорь 2008-07-04 12:52:27 MSD
В WINDOWS все тесты проходят. Т.е. никаких лишних WM_PAINT нигде нет.
Comment 7 Анатолий Лютин 2008-07-04 12:53:06 MSD
(In reply to comment #6)
> В WINDOWS все тесты проходят. Т.е. никаких
> лишних WM_PAINT нигде нет.
> 

А в Wine-то есть?
Comment 8 Илья Шпигорь 2008-07-07 11:37:51 MSD
Да в WINE есть. Но пока не совсем понятно почему. Может быть GetDC и не причем. Надо разобраться с этим.
Comment 9 Илья Шпигорь 2008-07-07 12:22:08 MSD
Есть идея, точнее предположение, почему появляются лишние WM_PAINT.
Ф-ция GetDCEx вызывает update_visible_region, которая в свою очередь вызывает SelectVisRgn. Вся проблема в этой SelectVisRgn. Дело в том, что когда в этой функции переменной dc->hVisRgn присваивается новое значение WINE решает послать WM_PAINT и перерисовать клиентское окно.
Поэтому решить эту проблему можно, если делать проверку - пустое значение dc->hVisRgn или там что-то есть. Если что-то есть - новое значение не присваивать.
Comment 10 Анатолий Лютин 2008-07-07 13:21:32 MSD
(In reply to comment #9)

> Поэтому решить эту проблему можно, если
> делать проверку - пустое значение dc->hVisRgn
> или там что-то есть. Если что-то есть - новое
> значение не присваивать.
> 
Хорошая идея, главное, чтобы она подтверждалась тестами и посмотри ещё новые исходники - руководитель проекта сделал несколько патчей как раз на регион.
Comment 11 Илья Шпигорь 2008-07-07 14:36:28 MSD
С моей идеей тесты проходят. 
Посмотрел последние патчи Виталика за 23.06 - тесты также падают как раньше. 
Я тогда делаю 2 патча - на тесты и на fix.
Comment 12 Анатолий Лютин 2008-07-07 14:46:39 MSD
(In reply to comment #11)
> С моей идеей тесты проходят. 
> Посмотрел последние патчи Виталика за 23.06 -
> тесты также падают как раньше. 
Нет, я имел ввиду патч руководителя open source проекта:
http://source.winehq.org/git/wine.git/?a=commit;h=0f9484a1240fdc4d95e53b3a3b7c13a02b608a78

> Я тогда делаю 2 патча - на тесты и на fix.
> 
Проверь, пожалуйста, ещё раз и после этого делай fix :)

Comment 13 Анатолий Лютин 2008-07-08 12:48:06 MSD
Если патчи примут, то закрой багу. Если нет, то её стоит переоткрыть.
Comment 14 Илья Шпигорь 2008-07-10 14:11:08 MSD
Тест не приняли:
There isn't even a GetDC call in that test. Most likely all you are
seeing is that expose events generate WM_PAINT, which is as it should
be. What are you trying to test?
Comment 15 Илья Шпигорь 2008-08-28 16:33:22 MSD
Created attachment 690 [details]
WindowTest.exe

Тестовый пример. 
Показывает сколько сообщений WM_PAINT генерируется при создании чистого окна, его сворачивании и максимизации/минимизации.
Comment 16 Илья Шпигорь 2008-12-17 15:38:19 MSK
В не managed режиме при создании окна посылается только одно сообщение WM_PAINT (как и в windows).

Думаю, в приложения с отрисовкой не по WM_PAINT и возникающими из-за этого проблемами стоит использовать не managed режим. Вряд ли получиться убрать сообщения WM_PAINT связанные с X-ами.