mirror of
https://github.com/Stremio/stremio-shell-ng.git
synced 2026-04-20 10:52:03 +00:00
Proof of concept RPC
This commit is contained in:
parent
5395c278a3
commit
4e12cf80ac
3 changed files with 110 additions and 6 deletions
39
Cargo.lock
generated
39
Cargo.lock
generated
|
|
@ -72,6 +72,12 @@ version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "0.4.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "js-sys"
|
name = "js-sys"
|
||||||
version = "0.3.51"
|
version = "0.3.51"
|
||||||
|
|
@ -343,11 +349,42 @@ version = "0.3.24"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
|
checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.126"
|
version = "1.0.126"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03"
|
checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.126"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.64"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "stremio-shell-ng"
|
name = "stremio-shell-ng"
|
||||||
|
|
@ -357,6 +394,8 @@ dependencies = [
|
||||||
"native-windows-derive",
|
"native-windows-derive",
|
||||||
"native-windows-gui",
|
"native-windows-gui",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"webview2",
|
"webview2",
|
||||||
"webview2-sys",
|
"webview2-sys",
|
||||||
"winapi",
|
"winapi",
|
||||||
|
|
|
||||||
|
|
@ -12,4 +12,6 @@ winapi = { version = "0.3.9", features = [
|
||||||
] }
|
] }
|
||||||
webview2 = "0.1.0"
|
webview2 = "0.1.0"
|
||||||
webview2-sys = "0.1.0-beta.1"
|
webview2-sys = "0.1.0-beta.1"
|
||||||
mpv = "0.2.3"
|
mpv = "0.2.3"
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
serde_json = "1.0"
|
||||||
|
|
@ -1,18 +1,50 @@
|
||||||
use native_windows_gui::{self as nwg, PartialUi};
|
use native_windows_gui::{self as nwg, PartialUi};
|
||||||
use once_cell::unsync::OnceCell;
|
use once_cell::unsync::OnceCell;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_json;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use webview2::Controller;
|
use webview2::Controller;
|
||||||
use winapi::shared::windef::HWND__;
|
use winapi::shared::windef::HWND__;
|
||||||
use winapi::um::winuser::*;
|
use winapi::um::winuser::*;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
struct RPCRequest {
|
||||||
|
id: u64,
|
||||||
|
args: Option<Vec<serde_json::Value>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
struct RPCResponseDataTransport {
|
||||||
|
properties: Vec<Vec<String>>,
|
||||||
|
signals: Vec<String>,
|
||||||
|
methods: Vec<Vec<String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
struct RPCResponseData {
|
||||||
|
transport: RPCResponseDataTransport,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
struct RPCResponse {
|
||||||
|
id: u64,
|
||||||
|
object: String,
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
response_type: u32,
|
||||||
|
data: RPCResponseData,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct WebView {
|
pub struct WebView {
|
||||||
controller: Rc<OnceCell<Controller>>,
|
controller: Rc<OnceCell<Controller>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WebView {
|
impl WebView {
|
||||||
fn resize_to_window_bounds(controller: Option<&Controller>, hwnd: Option<*mut HWND__>) {
|
fn resize_to_window_bounds_and_show(
|
||||||
|
controller: Option<&Controller>,
|
||||||
|
hwnd: Option<*mut HWND__>,
|
||||||
|
) {
|
||||||
if let (Some(controller), Some(hwnd)) = (controller, hwnd) {
|
if let (Some(controller), Some(hwnd)) = (controller, hwnd) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut rect = mem::zeroed();
|
let mut rect = mem::zeroed();
|
||||||
|
|
@ -38,7 +70,6 @@ impl PartialUi for WebView {
|
||||||
env.expect("Cannot obtain webview environment")
|
env.expect("Cannot obtain webview environment")
|
||||||
.create_controller(hwnd, move |controller| {
|
.create_controller(hwnd, move |controller| {
|
||||||
let controller = controller.expect("Cannot obtain webview controller");
|
let controller = controller.expect("Cannot obtain webview controller");
|
||||||
WebView::resize_to_window_bounds(Some(&controller), parent.hwnd());
|
|
||||||
if let Ok(controller2) = controller.get_controller2() {
|
if let Ok(controller2) = controller.get_controller2() {
|
||||||
controller2
|
controller2
|
||||||
.put_default_background_color(webview2_sys::Color {
|
.put_default_background_color(webview2_sys::Color {
|
||||||
|
|
@ -54,11 +85,43 @@ impl PartialUi for WebView {
|
||||||
let webview = controller
|
let webview = controller
|
||||||
.get_webview()
|
.get_webview()
|
||||||
.expect("Cannot obtain webview from controller");
|
.expect("Cannot obtain webview from controller");
|
||||||
// webview.navigate("edge://gpu").expect("Cannot load the webUI");
|
|
||||||
webview
|
webview
|
||||||
.navigate("https://www.boyanpetrov.rip/stremio/index.html")
|
.navigate("https://www.boyanpetrov.rip/stremio/index.html")
|
||||||
.expect("Cannot load the webUI");
|
.expect("Cannot load the webUI");
|
||||||
// controller.put_is_visible(true).expect("Cannot show the WebView");
|
webview
|
||||||
|
.add_script_to_execute_on_document_created(
|
||||||
|
r##"
|
||||||
|
window.qt={webChannelTransport:{send:window.chrome.webview.postMessage}};
|
||||||
|
window.chrome.webview.addEventListener('message',ev=>window.qt.webChannelTransport.onmessage(ev));
|
||||||
|
window.onload=()=>initShellComm();
|
||||||
|
"##,
|
||||||
|
|_| Ok(()),
|
||||||
|
)
|
||||||
|
.ok();
|
||||||
|
webview.add_web_message_received(|w, msg| {
|
||||||
|
let msg = msg.try_get_web_message_as_string()?;
|
||||||
|
let msg: RPCRequest = serde_json::from_str(&msg).unwrap();
|
||||||
|
dbg!(msg.clone());
|
||||||
|
if msg.id == 0 {
|
||||||
|
let resp: RPCResponse = RPCResponse {
|
||||||
|
id: 0,
|
||||||
|
object: "transport".to_string(),
|
||||||
|
response_type: 3,
|
||||||
|
data: RPCResponseData {
|
||||||
|
transport: RPCResponseDataTransport {
|
||||||
|
properties: vec![vec![], vec!["".to_string(), "shellVersion".to_string(), "".to_string(), "5.0.0".to_string()]],
|
||||||
|
signals: vec![],
|
||||||
|
methods: vec![vec!["onEvent".to_string(), "".to_string()]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let resp_json = serde_json::to_string(&resp).unwrap();
|
||||||
|
dbg!(resp_json.clone());
|
||||||
|
w.post_web_message_as_string(&resp_json).ok();
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}).ok();
|
||||||
|
WebView::resize_to_window_bounds_and_show(Some(&controller), parent.hwnd());
|
||||||
controller_clone
|
controller_clone
|
||||||
.set(controller)
|
.set(controller)
|
||||||
.expect("Cannot update the controller");
|
.expect("Cannot update the controller");
|
||||||
|
|
@ -83,7 +146,7 @@ impl PartialUi for WebView {
|
||||||
use nwg::Event as E;
|
use nwg::Event as E;
|
||||||
match evt {
|
match evt {
|
||||||
E::OnResize | E::OnWindowMaximize => {
|
E::OnResize | E::OnWindowMaximize => {
|
||||||
WebView::resize_to_window_bounds(self.controller.get(), handle.hwnd());
|
WebView::resize_to_window_bounds_and_show(self.controller.get(), handle.hwnd());
|
||||||
}
|
}
|
||||||
E::OnWindowMinimize => {
|
E::OnWindowMinimize => {
|
||||||
if let Some(controller) = self.controller.get() {
|
if let Some(controller) = self.controller.get() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue