Déplacement d'une fenêtre entre les espaces de travail / postes de travail virtuels
-
22-09-2019 - |
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 ..?
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 .