diff --git a/pyfpdb/GuiAutoImport.py b/pyfpdb/GuiAutoImport.py index ceb3da0d..38535ad1 100644 --- a/pyfpdb/GuiAutoImport.py +++ b/pyfpdb/GuiAutoImport.py @@ -128,12 +128,12 @@ class GuiAutoImport (threading.Thread): widget.set_label(u'Stop Autoimport') if self.pipe_to_hud is None: if os.name == 'nt': - command = "python HUD_main.py" + " %s" % (self.database) + command = "python HUD_run_me.py" + " %s" % (self.database) bs = 0 # windows is not happy with line buffing here self.pipe_to_hud = subprocess.Popen(command, bufsize = bs, stdin = subprocess.PIPE, universal_newlines=True) else: - command = self.config.execution_path('HUD_main.py') + command = self.config.execution_path('HUD_run_me.py') bs = 1 self.pipe_to_hud = subprocess.Popen((command, self.database), bufsize = bs, stdin = subprocess.PIPE, universal_newlines=True) diff --git a/pyfpdb/HUD_main.py b/pyfpdb/HUD_main.py index 9bf630b6..2615b2b0 100755 --- a/pyfpdb/HUD_main.py +++ b/pyfpdb/HUD_main.py @@ -36,9 +36,6 @@ import time import string import re -errorfile = open('HUD-error.txt', 'w', 0) -sys.stderr = errorfile - # pyGTK modules import pygtk import gtk @@ -61,11 +58,11 @@ def destroy(*args): # call back for terminating the main eventloop gtk.main_quit() def create_HUD(new_hand_id, table, db_name, table_name, max, poker_game, db_connection, config, stat_dict): - global hud_dict - global eb + global hud_dict, eb + def idle_func(): - global hud_dict - global eb + global hud_dict, eb + gtk.gdk.threads_enter() try: newlabel = gtk.Label(table_name) @@ -97,10 +94,19 @@ def update_HUD(new_hand_id, table_name, config, stat_dict): finally: gtk.gdk.threads_leave() gobject.idle_add(idle_func) + +def HUD_removed(tablename): + global hud_dict, eb + + if tablename in hud_dict and hud_dict[tablename].deleted: + eb.remove(hud_dict[tablename].tablehudlabel) + del(hud_dict[tablename]) + return False + + return True def read_stdin(): # This is the thread function - global hud_dict - global eb + global hud_dict, eb db_connection = Database.Database(config, db_name, 'temp') tourny_finder = re.compile('(\d+) (\d+)') @@ -112,10 +118,9 @@ def read_stdin(): # This is the thread function destroy() # delete hud_dict entries for any HUD destroyed since last iteration - for h in hud_dict.keys(): - if hud_dict[h].deleted: - eb.remove(hud_dict[h].tablehudlabel) - del(hud_dict[h]) +# for h in hud_dict: +# HUD_removed(h) +# removing this function, we shouldn't need it anymore, since the hud should notify us anyway, right? # get basic info about the new hand from the db (table_name, max, poker_game) = db_connection.get_table_name(new_hand_id) @@ -131,14 +136,14 @@ def read_stdin(): # This is the thread function stat_dict = db_connection.get_stats_from_hand(new_hand_id) # if a hud for this CASH table exists, just update it - if hud_dict.has_key(table_name): + if table_name in hud_dict: # update the data for the aux_windows for aw in hud_dict[table_name].aux_windows: aw.update_data(new_hand_id, db_connection) update_HUD(new_hand_id, table_name, config, stat_dict) # if a hud for this TOURNAMENT table exists, just update it - elif hud_dict.has_key(tour_number): + elif tour_number in hud_dict: update_HUD(new_hand_id, tour_number, config, stat_dict) # otherwise create a new hud diff --git a/pyfpdb/HUD_run_me.py b/pyfpdb/HUD_run_me.py new file mode 100644 index 00000000..53e79d42 --- /dev/null +++ b/pyfpdb/HUD_run_me.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +import sys +import os +import thread +import time +import string +import re + +errorfile = open('HUD-error.txt', 'w', 0) +sys.stderr = errorfile + +# pyGTK modules +import pygtk +import gtk +import gobject + +# FreePokerTools modules +import Configuration +import Database +import Tables +import Hud +import HUD_main + +def destroy(*args): # call back for terminating the main eventloop + gtk.main_quit() + + +if __name__== "__main__": + sys.stderr.write("HUD_main starting\n") + + try: + HUD_main.db_name = sys.argv[1] + except: + HUD_main.db_name = 'fpdb' + sys.stderr.write("Using db name = %s\n" % (HUD_main.db_name)) + + HUD_main.config = Configuration.Config() + + gobject.threads_init() # this is required + thread.start_new_thread(HUD_main.read_stdin, ()) # starts the thread + + HUD_main.main_window = gtk.Window() + HUD_main.main_window.connect("destroy", destroy) + HUD_main.eb = gtk.VBox() + label = gtk.Label('Closing this window will exit from the HUD.') + HUD_main.eb.add(label) + HUD_main.main_window.add(HUD_main.eb) + + HUD_main.main_window.set_title("HUD Main Window") + HUD_main.main_window.show_all() + + gtk.main() diff --git a/pyfpdb/Hud.py b/pyfpdb/Hud.py index 2dfb51fd..517ab2e9 100644 --- a/pyfpdb/Hud.py +++ b/pyfpdb/Hud.py @@ -61,13 +61,15 @@ class Hud: self.stat_windows = {} self.popup_windows = {} self.aux_windows = [] + (font, font_size) = config.get_default_font(self.table.site) - print "font = ", font, "size = ", font_size - if font == None or font_size == None: - self.font = pango.FontDescription("Sans 7") - else: - print "Setting font to ", font + " " + font_size - self.font = pango.FontDescription(font + " " + font_size) + if font == None: + font = "Sans" + if font_size == None: + font_size = "8" + + print "Setting font to ", font + " " + font_size + self.font = pango.FontDescription(font + " " + font_size) # do we need to add some sort of condition here for dealing with a request for a font that doesn't exist? @@ -122,6 +124,9 @@ class Hud: self.main_window.show_all() +# TODO: fold all uses of this type of 'topify' code into a single function, if the differences between the versions don't +# create adverse effects? + if os.name == 'nt': self.topify_window(self.main_window) else: @@ -143,10 +148,10 @@ class Hud: self.main_window.move(x, y) adj = self.adj_seats(self.hand, self.config) loc = self.config.get_locations(self.table.site, self.max) - for i in range(1, self.max + 1): + for i in range(1, self.max + 1): (x, y) = loc[adj[i]] - if self.stat_windows.has_key(i): - self.stat_windows[i].relocate(x, y) + if i in self.stat_windows: + self.stat_windows[i].relocate(x, y) return True def on_button_press(self, widget, event): @@ -159,13 +164,15 @@ class Hud: return False def kill_hud(self, *args): - for k in self.stat_windows.keys(): + for k in self.stat_windows: self.stat_windows[k].window.destroy() self.main_window.destroy() self.deleted = True + HUD_main.HUD_removed(self.table.name) def reposition_windows(self, *args): - self.update_table_position() + for w in self.stat_windows: + self.stat_windows[w].window.move(self.stat_windows[w].x, self.stat_windows[w].y) return True def debug_stat_windows(self, *args): @@ -213,7 +220,7 @@ class Hud: # create the stat windows for i in range(1, self.max + 1): (x, y) = loc[adj[i]] - if self.stat_windows.has_key(i): + if i in self.stat_windows: self.stat_windows[i].relocate(x, y) else: self.stat_windows[i] = Stat_Window(game = config.supported_games[self.poker_game], @@ -230,7 +237,7 @@ class Hud: for i in range(0, config.supported_games[self.poker_game].rows + 1): row_list = [''] * config.supported_games[self.poker_game].cols self.stats.append(row_list) - for stat in config.supported_games[self.poker_game].stats.keys(): + for stat in config.supported_games[self.poker_game].stats: self.stats[config.supported_games[self.poker_game].stats[stat].row] \ [config.supported_games[self.poker_game].stats[stat].col] = \ config.supported_games[self.poker_game].stats[stat].stat_name @@ -246,7 +253,7 @@ class Hud: def update(self, hand, config, stat_dict): self.hand = hand # this is the last hand, so it is available later self.update_table_position() - for s in stat_dict.keys(): + for s in stat_dict: try: self.stat_windows[stat_dict[s]['seat']].player_id = stat_dict[s]['player_id'] except: # omg, we have more seats than stat windows .. damn poker sites with incorrect max seating info .. let's force 10 here @@ -267,7 +274,7 @@ class Hud: self.stat_windows[stat_dict[s]['seat']].label[r][c].set_text(statstring) if statstring != "xxx": # is there a way to tell if this particular stat window is visible already, or no? self.stat_windows[stat_dict[s]['seat']].window.show_all() - self.reposition_windows() +# self.reposition_windows() tip = stat_dict[s]['screen_name'] + "\n" + number[5] + "\n" + \ number[3] + ", " + number[4] Stats.do_tip(self.stat_windows[stat_dict[s]['seat']].e_box[r][c], tip) @@ -449,14 +456,14 @@ class Popup_window: # figure out what popup format we're using popup_format = "default" - for stat in stat_window.game.stats.keys(): + for stat in stat_window.game.stats: if stat_window.game.stats[stat].row == row and stat_window.game.stats[stat].col == col: popup_format = stat_window.game.stats[stat].popup break # get the list of stats to be presented from the config stat_list = [] - for w in stat_window.parent.config.popup_windows.keys(): + for w in stat_window.parent.config.popup_windows: if w == popup_format: stat_list = stat_window.parent.config.popup_windows[w].pu_stats break diff --git a/pyfpdb/Tables.py b/pyfpdb/Tables.py index 6d88d079..f345d4ce 100755 --- a/pyfpdb/Tables.py +++ b/pyfpdb/Tables.py @@ -58,15 +58,15 @@ import Configuration class Table_Window: def __init__(self, info = {}): - if info.has_key('number'): self.number = info['number'] - if info.has_key('exe'): self.exe = info['exe'] - if info.has_key('width'): self.width = info['width'] - if info.has_key('height'): self.height = info['height'] - if info.has_key('x'): self.x = info['x'] - if info.has_key('y'): self.y = info['y'] - if info.has_key('site'): self.site = info['site'] - if info.has_key('title'): self.title = info['title'] - if info.has_key('name'): self.name = info['name'] + if 'number' in info: self.number = info['number'] + if 'exe' in info: self.exe = info['exe'] + if 'width' in info: self.width = info['width'] + if 'height' in info: self.height = info['height'] + if 'x' in info: self.x = info['x'] + if 'y' in info: self.y = info['y'] + if 'site' in info: self.site = info['site'] + if 'title' in info: self.title = info['title'] + if 'name' in info: self.name = info['name'] def __str__(self): # __str__ method for testing @@ -225,7 +225,7 @@ def discover_nt_by_name(c, tablename): """Finds poker client window with the given table name.""" titles = {} win32gui.EnumWindows(win_enum_handler, titles) - for hwnd in titles.keys(): + for hwnd in titles: if titles[hwnd].find(tablename) == -1: continue if titles[hwnd].find("History for table:") > -1: continue if titles[hwnd].find("HUD:") > -1: continue @@ -239,7 +239,7 @@ def discover_nt_tournament(c, tour_number, tab_number): titles ={} win32gui.EnumWindows(win_enum_handler, titles) - for hwnd in titles.keys(): + for hwnd in titles: if re.search(search_string, titles[hwnd]): return decode_windows(c, titles[hwnd], hwnd) return None diff --git a/pyfpdb/fpdb.py b/pyfpdb/fpdb.py index 7c442ef0..6e203889 100755 --- a/pyfpdb/fpdb.py +++ b/pyfpdb/fpdb.py @@ -62,7 +62,8 @@ class fpdb: #print "start of add_tab" for i in self.tab_names: #todo: check this is valid if i==new_tab_name: - raise fpdb_simple.FpdbError("duplicate tab_name not permitted") + return # we depend on this to not create duplicate tabs, there's no reason to raise an error here? +# raise fpdb_simple.FpdbError("duplicate tab_name not permitted") self.tabs.append(new_tab) self.tab_names.append(new_tab_name)