#include <unistd.h>
#include <fcntl.h>
-static GtkBuilder *builder;
+static GtkBuilder *builder = NULL;
+static int chldin[2], chldout[2];
// typedef struct wdg_command {
// GType wdg;
static int len = 0; int l;
if (!buf) buf = malloc(s);
- while ( (l = read(0, buf + len, s - len)) > 0) {
+ while ( (l = read(STDIN_FILENO, buf + len, s - len)) > 0) {
len += l;
if ( buf[len - 1] == '\n' && (len < 2 || buf[len - 2] != '\\') ) break;
else if (len >= 2) buf[--len - 1] = '\n';
}
}
+void chldopen(char *argv[]) {
+ pipe(chldin); pipe(chldout);
+
+ if ( fork() ) {
+ close(chldin[0]);
+ close(chldout[1]);
+ dup2(chldin[1], STDOUT_FILENO);
+ dup2(chldout[0], STDIN_FILENO);
+ } else {
+ close(chldin[1]);
+ close(chldout[0]);
+ dup2(chldin[0], STDIN_FILENO);
+ dup2(chldout[1], STDOUT_FILENO);
+ execvp(argv[0], &argv[1]);
+ }
+}
+
int main(int argc, char *argv[]) {
GSList *widgets;
-
- gtk_init(&argc, &argv);
- builder = gtk_builder_new_from_file("glade1.glade");
+ int arg = argc, testfd;
+
+ // gtk_init modifies the parameter array, affecting options after --
+ // so we rather give it a copy of the parameter array
+ char **gtkarg = malloc(sizeof(char*) * argc);
+ memcpy(gtkarg, argv, sizeof(char*) * argc);
+ gtk_init(&arg, >karg);
+
+ for (arg = 1; arg < argc; arg++) {
+ if (strcmp(argv[arg], "--") == 0) {
+ printf("chldopen\n");
+ chldopen(&argv[arg + 1]);
+ break;
+ } else if ( (testfd = open(argv[arg], O_RDONLY)) > 0 ) {
+ close(testfd);
+ builder = gtk_builder_new_from_file(argv[arg]);
+ } else {
+ dprintf(STDERR_FILENO, "Unknown argument: %s\n", argv[arg]);
+ exit(1);
+ }
+ }
+ if (! builder) {
+ dprintf(STDERR_FILENO, "No .glade file given\n");
+ exit(1);
+ }
widgets = gtk_builder_get_objects(builder);
g_slist_foreach(widgets, *init_widgets, NULL);
g_slist_free(widgets);
- fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
+ fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK);
g_idle_add(idle_readline, builder);
- // gtk_builder_connect_signals(builder, NULL);
gtk_main();
return 0;