Bug 4224

Summary: 1С77: Нет всплыввающих подсказок над свернутыми окнами
Product: WINE@Etersoft Reporter: Денис Баранов <baraka>
Component: Окна / фокус / перерисовкаAssignee: Иван Дончевский <yv>
Status: CLOSED FIXED QA Contact: Денис Баранов <baraka>
Severity: minor    
Priority: P4 CC: gorbuntsov, lav, shpigor
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: 11048 Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 3932    
Attachments: Похожая ошибка

Description Денис Баранов 2009-08-17 15:24:01 MSD
1С77 если открыто несколько окон и внизу (на панели окон) навести курсором на любое, то должна появиться всплывающая подсказка, но ее нет.
WINE@Etersoft 1.0.11 eter8/eter3
Comment 1 Иван Дончевский 2009-08-17 17:16:02 MSD
у меня подозрение, что они эту подсказку тоже в отдельном окне сделали, а если так, то она может не всплывать по причине неактивности главного окна, завтра проверю в офисе
Comment 2 Иван Дончевский 2009-08-18 11:34:03 MSD
похоже, что причина какая-то другая. надо посмотреть на функции tab.c
Comment 3 Иван Дончевский 2009-08-18 16:55:27 MSD
в данном случае не вызывается даже функция GetCursorPos для определения позиции курсора (выводить/не выводить подсказку), т.е. такое ощущение, как будто не обрабатывается событие WM_MOUSEMOVE, хотя с ним похоже все в порядке. пока ситуация мне непонятна. нужно попробовать ловить события, приходящие верхним иконкам при выводе подсказок (видимо есть что-то еще кроме mousemove)
Comment 4 Иван Дончевский 2009-08-18 17:18:29 MSD
Проверил - сообщения приходят в обоих случаях одинаковые...
Comment 5 Иван Дончевский 2009-08-19 12:12:01 MSD
разница в том, что у табов свой обработчик событий, в отличие от всех других элементов, использующих его из DefWnd.c
Comment 6 Иван Дончевский 2009-08-19 13:24:30 MSD
GetCursorPos для определения места отрисовки подсказки вызывается уже после того, как программа определяет в каком окне находится курсор (при смещении координаты в X11DRV_send_mouse_input нужная иконка выделяется при смещенном наведении курсора, а подсказка не выводится, т.к. она уже вызывает GetCursorPos, который дает ей реальное положение курсора), нужно найти какой функцией она определяет наличие курсора внутри нужного окна, видимо в ней и происходит ошибка
Comment 7 Иван Дончевский 2009-08-19 15:18:36 MSD
если в X11DRV_MotionNotify в вызове X11DRV_send_mouse_input изменить например параметр pt.y на (pt.y-50), то все нажатия и т.п. будут обрабатываться правильно, а вот выделение верхних иконок будет происходить при наведении курсора ниже самих иконок (при этом также будет вызываться GetCursorPos), видимо программа то ли берет аргументы из параметров WM_MOUSEMOVE, то ли еще откуда-то
Comment 8 Иван Дончевский 2009-08-20 17:19:22 MSD
возможен другой вариант - подсказки выводит сам windows, а не программа 1с77, нужно проверить этот вариант и если это так, самому написать такое же для tab.c
Comment 9 Иван Дончевский 2009-08-21 17:47:10 MSD
Created attachment 1299 [details]
Похожая ошибка

Тоже проблемы с выводом подсказок: в windows отображаются нормально, а под вайном рисуется не тот текст и выводится подсказка не в том месте.
Comment 10 Иван Дончевский 2009-08-21 18:59:15 MSD
посмотрел еще раз обработку WM_MOUSEMOVE в tab.c, оказалось, она перенаправляет нас в tooltips.c в функцию TOOLTIPS_RelayEvent, причем параметр был не WM_MOUSEMOVE, а какой-то другой (я его исправил, но багу это не разрешило).

Далее в этой функции в tooltips вызывается TOOLTIPS_GetToolFromPoint, который уже возвращает неверное значение для табов.
Comment 11 Иван Дончевский 2009-08-21 19:50:50 MSD
в функции TOOLTIPS_GetToolFromPoint берется значение nNumTools из infoPtr. В случае с табами оно почему-то равно 0, из-за этого возвращаемое значение всегда равно -1 и всплывающие окна никогда не рисуются
Comment 12 Иван Дончевский 2009-08-21 20:11:56 MSD
судя по всему в tab.c в функции create при создании tooltip'а не посылаются некоторые сообщения (в отличие от табов, в тулбарах для этого отдельные несколько функций TOOLBAR_TooltipCreateControl, TOOLBAR_TooltipAddTool, TOOLBAR_TooltipSetRect), возможно нужно прописать что-то похожее для табов
Comment 13 Иван Дончевский 2009-08-21 21:15:58 MSD
что выяснил - подсказки на самом деле tooltips, но создаются они и вызываются не обработчиками tab'a или toolbar'а (что странно)

обработчики tab'a вызываются только в случае данного бага, возможно из-за каких-то специфических свойств этих табов.
Comment 14 Иван Дончевский 2009-08-24 17:32:19 MSD
судя по тому, что показывает spy, подсказки принадлежат не отдельным табам и другим контролам, а основному окну программы (под вайном). Но обрабатываются они видимо как-то вайном, а не самим 1с-ом, т.к. в противном случае абсолютно непонятна причина бага, да и потом до вайна доходят сообщения mousemove и т.п.
Comment 15 Иван Дончевский 2009-08-25 17:24:31 MSD
я почитал немного по tooltips - в том, что читал, выводом их на экран занимается сама программа, когда к ней приходит сообщение TTN_NEEDTEXT. Правда в вайне я вообще мало что нашел, связанного с этим сообщением.
Comment 16 Иван Дончевский 2009-08-28 17:04:44 MSD
что нового:
у табов в этой программе окно подсказок другое, не то, что у других контролов. Вызов подсказки происходит, когда она получает вначале сообщение AddToolA, а потом уже событие RelayEvent приводит к выбору нужного окна, для которого выводится подсказка.

В случае с табами события AddToolA нет, поэтому подсказка думает, что у нее нет окон, для которых она должна вызываться. Для других контролов AddToolA приходит при попадании мышки на нужный контрол.
Comment 17 Иван Дончевский 2009-08-28 17:45:13 MSD
как вариант пробую посылать сам AddToolA, нужно только подобрать нужные параметры и посылать его только при определенных условиях. Думаю, таким образом получится исправить. Точнее надеюсь.
Comment 18 Иван Дончевский 2009-08-31 13:57:11 MSD
реализовал подсказки, сейчас проверю всегда ли правильно работают, но в 1с работают так же, как подсказки верхних кнопок
Comment 19 Иван Дончевский 2009-08-31 14:47:29 MSD
отправил патч, хотя вообще тут еще есть над чем подумать дальше... Например, почему элемент iHotTracked остается всегда -1 (хотя должен принимать значение вкладки, на которую наведен курсор)
Comment 20 Денис Баранов 2009-09-24 18:13:59 MSD
WINE@Etersoft eter8.3/eter4
Принято.