1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
/*
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not
* distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
import std.stdio;
import std.array;
import std.experimental.logger;
import std.file;
import std.format;
import std.process;
import std.string;
import glib.FileUtils;
import glib.Util;
import gtk.Main;
import gtk.Version;
import gtk.MessageDialog;
import gx.i18n.l10n;
import gx.gtk.util;
import gx.gtk.vte;
import gx.tilix.application;
import gx.tilix.cmdparams;
import gx.tilix.constants;
int main(string[] args) {
static if (USE_FILE_LOGGING) {
sharedLog = new FileLogger("/tmp/tilix.log");
}
bool newProcess = false;
string group;
string cwd = Util.getCurrentDir();
string pwd;
string de;
trace("CWD = " ~ cwd);
try {
pwd = environment["PWD"];
de = environment["XDG_CURRENT_DESKTOP"];
trace("PWD = " ~ pwd);
} catch (Exception e) {
trace("No PWD environment variable found");
}
try {
environment.remove("WINDOWID");
} catch (Exception e) {
error("Unexpected error occurred", e);
}
string uhd = Util.getHomeDir();
trace("UHD = " ~ uhd);
//Debug args
foreach(i, arg; args) {
tracef("args[%d]=%s", i, arg);
}
// Look for execute command and convert it into a normal -e
// We do this because this switch means take everything after
// the switch as a command which GApplication options cannot handle
// without a callback which D doesn't expose at this time.
foreach(i, arg; args) {
if (arg == "-x" || arg == "-e") {
string executeCommand;
// Are we dealing with a single command that either
// has no spaces or been escaped by the user or a string
// of multiple commands
if (args.length == i + 2) {
trace("Single command");
executeCommand = args[i + 1];
} else {
for(size_t j=i+1; j<args.length; j++) {
if (j > i + 1) {
executeCommand ~= " ";
}
if (args[j].indexOf(" ") > 0) {
executeCommand ~= "\"" ~ replace(args[j], "\"", "\\\"") ~ "\"";
} else {
executeCommand ~= args[j];
}
}
}
trace("Execute Command: " ~ executeCommand);
args = args[0..i];
if (arg == "-x") {
args ~= "-e";
} else {
args ~= arg;
}
args ~= executeCommand;
break;
}
}
//textdomain
textdomain(TILIX_DOMAIN);
// Init GTK early so localization is available
// Note used to pass empty args but was interfering with GTK default args
Main.init(args);
trace(format("Starting tilix with %d arguments...", args.length));
foreach(i, arg; args) {
trace(format("arg[%d] = %s",i, arg));
// Workaround issue with Unity and older Gnome Shell when DBusActivatable sometimes CWD is set to /, see #285
if (arg == "--gapplication-service" && pwd == uhd && cwd == "/") {
info("Detecting DBusActivatable with improper directory, correcting by setting CWD to PWD");
infof("CWD = %s", cwd);
infof("PWD = %s", pwd);
cwd = pwd;
FileUtils.chdir(cwd);
} else if (arg == "--new-process") {
newProcess = true;
} else if (arg == "-g") {
group = args[i+1];
} else if (arg.startsWith("--group")) {
group = arg[8..$];
} else if (arg == "-v" || arg == "--version") {
outputVersions();
return 0;
}
}
//append TILIX_ID to args if present
try {
string terminalUUID = environment["TILIX_ID"];
trace("Inserting terminal UUID " ~ terminalUUID);
args ~= ("--" ~ CMD_TERMINAL_UUID ~ "=" ~ terminalUUID);
}
catch (Exception e) {
trace("No tilix UUID found");
}
//Version checking cribbed from grestful, thanks!
string gtkError = Version.checkVersion(GTK_VERSION_MAJOR, GTK_VERSION_MINOR, GTK_VERSION_PATCH);
if (gtkError !is null) {
MessageDialog dialog = new MessageDialog(null, DialogFlags.MODAL, MessageType.ERROR, ButtonsType.OK,
format(_("Your GTK version is too old, you need at least GTK %d.%d.%d!"), GTK_VERSION_MAJOR, GTK_VERSION_MINOR, GTK_VERSION_PATCH), null);
dialog.setDefaultResponse(ResponseType.OK);
dialog.run();
return 1;
}
// check minimum VTE version
if (!checkVTEVersion(VTE_VERSION_MINIMAL)) {
MessageDialog dialog = new MessageDialog(null, DialogFlags.MODAL, MessageType.ERROR, ButtonsType.OK,
format(_("Your VTE version is too old, you need at least VTE %d.%d!"), VTE_VERSION_MINIMAL[0], VTE_VERSION_MINIMAL[1]), null);
dialog.setDefaultResponse(ResponseType.OK);
dialog.run();
return 1;
}
trace("Creating app");
auto tilixApp = new Tilix(newProcess, group);
int result;
try {
trace("Running application...");
result = tilixApp.run(args);
trace("App completed...");
}
catch (Exception e) {
error(_("Unexpected exception occurred"));
error(_("Error: ") ~ e.msg);
}
return result;
}
private:
void outputVersions() {
import gx.gtk.vte: getVTEVersion, checkVTEFeature, TerminalFeature, isVTEBackgroundDrawEnabled;
import gtk.Version: Version;
writeln(_("Versions"));
writeln("\t" ~ format(_("Tilix version: %s"), APPLICATION_VERSION));
writeln("\t" ~ format(_("VTE version: %s"), getVTEVersion()));
writeln("\t" ~ format(_("GTK Version: %d.%d.%d") ~ "\n", Version.getMajorVersion(), Version.getMinorVersion(), Version.getMicroVersion()));
writeln(_("Tilix Special Features"));
writeln("\t" ~ format(_("Notifications enabled=%b"), checkVTEFeature(TerminalFeature.EVENT_NOTIFICATION)));
writeln("\t" ~ format(_("Triggers enabled=%b"), checkVTEFeature(TerminalFeature.EVENT_SCREEN_CHANGED)));
writeln("\t" ~ format(_("Badges enabled=%b"), isVTEBackgroundDrawEnabled));
}
|