Changes
4 changed files (+126/-15)
-
-
@@ -24,13 +24,15 @@ );} protected override void activate() { var settings = new Settings("jp.pocka.plac.gtk-adwaita"); var settings = new Settings(); var connected_server_id = settings.get_string("connected-server-id"); var connected_server_token = settings.get_string("connected-server-token"); var selector = new ServerSelector.Window(this); selector.start(); if (settings.connected_server_id == "") { var selector = new ServerSelector.Window(this); selector.start(); } else { var main_window = new MainWindow.from_server_id(this, settings.connected_server_id); main_window.start(); } } public static int main(string[] args) {
-
-
-
@@ -28,17 +28,32 @@yield; return (owned) result; } public async Plac.Discovery.ScanResult? find_async(string server_id) { GLib.SourceFunc callback = find_async.callback; Plac.Discovery.ScanResult? result = null; new GLib.Thread<void>("server-find", () => { result = Plac.Discovery.find(server_id); GLib.Idle.add((owned) callback); }); yield; return (owned) result; } } public class AsyncConnection : GLib.Object { private Connection conn; private GLib.Thread<void>? thread; private bool is_closed; private GLib.Thread<void>? thread = null; private bool is_closed = false; public AsyncConnection(Discovery.Server server) { this.conn = new Connection(server, null); this.thread = null; this.is_closed = false; } public AsyncConnection.with_token(Discovery.Server server, string token) { this.conn = new Connection(server, token); } public signal void connection_started();
-
-
-
@@ -0,0 +1,38 @@// Copyright 2025 Shota FUJI // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // SPDX-License-Identifier: Apache-2.0 namespace PlacGtkAdwaita { private const string CONNECTED_SERVER_ID = "connected-server-id"; private const string CONNECTED_SERVER_TOKEN = "connected-server-token"; public class Settings { public GLib.Settings settings; public Settings() { settings = new GLib.Settings("jp.pocka.plac.gtk-adwaita"); } public string connected_server_id { owned get { return settings.get_string(CONNECTED_SERVER_ID); } set { settings.set_string(CONNECTED_SERVER_ID, value); } } public string connected_server_token { owned get { return settings.get_string(CONNECTED_SERVER_TOKEN); } set { settings.set_string(CONNECTED_SERVER_TOKEN, value); } } } }
-
-
-
@@ -26,8 +26,12 @@[GtkChild] private unowned PlaybackToolbar playback_toolbar; private Plac.Discovery.Server server; private Plac.AsyncConnection conn; private Settings settings = new Settings(); private Plac.Discovery.Server? server = null; private Plac.AsyncConnection? conn = null; private string server_id; public MainWindow(Gtk.Application app, Plac.Discovery.Server server) { (typeof (ServerConnecting)).ensure();
-
@@ -36,9 +40,36 @@Object(application: app); this.server = server; this.conn = new Plac.AsyncConnection(server); this.server_id = server.id; } public MainWindow.from_server_id(Gtk.Application app, string server_id) { (typeof (ServerConnecting)).ensure(); (typeof (PlaybackToolbar)).ensure(); Object(application: app); this.server_id = server_id; } public void start() { root_stack.visible_child_name = "loading"; if (conn != null) { listen_events(); } else { resolve_server.begin((obj, res) => { resolve_server.end(res); listen_events(); }); } this.present(); } private void listen_events() { test_label.label = server.name; conn.connection_started.connect(() => { root_stack.visible_child_name = "loading"; });
-
@@ -46,7 +77,8 @@conn.connected.connect((event) => { root_stack.visible_child_name = "main"; stderr.printf("Token=%s\n", event.token); settings.connected_server_id = server_id; settings.connected_server_token = event.token; }); conn.connection_error.connect((event) => {
-
@@ -62,10 +94,34 @@playback_toolbar.listen(conn); conn.activate(); } private async void resolve_server() { GLib.SourceFunc callback = resolve_server.callback; this.present(); Plac.Discovery.find_async.begin(server_id, (obj, res) => { var result = Plac.Discovery.find_async.end(res); if (result.code != OK) { GLib.log("Plac", LEVEL_ERROR, "Failed to find server: %s", result.code.to_string()); // TODO: Display error message Idle.add((owned) callback); return; } test_label.label = server.name; if (result.servers.length < 1) { GLib.log("Plac", LEVEL_ERROR, "Server not found: ID=%s", server_id); // TODO: Display error message Idle.add((owned) callback); return; } server = result.servers[0]; conn = new Plac.AsyncConnection.with_token(server, settings.connected_server_token); Idle.add((owned) callback); }); yield; } } }
-