Commit 0fddf6d3 authored by Andy Stewart's avatar Andy Stewart
Browse files

support pop window, such as emacs-china.org

parent 109f7541
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -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()
+19 −3
Original line number Diff line number Diff line
@@ -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"
+42 −5
Original line number Diff line number Diff line
@@ -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):