From 0fddf6d39ab768066857c6c5dffdb87550f347df Mon Sep 17 00:00:00 2001 From: Andy Stewart Date: Sat, 21 Jul 2018 08:36:55 +0800 Subject: [PATCH] support pop window, such as emacs-china.org --- core/browser.py | 14 ++++++++++++-- eaf.el | 22 +++++++++++++++++++--- eaf.py | 47 ++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/core/browser.py b/core/browser.py index 838abd6..1449a5e 100644 --- a/core/browser.py +++ b/core/browser.py @@ -41,6 +41,9 @@ class BrowserView(QtWebEngineWidgets.QWebEngineView): self.web_page = BrowserPage() self.setPage(self.web_page) + def createWindow(self, window_type): + return self.create_new_browser_window_callback() + def event(self, event): if event.type() == QEvent.ChildAdded: obj = event.child() @@ -55,15 +58,21 @@ class BrowserView(QtWebEngineWidgets.QWebEngineView): clicked_url = hit.linkUrl() base_url = hit.baseUrl() - if clicked_url != base_url and clicked_url != '': + + if clicked_url != None and base_url != None and clicked_url != base_url and clicked_url != '': result = "" + if 'http://' in clicked_url or 'https://' in clicked_url: result = clicked_url elif clicked_url == "#": result = base_url + clicked_url else: + # Don't open url in EAF if clicked_url is not start with http/ftp or # result = "http://" + base_url.split("/")[2] + clicked_url + event.accept() + return False + modifiers = QApplication.keyboardModifiers() if modifiers != Qt.ControlModifier: @@ -76,7 +85,8 @@ class BrowserView(QtWebEngineWidgets.QWebEngineView): return True event.accept() - return True + return False + elif event.type() == QEvent.MouseButtonPress: if event.button() == MOUSE_FORWARD_BUTTON: self.forward() diff --git a/eaf.el b/eaf.el index a4ca481..253263c 100644 --- a/eaf.el +++ b/eaf.el @@ -219,14 +219,14 @@ We need calcuate render allocation to make sure no black border around render co (list x y w h))) (defun eaf-generate-id () - (format "%04x%04x-%04x-%04x-%04x-%06x%06x" + (format "%04x-%04x-%04x-%04x-%04x-%04x-%04x" (random (expt 16 4)) (random (expt 16 4)) (random (expt 16 4)) (random (expt 16 4)) (random (expt 16 4)) - (random (expt 16 6)) - (random (expt 16 6)) )) + (random (expt 16 4)) + (random (expt 16 4)) )) (defun eaf-create-buffer (input-content) (let ((eaf-buffer (generate-new-buffer (truncate-string-to-width input-content eaf-title-length)))) @@ -394,6 +394,22 @@ We need calcuate render allocation to make sure no black border around render co ) )))))))) +(dbus-register-signal + :session "com.lazycat.eaf" "/com/lazycat/eaf" + "com.lazycat.eaf" "create_new_browser_buffer" + 'eaf-create-new-browser-buffer) + +(defun eaf-create-new-browser-buffer (new-window-buffer-id) + (let ((eaf-buffer (generate-new-buffer (concat "browser popup window " new-window-buffer-id)))) + (with-current-buffer eaf-buffer + (eaf-mode) + (read-only-mode) + (set (make-local-variable 'buffer-id) new-window-buffer-id) + (set (make-local-variable 'buffer-url) "") + (set (make-local-variable 'buffer-app-name) "browser") + ) + (switch-to-buffer eaf-buffer))) + (dbus-register-signal :session "com.lazycat.eaf" "/com/lazycat/eaf" "com.lazycat.eaf" "focus_emacs_buffer" diff --git a/eaf.py b/eaf.py index 0611bbf..36f0026 100755 --- a/eaf.py +++ b/eaf.py @@ -74,12 +74,34 @@ class EAF(dbus.service.Object): if buffer_id in self.buffer_dict: self.buffer_dict[buffer_id].scroll(scroll_direction, scroll_type) + def get_new_browser_window_buffer_id(self): + import secrets + + return "{0}-{1}-{2}-{3}-{4}-{5}-{6}".format( + secrets.token_hex(2), + secrets.token_hex(2), + secrets.token_hex(2), + secrets.token_hex(2), + secrets.token_hex(2), + secrets.token_hex(2), + secrets.token_hex(2)) + + def create_new_browser_window(self): + # Generate buffer id same as eaf.el does. + buffer_id = self.get_new_browser_window_buffer_id() + + # Create buffer for create new browser window. + app_buffer = self.create_buffer(buffer_id, "http://0.0.0.0", "app.browser.buffer") + + # Create emacs buffer with buffer id. + self.create_new_browser_buffer(buffer_id) + + # Return new QWebEngineView for create new browser window. + return app_buffer.buffer_widget + def create_app(self, buffer_id, url, module_path): try: - module = importlib.import_module(module_path) - buf = module.AppBuffer(buffer_id, url) - buf.module_path = module_path - self.create_buffer(buffer_id, buf) + self.create_buffer(buffer_id, url, module_path) return "" except ImportError: @@ -87,9 +109,14 @@ class EAF(dbus.service.Object): traceback.print_exc() return "Something wrong when import {0}".format(module_path) - def create_buffer(self, buffer_id, app_buffer): + def create_buffer(self, buffer_id, url, module_path): global emacs_width, emacs_height + # Create application buffer. + module = importlib.import_module(module_path) + app_buffer = module.AppBuffer(buffer_id, url) + app_buffer.module_path = module_path + # Add buffer to buffer dict. self.buffer_dict[buffer_id] = app_buffer @@ -104,9 +131,15 @@ class EAF(dbus.service.Object): # Send message to emacs. app_buffer.input_message.connect(self.input_message) + # Add create new window callback if module is browser + if module_path == "app.browser.buffer": + app_buffer.buffer_widget.create_new_browser_window_callback = self.create_new_browser_window + # Restore buffer session. self.restore_buffer_session(app_buffer) + return app_buffer + @dbus.service.method(EAF_DBUS_NAME, in_signature="s", out_signature="") def update_views(self, args): global emacs_xid @@ -218,6 +251,10 @@ class EAF(dbus.service.Object): def input_message(self, buffer_id, message, callback_type): pass + @dbus.service.signal("com.lazycat.eaf") + def create_new_browser_buffer(self, buffer_id): + pass + def save_buffer_session(self, buf): # Create config file it not exist. if not os.path.exists(self.session_file_path):