fix for linux. copied the webbrowser hack over from wm.py Thanks Daniel Salazar for...
authorDalai Felinto <dfelinto@gmail.com>
Tue, 5 Apr 2011 01:06:36 +0000 (01:06 +0000)
committerDalai Felinto <dfelinto@gmail.com>
Tue, 5 Apr 2011 01:06:36 +0000 (01:06 +0000)
text_editor_pasteall.py

index 3b1de4973b047b83d036d028c9e5b3c3c08fa084..0d5923466dee7be4aef5513392a7183bd08fa0d4 100644 (file)
@@ -109,6 +109,7 @@ class TEXT_OT_pasteall(bpy.types.Operator):
 
         if context.scene.use_webbrowser:
             try:
+                _webbrowser_bug_fix()
                 webbrowser.open_new_tab(page)
             except:
                 self.report('WARNING', "Error in opening the page %s." % (page))
@@ -217,4 +218,67 @@ def unregister():
     bpy.utils.unregister_module(__name__)
 
 if __name__ == "__main__":
-    register()
\ No newline at end of file
+    register()
+
+def _webbrowser_bug_fix():
+    """hack copied from wm.py"""
+    # test for X11
+    import os
+
+    if os.environ.get("DISPLAY"):
+
+        # BSD licenced code copied from python, temp fix for bug
+        # http://bugs.python.org/issue11432, XXX == added code
+        def _invoke(self, args, remote, autoraise):
+            # XXX, added imports
+            import io
+            import subprocess
+            import time
+
+            raise_opt = []
+            if remote and self.raise_opts:
+                # use autoraise argument only for remote invocation
+                autoraise = int(autoraise)
+                opt = self.raise_opts[autoraise]
+                if opt:
+                    raise_opt = [opt]
+
+            cmdline = [self.name] + raise_opt + args
+
+            if remote or self.background:
+                inout = io.open(os.devnull, "r+")
+            else:
+                # for TTY browsers, we need stdin/out
+                inout = None
+            # if possible, put browser in separate process group, so
+            # keyboard interrupts don't affect browser as well as Python
+            setsid = getattr(os, 'setsid', None)
+            if not setsid:
+                setsid = getattr(os, 'setpgrp', None)
+
+            p = subprocess.Popen(cmdline, close_fds=True,  # XXX, stdin=inout,
+                                 stdout=(self.redirect_stdout and inout or None),
+                                 stderr=inout, preexec_fn=setsid)
+            if remote:
+                # wait five secons. If the subprocess is not finished, the
+                # remote invocation has (hopefully) started a new instance.
+                time.sleep(1)
+                rc = p.poll()
+                if rc is None:
+                    time.sleep(4)
+                    rc = p.poll()
+                    if rc is None:
+                        return True
+                # if remote call failed, open() will try direct invocation
+                return not rc
+            elif self.background:
+                if p.poll() is None:
+                    return True
+                else:
+                    return False
+            else:
+                return not p.wait()
+
+        import webbrowser
+        webbrowser.UnixBrowser._invoke = _invoke
+