Странный баг с fsSystemStayOnTop
Модератор: Модераторы
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Странный баг с fsSystemStayOnTop
Описываю ситуацию.
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-й, этот трюк не срабатывает. Хотелось бы, для начала, понять, есть ли штатное решение проблемы.
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-й, этот трюк не срабатывает. Хотелось бы, для начала, понять, есть ли штатное решение проблемы.
А версия gtk2 одна и та же?
PVOzerski писал(а):На самом деле, программа, в которой я нарвался на проблему, несколько сложнее. И если в приведенном выше примере, похоже, помогает принудительное выставление свойства сначала в fsNormal, а потом обратно в fsSystemStayOnTop, то в реальном проекте, где 1-я (главная) форма получает команду на появление из 2-й, этот трюк не срабатывает. Хотелось бы, для начала, понять, есть ли штатное решение проблемы.
А если в OnShow нужной формы выставлять fsSystemStayOnTop принудительно?
А если попробовать так:
Св-во FormStyle в fsNormal и
В вашем случае показывая форму вызывайте gdk_window_set_keep_above передавая handle этой формы.
Св-во 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 01:48:49, всего редактировалось 3 раза.
Я свое время тоже боролся с глюками свойств формы, но там глючило hide
Прикол был в том, что параметры показа формы срабатывают только если она создается второй по порядку (или первой, не помню)
То есть порядок create в модуле, где создаются формы имеет значение
Прикол был в том, что параметры показа формы срабатывают только если она создается второй по порядку (или первой, не помню)
То есть порядок create в модуле, где создаются формы имеет значение
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Попробовал все эти советы - результат нулевой. Кстати, обратил внимание вот на какую вещь: окно это как бы все-таки остается поверх всех открытых - кроме 2-й формы этого же самого приложения (которое, кстати, имеет FormStyle=fsNormal - вот такой бред).
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Спасибо, попробую - хотя лазарь не дельфи, а иксы - не винда. О результате сообщу - думаю, он может быть интересен не только мне одному.
Добавлено спустя 6 минут 6 секунд:
Пока впечатление такое, что в LCL отсутствует TApplication.RestoreTopMosts
Добавлено спустя 6 минут 6 секунд:
Пока впечатление такое, что в LCL отсутствует TApplication.RestoreTopMosts
Боюсь Lazarus и LCL тут ни при чем, потому как такие вещи работают так, как захочет оконный менеджер.
Для успокоения совести попробуйте провести эксперимент. Не будем использовать LCL, а сделаем такую тестовую программу на чистом gtk2 и посмотрим как будет вести себя она. У меня - такой вариант работает корректно, а вариант с LCL нет(Ubuntu 15.10 x64 Unity)
Для успокоения совести попробуйте провести эксперимент. Не будем использовать 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.-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Эта штука работает нормально. Нужно бы проверить вариант с двумя окнами - обычным и "плавающим". Попробую сотворить на основе и испытать.
Добавлено спустя 14 минут 35 секунд:
В общем, и двухоконный вариант ведет себя вполне адекватно. Выходит, проблема где-то в LCL?
Добавлено спустя 14 минут 35 секунд:
В общем, и двухоконный вариант ведет себя вполне адекватно. Выходит, проблема где-то в LCL?
Выходит так)) Смотрите модуль /usr/lib/lazarus/1.4.4/lcl/interfaces/gtk2/gtk2wsforms.pp
Накидайте пример с двумя формами. Попробуем все таки разобраться.
Добавлено спустя 5 минут 34 секунды:
Сдается мне, что fsStayOnTop и fsSystemStayOnTop - это одно и то же. Что в том, что в другом случае вызывается gtk_window_set_keep_above.
Интересно...
Накидайте пример с двумя формами. Попробуем все таки разобраться.
Добавлено спустя 5 минут 34 секунды:
Сдается мне, что fsStayOnTop и fsSystemStayOnTop - это одно и то же. Что в том, что в другом случае вызывается gtk_window_set_keep_above.
Интересно...
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
А если я исходники этой проблемной проги сюда скину? Может, я где-то сам дурак все-таки?
Там меньше 1000 строк.
Добавлено спустя 10 минут 54 секунды:
В общем, вот оно...
Там меньше 1000 строк.
Добавлено спустя 10 минут 54 секунды:
В общем, вот оно...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
PVOzerski писал(а):В общем, вот оно...
Не воспроизводится баг. Корректно отображается первая форма - всегда над второй.
Добавлено спустя 1 минуту 2 секунды:
Попробуйте бинарник скомпиленный отправить
