Merge pull request #11 from martensitingale/master
don't spawn a subprocess to parse dates
This commit is contained in:
commit
b9c0489019
|
@ -24,7 +24,6 @@ executable(
|
||||||
'src/AccountManager.vala',
|
'src/AccountManager.vala',
|
||||||
'src/NetManager.vala',
|
'src/NetManager.vala',
|
||||||
'src/Utils.vala',
|
'src/Utils.vala',
|
||||||
'src/CmdRunner.vala',
|
|
||||||
'src/Notificator.vala',
|
'src/Notificator.vala',
|
||||||
'src/API/Account.vala',
|
'src/API/Account.vala',
|
||||||
'src/API/Relationship.vala',
|
'src/API/Relationship.vala',
|
||||||
|
|
|
@ -4,7 +4,6 @@ src/SettingsManager.vala
|
||||||
src/AccountManager.vala
|
src/AccountManager.vala
|
||||||
src/NetManager.vala
|
src/NetManager.vala
|
||||||
src/Utils.vala
|
src/Utils.vala
|
||||||
src/CmdRunner.vala
|
|
||||||
src/API/StatusVisibility.vala
|
src/API/StatusVisibility.vala
|
||||||
src/API/NotificationType.vala
|
src/API/NotificationType.vala
|
||||||
src/API/Attachment.vala
|
src/API/Attachment.vala
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
public class Tootle.CmdRunner : GLib.Object{
|
|
||||||
|
|
||||||
public signal void done(int exit);
|
|
||||||
public signal void output_changed(string text);
|
|
||||||
public signal void standard_changed(string text);
|
|
||||||
public signal void error_changed(string text);
|
|
||||||
|
|
||||||
public string standard_output_str = "";
|
|
||||||
public string error_output_str = "";
|
|
||||||
public string output_str = "";
|
|
||||||
|
|
||||||
GLib.IOChannel out_make;
|
|
||||||
GLib.IOChannel error_out;
|
|
||||||
string dir;
|
|
||||||
string command;
|
|
||||||
Pid pid;
|
|
||||||
|
|
||||||
public CmdRunner(string dir, string command){
|
|
||||||
this.dir = dir;
|
|
||||||
this.command = command;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run(){
|
|
||||||
int standard_output = 0;
|
|
||||||
int standard_error = 0;
|
|
||||||
try{
|
|
||||||
Process.spawn_async_with_pipes(dir,
|
|
||||||
command.split(" "),
|
|
||||||
null,
|
|
||||||
SpawnFlags.DO_NOT_REAP_CHILD,
|
|
||||||
null,
|
|
||||||
out pid,
|
|
||||||
null,
|
|
||||||
out standard_output,
|
|
||||||
out standard_error);
|
|
||||||
}
|
|
||||||
catch(Error e){
|
|
||||||
critical("Couldn't launch command %s in the directory %s: %s", command, dir, e.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
ChildWatch.add(pid, (pid, exit) => {
|
|
||||||
Process.close_pid (pid);
|
|
||||||
error_out.shutdown (false);
|
|
||||||
out_make.shutdown (false);
|
|
||||||
done(exit);
|
|
||||||
});
|
|
||||||
|
|
||||||
out_make = new GLib.IOChannel.unix_new(standard_output);
|
|
||||||
out_make.add_watch(IOCondition.IN | IOCondition.HUP, (source, condition) => {
|
|
||||||
if(condition == IOCondition.HUP){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
string output = null;
|
|
||||||
|
|
||||||
try{
|
|
||||||
out_make.read_line(out output, null, null);
|
|
||||||
}
|
|
||||||
catch(Error e){
|
|
||||||
critical("Error in the output retrieving of %s: %s", command, e.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
standard_output_str += output;
|
|
||||||
output_str += output;
|
|
||||||
standard_changed(output);
|
|
||||||
output_changed(output);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
error_out = new GLib.IOChannel.unix_new(standard_error);
|
|
||||||
error_out.add_watch(IOCondition.IN | IOCondition.HUP, (source, condition) => {
|
|
||||||
if(condition == IOCondition.HUP){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
string output = null;
|
|
||||||
try{
|
|
||||||
error_out.read_line(out output, null, null);
|
|
||||||
}
|
|
||||||
catch(Error e){
|
|
||||||
critical("Error in the output retrieving of %s: %s", command, e.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
error_output_str += output;
|
|
||||||
output_str += output;
|
|
||||||
error_changed(output);
|
|
||||||
output_changed(output);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -199,7 +199,9 @@ public class Tootle.StatusWidget : Gtk.EventBox {
|
||||||
title_acct.label = "@" + formal.account.acct;
|
title_acct.label = "@" + formal.account.acct;
|
||||||
content_label.label = formal.content;
|
content_label.label = formal.content;
|
||||||
content_label.mentions = formal.mentions;
|
content_label.mentions = formal.mentions;
|
||||||
parse_date_iso8601 (formal.created_at);
|
|
||||||
|
var datetime = parse_date_iso8601 (formal.created_at);
|
||||||
|
title_date.label = Granite.DateTime.get_relative_datetime (datetime);
|
||||||
|
|
||||||
reblogs.label = formal.reblogs_count.to_string ();
|
reblogs.label = formal.reblogs_count.to_string ();
|
||||||
favorites.label = formal.favourites_count.to_string ();
|
favorites.label = formal.favourites_count.to_string ();
|
||||||
|
@ -224,17 +226,12 @@ public class Tootle.StatusWidget : Gtk.EventBox {
|
||||||
return status.get_formal ().spoiler_text != null || status.get_formal ().sensitive;
|
return status.get_formal ().spoiler_text != null || status.get_formal ().sensitive;
|
||||||
}
|
}
|
||||||
|
|
||||||
// elementary OS has old GLib, so I have to improvise
|
private GLib.DateTime? parse_date_iso8601 (string date) {
|
||||||
// Version >=2.56 provides DateTime.from_iso8601
|
var timeval = GLib.TimeVal();
|
||||||
public void parse_date_iso8601 (string date) {
|
if (timeval.from_iso8601 (date)) {
|
||||||
var cmd = "date -d " + date + " +%s";
|
return new GLib.DateTime.from_timeval_local (timeval);
|
||||||
var runner = new CmdRunner ("/bin/", cmd); //Workaround for Granite SimpleCommand pipes bug
|
}
|
||||||
runner.done.connect (exit => {
|
return null;
|
||||||
date_utc = int64.parse (runner.standard_output_str);
|
|
||||||
var date_obj = new GLib.DateTime.from_unix_local (date_utc);
|
|
||||||
title_date.label = Granite.DateTime.get_relative_datetime (date_obj);
|
|
||||||
});
|
|
||||||
runner.run ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool on_avatar_clicked () {
|
public bool on_avatar_clicked () {
|
||||||
|
|
Loading…
Reference in New Issue