GTK :: Socket и Gtk :: Включение неожиданного поведения в Gnome и FVWM2

Следующий код работает нормально, если он запущен внутри FVWM2. Но если вы смените рабочий стол на Gnome, тогда встроенное окно будет уничтожено, а не встроено.

Почему это? Что мне не хватает? …

Код следует, но в основном все, что он делает, это fork. В дочернем мы создаем окно VPython и позволяем ему бездействовать навсегда. В родительском окне мы создаем окно GTK, узнаем, что такое идентификатор окна дочернего окна, и попытайтесь встроить его в GTK :: Socket.

Обратите внимание, что часть VPython, возможно, не имеет к этому отношения.

#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess import sys import os import re import time from visual import * def find_window_id (title): """Gets the OpenGL window ID.""" pattern = re.compile('0x[0-9abcdef]{7}') proc = subprocess.Popen(['xwininfo', '-name', title], stdout=subprocess.PIPE, stderr=subprocess.PIPE) errors = proc.stderr.readlines() if errors: return None for line in proc.stdout.readlines(): match = pattern.findall(line) if len(match): return long(match[0], 16) return None class Setting (): """VPython/OpenGL class.""" def __init__ (self, w=256, h=256, title='OpenGL via VPython'): """Initiator.""" self.width = w self.height = h self.title = title self.scene = display.get_selected() self.scene.title = self.title self.scene.width = self.width self.scene.height = self.height self.sphere = sphere() class GTKDisplay (): def __init__ (self, winID): """Initiator: Draws the GTK GUI.""" import gtk import pygtk self.OpenGLWindowID = winID window = gtk.Window() window.show() socket = gtk.Socket() socket.show() window.add(socket) window.connect("destroy", lambda w: gtk.main_quit()) socket.add_id(long(self.OpenGLWindowID)) gtk.main() def main (): """Main entry point.""" name = 'sphere OpenGL window' child_pid = os.fork() if 0 == child_pid: sut = Setting(title=name) else: winID = None while not winID: time.sleep(.1) winID = find_window_id(name) try: gui = GTKDisplay(winID) except KeyboardInterrupt, err: print '\nAdieu monde cruel!' if __name__ == "__main__": main() 

PS: Да, это продолжение этого вопроса и этого .