Bug 3024

Summary: 1С81: не активизируется конфигуратор
Product: WINE@Etersoft Reporter: Денис Баранов <baraka>
Component: Окна / фокус / перерисовкаAssignee: Илья Шпигорь <shpigor>
Status: CLOSED FIXED QA Contact:
Severity: minor    
Priority: P4 CC: boris, kondratyuk, lav, night, pav, vostok
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: 9026 Связано с:
Дата напоминания:
Bug Depends on: 3967    
Bug Blocks: 1217, 3589, 3614, 3645, 3910, 7469    

Description Денис Баранов 2008-11-26 21:37:05 MSK
Если в конфигураторе поставить точки останова и запустить отладку
, то при останове на точке должно появляться окно конфигуратора - но оно не активно и остается на заднем плане.
Comment 1 Константин Кондратюк 2008-11-27 13:30:20 MSK
#2758 - похоже?
Comment 2 Илья Шпигорь 2008-12-03 14:42:49 MSK
Мало того что окно не активно и на заднем плане, оно вообще не отвечает. 
Comment 3 Илья Шпигорь 2008-12-03 17:09:11 MSK
Иногда при срабатывании точки останова, возникает ситуация, очень похожая на багу #3048 (пункт 17 - конфигуратор висит).
Comment 4 Константин Кондратюк 2008-12-04 10:24:23 MSK
*** Bug 102 has been marked as a duplicate of this bug. ***
Comment 5 Илья Шпигорь 2008-12-04 17:16:10 MSK
Здесь опять придется решать проблему подъема окна на передний план в Gnome. Все очень похоже на ситуацию с #1837. 

В идеале все будет происходить так:
Происходит останов, срабатывает SetForeground для конфигуратора, срабатывает X11DRV_SetFocus для него же и все. Окно конфигуратора имеет фокус, но остается на заднем плане.

В KDE ситуация лучше. Если в настройках поведения окон установить "Управление фокусом" на "нет" - после передачи фокуса окно поднимется.
Comment 6 Vitaly Lipatov 2008-12-04 19:52:02 MSK
Если в KDE есть возможность улучшить поведение настройками окон,
то надо найти в каком они файле и поставлять свои настройки
вместе с wine (или ставить их при wine --update), чтобы улучшить ситуацию.
Comment 7 Анатолий Лютин 2008-12-10 15:19:23 MSK
(In reply to comment #5)
> Здесь опять придется решать проблему
> подъема окна на передний план в Gnome. Все
> очень похоже на ситуацию с #1837. 
> 
> В идеале все будет происходить так:
> Происходит останов, срабатывает SetForeground
> для конфигуратора, срабатывает X11DRV_SetFocus
> для него же и все. Окно конфигуратора имеет
> фокус, но остается на заднем плане.
> 
> В KDE ситуация лучше. Если в настройках
> поведения окон установить "Управление
> фокусом" на "нет" - после передачи фокуса
> окно поднимется.
> 

Лучше смотреть работу функции SetActiveWindow в /user32/focus.c, при вызове этой функции конфигуратор должен перейти на передний план и получить активность+фокус.
Comment 8 Илья Шпигорь 2009-02-20 15:03:12 MSK
Выложил серию патчей.

Проблема осложнялась тем, что необходимо было передавать X фокус между разными потоками. Поэтому пришлось ввести дополнительную функцию X11 драйвера - X11DRV_DropWindow.

Механизм работы вытаскивания окон наверх стал следующий. При вызове X11DRV_SetFocus окно вытаскивается наверх (через WS_EX_TOPMOST и update_net_wm_states), при этом предыдущее topmost окно сбрасывается в нормальное состояние. Если вызывается SetForegroundWindow для окна потока, отличного от текущего, то WS_EX_TOPMOST текущего окна сбрасывается, чтобы окно другого потока смогло корректно оказаться на переднем плане.

>Лучше смотреть работу функции SetActiveWindow в
>/user32/focus.c, при вызове этой функции
>конфигуратор должен перейти на передний
>план и получить активность+фокус.

Все правильно, но, к сожалению, Gnome не вытаскивает окно на передний план при передачи X фокуса (эту особенность разработчики Gnome признают).
Comment 9 Анатолий Лютин 2009-02-20 16:21:20 MSK
(In reply to comment #8)
> Все правильно, но, к сожалению, Gnome не
> вытаскивает окно на передний план при
> передачи X фокуса (эту особенность
> разработчики Gnome признают).
> 

Ну хорошо, возможно это правильно, но аналог свойства "активность" из Windows под Gnome есть?
Comment 10 Илья Шпигорь 2009-02-22 16:04:07 MSK
> Ну хорошо, возможно это правильно, но
> аналог свойства "активность" из Windows под Gnome
> есть?

Есть X-овый атом _NET_ACTIVE_WINDOW. По идее, он должен отвечать за активность окна. Но почему-то в wine он не используется.
Comment 11 Анатолий Лютин 2009-02-24 14:48:55 MSK
(In reply to comment #10)
> 
> Есть X-овый атом _NET_ACTIVE_WINDOW. По идее, он
> должен отвечать за активность окна. Но
> почему-то в wine он не используется.
> 
Прекрасно, а как Gnome ведёт себя когда окно получает этот атом? И есть ли отличие в поведении KDE? Возможно так будет легче вытаскивать окно на передний план. В том смысле, что активному окну по умолчанию должен передаваться фокус. Есть шанс, что под Gnome так и будет, а так же окно будет поверх других окон. 

То что в wine это не используется, не вижу ничего странного, т.к. часть user32, которая отвечает за интерфейс написана по принципу "вроде ведёт себя так же как и в Win, ну и чёрт с ним". Это и объясняет ещё то, почему одни и те же функции то и дело кочуют из user32 в winex11.drv и обратно. Архитектура работы с окнами ещё не продумана и разработчики то и дело перекидывают функциональность то на X, то на Wine.
Comment 12 Илья Шпигорь 2009-03-13 11:52:37 MSK
Проверил работу Gnome с атомом NET_ACTIVE_WINDOW. Он корректно активизирует X-овое окно и передает ему фокус ввода, но не всегда его поднимает на передний план. Т.е. после активации окна, предыдущее активированное этим атомом остается поверх него (эта проблема проявляется в 1с8).
Полагаю, работа с NET_WM_STATE_ABOVE атомом будет надежнее, т.к. он определяет положение окна в стеке уровней окон:

http://standards.freedesktop.org/wm-spec/1.3/ar01s07.html#STACKINGORDER
Comment 13 Анатолий Лютин 2009-03-13 15:43:57 MSK
(In reply to comment #12)
> Проверил работу Gnome с атомом NET_ACTIVE_WINDOW. Он
> корректно активизирует X-овое окно и
> передает ему фокус ввода, но не всегда его
> поднимает на передний план.
...
> Полагаю, работа с NET_WM_STATE_ABOVE атомом будет
> надежнее, т.к. он определяет положение окна
> в стеке уровней окон:

Хммм. может быть лучше снимать атом с того окна, которое выше, чем пытаться заместить его более приоритетным? Хотя не факт, что так правильно делать..
Comment 14 Илья Шпигорь 2009-06-03 13:42:58 MSD
В ходе решения баги #3967 возникли некоторые изменения. Теперь чтобы при запуске wine работали патчи на подъем окон разных процессов, необходимо задавать переменную окружения - WINEENABLERAISE. 

Запуск программы будет выглядеть например так:

WINEENABLERAISE=1 wine 1cv8.exe
Comment 15 Денис Баранов 2009-07-29 17:21:28 MSD
> Запуск программы будет выглядеть например
> так:
> 
> WINEENABLERAISE=1 wine 1cv8.exe
> 

Принято.
WINE@Etersoft 1.0.11 eter4/eter2(In reply to comment #14)