Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 1935 - Не происходит отрисовка по WM_COMMAND при запуске приложения.   Make a simular bug
Summary: Не происходит отрисовка по WM_COMMAND при запуске приложения.
Status: CLOSED WONTFIX
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: GDI / DIB / GDIPLUS ; графика (show other bugs)
Version: unspecified
Hardware: PC Linux
: P5 minor
Target Milestone: ---
Assignee: Илья Шпигорь
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 827 1217
  Show dependency treegraph
 
In work:
Reported: 2008-06-17 10:45 MSD by Илья Шпигорь
Modified: 2009-05-19 10:17 MSD (History)
3 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Илья Шпигорь 2008-06-17 10:45:45 MSD
Если в WM_COMMAND рисовать графические объекты (линия, прямоугольник и пр.), а сам WM_COMMAND вызывать по событиям WM_SIZE или WM_MOVE - при старте приложения графические объекты не отрисовываются. В отличие от Windows, там все корректно отображается.
Comment 1 Илья Шпигорь 2008-06-17 15:00:15 MSD
Последовательность вызовов:

WM_PAINT -> BeginPaint -> send_erase -> WM_ERASEBKGND -> FillRect

после чего вся отрисовка, сделанная по WM_COMMAND стирается.

Comment 2 Илья Шпигорь 2008-06-27 13:28:18 MSD
Возможное решение:
отловить вызов BeginPaint из обработчика по умолчанию (DEFWND_DefWinProc) сообщения WM_PAINT.
Comment 3 Илья Шпигорь 2008-07-01 13:59:33 MSD
После получения WM_WINDOWPOSCHANGED и обработки вызванных им WM_SIZE и WM_MOVE, происходит Expose. Из-за этого все, что не выводится в WM_PAINT не выводиться вообще.
Этот Expose вызывается потому что WM_ERASEBKGND от ShowWindow чистит окно через раз (т.е. в половине случаев окно запускается с неочищенным фоном).
Comment 4 Илья Шпигорь 2008-07-01 15:07:36 MSD
Если убрать последний вызов Expose, в случае когда фон не чиститься - не вызывается WM_PAINT и вообще никакая отрисовка не происходит.
Comment 5 Илья Шпигорь 2008-07-01 15:10:15 MSD
Точнее WM_PAINT вызывается, а никакой отрисовки по нему нет.
Comment 6 Илья Шпигорь 2008-07-02 16:37:27 MSD
Есть тест для BeginPaint(). В Windows по BeginPaint генерируется WM_NCPAINT и WM_ERASEBKGND только для окна-потомка. Во всех остальных случаях, в отличие от WINE не генерируется ничего.
В WINE по BeginPaint ничего не генерируется только для невидимого окна.
Comment 7 Анатолий Лютин 2008-07-02 17:45:26 MSD
(In reply to comment #6)
> Есть тест для BeginPaint(). В Windows по BeginPaint
> генерируется WM_NCPAINT и WM_ERASEBKGND только для
> окна-потомка. Во всех остальных случаях, в
> отличие от WINE не генерируется ничего.
> В WINE по BeginPaint ничего не генерируется только
> для невидимого окна.
> 
Шикарно, подготавливаем тест, который всё это демонстрирует и отсылаем его в wine-patches.
Comment 8 Илья Шпигорь 2008-07-08 12:44:23 MSD
Продолжаю разбираться с отрисовкой по WM_COMMAND.
Comment 9 Илья Шпигорь 2008-07-08 15:30:14 MSD
Похоже обновляет фон в основном WINE-сервер (файл wine/server/window.c). Обработчик DECL_HANDLER(redraw_window) отлавливает все перекрытия активного окна и отвечает за его перерисовку. А ф-ция set_window_pos, вызывающая redraw_window, отвечает за обновление фона при создании окна. 
Comment 10 Анатолий Лютин 2008-07-08 15:36:58 MSD
(In reply to comment #9)
> Похоже обновляет фон в основном WINE-сервер
> (файл wine/server/window.c). Обработчик
> DECL_HANDLER(redraw_window) отлавливает все перекрытия
> активного окна и отвечает за его
> перерисовку.
redraw_window, по-моему, посылается функциями, а не wineserver это ловит.

> А ф-ция set_window_pos, вызывающая
> redraw_window, отвечает за обновление фона при
> создании окна. 
set_window_pos - это "рабочая лошадка" функции WinAPI SetWindowPos.  И она может посылать сигнал об обновлении окна при куче случаев - изменение позиции, z-порядка, активации и т.д. Так же SetWindowPos вызвается в других user32/winex11.drv функциях - ShowWindow, SetWindowRgn...

Проблема в том, что по WM_COMMAND экран больше раз обновляется, чем в Windows.

Comment 11 Илья Шпигорь 2009-03-05 10:30:45 MSK
Единственное корректное решение проблемы - это октлючение режима управления окнами. Тогда перерисовки, вызванной X-ами не будет, и все нарисованное по WM_COMMAND не сотрется.

Альтернатива - разные нелепые хаки, запрещающие перерисовку окна, вызванную X-ами в некоторых ситуациях.
Comment 12 Анатолий Лютин 2009-03-05 14:29:09 MSK
(In reply to comment #11)
> Единственное корректное решение проблемы -
> это октлючение режима управления окнами.

Это некорректное решение проблемы :)

> Альтернатива - разные нелепые хаки,
> запрещающие перерисовку окна, вызванную
> X-ами в некоторых ситуациях.

Просто X-берут на себя слишком много по отрисовке. Они должны использоваться только 1 раз, в конце, когда WINE всё подготовит в памяти для отображения. А не в промежуточных стадиях.
Comment 13 Илья Шпигорь 2009-05-19 10:17:59 MSD
Бага #827 Компаса с отрисовкой картинки в диалоге настройки решена.