earlybrowserreborn - Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 roytam 1 /*
2  * GhostviewPlus.c -- GhostviewPlus widget.
3  */
4  
5 #include <X11/IntrinsicP.h>
6 #include <X11/StringDefs.h>
7 #include <X11/Xatom.h>
8 #include <X11/Xproto.h>
9 #include <X11/Xos.h>
10 #include "GhostviewPlusP.h"
11 #include <ctype.h>
12  
13 #define XtSetFloatArg(arg, n, d) \
14     if (sizeof(float) > sizeof(XtArgVal)) { \
15         XtSetArg(arg, n, &(d)); \
16     } else { \
17         XtArgVal *ld = (XtArgVal *)&(d); \
18         XtSetArg(arg, n, *ld); \
19     }
20  
21 static XtResource resources[] = {
22 #define offset(field) XtOffsetOf(GhostviewPlusRec, ghostview_plus.field)
23  
24     { XtNpages, XtCPages, XtRInt, sizeof(int),
25           offset(pages), XtRImmediate, (XtPointer)-1 },
26     { XtNcurrentPage, XtCCurrentPage, XtRInt, sizeof(int),
27           offset(current_page), XtRImmediate, (XtPointer)0},
28     { XtNdoc, XtCDoc, XtRPointer, sizeof(XtPointer),
29           offset(doc), XtRImmediate, (XtPointer)NULL},
30     { XtNfile, XtCFilename, XtRString, sizeof(String),
31           offset(filename), XtRString, (XtPointer)NULL },
32     { XtNmagstep, XtCMagstep, XtRInt, sizeof(int),
33           offset(magstep), XtRImmediate, (XtPointer)0 },
34  
35 #undef offset
36 #define offset(field) XtOffsetOf(GhostviewPlusRec, ghostview.field)
37  
38     { XtNcursor, XtCCursor, XtRCursor, sizeof(XtPointer),
39           offset(cursor), XtRImmediate, NULL},
40 #undef offset
41 };
42 static void Initialize();
43 static void Destroy();
44 static Boolean SetValues();
45 static void Realize();
46  
47 static void show_page();
48  
49 GhostviewPlusClassRec ghostviewPlusClassRec = {
50   { /* core fields */
51     /* superclass               */      (WidgetClass) &ghostviewClassRec,
52     /* class_name               */      "GhostviewPlus",
53     /* widget_size              */      sizeof(GhostviewPlusRec),
54     /* class_initialize         */      NULL,
55     /* class_part_initialize    */      NULL,
56     /* class_inited             */      FALSE,
57     /* initialize               */      Initialize,
58     /* initialize_hook          */      NULL,
59     /* realize                  */      Realize,
60     /* actions                  */      NULL,
61     /* num_actions              */      0,
62     /* resources                */      resources,
63     /* num_resources            */      XtNumber(resources),
64     /* xrm_class                */      NULLQUARK,
65     /* compress_motion          */      TRUE,
66     /* compress_exposure        */      TRUE,
67     /* compress_enterleave      */      TRUE,
68     /* visible_interest         */      FALSE,
69     /* destroy                  */      Destroy,
70     /* resize                   */      NULL,
71     /* expose                   */      NULL,
72     /* set_values               */      SetValues,
73     /* set_values_hook          */      NULL,
74     /* set_values_almost        */      XtInheritSetValuesAlmost,
75     /* get_values_hook          */      NULL,
76     /* accept_focus             */      NULL,
77     /* version                  */      XtVersion,
78     /* callback_private         */      NULL,
79     /* tm_table                 */      XtInheritTranslations,
80     /* query_geometry           */      NULL,
81     /* display_accelerator      */      NULL,
82     /* extension                */      NULL
83   },
84   { /* ghostview fields */
85     /* ghostview                */      NULL,
86     /* next                     */      NULL,
87     /* page                     */      NULL,
88     /* done                     */      NULL
89   },
90   { /* ghostviewPlus fields */
91     /* empty                    */      NULL,
92   }
93 };
94  
95 WidgetClass ghostviewPlusWidgetClass = (WidgetClass)&ghostviewPlusClassRec;
96  
97 static void Setup(gvw)
98 GhostviewPlusWidget gvw;
99 {
100     struct document *doc;
101     gvw->ghostview_plus.doc = NULL;
102     gvw->ghostview_plus.pages = -1;
103  
104     /* Unlike Ghostview we always copy the filename argument */
105  
106     if (gvw->ghostview_plus.filename)
107       {
108         FILE *psfile = fopen(gvw->ghostview_plus.filename,"r");
109  
110         gvw->ghostview_plus.filename = XtNewString(gvw->ghostview_plus.filename);
111  
112         if (psfile)
113           {
114             doc = gvw->ghostview_plus.doc = psscan(psfile);
115             fclose(psfile);
116           }
117         if (doc)
118           {
119             gvw->ghostview_plus.pages =  doc->numpages;  
120             if      (gvw->ghostview_plus.pages < 1) gvw->ghostview_plus.pages = -1;
121  
122             if (doc->epsf &&
123                (doc->boundingbox[URX] > doc->boundingbox[LLX]) &&
124                (doc->boundingbox[URY] > doc->boundingbox[LLY]))
125               {
126                 int new_llx = doc->boundingbox[LLX];
127                 int new_lly = doc->boundingbox[LLY];
128                 int new_urx = doc->boundingbox[URX];
129                 int new_ury = doc->boundingbox[URY];
130  
131                 gvw->ghostview.llx = new_llx;
132                 gvw->ghostview.lly = new_lly;
133                 gvw->ghostview.urx = new_urx;
134                 gvw->ghostview.ury = new_ury;
135  
136                 GhostviewLayout((Widget) gvw,True,True);        
137               }  
138           }
139         if (gvw->ghostview_plus.pages < 0) gvw->ghostview.filename = gvw->ghostview_plus.filename;
140         else gvw->ghostview.disable_start = True;
141  
142       }
143 }      
144 /* Initialize private state. */
145  
146 static void
147 Initialize(request, new, args, num_args)
148     Widget request, new;
149     ArgList args;               /* unused */
150     Cardinal *num_args; /* unused */
151 {
152     GhostviewPlusWidget ngvw = (GhostviewPlusWidget) new;
153     GhostviewPlusWidget rgvw = (GhostviewPlusWidget) request;
154  
155     ngvw->ghostview_plus.xdpi = ngvw->ghostview.xdpi;
156     ngvw->ghostview_plus.ydpi = ngvw->ghostview.ydpi;
157  
158     Setup(ngvw);
159 }
160  
161 /* Destroy routine: kill the interpreter and release the GC */
162  
163 static void
164 Destroy(w)
165     Widget w;
166 {
167     GhostviewPlusWidget gvw = (GhostviewPlusWidget) w;
168  
169     XtFree(gvw->ghostview_plus.filename);
170     if (gvw->ghostview_plus.doc   ) psfree(gvw->ghostview_plus.doc);
171 }    
172  
173 /* SetValues routine.  Set new private state, based on changed values
174  * in the widget.  Always returns False, because redisplay is never needed.
175  */
176  
177 static Boolean
178 SetValues(current, request, new)
179     Widget current, request, new;
180 {
181     GhostviewPlusWidget cgvw = (GhostviewPlusWidget) current;
182     GhostviewPlusWidget rgvw = (GhostviewPlusWidget) request;
183     GhostviewPlusWidget ngvw = (GhostviewPlusWidget) new;
184     String cfilename;
185     String rfilename;
186     int rpage = rgvw->ghostview_plus.current_page;
187     int cpage = cgvw->ghostview_plus.current_page;
188  
189     cfilename = cgvw->ghostview.filename;
190     if (cfilename == NULL) cfilename = "(null)";
191     rfilename = rgvw->ghostview.filename;
192     if (rfilename == NULL) rfilename = "(null)";
193  
194     if (strcmp(cfilename,rfilename))
195       {
196          XtFree(cgvw->ghostview_plus.filename);
197          if (cgvw->ghostview_plus.doc   ) psfree(cgvw->ghostview_plus.doc);
198          Setup(ngvw);
199          cpage = 1;
200       }
201     else if (rpage != cpage)
202       {  
203         if (rpage > 0)
204           {  
205             if (ngvw->ghostview_plus.pages < 0)
206               {
207                 rpage = 1;      
208               }
209             else  
210               {
211                 if (rpage > ngvw->ghostview_plus.pages) rpage = ngvw->ghostview_plus.pages;
212                 else if (rpage < 1) rpage = 1;
213  
214                 if (XtIsRealized((Widget)ngvw)) show_page(ngvw,rpage,TRUE);
215               }
216           }
217         ngvw->ghostview_plus.current_page = rpage;
218       }
219 #define HAS_CHANGED(field) (ngvw->ghostview_plus.field != cgvw->ghostview_plus.field)
220  
221     if (HAS_CHANGED(magstep))
222       {
223         Arg arglist[2];
224         float newxdpi = ngvw->ghostview_plus.xdpi;
225         float newydpi = ngvw->ghostview_plus.ydpi;
226         int   magstep = ngvw->ghostview_plus.magstep;
227  
228         if (magstep < 0)
229           for (;magstep++;) { newxdpi /= 1.2 ; newydpi /= 1.2; }
230         else
231           for (;magstep--;) { newxdpi *= 1.2 ; newydpi *= 1.2; }
232  
233         XtSetFloatArg(arglist[0],XtNxdpi,newxdpi);
234         XtSetFloatArg(arglist[1],XtNydpi,newydpi);
235         XtSetValues((Widget)ngvw,arglist,2);
236       }
237  
238 #undef HAS_CHANGED
239 #define HAS_CHANGED(field) (ngvw->ghostview.field != cgvw->ghostview.field)
240  
241     else if (HAS_CHANGED(xdpi) || HAS_CHANGED(ydpi) || HAS_CHANGED(orientation))
242       {
243          if (ngvw->ghostview_plus.pages >= 0) show_page(ngvw,rpage,FALSE);
244       }
245  
246 #undef HAS_CHANGED
247  
248    return FALSE;
249 }      
250 static void Realize(w, valueMask, attributes)
251     Widget w;
252     Mask *valueMask;
253     XSetWindowAttributes *attributes;
254 {
255     GhostviewPlusWidget gvw = (GhostviewPlusWidget) w;
256     WidgetClass superClass = XtSuperclass(w);
257     (*superClass->core_class.realize)(w, valueMask, attributes);
258  
259     if (gvw->ghostview_plus.current_page) show_page(gvw,gvw->ghostview_plus.current_page,TRUE);
260 }
261 static void show_page(gvw,page,wait)
262 GhostviewPlusWidget gvw;
263 int page;
264 Boolean wait;
265 {
266    int i;
267    FILE *fp = fopen(gvw->ghostview_plus.filename,"r");
268    struct document *doc = gvw->ghostview_plus.doc;
269  
270    if (!wait || GhostviewIsInterpreterReady((Widget)gvw)) {
271       GhostviewNextPage((Widget)gvw);
272    } else {
273       GhostviewEnableInterpreter((Widget)gvw);
274       wait = FALSE;
275    }
276    if (!wait)
277    {  
278       GhostviewSendPS((Widget)gvw, fp, doc->beginprolog,
279                   doc->lenprolog, False);
280       GhostviewSendPS((Widget)gvw, fp, doc->beginsetup,
281                   doc->lensetup, False);
282    }
283    if (doc->pageorder == DESCEND)  i = doc->numpages - page;
284    else                            i = page - 1;
285  
286    if (!GhostviewSendPS((Widget)gvw,fp,doc->pages[i].begin,doc->pages[i].len, True))
287       printf("GhostviewSendPS failed\n");
288 }