Unerwartetes Verhalten von GTK::Socket und Gtk::Plug unter Gnome und FVWM2

Unerwartetes Verhalten von GTK::Socket und Gtk::Plug unter Gnome und FVWM2

Der folgende Code funktioniert einwandfrei, wenn er innerhalb von FVWM2 ausgeführt wird. Wenn Sie jedoch den Desktop auf Gnome ändern, wird das eingebettete Fenster zerstört, anstatt eingebettet zu werden.

Warum das? Was vermisse ich?...

Der Code ist wie folgt, aber im Grunde führt er nur eine Aufspaltung durch. Im Kind erstellen wir ein VPython-Fenster und lassen es für immer im Leerlauf. Im Elternteil erstellen wir ein GTK-Fenster, finden die Fenster-ID des Kindfensters heraus und versuchen, es über einen GTK::Socket einzubetten.

Beachten Sie, dass der VPython-Teil hierfür möglicherweise irrelevant ist.

#!/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: Ja, dies ist eine Fortsetzung vondiese FrageUndDieses hier.

verwandte Informationen