Странный баг с fsSystemStayOnTop

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Странный баг с fsSystemStayOnTop

Сообщение PVOzerski » 09.11.2015 17:36:02

Описываю ситуацию.
Linux, GTK2, Lazarus 1.4.4.

Тривиальный код: форма, кнопочка, обработчик кнопки вот такого вида:
procedure TForm1.Button1Click(Sender: TObject);
begin
Hide;
Sleep(700);
Show;
end;

И занятный баг.
Дело в том, что форма имеет свойство FormStyle со значением fsSystemStayOnTop. Дык вот, после выполнения этой процедуры-обработчика форма может остаться плавающей поверх всех, а может стать "обычной", т.е. вести себя как если бы это свойство стало fsNormal. При этом "внутри" свойство формы по-прежнему значится fsSystemStayOnTop. При этом то, как именно пойдет дело, зависит от того, какой работает в системе оконный менеджер. Со штатным оконным менеджером KDE 4, с Compiz и, внезапно, с Xfwm4 режим "всегда поверх" восстанавливается нормально, а вот штатные оконные менеджеры сред Trinity и Mate выдают описанный выше глюк.

На самом деле, программа, в которой я нарвался на проблему, несколько сложнее. И если в приведенном выше примере, похоже, помогает принудительное выставление свойства сначала в fsNormal, а потом обратно в fsSystemStayOnTop, то в реальном проекте, где 1-я (главная) форма получает команду на появление из 2-й, этот трюк не срабатывает. Хотелось бы, для начала, понять, есть ли штатное решение проблемы.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Странный баг с fsSystemStayOnTop

Сообщение WAYFARER » 09.11.2015 18:22:36

А версия gtk2 одна и та же?
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Странный баг с fsSystemStayOnTop

Сообщение PVOzerski » 09.11.2015 19:34:15

Дык я на одних и тех же машинах разные оконные менеджеры запускаю. Ну, и собираю из исходников прогу там же.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Странный баг с fsSystemStayOnTop

Сообщение WAYFARER » 09.11.2015 21:14:05

PVOzerski писал(а):На самом деле, программа, в которой я нарвался на проблему, несколько сложнее. И если в приведенном выше примере, похоже, помогает принудительное выставление свойства сначала в fsNormal, а потом обратно в fsSystemStayOnTop, то в реальном проекте, где 1-я (главная) форма получает команду на появление из 2-й, этот трюк не срабатывает. Хотелось бы, для начала, понять, есть ли штатное решение проблемы.

А если в OnShow нужной формы выставлять fsSystemStayOnTop принудительно?
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Странный баг с fsSystemStayOnTop

Сообщение PVOzerski » 10.11.2015 01:31:23

Пробовал по-всякому, и так тоже. Не помогало.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Странный баг с fsSystemStayOnTop

Сообщение WAYFARER » 10.11.2015 02:07:47

А если попробовать так:
Св-во FormStyle в fsNormal и

Код: Выделить всё
uses gtk2,gdk2
...
gdk_window_set_keep_above(PGtkWidget(Handle)^.window, true);


Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
Hide;
Sleep(700);
Show;
gdk_window_set_keep_above(PGtkWidget(Handle)^.window, false);
gdk_window_set_keep_above(PGtkWidget(Handle)^.window, true);
end;


В вашем случае показывая форму вызывайте gdk_window_set_keep_above передавая handle этой формы.
Последний раз редактировалось WAYFARER 10.11.2015 02:48:49, всего редактировалось 3 раз(а).
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Странный баг с fsSystemStayOnTop

Сообщение Ism » 10.11.2015 02:45:06

Я свое время тоже боролся с глюками свойств формы, но там глючило hide
Прикол был в том, что параметры показа формы срабатывают только если она создается второй по порядку (или первой, не помню)
То есть порядок create в модуле, где создаются формы имеет значение
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Странный баг с fsSystemStayOnTop

Сообщение PVOzerski » 10.11.2015 13:59:39

Попробовал все эти советы - результат нулевой. Кстати, обратил внимание вот на какую вещь: окно это как бы все-таки остается поверх всех открытых - кроме 2-й формы этого же самого приложения (которое, кстати, имеет FormStyle=fsNormal - вот такой бред).
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Странный баг с fsSystemStayOnTop

Сообщение Лекс Айрин » 10.11.2015 14:59:30

Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Странный баг с fsSystemStayOnTop

Сообщение PVOzerski » 10.11.2015 15:26:14

Спасибо, попробую - хотя лазарь не дельфи, а иксы - не винда. О результате сообщу - думаю, он может быть интересен не только мне одному.

Добавлено спустя 6 минут 6 секунд:
Пока впечатление такое, что в LCL отсутствует TApplication.RestoreTopMosts :(
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Странный баг с fsSystemStayOnTop

Сообщение WAYFARER » 10.11.2015 17:05:07

Боюсь Lazarus и LCL тут ни при чем, потому как такие вещи работают так, как захочет оконный менеджер.
Для успокоения совести попробуйте провести эксперимент. Не будем использовать LCL, а сделаем такую тестовую программу на чистом gtk2 и посмотрим как будет вести себя она. У меня - такой вариант работает корректно, а вариант с LCL нет(Ubuntu 15.10 x64 Unity)
Код: Выделить всё
program test;

uses gtk2, gdk2, glib2;
var
   fMain, button : PGtkWidget;

procedure ShowHide (widget : PGtkWidget; data : gpointer); cdecl;
begin
  gtk_widget_hide(fMain);
  gtk_widget_Show(fMain);
  gtk_window_set_position(GTK_WINDOW(fMain), GTK_WIN_POS_CENTER);
  gdk_window_set_keep_above(PGtkWidget(fMain)^.window, true);
end;

procedure destroy (widget : PGtkWidget; data : gpointer); cdecl;
begin
   gtk_main_quit();
end;

begin
   gtk_init(@argc, @argv);
   fMain := gtk_window_new(GTK_WINDOW_TOPLEVEL);
   g_signal_connect(G_OBJECT(fMain), 'destroy', G_CALLBACK(@destroy), nil);
   gtk_container_set_border_width(GTK_CONTAINER(fMain), 100);
   button := gtk_button_new_with_label('Hide/Show');
   g_signal_connect(G_OBJECT(button), 'clicked',G_CALLBACK(@ShowHide), nil);
   gtk_container_add(GTK_CONTAINER(fMain), button);
   gtk_widget_show(button);
   gtk_widget_show(fMain);
   gtk_main();
end.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Странный баг с fsSystemStayOnTop

Сообщение PVOzerski » 10.11.2015 18:17:19

Эта штука работает нормально. Нужно бы проверить вариант с двумя окнами - обычным и "плавающим". Попробую сотворить на основе и испытать.

Добавлено спустя 14 минут 35 секунд:
В общем, и двухоконный вариант ведет себя вполне адекватно. Выходит, проблема где-то в LCL?
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Странный баг с fsSystemStayOnTop

Сообщение WAYFARER » 10.11.2015 19:06:59

Выходит так)) Смотрите модуль /usr/lib/lazarus/1.4.4/lcl/interfaces/gtk2/gtk2wsforms.pp
Накидайте пример с двумя формами. Попробуем все таки разобраться.

Добавлено спустя 5 минут 34 секунды:
Сдается мне, что fsStayOnTop и fsSystemStayOnTop - это одно и то же. Что в том, что в другом случае вызывается gtk_window_set_keep_above.
Интересно...
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Странный баг с fsSystemStayOnTop

Сообщение PVOzerski » 10.11.2015 19:18:11

А если я исходники этой проблемной проги сюда скину? Может, я где-то сам дурак все-таки?
Там меньше 1000 строк.

Добавлено спустя 10 минут 54 секунды:
В общем, вот оно...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Странный баг с fsSystemStayOnTop

Сообщение WAYFARER » 10.11.2015 20:47:36

PVOzerski писал(а):В общем, вот оно...

Не воспроизводится баг. Корректно отображается первая форма - всегда над второй.

Добавлено спустя 1 минуту 2 секунды:
Попробуйте бинарник скомпиленный отправить
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 235

Рейтинг@Mail.ru