Как я могу предотвратить отображение Gnome двух окон при выполнении alt-tab?(приложение c ++ qt) - PullRequest
6 голосов
/ 24 августа 2010

(см. Правки)

Я занимаюсь разработкой приложения QT / c ++ под gnome.

Приложение главное окно и дочернее окно QListBox.

Оба эти окна отображаются как отдельные главные окна, когда я покидаю приложение, нажимая клавишу alt-tab.

Как сделать так, чтобы при использовании alt-tab отображалось только одно окно, когда я (или позже пользователь) использовал?

Я предполагаю, что такое поведение происходит, потому что одно главное окно необрезать подокно - подокно расширяет границу главного окна.Gnome имеет плохое поведение alt-tab для ряда других приложений, показывая модальные диалоговые окна отдельно от основных окон.Но в случае моего приложения это действительно раздражает.

Я думаю, я мог бы сделать гигантское прозрачное окно, которое включает в себя оба существующих окна.Но было бы лучше найти «чистое» решение.

(самое логичное предположение, действительно, в том, что оно как-то связано с флагами окна. Я попробовал каждую разумную комбинацию флагов, о которой мог подумать. Типы окон описаны здесь )

Редактировать: приложение имеет QWidget в качестве основного окна (не QMainWindow), QListView содержится в объекте QWidget и создается путем передачи точки в главное окно.стилизован с помощью Qt :: Tool |Qt :: FramelessWindowHint.

Edit2: Стиль Qt :: X11BypassWindowManagerHint работает для удаления окна из списка alt-tab.Проблема в том, что оно также делает окно «неуправляемым», поэтому оно закрывает другие окна.Я мог бы спрятаться всякий раз, когда терял фокус - теперь приз за лучшее решение.

Ответы [ 2 ]

3 голосов
/ 31 августа 2010

При создании окна для вашего окна QListBox установите флаг окна Qt::Tool в его конструкторе или позже с помощью вызова функции setWindowFlags.Вот фрагмент кода (я опустил заголовки):

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QMainWindow mw;
    mw.show();
    QWidget toolWindow(&mw, Qt::Window|Qt::Tool);
    QHBoxLayout layout(&toolWindow);
    toolWindow.setLayout(&layout);
    QListView lv(&toolWindow);
    layout.addWidget(&lv);
    toolWindow.show();

    return app.exec();
}

Я протестировал это на моем sid-боксе Debian (Gnome 2.30, metacity 2.30.1) с только что созданным пользователем: image proof on answer to question #3553428.

Если это не то, что вы хотели, то, пожалуйста, назовите программное обеспечение, которое работает правильно, или вы можете проверить его самостоятельно.Для этого запустите xprop в окне терминала и щелкните по интересующему вас окну. Вывод будет содержать флаги окна.Тебя интересует _NET_WM_WINDOW_TYPE(ATOM).Для окна инструментов (т. Е. Не указано в alt-tab) этот флаг:

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL

Если окно с этими флагами не является окном панели инструментов, значит, что-то не так с вашим оконным менеджером, или вы лично установилитакое поведение.

1 голос
/ 02 сентября 2010

Вы можете попробовать это вручную с помощью инструмента wmctrl.С "-r -b SOMETHING" вы можете изменить аргументы NET_WM для него.Попробуйте это в [1].

Если это работает, вы можете добавить их в Xlib-Calls (Если вы узнаете номер окна X11 из Qt. Я уверен, что это возможно).*

...