update eaf package
This commit is contained in:
@@ -19,8 +19,8 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from PyQt5.QtCore import QUrl, QTimer, QEvent, QPointF, Qt
|
||||
from PyQt5.QtGui import QColor, QMouseEvent
|
||||
from PyQt5.QtCore import QUrl, QTimer, QPointF, Qt
|
||||
from PyQt5.QtGui import QColor
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
from core.browser import BrowserBuffer
|
||||
from core.utils import PostGui, get_free_port, interactive
|
||||
@@ -30,6 +30,9 @@ import signal
|
||||
import threading
|
||||
import getpass
|
||||
import json
|
||||
from urllib import request
|
||||
from http.server import SimpleHTTPRequestHandler
|
||||
from socketserver import TCPServer
|
||||
|
||||
class AppBuffer(BrowserBuffer):
|
||||
def __init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module_path):
|
||||
@@ -37,81 +40,105 @@ class AppBuffer(BrowserBuffer):
|
||||
|
||||
# Get free port.
|
||||
self.port = get_free_port()
|
||||
self.http_url = "http://127.0.0.1:{0}".format(get_free_port())
|
||||
self.url = url
|
||||
|
||||
arguments_dict = json.loads(arguments)
|
||||
self.command = arguments_dict["command"]
|
||||
self.start_directory = arguments_dict["directory"]
|
||||
self.current_directory = self.start_directory
|
||||
self.index_file = os.path.join(os.path.dirname(__file__), "index.html")
|
||||
self.executing_command = ""
|
||||
self.index_file = "{0}/index.html".format(self.http_url)
|
||||
self.server_js = os.path.join(os.path.dirname(__file__), "server.js")
|
||||
|
||||
self.buffer_widget.titleChanged.connect(self.change_title)
|
||||
|
||||
http_thread = threading.Thread(target=self.run_http_server, args=())
|
||||
http_thread.start()
|
||||
|
||||
self.search_term = ""
|
||||
|
||||
# Start server process.
|
||||
args = ["node", self.server_js, str(self.port), self.start_directory, self.command]
|
||||
self.background_process = subprocess.Popen(
|
||||
"node {0} {1} '{2}' '{3}'".format(self.server_js, self.port, self.start_directory, self.command),
|
||||
args,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
shell=True)
|
||||
shell=False)
|
||||
|
||||
self.open_terminal_page()
|
||||
|
||||
self.reset_default_zoom()
|
||||
|
||||
QTimer.singleShot(250, self.focus_terminal)
|
||||
QTimer.singleShot(250, self.focus_widget)
|
||||
|
||||
self.build_all_methods(self)
|
||||
|
||||
|
||||
self.timer=QTimer()
|
||||
self.timer.start(250)
|
||||
self.timer.timeout.connect(self.on_change_directory)
|
||||
self.timer.timeout.connect(self.checking_status)
|
||||
|
||||
def focus_terminal(self):
|
||||
event = QMouseEvent(QEvent.MouseButtonPress, QPointF(0, 0), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
|
||||
QApplication.sendEvent(self.buffer_widget.focusProxy(), event)
|
||||
def run_http_server(self):
|
||||
class Handler(SimpleHTTPRequestHandler):
|
||||
def __init__(self, *args, **kwargs):
|
||||
# directory=os.path.dirname(__file__), This argument add in python3.7 after
|
||||
super().__init__(*args, **kwargs)
|
||||
def translate_path(self, path):
|
||||
# On python3.7 before version, http server don't support setting directory
|
||||
# default use the project path.
|
||||
path = super().translate_path(path)
|
||||
return os.path.dirname(__file__) + path[len(os.getcwd()):]
|
||||
with TCPServer(("127.0.0.1", int(self.http_url.split(":")[-1])), Handler) as h:
|
||||
h.serve_forever()
|
||||
|
||||
@PostGui()
|
||||
def open_terminal_page(self):
|
||||
theme = "light"
|
||||
if self.emacs_var_dict["eaf-terminal-dark-mode"] == "true" or \
|
||||
(self.emacs_var_dict["eaf-terminal-dark-mode"] == "" and self.emacs_var_dict["eaf-emacs-theme-mode"] == "dark"):
|
||||
(self.emacs_var_dict["eaf-terminal-dark-mode"] == "follow" and self.emacs_var_dict["eaf-emacs-theme-mode"] == "dark"):
|
||||
theme = "dark"
|
||||
with open(self.index_file, "r") as f:
|
||||
html = f.read().replace("%1", str(self.port)).replace("%2", "file://" + os.path.join(os.path.dirname(__file__))).replace("%3", theme).replace("%4", self.emacs_var_dict["eaf-terminal-font-size"]).replace("%5", self.current_directory)
|
||||
|
||||
with request.urlopen(self.index_file) as f:
|
||||
html = f.read().decode("utf-8").replace("%1", str(self.port)).replace("%2", self.http_url).replace("%3", theme).replace("%4", self.emacs_var_dict["eaf-terminal-font-size"]).replace("%5", self.current_directory).replace("%6", self.emacs_var_dict["eaf-terminal-font-family"])
|
||||
self.buffer_widget.setHtml(html)
|
||||
|
||||
def on_change_directory(self):
|
||||
changed_directory = self.buffer_widget.execute_js("title")
|
||||
if not str(changed_directory) == self.current_directory:
|
||||
self.update_title()
|
||||
self.eval_in_emacs.emit('''(setq default-directory "'''+ str(changed_directory) +'''")''')
|
||||
self.current_directory = str(changed_directory)
|
||||
def checking_status(self):
|
||||
changed_directory = str(self.buffer_widget.execute_js("title"))
|
||||
changed_executing_command = str(self.buffer_widget.execute_js("executing_command"))
|
||||
if len(changed_executing_command) > 30:
|
||||
changed_executing_command = changed_executing_command[:30]
|
||||
|
||||
def update_title(self):
|
||||
self.change_title(self.buffer_widget.execute_js("title"))
|
||||
if changed_executing_command != self.executing_command and changed_executing_command != "":
|
||||
self.change_title(changed_executing_command)
|
||||
self.executing_command = changed_executing_command
|
||||
elif changed_executing_command == "" and self.executing_command != "" or not changed_directory == self.current_directory:
|
||||
self.change_title(changed_directory)
|
||||
if not changed_directory == self.current_directory:
|
||||
self.eval_in_emacs.emit('eaf--change-default-directory', [changed_directory])
|
||||
self.current_directory = changed_directory
|
||||
if self.executing_command != "":
|
||||
self.executing_command = ""
|
||||
|
||||
if subprocess.Popen.poll(self.background_process) is not None:
|
||||
self.destroy_buffer()
|
||||
|
||||
def destroy_buffer(self):
|
||||
os.kill(self.background_process.pid, signal.SIGKILL)
|
||||
super().destroy_buffer()
|
||||
self.close_buffer()
|
||||
self.timer.stop()
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def copy_text(self):
|
||||
text = self.buffer_widget.execute_js("get_selection();")
|
||||
if text == "":
|
||||
self.message_to_emacs.emit("Nothing selected")
|
||||
else:
|
||||
clipboard = QApplication.clipboard()
|
||||
clipboard.setText(text)
|
||||
self.set_clipboard_text(text)
|
||||
self.message_to_emacs.emit("Copy text")
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def yank_text(self):
|
||||
text = QApplication.clipboard().text()
|
||||
self.buffer_widget.eval_js("paste('{}');".format(text))
|
||||
text = self.get_clipboard_text()
|
||||
self.buffer_widget.eval_js("paste(`{}`);".format(text))
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def scroll_other_buffer(self, scroll_direction, scroll_type):
|
||||
if scroll_type == "page":
|
||||
if scroll_direction == "up":
|
||||
@@ -124,27 +151,27 @@ class AppBuffer(BrowserBuffer):
|
||||
else:
|
||||
self.scroll_down()
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def scroll_up(self):
|
||||
self.buffer_widget.eval_js("scroll_line(1);")
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def scroll_down(self):
|
||||
self.buffer_widget.eval_js("scroll_line(-1);")
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def scroll_up_page(self):
|
||||
self.buffer_widget.eval_js("scroll_page(1);")
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def scroll_down_page(self):
|
||||
self.buffer_widget.eval_js("scroll_page(-1);")
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def scroll_to_begin(self):
|
||||
self.buffer_widget.eval_js("scroll_to_begin();")
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def scroll_to_bottom(self):
|
||||
self.buffer_widget.eval_js("scroll_to_bottom();")
|
||||
|
||||
@@ -154,6 +181,9 @@ class AppBuffer(BrowserBuffer):
|
||||
def clear_selection(self):
|
||||
self.buffer_widget.eval_js("clear_selection();")
|
||||
|
||||
def clear(self):
|
||||
self.buffer_widget.eval_js("clear();")
|
||||
|
||||
def _search_text(self, text, is_backward = False):
|
||||
if self.search_term != text:
|
||||
self.search_term = text
|
||||
@@ -164,27 +194,27 @@ class AppBuffer(BrowserBuffer):
|
||||
# self.web_page.findText(self.search_term)
|
||||
self.buffer_widget.eval_js("find_prev('{}')".format(text))
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def search_text_forward(self):
|
||||
if self.search_term == "":
|
||||
self.buffer.send_input_message("Forward Search Text: ", "search_text_forward")
|
||||
self.send_input_message("Forward Search Text: ", "search_text_forward")
|
||||
else:
|
||||
self._search_text(self.search_term)
|
||||
|
||||
@interactive()
|
||||
@interactive
|
||||
def search_text_backward(self):
|
||||
if self.search_term == "":
|
||||
self.buffer.send_input_message("Backward Search Text: ", "search_text_backward")
|
||||
self.send_input_message("Backward Search Text: ", "search_text_backward")
|
||||
else:
|
||||
self._search_text(self.search_term, True)
|
||||
|
||||
@interactive()
|
||||
def search_quit(self):
|
||||
@interactive
|
||||
def action_quit(self):
|
||||
if self.search_term != "":
|
||||
self._search_text("")
|
||||
|
||||
def handle_input_message(self, result_tag, result_content):
|
||||
if result_tag == "search_text_forward":
|
||||
self.buffer_widget._search_text(str(result_content))
|
||||
elif result_tag == "search_text_backward":
|
||||
self.buffer_widget._search_text(str(result_content), True)
|
||||
def handle_input_response(self, callback_tag, result_content):
|
||||
if callback_tag == "search_text_forward":
|
||||
self._search_text(str(result_content))
|
||||
elif callback_tag == "search_text_backward":
|
||||
self._search_text(str(result_content), True)
|
||||
|
||||
Reference in New Issue
Block a user