fix: segfault gtk when using webkit

This commit is contained in:
Johannes Kirschbauer
2024-05-18 15:55:59 +02:00
committed by hsjobeki
parent e25bd69c68
commit 4cfc335e2c
4 changed files with 62 additions and 27 deletions

View File

@@ -7,7 +7,6 @@ from pathlib import Path
from typing import Any, Union
import gi
from clan_cli import machines
gi.require_version("WebKit", "6.0")
@@ -90,6 +89,8 @@ class WebView:
handler_fn = self.method_registry[method_name]
# Start handler_fn in a new thread
# GLib.idle_add(handler_fn)
thread = threading.Thread(
target=self.threaded_handler,
args=(handler_fn, payload.get("data"), method_name),
@@ -107,6 +108,8 @@ class WebView:
def call_js(self, method_name: str, serialized: str) -> bool:
# This function must be run on the main GTK thread to interact with the webview
# result = method_fn(data) # takes very long
# serialized = result
self.webview.evaluate_javascript(
f"""
window.clan.{method_name}(`{serialized}`);
@@ -120,11 +123,3 @@ class WebView:
def get_webview(self) -> WebKit.WebView:
return self.webview
webview = WebView()
@webview.method
def list_machines(data: None) -> list[str]:
return machines.list.list_machines(".")

View File

@@ -2,6 +2,7 @@ import logging
import threading
import gi
from clan_cli import machines
from clan_cli.history.list import list_history
from clan_vm_manager.components.interfaces import ClanConfig
@@ -11,7 +12,7 @@ from clan_vm_manager.singletons.use_vms import ClanStore
from clan_vm_manager.views.details import Details
from clan_vm_manager.views.list import ClanList
from clan_vm_manager.views.logs import Logs
from clan_vm_manager.views.webview import webview
from clan_vm_manager.views.webview import WebView
gi.require_version("Adw", "1")
@@ -59,6 +60,13 @@ class MainWindow(Adw.ApplicationWindow):
stack_view.add_named(ClanList(config), "list")
stack_view.add_named(Details(), "details")
stack_view.add_named(Logs(), "logs")
webview = WebView()
@webview.method
def list_machines(data: None) -> list[str]:
return machines.list.list_machines(".")
stack_view.add_named(webview.get_webview(), "webview")
stack_view.set_visible_child_name(config.initial_view)