From 68ec2b2c06ac59a13364e8853478d42d30c1f5d5 Mon Sep 17 00:00:00 2001 From: clerie Date: Sat, 27 Sep 2025 22:10:11 +0200 Subject: [PATCH] Show network offline banner --- src/application.vala | 43 +++++++++++++++++++++++++++++++++++++++++++ src/window.ui | 5 ++--- src/window.vala | 8 ++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/application.vala b/src/application.vala index fb29d57..91b4ab6 100644 --- a/src/application.vala +++ b/src/application.vala @@ -21,6 +21,9 @@ public class Allesapp.Application : Adw.Application { public signal void toast (string message, int timeout = 5); + public bool network_online { get; private set; default=true; } + public signal void network_online_changed (); + public Application () { Object ( application_id: "de.clerie.allesapp", @@ -37,6 +40,10 @@ public class Allesapp.Application : Adw.Application { }; this.add_action_entries (action_entries, this); this.set_accels_for_action ("app.quit", {"q"}); + + this.network_online_changed.connect(on_network_online_changed); + + GLib.Idle.add_once (on_check_network_online_loop); } public override void activate () { @@ -64,4 +71,40 @@ public class Allesapp.Application : Adw.Application { message ("app.preferences action activated"); } + private void on_check_network_online_loop () { + on_check_network_online (); + + GLib.Timeout.add_seconds_once (5, on_check_network_online_loop_cooldown_elapsed); + } + + private void on_check_network_online_loop_cooldown_elapsed () { + GLib.Idle.add_once (on_check_network_online_loop); + } + + private void on_check_network_online () { + var session = new Soup.Session (); + var msg = new Soup.Message ("GET", "http://ping.clerie.de/ping"); + + var old_network_online = app.network_online; + + try { + session.send (msg); + app.network_online = msg.status_code == 201; + } catch (Error e) { + app.network_online = false; + } + + if (old_network_online != app.network_online) { + app.network_online_changed (); + } + } + + private void on_network_online_changed () { + if (app.network_online) { + message ("Network online"); + } else { + message ("Network offline"); + } + } + } diff --git a/src/window.ui b/src/window.ui index 8d1821d..106b053 100644 --- a/src/window.ui +++ b/src/window.ui @@ -27,9 +27,8 @@ vertical - - True - Meow meow meow + + Network offline diff --git a/src/window.vala b/src/window.vala index 6127d4c..780306d 100644 --- a/src/window.vala +++ b/src/window.vala @@ -26,12 +26,16 @@ public class Allesapp.Window : Adw.ApplicationWindow { [GtkChild] private unowned Adw.ToastOverlay toast_overlay; + [GtkChild] + private unowned Adw.Banner network_offline; + public Window (Gtk.Application app) { Object (application: app); } construct { app.toast.connect (add_toast); + app.network_online_changed.connect (on_network_online_changed); } [GtkCallback] @@ -52,4 +56,8 @@ public class Allesapp.Window : Adw.ApplicationWindow { timeout = timeout }); } + + private void on_network_online_changed () { + network_offline.set_revealed (!app.network_online); + } }