summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/GsWidget.H10
-rw-r--r--src/GsWidget.cxx88
-rw-r--r--src/PSEditor.H4
-rw-r--r--src/PSEditor.cxx8
-rw-r--r--src/flpsed.cxx7
5 files changed, 62 insertions, 55 deletions
diff --git a/src/GsWidget.H b/src/GsWidget.H
index 0735607..370de14 100644
--- a/src/GsWidget.H
+++ b/src/GsWidget.H
@@ -58,10 +58,12 @@ public:
GsWidget(int X,int Y,int W, int H);
~GsWidget();
-
- int load(char *f);
+
+ int open_file(char *f);
- int load(int fd);
+ int open_file(int fd);
+
+ int load();
int load_page(int p);
@@ -84,8 +86,6 @@ private:
int fd_copy(int to, int from, size_t len);
- int feed_page(int p);
-
bool gs_active();
};
#endif
diff --git a/src/GsWidget.cxx b/src/GsWidget.cxx
index 14d77f9..888d599 100644
--- a/src/GsWidget.cxx
+++ b/src/GsWidget.cxx
@@ -29,6 +29,7 @@
#include <errno.h>
#include <sys/wait.h>
#include <fcntl.h>
+#include <signal.h>
#include <FL/fl_draw.H>
@@ -68,7 +69,7 @@ void GsWidget::setProps() {
atoms[3] = XInternAtom(fl_display,"PAGE" , false);
atoms[4] = XInternAtom(fl_display,"DONE" , false);
- snprintf(data, 512, "%d %d %d %d %d %d %d.0 %d.0",
+ snprintf(data, sizeof(data), "%d %d %d %d %d %d %d.0 %d.0",
0, 0, 0, 0, paper_x, paper_y, xdpi, ydpi);
int xid = fl_xid(window());
@@ -77,7 +78,7 @@ void GsWidget::setProps() {
XA_STRING, 8, PropModeReplace,
(unsigned char*) data, strlen(data));
- snprintf(data, 512, "%s %d %d", "Color",
+ snprintf(data, sizeof(data), "%s %d %d", "Color",
(int) BlackPixel(fl_display, DefaultScreen(fl_display)),
(int) WhitePixel(fl_display, DefaultScreen(fl_display)));
@@ -123,18 +124,16 @@ GsWidget::~GsWidget() {
}
}
-int GsWidget::load(char *f) {
+int GsWidget::open_file(char *f) {
int fd = open(f, O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
- return load(fd);
+ return open_file(fd);
}
-int GsWidget::load(int fd) {
- pid_t pid;
-
+int GsWidget::open_file(int fd) {
if (in_fd >= 0 && fd != in_fd) {
close (in_fd);
}
@@ -150,6 +149,17 @@ int GsWidget::load(int fd) {
paper_y = bb_h;
}
+ return 0;
+}
+
+
+int GsWidget::load() {
+ pid_t pid;
+
+ if (in_fd < 0) {
+ return 1;
+ }
+
lseek(in_fd, 0L, SEEK_SET);
fl_cursor(FL_CURSOR_WAIT);
@@ -177,6 +187,11 @@ int GsWidget::load(int fd) {
int
GsWidget::load_page(int p) {
pid_t pid;
+ int pdes[2];
+
+ if (in_fd < 0) {
+ return 1;
+ }
if (p < 1 || p > dsc->get_pages()) {
fprintf(stderr, "Page %d not found in document\n", p);
@@ -186,51 +201,46 @@ GsWidget::load_page(int p) {
fl_cursor(FL_CURSOR_WAIT);
kill_gs();
- setProps();
-
- pid = fork();
-
- if (pid == (pid_t) 0) {
- feed_page(p);
- exit(0);
- } else {
- gs_pid = pid;
- }
-}
-
-int GsWidget::feed_page(int p) {
- pid_t pid;
- int pdes[2];
-
if (pipe(pdes) < 0) {
- return 1;
+ perror("pipe");
+ return 1;
}
- pid = fork();
+ lseek(in_fd, 0L, SEEK_SET);
+ setProps();
+ pid = fork();
if (pid == (pid_t) 0) {
+ close(in_fd);
close(pdes[1]);
dup2(pdes[0], STDIN_FILENO);
exec_gs();
} else {
size_t len;
+ gs_pid = pid;
+ page = p;
+
close(pdes[0]);
lseek(in_fd, 0L, SEEK_SET);
len = dsc->get_setup_len();
if (fd_copy(pdes[1], in_fd, len) != 0) {
- exit(1);
+ close(pdes[1]);
+ return 1;
}
-
+
lseek(in_fd, dsc->get_page_off(p), SEEK_SET);
len = dsc->get_page_len(p);
if (fd_copy(pdes[1], in_fd, len) != 0) {
- exit(1);
+ close(pdes[1]);
+ return 1;
}
- }
+ close(pdes[1]);
+ }
+ return 0;
}
int GsWidget::fd_copy(int to, int from, size_t len) {
@@ -239,13 +249,15 @@ int GsWidget::fd_copy(int to, int from, size_t len) {
n = 0;
while(len > 0) {
+ Fl::check(); // let fltk do its stuff - otherwise
+ // gs can't get the GHOSTVIEW property
r = read(from, buf, MIN(sizeof(buf), len));
- write(STDOUT_FILENO, buf, r);
if (r < 0) {
perror("read");
return 1;
}
+
write(to, buf, r);
len -= r;
}
@@ -259,9 +271,9 @@ void GsWidget::exec_gs() {
int d_null = open("/dev/null", O_WRONLY);
dup2(d_null, STDOUT_FILENO);
- close(d_null);
- snprintf(gvenv, 256, "%d %d", (int) fl_xid(window()), (int) offscreen);
+ snprintf(gvenv, sizeof(gvenv), "%d %d",
+ (int) fl_xid(window()), (int) offscreen);
setenv("GHOSTVIEW", gvenv, 1);
argv[0] = "gs";
@@ -269,8 +281,9 @@ void GsWidget::exec_gs() {
argv[2] = "-dQUIET";
argv[3] = "-sDEVICE=x11alpha";
argv[4] = "-dNOPLATFONTS";
- argv[5] = "-";
- argv[6] = NULL;
+ argv[5] = "-dNOPAUSE";
+ argv[6] = "-";
+ argv[7] = NULL;
execvp(argv[0], argv);
perror("exec");
fprintf(stderr, "Please install ghostscript and make sure 'gs' "
@@ -282,12 +295,7 @@ int GsWidget::reload() {
int ret;
if (in_fd >= 0) {
- ret = lseek(in_fd, 0L, SEEK_SET);
- if (ret == -1) {
- perror("lseek");
- return 1;
- }
- load(in_fd);
+ open_file(in_fd);
return 0;
} else {
return 1;
diff --git a/src/PSEditor.H b/src/PSEditor.H
index 6bba6d3..a1926ee 100644
--- a/src/PSEditor.H
+++ b/src/PSEditor.H
@@ -37,9 +37,9 @@ class PSEditor : public PSEditWidget {
public:
PSEditor(int X,int Y,int W, int H);
- int load(FILE *fp);
+ int open_file(FILE *fp);
- int load(const char *f);
+ int open_file(const char *f);
int save(FILE *fp);
diff --git a/src/PSEditor.cxx b/src/PSEditor.cxx
index cc620d4..a2df43f 100644
--- a/src/PSEditor.cxx
+++ b/src/PSEditor.cxx
@@ -110,7 +110,7 @@ int PSEditor::handle(int event) {
}
-int PSEditor::load(FILE *fp) {
+int PSEditor::open_file(FILE *fp) {
if (tmp_fd) {
close(tmp_fd);
}
@@ -122,11 +122,11 @@ int PSEditor::load(FILE *fp) {
} else {
mod = 0;
loaded = 1;
- return GsWidget::load(tmp_fd);
+ return GsWidget::open_file(tmp_fd);
}
}
-int PSEditor::load(const char *f) {
+int PSEditor::open_file(const char *f) {
FILE *fp;
int ret;
@@ -136,7 +136,7 @@ int PSEditor::load(const char *f) {
return 1;
}
- ret = load(fp);
+ ret = open_file(fp);
fclose(fp);
return ret;
diff --git a/src/flpsed.cxx b/src/flpsed.cxx
index a341fc2..596d1ac 100644
--- a/src/flpsed.cxx
+++ b/src/flpsed.cxx
@@ -24,7 +24,6 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
-#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -81,8 +80,8 @@ void open_cb() {
if (!check_save()) return;
char *file = fl_file_chooser("Open File?", "*.ps", filename);
if(file != NULL) {
- psed_p->load(file);
+ psed_p->open_file(file);
psed_p->load_page(2);
}
}
@@ -105,7 +104,7 @@ void import_pdf_cb() {
p = pexecvp("pdftops", args, &pid, "r");
if (p) {
- psed_p->load(p);
+ psed_p->open_file(p);
fclose(p);
waitpid(pid, &status, 0);
if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) {
@@ -531,7 +530,7 @@ int main(int argc, char** argv) {
if (in_fp) {
sleep(1); // this seems to be necessary on fast systems to make the
// GHOSTVIEW property available to ghostsscript.
- psed_p->load(in_fp);
+ psed_p->open_file(in_fp);
fclose(in_fp);
}