alt-tabを実行するときに、Gnomeが2つのウィンドウを表示するのを防ぐにはどうすればよいですか? (C ++ QTアプリ)
質問
(編集を参照)
GNOMEの下でQT/C ++アプリケーションを開発しています。
アプリケーションはメインウィンドウとQListBox Childウィンドウです。
これらのウィンドウは両方とも、アプリケーションから離れてAlt-Tabを使用すると、別々のメインウィンドウとして表示されます。
I(または後でユーザー)がAlt-Tabを使用するときに1つのウィンドウのみが表示されるように、どうすれば作ることができますか?
この動作は、1つのメインウィンドウがサブウィンドウをクリップしないため、サブウィンドウがメインウィンドウの境界を伸ばしているためです。 GNOMEは、他の多くのアプリケーションに対してもAlt-Tabの動作が悪く、メインウィンドウとは別にモーダルダイアログボックスが表示されます。しかし、私のアプリの場合、これは本当に迷惑です。
既存のウィンドウの両方を含む巨大な透明な窓を作ることができると思っています。しかし、「きれいな」ソリューションを見つける方が良いでしょう。
(最も論理的な推測は、実際にそれがウィンドウフラグと関係があるということです。私は考えることができるフラグのすべての合理的な組み合わせを試しました。ウィンドウタイプについて説明します ここ)
編集:アプリにはメインウィンドウ(qmainwindowではなく)としてqwidgetがあり、qlistviewはqwidgetオブジェクトに含まれ、メインウィンドウにポイントを渡すことによって作成されます。 QT :: Tool |でスタイリングされていますQt :: FramelessWindowhint。
編集2: Qt :: x11bypasswindowmanagerhintスタイル します Alt-Tabリストからウィンドウを削除するように作業します。問題は、ウィンドウを「管理していない」ため、他の窓をカバーすることです。私はフォーカスを失うたびにマナリー・ハディーを隠すことができました - より良い解決策のために今賞を賞賛します。
解決
あなたのためのウィンドウを作成するとき QListBox
ウィンドウセットa 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(); }
新たに作成されたユーザーを使用して、Debian Sid Box(Gnome 2.30、Metacity 2.30.1)でこれをテストしました。 .
これがあなたが望んでいたものではない場合は、正しく動作するソフトウェアに名前を付けるか、自分でチェックすることができます。これを実行するために xprop
ターミナルウィンドウで、興味のあるウィンドウをクリックします。出力にはウィンドウフラグが含まれます。あなたが興味を持っているのはです _NET_WM_WINDOW_TYPE(ATOM)
. 。ツールウィンドウ(つまり、alt-tabにリストされていない)の場合、このフラグは次のとおりです。
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL
これらのフラグを備えたウィンドウがツールボックスウィンドウでない場合、ウィンドウマネージャーに何か問題があります。または、そのような動作を個人的に設定しています。
他のヒント
WMCTRLツールで手作業で試すことができます。 「-r -b Something」を使用すると、net_wm引数を変更できます。 [1]でこれらを試してください。
これが機能する場合は、Xlib-Callsを使用して追加できます(QtからX11ウィンドウ番号を知ることができれば、それが可能だと確信しています)。
[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html