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

Отработанное время:
Продуктивное время:
Bug 2409 - 1Cv77: Неверно возвращается к предыдущему дочернему окну   Make a simular bug
Summary: 1Cv77: Неверно возвращается к предыдущему дочернему окну
Status: CLOSED FIXED
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: Окна / фокус / перерисовка (show other bugs)
Version: 1.0.9
Hardware: PC All
: P2 critical
Target Milestone: ---
Assignee: Денис Баранов
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on: 1129
Blocks: 777
  Show dependency treegraph
 
In work:
Reported: 2008-09-11 12:40 MSD by Александр Пликус
Modified: 2008-10-21 13:43 MSD (History)
5 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-09-11 12:40:06 MSD
Толя вроде делал для этого патч (один из последних)... он точно говорил, что нашел эту ошибку у себя.
Comment 1 Анатолий Лютин 2008-09-11 12:43:24 MSD
Да, там нужно приложить последнюю версию хака с переключением окон (или, если мне не изменяет память, там группа патчей, которые нужно прикладывать друг за другом, тогда проблемы не будет). А тот хак, что исправляет эту штуку маркируется в комментарии .. founded by Vika
Comment 2 Vitaly Lipatov 2008-09-11 18:28:33 MSD
Проверили, эта группа патчей добавлена, вот цитата из результирующего кода в этом месте:

            /* Help with eterbug # 495*/
            LOADETER_FUNC(etersoft_1version);
            if ( etersoft_1version && etersoft_1version() == 7 )
            {
                HWND    client = GetParent(hwndTo);

                SetWindowLongW( hwndPrev, GWL_STYLE, GetWindowLongW( hwndPrev, GWL_STYLE )&~WS_MAXIMIZE );
                SetWindowPos( hwndPrev, 0, rect.left, rect.top, rect.right-rect.left, rect.bottom - rect.top, SWP_NOACTIVATE|SWP_NOZORDER|SWP_SHOWWINDOW|SWP_FR

                MDI_UpdateFrameText( GetParent(client), client, TRUE, NULL );
            }
            else
                ShowWindow( hwndPrev, SW_RESTORE );
Comment 3 Анатолий Лютин 2008-09-12 13:16:50 MSD
(In reply to comment #2)
> Проверили, эта группа патчей добавлена, вот
> цитата из результирующего кода в этом
> месте:

>                 SetWindowPos( hwndPrev, 0, rect.left, rect.top,
> rect.right-rect.left, rect.bottom - rect.top,
> SWP_NOACTIVATE|SWP_NOZORDER|SWP_SHOWWINDOW|SWP_FR
> 
Это ошибка возникала из-за того, что в предыдущем патче вместо 0 стояло HWND_BOTTOM (кинуть окно вниз ), игнорирование этого параметра ( SWP_NOZORDER ) исправляло эту ошибку. Возвращайтесь к оригинальному mdi.c и смотрите. Если ошибка есть, значит - это другая проблема. Если уходит, то пристальней смотрите это место.

Алгоритм:
Максимизировать окно -> поставить его наверх->предыдущее окно вернуть в исходные размеры. При закрытие окна максимизируется предыдущее верхнее.
Comment 4 Денис Баранов 2008-10-12 16:13:20 MSD
Если я правильно понял то ошибку можно воспоризвести так:
1) открываем 2 окна (не максимизировано)
2) одно максимизируем
3) переключаемся на 2 окно, и оно тоже становится максимизированым..
Comment 5 Денис Баранов 2008-10-12 16:31:17 MSD
wine-1.0.9-alt24
libwine-devel-1.0.9-alt24
wine-etersoft-sql-1.0.9-alt7
libwine-twain-1.0.9-alt24
libwine-1.0.9-alt24
libwine-gl-1.0.9-alt24

тестировал в бутылке 1c77-27
Comment 6 Илья Шпигорь 2008-10-13 09:47:25 MSD
А разве в винде 1С77 ведет себя не также?

При этом в 1С8 ни в wine, ни в windows это не наблюдается - то есть максимизируется только указанное окно.

Скорее всего это связано с багой #495, сообщение #35.
Comment 7 Илья Шпигорь 2008-10-13 12:35:52 MSD
Ошибка есть независимо от патчей по баге #495.
Comment 8 Илья Шпигорь 2008-10-13 13:18:17 MSD
Похоже, сломалось после моего патча на багу #1129.
Comment 9 Илья Шпигорь 2008-10-13 13:58:48 MSD
Функция MDI_GetWindow отвечает за выбор окна при закрытии текущего и при переключении Alt + Tab / Ctrl + Alt + Tab между окнами.

В оригинальном wine в ней используется список окон:

 WIN_ListChildren( GetParent(hWnd) ))

Этот список изменяется при смене активного окна, что не позволяет его использовать для переключения между окнами (переключение происходит только между соседними окнами). 

В патче на багу #1129 вместо WIN_ListChildren используется список:

 clientInfo->child

Он не изменяется при смене активного окна. Поэтому подходит для реализации переключения между окнами, но дает ложные результаты когда надо вернуться к предыдущему активному окну.

Как выбрать какой список использовать в ф-ции MDI_GetWindow?
Comment 10 Илья Шпигорь 2008-10-13 14:59:30 MSD
Выложил патч в нашу рассылку.

В ф-цию MDI_GetWindow добавлен входной параметр bStatic. 

Если он принимает значение TRUE - используется список clientInfo->child (не изменяемый при смене активного окна).

Если bStatic равен FALSE - используется WIN_ListChildren (изменяемый при смене активного окна).
Comment 11 Andrey Chichak 2008-10-13 15:53:17 MSD
(In reply to comment #4)
> Если я правильно понял то ошибку можно
> воспоризвести так:
> 1) открываем 2 окна (не максимизировано)
> 2) одно максимизируем
> 3) переключаемся на 2 окно, и оно тоже
> становится максимизированым..

в Windows 1C ведет себя абсолютно так же.
Comment 12 Денис Баранов 2008-10-13 18:30:15 MSD
(In reply to comment #11)
> 
> в Windows 1C ведет себя абсолютно так же.
> 

Подтверждаю. Значит закрываем как не воспоризводимую.
Comment 13 Vitaly Lipatov 2008-10-13 19:31:31 MSD
Последние два замечания были не по теме.
Багу можно закрыть только после тестирования нового патча Ильи.

Илья, опиши пожалуйста в баге, в чём же всё таки проблема, что исправлялось.
Comment 14 Илья Шпигорь 2008-10-14 09:32:19 MSD
Проблема этой баги в том, что после патча на багу #1129 сломалось возвращение к предыдущему активному окну, после закрытия текущего окна (комментарий #9 объясняет почему).

Чтобы проверить багу нужно открыть три окна в 1С7, каждое из которых является потомком предыдущего. Например: (бутылка 1С727, "Информационная база #1")

1) Операции -> Журналы документов -> Тестовый журнал -> Ок.
2) Новая строка -> Новый1 -> Ок
3) Описание

Откроется окошко help'а. Если его закрыть вернемся к окну "Журнал документов", должны к "Новый1 - Новый"

Новый патч, который выложил, по сути решает багу #1129, не ломая эту.
Comment 15 Илья Шпигорь 2008-10-15 09:39:12 MSD
Надо потестировать с последним патчем.

Чтобы его приложить надо (для ветки eterhack):

        1) приложить патч:
           user32: Add checking the count of active child MDI windows and ignoring the lParam for WM_MDIGETACTIVE then this count more than one (eterbug #2350)

                db49255bdca367b0703cd75303f5b3832fc0134c

        2) revert патча:
           user32: Changes in MDI_GetWindow. Using the MDICLIENTINFO child value 
instead the result of WIN_ListChildren function (eterbug #1129)

                bc42d65a11c5cc5b13bdcc5019090c6a87060704
Comment 16 Анатолий Лютин 2008-10-15 13:27:12 MSD
(In reply to comment #14)
> Проблема этой баги в том, что после патча на
> багу #1129 сломалось возвращение к
> предыдущему активному окну, после закрытия
> текущего окна (комментарий #9 объясняет
> почему).
> 
> Чтобы проверить багу нужно открыть три
> окна в 1С7, каждое из которых является
> потомком предыдущего. Например: (бутылка
> 1С727, "Информационная база #1")

Это не обязательно. Достаточно открыть любых три окна, переключиться несколько раз между ними и потом закрыть текущее.1с должна открыть предыдущие. Лучшее проводить тестирование при максимизации окон.
Comment 17 Денис Баранов 2008-10-21 13:42:52 MSD
Проверил на последней сборке, проблема исправлена.

libwine-gl-1.0.9-alt25
libwine-1.0.9-alt25
wine-1.0.9-alt25
wine-etersoft-sql-1.0.9-alt8