修复窗口移动API; 增加新窗口打开的支持
parent
ed5dcf1245
commit
1f2273150c
|
@ -0,0 +1,62 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import gi, os, json, shutil, hashlib, time, threading
|
||||||
|
|
||||||
|
gi.require_version('Gtk', '3.0')
|
||||||
|
gi.require_version("WebKit2", "4.1")
|
||||||
|
from gi.repository import GObject, Gtk, Gdk, WebKit2, GLib, Gio, GdkPixbuf
|
||||||
|
|
||||||
|
|
||||||
|
def create_same_window(origin, req):
|
||||||
|
w, h = origin.window.get_size()
|
||||||
|
win = Gtk.Window()
|
||||||
|
win.set_default_size(w, h)
|
||||||
|
web = WebKit2.WebView.new_with_related_view(origin)
|
||||||
|
web.load_request(req)
|
||||||
|
|
||||||
|
win.add(web)
|
||||||
|
win.show_all()
|
||||||
|
return web
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def create_custom_window(origin, options):
|
||||||
|
WebEngine = type(origin)
|
||||||
|
_w, _h = origin.window.get_size()
|
||||||
|
w = options.get('width') or _w
|
||||||
|
h = options.get('height') or _h
|
||||||
|
win = Gtk.Window()
|
||||||
|
win.set_default_size(w, h)
|
||||||
|
|
||||||
|
wmclass = options.get('wmclass') or 'WebEngine Window'
|
||||||
|
win.set_wmclass(wmclass, 'WebEngine')
|
||||||
|
win.set_title(options.get('title') or 'WebEngine')
|
||||||
|
|
||||||
|
if options.get('frame') == False:
|
||||||
|
win.set_decorated(False)
|
||||||
|
|
||||||
|
if options.get('x') is not None and options.get('y') is not None:
|
||||||
|
win.move(options.get('x'), options.get('y'))
|
||||||
|
|
||||||
|
if options.get('always_on_top') == True:
|
||||||
|
win.set_keep_above(options['always_on_top'])
|
||||||
|
|
||||||
|
if options.get('resizable') == False:
|
||||||
|
win.set_resizable(False)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
web = WebEngine(win)
|
||||||
|
# web = WebEngine(win, origin)
|
||||||
|
# web = WebKit2.WebView.new_with_related_view(origin)
|
||||||
|
# web = WebEngine.new_with(win, origin)
|
||||||
|
# web.window = win
|
||||||
|
web.set_root(origin.root, True)
|
||||||
|
web.set_zoom_level(origin.get_zoom_level())
|
||||||
|
web.set_settings(origin.get_settings())
|
||||||
|
web.load(options.get('url'))
|
||||||
|
|
||||||
|
win.add(web)
|
||||||
|
win.show_all()
|
||||||
|
return web
|
|
@ -1,6 +1,9 @@
|
||||||
|
|
||||||
import os
|
import gi, os
|
||||||
|
|
||||||
|
gi.require_version("WebKit2", "4.1")
|
||||||
from gi.repository import Gio, WebKit2
|
from gi.repository import Gio, WebKit2
|
||||||
|
|
||||||
from ._mimetypes import get_mimetype
|
from ._mimetypes import get_mimetype
|
||||||
from ._version import version
|
from ._version import version
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
import gi, os
|
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
|
from ._version import version
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
# @date 2023/07/28 14:39:33
|
# @date 2023/07/28 14:39:33
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
from gi.repository.GdkPixbuf import Pixbuf
|
gi.require_version('Gtk', '3.0')
|
||||||
|
from gi.repository import GdkPixbuf
|
||||||
|
|
||||||
def get_monitor_info(monitor):
|
def get_monitor_info(monitor):
|
||||||
return {
|
return {
|
||||||
|
@ -50,7 +51,7 @@ def pixbuf_to_dict(pixbuf, filename = ''):
|
||||||
|
|
||||||
def dict_to_pixbuf(data):
|
def dict_to_pixbuf(data):
|
||||||
if data:
|
if data:
|
||||||
image = Pixbuf.new_from_data(
|
image = GdkPixbuf.Pixbuf.new_from_data(
|
||||||
data = bytes(data['bytes']),
|
data = bytes(data['bytes']),
|
||||||
colorspace = data['colorspace'],
|
colorspace = data['colorspace'],
|
||||||
has_alpha = data['has_alpha'],
|
has_alpha = data['has_alpha'],
|
||||||
|
|
|
@ -10,6 +10,7 @@ gi.require_version("WebKit2", "4.1")
|
||||||
|
|
||||||
|
|
||||||
from gi.repository import GObject, Gtk, Gdk, WebKit2, GLib, Gio, GdkPixbuf
|
from gi.repository import GObject, Gtk, Gdk, WebKit2, GLib, Gio, GdkPixbuf
|
||||||
|
from ._custom_window import create_same_window, create_custom_window
|
||||||
|
|
||||||
|
|
||||||
# 优先尝试使用指示器, 没有再使用 Gtk.StatusIcon
|
# 优先尝试使用指示器, 没有再使用 Gtk.StatusIcon
|
||||||
|
@ -65,6 +66,7 @@ def set_timeout(timeout = 0.5):
|
||||||
return decorator
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class WebEngine(WebKit2.WebView):
|
class WebEngine(WebKit2.WebView):
|
||||||
|
|
||||||
__gsignals__ = {
|
__gsignals__ = {
|
||||||
|
@ -75,11 +77,17 @@ class WebEngine(WebKit2.WebView):
|
||||||
window = None
|
window = None
|
||||||
custom_bridge = None
|
custom_bridge = None
|
||||||
|
|
||||||
def __init__(self, window):
|
def __init__(self, win):
|
||||||
|
|
||||||
WebKit2.WebView.__init__(self)
|
WebKit2.WebView.__init__(self)
|
||||||
|
|
||||||
self.window = window
|
self.window = win
|
||||||
|
|
||||||
|
if win.get_title() is None:
|
||||||
|
win.set_title('WebEngine')
|
||||||
|
|
||||||
|
if win.get_icon() is None and win.get_icon_name() is None:
|
||||||
|
win.set_icon_name('web-browser')
|
||||||
|
|
||||||
self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
||||||
self.display = Gdk.Display.get_default()
|
self.display = Gdk.Display.get_default()
|
||||||
|
@ -101,21 +109,22 @@ class WebEngine(WebKit2.WebView):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 响应原生js的 window.open
|
||||||
def create_new_window(self, webview, nav):
|
def create_new_window(self, webview, nav):
|
||||||
req = nav.get_request()
|
req = nav.get_request()
|
||||||
w, h = self.window.get_size()
|
return create_same_window(self, req)
|
||||||
win = Gtk.Window()
|
|
||||||
web = WebEngine(win)
|
|
||||||
web.set_settings(self.get_settings())
|
# 手动创建窗口
|
||||||
web.set_zoom_level(self.get_zoom_level())
|
def new_window_by_custom(self, options = {}):
|
||||||
web.load_request(req)
|
return create_custom_window(self, options)
|
||||||
win.set_default_size(w, h)
|
|
||||||
win.add(web)
|
|
||||||
win.show_all()
|
|
||||||
|
|
||||||
|
|
||||||
def set_root(self, root):
|
def set_root(self, root, has_protocol = False):
|
||||||
self.root = root
|
self.root = root
|
||||||
|
|
||||||
|
if has_protocol:
|
||||||
|
return self
|
||||||
return self.use(create_protocal(root))
|
return self.use(create_protocal(root))
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,7 +134,7 @@ class WebEngine(WebKit2.WebView):
|
||||||
|
|
||||||
|
|
||||||
def load(self, url = '/index.html'):
|
def load(self, url = '/index.html'):
|
||||||
if url.startswith('http:') or url.startswith('https:'):
|
if url.startswith('http://') or url.startswith('https://'):
|
||||||
self.load_uri(url)
|
self.load_uri(url)
|
||||||
else:
|
else:
|
||||||
if self.root is None:
|
if self.root is None:
|
||||||
|
@ -133,8 +142,10 @@ class WebEngine(WebKit2.WebView):
|
||||||
else:
|
else:
|
||||||
if url.startswith('/'):
|
if url.startswith('/'):
|
||||||
self.load_uri(f"app://{url}")
|
self.load_uri(f"app://{url}")
|
||||||
|
elif url.startswith('app://'):
|
||||||
|
self.load_uri(url)
|
||||||
else:
|
else:
|
||||||
raise ValueError('url must starts with "/"')
|
raise ValueError('url must starts with "/" or "app://"')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,7 +182,7 @@ class WebEngine(WebKit2.WebView):
|
||||||
# 退出app
|
# 退出app
|
||||||
case 'quit':
|
case 'quit':
|
||||||
self.window.close()
|
self.window.close()
|
||||||
self.emit('quit')
|
# self.emit('quit')
|
||||||
|
|
||||||
# 读取图片, 返回图片像素数据
|
# 读取图片, 返回图片像素数据
|
||||||
case 'image':
|
case 'image':
|
||||||
|
@ -384,6 +395,10 @@ class WebEngine(WebKit2.WebView):
|
||||||
output = None
|
output = None
|
||||||
|
|
||||||
match(params.get('action')):
|
match(params.get('action')):
|
||||||
|
|
||||||
|
case 'create':
|
||||||
|
self.new_window_by_custom(params.get('options'))
|
||||||
|
|
||||||
case 'fullscreen':
|
case 'fullscreen':
|
||||||
self.window.fullscreen()
|
self.window.fullscreen()
|
||||||
|
|
||||||
|
@ -451,3 +466,4 @@ class WebEngine(WebKit2.WebView):
|
||||||
output = False
|
output = False
|
||||||
return (_error, output)
|
return (_error, output)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -339,6 +339,9 @@ Object.assign(native, {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
window: {
|
window: {
|
||||||
|
create(options = {}) {
|
||||||
|
return handler('window', { action: 'create', options })
|
||||||
|
},
|
||||||
isVisible() {
|
isVisible() {
|
||||||
return handler('window', { action: 'is_visible' })
|
return handler('window', { action: 'is_visible' })
|
||||||
},
|
},
|
||||||
|
@ -370,7 +373,7 @@ Object.assign(native, {
|
||||||
handler('window', { action: 'resize', value: { width, height } }, null)
|
handler('window', { action: 'resize', value: { width, height } }, null)
|
||||||
},
|
},
|
||||||
move(x = 0, y = 0) {
|
move(x = 0, y = 0) {
|
||||||
handler('window', { action: 'resize', value: { x, y } }, null)
|
handler('window', { action: 'move', value: { x, y } }, null)
|
||||||
},
|
},
|
||||||
setOpacity(opacity = 1) {
|
setOpacity(opacity = 1) {
|
||||||
handler('window', { action: 'set_opacity', value: opacity }, null)
|
handler('window', { action: 'set_opacity', value: opacity }, null)
|
||||||
|
|
Loading…
Reference in New Issue