Question

J'ai une application Linux uniquement wxPython avec un wxFrame qui agit comme un menu / barre d'outils, il peut ouvrir de nouvelles fenêtres indépendantes de la barre d'outils lui-même.
Étant donné que l'utilisateur peut déplacer l'une de ces fenêtres à un espace de travail virtuel, je suis à la recherche d'un moyen de déplacer la barre d'outils à l'espace de travail chaque fois que l'utilisateur active une fenêtre.
J'ai essayé d'utiliser Raise (), mais de cette manière la barre d'outils reçoit le focus aussi, et je ne veux pas. S'il vous plaît noter que je ne peux pas la barre d'outils collante, car je ne veux pas le tous espace de travail.

Merci!

(wxPython 2.8.9.1, Ubuntu 9.04)

Suivi:

J'ai vérifié le code source de xfwm4 pour voir comment il fait son « Déplacer la fenêtre à l'espace de travail N » .. Il utilise le soupçon _NET_WM_DESKTOP , donc je essaie de le faire en utilisant Python .. Voici mon code en ce moment:

import gtk

def move_to_workspace(frame, ws):
    gdkwin = gtk.gdk.window_lookup(frame.GetHandle())
    win = gdkwin.get_user_data()
    while not isinstance(win, gtk.Window): # Find parent Window object
        win = win.get_parent()
    win.window.property_change(gtk.gdk.atom_intern("_NET_WM_DESKTOP"),
                                                        gtk.gdk.atom_intern("CARDINAL"), 32,
                                                        gtk.gdk.PROP_MODE_REPLACE,
                                                        [ws])

Il semble que le code est un certain succès, puisque xprop détecte le changement:

(before execution)
$ xprop | grep WM_DESKTOP
_NET_WM_DESKTOP(CARDINAL) = 0

(after)
$xprop | grep WM_DESKTOP
_NET_WM_DESKTOP(CARDINAL) = 1

mais le problème est que la fenêtre ne se déplace pas à l'espace de travail souhaité: /

Dois-je utiliser python-xlib au lieu de pygtk? Si tel est le cas, comment puis-je obtenir d'un wxFrame (ou gtk.Window, ou XID) le Xlib.Window correspondant?

Suivi 2:

La même chose se produit en utilisant xprop ..

$ xprop -id <id> -f _NET_WM_DESKTOP 32c -set _NET_WM_DESKTOP 1

Il détecte le _NET_WM_DESKTOP changé, mais la fenêtre reste là: / Cependant, je remarquai les éléments suivants:

  • une version iconifié de la fenêtre apparaît sur l'espace de travail prévu
  • si je réduis la fenêtre sur l'espace de travail « source », il disparaît

Alors, peut-être que je devrais envoyer une sorte de message « rafraîchir » au gestionnaire de fenêtres trop ..?

Était-ce utile?

La solution

Il est un peu vieux, mais quand même ... Tu dois méthode flush appel de l'instance display.Display après la définition des propriétés de la fenêtre et l'envoi d'événements.

Autres conseils

En fin de compte, j'ai décidé d'utiliser simplement wmctrl .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top