URI: 
       tAppImage: Fix webbrowser.open not opening links - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit fc65cdaa8afb2304f2bf54a79c4a0af3d263baf4
   DIR parent 69b673b8a102d0907f96745254d659b711dab952
  HTML Author: Axel Gembe <derago@gmail.com>
       Date:   Fri,  5 Jul 2019 00:02:26 +0200
       
       AppImage: Fix webbrowser.open not opening links
       
       There was an issue where webbrowser.open would invoke a program like
       kde-open5 that loaded the systems libQt5DBus, which was not satisfied
       with the AppImage's libdbus. To fix this we fork the process, unset
       LD_LIBRARY_PATH and then open the URL.
       
       fixes #5425
       
       -----
       
       ttaken from Electron-Cash/Electron-Cash@00939aafd1c8e9c1cbf56615bcf9a18db1ff15c2
       
       Diffstat:
         M electrum/gui/qt/address_list.py     |       5 ++---
         M electrum/gui/qt/contact_list.py     |       5 ++---
         M electrum/gui/qt/history_list.py     |       5 ++---
         M electrum/gui/qt/main_window.py      |       7 +++----
         M electrum/gui/qt/util.py             |      15 +++++++++++++++
       
       5 files changed, 24 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/electrum/gui/qt/address_list.py b/electrum/gui/qt/address_list.py
       t@@ -23,7 +23,6 @@
        # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        # SOFTWARE.
        
       -import webbrowser
        from enum import IntEnum
        
        from PyQt5.QtCore import Qt, QPersistentModelIndex, QModelIndex
       t@@ -36,7 +35,7 @@ from electrum.plugin import run_hook
        from electrum.bitcoin import is_address
        from electrum.wallet import InternalAddressCorruption
        
       -from .util import MyTreeView, MONOSPACE_FONT, ColorScheme
       +from .util import MyTreeView, MONOSPACE_FONT, ColorScheme, webopen
        
        
        class AddressList(MyTreeView):
       t@@ -217,7 +216,7 @@ class AddressList(MyTreeView):
                        menu.addAction(_("Remove from wallet"), lambda: self.parent.remove_address(addr))
                    addr_URL = block_explorer_URL(self.config, 'addr', addr)
                    if addr_URL:
       -                menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL))
       +                menu.addAction(_("View on block explorer"), lambda: webopen(addr_URL))
        
                    if not self.wallet.is_frozen_address(addr):
                        menu.addAction(_("Freeze"), lambda: self.parent.set_frozen_state_of_addresses([addr], True))
   DIR diff --git a/electrum/gui/qt/contact_list.py b/electrum/gui/qt/contact_list.py
       t@@ -23,7 +23,6 @@
        # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        # SOFTWARE.
        
       -import webbrowser
        from enum import IntEnum
        
        from PyQt5.QtGui import QStandardItemModel, QStandardItem
       t@@ -35,7 +34,7 @@ from electrum.bitcoin import is_address
        from electrum.util import block_explorer_URL
        from electrum.plugin import run_hook
        
       -from .util import MyTreeView, import_meta_gui, export_meta_gui
       +from .util import MyTreeView, import_meta_gui, export_meta_gui, webopen
        
        
        class ContactList(MyTreeView):
       t@@ -97,7 +96,7 @@ class ContactList(MyTreeView):
                    menu.addAction(_("Delete"), lambda: self.parent.delete_contacts(selected_keys))
                    URLs = [block_explorer_URL(self.config, 'addr', key) for key in filter(is_address, selected_keys)]
                    if URLs:
       -                menu.addAction(_("View on block explorer"), lambda: [webbrowser.open(u) for u in URLs])
       +                menu.addAction(_("View on block explorer"), lambda: [webopen(u) for u in URLs])
        
                run_hook('create_contact_menu', menu, selected_keys)
                menu.exec_(self.viewport().mapToGlobal(position))
   DIR diff --git a/electrum/gui/qt/history_list.py b/electrum/gui/qt/history_list.py
       t@@ -24,7 +24,6 @@
        # SOFTWARE.
        
        import os
       -import webbrowser
        import datetime
        from datetime import date
        from typing import TYPE_CHECKING, Tuple, Dict
       t@@ -47,7 +46,7 @@ from electrum.logging import get_logger, Logger
        
        from .util import (read_QIcon, MONOSPACE_FONT, Buttons, CancelButton, OkButton,
                           filename_field, MyTreeView, AcceptFileDragDrop, WindowModalDialog,
       -                   CloseButton)
       +                   CloseButton, webopen)
        
        if TYPE_CHECKING:
            from electrum.wallet import Abstract_Wallet
       t@@ -608,7 +607,7 @@ class HistoryList(MyTreeView, AcceptFileDragDrop):
                if pr_key:
                    menu.addAction(read_QIcon("seal"), _("View invoice"), lambda: self.parent.show_invoice(pr_key))
                if tx_URL:
       -            menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
       +            menu.addAction(_("View on block explorer"), lambda: webopen(tx_URL))
                menu.exec_(self.viewport().mapToGlobal(position))
        
            def remove_local_tx(self, delete_tx):
   DIR diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py
       t@@ -30,7 +30,6 @@ import traceback
        import json
        import shutil
        import weakref
       -import webbrowser
        import csv
        from decimal import Decimal
        import base64
       t@@ -85,7 +84,7 @@ from .util import (read_QIcon, ColorScheme, text_dialog, icon_path, WaitingDialo
                           OkButton, InfoButton, WWLabel, TaskThread, CancelButton,
                           CloseButton, HelpButton, MessageBoxMixin, EnterButton, expiration_values,
                           ButtonsLineEdit, CopyCloseButton, import_meta_gui, export_meta_gui,
       -                   filename_field, address_field, char_width_in_lineedit)
       +                   filename_field, address_field, char_width_in_lineedit, webopen)
        from .installwizard import WIF_HELP_TEXT
        from .history_list import HistoryList, HistoryModel
        from .update_checker import UpdateCheck, UpdateCheckThread
       t@@ -633,9 +632,9 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
                help_menu = menubar.addMenu(_("&Help"))
                help_menu.addAction(_("&About"), self.show_about)
                help_menu.addAction(_("&Check for updates"), self.show_update_check)
       -        help_menu.addAction(_("&Official website"), lambda: webbrowser.open("https://electrum.org"))
       +        help_menu.addAction(_("&Official website"), lambda: webopen("https://electrum.org"))
                help_menu.addSeparator()
       -        help_menu.addAction(_("&Documentation"), lambda: webbrowser.open("http://docs.electrum.org/")).setShortcut(QKeySequence.HelpContents)
       +        help_menu.addAction(_("&Documentation"), lambda: webopen("http://docs.electrum.org/")).setShortcut(QKeySequence.HelpContents)
                help_menu.addAction(_("&Report Bug"), self.show_report_bug)
                help_menu.addSeparator()
                help_menu.addAction(_("&Donate to server"), self.donate_to_server)
   DIR diff --git a/electrum/gui/qt/util.py b/electrum/gui/qt/util.py
       t@@ -5,6 +5,8 @@ import sys
        import platform
        import queue
        import traceback
       +import os
       +import webbrowser
        
        from functools import partial, lru_cache
        from typing import NamedTuple, Callable, Optional, TYPE_CHECKING, Union, List, Dict
       t@@ -878,6 +880,19 @@ def char_width_in_lineedit() -> int:
            return max(9, char_width)
        
        
       +def webopen(url: str):
       +    if sys.platform == 'linux' and os.environ.get('APPIMAGE'):
       +        # When on Linux webbrowser.open can fail in AppImage because it can't find the correct libdbus.
       +        # We just fork the process and unset LD_LIBRARY_PATH before opening the URL.
       +        # See #5425
       +        if os.fork() == 0:
       +            del os.environ['LD_LIBRARY_PATH']
       +            webbrowser.open(url)
       +            sys.exit(0)
       +    else:
       +        webbrowser.open(url)
       +
       +
        if __name__ == "__main__":
            app = QApplication([])
            t = WaitingDialog(None, 'testing ...', lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done"))