From 3ef23852a69bfbb008e16c0e5a87d951f88fd08b Mon Sep 17 00:00:00 2001 From: Eratosthenes Date: Mon, 16 Nov 2009 10:00:26 -0500 Subject: [PATCH 1/5] Update Tables_Demo to work with new XTables/TableWindow format. --- pyfpdb/Tables_Demo.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyfpdb/Tables_Demo.py b/pyfpdb/Tables_Demo.py index e141cab1..92d85d75 100755 --- a/pyfpdb/Tables_Demo.py +++ b/pyfpdb/Tables_Demo.py @@ -82,11 +82,12 @@ if __name__=="__main__": (tour_no, tab_no) = table_name.split(",", 1) tour_no = tour_no.rstrip() tab_no = tab_no.rstrip() - table = Tables.Table(tournament = tour_no, table_number = tab_no) + table = Tables.Table(None, tournament = tour_no, table_number = tab_no) else: # not a tournament print "cash game" table_name = table_name.rstrip() - table = Tables.Table(table_name = table_name) + table = Tables.Table(None, table_name = table_name) + table.gdk_handle = gtk.gdk.window_foreign_new(table.number) print "table =", table print "game =", table.get_game() From d592e85375a020e73fe259cb518324a402aa3568 Mon Sep 17 00:00:00 2001 From: Eratosthenes Date: Mon, 16 Nov 2009 11:20:44 -0500 Subject: [PATCH 2/5] Possible fix of not finding windows in X. --- pyfpdb/XTables.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pyfpdb/XTables.py b/pyfpdb/XTables.py index fd1ce9c1..cbfa8875 100644 --- a/pyfpdb/XTables.py +++ b/pyfpdb/XTables.py @@ -40,6 +40,7 @@ from TableWindow import Table_Window # We might as well do this once and make them globals disp = Xlib.display.Display() root = disp.screen().root +name_atom = disp.get_atom("WM_NAME", 1) class Table(Table_Window): @@ -49,8 +50,14 @@ class Table(Table_Window): for outside in root.query_tree().children: for inside in outside.query_tree().children: if done_looping: break - if inside.get_wm_name() and re.search(search_string, inside.get_wm_name()): - if self.check_bad_words(inside.get_wm_name()): continue + prop = inside.get_property(name_atom, Xlib.Xatom.STRING, 0, 1000) + if prop is None: continue + if prop.value and re.search(search_string, prop.value): + if self.check_bad_words(prop.value): continue +# if inside.get_wm_name() and re.search(search_string, inside.get_wm_name()): +# if self.check_bad_words(inside.get_wm_name()): +# print "bad word =", inside.get_wm_name() +# continue self.window = inside self.parent = outside done_looping = True From 4abfc0093fb326adf769f0b27f13fff309a3f3c6 Mon Sep 17 00:00:00 2001 From: Eratosthenes Date: Mon, 16 Nov 2009 11:48:31 -0500 Subject: [PATCH 3/5] test print --- pyfpdb/XTables.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyfpdb/XTables.py b/pyfpdb/XTables.py index cbfa8875..590bd743 100644 --- a/pyfpdb/XTables.py +++ b/pyfpdb/XTables.py @@ -51,6 +51,7 @@ class Table(Table_Window): for inside in outside.query_tree().children: if done_looping: break prop = inside.get_property(name_atom, Xlib.Xatom.STRING, 0, 1000) + print prop if prop is None: continue if prop.value and re.search(search_string, prop.value): if self.check_bad_words(prop.value): continue From 55f1ebedd934e389974d844cc84cbb2c0778a487 Mon Sep 17 00:00:00 2001 From: Eratosthenes Date: Mon, 16 Nov 2009 13:04:25 -0500 Subject: [PATCH 4/5] Another possible fix to missing windows. --- pyfpdb/XTables.py | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/pyfpdb/XTables.py b/pyfpdb/XTables.py index 590bd743..c19db5d9 100644 --- a/pyfpdb/XTables.py +++ b/pyfpdb/XTables.py @@ -25,6 +25,7 @@ of Table_Window objects representing the windows found. # Standard Library modules import re +import os # pyGTK modules import pygtk @@ -45,26 +46,43 @@ name_atom = disp.get_atom("WM_NAME", 1) class Table(Table_Window): def find_table_parameters(self, search_string): - self.window = None +# self.window = None +# done_looping = False +# for outside in root.query_tree().children: +# for inside in outside.query_tree().children: +# if done_looping: break +# prop = inside.get_property(name_atom, Xlib.Xatom.STRING, 0, 1000) +# print prop +# if prop is None: continue +# if prop.value and re.search(search_string, prop.value): +# if self.check_bad_words(prop.value): continue +## if inside.get_wm_name() and re.search(search_string, inside.get_wm_name()): +## if self.check_bad_words(inside.get_wm_name()): +## print "bad word =", inside.get_wm_name() +## continue +# self.window = inside +# self.parent = outside +# done_looping = True +# break + + window_number = None + for listing in os.popen('xwininfo -root -tree').readlines(): + if re.search(search_string, listing): + print listing + mo = re.match('\s+([\dxabcdef]+)\s', listing) + window_number = int( mo.group(1), 0) + done_looping = False for outside in root.query_tree().children: for inside in outside.query_tree().children: if done_looping: break - prop = inside.get_property(name_atom, Xlib.Xatom.STRING, 0, 1000) - print prop - if prop is None: continue - if prop.value and re.search(search_string, prop.value): - if self.check_bad_words(prop.value): continue -# if inside.get_wm_name() and re.search(search_string, inside.get_wm_name()): -# if self.check_bad_words(inside.get_wm_name()): -# print "bad word =", inside.get_wm_name() -# continue + if inside.id == window_number: self.window = inside self.parent = outside done_looping = True break - if self.window == None or self.parent == None: + if window_number is None: print "Window %s not found. Skipping." % search_string return None From 812998704de48c46148acf7973f926ab0603f16f Mon Sep 17 00:00:00 2001 From: Eratosthenes Date: Mon, 16 Nov 2009 15:35:58 -0500 Subject: [PATCH 5/5] Yet another try to fix missing X windows. Using xwininfo. --- pyfpdb/Tables_Demo.py | 4 ++-- pyfpdb/XTables.py | 54 ++++++++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/pyfpdb/Tables_Demo.py b/pyfpdb/Tables_Demo.py index 92d85d75..397579e7 100755 --- a/pyfpdb/Tables_Demo.py +++ b/pyfpdb/Tables_Demo.py @@ -90,11 +90,11 @@ if __name__=="__main__": table.gdk_handle = gtk.gdk.window_foreign_new(table.number) print "table =", table - print "game =", table.get_game() +# print "game =", table.get_game() fake = fake_hud(table) print "fake =", fake - gobject.timeout_add(100, check_on_table, table, fake) +# gobject.timeout_add(100, check_on_table, table, fake) print "calling main" gtk.main() diff --git a/pyfpdb/XTables.py b/pyfpdb/XTables.py index c19db5d9..a14debc1 100644 --- a/pyfpdb/XTables.py +++ b/pyfpdb/XTables.py @@ -69,36 +69,42 @@ class Table(Table_Window): for listing in os.popen('xwininfo -root -tree').readlines(): if re.search(search_string, listing): print listing - mo = re.match('\s+([\dxabcdef]+)\s', listing) - window_number = int( mo.group(1), 0) - - done_looping = False - for outside in root.query_tree().children: - for inside in outside.query_tree().children: - if done_looping: break - if inside.id == window_number: - self.window = inside - self.parent = outside - done_looping = True - break + mo = re.match('\s+([\dxabcdef]+) (.+):\s\(\"([a-zA-Z.]+)\".+ (\d+)x(\d+)\+\d+\+\d+ \+(\d+)\+(\d+)', listing) + self.number = int( mo.group(1), 0) + self.width = int( mo.group(4) ) + self.height = int( mo.group(5) ) + self.x = int( mo.group(6) ) + self.y = int( mo.group(7) ) + self.title = re.sub('\"', '', mo.group(2)) + self.exe = "" # not used? + self.hud = None +# done_looping = False +# for outside in root.query_tree().children: +# for inside in outside.query_tree().children: +# if done_looping: break +# if inside.id == window_number: +# self.window = inside +# self.parent = outside +# done_looping = True +# break if window_number is None: print "Window %s not found. Skipping." % search_string return None - my_geo = self.window.get_geometry() - pa_geo = self.parent.get_geometry() +# my_geo = self.window.get_geometry() +# pa_geo = self.parent.get_geometry() +# +# self.x = pa_geo.x + my_geo.x +# self.y = pa_geo.y + my_geo.y +# self.width = my_geo.width +# self.height = my_geo.height +# self.exe = self.window.get_wm_class()[0] +# self.title = self.window.get_wm_name() +# self.site = "" +# self.hud = None - self.x = pa_geo.x + my_geo.x - self.y = pa_geo.y + my_geo.y - self.width = my_geo.width - self.height = my_geo.height - self.exe = self.window.get_wm_class()[0] - self.title = self.window.get_wm_name() - self.site = "" - self.hud = None - - window_string = str(self.window) +# window_string = str(self.window) mo = re.match('Xlib\.display\.Window\(([\dxabcdef]+)', window_string) if not mo: print "Not matched"