#include "x11_ps.h" #include "blop_bookkeeper.h" #include "bloputils.h" #include "canvas.h" #include "config.h" #include <signal.h> #include <cstring> using namespace std; namespace blop { string &x11_ps::default_viewer_() { static bool called = false; static string viewer; if(!called) { if(!strcmp("BLOP_ARCH","darwin")) viewer = "open"; else { string user = getenv("USER"); if(system("which gv >/dev/null 2>&1") == 0) viewer = "gv"; else if(system(("pgrep -u " + user + " kwin >/dev/null").c_str()) == 0) { if(system("which okular >/dev/null 2>&1") == 0) viewer = "okular"; else if(system("which kde-open >/dev/null 2>&1") == 0) viewer = "kde-open"; else { warning::print("No postscript viewer found"); viewer = "no_postscript_viewer_found"; } } else if(system("which evince >/dev/null 2>&1") == 0) { warning::print("Using evince as default postscript viewer. " "It does NOT update automatically, so it will be pretty useless..."); viewer = "evince"; } else { warning::print("No postscript viewer found"); viewer = "no_postscript_viewer_found"; } } } return viewer; } string &x11_ps::default_options_() { static bool called = false; static string option; if(!called) { if(default_viewer_() == "gv") { string gv_options = readcmd("gv -h"); if(gv_options.find("-resize") != string::npos) option += " -resize "; if(gv_options.find("-media=") != string::npos) option += " -media=BBox "; else if(gv_options.find("-media ") != string::npos) option += " -media BBox "; if(gv_options.find("-spartan") != string::npos) option += " -spartan "; if(gv_options.find("-watch") != string::npos) option += " -watch "; } if(default_viewer_() == "open") { } called = true; } return option; } void x11_ps::default_viewer(const var &v) { default_viewer_() = v.str(); } void x11_ps::default_options(const var &o) { default_options_() = o.str(); } x11_ps &x11_ps::width(const var &s) { width_ = s.str(); return *this; } x11_ps &x11_ps::height(const var &s) { height_ = s.str(); return *this; } x11_ps &x11_ps::def() { static x11_ps g; return g; } void x11_ps::print() { canvas::current().print(&def()); } x11_ps::x11_ps() : blopeps(blop_bookkeeper::tmpfile("x11_ps_XXXXXX.beps")) { filename_eps_ = ""; width_ = "0.9\\linewidth"; height_ = "12cm"; options_ = default_options_(); } x11_ps::~x11_ps() { viewer_.kill(); } void x11_ps::picture_end() { blopeps::picture_end(); if(filename_eps_ == "") filename_eps_=blop_bookkeeper::tmpfile("x11_ps_XXXXXX.eps"); system("beps2eps -q -w '" + width_ + "' -h '" + height_ + "' " + filename_ + " " + filename_eps_); if(!viewer_.is_open()) { std::string cmd = default_viewer_() + " " + options_ + " " + filename_eps_; viewer_.open(cmd); } else { if(viewer_.cmd() == "gv") viewer_.kill(SIGHUP); } } }