diff --git a/.gitignore b/.gitignore index c0a2d75..be1e212 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ winpdb-1.4.6.tar.gz /winpdb-1.4.8.tar.gz -/WINPDB_1_5_0.tar.gz -/winpdb-reborn-2.0.0.1.tar.gz diff --git a/215712d75cf89b0678d563237746be647d5f25e7.patch b/215712d75cf89b0678d563237746be647d5f25e7.patch deleted file mode 100644 index 0ea8d29..0000000 --- a/215712d75cf89b0678d563237746be647d5f25e7.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 215712d75cf89b0678d563237746be647d5f25e7 Mon Sep 17 00:00:00 2001 -From: Philippe F -Date: Tue, 17 Nov 2020 15:16:44 +0100 -Subject: [PATCH] Fixes undefined variable - ---- - rpdb/session_manager.py | 9 +++++++++ - rpdb2.py | 10 ---------- - 2 files changed, 9 insertions(+), 10 deletions(-) - -diff --git a/rpdb/session_manager.py b/rpdb/session_manager.py -index 3d1701a..f9ef51c 100644 ---- a/rpdb/session_manager.py -+++ b/rpdb/session_manager.py -@@ -29,6 +29,15 @@ - - g_fFirewallTest = True - -+RPDBTERM = 'RPDBTERM' -+COLORTERM = 'COLORTERM' -+TERM = 'TERM' -+KDE_PREFIX = 'KDE' -+GNOME_PREFIX = 'GNOME' -+ -+KDE_DEFAULT_TERM_QUERY = "kreadconfig --file kdeglobals --group General --key TerminalApplication --default konsole" -+XTERM = 'xterm' -+RXVT = 'rxvt' - GNOME_DEFAULT_TERM = 'gnome-terminal' - GNOME_DEFAULT_TERM_BEFORE_3_8 = 'gnome-terminal --disable-factory' - GNOME_DEFAULT_TERM_BEFORE_3_8_CHECK_FILE = "/../share/gnome-terminal/profile-manager.ui" #this glade-related file present for only gnome terminal versions 2.24-3.6 -diff --git a/rpdb2.py b/rpdb2.py -index 015cfd9..d970fed 100644 ---- a/rpdb2.py -+++ b/rpdb2.py -@@ -365,16 +365,6 @@ def is_py3k(): - # According to PEP-8: "Use 4 spaces per indentation level." - # - --RPDBTERM = 'RPDBTERM' --COLORTERM = 'COLORTERM' --TERM = 'TERM' --KDE_PREFIX = 'KDE' --GNOME_PREFIX = 'GNOME' -- --KDE_DEFAULT_TERM_QUERY = "kreadconfig --file kdeglobals --group General --key TerminalApplication --default konsole" --XTERM = 'xterm' --RXVT = 'rxvt' -- - FORK_CHILD = 'child' - FORK_PARENT = 'parent' - FORK_MANUAL = 'manual' diff --git a/2a3ca49275ee8461009dbe5a4aefef4b57dec729.patch b/2a3ca49275ee8461009dbe5a4aefef4b57dec729.patch deleted file mode 100644 index ebdea3d..0000000 --- a/2a3ca49275ee8461009dbe5a4aefef4b57dec729.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 2a3ca49275ee8461009dbe5a4aefef4b57dec729 Mon Sep 17 00:00:00 2001 -From: Johannes Wilde -Date: Fri, 21 Feb 2025 15:48:08 +0100 -Subject: [PATCH] Do not print if no file was provided. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The current Python 3.13.2 documentation states [https://docs.python.org/3/library/sys.html#sys.__stderr__]: -"Note: Under some conditions stdin, stdout and stderr as well as the original values __stdin__, __stdout__ and __stderr__ can be None. It is usually the case for Windows GUI apps that aren’t connected to a console and Python apps started with pythonw." - -Using an integrated Python interpreter, I encountered sys.__stderr__ to be None - which prevented me from using rpdb as it crashed when printing debug information in print_debug(). - -In addition I like using a None file-handle to disable output to it. I find this to be pythonic. ---- - rpdb/utils.py | 17 +++++++++-------- - 1 file changed, 9 insertions(+), 8 deletions(-) - -diff --git a/rpdb/utils.py b/rpdb/utils.py -index e20e344..127b187 100644 ---- a/rpdb/utils.py -+++ b/rpdb/utils.py -@@ -123,17 +123,18 @@ def winlower(path): - - - def _print(s, f = sys.stdout, feol = True): -- s = as_unicode(s) -+ if f is not None: -+ s = as_unicode(s) - -- encoding = detect_encoding(f) -+ encoding = detect_encoding(f) - -- s = as_bytes(s, encoding, fstrict = False) -- s = as_string(s, encoding) -+ s = as_bytes(s, encoding, fstrict = False) -+ s = as_string(s, encoding) - -- if feol: -- f.write(s + '\n') -- else: -- f.write(s) -+ if feol: -+ f.write(s + '\n') -+ else: -+ f.write(s) - - - def print_exception(t, v, tb, fForce = False): diff --git a/5c2f5232b95715c5e8efbd155dd38c262f5e79d0.patch b/5c2f5232b95715c5e8efbd155dd38c262f5e79d0.patch deleted file mode 100644 index cd59029..0000000 --- a/5c2f5232b95715c5e8efbd155dd38c262f5e79d0.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 5c2f5232b95715c5e8efbd155dd38c262f5e79d0 Mon Sep 17 00:00:00 2001 -From: Philippe F -Date: Tue, 17 Nov 2020 15:11:06 +0100 -Subject: [PATCH] Do not use deprecated function - ---- - winpdb.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/winpdb.py b/winpdb.py -index 1e27f88..18d0988 100644 ---- a/winpdb.py -+++ b/winpdb.py -@@ -4178,7 +4178,7 @@ def init2(self): - return - - pwd_dialog = CPwdDialog(self, pwd) -- pos = self.GetPositionTuple() -+ pos = self.GetPosition() - pwd_dialog.SetPosition((pos[0] + 50, pos[1] + 50)) - r = pwd_dialog.ShowModal() - if r != wx.ID_OK: diff --git a/613e4532d93b728bef7b2c8e529a431bbe6ecc19.patch b/613e4532d93b728bef7b2c8e529a431bbe6ecc19.patch deleted file mode 100644 index 4abc238..0000000 --- a/613e4532d93b728bef7b2c8e529a431bbe6ecc19.patch +++ /dev/null @@ -1,347 +0,0 @@ -From 613e4532d93b728bef7b2c8e529a431bbe6ecc19 Mon Sep 17 00:00:00 2001 -From: Philippe F -Date: Wed, 18 Nov 2020 09:45:24 +0100 -Subject: [PATCH] Fix small typos - ---- - rpdb/breakinfo.py | 1 + - rpdb/const.py | 2 -- - rpdb/crypto.py | 5 +++++ - rpdb/debugee.py | 2 +- - rpdb/events.py | 4 ++-- - rpdb/firewall_test.py | 6 ++--- - rpdb/rpc.py | 4 +++- - rpdb/session_manager.py | 50 ++++++++++++++++++++++++++++------------- - rpdb/utils.py | 2 +- - rpdb2.py | 25 --------------------- - 10 files changed, 50 insertions(+), 51 deletions(-) - -diff --git a/rpdb/breakinfo.py b/rpdb/breakinfo.py -index 7eddb90..58a0fa1 100644 ---- a/rpdb/breakinfo.py -+++ b/rpdb/breakinfo.py -@@ -24,6 +24,7 @@ def CalcScopeLine(self, lineno): - rvl = copy.copy(self.m_valid_lines) - rvl.reverse() - -+ l = '' - for l in rvl: - if lineno >= l: - break -diff --git a/rpdb/const.py b/rpdb/const.py -index 9c01d86..3407af8 100644 ---- a/rpdb/const.py -+++ b/rpdb/const.py -@@ -22,8 +22,6 @@ - """ - - --import os -- - COPYRIGHT_NOTICE = """Copyright (C) 2013-2017 Philippe Fremy, 2005-2009 Nir Aides""" - CREDITS_NOTICE = """Work on version 1.4.8 was sponsored by Investortools, Inc.""" - LICENSE_NOTICE = """ -diff --git a/rpdb/crypto.py b/rpdb/crypto.py -index 65c36ec..8482ae5 100644 ---- a/rpdb/crypto.py -+++ b/rpdb/crypto.py -@@ -5,6 +5,11 @@ - import time - import zlib - -+try: -+ from Crypto.Cipher import DES -+except ImportError: -+ pass -+ - from rpdb.compat import _md5, base64_encodestring, base64_decodestring - from rpdb.exceptions import EncryptionExpected, EncryptionNotSupported, DecryptionFailure, AuthenticationFailure, \ - AuthenticationBadData, AuthenticationBadIndex -diff --git a/rpdb/debugee.py b/rpdb/debugee.py -index 1105257..683e810 100644 ---- a/rpdb/debugee.py -+++ b/rpdb/debugee.py -@@ -193,7 +193,7 @@ def __StartXMLRPCServer(self): - - while True: - try: -- server = CXMLRPCServer((host, port), logRequests = 0) -+ server = CXMLRPCServer((host, port), logRequests = False) - return (port, server) - - except socket.error: -diff --git a/rpdb/events.py b/rpdb/events.py -index dcef346..6adeb7d 100644 ---- a/rpdb/events.py -+++ b/rpdb/events.py -@@ -305,10 +305,10 @@ class CEventBreakpoint(CEvent): - REMOVE = as_unicode('remove') - SET = as_unicode('set') - -- def __init__(self, bp, action = SET, id_list = [], fAll = False): -+ def __init__(self, bp, action = SET, id_list = None, fAll = False): - self.m_bp = breakpoint_copy(bp) - self.m_action = action -- self.m_id_list = id_list -+ self.m_id_list = id_list or [] - self.m_fAll = fAll - - -diff --git a/rpdb/firewall_test.py b/rpdb/firewall_test.py -index 49ff48b..96c5476 100644 ---- a/rpdb/firewall_test.py -+++ b/rpdb/firewall_test.py -@@ -97,7 +97,7 @@ def __client(self): - s.connect((LOOPBACK, CFirewallTest.m_port)) - - s.send(as_bytes('Hello, world')) -- data = self.__recv(s, 1024) -+ _data = self.__recv(s, 1024) - self.m_result = True - - except socket.error: -@@ -140,9 +140,9 @@ def __server(self): - - CFirewallTest.m_port = port - -+ conn = None - try: - try: -- conn = None - s.listen(1) - conn, addr = s.accept() - -@@ -163,7 +163,7 @@ def __server(self): - s.close() - - -- def __recv(self, s, len): -+ def __recv(self, s, _len): - t0 = time.time() - - while True: -diff --git a/rpdb/rpc.py b/rpdb/rpc.py -index 2576e13..eed5406 100644 ---- a/rpdb/rpc.py -+++ b/rpdb/rpc.py -@@ -196,7 +196,7 @@ def __marshaled_dispatch(self, data, dispatch_method = None): - response = self._dispatch(method, params) - # wrap response in a singleton tuple - response = (response,) -- response = xmlrpclib.dumps(response, methodresponse=1) -+ response = xmlrpclib.dumps(response, methodresponse=True) - except xmlrpclib.Fault: - fault = sys.exc_info()[1] - response = xmlrpclib.dumps(fault) -@@ -279,11 +279,13 @@ def __request(self, name, params): - - except AuthenticationBadIndex: - e = sys.exc_info()[1] -+ print_debug("Caught AuthenticationBadIndex: %s" % str(e)) - self.m_crypto.set_index(e.m_max_index, e.m_anchor) - continue - - except xmlrpclib.Fault: - fault = sys.exc_info()[1] -+ print_debug("Caught xmlrpclib.Fault: %s" % fault.faultString) - if class_name(BadVersion) in fault.faultString: - s = fault.faultString.split("'") - version = ['', s[1]][len(s) > 0] -diff --git a/rpdb/session_manager.py b/rpdb/session_manager.py -index f9ef51c..cfba37f 100644 ---- a/rpdb/session_manager.py -+++ b/rpdb/session_manager.py -@@ -8,19 +8,17 @@ - import tempfile - import threading - import time --import sys -+import stat - - from rpdb.breakpoint import CBreakPointsManagerProxy - from rpdb.const import * --from rpdb.const import POSIX, RPDB_BPL_FOLDER, BREAKPOINTS_FILE_EXT, RPDB_BPL_FOLDER_NT, LOCALHOST, LOOPBACK - from rpdb.compat import base64_encodestring, _md5 - from rpdb.events import * - from rpdb.exceptions import * --from rpdb.exceptions import CException, CConnectionException, NotAttached - from rpdb.globals import g_fDefaultStd, g_fScreen, g_fDebug, g_found_unicode_files - from rpdb.utils import as_unicode, _print, print_debug, is_unicode, as_bytes, ENCODING_AUTO, detect_locale, as_string, \ - get_python_executable, print_debug_exception, print_exception, generate_rid, split_command_line_path_filename_args, \ -- my_os_path_join, FindFile, g_safe_base64_to, getcwdu, calcURL, generate_random_char -+ my_os_path_join, FindFile, g_safe_base64_to, getcwdu, calcURL, generate_random_char, myisfile - from rpdb.state_manager import CStateManager - from rpdb.firewall_test import CFirewallTest - from rpdb.crypto import CCrypto -@@ -154,12 +152,12 @@ def set_printer(self, printer): - return self.__smi.set_printer(printer) - - -- def report_exception(self, type, value, tb): -+ def report_exception(self, etype, value, tb): - """ - Sends exception information to the printer. - """ - -- return self.__smi.report_exception(type, value, tb) -+ return self.__smi.report_exception(etype, value, tb) - - - def register_callback(self, callback, event_type_dict, fSingleUse): -@@ -920,11 +918,11 @@ def script_terminated_callback(self): - # Private Methods - # - -- def __unhandled_exception(self, event): -+ def __unhandled_exception(self, _event): - self.unhandled_exception_callback() - - -- def __termination_callback(self, event): -+ def __termination_callback(self, _event): - self.script_terminated_callback() - - -@@ -961,7 +959,7 @@ def __state_calback(self, event): - - e = s[-1] - -- function_name = e[2] -+ _function_name = e[2] - filename = os.path.basename(e[0]) - - if filename != DEBUGGER_FILENAME: -@@ -1099,10 +1097,9 @@ def __wait_for_debuggee(self, rid): - time.sleep(STARTUP_TIMEOUT / 2) - - for i in range(STARTUP_RETRIES): -+ print_debug('Scanning for debuggee...') -+ t0 = time.time() - try: -- print_debug('Scanning for debuggee...') -- -- t0 = time.time() - return self.m_server_list_object.calcList(self.m_rpdb2_pwd, self.m_rid, rid) - - except UnknownServer: -@@ -1226,7 +1223,7 @@ def _spawn_server(self, fchdir, ExpandedFilename, args, rid, interpreter): - try: - import terminalcommand - name = MAC -- except: -+ except ImportError: - name = os.name - - if name == 'nt' and g_fDebug: -@@ -1523,7 +1520,7 @@ def on_event_signal_exception(self, event): - self.m_printer(STR_SIGNAL_EXCEPTION % (event.m_description, event.m_signame, event.m_signum)) - - -- def on_event_embedded_sync(self, event): -+ def on_event_embedded_sync(self, _event): - # - # time.sleep() allows pending break requests to go through... - # -@@ -1531,7 +1528,7 @@ def on_event_embedded_sync(self, event): - self.getSession().getProxy().embedded_sync() - - -- def on_event_exit(self, event): -+ def on_event_exit(self, _event): - self.m_printer(STR_DEBUGGEE_TERMINATED) - threading.Thread(target = self.detach_job).start() - -@@ -2402,7 +2399,7 @@ def CalcTerminalCommand(): - return term - - if IsPrefixInEnviron(KDE_PREFIX): -- (s, term) = commands.getstatusoutput(KDE_DEFAULT_TERM_QUERY) -+ (s, term) = subprocess.getstatusoutput(KDE_DEFAULT_TERM_QUERY) - if (s == 0) and IsFileInPath(term): - return term - -@@ -2531,6 +2528,27 @@ def cleanup_bpl_folder(path): - pass - - -+def IsFileInPath(filename): -+ if filename == '': -+ return False -+ -+ try: -+ FindFile(filename) -+ return True -+ -+ except IOError: -+ return False -+ -+ -+def IsPrefixInEnviron(_str): -+ for e in os.environ.keys(): -+ if e.startswith(_str): -+ return True -+ -+ return False -+ -+ -+ - def ControlRate(t_last_call, max_rate): - """ - Limits rate at which this function is called by sleeping. -diff --git a/rpdb/utils.py b/rpdb/utils.py -index ca83607..e20e344 100644 ---- a/rpdb/utils.py -+++ b/rpdb/utils.py -@@ -286,8 +286,8 @@ def safe_wait(lock, timeout = None): - # - - while True: -+ t0 = time.time() - try: -- t0 = time.time() - return lock.wait(timeout) - - except: -diff --git a/rpdb2.py b/rpdb2.py -index d970fed..4bed551 100644 ---- a/rpdb2.py -+++ b/rpdb2.py -@@ -79,11 +79,6 @@ - print(STR_BAD_PYTHON_VERSION) - sys.exit(-1) - --try: -- from Crypto.Cipher import DES --except ImportError: -- pass -- - import xmlrpc.client as xmlrpclib - import _thread as thread - import numbers -@@ -602,26 +597,6 @@ def IsPythonSourceFile(path): - # this is too complicated in Python 3 - - --def IsFileInPath(filename): -- if filename == '': -- return False -- -- try: -- FindFile(filename) -- return True -- -- except IOError: -- return False -- -- -- --def IsPrefixInEnviron(_str): -- for e in os.environ.keys(): -- if e.startswith(_str): -- return True -- -- return False -- - - - def get_file_encoding(filename): diff --git a/d1a4430ac8da69d3a1cd4a848c9135f093b90123.patch b/d1a4430ac8da69d3a1cd4a848c9135f093b90123.patch deleted file mode 100644 index 88aacd6..0000000 --- a/d1a4430ac8da69d3a1cd4a848c9135f093b90123.patch +++ /dev/null @@ -1,22 +0,0 @@ -From d1a4430ac8da69d3a1cd4a848c9135f093b90123 Mon Sep 17 00:00:00 2001 -From: Philippe F -Date: Tue, 17 Nov 2020 15:10:51 +0100 -Subject: [PATCH] Fix typo preventing from launching winpdb debuggee - ---- - rpdb/session_manager.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/rpdb/session_manager.py b/rpdb/session_manager.py -index ca44fef..3d1701a 100644 ---- a/rpdb/session_manager.py -+++ b/rpdb/session_manager.py -@@ -1246,7 +1246,7 @@ def _spawn_server(self, fchdir, ExpandedFilename, args, rid, interpreter): - - # for .pyc files, strip the c - fpath, ext = os.path.splitext(__file__) -- debugger = os.path.join( os.path.basename(fpath), '..', 'rpdb2') + ext -+ debugger = os.path.join( os.path.dirname(fpath), '..', 'rpdb2') + ext - if debugger[-1:] == 'c': - debugger = debugger[:-1] - diff --git a/ed617311de97300c1ce9de9ee6931dc7141cfd93.patch b/ed617311de97300c1ce9de9ee6931dc7141cfd93.patch deleted file mode 100644 index db43b63..0000000 --- a/ed617311de97300c1ce9de9ee6931dc7141cfd93.patch +++ /dev/null @@ -1,24 +0,0 @@ -From ed617311de97300c1ce9de9ee6931dc7141cfd93 Mon Sep 17 00:00:00 2001 -From: Johannes Wilde -Date: Fri, 21 Feb 2025 15:56:16 +0100 -Subject: [PATCH] Do not directly access "private" members, but prefer the - public equivalent. - -[See also: https://stackoverflow.com/questions/74170883/python-sys-stdout-is-equal-to-none-by-default .] ---- - rpdb/utils.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/rpdb/utils.py b/rpdb/utils.py -index 127b187..3a0bb86 100644 ---- a/rpdb/utils.py -+++ b/rpdb/utils.py -@@ -93,7 +93,7 @@ def print_debug(_str): - - str = '%s %s:%d %s %s(): %s' % (s, filename, lineno, threadinfo, name, _str) - -- _print(str, sys.__stderr__) -+ _print(str, sys.stderr) - - - def print_debug_exception(fForce = False): diff --git a/sources b/sources index 68308c3..d2efd48 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (winpdb-reborn-2.0.0.1.tar.gz) = 21e9c35e2c58d8f9a2bb762f3f4e916dbb4fee80cb8c52db6afa6a9eaec03f6dc85d62e1daace8c896b35f0e49cf7c34faefdc478466cb167b286b0301543ddb +e28049cc93c1614b9db20960d76b7ea3 winpdb-1.4.8.tar.gz diff --git a/winpdb-1.4.8-gnome-fix.patch b/winpdb-1.4.8-gnome-fix.patch new file mode 100644 index 0000000..8a64c13 --- /dev/null +++ b/winpdb-1.4.8-gnome-fix.patch @@ -0,0 +1,12 @@ +diff -up winpdb-1.4.8/rpdb2.py.gnomefix winpdb-1.4.8/rpdb2.py +--- winpdb-1.4.8/rpdb2.py.gnomefix 2014-12-04 15:19:38.972288993 -0500 ++++ winpdb-1.4.8/rpdb2.py 2014-12-04 15:19:47.279229223 -0500 +@@ -1780,7 +1780,7 @@ osSpawn = { + NT_DEBUG: 'start "rpdb2 - Version ' + get_version() + ' - Debuggee Console" cmd.exe /K ""%(exec)s" %(options)s"', + POSIX: "%(term)s -e %(shell)s -c '%(exec)s %(options)s; %(shell)s' &", + 'Terminal': "Terminal --disable-server -x %(shell)s -c '%(exec)s %(options)s; %(shell)s' &", +- GNOME_DEFAULT_TERM: "gnome-terminal --disable-factory -x %(shell)s -c '%(exec)s %(options)s; %(shell)s' &", ++ GNOME_DEFAULT_TERM: "gnome-terminal -x %(shell)s -c '%(exec)s %(options)s; %(shell)s' &", + MAC: '%(exec)s %(options)s', + DARWIN: '%(exec)s %(options)s', + SCREEN: 'screen -t debuggee_console %(exec)s %(options)s' diff --git a/winpdb-1.4.8-issue19-fix.patch b/winpdb-1.4.8-issue19-fix.patch new file mode 100644 index 0000000..794c0af --- /dev/null +++ b/winpdb-1.4.8-issue19-fix.patch @@ -0,0 +1,12 @@ +diff -up winpdb-1.4.8/rpdb2.py.issue19 winpdb-1.4.8/rpdb2.py +--- winpdb-1.4.8/rpdb2.py.issue19 2015-04-01 08:47:34.601072072 -0400 ++++ winpdb-1.4.8/rpdb2.py 2015-04-01 08:48:02.336901383 -0400 +@@ -12056,7 +12056,7 @@ class CConsoleInternal(cmd.Cmd, threadin + + + def __parse_bp_arg(self, arg, fAllowExpr = True): +- _args = arg.split(BP_EVAL_SEP) ++ _args = arg.split(BP_EVAL_SEP, 1) + + if (len(_args) > 1) and (not fAllowExpr): + raise BadArgument diff --git a/winpdb-2.0.0.1-no-imp.patch b/winpdb-2.0.0.1-no-imp.patch deleted file mode 100644 index e542e26..0000000 --- a/winpdb-2.0.0.1-no-imp.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff -up winpdb-reborn-2.0.0.1/rpdb2.py.no-imp winpdb-reborn-2.0.0.1/rpdb2.py ---- winpdb-reborn-2.0.0.1/rpdb2.py.no-imp 2025-03-12 14:27:38.797538630 -0400 -+++ winpdb-reborn-2.0.0.1/rpdb2.py 2025-03-12 14:29:17.837196358 -0400 -@@ -72,7 +72,8 @@ import time - import copy - import sys - import cmd --import imp -+import importlib.util -+import importlib.machinery - import os - - if sys.version_info[:2] < (3,2): -@@ -84,6 +85,16 @@ import _thread as thread - import numbers - - -+def load_source(modname, filename): -+ loader = importlib.machinery.SourceFileLoader(modname, filename) -+ spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) -+ module = importlib.util.module_from_spec(spec) -+ # The module is always executed and not cached in sys.modules. -+ # Uncomment the following line to cache the module. -+ # sys.modules[module.__name__] = module -+ loader.exec_module(module) -+ return module -+ - # - #-------------------------------- Design Notes ------------------------------- - # -@@ -6768,7 +6779,7 @@ def StartServer(args, fchdir, _rpdb2_pwd - # there was a problem loading the debugged script. - # - -- imp.load_source('__main__', _path) -+ load_source('__main__', _path) - - - diff --git a/winpdb-2.0.0dev5.patch b/winpdb-2.0.0dev5.patch deleted file mode 100644 index 825d683..0000000 --- a/winpdb-2.0.0dev5.patch +++ /dev/null @@ -1,1338 +0,0 @@ -diff -up winpdb-WINPDB_1_5_0/setup.py.dev5 winpdb-WINPDB_1_5_0/setup.py ---- winpdb-WINPDB_1_5_0/setup.py.dev5 2018-03-30 08:34:07.000000000 -0400 -+++ winpdb-WINPDB_1_5_0/setup.py 2019-08-15 13:48:27.575840068 -0400 -@@ -25,15 +25,17 @@ - - from setuptools import setup - --import os -+import os, re - - # strip out build status - LONG_DESC = ''.join( open('README.rst').readlines()[1:-8] ) - -+WINPDB_VERSION = re.search( r'WINPDB_VERSION\s*=\s*"(.*)"', open('winpdb.py').read() ).group(1).replace('-alpha', 'a') -+print( 'Packaging winpdb version: "%s"' % WINPDB_VERSION ) - - setup( - name = 'winpdb-reborn', -- version = '1.5.0', -+ version = WINPDB_VERSION, - description = 'A platform independent GPL Python debugger.', - long_description = LONG_DESC, - author = 'Philippe Fremy, Nir Aides', -@@ -45,7 +47,9 @@ setup( - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta -- 'Development Status :: 5 - Production/Stable', -+ # 5 - Production/Stable', -+ 'Development Status :: 3 - Alpha', -+ # 'Development Status :: 5 - Production/Stable', - - # Runs in different environments - 'Environment :: Console', -@@ -62,7 +66,7 @@ setup( - 'Operating System :: POSIX', - - # This version is for python 2 only -- 'Programming Language :: Python :: 2 :: Only', -+ 'Programming Language :: Python :: 3 :: Only', - - - 'Topic :: Software Development :: Debuggers', -@@ -83,7 +87,8 @@ setup( - 'Tracker': 'https://github.com/bluebird75/winpdb/issues', - }, - -- python_requires='>=2.6, <3', -+ python_requires='>=3.4', -+ install_requires='wxpython>=4', - py_modules = ['winpdb', 'rpdb2'], - - entry_points={ -diff -up winpdb-WINPDB_1_5_0/winpdb.py.dev5 winpdb-WINPDB_1_5_0/winpdb.py ---- winpdb-WINPDB_1_5_0/winpdb.py.dev5 2018-03-30 08:34:07.000000000 -0400 -+++ winpdb-WINPDB_1_5_0/winpdb.py 2019-08-15 13:48:24.183909002 -0400 -@@ -1,4 +1,5 @@ - #! /usr/bin/env python -+# -*- coding: utf-8 -*- - - """ - winpdb.py -@@ -23,7 +24,12 @@ - 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA - """ - --ABOUT_NOTICE = """*Winpdb Reborn* 1.5 is a platform independent lightweight -+VERSION = (2, 0, 0, 5, 'Tychod') -+WINPDB_VERSION = "2.0.0.dev5" -+WINPDB_TITLE = "Winpdb Reborn %s" % WINPDB_VERSION -+RPDB2_EXPECTED_VERSION = 'RPDB_1_5_0' -+ -+ABOUT_NOTICE = """*Winpdb Reborn* %s is a platform independent lightweight - standalone graphical debugger for Python 2 and 3. It supports - conditional breakpoints, multi-threaded debugging, smart - handling of forks, remote debugging and more. -@@ -43,7 +49,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICU - See the GNU General Public License for more details. - - Credits: --Work on version 1.4.8 was sponsored by Investortools, Inc.""" -+Work on version 1.4.8 was sponsored by Investortools, Inc.""" % WINPDB_VERSION - - LICENSE_NOTICE = """ - This program is free software; you can redistribute it and/or modify it -@@ -279,15 +285,15 @@ END OF TERMS AND CONDITIONS - - import sys - --WXVER_PYTHON2 = "3" --WXVER_PYTHON3 = "4" -+# Winpdb Works only with WxPython 4, compatible with python 3.4+ -+MIN_WXVER = "4.0.0" - - STR_BAD_PYTHON_ERROR_TITLE = 'Winpdb Error' - STR_BAD_PYTHON_ERROR_MSG = """Unsupported Python version - Winpdb does not run with this version of Python. You need --Python 2.6 or 2.7 with WxPython 3 from sourceforge to run Winpdb. -+Python 2.6 or above with at least WxPython 3 to run Winpdb. - --To debug a program written for PyPy, launch -+To debug a program written for PyPy or Python 3.x , launch - Winpdb with Python 2 and select the interpreter to use in - the launch dialog. - -@@ -296,12 +302,9 @@ of Python.""" - - STR_WXPYTHON_ERROR_TITLE = 'Winpdb Error' - STR_WXPYTHON_ERROR_MSG = """wxPython was not found. --wxPython 3 is required to run the winpdb GUI. --Download it from sourceforge: https://sourceforge.net/projects/wxpython/files/wxPython/ -- --Note that wxPython 4 only support Python 3 and above. There is a dedicated version --of winpdb-reborn for Python 3 and wxPython 4. -- -+wxPython 4.0 or higher is required to run the Winpdb GUI. -+wxPython is the graphical user interface toolkit used by Winpdb. -+You can find more information on wxPython at http://www.wxpython.org/ - To use the debugger without a GUI, run rpdb2.""" - - STR_X_ERROR_MSG = """It was not possible to start Winpdb. -@@ -336,38 +339,30 @@ def myErrorMsgDialog(title, msg): - RUNNING_UNDER_PY2 = (sys.version_info[0] == 2) - RUNNING_UNDER_PY3 = (sys.version_info[0] == 3) - --if platform.python_implementation() != 'CPython' or RUNNING_UNDER_PY3: -+if RUNNING_UNDER_PY2 == RUNNING_UNDER_PY3: -+ # Houston, we have a problem! -+ raise ValueError('XXX') -+ -+if platform.python_implementation() != 'CPython': - # Only CPython 2.x and 3.x supported - myErrorMsgDialog( STR_BAD_PYTHON_ERROR_TITLE, STR_BAD_PYTHON_ERROR_MSG ) - sys.exit(1) - - --if RUNNING_UNDER_PY2: -- if 'wx' not in sys.modules and 'wxPython' not in sys.modules: -- # multi-install of Wx, correct version must be selected with wxversion -- try: -- import wxversion -- except ImportError: -- rpdb2._print(STR_WXPYTHON_ERROR_MSG, sys.__stderr__) -- myErrorMsgDialog( STR_WXPYTHON_ERROR_TITLE, STR_WXPYTHON_ERROR_MSG ) -- sys.exit(1) -- -- global WXVER -- if RUNNING_UNDER_PY2: -- WXVER = WXVER_PYTHON2 -- else: -- WXVER = WXVER_PYTHON3 -- wxversion.ensureMinimal(WXVER) --else: -- myErrorMsgDialog( STR_BAD_PYTHON_ERROR_TITLE, STR_BAD_PYTHON_ERROR_MSG ) -+try: -+ import wx -+except ImportError: -+ rpdb2._print(STR_WXPYTHON_ERROR_MSG, sys.__stderr__) -+ myErrorMsgDialog( STR_WXPYTHON_ERROR_TITLE, STR_WXPYTHON_ERROR_MSG ) - sys.exit(1) - --import wx -- --assert wx.VERSION_STRING >= WXVER -+assert wx.VERSION_STRING >= MIN_WXVER - - import wx.lib.wxpTag --import wx.gizmos as wx_dataview_or_gizmos -+if RUNNING_UNDER_PY3: -+ import wx.dataview as wx_dataview_or_gizmos -+else: -+ import wx.gizmos as wx_dataview_or_gizmos - - import wx.html - -@@ -378,8 +373,12 @@ import wx.stc as stc - - import webbrowser - import traceback --from cStringIO import StringIO --import Queue -+if RUNNING_UNDER_PY2: -+ from cStringIO import StringIO -+ from Queue import Queue -+else: -+ from io import StringIO -+ from queue import Queue - - import threading - import tempfile -@@ -543,10 +542,6 @@ TLC_HEADER_NAME = "Name" - TLC_HEADER_REPR = "Repr" - TLC_HEADER_TYPE = "Type" - --VERSION = (1, 5, 0, 0, 'Tychod') --WINPDB_TITLE = "Winpdb Reborn 1.5.0" --WINPDB_VERSION = "WINPDB_REBORN_1_5_0" -- - WINPDB_SIZE = "winpdb_size" - WINPDB_MAXIMIZE = "winpdb_maximize" - SPLITTER_1_POS = "splitter_1_pos" -@@ -568,7 +563,14 @@ WINPDB_SETTINGS_DEFAULT = { - } - - AC_CHAR = "\t" --AC_EXIT = "Alt-X" -+AC_PWD = "Ctrl-P" -+AC_LAUNCH = "Ctrl-L" -+AC_ATTACH = "Ctrl-A" -+AC_DETACH = "Ctrl-D" -+AC_STOP = "Ctrl-S" -+AC_RESTART = "Ctrl-R" -+AC_OPEN = "Ctrl-O" -+AC_EXIT = "Ctrl-Q" - AC_ANALYZE = "F3" - AC_BREAK = "F4" - AC_GO = "F5" -@@ -583,13 +585,13 @@ ML_SEPARATOR = "" - ML_ROOT = "" - - ML_FILE = "&File" --ML_PWD = "&Password" --ML_LAUNCH = "&Launch" --ML_ATTACH = "&Attach" --ML_DETACH = "&Detach" --ML_STOP = "&Stop" --ML_RESTART = "&Restart" --ML_OPEN = "&Open Source" -+ML_PWD = "&Password" + AC_CHAR + AC_PWD -+ML_LAUNCH = "&Launch" + AC_CHAR + AC_LAUNCH -+ML_ATTACH = "&Attach" + AC_CHAR + AC_ATTACH -+ML_DETACH = "&Detach" + AC_CHAR + AC_DETACH -+ML_STOP = "&Stop" + AC_CHAR + AC_STOP -+ML_RESTART = "&Restart" + AC_CHAR + AC_RESTART -+ML_OPEN = "&Open Source" + AC_CHAR + AC_OPEN - ML_EXIT = "E&xit" + AC_CHAR + AC_EXIT - - ML_BREAKPOINTS = "&Breakpoints" -@@ -758,7 +760,7 @@ ABOUT_HTML_SUFFIX = """ - - WEBSITE_URL = "https://github.com/bluebird75/winpdb" - SUPPORT_URL = "https://github.com/bluebird75/winpdb/issues" --DOCS_URL = "http://www.winpdb.org/?page_id=5" -+DOCS_URL = "http://www.winpdb.org/?page_id=5" - EXT_DOCS_URL = "http://www.winpdb.org/?page_id=17" - UPDATES_URL = "https://github.com/bluebird75/winpdb" - -@@ -833,13 +835,13 @@ def open_new(url): - webbrowser.open_new(url) - - -+from io import BytesIO - - def image_from_base64(str_b64): - b = rpdb2.as_bytes(str_b64) -- s = base64.decodestring(b) -- stream = StringIO(s) -- image = wx.ImageFromStream(stream) -- -+ s = base64.decodebytes(b) -+ stream = BytesIO(s) -+ image = wx.Image(stream) - return image - - -@@ -915,8 +917,8 @@ class CMenuBar: - self.m_cascades = {} - - def init_menubar(self, resource): -- if 'wxMac' in wx.PlatformInfo: -- wx.MenuBar.SetAutoWindowMenu(False) -+ # if 'wxMac' in wx.PlatformInfo: -+ # wx.MenuBar.SetAutoWindowMenu(False) - - self.m_menubar = wx.MenuBar() - -@@ -936,7 +938,7 @@ class CMenuBar: - if parent_label == ML_ROOT: - parent.Append(child, e) - else: -- parent.AppendMenu(wx.NewId(), e, child) -+ parent.AppendMenu(wx.ID_ANY, e, child) - self.m_encapsulating_menu_items[e] = parent - - self.m_cascades[e] = child -@@ -976,7 +978,7 @@ class CMenuBar: - - def add_menu_item(self, menu_label, item_label, command): - if not g_fUnicode: -- item_label = rpdb2.as_string(item_label, wx.GetDefaultPyEncoding()) -+ item_label = rpdb2.as_string(item_label) - - parent = self.m_cascades[menu_label] - item = parent.Append(-1, item_label) -@@ -987,7 +989,7 @@ class CMenuBar: - - while parent.GetMenuItemCount() > 0: - i = parent.FindItemByPosition(0) -- parent.DeleteItem(i) -+ parent.DestroyItem(i) - - - -@@ -1009,30 +1011,32 @@ class CToolBar: - continue - - command = e[COMMAND] -- id = wx.NewId() -+ id = wx.Window.NewControlId() - - if TEXT in e: - button = wx.Button(self.m_toolbar, id, e[TEXT], style = wx.NO_BORDER) -- button.SetToolTipString(item_label) -+ button.SetToolTip(item_label) - self.m_toolbar.AddControl(button) - self.m_items[item_label] = {ID: id} -- wx.EVT_BUTTON(self.m_toolbar, id, command) -+ # wx.EVT_BUTTON(self.m_toolbar, id, command) -+ self.Bind( wx.EVT_BUTTON, command, id = id) - continue - - if DATA in e: - image = image_from_base64(e[DATA]) -- bitmap = wx.BitmapFromImage(image) -+ bitmap = wx.Bitmap(image) - - if DATA2 in e: - image2 = image_from_base64(e[DATA2]) -- bitmap2 = wx.BitmapFromImage(image2) -- self.m_toolbar.AddSimpleTool(id, bitmap, item_label, isToggle = True) -+ bitmap2 = wx.Bitmap(image2) -+ self.m_toolbar.AddTool(id, '', bitmap, wx.NullBitmap, wx.ITEM_CHECK, item_label, '' ) -+ - self.m_items[item_label] = {ID: id, DATA: bitmap, DATA2: bitmap2} - self.Bind(wx.EVT_TOOL, command, id = id) - self.Bind(wx.EVT_TOOL, self.OnToggleTool, id = id) - - else: -- self.m_toolbar.AddSimpleTool(id, bitmap, item_label) -+ self.m_toolbar.AddTool(id, '', bitmap, wx.NullBitmap, wx.ITEM_NORMAL, item_label ) - self.m_items[item_label] = {ID: id} - self.Bind(wx.EVT_TOOL, command, id = id) - -@@ -1123,7 +1127,7 @@ class CStatusBar: - self.m_formats = [e.get(FORMAT, "") for e in resource] - self.m_keys = [e.get(KEYS, []) for e in resource] - -- self.m_statusbar = self.CreateStatusBar(1, wx.ST_SIZEGRIP) -+ self.m_statusbar = self.CreateStatusBar(1, wx.STB_SIZEGRIP) - self.m_statusbar.SetFieldsCount(len(self.m_widths)) - self.m_statusbar.SetStatusWidths(self.m_widths) - -@@ -1150,7 +1154,7 @@ class CStatusBar: - return - - image = image_from_base64(data) -- bitmap = wx.BitmapFromImage(image) -+ bitmap = wx.Bitmap(image) - p = wx.Panel(self.m_statusbar) - sb = wx.StaticBitmap(p, -1, bitmap) - -@@ -1161,7 +1165,7 @@ class CStatusBar: - self.m_bitmaps[i][0].Hide() - else: - image = image_from_base64(data) -- bitmap = wx.BitmapFromImage(image) -+ bitmap = wx.Bitmap(image) - - self.m_bitmaps[i][1].SetBitmap(bitmap) - self.m_bitmaps[i][0].Show() -@@ -1175,8 +1179,8 @@ class CStatusBar: - p.SetPosition((rect.x + 2, rect.y + 2)) - s = sb.GetSize() - sb.SetSize((s[0], rect.height - 4)) -- sb.SetToolTipString(tooltip) -- p.SetToolTipString(tooltip) -+ sb.SetToolTip(tooltip) -+ p.SetToolTip(tooltip) - p.SetClientSize(sb.GetSize()) - - self.sizeChanged = False -@@ -1266,7 +1270,7 @@ class CJobs: - - - def set_cursor(self, id): -- cursor = wx.StockCursor(id) -+ cursor = wx.Cursor(id) - self.SetCursor(cursor) - - -@@ -1379,19 +1383,16 @@ class CWinpdbWindow(wx.Frame, CMainWindo - self.SetLayoutDirection(1) - - image = image_from_base64(BASE64_ICON_16) -- bitmap = wx.BitmapFromImage(image) -- icon16 = wx.EmptyIcon() -- icon16.CopyFromBitmap(bitmap) -+ bitmap = wx.Bitmap(image) -+ icon16 = wx.Icon(bitmap) - - image = image_from_base64(BASE64_ICON_32) -- bitmap = wx.BitmapFromImage(image) -- icon32 = wx.EmptyIcon() -- icon32.CopyFromBitmap(bitmap) -+ bitmap = wx.Bitmap(image) -+ icon32 = wx.Icon(bitmap) - - image = image_from_base64(BASE64_ICON_64) -- bitmap = wx.BitmapFromImage(image) -- icon64 = wx.EmptyIcon() -- icon64.CopyFromBitmap(bitmap) -+ bitmap = wx.Bitmap(image) -+ icon64 = wx.Icon(bitmap) - - ibundle = wx.IconBundle() - ibundle.AddIcon(icon16) -@@ -1522,7 +1523,7 @@ class CWinpdbWindow(wx.Frame, CMainWindo - - self.m_code_viewer = CCodeViewer(self.m_splitterh3, style = wx.NO_BORDER | wx.TAB_TRAVERSAL, session_manager = self.m_session_manager, source_manager = self.m_source_manager, notify_filename = self.do_notify_filename) - -- self.m_console = CConsole(self.m_splitterh3, style = wx.NO_BORDER | wx.TAB_TRAVERSAL, session_manager = self.m_session_manager, exit_command = self.do_exit) -+ self.m_console = CConsole(self.m_splitterh3, style = wx.NO_BORDER | wx.TAB_TRAVERSAL, session_manager = self.m_session_manager, exit_command = self.do_exit, name = 'console') - - self.m_splitterh2.SplitHorizontally(self.m_namespace_viewer, self.m_threads_viewer) - self.m_splitterh1.SplitHorizontally(self.m_splitterh2, self.m_stack_viewer) -@@ -1680,7 +1681,7 @@ class CWinpdbWindow(wx.Frame, CMainWindo - # - - def OnFrameSelected(self, event): -- self.m_async_sm.set_frame_index(event.m_itemIndex) -+ self.m_async_sm.set_frame_index(event.Index) - - - def update_frame(self, event): -@@ -1697,11 +1698,17 @@ class CWinpdbWindow(wx.Frame, CMainWindo - # - - def update_stack(self, event): -+ '''Arguments: -+ - event: a CEventStack, containing a list of thread debugging states -+ ''' - self.m_stack = event.m_stack - wx.CallAfter(self.do_update_stack, event.m_stack) - - - def do_update_stack(self, _stack): -+ '''Arguments: -+ _stack: list of thread debugging states -+ ''' - self.m_stack = _stack - - self.m_stack_viewer.update_stack_list(self.m_stack) -@@ -1812,7 +1819,7 @@ class CWinpdbWindow(wx.Frame, CMainWindo - def notify_conflicting_modules(self, event): - s = ', '.join(event.m_modules_list) - if not g_fUnicode: -- s = rpdb2.as_string(s, wx.GetDefaultPyEncoding()) -+ s = rpdb2.as_string(s) - - dlg = wx.MessageDialog(self, rpdb2.STR_CONFLICTING_MODULES % s, MSG_WARNING_TITLE, wx.OK | wx.ICON_WARNING) - dlg.ShowModal() -@@ -1883,7 +1890,7 @@ class CWinpdbWindow(wx.Frame, CMainWindo - - - def set_cursor(self, id): -- cursor = wx.StockCursor(id) -+ cursor = wx.Cursor(id) - self.SetCursor(cursor) - self.m_code_viewer.set_cursor(id) - self.m_threads_viewer.set_cursor(id) -@@ -2269,7 +2276,7 @@ class CWinpdbApp(wx.App): - - def OnExit(self): - self.m_settings.save_settings() -- -+ return super().OnExit() - - - class CCaption(wx.Panel): -@@ -2278,8 +2285,8 @@ class CCaption(wx.Panel): - - wx.Panel.__init__(self, *args, **kwargs) - -- self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_INACTIVECAPTION)) -- self.SetForegroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_CAPTIONTEXT)) -+ self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_INACTIVECAPTION)) -+ self.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_CAPTIONTEXT)) - - sizerv = wx.BoxSizer(wx.VERTICAL) - -@@ -2287,7 +2294,7 @@ class CCaption(wx.Panel): - sizerv.Add(self.m_static_text, 0, wx.EXPAND | wx.ALL, 2) - - font = self.m_static_text.GetFont() -- new_font = wx.Font(pointSize = font.GetPointSize(), family = font.GetFamily(), style = font.GetStyle(), weight = wx.BOLD, face = font.GetFaceName()) -+ new_font = wx.Font(font.GetPointSize(), font.GetFamily(), font.GetStyle(), wx.BOLD, font.GetUnderlined(), font.GetFaceName()) - self.m_static_text.SetFont(new_font) - - self.SetSizer(sizerv) -@@ -2305,7 +2312,7 @@ class CCaptionManager: - def OnGainFocus(self, event): - self.m_n_focus += 1 - -- self.m_caption.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION)) -+ self.m_caption.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION)) - self.m_caption.Refresh() - event.Skip() - -@@ -2317,11 +2324,9 @@ class CCaptionManager: - # - # Event may get sent after the object has been deleted. - # -- try: -- self.m_caption.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_INACTIVECAPTION)) -+ if self.m_caption: -+ self.m_caption.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_INACTIVECAPTION)) - self.m_caption.Refresh() -- except wx.PyDeadObjectError: -- pass - - event.Skip() - -@@ -2445,6 +2450,20 @@ class CStyledViewer(stc.StyledTextCtrl): - self.GetParent().GetEventHandler().ProcessEvent(ne) - event.Skip() - return -+ elif key_code == 74: # J -+ (_, col_no, line_no) = self.PositionToXY(self.GetInsertionPoint()) -+ console = wx.FindWindowByName('console') -+ value = rpdb2.as_unicode('jump %s' % (line_no + 1)) -+ console.m_queue.put(value + '\n') -+ elif key_code == 86: # V -+ value = self.GetSelectedText() -+ if value: -+ value = 'eval ' + value -+ console = wx.FindWindowByName('console') -+ console.m_console_out.AppendText(CONSOLE_PROMPT + value + '\n') -+ # console.set_history(value) -+ value = rpdb2.as_unicode(value) -+ console.m_queue.put(value + '\n') - - event.Skip() - -@@ -2513,9 +2532,9 @@ class CSourceManager: - _time = 0 - _filename = r[rpdb2.DICT_KEY_FILENAME] - source_lines = r[rpdb2.DICT_KEY_LINES] -- source = string.join(source_lines, '') -+ source = ''.join(source_lines) - if not g_fUnicode: -- source = rpdb2.as_string(source, wx.GetDefaultPyEncoding()) -+ source = rpdb2.as_string(source) - - elif t == rpdb2.NotPythonSource and fComplain: - dlg = wx.MessageDialog(None, MSG_ERROR_FILE_NOT_PYTHON % (filename, ), MSG_WARNING_TITLE, wx.OK | wx.ICON_WARNING) -@@ -2539,7 +2558,7 @@ class CSourceManager: - _filename = filename - source = STR_FILE_LOAD_ERROR2 % (filename, ) - if not g_fUnicode: -- source = rpdb2.as_string(source, wx.GetDefaultPyEncoding()) -+ source = rpdb2.as_string(source) - - else: - rpdb2.print_debug('get_source_file() returned the following error: %s' % repr(t)) -@@ -2548,7 +2567,7 @@ class CSourceManager: - _filename = filename - source = STR_FILE_LOAD_ERROR2 % (filename, ) - if not g_fUnicode: -- source = rpdb2.as_string(source, wx.GetDefaultPyEncoding()) -+ source = rpdb2.as_string(source) - - try: - self.m_lock.acquire() -@@ -2796,7 +2815,7 @@ class CCodeViewer(wx.Panel, CJobs, CCapt - - displayed_filename = _filename - if not g_fUnicode: -- displayed_filename = rpdb2.as_string(displayed_filename, wx.GetDefaultPyEncoding()) -+ displayed_filename = rpdb2.as_string(displayed_filename) - - label = CAPTION_SOURCE + ' ' + rpdb2.clip_filename(displayed_filename) - self.m_caption.m_static_text.SetLabel(label) -@@ -2839,7 +2858,7 @@ class CCodeViewer(wx.Panel, CJobs, CCapt - - displayed_filename = filename - if not g_fUnicode: -- displayed_filename = rpdb2.as_string(displayed_filename, wx.GetDefaultPyEncoding()) -+ displayed_filename = rpdb2.as_string(displayed_filename) - - label = CAPTION_SOURCE + ' ' + rpdb2.clip_filename(displayed_filename) - self.m_caption.m_static_text.SetLabel(label) -@@ -2932,7 +2951,7 @@ class CConsole(wx.Panel, CCaptionManager - - self.m_console = rpdb2.CConsole(self.m_session_manager, stdin = self, stdout = self, fSplit = True) - -- self.m_queue = Queue.Queue() -+ self.m_queue = Queue() - - _sizerv = wx.BoxSizer(wx.VERTICAL) - sizerv = wx.BoxSizer(wx.VERTICAL) -@@ -2968,17 +2987,18 @@ class CConsole(wx.Panel, CCaptionManager - def OnConsoleOutKeyPressed(self, event): - key_code = event.GetKeyCode() - -- if key_code != wx.WXK_TAB: -- return -- -- forward = not event.ShiftDown() -- ne = wx.NavigationKeyEvent() -- ne.SetDirection(forward) -- ne.SetCurrentFocus(self.m_console_out) -- ne.SetEventObject(self.m_console_out) -- self.GetEventHandler().ProcessEvent(ne) -+ if key_code == wx.WXK_TAB: -+ forward = not event.ShiftDown() -+ ne = wx.NavigationKeyEvent() -+ ne.SetDirection(forward) -+ ne.SetCurrentFocus(self.m_console_out) -+ ne.SetEventObject(self.m_console_out) -+ self.GetEventHandler().ProcessEvent(ne) - -- event.Skip() -+ event.Skip() -+ -+ elif (key_code == 67) and event.ControlDown(): # Ctrl+C -+ value = self.m_console_out.Copy() - - - def set_focus(self): -@@ -2999,7 +3019,7 @@ class CConsole(wx.Panel, CCaptionManager - face = "Courier" - point_size = font.GetPointSize() - -- new_font = wx.Font(pointSize = point_size, family = font.GetFamily(), style = font.GetStyle(), weight = font.GetWeight(), face = face) -+ new_font = wx.Font(point_size, font.GetFamily(), font.GetStyle(), font.GetWeight(), font.GetUnderlined(), face) - ctrl.SetFont(new_font) - - -@@ -3016,7 +3036,7 @@ class CConsole(wx.Panel, CCaptionManager - - def write(self, _str): - if not g_fUnicode: -- _str = rpdb2.as_string(_str, wx.GetDefaultPyEncoding()) -+ _str = rpdb2.as_string(_str) - else: - _str = rpdb2.as_unicode(_str, self.encoding) - -@@ -3031,7 +3051,7 @@ class CConsole(wx.Panel, CCaptionManager - if len(s) == 0: - break - -- wx.CallAfter(self.m_console_out.write, _str[1:]) -+ wx.CallAfter(self.m_console_out.AppendText, _str[1:]) - - - def flush(self): -@@ -3092,7 +3112,7 @@ class CConsole(wx.Panel, CCaptionManager - return - - if len(completions) > COMPLETIONS_WARNING_THRESHOLD and not fForce: -- self.m_console_out.write(COMPLETIONS_WARNING % len(completions)) -+ self.m_console_out.AppendText(COMPLETIONS_WARNING % len(completions)) - self.m_fcompletions_warning = True - return - -@@ -3122,7 +3142,7 @@ class CConsole(wx.Panel, CCaptionManager - lines = textwrap.wrap(out, 60) - text = '\n'.join(lines) + '\n' - -- self.m_console_out.write(CONSOLE_COMPLETIONS % text) -+ self.m_console_out.AppendText(CONSOLE_COMPLETIONS % text) - - - def OnSendText(self, event): -@@ -3131,14 +3151,14 @@ class CConsole(wx.Panel, CCaptionManager - value = self.m_console_in.GetValue() - self.set_history(value) - -- self.m_console_out.write(CONSOLE_PROMPT + value + '\n') -+ self.m_console_out.AppendText(CONSOLE_PROMPT + value + '\n') - self.m_console_in.Clear() - - if value in ['exit', 'EOF']: - self.m_exit_command() - return - -- value = rpdb2.as_unicode(value, wx.GetDefaultPyEncoding()) -+ value = rpdb2.as_unicode(value) - - self.m_queue.put(value + '\n') - -@@ -3263,7 +3283,7 @@ class CThreadsViewer(wx.Panel, CCaptionM - - - def set_cursor(self, id): -- cursor = wx.StockCursor(id) -+ cursor = wx.Cursor(id) - self.SetCursor(cursor) - self.m_threads.SetCursor(cursor) - -@@ -3293,10 +3313,10 @@ class CThreadsViewer(wx.Panel, CCaptionM - return -1 - - if not g_fUnicode: -- thread_name = rpdb2.as_string(thread_name, wx.GetDefaultPyEncoding()) -+ thread_name = rpdb2.as_string(thread_name) - -- self.m_threads.SetStringItem(index, 1, thread_name) -- self.m_threads.SetStringItem(index, 2, [rpdb2.STATE_RUNNING, rpdb2.STR_STATE_BROKEN][fBroken]) -+ self.m_threads.SetItem(index, 1, thread_name) -+ self.m_threads.SetItem(index, 2, [rpdb2.STATE_RUNNING, rpdb2.STR_STATE_BROKEN][fBroken]) - - return index - -@@ -3313,12 +3333,12 @@ class CThreadsViewer(wx.Panel, CCaptionM - tid = s[rpdb2.DICT_KEY_TID] - name = s[rpdb2.DICT_KEY_NAME] - if not g_fUnicode: -- name = rpdb2.as_string(name, wx.GetDefaultPyEncoding()) -+ name = rpdb2.as_string(name) - - fBroken = s[rpdb2.DICT_KEY_BROKEN] -- index = self.m_threads.InsertStringItem(sys.maxint, repr(tid)) -- self.m_threads.SetStringItem(index, 1, name) -- self.m_threads.SetStringItem(index, 2, [rpdb2.STATE_RUNNING, rpdb2.STR_STATE_BROKEN][fBroken]) -+ index = self.m_threads.InsertItem( i, repr(tid)) -+ self.m_threads.SetItem(index, 1, name) -+ self.m_threads.SetItem(index, 2, [rpdb2.STATE_RUNNING, rpdb2.STR_STATE_BROKEN][fBroken]) - self.m_threads.SetItemData(index, tid) - if tid == current_thread: - j = i -@@ -3333,7 +3353,7 @@ class CThreadsViewer(wx.Panel, CCaptionM - def OnThreadSelected(self, event): - if self.m_suppress_recursion == 0: - self.m_suppress_recursion += 1 -- index = event.m_itemIndex -+ index = event.Index - tid = self.m_threads.GetItemData(index) - self.m_select_command(tid) - else: -@@ -3341,7 +3361,35 @@ class CThreadsViewer(wx.Panel, CCaptionM - - event.Skip() - -+gItemsWithChildren = {} -+ -+# Support function for the porting to WxPython 4 -+def ItemHasChildren(tree, item): -+ '''Return True if the _item_ of TreeListCtrl has children.''' -+ if item in gItemsWithChildren: -+ return gItemsWithChildren[item] -+ -+ firstChild = tree.GetFirstChild(item) -+ if firstChild and firstChild.IsOk(): -+ print('ItemHasChildren( %s) -> True' % (ItemToStr(tree, item))) -+ return True -+ -+ print('ItemHasChildren( %s) -> False' % (ItemToStr(tree, item))) -+ return False - -+def SetItemHasChildren(tree, item, state): -+ '''Stub function, not available in WxPython 4. -+ It used to display an expand symbol depending on _state_ so that the -+ children list can be lazily expanded.''' -+ print('SetItemHasChildren( %s, %s)' % (ItemToStr(tree, item), state )) -+ gItemsWithChildren[item] = state -+ pass -+ -+def ItemToStr(tree, item): -+ s = 'Item<"%s","%s",%s>' % (tree.GetItemText(item,1), tree.GetItemText(item,2), tree.GetItemData(item)) -+ return s -+ -+import pprint - - class CNamespacePanel(wx.Panel, CJobs): - def __init__(self, *args, **kwargs): -@@ -3363,14 +3411,14 @@ class CNamespacePanel(wx.Panel, CJobs): - - sizerv = wx.BoxSizer(wx.VERTICAL) - -- self.m_tree = wx_dataview_or_gizmos.TreeListCtrl(self, -1, style = wx.TR_HIDE_ROOT | wx.TR_DEFAULT_STYLE | wx.TR_FULL_ROW_HIGHLIGHT | wx.NO_BORDER) -+ self.m_tree = wx_dataview_or_gizmos.TreeListCtrl(self, -1 ) # note: default style is perfect for us - -- self.m_tree.AddColumn(TLC_HEADER_NAME) -- self.m_tree.AddColumn(TLC_HEADER_TYPE) -- self.m_tree.AddColumn(TLC_HEADER_REPR) -+ self.m_tree.AppendColumn(TLC_HEADER_NAME) -+ self.m_tree.AppendColumn(TLC_HEADER_TYPE) -+ self.m_tree.AppendColumn(TLC_HEADER_REPR) - self.m_tree.SetColumnWidth(2, 800) -- self.m_tree.SetMainColumn(0) -- self.m_tree.SetLineSpacing(0) -+ self.m_tree.SetSortColumn(0) -+ # self.m_tree.SetLineSpacing(0) - - self.m_tree.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.OnItemExpanding) - self.m_tree.Bind(wx.EVT_TREE_ITEM_COLLAPSING, self.OnItemCollapsing) -@@ -3401,13 +3449,14 @@ class CNamespacePanel(wx.Panel, CJobs): - - - def bind_caption(self, caption_manager): -- w = self.m_tree.GetMainWindow() -+ # w = self.m_tree.GetMainWindow() -+ w = self.m_tree.GetView() - caption_manager.bind_caption(w) - - - def OnItemActivated(self, event): - item = event.GetItem() -- (expr, is_valid) = self.m_tree.GetPyData(item) -+ (expr, is_valid) = self.m_tree.GetItemData(item) - if expr in [STR_NAMESPACE_LOADING, STR_NAMESPACE_DEADLOCK, rpdb2.STR_MAX_NAMESPACE_WARNING_TITLE]: - return - -@@ -3434,6 +3483,7 @@ class CNamespacePanel(wx.Panel, CJobs): - - - def callback_execute(self, r, exc_info): -+ print('callback_execute(%s, %s)' % (r, exc_info) ) - (t, v, tb) = exc_info - - if t != None: -@@ -3470,30 +3520,51 @@ class CNamespacePanel(wx.Panel, CJobs): - - - def GetChildrenCount(self, item): -- n = self.m_tree.GetChildrenCount(item) -- if n != 1: -- return n -+ # n = self.m_tree.GetChildrenCount(item) -+ # n = self.m_tree.GetItemCount(item) -+ # if n != 1: -+ # print('GetChildrenCount(item=%s) -> %d' % (ItemToStr(self.m_tree, item), n) ) -+ # return n -+ -+ children = self.get_children(item) -+ if len(children) == 0 or len(children) > 1: -+ return len(children) - -- child = self.get_children(item)[0] -- (expr, is_valid) = self.m_tree.GetPyData(child) -+ child = children[0] -+ (expr, is_valid) = self.m_tree.GetItemData(child) - - if expr in [STR_NAMESPACE_LOADING, STR_NAMESPACE_DEADLOCK]: -+ print('GetChildrenCount(item=%s) -> %d' % (ItemToStr(self.m_tree, item), 0) ) - return 0 - -+ print('GetChildrenCount(item=%s) -> %d' % (ItemToStr(self.m_tree, item), 1)) - return 1 - - - def expand_item(self, item, _map, froot = False, fskip_expansion_check = False): -- if not self.m_tree.ItemHasChildren(item): -+ '''Arguments: -+ :param item: python expression -+ :param _map: list of dictionnary of expression content, see CSessionManager.get_namespace() for details -+ :param froot: boolen, True if it is the root item -+ :param fskip_expansion_check: -+ :return: -+ ''' -+ print('expand_item(item=%s, _map=%s, froot=%s, fskip_expansion=%s)' % -+ (ItemToStr(self.m_tree, item), pprint.pformat(_map, 4), froot, fskip_expansion_check)) -+ if not ItemHasChildren(self.m_tree, item): -+ print('expand_item() -> no action') - return - -+ # skip expansion if item is already expanded - if not froot and not fskip_expansion_check and self.m_tree.IsExpanded(item): -+ print('expand_item() -> no action') - return - - if self.GetChildrenCount(item) > 0: -+ print('expand_item() -> no action') - return - -- (expr, is_valid) = self.m_tree.GetPyData(item) -+ (expr, is_valid) = self.m_tree.GetItemData(item) - - l = [e for e in _map if e.get(rpdb2.DICT_KEY_EXPR, None) == expr] - if l == []: -@@ -3504,10 +3575,12 @@ class CNamespacePanel(wx.Panel, CJobs): - return - - if rpdb2.DICT_KEY_ERROR in _r: -+ print('expand_item() -> no action due to error') - return - - if _r[rpdb2.DICT_KEY_N_SUBNODES] == 0: -- self.m_tree.SetItemHasChildren(item, False) -+ print('expand_item() -> no subnodes, setting HasChildren to false') -+ SetItemHasChildren(self.m_tree, item, False) - return - - # -@@ -3516,6 +3589,7 @@ class CNamespacePanel(wx.Panel, CJobs): - # In case of a list, no sorting is needed. - # - -+ print('expand_item() -> filling subnodes, setting HasChildren to true & expand item') - snl = _r[rpdb2.DICT_KEY_SUBNODES] - - for r in snl: -@@ -3524,42 +3598,44 @@ class CNamespacePanel(wx.Panel, CJobs): - _type = r[rpdb2.DICT_KEY_TYPE] - _repr = r[rpdb2.DICT_KEY_REPR] - else: -- _name = rpdb2.as_string(r[rpdb2.DICT_KEY_NAME], wx.GetDefaultPyEncoding()) -- _type = rpdb2.as_string(r[rpdb2.DICT_KEY_TYPE], wx.GetDefaultPyEncoding()) -- _repr = rpdb2.as_string(r[rpdb2.DICT_KEY_REPR], wx.GetDefaultPyEncoding()) -+ _name = rpdb2.as_string(r[rpdb2.DICT_KEY_NAME]) -+ _type = rpdb2.as_string(r[rpdb2.DICT_KEY_TYPE]) -+ _repr = rpdb2.as_string(r[rpdb2.DICT_KEY_REPR]) - - identation = '' - #identation = ['', ' '][os.name == rpdb2.POSIX and r[rpdb2.DICT_KEY_N_SUBNODES] == 0] - - child = self.m_tree.AppendItem(item, identation + _name) -- self.m_tree.SetItemText(child, ' ' + _repr, 2) -- self.m_tree.SetItemText(child, ' ' + _type, 1) -- self.m_tree.SetItemPyData(child, (r[rpdb2.DICT_KEY_EXPR], r[rpdb2.DICT_KEY_IS_VALID])) -- self.m_tree.SetItemHasChildren(child, (r[rpdb2.DICT_KEY_N_SUBNODES] > 0)) -+ self.m_tree.SetItemText(child, 2, ' ' + _repr) -+ self.m_tree.SetItemText(child, 1, ' ' + _type) -+ self.m_tree.SetItemData(child, (r[rpdb2.DICT_KEY_EXPR], r[rpdb2.DICT_KEY_IS_VALID])) -+ SetItemHasChildren(self.m_tree, child, (r[rpdb2.DICT_KEY_N_SUBNODES] > 0)) - - self.m_tree.Expand(item) - - - def OnItemExpanding(self, event): - item = event.GetItem() -+ print('OnItemExpanding(item=%s)' % ItemToStr(item)) - -- if not self.m_tree.ItemHasChildren(item): -+ if not ItemHasChildren(self.m_tree, item): - event.Skip() - return - - if self.GetChildrenCount(item) > 0: - event.Skip() -- self.m_tree.Refresh(); -+ self.m_tree.Refresh() - return - -+ print('OnItemExpanding() - repopulathing children') - self.m_tree.DeleteChildren(item) - - child = self.m_tree.AppendItem(item, STR_NAMESPACE_LOADING) -- self.m_tree.SetItemText(child, ' ' + STR_NAMESPACE_LOADING, 2) -- self.m_tree.SetItemText(child, ' ' + STR_NAMESPACE_LOADING, 1) -- self.m_tree.SetItemPyData(child, (STR_NAMESPACE_LOADING, False)) -+ self.m_tree.SetItemText(child, 2, ' ' + STR_NAMESPACE_LOADING) -+ self.m_tree.SetItemText(child, 1, ' ' + STR_NAMESPACE_LOADING) -+ self.m_tree.SetItemData(child, (STR_NAMESPACE_LOADING, False)) - -- (expr, is_valid) = self.m_tree.GetPyData(item) -+ (expr, is_valid) = self.m_tree.GetItemData(item) - - f = lambda r, exc_info: self.callback_ns(r, exc_info, expr) - self.m_async_sm.with_callback(f).get_namespace([(expr, True)], self.m_filter_level) -@@ -3586,9 +3662,9 @@ class CNamespacePanel(wx.Panel, CJobs): - - if t != None or r is None or len(r) == 0: - child = self.m_tree.AppendItem(item, STR_NAMESPACE_DEADLOCK) -- self.m_tree.SetItemText(child, ' ' + STR_NAMESPACE_DEADLOCK, 2) -- self.m_tree.SetItemText(child, ' ' + STR_NAMESPACE_DEADLOCK, 1) -- self.m_tree.SetItemPyData(child, (STR_NAMESPACE_DEADLOCK, False)) -+ self.m_tree.SetItemText(child, 2, ' ' + STR_NAMESPACE_DEADLOCK) -+ self.m_tree.SetItemText(child, 1, ' ' + STR_NAMESPACE_DEADLOCK) -+ self.m_tree.SetItemData(child, (STR_NAMESPACE_DEADLOCK, False)) - self.m_tree.Expand(item) - - if freselect_child: -@@ -3608,7 +3684,7 @@ class CNamespacePanel(wx.Panel, CJobs): - def find_item(self, expr): - item = self.m_tree.GetRootItem() - while item: -- (expr2, is_valid) = self.m_tree.GetPyData(item) -+ (expr2, is_valid) = self.m_tree.GetItemData(item) - if expr2 == expr: - return item - -@@ -3618,18 +3694,20 @@ class CNamespacePanel(wx.Panel, CJobs): - - - def get_children(self, item): -- (child, cookie) = self.m_tree.GetFirstChild(item) -+ print('get_children(%s)' % (ItemToStr(self.m_tree, item))) -+ (child, cookie) = self.m_tree.GetFirstChild(item), 'cookie' - cl = [] - - while child and child.IsOk(): - cl.append(child) -- (child, cookie) = self.m_tree.GetNextChild(item, cookie) -+ child = self.m_tree.GetNextSibling(item) - - return cl - - - def get_expression_list(self): -- if self.m_tree.GetCount() == 0: -+ print('get_expession_list()') -+ if self.m_tree.GetFirstItem().IsOk() == False: - return None - - item = self.m_tree.GetRootItem() -@@ -3639,7 +3717,7 @@ class CNamespacePanel(wx.Panel, CJobs): - - while len(s) > 0: - item = s.pop(0) -- (expr, is_valid) = self.m_tree.GetPyData(item) -+ (expr, is_valid) = self.m_tree.GetItemData(item) - fExpand = self.m_tree.IsExpanded(item) and self.GetChildrenCount(item) > 0 - if not fExpand: - continue -@@ -3648,10 +3726,19 @@ class CNamespacePanel(wx.Panel, CJobs): - items = self.get_children(item) - s = items + s - -+ print('get_expession_list() -> el=%s, s=%s' % (el, s)) - return el - - - def update_namespace(self, key, el): -+ '''Arguments: -+ - key: unique value identifying a namespace -+ - el: namespace content -+ -+ Returns: -+ - (previous key, previous element) -+ ''' -+ print('update_namespace(key=%s, el=%s)' % (key, el)) - old_key = self.m_key - old_el = self.get_expression_list() - -@@ -3660,7 +3747,7 @@ class CNamespacePanel(wx.Panel, CJobs): - - self.m_key = key - -- if el is None: -+ if not el: - el = [(self.get_root_expr(), True)] - - self.post(el, self.m_filter_level) -@@ -3699,21 +3786,28 @@ class CNamespacePanel(wx.Panel, CJobs): - - - def do_update_namespace(self, rl): -+ '''Arguments: -+ rl: list of dictionnaries, each element of the list describes a python expression -+ -+ See CSessionManager.get_namespace() for more details''' -+ print('do_update_namespace(rl=%s)' % pprint.pformat(rl, 4) ) - self.m_tree.DeleteAllItems() - -- root = self.m_tree.AddRoot('root') -- self.m_tree.SetItemPyData(root, (self.get_root_expr(), False)) -- self.m_tree.SetItemHasChildren(root, True) -+ # root = self.m_tree.AddRoot('root') -+ root = self.m_tree.GetRootItem() -+ self.m_tree.SetItemData(root, (self.get_root_expr(), False)) -+ SetItemHasChildren(self.m_tree, root, True) - - s = [root] - - while len(s) > 0: - item = s.pop(0) -+ print('do_update_namespace() - populating item %s' % ItemToStr(self.m_tree, item)) - self.expand_item(item, rl, item is root) - - items = self.get_children(item) - s = items + s -- -+ print('s="%s"' % s) - self.m_tree.Refresh() - - -@@ -3805,6 +3899,9 @@ class CNamespaceViewer(wx.Panel, CCaptio - - - def get_local_key(self, _stack): -+ '''Arguments: -+ _stack: a dictionnary describing the current thread. See rpdb2.py:get_stack() for detailed information. -+ ''' - frame_index = self.m_session_manager.get_frame_index() - c = _stack.get(rpdb2.DICT_KEY_CODE_LIST, []) - key = c[-(1 + frame_index)] -@@ -3812,6 +3909,9 @@ class CNamespaceViewer(wx.Panel, CCaptio - - - def get_global_key(self, _stack): -+ '''Arguments: -+ _stack: a dictionnary describing the current thread. See rpdb2.py:get_stack() for detailed information. -+ ''' - frame_index = self.m_session_manager.get_frame_index() - s = _stack.get(rpdb2.DICT_KEY_STACK, []) - key = s[-(1 + frame_index)][0] -@@ -3819,6 +3919,9 @@ class CNamespaceViewer(wx.Panel, CCaptio - - - def update_namespace(self, _stack): -+ '''Arguments: -+ _stack: a dictionnary describing the current thread. See rpdb2.py:get_stack() for detailed information. -+ ''' - try: - key = self.get_local_key(_stack) - el = self.m_key_map.get(key, None) -@@ -3873,7 +3976,7 @@ class CStackViewer(wx.Panel, CCaptionMan - - - def set_cursor(self, id): -- cursor = wx.StockCursor(id) -+ cursor = wx.Cursor(id) - self.SetCursor(cursor) - self.m_stack.SetCursor(cursor) - -@@ -3908,14 +4011,14 @@ class CStackViewer(wx.Panel, CCaptionMan - function = e[2] - - if not g_fUnicode: -- filename = rpdb2.as_string(filename, wx.GetDefaultPyEncoding()) -- function = rpdb2.as_string(function, wx.GetDefaultPyEncoding()) -+ filename = rpdb2.as_string(filename) -+ function = rpdb2.as_string(function) - -- index = self.m_stack.InsertStringItem(sys.maxint, repr(i)) -- self.m_stack.SetStringItem(index, 1, os.path.basename(filename)) -- self.m_stack.SetStringItem(index, 2, repr(lineno)) -- self.m_stack.SetStringItem(index, 3, function) -- self.m_stack.SetStringItem(index, 4, os.path.dirname(filename)) -+ index = self.m_stack.InsertItem( i, repr(i)) -+ self.m_stack.SetItem(index, 1, os.path.basename(filename)) -+ self.m_stack.SetItem(index, 2, repr(lineno)) -+ self.m_stack.SetItem(index, 3, function) -+ self.m_stack.SetItem(index, 4, os.path.dirname(filename)) - self.m_stack.SetItemData(index, i) - - i += 1 -@@ -4116,7 +4219,7 @@ class CAttachDialog(wx.Dialog, CJobs): - - - def set_cursor(self, id): -- cursor = wx.StockCursor(id) -+ cursor = wx.Cursor(id) - self.SetCursor(cursor) - self.m_listbox_scripts.SetCursor(cursor) - -@@ -4135,7 +4238,7 @@ class CAttachDialog(wx.Dialog, CJobs): - if host == '': - host = 'localhost' - -- host = rpdb2.as_unicode(host, wx.GetDefaultPyEncoding()) -+ host = rpdb2.as_unicode(host) - - f = lambda r, exc_info: self.callback_sethost(r, exc_info, host) - self.m_async_sm.with_callback(f).set_host(host) -@@ -4197,13 +4300,13 @@ class CAttachDialog(wx.Dialog, CJobs): - self.m_listbox_scripts.DeleteAllItems() - - for i, s in enumerate(self.m_server_list): -- index = self.m_listbox_scripts.InsertStringItem(sys.maxint, repr(s.m_pid)) -+ index = self.m_listbox_scripts.InsertItem( i, repr(s.m_pid)) - - filename = s.m_filename - if not g_fUnicode: -- filename = rpdb2.as_string(filename, wx.GetDefaultPyEncoding()) -+ filename = rpdb2.as_string(filename) - -- self.m_listbox_scripts.SetStringItem(index, 1, filename) -+ self.m_listbox_scripts.SetItem(index, 1, filename) - self.m_listbox_scripts.SetItemData(index, i) - - self.m_listbox_scripts.set_columns_width() -@@ -4216,7 +4319,7 @@ class CAttachDialog(wx.Dialog, CJobs): - - - def OnItemSelected(self, event): -- self.m_index = event.m_itemIndex -+ self.m_index = event.Index - self.m_ok.Enable() - - event.Skip() -@@ -4230,7 +4333,7 @@ class CAttachDialog(wx.Dialog, CJobs): - - - def OnItemActivated(self, event): -- self.m_index = event.m_itemIndex -+ self.m_index = event.Index - - self.EndModal(wx.ID_OK) - -@@ -4252,7 +4355,7 @@ class CExpressionDialog(wx.Dialog): - sizerh.Add(label, 0, wx.ALIGN_CENTRE | wx.ALL, 5) - - if not g_fUnicode: -- default_value = rpdb2.as_string(default_value, wx.GetDefaultPyEncoding()) -+ default_value = rpdb2.as_string(default_value) - - self.m_entry_expr = wx.TextCtrl(self, value = default_value, size = (200, -1)) - self.m_entry_expr.SetFocus() -@@ -4286,7 +4389,7 @@ class CExpressionDialog(wx.Dialog): - - def get_expression(self): - expr = self.m_entry_expr.GetValue() -- expr = rpdb2.as_unicode(expr, wx.GetDefaultPyEncoding()) -+ expr = rpdb2.as_unicode(expr) - - return expr - -@@ -4313,7 +4416,7 @@ class CEncodingDialog(wx.Dialog): - sizerh.Add(label, 0, wx.ALIGN_CENTRE | wx.ALL, 5) - encoding = [current_encoding, ''][current_encoding is None] - if not g_fUnicode: -- encoding = rpdb2.as_string(encoding, wx.GetDefaultPyEncoding()) -+ encoding = rpdb2.as_string(encoding) - - self.m_entry_encoding = wx.TextCtrl(self, value = encoding, size = (200, -1)) - self.m_entry_encoding.SetFocus() -@@ -4353,7 +4456,7 @@ class CEncodingDialog(wx.Dialog): - - def get_encoding(self): - encoding = self.m_entry_encoding.GetValue() -- encoding = rpdb2.as_unicode(encoding, wx.GetDefaultPyEncoding()) -+ encoding = rpdb2.as_unicode(encoding) - - return encoding, self.m_cb.GetValue() - -@@ -4446,7 +4549,7 @@ class CPwdDialog(wx.Dialog): - pwd = [current_password, ''][current_password is None] - - if not g_fUnicode: -- pwd = rpdb2.as_string(pwd, wx.GetDefaultPyEncoding()) -+ pwd = rpdb2.as_string(pwd) - - self.m_entry_pwd = wx.TextCtrl(self, value = pwd, size = (200, -1)) - self.m_entry_pwd.SetFocus() -@@ -4482,7 +4585,7 @@ class CPwdDialog(wx.Dialog): - - def get_password(self): - pwd = self.m_entry_pwd.GetValue() -- pwd = rpdb2.as_unicode(pwd, wx.GetDefaultPyEncoding()) -+ pwd = rpdb2.as_unicode(pwd) - - return pwd - -@@ -4562,7 +4665,7 @@ class COpenDialog(wx.Dialog): - (_path, filename, args) = rpdb2.split_command_line_path_filename_args(command_line) - _abs_path = os.path.abspath(_path) - -- dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = WILDCARD_WINPDB, style = wx.OPEN | wx.CHANGE_DIR) -+ dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = WILDCARD_WINPDB, style = wx.FD_OPEN | wx.FD_CHANGE_DIR) - r = dlg.ShowModal() - if r == wx.ID_OK: - path = dlg.GetPaths()[0] -@@ -4579,7 +4682,7 @@ class COpenDialog(wx.Dialog): - - def get_file_name(self): - filename = self.m_entry.GetValue() -- filename = rpdb2.as_unicode(filename, wx.GetDefaultPyEncoding()) -+ filename = rpdb2.as_unicode(filename) - - return filename - -@@ -4603,7 +4706,7 @@ class CLaunchDialog(wx.Dialog): - sizerh.Add(label, 0, wx.ALIGN_CENTRE | wx.ALL, 5) - - if not g_fUnicode: -- command_line = rpdb2.as_string(command_line, wx.GetDefaultPyEncoding()) -+ command_line = rpdb2.as_string(command_line) - - self.m_entry_commandline = wx.TextCtrl(self, value = command_line, size = (200, -1)) - self.m_entry_commandline.SetFocus() -@@ -4676,7 +4779,7 @@ class CLaunchDialog(wx.Dialog): - - cwd = rpdb2.getcwdu() - -- dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = WILDCARD_WINPDB, style = wx.OPEN | wx.CHANGE_DIR) -+ dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = WILDCARD_WINPDB, style = wx.FD_OPEN | wx.FD_CHANGE_DIR) - r = dlg.ShowModal() - - os.chdir(cwd) -@@ -4705,7 +4808,7 @@ class CLaunchDialog(wx.Dialog): - else: - wildcard = WILDCARD_EXECUTABLES - -- dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = wildcard, style = wx.OPEN | wx.CHANGE_DIR) -+ dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = wildcard, style = wx.FD_OPEN | wx.FD_CHANGE_DIR) - r = dlg.ShowModal() - - os.chdir(cwd) -@@ -4726,7 +4829,7 @@ class CLaunchDialog(wx.Dialog): - - def do_validate(self): - command_line = self.m_entry_commandline.GetValue() -- command_line = rpdb2.as_unicode(command_line, wx.GetDefaultPyEncoding()) -+ command_line = rpdb2.as_unicode(command_line) - - (_path, filename, args) = rpdb2.split_command_line_path_filename_args(command_line) - -@@ -4769,7 +4872,7 @@ class CLaunchDialog(wx.Dialog): - - def get_command_line(self): - command_line = self.m_entry_commandline.GetValue() -- command_line = rpdb2.as_unicode(command_line, wx.GetDefaultPyEncoding()) -+ command_line = rpdb2.as_unicode(command_line) - interpreter = self.m_entry_interpreter.GetValue() - return (command_line, self.m_cb.GetValue(), interpreter) - -@@ -4789,7 +4892,7 @@ def StartClient(command_line, fAttach, f - raise - - if not 'unicode' in wx.PlatformInfo: -- dlg = wx.Mes8ageDialog(None, STR_WXPYTHON_ANSI_WARNING_MSG, STR_WXPYTHON_ANSI_WARNING_TITLE, wx.OK | wx.ICON_WARNING) -+ dlg = wx.MessageDialog(None, STR_WXPYTHON_ANSI_WARNING_MSG, STR_WXPYTHON_ANSI_WARNING_TITLE, wx.OK | wx.ICON_WARNING) - dlg.ShowModal() - dlg.Destroy() - -@@ -4800,17 +4903,14 @@ def StartClient(command_line, fAttach, f - - - def main(): -- if rpdb2.get_version() != "RPDB_1_5_0": -- rpdb2._print(STR_ERROR_INTERFACE_COMPATIBILITY % ("0PDB_1_5_0", rpdb2.get_version())) -+ if rpdb2.get_version() != RPDB2_EXPECTED_VERSION: -+ rpdb2._print(STR_ERROR_INTERFACE_COMPATIBILITY % ( RPDB2_EXPECTED_VERSION, rpdb2.get_version())) - return - - return rpdb2.main(StartClient, WINPDB_TITLE) - - - --def get_version(): -- return WINPDB_VERSION -- - def run_winpdb(): - ret = main() - diff --git a/winpdb-colorterm-fix.patch b/winpdb-colorterm-fix.patch deleted file mode 100644 index fbf1e2c..0000000 --- a/winpdb-colorterm-fix.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up winpdb-WINPDB_1_5_0/rpdb2.py.colorterm-fix winpdb-WINPDB_1_5_0/rpdb2.py ---- winpdb-WINPDB_1_5_0/rpdb2.py.colorterm-fix 2020-01-31 06:03:44.332995973 -0500 -+++ winpdb-WINPDB_1_5_0/rpdb2.py 2020-01-31 06:04:09.522505827 -0500 -@@ -3526,7 +3526,7 @@ def CalcTerminalCommand(): - - if COLORTERM in os.environ: - term = os.environ[COLORTERM] -- if IsFileInPath(term): -+ if term != 'yes' and IsFileInPath(term): - return term - - if IsPrefixInEnviron(KDE_PREFIX): diff --git a/winpdb-ensure-all-params-of-DES.new-are-set-to-byte.patch b/winpdb-ensure-all-params-of-DES.new-are-set-to-byte.patch deleted file mode 100644 index 1dd29df..0000000 --- a/winpdb-ensure-all-params-of-DES.new-are-set-to-byte.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -up winpdb-WINPDB_1_5_0/rpdb2.py.bytes-fix winpdb-WINPDB_1_5_0/rpdb2.py ---- winpdb-WINPDB_1_5_0/rpdb2.py.bytes-fix 2020-01-31 06:05:32.600889226 -0500 -+++ winpdb-WINPDB_1_5_0/rpdb2.py 2020-01-31 06:06:38.376609312 -0500 -@@ -4858,7 +4858,7 @@ class CCrypto: - s_padded = s + as_bytes('\x00') * (DES.block_size - (len(s) % DES.block_size)) - - key_padded = (self.m_key + as_bytes('0') * (DES.key_size - (len(self.m_key) % DES.key_size)))[:DES.key_size] -- iv = '0' * DES.block_size -+ iv = as_bytes('0') * DES.block_size - - d = DES.new(key_padded, DES.MODE_CBC, iv) - r = d.encrypt(s_padded) -@@ -4869,7 +4869,7 @@ class CCrypto: - def __decrypt(self, s): - try: - key_padded = (self.m_key + as_bytes('0') * (DES.key_size - (len(self.m_key) % DES.key_size)))[:DES.key_size] -- iv = '0' * DES.block_size -+ iv = as_bytes('0') * DES.block_size - - d = DES.new(key_padded, DES.MODE_CBC, iv) - _s = d.decrypt(s).strip(as_bytes('\x00')) diff --git a/winpdb.spec b/winpdb.spec index 2eb1da8..341c57a 100644 --- a/winpdb.spec +++ b/winpdb.spec @@ -1,24 +1,22 @@ +%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} + Name: winpdb -Version: 2.0.0.1 -Release: 8%{?dist} +Version: 1.4.8 +Release: 16%{?dist} Summary: An advanced python debugger -License: GPL-2.0-or-later -URL: https://pypi.org/project/winpdb-reborn -Source0: https://files.pythonhosted.org/packages/d9/8f/c8033e1a075d8205a2f950a40644d363f63b11698655f620b5f4d6e7ace0/winpdb-reborn-2.0.0.1.tar.gz +Group: Development/Debuggers +License: GPLv2+ +URL: http://www.winpdb.org/ +Source0: http://winpdb.googlecode.com/files/winpdb-%{version}.tar.gz Source1: %{name}.desktop Source2: %{name}.png -Patch0: https://github.com/bluebird75/winpdb/commit/d1a4430ac8da69d3a1cd4a848c9135f093b90123.patch -Patch1: https://github.com/bluebird75/winpdb/commit/5c2f5232b95715c5e8efbd155dd38c262f5e79d0.patch -Patch2: https://github.com/bluebird75/winpdb/commit/215712d75cf89b0678d563237746be647d5f25e7.patch -Patch3: https://github.com/bluebird75/winpdb/commit/613e4532d93b728bef7b2c8e529a431bbe6ecc19.patch -Patch4: https://github.com/bluebird75/winpdb/commit/2a3ca49275ee8461009dbe5a4aefef4b57dec729.patch -Patch5: https://github.com/bluebird75/winpdb/commit/ed617311de97300c1ce9de9ee6931dc7141cfd93.patch -Patch6: winpdb-2.0.0.1-no-imp.patch +Patch0: winpdb-1.4.8-gnome-fix.patch +Patch1: https://sources.debian.net/data/main/w/winpdb/1.4.8-2.1/debian/patches/wxpython3.0.patch +# https://code.google.com/p/winpdb/issues/detail?id=19 +Patch2: winpdb-1.4.8-issue19-fix.patch BuildArch: noarch -BuildRequires: python3-devel, desktop-file-utils -BuildRequires: python3-setuptools, dos2unix -Requires: python3-crypto, python3-wxpython4 -Provides: winpdb-reborn = %{version}-%{release} +BuildRequires: python2-devel, wxPython-devel >= 2.6, desktop-file-utils +Requires: python2-crypto, python2-wxpython >= 2.6 %description Winpdb is an advanced python debugger, with support for smart breakpoints, @@ -26,25 +24,18 @@ multiple threads, namespace modification, embedded debugging, encrypted communication and speed of up to 20 times that of pdb. %prep -%setup -q -n %{name}-reborn-%{version} -for i in *.py rpdb/*.py; do - dos2unix $i -done -%patch -P0 -p1 -b .typofix -%patch -P1 -p1 -b .deprecated-function -%patch -P2 -p1 -b .undefined -%patch -P3 -p1 -b .small-typo -%patch -P4 -p1 -b .no-print-if-no-file -%patch -P5 -p1 -b .use-public-stderr -%patch -P6 -p1 -b .no-imp -sed -i 's|/usr/bin/env python|/usr/bin/python3|g' rpdb2.py -sed -i 's|/usr/bin/env python|/usr/bin/python3|g' winpdb.py +%setup -q +%patch0 -p1 -b .gnomefix +%patch1 -p1 -b .wxpy3 +%patch2 -p1 -b .issue19 +sed -i 's/\r//g' README.txt +chmod -x README.txt %build -%{__python3} setup.py build +%{__python} setup.py build %install -%{__python3} setup.py install --skip-build --root=$RPM_BUILD_ROOT +%{__python} setup.py install --skip-build --root=$RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_datadir}/pixmaps install -m0644 -p %{SOURCE2} $RPM_BUILD_ROOT%{_datadir}/pixmaps @@ -54,120 +45,16 @@ desktop-file-install \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ %{SOURCE1} -chmod +x $RPM_BUILD_ROOT%{python3_sitelib}/rpdb2.py $RPM_BUILD_ROOT%{python3_sitelib}/winpdb.py +chmod +x $RPM_BUILD_ROOT%{python_sitelib}/rpdb2.py $RPM_BUILD_ROOT%{python_sitelib}/winpdb.py %files -%doc README.md +%doc README.txt %{_bindir}/* -%{python3_sitelib}/* +%{python_sitelib}/* %{_datadir}/applications/*.desktop %{_datadir}/pixmaps/%{name}.png %changelog -* Fri Jul 17 2026 Fedora Release Engineering - 2.0.0.1-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild - -* Wed Jun 03 2026 Python Maint - 2.0.0.1-7 -- Rebuilt for Python 3.15 - -* Sat Jan 17 2026 Fedora Release Engineering - 2.0.0.1-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild - -* Fri Sep 19 2025 Python Maint - 2.0.0.1-5 -- Rebuilt for Python 3.14.0rc3 bytecode - -* Fri Aug 15 2025 Python Maint - 2.0.0.1-4 -- Rebuilt for Python 3.14.0rc2 bytecode - -* Fri Jul 25 2025 Fedora Release Engineering - 2.0.0.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Mon Jun 02 2025 Python Maint - 2.0.0.1-2 -- Rebuilt for Python 3.14 - -* Wed Mar 12 2025 Tom Callaway - 2.0.0.1-1 -- update to 2.0.0.1 + latest commits -- apply fix for removed imp.load_source() - -* Sun Jan 19 2025 Fedora Release Engineering - 2.0.0-0.21.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Fri Jul 26 2024 Miroslav Suchý - 2.0.0-0.20.dev5 -- convert license to SPDX - -* Sat Jul 20 2024 Fedora Release Engineering - 2.0.0-0.19.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Fri Jun 07 2024 Python Maint - 2.0.0-0.18.dev5 -- Rebuilt for Python 3.13 - -* Sat Jan 27 2024 Fedora Release Engineering - 2.0.0-0.17.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Sat Jul 22 2023 Fedora Release Engineering - 2.0.0-0.16.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Tue Jun 13 2023 Python Maint - 2.0.0-0.15.dev5 -- Rebuilt for Python 3.12 - -* Sat Jan 21 2023 Fedora Release Engineering - 2.0.0-0.14.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Sat Jul 23 2022 Fedora Release Engineering - 2.0.0-0.13.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Mon Jun 13 2022 Python Maint - 2.0.0-0.12.dev5 -- Rebuilt for Python 3.11 - -* Sat Jan 22 2022 Fedora Release Engineering - 2.0.0-0.11.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Fri Jul 23 2021 Fedora Release Engineering - 2.0.0-0.10.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Fri Jun 04 2021 Python Maint - 2.0.0-0.9.dev5 -- Rebuilt for Python 3.10 - -* Wed Jan 27 2021 Fedora Release Engineering - 2.0.0-0.8.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Wed Jul 29 2020 Fedora Release Engineering - 2.0.0-0.7.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Tue May 26 2020 Miro Hrončok - 2.0.0-0.6.dev5 -- Rebuilt for Python 3.9 - -* Fri Jan 31 2020 Tom Callaway - 2.0.0-0.5.dev5 -- add fixes from upstream -- remove unnecessary (and dead) dependency on wxPython-devel - -* Fri Jan 31 2020 Fedora Release Engineering - 2.0.0-0.4.dev5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Thu Oct 03 2019 Miro Hrončok - 2.0.0-0.3.dev5 -- Rebuilt for Python 3.8.0rc1 (#1748018) - -* Mon Aug 19 2019 Miro Hrončok - 2.0.0-0.2.dev5 -- Rebuilt for Python 3.8 - -* Thu Aug 15 2019 Tom Callaway - 2.0.0-0.1.dev5 -- use winpdb-reborn sources, move to python3 - -* Sat Jul 27 2019 Fedora Release Engineering - 1.4.8-21 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Tue Jun 04 2019 Tom Callaway - 1.4.8-20 -- make explicit python2 - -* Sun Feb 03 2019 Fedora Release Engineering - 1.4.8-19 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Tue Jul 24 2018 Tom Callaway - 1.4.8-18 -- fix FTBFS - -* Sat Jul 14 2018 Fedora Release Engineering - 1.4.8-17 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - * Fri Feb 09 2018 Fedora Release Engineering - 1.4.8-16 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild diff --git a/wxpython3.0.patch b/wxpython3.0.patch new file mode 100644 index 0000000..a60e525 --- /dev/null +++ b/wxpython3.0.patch @@ -0,0 +1,47 @@ +Description: Fixes for wxPython 3.0 + Retains compatibility with 2.8. +Author: Olly Betts +Bug-Debian: https://bugs.debian.org/759093 +Forwarded: no +Last-Update: 2014-09-20 + +Index: winpdb-1.4.8/winpdb.py +=================================================================== +--- winpdb-1.4.8.orig/winpdb.py ++++ winpdb-1.4.8/winpdb.py +@@ -278,7 +278,7 @@ import sys + + + +-WXVER = "2.6" ++WXVER = "2.8" + + STR_WXPYTHON_ERROR_TITLE = 'Winpdb Error' + STR_WXPYTHON_ERROR_MSG = """wxPython was not found. +@@ -3870,7 +3870,7 @@ class CHTMLDialog(wx.Dialog): + self.m_html.SetPage(self.get_html_text(text)) + + ir = self.m_html.GetInternalRepresentation() +- self.m_html.SetSize((ir.GetWidth() + 25, min(500, ir.GetHeight() + 25))) ++ self.m_html.SetMinSize((ir.GetWidth() + 25, min(500, ir.GetHeight() + 25))) + + btnsizer = wx.StdDialogButtonSizer() + sizerv.Add(btnsizer, 0, wx.ALIGN_CENTRE | wx.ALL, 5) +@@ -4465,7 +4465,7 @@ class COpenDialog(wx.Dialog): + (_path, filename, args) = rpdb2.split_command_line_path_filename_args(command_line) + _abs_path = os.path.abspath(_path) + +- dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = WINPDB_WILDCARD, style = wx.OPEN | wx.CHANGE_DIR) ++ dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = WINPDB_WILDCARD, style = wx.FD_OPEN | wx.FD_CHANGE_DIR) + r = dlg.ShowModal() + if r == wx.ID_OK: + path = dlg.GetPaths()[0] +@@ -4563,7 +4563,7 @@ class CLaunchDialog(wx.Dialog): + + cwd = rpdb2.getcwdu() + +- dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = WINPDB_WILDCARD, style = wx.OPEN | wx.CHANGE_DIR) ++ dlg = wx.FileDialog(self, defaultDir = _abs_path, defaultFile = filename, wildcard = WINPDB_WILDCARD, style = wx.FD_OPEN | wx.FD_CHANGE_DIR) + r = dlg.ShowModal() + + os.chdir(cwd)