diff --git a/README.md b/README.md
index cf27295..d147b71 100644
--- a/README.md
+++ b/README.md
@@ -20,22 +20,33 @@ Homepage: https://weechat.org/
QWeeChat requires:
- Python ≥ 3.7
-- PyQt5
+- PyQt5 or PyQt5 and maybe PySide2 and PySide2 using qtpy
- [WeeChat](https://weechat.org) ≥ 0.3.7, on local or remote machine, with relay plugin enabled and listening on a port with protocol "weechat"
+
### Install via source distribution
+Look at the Makefile and customize the variables; then
```
-$ pip install .
+$ make install
```
## WeeChat setup
-You have to add a relay port in WeeChat, for example on port 1234:
-
+You have to add a relay port in WeeChat.
+Follow the normal instructions for adding a ```relay``` to
+[weechat](https://github.com/weechat/weechat)
+```
+/relay add weechat 9000
+/relay start weechat
+```
+or
```
-/set relay.network.password "mypass"
-/relay add weechat 1234
+weechat -r '/relay add weechat 9000;/relay start weechat'
+```
+and run qweechat either under toxygen, or standalone
+```
+python3 -m qweechat
```
## Connect to WeeChat
@@ -68,4 +79,6 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QWeeChat. If not, see .
+## Updates
+
Up-to-date code is on https://git.plastiras.org/emdee/qweechat
diff --git a/qweechat/__main__.py b/qweechat/__main__.py
new file mode 100644
index 0000000..73872d4
--- /dev/null
+++ b/qweechat/__main__.py
@@ -0,0 +1,124 @@
+import os
+import sys
+import logging
+
+from qtpy import QtWidgets, QtGui, QtCore
+from qtpy.QtWidgets import QApplication
+
+global LOG
+LOG = logging.getLogger('qweechat')
+
+def iMain(lArgs=None):
+ try:
+ from qweechat import qweechat
+ from qweechat.config import write
+ LOG.info("Loading WeechatConsole")
+ except ImportError as e:
+ LOG.error(f"ImportError Loading import qweechat {e} {sys.path}")
+ LOG.debug(traceback.print_exc())
+ text = f"ImportError Loading import qweechat {e} {sys.path}"
+ title = util_ui.tr('Error importing qweechat')
+ util_ui.message_box(text, title)
+ return 1
+
+ from qtpy.QtWidgets import QApplication
+ _app = QApplication([])
+
+ # is this still needed?
+ if sys.platform == 'Linux' and \
+ hasattr(QtCore.Qt, 'AA_X11InitThreads'):
+ QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_X11InitThreads)
+
+ try:
+ # WeeChat backported from PySide6 to PyQt5
+ LOG.info("Adding WeechatConsole")
+ class WeechatConsole(qweechat.MainWindow):
+ def __init__(self, *args):
+ qweechat.MainWindow.__init__(self, *args)
+
+ def closeEvent(self, event):
+ """Called when QWeeChat window is closed."""
+ self.network.disconnect_weechat()
+ if self.network.debug_dialog:
+ self.network.debug_dialog.close()
+ write(self.config)
+ except Exception as e:
+ LOG.exception(f"ERROR WeechatConsole {e}")
+ MainWindow = None
+ return 2
+ size = 12
+ font_name = "Courier New"
+ font_name = "DejaVu Sans Mono"
+
+ try:
+ LOG.info("Creating WeechatConsole")
+ _we = WeechatConsole()
+ _we.show()
+ _we.setWindowTitle('File/Connect to 127.0.0.1:9000')
+ # Fix the pyconsole geometry
+ try:
+ font = _we.buffers[0].widget.chat.defaultFont()
+ font.setFamily(font_name)
+ font.setBold(True)
+ if font_width is None:
+ font_width = QFontMetrics(font).width('M')
+ _we.setFont(font)
+ except Exception as e:
+# LOG.debug(e)
+ font_width = size
+ geometry = _we.geometry()
+ # make this configable?
+ geometry.setWidth(int(font_width*70))
+ geometry.setHeight(int(font_width*(2+24)*11/8))
+ _we.setGeometry(geometry)
+ #? QtCore.QSize()
+ _we.resize(int(font_width*80+20), int(font_width*(2+24)*11/8))
+
+ _we.list_buffers.setSizePolicy(QtWidgets.QSizePolicy.Preferred,
+ QtWidgets.QSizePolicy.Preferred)
+ _we.stacked_buffers.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Expanding)
+
+ LOG.info("Showing WeechatConsole")
+ _we.show()
+ # or _we.eval_in_thread()
+#? return 0
+ except Exception as e:
+ LOG.exception(f"Error creating WeechatConsole {e}")
+ return 4
+
+ LOG.info("_execute_app")
+
+ # self._app.lastWindowClosed.connect(self._app.quit)
+ while True:
+ try:
+ _app.exec_()
+ except Exception as ex:
+ LOG.error('Unhandled exception: ' + str(ex))
+ return 5
+ else:
+ pass # break
+
+
+if __name__ == '__main__':
+ iRet = 0
+ try:
+ iRet = iMain(sys.argv[1:])
+ except KeyboardInterrupt:
+ iRet = 0
+ except SystemExit as e:
+ iRet = e
+ except Exception as e:
+ import traceback
+ sys.stderr.write(f"Exception from main {e}" \
+ +'\n' + traceback.format_exc() +'\n' )
+ iRet = 1
+
+ # Exception ignored in:
+ # File "/usr/lib/python3.9/threading.py", line 1428, in _shutdown
+ # lock.acquire()
+ # gevent.exceptions.LoopExit as e:
+ # This operation would block forever
+# sys.stderr.write('Calling sys.exit' +'\n')
+# sys.exit(iRet)
+