Il metodo Wnck.Screen.get_windows
restituisce tutte le finestre comprese le finestre di dialogo. Non c'è alcuna distinzione poiché la funzione restituisce qualsiasi Wnck.Window
attualmente mappato. La fonte è questa:
* The #WnckScreen represents a physical screen. A screen may consist of
* multiple monitors which are merged to form a large screen area. The
* #WnckScreen is at the bottom of the libwnck stack of objects: #WnckWorkspace
* objects exist a #WnckScreen and #WnckWindow objects are displayed on a
* #WnckWorkspace.
*
* The #WnckScreen corresponds to the notion of
* <classname>GdkScreen</classname> in GDK.
GList*
wnck_screen_get_windows (WnckScreen *screen)
{
g_return_val_if_fail (WNCK_IS_SCREEN (screen), NULL);
return screen->priv->mapped_windows;
}
dove screen->priv
punti ad un struct
contenente alcune liste delle finestre (mappati, impilati), un puntatore alla finestra attiva, ecc Alcuni WnckWindow
possono avere WNCK_WINDOW_DIALOG
insieme ed essere una finestra .
La classe WnckWindow
fornisce anche una funzione transient_is_most_recently_activated()
di sapere se l'attenzione dovrebbe andare a una finestra figlio transiente quando selezionato in un WnckTaskList
o per ridurre la finestra transitorio con il suo genitore. Ad esempio, per conoscere wether My Application
finestra ha un transitorio attivato più di recente:
screen = Wnck.Screen.get_default()
screen.force_update() # recommended per Wnck documentation
window_list = screen.get_windows()
for window in window_list:
if window.get_name() == 'My Application':
print(window.transient_is_most_recently_activated())
Lo script di seguito cattura le finestre di dialogo come altre finestre mappati (non importa se sono modali/non-modale o l'applicazione sono da) .
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Wnck', '3.0')
from gi.repository import Gtk, Wnck
class DialogExample(Gtk.Dialog):
def __init__(self, parent):
Gtk.Dialog.__init__(self, "My Dialog", parent, 0, #or Gtk.DialogFlags.MODAL
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OK, Gtk.ResponseType.OK))
self.set_default_size(100, 100)
label = Gtk.Label("This is a dialog to display additional information")
box = self.get_content_area()
box.add(label)
self.show_all()
class DialogWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Dialog Example")
self.set_border_width(6)
button = Gtk.Button("Open dialog")
button.connect("clicked", self.on_button_clicked)
self.add(button)
def on_button_clicked(self, widget):
dialog = DialogExample(self)
response = dialog.run()
if response == Gtk.ResponseType.OK:
print("The OK button was clicked")
elif response == Gtk.ResponseType.CANCEL:
print("The Cancel button was clicked")
screen = Wnck.Screen.get_default()
screen.force_update() # recommended per Wnck documentation
window_list = screen.get_windows()
for window in window_list:
print(window.get_name())
window, window_list = (None,)*2
screen = None
dialog.destroy()
win = DialogWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
window = None
screen = None
Gtk.main()
Utilizzando Gdk anziché Wnck, si sta facendo la stessa cosa a un livello leggermente inferiore.
Grazie per la risposta, ma AFAIK questo: _ "Il metodo restituisce Wnck.Screen.get_windows tutte le finestre incluse le finestre di dialogo. "_ non è vero. Se la finestra di dialogo fosse in quell'elenco di finestre restituite dalla funzione, non avrei mai postato questa domanda. Ora è passato un po 'di tempo, ma l'unico altro errore che posso immaginare è che dovrei aspettare un po' prima di ottenere l'elenco delle finestre, ma dal momento che non si tratta della finestra di dialogo che è visibile per ora, non penso che la creazione del dialogo dovrebbe richiedere così tanto tempo. Conoscete altri motivi, perché la finestra di dialogo non si troverà in quella lista di finestre? – Zelphir
Nota anche che le finestre di dialogo non appaiono in nessuna barra delle applicazioni sul mio sistema. Quindi se wnck usa qualche tipo di controllo sulla barra delle applicazioni, non funzionerà in questo modo. – Zelphir
Sono riuscito a ottenere il tuo esempio e ora sono convinto che ci deve essere qualche altro errore nel mio test di pytest, il che fa sì che la finestra di dialogo non compaia nell'elenco. Forse posso trovarlo lavorando con il tuo esempio. – Zelphir