Summary: | Не обрабатывается сообщение WM_CTLCOLOREDIT | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Vitaly Lipatov <lav> |
Component: | Общее | Assignee: | Илья Шпигорь <shpigor> |
Status: | CLOSED LATER | QA Contact: | |
Severity: | enhancement | ||
Priority: | P5 | CC: | lav |
Version: | 1.0.6 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Linux | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | 586 | ||
Bug Blocks: | 777 |
Description
Vitaly Lipatov
2007-01-23 19:57:39 MSK
dlls/user32/message.c case WM_CTLCOLOREDIT: ... FIXME( "msg %x (%s) not supported yet\n", message, SPY_GetMsgName(message, hwnd) ); data->count = -1; return 0; Где проявляется эта бага? Что она мешает сделать? В функции pack_message подобным образом не реализованы ещё около 20 обработчиков сообщений... Вроде как при появлении окна печати в 1С 7.7. Хотелось бы понять, для чего нужно это сообщение, и реализовать его корректно. Это до сих проявляется у Вики и Ани, сообщение всё то же. Но я стал думать, что это из-за повреждения памяти, потому что обычным образом воспроизвести проблему нельзя. trace:loaddll:load_builtin_dll Loaded module L"c:\\windows\\system32\\wineps.drv" : builtin trace:loaddll:free_modref Unloaded module L"c:\\windows\\system32\\wineps.drv" : builtin trace:loaddll:load_builtin_dll Loaded module L"c:\\windows\\system32\\wineps.drv" : builtin trace:loaddll:free_modref Unloaded module L"c:\\windows\\system32\\wineps.drv" : builtin fixme:msg:pack_message msg 133 (WM_CTLCOLOREDIT) not supported yet err:win:DefWindowProcW called for other process window 0x20020 Это сообщение появляется при подборе товара по названию в справочнике Номенклатуры (выключенный иерархический список). Отправляется из функции EDIT_NotifyCtlColor =>1 0x7ecf830c put_message_in_queue+0x4ac(info=0x34e8b0, reply_size=0x34e88c) [/home/lav/Projects/wine/dlls/user32/message.c:667] in user32 (0x0034e76c) 2 0x7ecf6edb send_inter_thread_message+0x4b(info=0x34e8b0, res_ptr=0x34e8d8) [/home/lav/Projects/wine/dlls/user32/message.c:2336] in user32 (0x0034e89c) 3 0x7ecf7d59 SendMessageTimeoutW+0xd9(hwnd=<register ESI not in topmost frame>, msg=0x133, wparam=0x1738, lparam=<register EDI not in topmost frame>, flags=0x0, timeout=0x0, res_ptr=0x34e924) [/home/lav/Projects/wine/dlls/user32/message.c:2426] in user32 (0x0034e8ec) 4 0x7ecf7e47 SendMessageW+0x37(hwnd=0x20020, msg=0x133, wparam=0x1738, lparam=0x40288) [/home/lav/Projects/wine/dlls/user32/message.c:2506] in user32 (0x0034e92c) 5 0x7ecd1807 EDIT_WM_Paint+0xe7(es=<register EDI not in topmost frame>, hdc=0x0) [/home/lav/Projects/wine/dlls/user32/edit.c:424] in user32 (0x0034eb2c) Нужно написать тест, проверяющий последовательность сообщений при рисовании edit: - обратить внимание на get_app_version() - wine developer list in Nov 1999 - разобраться с выбором msg = WM_CTLCOLORSTATIC и WM_CTLCOLOREDIT - уточнить что с /* why do we notify to es->hwndParent, and we send this one to GetParent()? */ "The WM_CTLCOLOREDIT message is never sent between threads." http://msdn2.microsoft.com/en-us/library/ms672119.aspx http://dvinogradov.blogspot.com/2007/05/when-edit-control-sends.html В MSDN написано: "The WM_CTLCOLOREDIT message is never sent between threads." Но в случае, когда родительским окном является Desktop, Wine посылает WM_CTLCOLOREDIT процессу explorer.exe. hbrush = (HBRUSH)SendMessageW(GetParent(es->hwndSelf), msg, (WPARAM)hdc, (LPARAM)es->hwndSelf); Кстати в pack_message обрабатываются сообщения как раз для передачи между процессами, поэтому отсутствие там WM_CTLCOLOREDIT, похоже, не является ошибкой. Надо еще написать тест для /* why do we notify to es->hwndParent, and we send this one to GetParent()? */ и проверить в винде. Для случая, когда смена родителя происходит после создания окна. Есть тест для сравнения работы с es->hwndParent и GetParent() в ф-ции EDIT_NotifyCtlColor. В результате получилось, что edit контролу присваивается один из стандартных цветов windows не зависимо от цвета фона родителя (COLOR_WINDOW). Но если родительское окно было изменено а старое удалено, этот цвет в wine отличается от цвета в винде. В этом случае используется es->hwndParent, т.е. обращение к несуществующему окну. Если же использовать GetParent(), то тест проходит и в винде и в wine. В общем, можно сделать вывод, что правильнее вариант с GetParent(). Еще есть небольшое замечание. Если использовать es->hwndParent то в результате вызова: hbrush = (HBRUSH)SendMessageW(es->hwndParent, msg, (WPARAM)hdc, (LPARAM)es->hwndSelf); hbrush будет 0. После этого попадаем на: hbrush = (HBRUSH)DefWindowProcW(es->hwndParent, msg, (WPARAM)hdc, (LPARAM)es->hwndSelf); и hbrush остается 0. Если вызывать в DefWindowProcW GetParent(), то значение hbrush будет корректное. Есть тест на отправку уведомлений родителю от edit контрола. В wine как и в винде все уведомления отсылаются только окну создавшему контрол. Это справедливо также для случая, когда родительское окно уничтожается. Тесты и патчи на edit контрол, имеющие отношение к теме: http://www.winehq.org/pipermail/wine-patches/2005-November/022150.html http://www.winehq.org/pipermail/wine-patches/2001-March/000168.html В первой ссылке, в варианте до патча в EDIT_NotifyCtlColor не было вызова DefWindowProcW, который для родительского окна из другого процесса дает err. Также ранее в EDIT_WM_Paint осуществлялась проверка: if (!(brush = EDIT_NotifyCtlColor(es, dc))) brush = (HBRUSH)GetStockObject(WHITE_BRUSH); Без нее в FillRect передается hbrush равный 0. Единственный побочный эффект этой баги, который удалось обнаружить - серый цвет edit контрола, родителем которого является desktop. В windows же цвет такого контрола - белый. Сделал патч для фикса и теста. Фикс представляет собой небольшой откат 2ca23be50f7bf0fae845f12149975765ab7b2524 коммита. Дело в том что этот коммит добавляет вызов DefWindowProcW в ф-ции EDIT_NotifyCtlColor и удаляет проверку hbrush на 0 в ф-ции EDIT_WM_Paint. Если вернуться к предыдущему варианту, то проблема с обращением к окну другого процесса корректно обрабатывается. Тем более, что этот откат никак не отражается на тесты для edit контрола - все они успешно проходят. Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять. |