/* window.vala * * Copyright 2023 Mubashshir * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ namespace JadupcSupport { [GtkTemplate (ui = "/com/jadupc/support/ui/window.ui")] public class Window : Gtk.ApplicationWindow { [GtkChild] private unowned Gtk.Label session; [GtkChild] private unowned Gtk.InfoBar infobar; [GtkChild] private unowned Gtk.Stack view; [GtkChild] private unowned Vte.Terminal terminal; [GtkChild] private unowned Gtk.Button sessionbutton; [GtkChild] private unowned Gtk.Label infobarText; [GtkChild] private unowned Gtk.Image infobarIcon; public Window (Gtk.Application app) { var lang = Environment.get_variable("LANG"); // fix locale for Vte.Terminal Environment.set_variable("LANG", "en_US", true); // fix locale for Vte.Terminal Object (application: app); Environment.set_variable("LANG", lang, true); // fix locale for Vte.Terminal utils.realize_all(this); // Realize all children to pacify Gtk. icon_name = "com.jadupc.support"; infobar.response.connect(() => infobar.set_revealed(false)); sessionbutton.clicked.connect(() => { if (infobar.revealed) infobar.revealed = false; session.label = _("Connecting..."); view.visible_child_name = "inprogress"; Timeout.add_once(3000, () => on_session_connect("test@tty.jadupc.com")); }); terminal.child_exited.connect(status => { if(status > 0) show_in_infobar(ERROR, _("Error: %s").printf(utils.strret(status))); reset_window(); }); show_in_infobar(INFO, _("Welcome to JaduPc Remote Support Console!")); } internal void show_in_infobar(Gtk.MessageType type, string message) { infobarIcon.icon_name = utils.get_message_icon(type); infobarText.label = message; infobar.message_type = type; infobar.revealed = true; } private void reset_window() { session.label = _("Disconnected..."); Timeout.add_once(view.transition_duration, () => terminal.reset(true, true)); view.visible_child_name = "session"; } private void spawn_async_cb(Vte.Terminal term, Pid pid, Error? error) { if(pid > 1) return; reset_window(); show_in_infobar(ERROR, error.message); } private void on_session_connect(string url) { session.label = @"ssh://$url"; view.visible_child_name = "terminal"; terminal.has_focus = true; terminal.spawn_async(Vte.PtyFlags.DEFAULT, "~", {"sh"}, {@"PATH=$(Config.SECURE_PATH)"}, SpawnFlags.SEARCH_PATH_FROM_ENVP, null, -1, null, spawn_async_cb); } } }