From a18d5200e0bce9d04bf0a2c8ea4b0a0480fef0ae Mon Sep 17 00:00:00 2001 From: Andy Stewart Date: Mon, 23 Sep 2019 12:48:58 +0800 Subject: [PATCH] Fix #59 issue, elisp handle key binding. --- core/browser_buffer.py | 44 ++++++++++++++++++++++++++++-------------- core/buffer.py | 6 ++++++ docs/HACKING.md | 14 -------------- eaf.el | 24 ++++++++++++++++++++++- eaf.py | 13 ++++++++----- 5 files changed, 67 insertions(+), 34 deletions(-) diff --git a/core/browser_buffer.py b/core/browser_buffer.py index 515cfe2..f50ca50 100644 --- a/core/browser_buffer.py +++ b/core/browser_buffer.py @@ -42,17 +42,33 @@ class BrowserBuffer(Buffer): def scroll(self, scroll_direction, scroll_type): webview_scroll(self, scroll_direction, scroll_type) - def send_keystroke(self, keystroke): - if keystroke == "M-f": - self.buffer_widget.forward() - elif keystroke == "M-b": - self.buffer_widget.back() - elif keystroke == "M-q": - self.buffer_widget.clean_cookie() - self.message_to_emacs.emit("Clean all cookie") - elif keystroke == "C--": - self.buffer_widget.zoom_out() - elif keystroke == "C-=": - self.buffer_widget.zoom_in() - elif keystroke == "C-0": - self.buffer_widget.zoom_reset() + def history_backward(self): + self.buffer_widget.back() + + def history_forward(self): + self.buffer_widget.forward() + + def clean_all_cookie(self): + self.buffer_widget.clean_cookie() + self.message_to_emacs.emit("Clean all cookie") + + def zoom_out(self): + self.buffer_widget.zoom_out() + + def zoom_in(self): + self.buffer_widget.zoom_in() + + def zoom_reset(self): + self.buffer_widget.zoom_reset() + + def scroll_up(self): + self.buffer_widget.web_page.runJavaScript("window.scrollBy(0, 50)") + + def scroll_down(self): + self.buffer_widget.web_page.runJavaScript("window.scrollBy(0, -50)") + + def scroll_to_begin(self): + self.buffer_widget.web_page.runJavaScript("window.scrollTo(0, 0)") + + def scroll_to_bottom(self): + self.buffer_widget.web_page.runJavaScript("window.scrollBy(0, document.body.scrollHeight)") diff --git a/core/buffer.py b/core/buffer.py index 4eba2f7..1e2781d 100644 --- a/core/buffer.py +++ b/core/buffer.py @@ -123,3 +123,9 @@ class Buffer(QGraphicsScene): def update_with_data(self, update_data): pass + + def execute_function(self, function_name): + getattr(self, function_name)() + + + diff --git a/docs/HACKING.md b/docs/HACKING.md index 7a06d18..0b0e45b 100644 --- a/docs/HACKING.md +++ b/docs/HACKING.md @@ -195,20 +195,6 @@ You need to implement the interface "update_with_data". Below is an example of w Argument "update_data" is passed from elisp side. -### Handle Emacs keystroke - -If you want to handle keystrokes that's been sent from Emacs, you need to implement the interface "send_keystroke" of your Buffer. Below is an example of what browser does: - -```Python - def send_keystroke(self, keystroke): - if keystroke == "M-f": - self.buffer_widget.forward() - elif keystroke == "M-b": - self.buffer_widget.back() -``` - -Argument "keystroke" is emacs key string. - ### Update progress. If your application will do some long-time operation, you can use below use below interfaces of buffer: diff --git a/eaf.el b/eaf.el index 85923fa..a750d4f 100644 --- a/eaf.el +++ b/eaf.el @@ -357,7 +357,29 @@ We need calcuate render allocation to make sure no black border around render co (equal 1 (string-width (this-command-keys)))) (eaf-call "send_key" buffer-id key-desc)) ((string-match "^[CMSs]-.*" key-desc) - (eaf-call "send_keystroke" buffer-id key-desc)) + (cond ((equal buffer-app-name "browser") + (cond ((equal key-desc "M-f") + (eaf-call "execute_function" buffer-id "history_forward")) + ((equal key-desc "M-b") + (eaf-call "execute_function" buffer-id "history_backward")) + ((equal key-desc "M-q") + (eaf-call "execute_function" buffer-id "clean_all_cookie")) + ((equal key-desc "C--") + (eaf-call "execute_function" buffer-id "zoom_out")) + ((equal key-desc "C-=") + (eaf-call "execute_function" buffer-id "zoom_in")) + ((equal key-desc "C-0") + (eaf-call "execute_function" buffer-id "zoom_reset")) + ((equal key-desc "C-n") + (eaf-call "execute_function" buffer-id "scroll_up")) + ((equal key-desc "C-p") + (eaf-call "execute_function" buffer-id "scroll_down")) + ((equal key-desc "M-<") + (eaf-call "execute_function" buffer-id "scroll_to_begin")) + ((equal key-desc "M->") + (eaf-call "execute_function" buffer-id "scroll_to_bottom")) + ))) + ) ((or (equal key-command "nil") (equal key-desc "RET") diff --git a/eaf.py b/eaf.py index b4bd9f2..d34eb35 100755 --- a/eaf.py +++ b/eaf.py @@ -230,15 +230,18 @@ class EAF(dbus.service.Object): self.buffer_dict.pop(buffer_id, None) @dbus.service.method(EAF_DBUS_NAME, in_signature="ss", out_signature="") - def send_key(self, buffer_id, event_string): - # Send event to buffer when found match buffer. + def execute_function(self, buffer_id, function_name): if buffer_id in self.buffer_dict: - fake_key_event(event_string, self.buffer_dict[buffer_id]) + try: + self.buffer_dict[buffer_id].execute_function(function_name) + except AttributeError: + self.message_to_emacs("Can't call function: " + function_name) @dbus.service.method(EAF_DBUS_NAME, in_signature="ss", out_signature="") - def send_keystroke(self, buffer_id, keystroke): + def send_key(self, buffer_id, event_string): + # Send event to buffer when found match buffer. if buffer_id in self.buffer_dict: - self.buffer_dict[buffer_id].send_keystroke(keystroke) + fake_key_event(event_string, self.buffer_dict[buffer_id]) @dbus.service.method(EAF_DBUS_NAME, in_signature="sss", out_signature="") def handle_input_message(self, buffer_id, callback_type, callback_result):