From 6402ea4abc0d617fc4aa22e950cb2ec774a06fce Mon Sep 17 00:00:00 2001 From: Joaquin Date: Sat, 26 Aug 2023 01:41:13 +0300 Subject: [PATCH] [stdout_pipe] Implement functional stdout sync Implement functional real-time async function that livestreams stdout buffer of process to Gtk TextView --- Makefile | 2 +- Window.vala | 81 +++++++++++++++++++++++++++++++++------------------- nostalgia | Bin 0 -> 57720 bytes 3 files changed, 53 insertions(+), 30 deletions(-) create mode 100755 nostalgia diff --git a/Makefile b/Makefile index eae511d..d14d3d7 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ nostalgia: Main.vala Window.vala HeaderBar.vala Nostalgia.vala - valac --pkg libnotify --pkg gtk+-3.0 Main.vala Window.vala HeaderBar.vala Nostalgia.vala -o nostalgia + valac --pkg libnotify --pkg gtk+-3.0 --pkg gio-2.0 Main.vala Window.vala HeaderBar.vala Nostalgia.vala -o nostalgia install: nostalgia nostalgia-launcher.desktop cp ./nostalgia /usr/bin/ diff --git a/Window.vala b/Window.vala index f847055..792e693 100644 --- a/Window.vala +++ b/Window.vala @@ -173,11 +173,21 @@ so please be patient and let us get your system back and running"), true, false, string isft = crloc1.get_filename() + "/nostalgia.file: empty "; print(isfile); print(isft); + + var lbl = new Gtk.TextView(); + lbl.set_wrap_mode (Gtk.WrapMode.WORD); + lbl.set_monospace(true); + + var lblScroll = new Gtk.ScrolledWindow(null, null); + lblScroll.add(lbl); + lblScroll.set_max_content_height(100); + + progresscr.pack_start(lblScroll); //The length will never be the same if the file is not found if(isfile.char_count() != isft.char_count()){ print("\n root backup \n"); string testx; - Process.spawn_command_line_sync("bash command", out testx); + //Process.spawn_command_line_sync("bash command", out testx); progresscr.pack_start(new Gtk.Label(testx)); //print(testx); progresscr.pack_start(new Gtk.Label("This seems to be your first nostalgia backup on this harddrive, so it will take a while"), false, false, 10); @@ -188,34 +198,34 @@ so please be patient and let us get your system back and running"), true, false, int otcr; int dum; bool lop=true; - //Process.spawn_async_with_pipes(loc, {"rsync", "-a", "~/debian", "~/test", "--no-i-r"}, spawn_env1, SpawnFlags.SEARCH_PATH | SpawnFlags.DO_NOT_REAP_CHILD, null, out rpid, out dum, out otcr, out dum); - Process.spawn_async_with_pipes(loc, {"bash", "install"}, spawn_env1, SpawnFlags.SEARCH_PATH | SpawnFlags.DO_NOT_REAP_CHILD, null, out rpid, out dum, out otcr, out dum); - IOChannel outputcr = new IOChannel.unix_new(otcr); - outputcr.add_watch(IOCondition.IN | IOCondition.HUP, (channel, condition) => { - return process_line(channel, condition, "stdout", out laoutput, out upol); - }); - bool should_stop = false; - var ol = new Gtk.Label(laoutput); - ChildWatch.add(rpid, (pid, status) => { - Process.close_pid(rpid); - print("hihi"); - ssnap=false; - createstack.set_visible_child(cr1); - lop=false; - Notify.init("Nostalgia"); - var notification = new Notify.Notification("Nostalgia", "Your snapshot is ready", "deja-dup"); - notification.set_timeout(0); - notification.show(); - should_stop = true; - progresscr.remove(ol); - }); - progresscr.pack_start(ol, true, true, 10); - show_all(); - Timeout.add(750, () => { - ol.set_text(laoutput); - show_all(); - return should_stop ? Source.REMOVE : Source.CONTINUE; + + string[] backup_command = {"/usr/bin/rsync", "-av", "/home/ioachim/Music", "/home/ioachim/Music2", "--no-i-r", "--info=progress2", null}; + + var ChildProcessBackup = new Subprocess.newv(backup_command, SubprocessFlags.STDOUT_PIPE); + + ChildProcessBackup.wait_check_async.begin(null, (obj, res) => { + try{ + ChildProcessBackup.wait_check_async.end(res); + print("\n\n-------SUCCESFULL------\n\n"); + + ssnap = false; + createstack.set_visible_child(cr1); + Notify.init("Nostalgia"); + var notification = new Notify.Notification("Nostalgia", "Your snapshot is ready", "deja-dup"); + notification.set_timeout(0); + notification.show(); + + + }catch(Error err){ + print("\n\n------ERROR!!!------\n%s\n\n", err.message); + } }); + + + var OutputPipeBackup = ChildProcessBackup.get_stdout_pipe(); + + update_label_from_istream.begin(OutputPipeBackup, lbl); + } } }); @@ -231,6 +241,19 @@ so please be patient and let us get your system back and running"), true, false, set_resizable(false); show_all(); print("Hey, thanks for choosing nostalgia! \n"); - print("If you're looking at the debug output most probably you're having some trouble with this program, so feel free to email me at konicksdev@gmail.com and I'll see if I can help \n"); + print("If you're looking at the debug output most probably you're having some trouble with this program, so feel free to email me at [ioachim.radu@protonmail.com] and I'll see if I can help \n"); } } + + + +async void update_label_from_istream (InputStream istream, Gtk.TextView label) { + try { + var dis = new DataInputStream (istream); + var line = yield dis.read_line_async (); + while (line != null) { + label.buffer.text += line + "\n"; + line = yield dis.read_line_async (); + } + } catch (Error err) {} +} diff --git a/nostalgia b/nostalgia new file mode 100755 index 0000000000000000000000000000000000000000..24a36c02ecf19a349576182aaf7cf27ff517d67d GIT binary patch literal 57720 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 E51CvtB>(^b literal 0 HcmV?d00001