2010-08-24 11 views
6

(vedi modifiche)Come posso impedire a Gnome di mostrare due finestre quando si esegue alt-tab? (C++ qt app)

sto sviluppando a/C++ applicazione QT sotto gnome.

L'applicazione una finestra principale e una finestra secondaria QListBox.

Entrambe queste finestre si presentano come finestre principali separate quando si disabilita l'alt-tab dall'applicazione.

Come posso fare in modo che venga visualizzata una sola finestra quando I (o successivo utente) utilizza alt-tab?

Sto indovinando che questo comportamento deriva dal fatto che una finestra principale non ritaglia la sottofinestra - la sottofinestra estende il limite della finestra principale. Gnome ha un cattivo comportamento di alt-tab anche per un certo numero di altre applicazioni, mostrando finestre di dialogo modali separatamente dalle finestre principali. Ma nel caso della mia app, questo è davvero fastidioso.

Sto pensando di creare una finestra trasparente gigante che includa entrambe le finestre esistenti. Ma sarebbe più bello trovare una soluzione "pulita".

(. L'ipotesi più logica è, infatti, che ha qualcosa a che fare con le bandiere delle finestre Ho provato ogni ragionevole combinazione di bandiere riuscivo a pensare a I tipi di finestre sono descritte here.)

Edit: La l'app ha un QWidget come finestra principale (Not QMainWindow), QListView è contenuto nell'oggetto QWidget e creato passando un punto alla finestra principale. è in stile con Qt :: Tool | Qt :: FramelessWindowHint.

Edit2: Il Qt :: stile X11BypassWindowManagerHint fa lavoro per rimuovere la finestra dalla lista alt-tab. Il problema è che rende anche la finestra "non gestita" in modo che copra le altre finestre. Potrei nascondermi man mano ogni volta che perdo la concentrazione: premia ora per una soluzione migliore.

+1

Immagino che abbia qualcosa a che fare con i flag delle finestre ... per esempio, se hai fatto una finestra degli strumenti, afferrerebbe entrambi allora? Quando uso ufficio aperto, ad esempio, gnome non passa attraverso le sue finestre degli strumenti mobili, ma solo quelle principali. –

+0

Suppongo che QListBox abbia impostato il puntatore della finestra principale su QMainWindow? Qualche possibilità su uno scheletro di codice minimo richiesto per generare questo problema? – sleepynate

risposta

3

Quando si crea una finestra per la finestra QListBox impostare un flag di finestra Qt::Tool nel suo costruttore o successivo con la chiamata di funzione setWindowFlags. Ecco alcuni frammento di codice (ho omesso le intestazioni):

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

Ho provato questo sulla mia macchina Debian sid (Gnome 2.30, metacity 2.30.1) con l'utente appena creato: image proof on answer to question #3553428.

Se questo non è quello che volevi, quindi si prega di denominare il software che funziona correttamente o è possibile controllare da soli. Per farlo, esegui xprop nella finestra del terminale e fai clic sulla finestra a cui sei interessato. L'output conterrà le finestre flag. Quello che ti interessa è _NET_WM_WINDOW_TYPE(ATOM). Per la finestra dello strumento (cioè non elencati in alt-tab) questo flag è:

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL 

Se la finestra con queste bandiere non è una finestra toolbox, allora c'è qualcosa che non va con il vostro gestore di finestre o si è personalmente impostare tale comportamento .

+0

Bene, hai l'unica risposta - il problema è che ti sbagli. Mi limiterò a trattenermi. Forse assegnarlo se modifichi per riflettere i commenti nella mia domanda ... –

+0

Beh, penso che la soluzione sia come nelle mie modifiche - devi usare lo stile Qt :: X11BypassWindowManagerHint con tutti i suoi problemi. Ma hey, se hai avuto tanti problemi, sei più vicino di chiunque altro ... –

+0

Ma l'overflow della pila di frickin potrebbe aver mangiato il bonus dato che non riesco a vederli apparire. Cattivo SO. Questo posto non è quello che era ... –

1

Puoi provarlo a mano con lo strumento wmctrl. Con "-r -b SOMETHING" puoi modificare gli argomenti NET_WM su di esso. Prova questi in [1].

Se funziona, è possibile aggiungerli con Xlib-Calls (Se si conosce X11 Numero finestra da Qt.Sono sicuro che sia possibile).

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