Kodi i mëposhtëm funksionon mirë nëse ekzekutohet brenda FVWM2. Por nëse e ndryshoni desktopin në Gnome, atëherë dritarja e integruar do të shkatërrohet në vend që të futet.
Pse është kjo? Çfarë më mungon?...
Kodi vijon, por në thelb gjithçka që bën është pirun. Në fëmijë, ne krijojmë një dritare VPython dhe e lëmë atë të jetë boshe përgjithmonë. Në prind, ne krijojmë një dritare GTK, zbulojmë se cili është ID-ja e dritares së dritares së fëmijës dhe përpiqemi ta vendosim atë në një GTK::Socket.
Vini re se pjesa VPython mund të jetë e parëndësishme për këtë.
#!/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: Po, kjo është një vazhdim nga kjo pyetje.