diff --git a/app/browser/buffer.py b/app/browser/buffer.py index 7a8ae3259..a724b6018 100644 --- a/app/browser/buffer.py +++ b/app/browser/buffer.py @@ -52,6 +52,7 @@ def __init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module self.buffer_widget.open_url_in_background_tab.connect(self.open_url_in_background_tab) self.buffer_widget.urlChanged.connect(self.set_adblocker) + self.buffer_widget.urlChanged.connect(self.exit_caret_browsing) # Reset to default zoom when page init or url changed. self.reset_default_zoom() diff --git a/core/browser.py b/core/browser.py index edcd4d6f2..8aac3f324 100644 --- a/core/browser.py +++ b/core/browser.py @@ -568,6 +568,7 @@ class BrowserBuffer(Buffer): close_page = QtCore.pyqtSignal(str) get_focus_text = QtCore.pyqtSignal(str, str) open_dev_tools_tab = QtCore.pyqtSignal(object) + caret_browsing_status = QtCore.pyqtSignal(bool) def __init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module_path, fit_to_view): Buffer.__init__(self, buffer_id, url, arguments, emacs_var_dict, module_path, fit_to_view) @@ -965,64 +966,61 @@ def try_start_aria2_daemon(self): subprocess.Popen(aria2_args, stdout=null_file) - def caret_browsing(self): - ''' Init caret browsing.''' + def toggle_caret_browsing(self): + ''' toggle caret browsing.''' if self.eval_caret_js: - self.buffer_widget.eval_js("CaretBrowsing.setInitialCursor();") - self.message_to_emacs.emit("Caret browsing activated.") - self.caret_browsing_activated = True - self.caret_browsing_search_text = "" + if self.caret_browsing_activated: + self.buffer_widget.eval_js("CaretBrowsing.shutdown();") + self.message_to_emacs.emit("Caret browsing deactivated.") + self.caret_browsing_activated = False + self.caret_browsing_status.emit(self.caret_browsing_activated) + else: + self.buffer_widget.eval_js("CaretBrowsing.setInitialCursor();") + self.message_to_emacs.emit("Caret browsing activated.") + self.caret_browsing_activated = True + self.caret_browsing_search_text = "" + self.caret_browsing_status.emit(self.caret_browsing_activated) - def caret_exit(self): - ''' Exit caret browsing.''' + def exit_caret_browsing(self): if self.caret_browsing_activated: - self.buffer_widget.eval_js("CaretBrowsing.shutdown();") - self.message_to_emacs.emit("Caret browsing deactivated.") self.caret_browsing_activated = False + self.caret_browsing_status.emit(self.caret_browsing_activated) - @interactive(insert_or_do=True) def caret_next_line(self): ''' Switch to next line in caret browsing.''' if self.caret_browsing_activated: self.buffer_widget.eval_js("CaretBrowsing.move('forward', 'line');") - @interactive(insert_or_do=True) def caret_previous_line(self): ''' Switch to previous line in caret browsing.''' if self.caret_browsing_activated: self.buffer_widget.eval_js("CaretBrowsing.move('backward', 'line');") - @interactive(insert_or_do=True) def caret_next_character(self): ''' Switch to next character in caret browsing.''' if self.caret_browsing_activated: self.buffer_widget.eval_js("CaretBrowsing.move('forward', 'character');") - @interactive(insert_or_do=True) def caret_previous_character(self): ''' Switch to previous character in caret browsing.''' if self.caret_browsing_activated: self.buffer_widget.eval_js("CaretBrowsing.move('backward', 'character');") - @interactive(insert_or_do=True) def caret_next_word(self): ''' Switch to next word in caret browsing.''' if self.caret_browsing_activated: self.buffer_widget.eval_js("CaretBrowsing.move('forward', 'word');") - @interactive(insert_or_do=True) def caret_previous_word(self): ''' Switch to previous word in caret browsing.''' if self.caret_browsing_activated: self.buffer_widget.eval_js("CaretBrowsing.move('backward', 'word');") - @interactive(insert_or_do=True) def caret_to_bottom(self): ''' Switch to next word in caret browsing.''' if self.caret_browsing_activated: self.buffer_widget.eval_js("CaretBrowsing.move('forward', 'documentboundary');") - @interactive(insert_or_do=True) def caret_to_top(self): ''' Switch to previous word in caret browsing.''' if self.caret_browsing_activated: @@ -1046,7 +1044,6 @@ def caret_clear_search(self): self.caret_browsing_search_text = "" self.message_to_emacs.emit("Cleared caret search text.") - @interactive(insert_or_do=True) def caret_search_forward(self): ''' Search Text forward in caret browsing.''' if self.caret_browsing_activated: @@ -1056,7 +1053,6 @@ def caret_search_forward(self): else: self._caret_search_text(self.caret_browsing_search_text) - @interactive(insert_or_do=True) def caret_search_backward(self): ''' Search Text backward in caret browsing.''' if self.caret_browsing_activated: diff --git a/eaf.el b/eaf.el index 9f442c744..6e4e1ca96 100644 --- a/eaf.el +++ b/eaf.el @@ -297,7 +297,7 @@ Try not to modify this alist directly. Use `eaf-setq' to modify instead." ("C-y" . "yank_text") ("C-w" . "kill_text") ("M-e" . "edit_focus_text") - ("M-c" . "caret_browsing") + ("M-c" . "toggle_caret_browsing") ("M-D" . "select_text") ("M-s" . "open_link") ("M-S" . "open_link_new_buffer") @@ -317,19 +317,6 @@ Try not to modify this alist directly. Use `eaf-setq' to modify instead." ("M->" . "scroll_to_bottom") ("M-t" . "new_blank_page") ("SPC" . "insert_or_scroll_up_page") - ("C-q" . "caret_exit") - ("s" . "insert_or_caret_next_line") - ("w" . "insert_or_caret_previous_line") - ("d" . "insert_or_caret_next_character") - ("a" . "insert_or_caret_previous_character") - ("D" . "insert_or_caret_next_word") - ("A" . "insert_or_caret_previous_word") - ("S" . "insert_or_caret_to_bottom") - ("W" . "insert_or_caret_to_top") - ("/" . "insert_or_caret_search_forward") - ("?" . "insert_or_caret_search_backward") - ("C-i" . "caret_toggle_mark") - ("C-." . "caret_clear_search") ("J" . "insert_or_select_left_tab") ("K" . "insert_or_select_right_tab") ("j" . "insert_or_scroll_up") @@ -803,6 +790,81 @@ Python process only create application view when Emacs window or buffer state ch (defvar-local eaf-mindmap--current-add-mode nil) +(define-minor-mode eaf-browser-caret-mode + "EAF browser caret mode." + :keymap (let ((map (make-sparse-keymap))) + (define-key map (kbd "w") 'eaf-caret-previous-line) + (define-key map (kbd "s") 'eaf-caret-next-line) + (define-key map (kbd "d") 'eaf-caret-next-character) + (define-key map (kbd "a") 'eaf-caret-previous-character) + (define-key map (kbd "W") 'eaf-caret-to-top) + (define-key map (kbd "S") 'eaf-caret-to-bottom) + (define-key map (kbd "A") 'eaf-caret-previous-word) + (define-key map (kbd "D") 'eaf-caret-next-word) + (define-key map (kbd "/") 'eaf-caret-search-forward) + (define-key map (kbd "?") 'eaf-caret-search-backward) + (define-key map (kbd "C-o") 'eaf-caret-toggle-mark) + (define-key map (kbd "C-.") 'eaf-caret-clear-search) + map)) + +(dbus-register-signal + :session "com.lazycat.eaf" "/com/lazycat/eaf" + "com.lazycat.eaf" "toggle_caret_browsing" + #'eaf--toggle-caret-browsing) + +(defun eaf--toggle-caret-browsing (caret-status) + (if caret-status + (eaf-browser-caret-mode 1) + (eaf-browser-caret-mode 0))) + +(defun eaf-caret-previous-line () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_previous_line")) + +(defun eaf-caret-next-line () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_next_line")) + +(defun eaf-caret-next-character () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_next_character")) + +(defun eaf-caret-previous-character () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_previous_character")) + +(defun eaf-caret-to-top () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_to_top")) + +(defun eaf-caret-to-bottom () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_to_bottom")) + +(defun eaf-caret-previous-word () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_previous_word")) + +(defun eaf-caret-next-word () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_next_word")) + +(defun eaf-caret-search-forward () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_search_forward")) + +(defun eaf-caret-search-backward () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_search_backward")) + +(defun eaf-caret-toggle-mark () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_toggle_mark")) + +(defun eaf-caret-clear-search () + (interactive) + (eaf-call "call_function" eaf--buffer-id "caret_clear_search")) + (defun eaf-browser-restore-buffers () "EAF restore all opened EAF Browser buffers in the previous Emacs session. @@ -2207,6 +2269,22 @@ Make sure that your smartphone is connected to the same WiFi network as this com | C-c C-k | eaf-edit-buffer-cancel | | C-c C-t | eaf-edit-buffer-switch-to-org-mode | +* Browser Caret Browsing Mode + | Key | Event | + |---------+------------------------------------| + | w | eaf-caret-previous-line | + | s | eaf-caret-next-line | + | d | eaf-caret-next-character | + | a | eaf-caret-previous-character | + | W | eaf-caret-to-top | + | S | eaf-caret-to-bottom | + | A | eaf-caret-previous-word | + | D | eaf-caret-next-word | + | / | eaf-caret-search-forward | + | ? | eaf-caret-search-backward | + | C-o | eaf-caret-toggle-mark | + | C-. | eaf-caret-clear-search | + ") (dolist (var vars) (insert (format "* %s\n" (get var 'variable-documentation))) diff --git a/eaf.py b/eaf.py index bc18c6074..6408e154f 100755 --- a/eaf.py +++ b/eaf.py @@ -203,6 +203,10 @@ def create_buffer(self, buffer_id, url, module_path, arguments): if getattr(app_buffer.buffer_widget, "get_focus_text", False) and getattr(app_buffer.buffer_widget.get_focus_text, "connect", False): app_buffer.buffer_widget.get_focus_text.connect(self.edit_focus_text) + # Handle caret_browsing_status signal. + if getattr(app_buffer, "caret_browsing_status", False) and getattr(app_buffer.caret_browsing_status, "connect", False): + app_buffer.caret_browsing_status.connect(self.toggle_caret_browsing) + # Handle get_sub_node_id signal. if getattr(app_buffer, "get_sub_node_id", False) and getattr(app_buffer.get_sub_node_id, "connect", False): app_buffer.get_sub_node_id.connect(self.add_multiple_sub_nodes) @@ -517,6 +521,10 @@ def eval_in_emacs(self, elisp_code_string): def edit_focus_text(self, buffer_id, focus_text): pass + @dbus.service.signal(EAF_DBUS_NAME) + def toggle_caret_browsing(self, caret_status): + pass + @dbus.service.signal(EAF_DBUS_NAME) def export_org_json(self, org_json_content, org_file_path): pass