GTK::Socket y Gtk::Plug comportamiento inesperado en Gnome y FVWM2

GTK::Socket y Gtk::Plug comportamiento inesperado en Gnome y FVWM2

El siguiente código funciona bien si se ejecuta dentro de FVWM2. Pero si cambia el escritorio a Gnome, la ventana incrustada se destruye en lugar de incrustarse.

¿Porqué es eso? ¿Qué me estoy perdiendo?...

El código sigue pero básicamente todo lo que hace es bifurcar. En el niño, creamos una ventana VPython y la dejamos inactiva para siempre. En la ventana principal, creamos una ventana GTK, averiguamos cuál es el ID de la ventana secundaria e intentamos incrustarla en un GTK::Socket.

Tenga en cuenta que la parte de VPython puede ser irrelevante para esto.

#!/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()

PD: Sí, este es un seguimiento deesta preguntayÉste.

información relacionada