/contrib/groff/src/devices/xditview/Dvi.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 611 lines · 497 code · 64 blank · 50 comment · 63 complexity · 0322f6ef07b72c49d36c57ac816a15a7 MD5 · raw file

  1. #ifndef SABER
  2. #ifndef lint
  3. static char Xrcsid[] = "$XConsortium: Dvi.c,v 1.9 89/12/10 16:12:25 rws Exp $";
  4. #endif /* lint */
  5. #endif /* SABER */
  6. /*
  7. * Dvi.c - Dvi display widget
  8. *
  9. */
  10. #define XtStrlen(s) ((s) ? strlen(s) : 0)
  11. /* The following are defined for the reader's convenience. Any
  12. Xt..Field macro in this code just refers to some field in
  13. one of the substructures of the WidgetRec. */
  14. #include <X11/IntrinsicP.h>
  15. #include <X11/StringDefs.h>
  16. #include <X11/Xmu/Converters.h>
  17. #include <stdio.h>
  18. #include <ctype.h>
  19. #include "DviP.h"
  20. /****************************************************************
  21. *
  22. * Full class record constant
  23. *
  24. ****************************************************************/
  25. /* Private Data */
  26. static char default_font_map_1[] = "\
  27. TR -adobe-times-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\
  28. TI -adobe-times-medium-i-normal--*-100-*-*-*-*-iso8859-1\n\
  29. TB -adobe-times-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\
  30. TBI -adobe-times-bold-i-normal--*-100-*-*-*-*-iso8859-1\n\
  31. CR -adobe-courier-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\
  32. CI -adobe-courier-medium-o-normal--*-100-*-*-*-*-iso8859-1\n\
  33. CB -adobe-courier-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\
  34. CBI -adobe-courier-bold-o-normal--*-100-*-*-*-*-iso8859-1\n\
  35. ";
  36. static char default_font_map_2[] = "\
  37. HR -adobe-helvetica-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\
  38. HI -adobe-helvetica-medium-o-normal--*-100-*-*-*-*-iso8859-1\n\
  39. HB -adobe-helvetica-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\
  40. HBI -adobe-helvetica-bold-o-normal--*-100-*-*-*-*-iso8859-1\n\
  41. ";
  42. static char default_font_map_3[] = "\
  43. NR -adobe-new century schoolbook-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\
  44. NI -adobe-new century schoolbook-medium-i-normal--*-100-*-*-*-*-iso8859-1\n\
  45. NB -adobe-new century schoolbook-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\
  46. NBI -adobe-new century schoolbook-bold-i-normal--*-100-*-*-*-*-iso8859-1\n\
  47. S -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\n\
  48. SS -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\n\
  49. ";
  50. #define offset(field) XtOffset(DviWidget, field)
  51. #define MY_WIDTH(dw) ((int)(dw->dvi.paperwidth * dw->dvi.scale_factor + .5))
  52. #define MY_HEIGHT(dw) ((int)(dw->dvi.paperlength * dw->dvi.scale_factor + .5))
  53. static XtResource resources[] = {
  54. {(String)XtNfontMap, (String)XtCFontMap, (String)XtRString,
  55. sizeof (char *), offset(dvi.font_map_string),
  56. (String)XtRString, NULL /* set in code */},
  57. {(String)XtNforeground, (String)XtCForeground, (String)XtRPixel,
  58. sizeof (unsigned long), offset(dvi.foreground),
  59. (String)XtRString, (XtPointer)"XtDefaultForeground"},
  60. {(String)XtNbackground, (String)XtCBackground, (String)XtRPixel,
  61. sizeof (unsigned long), offset(dvi.background),
  62. (String)XtRString, (XtPointer)"XtDefaultBackground"},
  63. {(String)XtNpageNumber, (String)XtCPageNumber, (String)XtRInt,
  64. sizeof (int), offset(dvi.requested_page),
  65. (String)XtRString, (XtPointer)"1"},
  66. {(String)XtNlastPageNumber, (String)XtCLastPageNumber, (String)XtRInt,
  67. sizeof (int), offset (dvi.last_page),
  68. (String)XtRString, (XtPointer)"0"},
  69. {(String)XtNfile, (String)XtCFile, (String)XtRFile,
  70. sizeof (FILE *), offset (dvi.file),
  71. (String)XtRFile, (XtPointer)0},
  72. {(String)XtNseek, (String)XtCSeek, (String)XtRBoolean,
  73. sizeof (Boolean), offset(dvi.seek),
  74. (String)XtRString, (XtPointer)"false"},
  75. {(String)XtNfont, (String)XtCFont, (String)XtRFontStruct,
  76. sizeof (XFontStruct *), offset(dvi.default_font),
  77. (String)XtRString, (XtPointer)"xtdefaultfont"},
  78. {(String)XtNbackingStore, (String)XtCBackingStore, (String)XtRBackingStore,
  79. sizeof (int), offset(dvi.backing_store),
  80. (String)XtRString, (XtPointer)"default"},
  81. {(String)XtNnoPolyText, (String)XtCNoPolyText, (String)XtRBoolean,
  82. sizeof (Boolean), offset(dvi.noPolyText),
  83. (String)XtRString, (XtPointer)"false"},
  84. {(String)XtNresolution, (String)XtCResolution, (String)XtRInt,
  85. sizeof(int), offset(dvi.default_resolution),
  86. (String)XtRString, (XtPointer)"75"},
  87. };
  88. #undef offset
  89. static void ClassInitialize (void);
  90. static void ClassPartInitialize(WidgetClass);
  91. static void Initialize(Widget, Widget, ArgList, Cardinal *);
  92. static void Realize (Widget, XtValueMask *, XSetWindowAttributes *);
  93. static void Destroy (Widget);
  94. static void Redisplay (Widget, XEvent *, Region);
  95. static Boolean SetValues (Widget, Widget, Widget,
  96. ArgList, Cardinal *);
  97. static Boolean SetValuesHook (Widget, ArgList, Cardinal *);
  98. static XtGeometryResult QueryGeometry (Widget, XtWidgetGeometry *,
  99. XtWidgetGeometry *);
  100. static void ShowDvi (DviWidget);
  101. static void CloseFile (DviWidget);
  102. static void OpenFile (DviWidget);
  103. static void FindPage (DviWidget);
  104. static void SaveToFile (Widget, FILE *);
  105. /* font.c */
  106. extern void ParseFontMap(DviWidget);
  107. extern void DestroyFontMap(DviFontMap *);
  108. extern void ForgetFonts(DviWidget);
  109. /* page.c */
  110. extern void DestroyFileMap(DviFileMap *);
  111. extern long SearchPagePosition(DviWidget, int);
  112. extern void FileSeek(DviWidget, long);
  113. extern void ForgetPagePositions(DviWidget);
  114. /* parse.c */
  115. extern int ParseInput(register DviWidget);
  116. DviClassRec dviClassRec = {
  117. {
  118. &widgetClassRec, /* superclass */
  119. (String)"Dvi", /* class_name */
  120. sizeof(DviRec), /* size */
  121. ClassInitialize, /* class_initialize */
  122. ClassPartInitialize, /* class_part_initialize */
  123. FALSE, /* class_inited */
  124. Initialize, /* initialize */
  125. NULL, /* initialize_hook */
  126. Realize, /* realize */
  127. NULL, /* actions */
  128. 0, /* num_actions */
  129. resources, /* resources */
  130. XtNumber(resources), /* resource_count */
  131. NULLQUARK, /* xrm_class */
  132. FALSE, /* compress_motion */
  133. TRUE, /* compress_exposure */
  134. TRUE, /* compress_enterleave */
  135. FALSE, /* visible_interest */
  136. Destroy, /* destroy */
  137. NULL, /* resize */
  138. Redisplay, /* expose */
  139. SetValues, /* set_values */
  140. SetValuesHook, /* set_values_hook */
  141. NULL, /* set_values_almost */
  142. NULL, /* get_values_hook */
  143. NULL, /* accept_focus */
  144. XtVersion, /* version */
  145. NULL, /* callback_private */
  146. 0, /* tm_table */
  147. QueryGeometry, /* query_geometry */
  148. NULL, /* display_accelerator */
  149. NULL /* extension */
  150. },{
  151. SaveToFile, /* save */
  152. },
  153. };
  154. WidgetClass dviWidgetClass = (WidgetClass) &dviClassRec;
  155. static void ClassInitialize (void)
  156. {
  157. int len1 = strlen(default_font_map_1);
  158. int len2 = strlen(default_font_map_2);
  159. int len3 = strlen(default_font_map_3);
  160. char *dfm = XtMalloc(len1 + len2 + len3 + 1);
  161. char *ptr = dfm;
  162. strcpy(ptr, default_font_map_1); ptr += len1;
  163. strcpy(ptr, default_font_map_2); ptr += len2;
  164. strcpy(ptr, default_font_map_3);
  165. resources[0].default_addr = dfm;
  166. XtAddConverter( XtRString, XtRBackingStore, XmuCvtStringToBackingStore,
  167. NULL, 0 );
  168. }
  169. /****************************************************************
  170. *
  171. * Private Procedures
  172. *
  173. ****************************************************************/
  174. /* ARGSUSED */
  175. static void Initialize(Widget request, Widget new_wd,
  176. ArgList args, Cardinal *num_args)
  177. {
  178. DviWidget dw = (DviWidget) new_wd;
  179. dw->dvi.current_page = 0;
  180. dw->dvi.font_map = 0;
  181. dw->dvi.cache.index = 0;
  182. dw->dvi.text_x_width = 0;
  183. dw->dvi.text_device_width = 0;
  184. dw->dvi.word_flag = 0;
  185. dw->dvi.file = 0;
  186. dw->dvi.tmpFile = 0;
  187. dw->dvi.state = 0;
  188. dw->dvi.readingTmp = 0;
  189. dw->dvi.cache.char_index = 0;
  190. dw->dvi.cache.font_size = -1;
  191. dw->dvi.cache.font_number = -1;
  192. dw->dvi.cache.adjustable[0] = 0;
  193. dw->dvi.file_map = 0;
  194. dw->dvi.fonts = 0;
  195. dw->dvi.seek = False;
  196. dw->dvi.device_resolution = dw->dvi.default_resolution;
  197. dw->dvi.display_resolution = dw->dvi.default_resolution;
  198. dw->dvi.paperlength = dw->dvi.default_resolution*11;
  199. dw->dvi.paperwidth = (dw->dvi.default_resolution*8
  200. + dw->dvi.default_resolution/2);
  201. dw->dvi.scale_factor = 1.0;
  202. dw->dvi.sizescale = 1;
  203. dw->dvi.line_thickness = -1;
  204. dw->dvi.line_width = 1;
  205. dw->dvi.fill = DVI_FILL_MAX;
  206. dw->dvi.device_font = 0;
  207. dw->dvi.device_font_number = -1;
  208. dw->dvi.device = 0;
  209. dw->dvi.native = 0;
  210. request = request; /* unused; suppress compiler warning */
  211. args = args;
  212. num_args = num_args;
  213. }
  214. #include "gray1.bm"
  215. #include "gray2.bm"
  216. #include "gray3.bm"
  217. #include "gray4.bm"
  218. #include "gray5.bm"
  219. #include "gray6.bm"
  220. #include "gray7.bm"
  221. #include "gray8.bm"
  222. static void
  223. Realize (Widget w, XtValueMask *valueMask, XSetWindowAttributes *attrs)
  224. {
  225. DviWidget dw = (DviWidget) w;
  226. XGCValues values;
  227. if (dw->dvi.backing_store != Always + WhenMapped + NotUseful) {
  228. attrs->backing_store = dw->dvi.backing_store;
  229. *valueMask |= CWBackingStore;
  230. }
  231. XtCreateWindow (w, (unsigned)InputOutput, (Visual *) CopyFromParent,
  232. *valueMask, attrs);
  233. values.foreground = dw->dvi.foreground;
  234. values.cap_style = CapRound;
  235. values.join_style = JoinRound;
  236. values.line_width = dw->dvi.line_width;
  237. dw->dvi.normal_GC = XCreateGC (XtDisplay (w), XtWindow (w),
  238. GCForeground|GCCapStyle|GCJoinStyle
  239. |GCLineWidth,
  240. &values);
  241. dw->dvi.gray[0] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
  242. gray1_bits,
  243. gray1_width, gray1_height);
  244. dw->dvi.gray[1] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
  245. gray2_bits,
  246. gray2_width, gray2_height);
  247. dw->dvi.gray[2] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
  248. gray3_bits,
  249. gray3_width, gray3_height);
  250. dw->dvi.gray[3] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
  251. gray4_bits,
  252. gray4_width, gray4_height);
  253. dw->dvi.gray[4] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
  254. gray5_bits,
  255. gray5_width, gray5_height);
  256. dw->dvi.gray[5] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
  257. gray6_bits,
  258. gray6_width, gray6_height);
  259. dw->dvi.gray[6] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
  260. gray7_bits,
  261. gray7_width, gray7_height);
  262. dw->dvi.gray[7] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w),
  263. gray8_bits,
  264. gray8_width, gray8_height);
  265. values.background = dw->dvi.background;
  266. values.stipple = dw->dvi.gray[5];
  267. dw->dvi.fill_GC = XCreateGC (XtDisplay (w), XtWindow (w),
  268. GCForeground|GCBackground|GCStipple,
  269. &values);
  270. dw->dvi.fill_type = 9;
  271. if (dw->dvi.file)
  272. OpenFile (dw);
  273. ParseFontMap (dw);
  274. }
  275. static void
  276. Destroy(Widget w)
  277. {
  278. DviWidget dw = (DviWidget) w;
  279. XFreeGC (XtDisplay (w), dw->dvi.normal_GC);
  280. XFreeGC (XtDisplay (w), dw->dvi.fill_GC);
  281. XFreePixmap (XtDisplay (w), dw->dvi.gray[0]);
  282. XFreePixmap (XtDisplay (w), dw->dvi.gray[1]);
  283. XFreePixmap (XtDisplay (w), dw->dvi.gray[2]);
  284. XFreePixmap (XtDisplay (w), dw->dvi.gray[3]);
  285. XFreePixmap (XtDisplay (w), dw->dvi.gray[4]);
  286. XFreePixmap (XtDisplay (w), dw->dvi.gray[5]);
  287. XFreePixmap (XtDisplay (w), dw->dvi.gray[6]);
  288. XFreePixmap (XtDisplay (w), dw->dvi.gray[7]);
  289. DestroyFontMap (dw->dvi.font_map);
  290. DestroyFileMap (dw->dvi.file_map);
  291. device_destroy (dw->dvi.device);
  292. }
  293. /*
  294. * Repaint the widget window
  295. */
  296. /* ARGSUSED */
  297. static void
  298. Redisplay(Widget w, XEvent *event, Region region)
  299. {
  300. DviWidget dw = (DviWidget) w;
  301. XRectangle extents;
  302. XClipBox (region, &extents);
  303. dw->dvi.extents.x1 = extents.x;
  304. dw->dvi.extents.y1 = extents.y;
  305. dw->dvi.extents.x2 = extents.x + extents.width;
  306. dw->dvi.extents.y2 = extents.y + extents.height;
  307. ShowDvi (dw);
  308. event = event; /* unused; suppress compiler warning */
  309. }
  310. /*
  311. * Set specified arguments into widget
  312. */
  313. /* ARGSUSED */
  314. static Boolean
  315. SetValues (Widget wcurrent, Widget wrequest, Widget wnew,
  316. ArgList args, Cardinal *num_args)
  317. {
  318. Boolean redisplay = FALSE;
  319. char *new_map;
  320. int cur, req;
  321. DviWidget current = (DviWidget)wcurrent;
  322. DviWidget request = (DviWidget)wrequest;
  323. DviWidget new_wd = (DviWidget)wnew;
  324. if (current->dvi.font_map_string != request->dvi.font_map_string) {
  325. new_map = XtMalloc (strlen (request->dvi.font_map_string) + 1);
  326. if (new_map) {
  327. redisplay = TRUE;
  328. strcpy (new_map, request->dvi.font_map_string);
  329. new_wd->dvi.font_map_string = new_map;
  330. if (current->dvi.font_map_string)
  331. XtFree (current->dvi.font_map_string);
  332. current->dvi.font_map_string = 0;
  333. ParseFontMap (new_wd);
  334. }
  335. }
  336. req = request->dvi.requested_page;
  337. cur = current->dvi.requested_page;
  338. if (cur != req) {
  339. if (!request->dvi.file)
  340. req = 0;
  341. else {
  342. if (req < 1)
  343. req = 1;
  344. if (current->dvi.last_page != 0 &&
  345. req > current->dvi.last_page)
  346. req = current->dvi.last_page;
  347. }
  348. if (cur != req)
  349. redisplay = TRUE;
  350. new_wd->dvi.requested_page = req;
  351. if (current->dvi.last_page == 0 && req > cur)
  352. FindPage (new_wd);
  353. }
  354. args = args; /* unused; suppress compiler warning */
  355. num_args = num_args;
  356. return redisplay;
  357. }
  358. /*
  359. * use the set_values_hook entry to check when
  360. * the file is set
  361. */
  362. static Boolean
  363. SetValuesHook (Widget wdw, ArgList args, Cardinal *num_argsp)
  364. {
  365. Cardinal i;
  366. DviWidget dw = (DviWidget)wdw;
  367. for (i = 0; i < *num_argsp; i++) {
  368. if (!strcmp (args[i].name, XtNfile)) {
  369. CloseFile (dw);
  370. OpenFile (dw);
  371. return TRUE;
  372. }
  373. }
  374. return FALSE;
  375. }
  376. static void CloseFile (DviWidget dw)
  377. {
  378. if (dw->dvi.tmpFile)
  379. fclose (dw->dvi.tmpFile);
  380. ForgetPagePositions (dw);
  381. }
  382. static void OpenFile (DviWidget dw)
  383. {
  384. dw->dvi.tmpFile = 0;
  385. if (!dw->dvi.seek)
  386. dw->dvi.tmpFile = tmpfile();
  387. dw->dvi.requested_page = 1;
  388. dw->dvi.last_page = 0;
  389. }
  390. static XtGeometryResult
  391. QueryGeometry (Widget w, XtWidgetGeometry *request,
  392. XtWidgetGeometry *geometry_return)
  393. {
  394. XtGeometryResult ret;
  395. DviWidget dw = (DviWidget) w;
  396. ret = XtGeometryYes;
  397. if (((request->request_mode & CWWidth)
  398. && request->width < MY_WIDTH(dw))
  399. || ((request->request_mode & CWHeight)
  400. && request->height < MY_HEIGHT(dw)))
  401. ret = XtGeometryAlmost;
  402. geometry_return->width = MY_WIDTH(dw);
  403. geometry_return->height = MY_HEIGHT(dw);
  404. geometry_return->request_mode = CWWidth|CWHeight;
  405. return ret;
  406. }
  407. void
  408. SetDevice (DviWidget dw, const char *name)
  409. {
  410. XtWidgetGeometry request, reply;
  411. XtGeometryResult ret;
  412. ForgetFonts (dw);
  413. dw->dvi.device = device_load (name);
  414. if (!dw->dvi.device)
  415. return;
  416. dw->dvi.sizescale = dw->dvi.device->sizescale;
  417. dw->dvi.device_resolution = dw->dvi.device->res;
  418. dw->dvi.native = dw->dvi.device->X11;
  419. dw->dvi.paperlength = dw->dvi.device->paperlength;
  420. dw->dvi.paperwidth = dw->dvi.device->paperwidth;
  421. if (dw->dvi.native) {
  422. dw->dvi.display_resolution = dw->dvi.device_resolution;
  423. dw->dvi.scale_factor = 1.0;
  424. }
  425. else {
  426. dw->dvi.display_resolution = dw->dvi.default_resolution;
  427. dw->dvi.scale_factor = ((double)dw->dvi.display_resolution
  428. / dw->dvi.device_resolution);
  429. }
  430. request.request_mode = CWWidth|CWHeight;
  431. request.width = MY_WIDTH(dw);
  432. request.height = MY_HEIGHT(dw);
  433. ret = XtMakeGeometryRequest ((Widget)dw, &request, &reply);
  434. if (ret == XtGeometryAlmost
  435. && reply.height >= request.height
  436. && reply.width >= request.width) {
  437. request.width = reply.width;
  438. request.height = reply.height;
  439. XtMakeGeometryRequest ((Widget)dw, &request, &reply);
  440. }
  441. }
  442. static void
  443. ShowDvi (DviWidget dw)
  444. {
  445. if (!dw->dvi.file) {
  446. static char Error[] = "No file selected";
  447. XSetFont (XtDisplay(dw), dw->dvi.normal_GC,
  448. dw->dvi.default_font->fid);
  449. XDrawString (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC,
  450. 20, 20, Error, strlen (Error));
  451. return;
  452. }
  453. FindPage (dw);
  454. dw->dvi.display_enable = 1;
  455. ParseInput (dw);
  456. if (dw->dvi.last_page && dw->dvi.requested_page > dw->dvi.last_page)
  457. dw->dvi.requested_page = dw->dvi.last_page;
  458. }
  459. static void
  460. FindPage (DviWidget dw)
  461. {
  462. int i;
  463. long file_position;
  464. if (dw->dvi.requested_page < 1)
  465. dw->dvi.requested_page = 1;
  466. if (dw->dvi.last_page != 0 && dw->dvi.requested_page > dw->dvi.last_page)
  467. dw->dvi.requested_page = dw->dvi.last_page;
  468. file_position = SearchPagePosition (dw, dw->dvi.requested_page);
  469. if (file_position != -1) {
  470. FileSeek(dw, file_position);
  471. dw->dvi.current_page = dw->dvi.requested_page;
  472. } else {
  473. for (i=dw->dvi.requested_page; i > 0; i--) {
  474. file_position = SearchPagePosition (dw, i);
  475. if (file_position != -1)
  476. break;
  477. }
  478. if (file_position == -1)
  479. file_position = 0;
  480. FileSeek (dw, file_position);
  481. dw->dvi.current_page = i;
  482. dw->dvi.display_enable = 0;
  483. while (dw->dvi.current_page != dw->dvi.requested_page) {
  484. dw->dvi.current_page = ParseInput (dw);
  485. /*
  486. * at EOF, seek back to the beginning of this page.
  487. */
  488. if (!dw->dvi.readingTmp && feof (dw->dvi.file)) {
  489. file_position = SearchPagePosition (dw,
  490. dw->dvi.current_page);
  491. if (file_position != -1)
  492. FileSeek (dw, file_position);
  493. dw->dvi.requested_page = dw->dvi.current_page;
  494. break;
  495. }
  496. }
  497. }
  498. }
  499. void DviSaveToFile(Widget w, FILE *fp)
  500. {
  501. XtCheckSubclass(w, dviWidgetClass, NULL);
  502. (*((DviWidgetClass) XtClass(w))->command_class.save)(w, fp);
  503. }
  504. static
  505. void SaveToFile(Widget w, FILE *fp)
  506. {
  507. DviWidget dw = (DviWidget)w;
  508. long pos;
  509. int c;
  510. if (dw->dvi.tmpFile) {
  511. pos = ftell(dw->dvi.tmpFile);
  512. if (dw->dvi.ungot) {
  513. pos--;
  514. dw->dvi.ungot = 0;
  515. /* The ungot character is in the tmpFile, so we don't
  516. want to read it from file. */
  517. (void)getc(dw->dvi.file);
  518. }
  519. }
  520. else
  521. pos = ftell(dw->dvi.file);
  522. FileSeek(dw, 0L);
  523. while (DviGetC(dw, &c) != EOF)
  524. if (putc(c, fp) == EOF) {
  525. /* XXX print error message */
  526. break;
  527. }
  528. FileSeek(dw, pos);
  529. }
  530. static
  531. void ClassPartInitialize(WidgetClass widget_class)
  532. {
  533. DviWidgetClass wc = (DviWidgetClass)widget_class;
  534. DviWidgetClass super = (DviWidgetClass) wc->core_class.superclass;
  535. if (wc->command_class.save == InheritSaveToFile)
  536. wc->command_class.save = super->command_class.save;
  537. }
  538. /*
  539. Local Variables:
  540. c-indent-level: 8
  541. c-continued-statement-offset: 8
  542. c-brace-offset: -8
  543. c-argdecl-indent: 8
  544. c-label-offset: -8
  545. c-tab-always-indent: nil
  546. End:
  547. */