Add ctypes call for window tracking

This commit is contained in:
Michael Webster 2013-03-05 21:56:17 -05:00
parent 1b1781d78f
commit 0583021023
2 changed files with 43 additions and 15 deletions

View File

@ -0,0 +1,36 @@
#!/usr/bin/env python
import gi
import ctypes
from ctypes import *
libgobject = CDLL('libgobject-2.0.so.0')
class _PyGObject_Functions(ctypes.Structure):
_fields_ = [
('register_class',
ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p,
ctypes.c_int, ctypes.py_object,
ctypes.py_object)),
('register_wrapper',
ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.py_object)),
('lookup_class',
ctypes.PYFUNCTYPE(ctypes.py_object, ctypes.c_int)),
('newgobj',
ctypes.PYFUNCTYPE(ctypes.py_object, ctypes.c_void_p)),
]
class PyGObjectCPAI(object):
def __init__(self):
PyCObject_AsVoidPtr = ctypes.pythonapi.PyCObject_AsVoidPtr
PyCObject_AsVoidPtr.restype = ctypes.c_void_p
PyCObject_AsVoidPtr.argtypes = [ctypes.py_object]
addr = PyCObject_AsVoidPtr(ctypes.py_object(
gi._gobject._PyGObject_API))
self._api = _PyGObject_Functions.from_address(addr)
def pygobject_new(self, addr):
return self._api.newgobj(addr)
def get_widget(ptr):
return PyGObjectCPAI().pygobject_new(ptr)

View File

@ -16,11 +16,17 @@ try:
import traceback import traceback
import time import time
import gc import gc
import ctypes
from ctypes import *
import capi
import xdg.Config import xdg.Config
except Exception, e: except Exception, e:
print e print e
sys.exit( 1 ) sys.exit( 1 )
gtk = CDLL("libgtk-x11-2.0.so.0")
gdk = CDLL("libgdk-x11-2.0.so.0")
global mbindkey global mbindkey
# Load the key binding lib (developped by deskbar-applet, copied into mintMenu so we don't end up with an unnecessary dependency) # Load the key binding lib (developped by deskbar-applet, copied into mintMenu so we don't end up with an unnecessary dependency)
try: try:
@ -489,26 +495,12 @@ class MainWindow( object ):
# Check if the pointer is within the menu, else hide the menu # Check if the pointer is within the menu, else hide the menu
winatptr = Gdk.window_at_pointer() winatptr = Gdk.window_at_pointer()
widget_win = widget.get_window()
print winatptr
print widget_win
if winatptr[0] != widget_win:
self.hide(True)
return True
if winatptr: if winatptr:
win = winatptr[0] win = winatptr[0]
while win: while win:
print "xx"
print self.window.window
if win == self.window.window: if win == self.window.window:
break break
win = win.get_toplevels() win = capi.get_widget(gdk.gdk_window_get_parent (hash(win)))
if not win: if not win:
self.hide( True ) self.hide( True )
else: else: