From 2f6ec1e7e5b3649a58ae20211eb18511550246ae Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 6 Jun 2009 14:47:28 +0100 Subject: [PATCH] before do away with xpm --- pctb/Makefile | 2 +- pctb/pages.c | 98 +++++++++++++++++++++++++-------------------------- 2 files changed, 49 insertions(+), 51 deletions(-) diff --git a/pctb/Makefile b/pctb/Makefile index 55f4d53..3a4fff3 100644 --- a/pctb/Makefile +++ b/pctb/Makefile @@ -5,7 +5,7 @@ all: convert x-manip-window CONVERT_OBJS= convert.o ocr.o pages.o -convert: $(CONVERT_OBJS) -lnetpbm -lXtst -lX11 +convert: $(CONVERT_OBJS) -lnetpbm -lXpm -lXtst -lX11 $(CONVERT_OBJS): ocr.h x-manip-window: -lXtst -lX11 diff --git a/pctb/pages.c b/pctb/pages.c index 69f097d..3eb33ce 100644 --- a/pctb/pages.c +++ b/pctb/pages.c @@ -6,6 +6,9 @@ #include #include #include +#include + +#include CanonImage *page_images[MAX_PAGES]; int npages; @@ -13,11 +16,15 @@ int npages; static Window id; static Display *disp; static struct timeval tv_startup; +static unsigned wwidth, wheight; + +static XpmAttributes xpma; static KeyCode keycode(KeySym sym) { return XKeysymToKeycode(disp,sym); } +#if 0 static void check_exitstatus(int st) { eassert(WIFEXITED(st)); eassert(!WEXITSTATUS(st)); @@ -31,7 +38,6 @@ static void check_pclose(FILE *f, char *cmd) { free(cmd); } -#if 0 static CanonImage *screenshot_now(void) { char *cmd; CanonImage *ci; @@ -63,12 +69,9 @@ static CanonImage *single_page(void) { /*---------- pager ----------*/ -typedef struct { - size_t len; - unsigned char d[]; -} Snapshot; +typedef XImage Snapshot; -static size_t snapshot_alloc= 1024; +//static size_t snapshot_alloc= 1024; static double last_input; static const double min_update_allowance= 0.5; @@ -112,49 +115,34 @@ static void send_pgdown(void) { sync_after_input(); } +static void free_snapshot(Snapshot **io) { + if (*io) XDestroyImage(*io); + *io= 0; +} + static void snapshot(Snapshot **output) { - char *cmd; - int r; +// char *cmd; +// int r; +// XImage *xim; - free(*output); *output=0; + free_snapshot(output); fprintf(stderr,"PAGING snapshot\n"); - r= asprintf(&cmd, "xwd -silent -id 0x%lx", (unsigned long)id); eassert(r>=0); - FILE *f= popen(cmd,"r"); eassert(f); - - int need_alloc=1; - size_t used=0; - for (;;) { - size_t allow= snapshot_alloc - used; - if (!allow) { - snapshot_alloc <<= 1; - need_alloc= 1; - fprintf(stderr,"PAGING snapshot grow %ld\n", (long)snapshot_alloc); - continue; - } - if (need_alloc) { - *output= realloc(*output, sizeof(**output) + snapshot_alloc); - eassert(*output); - need_alloc= 0; - } - size_t got= fread((*output)->d, 1, allow, f); - if (got==0) break; - used += got; - } - check_pclose(f,cmd); - - (*output)->len= used; - snapshot_alloc= used+1; - *output= realloc(*output, sizeof(**output) + snapshot_alloc); - eassert(*output); + timestamp(); + *output= XGetImage(disp,id, 0,0, wwidth,wheight, AllPlanes, ZPixmap); + timestamp(); - fprintf(stderr,"PAGING snapshot len=%ld\n", (long)used); + fprintf(stderr,"PAGING snapshot done.\n"); } static int identical(const Snapshot *a, const Snapshot *b) { - return !(memcmp(a, b, sizeof(*a)) || - memcmp(a->d, b->d, a->len)); + if (!(a->width == b->width && + a->height == b->height && + a->bytes_per_line == b->bytes_per_line && + a->format == b->format)) + return 0; + return !memcmp(a->data, b->data, a->bytes_per_line * a->height); } static void wait_for_stability(Snapshot **output, @@ -188,7 +176,7 @@ static void wait_for_stability(Snapshot **output, fprintf(stderr,"PAGING wait_for_stability retry\n"); - free(last); last=*output; *output=0; + free_snapshot(&last); last=*output; *output=0; if (with_keypress) with_keypress(); @@ -196,7 +184,7 @@ static void wait_for_stability(Snapshot **output, delay(0.5); } - free(last); + free_snapshot(&last); fprintf(stderr,"PAGING wait_for_stability done.\n"); } @@ -204,7 +192,7 @@ static void raise_and_set_focus(void) { int r; XWindowAttributes attr; int xpos,ypos, evbase,errbase,majver,minver; - unsigned width,height,bd,depth; + unsigned bd,depth; Window dummy; fprintf(stderr,"PAGING raise_and_set_focus\n"); @@ -215,7 +203,9 @@ static void raise_and_set_focus(void) { r= XRaiseWindow(disp, id); eassert(r); r= XGetWindowAttributes(disp, id, &attr); eassert(r); - r= XGetGeometry(disp,id, &attr.root,&xpos,&ypos,&width,&height, &bd,&depth); + r= XGetGeometry(disp,id, &attr.root, + &xpos,&ypos, &wwidth,&wheight, + &bd,&depth); eassert(r); r= XTranslateCoordinates(disp, id,attr.root, 160,160, &xpos,&ypos, @@ -256,19 +246,25 @@ static void store_page(int pageno, Snapshot *sn) { close(paste[1]); close(results[0]); close(results[1]); - execlp("xwdtopnm", "xwdtopnm",(char*)0); + execlp("xpmtoppm", "xpmtoppm",(char*)0); dup2(4,2); - eassert(!"xwdtopnm exec failure"); + eassert(!"xpmtoppm exec failure"); } + char *xpmdata=0; + r= XpmCreateBufferFromImage(disp, &xpmdata, sn, 0, &xpma); + eassert(!r); + eassert(xpmdata); + paster= fork(); eassert(paster!=-1); if (!paster) { FILE *f= fdopen(paste[1],"w"); eassert(f); close(paste[0]); close(results[0]); close(results[1]); - size_t did= fwrite(sn->d, 1, sn->len, f); - eassert(did==sn->len); + r= fputs(xpmdata,f); eassert(r!=EOF); + //size_t did= fwrite(sn->d, 1, sn->len, f); + //eassert(did==sn->len); eassert(!fclose(f)); exit(0); } @@ -277,6 +273,8 @@ static void store_page(int pageno, Snapshot *sn) { close(paste[1]); close(results[1]); + XpmFree(xpmdata); + FILE *f= fdopen(results[0],"r"); int c1= fgetc(f); if (c1!=EOF) { @@ -315,13 +313,13 @@ static void read_pages(void) { for (;;) { fprintf(stderr,"PAGING page %d\n",npages); store_page(npages, current); - free(last); last=current; current=0; + free_snapshot(&last); last=current; current=0; fprintf(stderr,"PAGING page %d converted\n",npages); wait_for_stability(¤t,last, 0); if (npages && /* first pagedown doesn't do much */ identical(current,last)) { - free(current); + free_snapshot(¤t); break; } -- 2.30.2