修复输入法跟随; 增加代理设置API
parent
d2f08af833
commit
80d486e87b
|
@ -2,9 +2,9 @@
|
||||||
# @author yutent<yutent.io@gmail.com>
|
# @author yutent<yutent.io@gmail.com>
|
||||||
# @date 2023/08/31 11:55:25
|
# @date 2023/08/31 11:55:25
|
||||||
|
|
||||||
|
|
||||||
|
from ._version import *
|
||||||
|
|
||||||
from ._webengine import WebEngine
|
from ._webengine import WebEngine
|
||||||
from ._settings import create_setting
|
from ._settings import create_setting
|
||||||
from ._hotreload import create_hmr_server
|
from ._hotreload import create_hmr_server
|
||||||
|
|
||||||
build = (0, 3, 0)
|
|
||||||
version = '.'.join(map(str, build))
|
|
||||||
|
|
|
@ -11,13 +11,14 @@ from gi.repository import WebKit2
|
||||||
|
|
||||||
|
|
||||||
class Inject:
|
class Inject:
|
||||||
def __init__(self, webview):
|
def __init__(self, webview, env = {}):
|
||||||
|
|
||||||
self.manager = webview.get_user_content_manager()
|
self.manager = webview.get_user_content_manager()
|
||||||
|
|
||||||
script_data = open(self.abspath('./inject.js'), 'r').read()
|
script_data = open(self.abspath('./inject.js'), 'r').read()
|
||||||
frame = WebKit2.UserContentInjectedFrames.ALL_FRAMES
|
frame = WebKit2.UserContentInjectedFrames.ALL_FRAMES
|
||||||
time = WebKit2.UserScriptInjectionTime.END
|
time = WebKit2.UserScriptInjectionTime.END
|
||||||
|
script_data = script_data.replace("'{{env}}'", json.dumps(env))
|
||||||
script = WebKit2.UserScript(script_data, frame, time, None, None)
|
script = WebKit2.UserScript(script_data, frame, time, None, None)
|
||||||
|
|
||||||
self.manager.add_script(script)
|
self.manager.add_script(script)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import gi, os
|
||||||
gi.require_version("WebKit2", "4.1")
|
gi.require_version("WebKit2", "4.1")
|
||||||
|
|
||||||
from gi.repository import WebKit2
|
from gi.repository import WebKit2
|
||||||
|
from ._version import version
|
||||||
|
|
||||||
|
|
||||||
class Settings(WebKit2.Settings):
|
class Settings(WebKit2.Settings):
|
||||||
|
@ -21,7 +22,7 @@ class Settings(WebKit2.Settings):
|
||||||
self.set_javascript_can_open_windows_automatically(True)
|
self.set_javascript_can_open_windows_automatically(True)
|
||||||
|
|
||||||
|
|
||||||
self.set_user_agent_with_application_details('WebEngine', '0.3.0')
|
self.set_user_agent_with_application_details('WebEngine', version)
|
||||||
|
|
||||||
|
|
||||||
# indexedDB 和 localStorage 和 离线缓存
|
# indexedDB 和 localStorage 和 离线缓存
|
||||||
|
@ -72,6 +73,7 @@ def create_setting(options = None):
|
||||||
if options is not None:
|
if options is not None:
|
||||||
if options.get('devtools'):
|
if options.get('devtools'):
|
||||||
setting.enable_devtools()
|
setting.enable_devtools()
|
||||||
|
setting.mock_devices()
|
||||||
|
|
||||||
if options.get('useragent'):
|
if options.get('useragent'):
|
||||||
setting.set_useragent(options.get('useragent'))
|
setting.set_useragent(options.get('useragent'))
|
||||||
|
@ -82,6 +84,7 @@ def create_setting(options = None):
|
||||||
if options.get('disable_fullscreen'):
|
if options.get('disable_fullscreen'):
|
||||||
setting.disable_fullscreen()
|
setting.disable_fullscreen()
|
||||||
|
|
||||||
|
|
||||||
def wrapper(app, extra = None):
|
def wrapper(app, extra = None):
|
||||||
app.set_settings(setting)
|
app.set_settings(setting)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
build = (0, 3, 0)
|
||||||
|
version = '.'.join(map(str, build))
|
|
@ -3,7 +3,7 @@
|
||||||
# @date 2023/08/08 14:07:26
|
# @date 2023/08/08 14:07:26
|
||||||
|
|
||||||
|
|
||||||
import gi, os, json, shutil, hashlib
|
import gi, os, json, shutil, hashlib, time, threading
|
||||||
|
|
||||||
gi.require_version("WebKit2", "4.1")
|
gi.require_version("WebKit2", "4.1")
|
||||||
|
|
||||||
|
@ -52,6 +52,18 @@ def noop():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# 类型js的settimeout的修饰器
|
||||||
|
def set_timeout(timeout = 0.5):
|
||||||
|
def decorator(callback):
|
||||||
|
def wrapper(*args):
|
||||||
|
t = threading.Timer(timeout, callback, args=args)
|
||||||
|
t.start()
|
||||||
|
return t
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
class WebEngine(WebKit2.WebView):
|
class WebEngine(WebKit2.WebView):
|
||||||
|
|
||||||
__gsignals__ = {
|
__gsignals__ = {
|
||||||
|
@ -77,14 +89,10 @@ class WebEngine(WebKit2.WebView):
|
||||||
|
|
||||||
|
|
||||||
im = self.get_input_method_context()
|
im = self.get_input_method_context()
|
||||||
im.set_enable_preedit(True)
|
|
||||||
|
|
||||||
# 解决输入法候选框跟随问题
|
# 解决输入法候选框跟随问题
|
||||||
im.connect('preedit-started', self.on_preedit_changed)
|
im.set_enable_preedit(False)
|
||||||
im.connect('preedit-changed', self.on_preedit_changed)
|
|
||||||
im.connect('preedit-finished', self.on_preedit_changed)
|
|
||||||
|
|
||||||
Inject(self).connect(self.called_by_js)
|
Inject(self, env).connect(self.called_by_js)
|
||||||
|
|
||||||
|
|
||||||
def set_root(self, root):
|
def set_root(self, root):
|
||||||
|
@ -103,14 +111,6 @@ class WebEngine(WebKit2.WebView):
|
||||||
self.load_uri(f"app://{url}")
|
self.load_uri(f"app://{url}")
|
||||||
|
|
||||||
|
|
||||||
def on_preedit_changed(self, im):
|
|
||||||
seat = self.display.get_default_seat()
|
|
||||||
p = seat.get_pointer().get_position() # 光标位置
|
|
||||||
x, y = self.get_position() # 窗口位置
|
|
||||||
|
|
||||||
im.notify_focus_in()
|
|
||||||
im.notify_cursor_area(p.x - x, p.y - y, 0, 0) # 修正输入法跟随
|
|
||||||
|
|
||||||
|
|
||||||
def call_js(self, method, data = None, err = None):
|
def call_js(self, method, data = None, err = None):
|
||||||
if err is not None:
|
if err is not None:
|
||||||
|
@ -341,6 +341,23 @@ class WebEngine(WebKit2.WebView):
|
||||||
|
|
||||||
self.notify.create(title, summary, icon, progress, urgency, params.get('callback'))
|
self.notify.create(title, summary, icon, progress, urgency, params.get('callback'))
|
||||||
|
|
||||||
|
|
||||||
|
case 'proxy':
|
||||||
|
dm = self.get_website_data_manager()
|
||||||
|
output = True
|
||||||
|
if params['action'] == 'disable':
|
||||||
|
dm.set_network_proxy_settings(WebKit2.NetworkProxyMode.NO_PROXY, None)
|
||||||
|
elif params['action'] == 'system':
|
||||||
|
dm.set_network_proxy_settings(WebKit2.NetworkProxyMode.DEFAULT, None)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
proxy = WebKit2.NetworkProxySettings(params['url'], params['ignore'])
|
||||||
|
dm.set_network_proxy_settings(WebKit2.NetworkProxyMode.CUSTOM, proxy)
|
||||||
|
except Exception as err:
|
||||||
|
_error = err
|
||||||
|
output = False
|
||||||
|
|
||||||
|
|
||||||
case 'md5':
|
case 'md5':
|
||||||
output = hashlib.md5(str(params.get('value'))).hexdigest()
|
output = hashlib.md5(str(params.get('value'))).hexdigest()
|
||||||
|
|
||||||
|
|
|
@ -189,10 +189,8 @@ class EventEmitter {
|
||||||
window.native = new EventEmitter()
|
window.native = new EventEmitter()
|
||||||
|
|
||||||
Object.assign(native, {
|
Object.assign(native, {
|
||||||
async init() {
|
env: '{{env}}',
|
||||||
let env = await handler('init') //.then(r => (native.env = r))
|
|
||||||
native.env = env
|
|
||||||
},
|
|
||||||
quit() {
|
quit() {
|
||||||
return handler('quit', {}, null)
|
return handler('quit', {}, null)
|
||||||
},
|
},
|
||||||
|
@ -403,5 +401,17 @@ Object.assign(native, {
|
||||||
return handler('md5', { value })
|
return handler('md5', { value })
|
||||||
},
|
},
|
||||||
|
|
||||||
|
proxy: {
|
||||||
|
disable() {
|
||||||
|
return handler('proxy', { action: 'disable' })
|
||||||
|
},
|
||||||
|
system() {
|
||||||
|
return handler('proxy', { action: 'system' })
|
||||||
|
},
|
||||||
|
custom(url = '', ignore = null) {
|
||||||
|
return handler('proxy', { action: 'enable', url, ignore })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
handler
|
handler
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue