hi all, by the way, i just started learning pygtk and think its great.

i am having some problems getting drag and drop to work, and i'm not sure if 
its something simple
that i am doing wrong in my lack of understanding pygtk, or if there is a 
slight incompatibly
between pygtk and pygame.  I have two toplevel windows, one is my GUI, and the 
other is just a
container for pygame.  I have images in one window that i am making drag 
sources, these i can drag
to the other window with no problems.  Here is the code snippet for the drag 
sources...

gimg = gtk.Image()
...
f = gtk.EventBox()
f.add( gimg )
f.drag_source_set(gtk.gdk.BUTTON1_MASK, 
                [ ('hello', gtk.TARGET_SAME_APP,0) ], 
                gtk.gdk.ACTION_COPY)

the problem i have is when i drop it on my other window, this window is an 
opengl pygame window. 
I am expecting that on the drop my function drop_cb will be called, but it does 
not.  Code
snippet..

win = gtk.Window( gtk.WINDOW_TOPLEVEL )
custom = gtk.DrawingArea()
custom.set_size_request( screensize[0], screensize[1] )
custom.connect('map-event', init_pygame)
win.drag_dest_set(0, [ ('hello', gtk.TARGET_SAME_APP,0) ], 0)
win.connect('drag_drop', drop_cb)
win.add( custom )
win.show_all()



shouldn't win.connect('drag_drop', drop_cb) catch all drop events and call the 
function?  Or have
i set something wrong in win.drag_dest_set(); i'm a little confused about the 
params that it
takes, even after reading 
http://www.pygtk.org/pygtk2tutorial/sec-DNDMethods.html


below is the entire script,
-brett


import sys, os

# http://www.daa.com.au/pipermail/pygtk/2006-September/012888.html
if sys.platform == "win32":
        os.environ['SDL_VIDEODRIVER'] = 'windib'

import pygtk, gtk
import twisted, twisted.web, twisted.internet
import Image, StringIO


import OpenGL
from OpenGL.GL import *
from OpenGL.GLU import *
print 'imported OpenGL'

from twisted.internet import gtk2reactor
gtk2reactor.install()

from twisted.internet import reactor
Kernel = reactor

pygame = None
screensize = ( 900, 680 )
def init_pygame( widget, *args ):
        global pygame
        import pygame
        print 'imported pygame'

        handle = widget.window.xid
        os.environ['SDL_WINDOWID'] = str(handle)
        pygame.init()
        pygame.display.init()
        pygame.mixer.init( 22050, -16, 1 )

        info = pygame.display.Info()
        print info

        pygame.display.set_mode(screensize, pygame.OPENGL | pygame.DOUBLEBUF )


        glLoadIdentity()
        glViewport(0, 0, screensize[0], screensize[1])
        glShadeModel(GL_SMOOTH)
        glClearColor(0, 0, 0, 0)
        glClearDepth(1.0)
        glDisable(GL_LIGHTING)

        glEnable(GL_POINT_SMOOTH)
        glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE)

        glEnable(GL_COLOR_MATERIAL)



        print '---- opengl defaults set'

        # setup projection
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho( 0, 1, 0, 1, -1000, 1000 )      # left, right, bottom, top, 
zNear, zFar
        # setup model view
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glDisable(GL_DEPTH_TEST)
        glEnable(GL_SCISSOR_TEST)
        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
        glEnable( GL_NORMALIZE )
        print '---- opengl view matrices set'

        glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST)
        glEnable(GL_LINE_SMOOTH)        # enable antialiasing

        glEnable(GL_POINT_SMOOTH)

        width,height = screensize
        glViewport(0, 0, width, height)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        if 0:
                gluPerspective(160, 1.0*width/height, 0.01, 100.0)
                glMatrixMode(GL_MODELVIEW)
                glLoadIdentity()

        glShadeModel(GL_SMOOTH)
        glClearDepth(1.0)
        glEnable(GL_DEPTH_TEST)
        glDepthFunc(GL_LEQUAL)
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)


# http://www.daa.com.au/pipermail/pygtk/2003-June/005268.html
def pil_to_gdk(img):
        file = StringIO.StringIO()
        img.save(file, 'ppm')
        contents = file.getvalue()
        file.close()
        loader = gtk.gdk.PixbufLoader('pnm')
        loader.write (contents, len(contents))
        pixbuf = loader.get_pixbuf()
        loader.close()
        return pixbuf

def on_tab( w, data=None ): print w

window = gtk.Window( gtk.WINDOW_TOPLEVEL )
window.set_default_size( 300, 680 )
window.show()
notebook = gtk.Notebook()
window.add( notebook )

notebook.set_show_tabs(True)

child = gtk.ScrolledWindow(hadjustment=None)
child.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
vbox = gtk.VBox()
child.add_with_viewport( vbox )
vbox.show()

        
eventbox = gtk.EventBox()
eventbox.set_events(gtk.gdk.BUTTON_PRESS_MASK)
eventbox.connect('button-press-event', on_tab)
label = gtk.Label('add')
eventbox.add(label)
eventbox.show()
label.show()
notebook.append_page(child, eventbox)

child = gtk.Frame()
eventbox = gtk.EventBox()
eventbox.set_events(gtk.gdk.BUTTON_PRESS_MASK)
eventbox.connect('button-press-event', on_tab)
label = gtk.Label('edit')
eventbox.add(label)
eventbox.show()
label.show()
notebook.append_page(child, eventbox)

child = gtk.Frame()
eventbox = gtk.EventBox()
eventbox.set_events(gtk.gdk.BUTTON_PRESS_MASK)
eventbox.connect('button-press-event', on_tab)
label = gtk.Label('brain')
eventbox.add(label)
eventbox.show()
label.show()
notebook.append_page(child, eventbox)

window.show_all()

def drop_cb(wid, context, x, y, time):
        print 'why is this never called?'
        print context
        print dir(context)
        context.finish(True, False, time)
        return True
   
win = gtk.Window( gtk.WINDOW_TOPLEVEL )
custom = gtk.DrawingArea()
custom.set_size_request( screensize[0], screensize[1] )
custom.connect('map-event', init_pygame)
win.drag_dest_set(0, [ ('hello', gtk.TARGET_SAME_APP,0) ], 0)
win.connect('drag_drop', drop_cb)
win.add( custom )
win.show_all()

dump = True
def mainloop():
        #pygame.event.pump()    
        #k_pressed = pygame.key.get_pressed()
        #m_pressed = pygame.mouse.get_pressed()

        mx,my = custom.get_pointer()
        sx,sy = screensize      #global
        mx = float(mx) / sx     # zero division bug?

        my = float(my) / sy

        my = 1.0 - my   # flip my
        
        r,g,b,a = (0.5,0.5,0.5,0)
        glClearColor(r,g,b,0)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        glDisable( GL_LIGHTING )
        glDisable( GL_DEPTH_TEST )
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho( 0, 1, 0, 1, -1000, 1000 )      # left, right, bottom, top, 
zNear, zFar
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glDisable(GL_DEPTH_TEST)
        glEnable(GL_SCISSOR_TEST)
        
        glPushMatrix()

        glLineWidth(8)
        glColor3f(1,1,1)
        glBegin( GL_LINE_LOOP )
        glVertex3f(0,0,0)
        glVertex3f(1,0,0)
        glVertex3f(1,1,0)
        glVertex3f(0,1,0)
        glEnd()

        glPushMatrix()
        glTranslate(mx, my, 0)
        glScale(0.1,0.1,0.1)
        glBegin(GL_TRIANGLES)
        glColor3f(1.0,0.0,0.0)
        glVertex3f( 0.0, 1.0, 0.0)              
        glColor3f(0.0,1.0,0.0)
        glVertex3f(-1.0,-1.0, 1.0)
        glColor3f(0.0,0.0,1.0)  
        glVertex3f( 1.0,-1.0, 1.0)

        glColor3f(1.0,0.0,0.0)  
        glVertex3f( 0.0, 1.0, 0.0)
        glColor3f(0.0,0.0,1.0)  
        glVertex3f( 1.0,-1.0, 1.0)
        glColor3f(0.0,1.0,0.0)  
        glVertex3f( 1.0,-1.0, -1.0)

        glColor3f(1.0,0.0,0.0)  
        glVertex3f( 0.0, 1.0, 0.0)
        glColor3f(0.0,1.0,0.0)  
        glVertex3f( 1.0,-1.0, -1.0)
        glColor3f(0.0,0.0,1.0)  
        glVertex3f(-1.0,-1.0, -1.0)


        glColor3f(1.0,0.0,0.0)  
        glVertex3f( 0.0, 1.0, 0.0)
        glColor3f(0.0,0.0,1.0)  
        glVertex3f(-1.0,-1.0,-1.0)
        glColor3f(0.0,1.0,0.0)  
        glVertex3f(-1.0,-1.0, 1.0)
        glEnd()
        glPopMatrix()

        glPopMatrix()   
        if pygame:
                pygame.display.flip()   # swap buffer
                if dump: dump_screen()

        Kernel.callLater(0.03, mainloop)



def dump_screen():
        screen = pygame.display.get_surface()
        x,y = screen.get_size()

        data = pygame.image.tostring(screen, 'RGB', 0)

        img = Image.fromstring('RGB', (x,y), data)      
        img.thumbnail( (128,128), True )
        pixbuf = pil_to_gdk(img)
        for i in range(10):
                gimg = gtk.Image()
                gimg.set_from_pixbuf( pixbuf )
                gimg.show()
                f = gtk.EventBox()
                f.add( gimg )
                f.drag_source_set(gtk.gdk.BUTTON1_MASK, 
                        [ ('hello', gtk.TARGET_SAME_APP,0) ], 
                        gtk.gdk.ACTION_COPY)
                f.show()
                vbox.add( f )

        global dump
        dump = False

#gtk.main()
Kernel.callLater(1, mainloop)
Kernel.run()





 
____________________________________________________________________________________
Looking for earth-friendly autos? 
Browse Top Cars by "Green Rating" at Yahoo! Autos' Green Center.
http://autos.yahoo.com/green_center/
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to