2010-08-24 10 views
6

(siehe Änderungen)Wie kann ich verhindern, dass Gnome beim Ausführen von Alt-Tab zwei Fenster anzeigt? (C++ qt app)

Ich entwickle eine QT/C++ Anwendung unter Gnom.

Die Anwendung ein Hauptfenster und QListBox untergeordneten Fenster.

Beide dieser Fenster zeigen sich als separate Hauptfenster, wenn ich Alt-Tab von der Anwendung entfernt.

Wie kann ich es so einrichten, dass nur ein Fenster angezeigt wird, wenn ich (oder später der Benutzer) Alt-Tab verwende?

Ich rate dieses Verhalten kommt, weil ein Hauptfenster das Unterfenster nicht abschneidet - das Unterfenster erweitert die Grenze des Hauptfensters. Gnome hat auch für eine Reihe anderer Anwendungen ein schlechtes Alt-Tab-Verhalten und zeigt modale Dialogfelder getrennt von den Hauptfenstern an. Aber im Falle meiner App ist das wirklich nervig.

Ich denke, ich könnte ein riesiges transparentes Fenster, das beide bestehenden Fenster enthält. Aber es wäre schöner, eine "saubere" Lösung zu finden.

(. Die logischste Vermutung ist, in der Tat, dass es etwas mit Fenster Fahnen zu tun hat, ich habe jede sinnvolle Kombination von Flaggen habe ich versucht, einfiel Die Fenstertypen here beschrieben werden.)

Edit: Die App hat ein QWidget als Hauptfenster (Nicht QMainWindow), QListView ist im QWidget-Objekt enthalten und wird durch Übergeben eines Punktes an das Hauptfenster erstellt. ist mit Qt :: Tool | gestylt Qt :: FramelessWindowHint.

Edit2: Die Qt :: X11BypassWindowManagerHint Stil tut Arbeit das Fenster aus der Alt-Tab-Liste zu entfernen. Das Problem ist, dass es das Fenster auch "unmanaged" macht, so dass es die anderen Fenster abdeckt. Ich könnte mich verstecken, wenn ich den Fokus verliere - jetzt Preis für eine bessere Lösung.

+1

Ich vermute, es hat etwas mit den Fensterflaggen zu tun ... zum Beispiel, wenn Sie es zu einem Werkzeugfenster machten, würde es beide dann greifen? Wenn ich zum Beispiel OpenOffice nutze, durchsucht Gnome nicht seine schwebenden Werkzeugfenster, sondern nur die wichtigsten. –

+0

Ich nehme an, die QListBox hat den übergeordneten Fensterzeiger auf ein QMainWindow gesetzt? Gibt es eine Chance auf ein Gerüst von mindestens erforderlichem Code, um dieses Problem zu erzeugen? – sleepynate

Antwort

3

Wenn Sie ein Fenster für Ihr QListBox Fenster erstellen, setzen Sie ein Qt::Tool Fenster Flag in seinem Konstruktor oder später mit setWindowFlags Funktionsaufruf. Hier ist ein Code-Schnipsel (I die Header weggelassen):

 
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(); 
}

ich diese auf meinem Debian sid Box getestet haben (Gnome 2.30, metacity 2.30.1) mit frisch Benutzer erstellt: image proof on answer to question #3553428.

Wenn dies nicht das ist, was Sie wollten, dann nennen Sie bitte die Software, die richtig funktioniert, oder Sie können es selbst überprüfen. Um dies zu tun, führen Sie xprop in Terminal-Fenster und klicken Sie auf das Fenster, das Sie interessiert. Die Ausgabe wird Fenster Flags enthalten. Der, an dem Sie interessiert sind, ist _NET_WM_WINDOW_TYPE(ATOM). Für das Werkzeugfenster (dh nicht in Alt-Tab angezeigt) dieses Flag:

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL 

Wenn das Fenster mit diesen Flags kein Toolbox Fenster ist, dann ist etwas falsch mit Ihrem Fenstermanager oder Sie haben persönlich ein solches Verhalten gesetzt .

+0

Nun, du hast die einzige Antwort - das Problem ist, du liegst falsch. Ich halte einfach aus. Vielleicht, wenn Sie bearbeiten, um die Kommentare in meiner Frage zu reflektieren ... –

+0

Nun, ich denke, die Lösung ist wie in meinen Änderungen - Sie müssen den Qt :: X11BypassWindowManagerHint Stil mit all seinen Problemen verwenden. Aber hey, wenn du so viel Ärger gemacht hast, bist du näher dran als jeder andere ... –

+0

Aber ein übermäßiger Stack-Überlauf könnte den Bonus aufgefressen haben, da ich sie nicht erscheinen sehen kann. Schlechtes SO. Dieser Ort ist nicht mehr so ​​wie früher ... –

1

Sie können es mit dem wmctrl-Tool von Hand versuchen. Mit "-r -b SOMETHING" können Sie NET_WM-Argumente ändern. Probiere diese in [1] aus.

Wenn das funktioniert, können Sie sie mit Xlib-Calls hinzufügen (Wenn Sie X11 Window Number von Qt kennen lernen.Ich bin mir sicher, dass das möglich ist).

[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html