Native UI #1

Open
julia wants to merge 7 commits from jj/native into main
3 changed files with 37 additions and 36 deletions
Showing only changes of commit ab7ad33086 - Show all commits

View file

@ -1,7 +1,7 @@
{ {
"id" : "space.arimelody.LiveSchedule", "id" : "space.arimelody.LiveSchedule",
"runtime" : "org.gnome.Platform", "runtime" : "org.gnome.Platform",
"runtime-version" : "48", "runtime-version" : "master",
"sdk" : "org.gnome.Sdk", "sdk" : "org.gnome.Sdk",
"command" : "liveschedule", "command" : "liveschedule",
"finish-args" : [ "finish-args" : [

66
main.js
View file

@ -14,6 +14,8 @@ let schedule = {
const offlineTitle = 'OFFLINE'; const offlineTitle = 'OFFLINE';
const offlineSubtitle = 'takin a nap'; const offlineSubtitle = 'takin a nap';
let copyClipboard;
let saveImage;
document.addEventListener('readystatechange', () => { document.addEventListener('readystatechange', () => {
document.getElementById('version').innerText = VERSION; document.getElementById('version').innerText = VERSION;
@ -118,7 +120,7 @@ if ('webkit' in window && 'messageHandlers' in window.webkit) {
let _promiseId = 0; let _promiseId = 0;
let _promises = new Map(); let _promises = new Map();
window.webkit.messageHandlers._nativePromiseResolved.addEventListener('message', (event) => { window.addEventListener('message', (event) => {
const [id] = event.detail; const [id] = event.detail;
const [resolve,] = _promises.get(id) ?? []; const [resolve,] = _promises.get(id) ?? [];
if (!resolve) return; if (!resolve) return;
@ -126,7 +128,7 @@ if ('webkit' in window && 'messageHandlers' in window.webkit) {
resolve(); resolve();
}); });
window.webkit.messageHandlers._nativePromiseRejected.addEventListener('message', (event) => { window.addEventListener('message', (event) => {
const [id] = event.detail; const [id] = event.detail;
const [,reject] = _promises.get(id) ?? []; const [,reject] = _promises.get(id) ?? [];
if (!reject) return; if (!reject) return;
@ -134,45 +136,41 @@ if ('webkit' in window && 'messageHandlers' in window.webkit) {
reject(); reject();
}); });
function copyClipboard() { copyClipboard = () => new Promise((resolve, reject) => {
return new Promise((resolve, reject) => { const thisPromiseId = ++_promiseId;
const thisPromiseId = ++promiseId;
_promises.set(thisPromiseId, [resolve, reject]); _promises.set(thisPromiseId, [resolve, reject]);
const schedule = document.getElementById('schedule'); const schedule = document.getElementById('schedule');
const boundingRect = getBoundingClientRect(); const boundingRect = schedule.getBoundingClientRect();
window.webkit.messageHandlers.copySnapshot.postMessage([ window.webkit.messageHandlers.copySnapshot.postMessage([
thisPromiseId, thisPromiseId,
'clipboard', 'clipboard',
boundingRect.x, boundingRect.x + 1,
boundingRect.y, boundingRect.y + 1,
boundingRect.width, boundingRect.width - 2,
boundingRect.height, boundingRect.height - 2,
]); ]);
}); });
}
function saveImage() { saveImage = () => new Promise((resolve, reject) => {
return new Promise((resolve, reject) => { const thisPromiseId = ++_promiseId;
const thisPromiseId = ++promiseId;
_promises.set(thisPromiseId, [resolve, reject]); _promises.set(thisPromiseId, [resolve, reject]);
const schedule = document.getElementById('schedule'); const schedule = document.getElementById('schedule');
const boundingRect = getBoundingClientRect(); const boundingRect = schedule.getBoundingClientRect();
window.webkit.messageHandlers.copySnapshot.postMessage([ window.webkit.messageHandlers.copySnapshot.postMessage([
thisPromiseId, thisPromiseId,
'file', 'file',
boundingRect.x, boundingRect.x + 1,
boundingRect.y, boundingRect.y + 1,
boundingRect.width, boundingRect.width - 2,
boundingRect.height, boundingRect.height - 2,
]); ]);
}); });
}
document.getElementById('clipboard').removeAttribute('disabled'); document.getElementById('clipboard').removeAttribute('disabled');
document.getElementById('save-image').removeAttribute('disabled'); document.getElementById('save-image').removeAttribute('disabled');

View file

@ -34,11 +34,14 @@ static void ls_web_view_constructed(GObject *object) {
ls_web_view_on_resource_request, ls_web_view_on_resource_request,
NULL, NULL); NULL, NULL);
WebKitSettings *settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(object));
webkit_settings_set_enable_developer_extras(settings, TRUE);
WebKitUserContentManager *manager = webkit_web_view_get_user_content_manager(web_view); WebKitUserContentManager *manager = webkit_web_view_get_user_content_manager(web_view);
webkit_user_content_manager_register_script_message_handler(manager, "copySnapshot", NULL);
g_signal_connect(manager, "script-message-received::copySnapshot", g_signal_connect(manager, "script-message-received::copySnapshot",
G_CALLBACK(ls_web_view_on_snapshot_message_received), G_CALLBACK(ls_web_view_on_snapshot_message_received),
g_object_ref(object)); g_object_ref(object));
webkit_user_content_manager_register_script_message_handler(manager, "copySnapshot", NULL);
webkit_web_view_load_uri(web_view, "gresource:///space/arimelody/LiveSchedule/webview/index.html"); webkit_web_view_load_uri(web_view, "gresource:///space/arimelody/LiveSchedule/webview/index.html");
} }