home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume16 / xfig-2.1.3 / part10 < prev    next >
Internet Message Format  |  1992-02-04  |  56KB

  1. Path: uunet!cis.ohio-state.edu!zaphod.mps.ohio-state.edu!mips!msi!dcmartin
  2. From: envbvs@bea.lbl.gov (Brian V. Smith)
  3. Newsgroups: comp.sources.x
  4. Subject: v16i015: Xfig 2.1.3, Part10/25
  5. Message-ID: <1992Feb4.145928.779@msi.com>
  6. Date: 4 Feb 92 14:59:28 GMT
  7. References: <csx-16i006-xfig-2.1.3@uunet.UU.NET>
  8. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  9. Organization: Molecular Simulations, Inc.
  10. Lines: 1834
  11. Approved: dcmartin@msi.com
  12. Originator: dcmartin@fascet
  13.  
  14. Submitted-by: envbvs@bea.lbl.gov (Brian V. Smith)
  15. Posting-number: Volume 16, Issue 15
  16. Archive-name: xfig-2.1.3/part10
  17.  
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  22. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  23. # If this archive is complete, you will see the following message at the end:
  24. #        "End of archive 10 (of 25)."
  25. # Contents:  e_movept.c main.c u_markers.c
  26. # Wrapped by dcmartin@fascet on Tue Feb  4 06:42:29 1992
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'e_movept.c' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'e_movept.c'\"
  30. else
  31. echo shar: Extracting \"'e_movept.c'\" \(18589 characters\)
  32. sed "s/^X//" >'e_movept.c' <<'END_OF_FILE'
  33. X/*
  34. X * FIG : Facility for Interactive Generation of figures
  35. X * Copyright (c) 1985 by Supoj Sutanthavibul
  36. X *
  37. X * "Permission to use, copy, modify, distribute, and sell this software and its
  38. X * documentation for any purpose is hereby granted without fee, provided that
  39. X * the above copyright notice appear in all copies and that both that
  40. X * copyright notice and this permission notice appear in supporting
  41. X * documentation, and that the name of M.I.T. not be used in advertising or
  42. X * publicity pertaining to distribution of the software without specific,
  43. X * written prior permission.  M.I.T. makes no representations about the
  44. X * suitability of this software for any purpose.  It is provided "as is"
  45. X * without express or implied warranty."
  46. X *
  47. X */
  48. X
  49. X#include "fig.h"
  50. X#include "resources.h"
  51. X#include "mode.h"
  52. X#include "object.h"
  53. X#include "paintop.h"
  54. X#include "u_draw.h"
  55. X#include "u_search.h"
  56. X#include "u_create.h"
  57. X#include "u_elastic.h"
  58. X#include "u_list.h"
  59. X#include "u_undo.h"
  60. X#include "w_canvas.h"
  61. X#include "w_mousefun.h"
  62. X
  63. X/* local routine declarations */
  64. X
  65. Xstatic F_point *moved_point;
  66. X
  67. Xstatic Boolean    init_ellipsepointmoving();
  68. Xstatic int    init_arcpointmoving();
  69. Xstatic int    init_linepointmoving();
  70. Xstatic int    init_splinepointmoving();
  71. Xstatic int    init_compoundpointmoving();
  72. X
  73. Xstatic int    relocate_arcpoint();
  74. Xstatic int    relocate_ellipsepoint();
  75. Xstatic int    relocate_linepoint();
  76. Xstatic int    relocate_splinepoint();
  77. Xstatic int    assign_newboxpoint();
  78. X
  79. Xstatic int    init_move_point();
  80. Xstatic int    init_arb_move_point();
  81. Xstatic int    init_stretch_move_point();
  82. X
  83. Xstatic int    fix_movedarcpoint();
  84. Xstatic int    fix_movedellipsepoint();
  85. Xstatic int    fix_movedsplinepoint();
  86. Xstatic int    fix_box();
  87. Xstatic int    fix_movedlinepoint();
  88. Xstatic int    fix_movedlatexlinepoint();
  89. X
  90. Xstatic int    cancel_movedarcpoint();
  91. Xstatic int    cancel_movedellipsepoint();
  92. Xstatic int    cancel_movedsplinepoint();
  93. Xstatic int    cancel_box();
  94. Xstatic int    cancel_movedlinepoint();
  95. X
  96. Xmove_point_selected()
  97. X{
  98. X    set_mousefun("move point", "horiz/vert move", "");
  99. X    canvas_kbd_proc = null_proc;
  100. X    canvas_locmove_proc = null_proc;
  101. X    init_searchproc_left(init_arb_move_point);
  102. X    init_searchproc_middle(init_stretch_move_point);
  103. X    canvas_leftbut_proc = point_search_left;
  104. X    canvas_middlebut_proc = point_search_middle;
  105. X    canvas_rightbut_proc = null_proc;
  106. X    set_cursor(pick9_cursor);
  107. X}
  108. X
  109. Xstatic
  110. Xinit_arb_move_point(obj, type, x, y, p, q)
  111. X    char       *obj;
  112. X    int            type, x, y;
  113. X    F_point       *p, *q;
  114. X{
  115. X    constrained = MOVE_ARB;
  116. X    init_move_point(obj, type, x, y, p, q);
  117. X    set_mousefun("new posn", "", "cancel");
  118. X    draw_mousefun_canvas();
  119. X    canvas_middlebut_proc = null_proc;
  120. X}
  121. X
  122. Xstatic
  123. Xinit_stretch_move_point(obj, type, x, y, p, q)
  124. X    char       *obj;
  125. X    int            type, x, y;
  126. X    F_point       *p, *q;
  127. X{
  128. X    constrained = MOVE_HORIZ_VERT;
  129. X    init_move_point(obj, type, x, y, p, q);
  130. X    set_mousefun("", "new posn", "cancel");
  131. X    draw_mousefun_canvas();
  132. X    canvas_middlebut_proc = canvas_leftbut_proc;
  133. X    canvas_leftbut_proc = null_proc;
  134. X}
  135. X
  136. Xstatic
  137. Xinit_move_point(obj, type, x, y, p, q)
  138. X    char       *obj;
  139. X    int            type, x, y;
  140. X    F_point       *p, *q;
  141. X{
  142. X    left_point = p;
  143. X    moved_point = q;
  144. X    switch (type) {
  145. X    case O_POLYLINE:
  146. X    cur_l = (F_line *) obj;
  147. X    right_point = q->next;
  148. X    init_linepointmoving();
  149. X    break;
  150. X    case O_SPLINE:
  151. X    cur_s = (F_spline *) obj;
  152. X    right_point = q->next;
  153. X    init_splinepointmoving();
  154. X    break;
  155. X    case O_ELLIPSE:
  156. X    /* dirty trick - arcpoint_num is stored in p */
  157. X    movedpoint_num = (int) p;
  158. X    cur_e = (F_ellipse *) obj;
  159. X    if (!init_ellipsepointmoving()) /* selected center, ignore */
  160. X        return;
  161. X    break;
  162. X    case O_ARC:
  163. X    /* dirty trick - arcpoint_num is stored in p */
  164. X    movedpoint_num = (int) p;
  165. X    cur_a = (F_arc *) obj;
  166. X    init_arcpointmoving();
  167. X    break;
  168. X    case O_COMPOUND:
  169. X    /* dirty trick - posn of corner is stored in p and q */
  170. X    cur_x = (int) p;
  171. X    cur_y = (int) q;
  172. X    cur_c = (F_compound *) obj;
  173. X    init_compoundpointmoving();
  174. X    break;
  175. X    default:
  176. X    return;
  177. X    }
  178. X}
  179. X
  180. Xstatic
  181. Xwrapup_movepoint()
  182. X{
  183. X    reset_action_on();
  184. X    move_point_selected();
  185. X    draw_mousefun_canvas();
  186. X}
  187. X
  188. X/*************************  ellipse  *******************************/
  189. X
  190. Xstatic        Boolean
  191. Xinit_ellipsepointmoving()
  192. X{
  193. X    double        dx, dy, l;
  194. X
  195. X    if (constrained &&
  196. X    (cur_e->type == T_CIRCLE_BY_DIA || cur_e->type == T_CIRCLE_BY_RAD)) {
  197. X    put_msg("Constrained move not supported for CIRCLES");
  198. X    return False;        /* abort - constrained move for circle not
  199. X                 * needed */
  200. X    }
  201. X    if (movedpoint_num == 0) {
  202. X    if (cur_e->type == T_ELLIPSE_BY_RAD ||
  203. X        cur_e->type == T_CIRCLE_BY_RAD) {
  204. X        put_msg("Cannot move CENTER point");
  205. X        return False;    /* abort - center point is selected */
  206. X    }
  207. X    cur_x = cur_e->start.x;
  208. X    cur_y = cur_e->start.y;
  209. X    fix_x = cur_e->end.x;
  210. X    fix_y = cur_e->end.y;
  211. X    } else {
  212. X    cur_x = cur_e->end.x;
  213. X    cur_y = cur_e->end.y;
  214. X    fix_x = cur_e->start.x;
  215. X    fix_y = cur_e->start.y;
  216. X    }
  217. X    if (constrained) {
  218. X    dx = cur_x - fix_x;
  219. X    dy = cur_y - fix_y;
  220. X    l = sqrt(dx * dx + dy * dy);
  221. X    cosa = fabs(dx / l);
  222. X    sina = fabs(dy / l);
  223. X    }
  224. X    set_action_on();
  225. X    toggle_ellipsemarker(cur_e);
  226. X    switch (cur_e->type) {
  227. X    case T_ELLIPSE_BY_RAD:
  228. X    canvas_locmove_proc = constrained_resizing_ebr;
  229. X    elastic_ebr();
  230. X    break;
  231. X    case T_CIRCLE_BY_RAD:
  232. X    canvas_locmove_proc = resizing_cbr;
  233. X    elastic_cbr();
  234. X    break;
  235. X    case T_ELLIPSE_BY_DIA:
  236. X    canvas_locmove_proc = constrained_resizing_ebd;
  237. X    elastic_ebd();
  238. X    break;
  239. X    case T_CIRCLE_BY_DIA:
  240. X    canvas_locmove_proc = resizing_cbd;
  241. X    elastic_cbd();
  242. X    break;
  243. X    }
  244. X    from_x = cur_x;
  245. X    from_y = cur_y;
  246. X    set_temp_cursor(crosshair_cursor);
  247. X    canvas_leftbut_proc = fix_movedellipsepoint;
  248. X    canvas_rightbut_proc = cancel_movedellipsepoint;
  249. X    return True;        /* all is Ok */
  250. X}
  251. X
  252. Xstatic
  253. Xcancel_movedellipsepoint()
  254. X{
  255. X    switch (cur_e->type) {
  256. X    case T_ELLIPSE_BY_RAD:
  257. X    elastic_ebr();
  258. X    break;
  259. X    case T_CIRCLE_BY_RAD:
  260. X    elastic_cbr();
  261. X    break;
  262. X    case T_ELLIPSE_BY_DIA:
  263. X    elastic_ebd();
  264. X    break;
  265. X    case T_CIRCLE_BY_DIA:
  266. X    elastic_cbd();
  267. X    break;
  268. X    }
  269. X    toggle_ellipsemarker(cur_e);
  270. X    wrapup_movepoint();
  271. X}
  272. X
  273. Xstatic
  274. Xfix_movedellipsepoint(x, y)
  275. X    int            x, y;
  276. X{
  277. X    switch (cur_e->type) {
  278. X    case T_ELLIPSE_BY_RAD:
  279. X    elastic_ebr();
  280. X    break;
  281. X    case T_CIRCLE_BY_RAD:
  282. X    elastic_cbr();
  283. X    break;
  284. X    case T_ELLIPSE_BY_DIA:
  285. X    elastic_ebd();
  286. X    break;
  287. X    case T_CIRCLE_BY_DIA:
  288. X    elastic_cbd();
  289. X    break;
  290. X    }
  291. X    adjust_box_pos(x, y, from_x, from_y, &cur_x, &cur_y);
  292. X    new_e = copy_ellipse(cur_e);
  293. X    relocate_ellipsepoint(new_e, cur_x, cur_y, movedpoint_num);
  294. X    change_ellipse(cur_e, new_e);
  295. X    toggle_ellipsemarker(new_e);
  296. X    wrapup_movepoint();
  297. X}
  298. X
  299. Xstatic
  300. Xrelocate_ellipsepoint(ellipse, x, y, point_num)
  301. X    F_ellipse       *ellipse;
  302. X    int            x, y, point_num;
  303. X{
  304. X    int            dx, dy;
  305. X
  306. X    set_temp_cursor(wait_cursor);
  307. X    draw_ellipse(ellipse, ERASE);
  308. X    if (point_num == 0) {    /* starting point is selected  */
  309. X    fix_x = ellipse->end.x;
  310. X    fix_y = ellipse->end.y;
  311. X    ellipse->start.x = x;
  312. X    ellipse->start.y = y;
  313. X    } else {
  314. X    fix_x = ellipse->start.x;
  315. X    fix_y = ellipse->start.y;
  316. X    ellipse->end.x = x;
  317. X    ellipse->end.y = y;
  318. X    }
  319. X    switch (ellipse->type) {
  320. X    case T_ELLIPSE_BY_RAD:
  321. X    ellipse->radiuses.x = abs(x - fix_x) + 1;
  322. X    ellipse->radiuses.y = abs(y - fix_y) + 1;
  323. X    break;
  324. X    case T_CIRCLE_BY_RAD:
  325. X    dx = fix_x - x;
  326. X    dy = fix_y - y;
  327. X    ellipse->radiuses.x = sqrt((double) (dx * dx + dy * dy)) + .5;
  328. X    ellipse->radiuses.y = ellipse->radiuses.x;
  329. X    break;
  330. X    case T_ELLIPSE_BY_DIA:
  331. X    ellipse->center.x = (fix_x + x) / 2;
  332. X    ellipse->center.y = (fix_y + y) / 2;
  333. X    ellipse->radiuses.x = abs(ellipse->center.x - fix_x);
  334. X    ellipse->radiuses.y = abs(ellipse->center.y - fix_y);
  335. X    break;
  336. X    case T_CIRCLE_BY_DIA:
  337. X    dx = ellipse->center.x = (fix_x + x) / 2 + .5;
  338. X    dy = ellipse->center.y = (fix_y + y) / 2 + .5;
  339. X    dx -= x;
  340. X    dy -= y;
  341. X    ellipse->radiuses.x = sqrt((double) (dx * dx + dy * dy)) + .5;
  342. X    ellipse->radiuses.y = ellipse->radiuses.x;
  343. X    break;
  344. X    }
  345. X    draw_ellipse(ellipse, PAINT);
  346. X    reset_cursor();
  347. X}
  348. X
  349. X/***************************  arc  *********************************/
  350. X
  351. Xstatic
  352. Xinit_arcpointmoving()
  353. X{
  354. X    set_action_on();
  355. X    toggle_arcmarker(cur_a);
  356. X    cur_x = cur_a->point[movedpoint_num].x;
  357. X    cur_y = cur_a->point[movedpoint_num].y;
  358. X    set_temp_cursor(crosshair_cursor);
  359. X    win_setmouseposition(canvas_win, cur_x, cur_y);
  360. X    elastic_arclink();
  361. X    canvas_locmove_proc = reshaping_arc;
  362. X    canvas_leftbut_proc = fix_movedarcpoint;
  363. X    canvas_rightbut_proc = cancel_movedarcpoint;
  364. X}
  365. X
  366. Xstatic
  367. Xcancel_movedarcpoint()
  368. X{
  369. X    elastic_arclink();
  370. X    toggle_arcmarker(cur_a);
  371. X    wrapup_movepoint();
  372. X}
  373. X
  374. Xstatic
  375. Xfix_movedarcpoint(x, y)
  376. X    int            x, y;
  377. X{
  378. X    elastic_arclink();
  379. X    adjust_pos(x, y, cur_a->point[movedpoint_num].x,
  380. X           cur_a->point[movedpoint_num].y, &x, &y);
  381. X    new_a = copy_arc(cur_a);
  382. X    relocate_arcpoint(new_a, x, y, movedpoint_num);
  383. X    change_arc(cur_a, new_a);
  384. X    toggle_arcmarker(new_a);
  385. X    wrapup_movepoint();
  386. X}
  387. X
  388. Xstatic
  389. Xrelocate_arcpoint(arc, x, y, movedpoint_num)
  390. X    F_arc       *arc;
  391. X    int            x, y, movedpoint_num;
  392. X{
  393. X    float        xx, yy;
  394. X    F_pos        p[3];
  395. X
  396. X    p[0] = arc->point[0];
  397. X    p[1] = arc->point[1];
  398. X    p[2] = arc->point[2];
  399. X    p[movedpoint_num].x = x;
  400. X    p[movedpoint_num].y = y;
  401. X    if (compute_arccenter(p[0], p[1], p[2], &xx, &yy)) {
  402. X    set_temp_cursor(wait_cursor);
  403. X    draw_arc(arc, ERASE);    /* erase old arc */
  404. X    arc->point[movedpoint_num].x = x;
  405. X    arc->point[movedpoint_num].y = y;
  406. X    arc->center.x = xx;
  407. X    arc->center.y = yy;
  408. X    arc->direction = compute_direction(p[0], p[1], p[2]);
  409. X    draw_arc(arc, PAINT);    /* draw new arc */
  410. X    reset_cursor();
  411. X    }
  412. X}
  413. X
  414. X/**************************  spline  *******************************/
  415. X
  416. Xstatic
  417. Xinit_splinepointmoving()
  418. X{
  419. X    F_point       *p;
  420. X
  421. X    set_action_on();
  422. X    toggle_splinemarker(cur_s);
  423. X    from_x = cur_x = moved_point->x;
  424. X    from_y = cur_y = moved_point->y;
  425. X    set_temp_cursor(crosshair_cursor);
  426. X    if (closed_spline(cur_s) && left_point == NULL) {
  427. X    for (left_point = right_point, p = left_point->next;
  428. X         p->next != NULL;
  429. X         left_point = p, p = p->next);
  430. X    }
  431. X    elastic_linelink();
  432. X    canvas_locmove_proc = reshaping_line;
  433. X    canvas_leftbut_proc = fix_movedsplinepoint;
  434. X    canvas_rightbut_proc = cancel_movedsplinepoint;
  435. X}
  436. X
  437. Xstatic
  438. Xcancel_movedsplinepoint()
  439. X{
  440. X    elastic_linelink();
  441. X    toggle_splinemarker(cur_s);
  442. X    wrapup_movepoint();
  443. X}
  444. X
  445. Xstatic
  446. Xfix_movedsplinepoint(x, y)
  447. X    int            x, y;
  448. X{
  449. X    elastic_linelink();
  450. X    adjust_pos(x, y, from_x, from_y, &x, &y);
  451. X    old_s = copy_spline(cur_s);
  452. X    clean_up();
  453. X    set_latestspline(old_s);
  454. X    set_action_object(F_CHANGE, O_SPLINE);
  455. X    old_s->next = cur_s;
  456. X    relocate_splinepoint(cur_s, x, y, moved_point);
  457. X    toggle_splinemarker(cur_s);
  458. X    wrapup_movepoint();
  459. X}
  460. X
  461. Xstatic
  462. Xrelocate_splinepoint(s, x, y, moved_point)
  463. X    F_spline       *s;
  464. X    int            x, y;
  465. X    F_point       *moved_point;
  466. X{
  467. X    set_temp_cursor(wait_cursor);
  468. X    draw_spline(s, ERASE);    /* erase old spline */
  469. X    moved_point->x = x;
  470. X    moved_point->y = y;
  471. X    if (closed_spline(s)) {
  472. X    left_point->next->x = x;
  473. X    left_point->next->y = y;
  474. X    }
  475. X    if (int_spline(s))
  476. X    remake_control_points(s);
  477. X    draw_spline(s, PAINT);    /* draw spline with moved point */
  478. X    set_modifiedflag();
  479. X    reset_cursor();
  480. X}
  481. X
  482. X/***************************  compound    ********************************/
  483. X
  484. Xstatic        prescale_compound(), cancel_compound();
  485. X
  486. Xstatic
  487. Xinit_compoundpointmoving()
  488. X{
  489. X    double        dx, dy, l;
  490. X
  491. X    set_action_on();
  492. X    if (cur_x == cur_c->nwcorner.x)
  493. X    fix_x = cur_c->secorner.x;
  494. X    else
  495. X    fix_x = cur_c->nwcorner.x;
  496. X    if (cur_y == cur_c->nwcorner.y)
  497. X    fix_y = cur_c->secorner.y;
  498. X    else
  499. X    fix_y = cur_c->nwcorner.y;
  500. X    from_x = cur_x;
  501. X    from_y = cur_y;
  502. X    toggle_compoundmarker(cur_c);
  503. X    draw_compoundelements(cur_c, ERASE);
  504. X    set_temp_cursor(crosshair_cursor);
  505. X    elastic_box(fix_x, fix_y, cur_x, cur_y);
  506. X    if (constrained) {
  507. X    dx = cur_x - fix_x;
  508. X    dy = cur_y - fix_y;
  509. X    l = sqrt(dx * dx + dy * dy);
  510. X    cosa = fabs(dx / l);
  511. X    sina = fabs(dy / l);
  512. X    }
  513. X    canvas_locmove_proc = constrained_resizing_box;
  514. X    canvas_leftbut_proc = prescale_compound;
  515. X    canvas_rightbut_proc = cancel_compound;
  516. X}
  517. X
  518. Xstatic
  519. Xcancel_compound()
  520. X{
  521. X    elastic_box(fix_x, fix_y, cur_x, cur_y);
  522. X    draw_compoundelements(cur_c, PAINT);
  523. X    toggle_compoundmarker(cur_c);
  524. X    wrapup_movepoint();
  525. X}
  526. X
  527. Xextern        scale_compound();
  528. X
  529. Xstatic
  530. Xprescale_compound(x, y)
  531. X    int            x, y;
  532. X{
  533. X    float        scalex, scaley;
  534. X
  535. X    elastic_box(fix_x, fix_y, cur_x, cur_y);
  536. X    adjust_box_pos(x, y, from_x, from_y, &cur_x, &cur_y);
  537. X
  538. X    scalex = ((float) (cur_x - fix_x)) / (from_x - fix_x);
  539. X    scaley = ((float) (cur_y - fix_y)) / (from_y - fix_y);
  540. X    scale_compound(cur_c, scalex, scaley, fix_x, fix_y);
  541. X
  542. X    draw_compoundelements(cur_c, PAINT);
  543. X    set_lastposition(from_x, from_y);
  544. X    set_newposition(cur_x, cur_y);
  545. X    clean_up();
  546. X    set_action_object(F_SCALE, O_COMPOUND);
  547. X    set_latestcompound(cur_c);
  548. X    toggle_compoundmarker(cur_c);
  549. X    set_modifiedflag();
  550. X    reset_cursor();
  551. X    wrapup_movepoint();
  552. X}
  553. X
  554. X/***************************  line  ********************************/
  555. X
  556. Xstatic
  557. Xinit_linepointmoving()
  558. X{
  559. X    int            box_case;
  560. X    int            latex_case;
  561. X    F_point       *p;
  562. X
  563. X    set_action_on();
  564. X    toggle_linemarker(cur_l);
  565. X    box_case = 0;
  566. X    latex_case = 0;
  567. X    from_x = cur_x = moved_point->x;
  568. X    from_y = cur_y = moved_point->y;
  569. X    set_temp_cursor(crosshair_cursor);
  570. X    switch (cur_l->type) {
  571. X    case T_POLYGON:
  572. X    if (left_point == NULL)
  573. X        for (left_point = right_point, p = left_point->next;
  574. X         p->next != NULL;
  575. X         left_point = p, p = p->next);
  576. X    break;
  577. X    case T_BOX:
  578. X    case T_ARC_BOX:
  579. X    case T_EPS_BOX:
  580. X    if (right_point->next == NULL) {    /* point 4 */
  581. X        fix_x = cur_l->points->next->x;
  582. X        fix_y = cur_l->points->next->y;
  583. X    } else {
  584. X        fix_x = right_point->next->x;
  585. X        fix_y = right_point->next->y;
  586. X    }
  587. X    draw_line(cur_l, ERASE);
  588. X    box_case = 1;
  589. X    break;
  590. X    case T_POLYLINE:
  591. X    if (left_point != NULL) {
  592. X        if (left_point == cur_l->points) {
  593. X        if (cur_l->back_arrow)    /* backward arrow  */
  594. X            draw_arrow(cur_x, cur_y,
  595. X                   left_point->x, left_point->y,
  596. X                   cur_l->back_arrow, ERASE,
  597. X                   cur_l->color);
  598. X        }
  599. X    } else if (cur_l->back_arrow)    /* backward arrow  */
  600. X        draw_arrow(right_point->x, right_point->y,
  601. X               cur_x, cur_y, cur_l->back_arrow, ERASE,
  602. X               cur_l->color);
  603. X    if (right_point != NULL) {
  604. X        if (cur_l->for_arrow && right_point->next == NULL)
  605. X        draw_arrow(cur_x, cur_y, right_point->x, right_point->y,
  606. X               cur_l->for_arrow, ERASE,
  607. X               cur_l->color);
  608. X    } else if (cur_l->for_arrow)    /* f arrow */
  609. X        draw_arrow(left_point->x, left_point->y,
  610. X               cur_x, cur_y, cur_l->for_arrow, ERASE,
  611. X               cur_l->color);
  612. X    if (latexline_mode || latexarrow_mode) {
  613. X        if (left_point != NULL) {
  614. X        latex_fix_x = left_point->x;
  615. X        latex_fix_y = left_point->y;
  616. X        latex_case = 1;
  617. X        } else if (right_point != NULL) {
  618. X        latex_fix_x = right_point->x;
  619. X        latex_fix_y = right_point->y;
  620. X        latex_case = 1;
  621. X        }
  622. X    }
  623. X    }
  624. X    if (box_case) {
  625. X    double        dx, dy, l;
  626. X
  627. X    if (constrained) {
  628. X        dx = cur_x - fix_x;
  629. X        dy = cur_y - fix_y;
  630. X        l = sqrt(dx * dx + dy * dy);
  631. X        cosa = fabs(dx / l);
  632. X        sina = fabs(dy / l);
  633. X    }
  634. X    elastic_box(fix_x, fix_y, cur_x, cur_y);
  635. X    canvas_locmove_proc = constrained_resizing_box;
  636. X    canvas_leftbut_proc = fix_box;
  637. X    canvas_rightbut_proc = cancel_box;
  638. X    } else if (latex_case) {
  639. X    elastic_linelink();
  640. X    canvas_locmove_proc = reshaping_latexline;
  641. X    canvas_leftbut_proc = fix_movedlatexlinepoint;
  642. X    canvas_rightbut_proc = cancel_movedlinepoint;
  643. X    cur_latexcursor = crosshair_cursor;
  644. X    } else {
  645. X    elastic_linelink();
  646. X    canvas_locmove_proc = reshaping_line;
  647. X    canvas_leftbut_proc = fix_movedlinepoint;
  648. X    canvas_rightbut_proc = cancel_movedlinepoint;
  649. X    }
  650. X}
  651. X
  652. Xstatic
  653. Xcancel_box()
  654. X{
  655. X    elastic_box(fix_x, fix_y, cur_x, cur_y);
  656. X    draw_line(cur_l, PAINT);
  657. X    toggle_linemarker(cur_l);
  658. X    wrapup_movepoint();
  659. X}
  660. X
  661. Xstatic
  662. Xfix_box(x, y)
  663. X    int            x, y;
  664. X{
  665. X    int            delta;
  666. X
  667. X    elastic_box(fix_x, fix_y, cur_x, cur_y);
  668. X    adjust_box_pos(x, y, from_x, from_y, &x, &y);
  669. X    new_l = copy_line(cur_l);
  670. X    draw_line(cur_l, ERASE);
  671. X    if (new_l->type == T_EPS_BOX) {
  672. X    if (signof(fix_x - from_x) != signof(fix_x - x))
  673. X        new_l->eps->flipped = 1 - new_l->eps->flipped;
  674. X    if (signof(fix_y - from_y) != signof(fix_y - y))
  675. X        new_l->eps->flipped = 1 - new_l->eps->flipped;
  676. X    }
  677. X    assign_newboxpoint(new_l, fix_x, fix_y, x, y);
  678. X    change_line(cur_l, new_l);
  679. X    draw_line(new_l, PAINT);
  680. X    toggle_linemarker(new_l);
  681. X    wrapup_movepoint();
  682. X}
  683. X
  684. Xstatic
  685. Xassign_newboxpoint(b, x1, y1, x2, y2)
  686. X    F_line       *b;
  687. X    int            x1, y1, x2, y2;
  688. X{
  689. X    F_point       *p;
  690. X    register int    tmp;
  691. X
  692. X    p = b->points;
  693. X    if (p->x != x1)
  694. X    p->x = x2;
  695. X    if (p->y != y1)
  696. X    p->y = y2;
  697. X    p = p->next;
  698. X    if (p->x != x1)
  699. X    p->x = x2;
  700. X    if (p->y != y1)
  701. X    p->y = y2;
  702. X    p = p->next;
  703. X    if (p->x != x1)
  704. X    p->x = x2;
  705. X    if (p->y != y1)
  706. X    p->y = y2;
  707. X    p = p->next;
  708. X    if (p->x != x1)
  709. X    p->x = x2;
  710. X    if (p->y != y1)
  711. X    p->y = y2;
  712. X    p = p->next;
  713. X    if (p->x != x1)
  714. X    p->x = x2;
  715. X    if (p->y != y1)
  716. X    p->y = y2;
  717. X}
  718. X
  719. Xstatic
  720. Xcancel_movedlinepoint()
  721. X{
  722. X    elastic_linelink();
  723. X    toggle_linemarker(cur_l);
  724. X    wrapup_movepoint();
  725. X}
  726. X
  727. Xstatic
  728. Xfix_movedlinepoint(x, y)
  729. X    int            x, y;
  730. X{
  731. X    elastic_linelink();
  732. X    adjust_pos(x, y, from_x, from_y, &x, &y);
  733. X    /* make a copy of the original and save as unchanged object */
  734. X    old_l = copy_line(cur_l);
  735. X    clean_up();
  736. X    set_latestline(old_l);
  737. X    set_action_object(F_CHANGE, O_POLYLINE);
  738. X    old_l->next = cur_l;
  739. X    /* now change the original to become the new object */
  740. X    relocate_linepoint(cur_l, x, y, moved_point, left_point);
  741. X    toggle_linemarker(cur_l);
  742. X    wrapup_movepoint();
  743. X}
  744. X
  745. Xstatic
  746. Xfix_movedlatexlinepoint(x, y)
  747. X    int            x, y;
  748. X{
  749. X    elastic_linelink();
  750. X    adjust_pos(x, y, from_x, from_y, &x, &y);
  751. X    latex_endpoint(latex_fix_x, latex_fix_y, x, y, &x, &y,
  752. X    latexarrow_mode, (cur_pointposn == P_ANY) ? 1 : posn_rnd[cur_pointposn]);
  753. X    if (cur_latexcursor != crosshair_cursor)
  754. X    set_temp_cursor(crosshair_cursor);
  755. X    old_l = copy_line(cur_l);
  756. X    clean_up();
  757. X    set_latestline(old_l);
  758. X    set_action_object(F_CHANGE, O_POLYLINE);
  759. X    old_l->next = cur_l;
  760. X    relocate_linepoint(cur_l, x, y, moved_point, left_point);
  761. X    toggle_linemarker(cur_l);
  762. X    wrapup_movepoint();
  763. X}
  764. X
  765. Xstatic
  766. Xrelocate_linepoint(line, x, y, moved_point, left_point)
  767. X    F_line       *line;
  768. X    int            x, y;
  769. X    F_point       *moved_point, *left_point;
  770. X{
  771. X    draw_line(line, ERASE);
  772. X    if (line->type == T_POLYGON)
  773. X    if (line->points == moved_point) {
  774. X        left_point->next->x = x;
  775. X        left_point->next->y = y;
  776. X    }
  777. X    moved_point->x = x;
  778. X    moved_point->y = y;
  779. X    set_modifiedflag();
  780. X    draw_line(line, PAINT);
  781. X}
  782. END_OF_FILE
  783. if test 18589 -ne `wc -c <'e_movept.c'`; then
  784.     echo shar: \"'e_movept.c'\" unpacked with wrong size!
  785. fi
  786. # end of 'e_movept.c'
  787. fi
  788. if test -f 'main.c' -a "${1}" != "-c" ; then 
  789.   echo shar: Will not clobber existing file \"'main.c'\"
  790. else
  791. echo shar: Extracting \"'main.c'\" \(18818 characters\)
  792. sed "s/^X//" >'main.c' <<'END_OF_FILE'
  793. X/*
  794. X * FIG : Facility for Interactive Generation of figures
  795. X * Copyright (c) 1985 by Supoj Sutanthavibul
  796. X *
  797. X * "Permission to use, copy, modify, distribute, and sell this software and its
  798. X * documentation for any purpose is hereby granted without fee, provided that
  799. X * the above copyright notice appear in all copies and that both that
  800. X * copyright notice and this permission notice appear in supporting
  801. X * documentation, and that the name of M.I.T. not be used in advertising or
  802. X * publicity pertaining to distribution of the software without specific,
  803. X * written prior permission.  M.I.T. makes no representations about the
  804. X * suitability of this software for any purpose.  It is provided "as is"
  805. X * without express or implied warranty."
  806. X *
  807. X */
  808. X
  809. X#include "fig.h"
  810. X#include "version.h"
  811. X#include "patchlevel.h"
  812. X#include "object.h"
  813. X#include "mode.h"
  814. X#include "resources.h"
  815. X#include "u_fonts.h"
  816. X#include "w_drawprim.h"
  817. X#include "w_mousefun.h"
  818. X#include "w_setup.h"
  819. X#include "w_util.h"
  820. X
  821. Xextern void    setup_cmd_panel();
  822. Xextern        X_error_handler();
  823. Xextern void    error_handler();
  824. Xextern int    ignore_exp_cnt;
  825. Xextern char    *getenv();
  826. Xextern int    psfontnum();
  827. Xextern int    latexfontnum();
  828. X
  829. X#include "fig.icon.X"
  830. XPixmap        fig_icon;
  831. X
  832. Xstatic char    tool_name[100];
  833. Xstatic        sigwinched();
  834. X
  835. X/************** FIG options ******************/
  836. X
  837. XTOOL        tool;
  838. Xstatic char    *filename = NULL;
  839. X
  840. Xstatic Boolean    true = True;
  841. Xstatic Boolean    false = False;
  842. Xstatic int    zero = 0;
  843. X
  844. Xstatic XtResource application_resources[] = {
  845. X    {"showallbuttons", "ShowAllButtons", XtRBoolean, sizeof(Boolean),
  846. X    XtOffset(appresPtr, ShowAllButtons), XtRBoolean, (caddr_t) & false},
  847. X    {XtNjustify, XtCJustify, XtRBoolean, sizeof(Boolean),
  848. X    XtOffset(appresPtr, RHS_PANEL), XtRBoolean, (caddr_t) & false},
  849. X    {"landscape", XtCOrientation, XtRBoolean, sizeof(Boolean),
  850. X    XtOffset(appresPtr, landscape), XtRBoolean, (caddr_t) & true},
  851. X    {"debug", "Debug", XtRBoolean, sizeof(Boolean),
  852. X    XtOffset(appresPtr, DEBUG), XtRBoolean, (caddr_t) & false},
  853. X    {"pwidth", XtCWidth, XtRFloat, sizeof(float),
  854. X    XtOffset(appresPtr, tmp_width), XtRInt, (caddr_t) & zero},
  855. X    {"pheight", XtCHeight, XtRFloat, sizeof(float),
  856. X    XtOffset(appresPtr, tmp_height), XtRInt, (caddr_t) & zero},
  857. X    {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof(Boolean),
  858. X    XtOffset(appresPtr, INVERSE), XtRBoolean, (caddr_t) & false},
  859. X    {"trackCursor", "Track", XtRBoolean, sizeof(Boolean),
  860. X    XtOffset(appresPtr, TRACKING), XtRBoolean, (caddr_t) & true},
  861. X    {"inches", "Inches", XtRBoolean, sizeof(Boolean),
  862. X    XtOffset(appresPtr, INCHES), XtRBoolean, (caddr_t) & true},
  863. X    {"boldFont", "BoldFont", XtRString, sizeof(char *),
  864. X    XtOffset(appresPtr, boldFont), XtRString, (caddr_t) NULL},
  865. X    {"normalFont", "NormalFont", XtRString, sizeof(char *),
  866. X    XtOffset(appresPtr, normalFont), XtRString, (caddr_t) NULL},
  867. X    {"buttonFont", "ButtonFont", XtRString, sizeof(char *),
  868. X    XtOffset(appresPtr, buttonFont), XtRString, (caddr_t) NULL},
  869. X    {"startlatexFont", "StartlatexFont", XtRString, sizeof(char *),
  870. X    XtOffset(appresPtr, startlatexFont), XtRString, (caddr_t) NULL},
  871. X    {"startpsFont", "StartpsFont", XtRString, sizeof(char *),
  872. X    XtOffset(appresPtr, startpsFont), XtRString, (caddr_t) NULL},
  873. X    {"startfontsize", "StartFontSize", XtRFloat, sizeof(float),
  874. X    XtOffset(appresPtr, startfontsize), XtRInt, (caddr_t) & zero},
  875. X    {"internalborderwidth", "InternalBorderWidth", XtRFloat, sizeof(float),
  876. X    XtOffset(appresPtr, internalborderwidth), XtRInt, (caddr_t) & zero},
  877. X    {"latexfonts", "Latexfonts", XtRBoolean, sizeof(Boolean),
  878. X    XtOffset(appresPtr, latexfonts), XtRBoolean, (caddr_t) & false},
  879. X    {"specialtext", "SpecialText", XtRBoolean, sizeof(Boolean),
  880. X    XtOffset(appresPtr, specialtext), XtRBoolean, (caddr_t) & false},
  881. X    {"scalablefonts", "ScalableFonts", XtRBoolean, sizeof(Boolean),
  882. X    XtOffset(appresPtr, SCALABLEFONTS), XtRBoolean, (caddr_t) & false},
  883. X    {"color0", "Color0", XtRPixel, sizeof(Pixel),
  884. X    XtOffset(appresPtr, color[0]), XtRString, (caddr_t) "black"},
  885. X    {"color1", "Color1", XtRPixel, sizeof(Pixel),
  886. X    XtOffset(appresPtr, color[1]), XtRString, (caddr_t) "blue"},
  887. X    {"color2", "Color2", XtRPixel, sizeof(Pixel),
  888. X    XtOffset(appresPtr, color[2]), XtRString, (caddr_t) "green"},
  889. X    {"color3", "Color3", XtRPixel, sizeof(Pixel),
  890. X    XtOffset(appresPtr, color[3]), XtRString, (caddr_t) "cyan"},
  891. X    {"color4", "Color4", XtRPixel, sizeof(Pixel),
  892. X    XtOffset(appresPtr, color[4]), XtRString, (caddr_t) "red"},
  893. X    {"color5", "Color5", XtRPixel, sizeof(Pixel),
  894. X    XtOffset(appresPtr, color[5]), XtRString, (caddr_t) "magenta"},
  895. X    {"color6", "Color6", XtRPixel, sizeof(Pixel),
  896. X    XtOffset(appresPtr, color[6]), XtRString, (caddr_t) "yellow"},
  897. X    {"color7", "Color7", XtRPixel, sizeof(Pixel),
  898. X    XtOffset(appresPtr, color[7]), XtRString, (caddr_t) "white"},
  899. X    {"monochrome", "Monochrome", XtRBoolean, sizeof(Boolean),
  900. X    XtOffset(appresPtr, monochrome), XtRBoolean, (caddr_t) & false},
  901. X    {"latexfonts", "Latexfonts", XtRBoolean, sizeof(Boolean),
  902. X    XtOffset(appresPtr, latexfonts), XtRBoolean, (caddr_t) & false},
  903. X    {"keyFile", "KeyFile", XtRString, sizeof(char *),
  904. X    XtOffset(appresPtr, keyFile), XtRString, (caddr_t) "CompKeyDB"},
  905. X};
  906. X
  907. Xstatic XrmOptionDescRec options[] =
  908. X{
  909. X    {"-showallbuttons", ".showallbuttons", XrmoptionNoArg, "True"},
  910. X    {"-right", ".justify", XrmoptionNoArg, "True"},
  911. X    {"-left", ".justify", XrmoptionNoArg, "False"},
  912. X    {"-debug", ".debug", XrmoptionNoArg, "True"},
  913. X    {"-landscape", ".landscape", XrmoptionNoArg, "True"},
  914. X    {"-Landscape", ".landscape", XrmoptionNoArg, "True"},
  915. X    {"-portrait", ".landscape", XrmoptionNoArg, "False"},
  916. X    {"-Portrait", ".landscape", XrmoptionNoArg, "False"},
  917. X    {"-pwidth", ".pwidth", XrmoptionSepArg, 0},
  918. X    {"-pheight", ".pheight", XrmoptionSepArg, 0},
  919. X    {"-inverse", ".reverseVideo", XrmoptionNoArg, "True"},
  920. X    {"-notrack", ".trackCursor", XrmoptionNoArg, "False"},
  921. X    {"-track", ".trackCursor", XrmoptionNoArg, "True"},
  922. X    {"-inches", ".inches", XrmoptionNoArg, "True"},
  923. X    {"-imperial", ".inches", XrmoptionNoArg, "True"},
  924. X    {"-centimeters", ".inches", XrmoptionNoArg, "False"},
  925. X    {"-metric", ".inches", XrmoptionNoArg, "False"},
  926. X    {"-boldFont", ".boldFont", XrmoptionSepArg, 0},
  927. X    {"-normalFont", ".normalFont", XrmoptionSepArg, 0},
  928. X    {"-buttonFont", ".buttonFont", XrmoptionSepArg, 0},
  929. X    {"-startpsFont", ".startpsFont", XrmoptionSepArg, 0},
  930. X    {"-startlatexFont", ".startlatexFont", XrmoptionSepArg, 0},
  931. X    {"-startFontSize", ".startfontsize", XrmoptionSepArg, 0},
  932. X    {"-startfontsize", ".startfontsize", XrmoptionSepArg, 0},
  933. X    {"-latexfonts", ".latexfonts", XrmoptionNoArg, "True"},
  934. X    {"-specialtext", ".specialtext", XrmoptionNoArg, "True"},
  935. X    {"-scalablefonts", ".scalablefonts", XrmoptionNoArg, "True"},
  936. X    {"-monochrome", ".monochrome", XrmoptionNoArg, "True"},
  937. X    {"-internalBW", ".internalborderwidth", XrmoptionSepArg, 0},
  938. X    {"-internalBorderWidth", ".internalborderwidth", XrmoptionSepArg, 0},
  939. X    {"-keyFile", ".keyFile", XrmoptionSepArg, 0},
  940. X};
  941. X
  942. Xstatic XtCallbackRec callbacks[] =
  943. X{
  944. X    {NULL, NULL},
  945. X};
  946. X
  947. Xstatic Arg    form_args[] =
  948. X{
  949. X    {XtNcallback, (XtArgVal) callbacks},
  950. X    {XtNinput, (XtArgVal) True},
  951. X    {XtNdefaultDistance, (XtArgVal) 0},
  952. X    {XtNresizable, (XtArgVal) False},
  953. X};
  954. X
  955. Xstatic void    check_for_resize();
  956. Xstatic void    check_colors();
  957. XXtActionsRec    form_actions[] =
  958. X{
  959. X    {"ResizeForm", (XtActionProc) check_for_resize},
  960. X};
  961. X
  962. Xextern void clear_text_key();
  963. Xextern void paste_panel_key();
  964. Xstatic XtActionsRec text_panel_actions[] =
  965. X{
  966. X    {"PastePanelKey", (XtActionProc) paste_panel_key} ,
  967. X    {"EmptyTextKey", (XtActionProc) clear_text_key} ,
  968. X};
  969. X
  970. Xstatic String    form_translations =
  971. X"<ConfigureNotify>:ResizeForm()\n";
  972. X
  973. X#define NCHILDREN    9
  974. Xstatic TOOL    form;
  975. X
  976. Xmain(argc, argv)
  977. X    int            argc;
  978. X    char       *argv[];
  979. X
  980. X{
  981. X    TOOL        children[NCHILDREN];
  982. X    int            ichild;
  983. X    int            init_canv_wd, init_canv_ht;
  984. X    XWMHints       *wmhints;
  985. X    char        i;
  986. X    Dimension        w, h;
  987. X
  988. X    DeclareArgs(5);
  989. X
  990. X    (void) sprintf(tool_name, " XFIG %s.%s  (protocol: %s)",
  991. X           FIG_VERSION, PATCHLEVEL, PROTOCOL_VERSION);
  992. X    (void) strcat(file_header, PROTOCOL_VERSION);
  993. X    tool = XtAppInitialize(&tool_app, (String) "Fig", (XrmOptionDescList) options,
  994. X               (Cardinal) XtNumber(options),
  995. X               (Cardinal *) & argc, (String *) argv,
  996. X               (String *) NULL, (String *) NULL, (Cardinal) 0);
  997. X
  998. X    fix_converters();
  999. X    XtGetApplicationResources(tool, &appres, application_resources,
  1000. X                  XtNumber(application_resources), NULL, 0);
  1001. X
  1002. X    i = 1;
  1003. X    while (argc-- > 1) {
  1004. X    if (*argv[i] != '-') {    /* search for non - name */
  1005. X        filename = argv[i];
  1006. X        break;
  1007. X    }
  1008. X    i++;
  1009. X    }
  1010. X
  1011. X    print_landscape = appres.landscape; /* match print and screen format to
  1012. X                     * start */
  1013. X
  1014. X    tool_d = XtDisplay(tool);
  1015. X    tool_s = XtScreen(tool);
  1016. X    tool_sn = DefaultScreen(tool_d);
  1017. X
  1018. X    /* turn off PSFONT_TEXT flag if user specified -latexfonts */
  1019. X    if (appres.latexfonts)
  1020. X    cur_textflags = cur_textflags & (~PSFONT_TEXT);
  1021. X    if (appres.specialtext)
  1022. X    cur_textflags = cur_textflags | SPECIAL_TEXT;
  1023. X
  1024. X    /* turn off PSFONT_TEXT flag if user specified -latexfonts */
  1025. X    if (appres.latexfonts)
  1026. X    cur_textflags = cur_textflags & (~PSFONT_TEXT);
  1027. X
  1028. X    /* run synchronously for debugging */
  1029. X
  1030. X    if (appres.DEBUG) {
  1031. X    XSynchronize(tool_d, 1);
  1032. X    fprintf(stderr, "Debug mode, running synchronously\n");
  1033. X    }
  1034. X    if (CellsOfScreen(tool_s) == 2 && appres.INVERSE) {
  1035. X    XrmValue    value;
  1036. X    XrmDatabase    newdb = (XrmDatabase) 0, old;
  1037. X
  1038. X    value.size = sizeof("White");
  1039. X    value.addr = "White";
  1040. X    XrmPutResource(&newdb, "xfig*borderColor", "String",
  1041. X               &value);
  1042. X    value.size = sizeof("White");
  1043. X    value.addr = "White";
  1044. X    XrmPutResource(&newdb, "xfig*foreground", "String",
  1045. X               &value);
  1046. X    value.size = sizeof("Black");
  1047. X    value.addr = "Black";
  1048. X    XrmPutResource(&newdb, "xfig*background", "String",
  1049. X               &value);
  1050. X    old = XtDatabase(tool_d);
  1051. X    XrmMergeDatabases(newdb, &old);
  1052. X
  1053. X    /* now set the tool part, since its already created */
  1054. X    FirstArg(XtNborderColor, WhitePixelOfScreen(tool_s));
  1055. X    NextArg(XtNforeground, WhitePixelOfScreen(tool_s));
  1056. X    NextArg(XtNbackground, BlackPixelOfScreen(tool_s));
  1057. X    SetValues(tool);
  1058. X    }
  1059. X    init_font();
  1060. X
  1061. X    gc = DefaultGC(tool_d, tool_sn);
  1062. X    bold_gc = DefaultGC(tool_d, tool_sn);
  1063. X    button_gc = DefaultGC(tool_d, tool_sn);
  1064. X
  1065. X    /* set the roman and bold fonts for the message windows */
  1066. X    XSetFont(tool_d, gc, roman_font->fid);
  1067. X    XSetFont(tool_d, bold_gc, bold_font->fid);
  1068. X    XSetFont(tool_d, button_gc, button_font->fid);
  1069. X
  1070. X    /*
  1071. X     * check if the NUMCOLORS drawing colors could be allocated and have
  1072. X     * different palette entries
  1073. X     */
  1074. X    check_colors();
  1075. X
  1076. X    init_cursor();
  1077. X    form = XtCreateManagedWidget("form", formWidgetClass, tool,
  1078. X                 form_args, XtNumber(form_args));
  1079. X
  1080. X    if (cur_fontsize == 0)
  1081. X    cur_fontsize = (int) appres.startfontsize;
  1082. X    if (cur_fontsize == 0)
  1083. X    cur_fontsize = DEF_FONTSIZE;
  1084. X
  1085. X    if (cur_latex_font == 0)
  1086. X    cur_latex_font = latexfontnum (appres.startlatexFont);
  1087. X
  1088. X    if (cur_ps_font == 0)
  1089. X    cur_ps_font = psfontnum (appres.startpsFont);
  1090. X
  1091. X    if (INTERNAL_BW == 0)
  1092. X    INTERNAL_BW = (int) appres.internalborderwidth;
  1093. X    if (INTERNAL_BW <= 0)
  1094. X    INTERNAL_BW = DEF_INTERNAL_BW;
  1095. X
  1096. X    SW_PER_ROW = SW_PER_ROW_PORT;
  1097. X    SW_PER_COL = SW_PER_COL_PORT;
  1098. X    init_canv_wd = appres.tmp_width *
  1099. X    (appres.INCHES ? PIX_PER_INCH : PIX_PER_CM);
  1100. X    init_canv_ht = appres.tmp_height *
  1101. X    (appres.INCHES ? PIX_PER_INCH : PIX_PER_CM);
  1102. X
  1103. X    if (init_canv_wd == 0)
  1104. X    init_canv_wd = appres.landscape ? DEF_CANVAS_WD_LAND :
  1105. X        DEF_CANVAS_WD_PORT;
  1106. X
  1107. X    if (init_canv_ht == 0)
  1108. X    init_canv_ht = appres.landscape ? DEF_CANVAS_HT_LAND :
  1109. X        DEF_CANVAS_HT_PORT;
  1110. X
  1111. X    if ((init_canv_ht < DEF_CANVAS_HT_PORT) ||
  1112. X    (HeightOfScreen(tool_s) < DEF_CANVAS_HT_PORT)) {
  1113. X    SW_PER_ROW = SW_PER_ROW_LAND;
  1114. X    SW_PER_COL = SW_PER_COL_LAND;
  1115. X    }
  1116. X    setup_sizes(init_canv_wd, init_canv_ht);
  1117. X    (void) init_cmd_panel(form);
  1118. X    (void) init_msg(form);
  1119. X    (void) init_mousefun(form);
  1120. X    (void) init_mode_panel(form);
  1121. X    (void) init_topruler(form);
  1122. X    (void) init_canvas(form);
  1123. X    (void) init_fontmenu(form); /* printer font menu */
  1124. X    (void) init_unitbox(form);
  1125. X    (void) init_sideruler(form);
  1126. X    (void) init_ind_panel(form);
  1127. X
  1128. X    ichild = 0;
  1129. X    children[ichild++] = cmd_panel;    /* command buttons */
  1130. X    children[ichild++] = msg_panel;    /* message window */
  1131. X    children[ichild++] = mousefun;    /* labels for mouse fns */
  1132. X    children[ichild++] = mode_panel;    /* current mode */
  1133. X    children[ichild++] = topruler_sw;    /* top ruler */
  1134. X    children[ichild++] = unitbox_sw;    /* box containing units */
  1135. X    children[ichild++] = sideruler_sw;    /* side ruler */
  1136. X    children[ichild++] = canvas_sw;    /* main drawing canvas */
  1137. X    children[ichild++] = ind_panel;    /* current settings indicators */
  1138. X
  1139. X    /*
  1140. X     * until the following XtRealizeWidget() is called, there are NO windows
  1141. X     * in existence
  1142. X     */
  1143. X
  1144. X    XtManageChildren(children, NCHILDREN);
  1145. X    XtRealizeWidget(tool);
  1146. X
  1147. X    fig_icon = XCreateBitmapFromData(tool_d, XtWindow(tool),
  1148. X                     fig_bits, fig_width, fig_height);
  1149. X
  1150. X    FirstArg(XtNtitle, tool_name);
  1151. X    NextArg(XtNiconPixmap, fig_icon);
  1152. X    SetValues(tool);
  1153. X    /* Set the input field to true to allow keyboard input */
  1154. X    wmhints = XGetWMHints(tool_d, XtWindow(tool));
  1155. X    wmhints->flags |= InputHint;/* add in input hint */
  1156. X    wmhints->input = True;
  1157. X    XSetWMHints(tool_d, XtWindow(tool), wmhints);
  1158. X    XFree((char *) wmhints);
  1159. X
  1160. X    if (appres.RHS_PANEL) {    /* side button panel is on right size */
  1161. X    FirstArg(XtNfromHoriz, 0);
  1162. X    NextArg(XtNhorizDistance, RULER_WD + INTERNAL_BW);
  1163. X    SetValues(topruler_sw);
  1164. X
  1165. X    FirstArg(XtNfromHoriz, 0);
  1166. X    NextArg(XtNhorizDistance, 0);
  1167. X    NextArg(XtNfromVert, topruler_sw);
  1168. X    NextArg(XtNleft, XtChainLeft);    /* chain to left of form */
  1169. X    NextArg(XtNright, XtChainLeft);
  1170. X    SetValues(sideruler_sw);
  1171. X
  1172. X    FirstArg(XtNfromHoriz, 0);
  1173. X    NextArg(XtNhorizDistance, 0);
  1174. X    NextArg(XtNfromVert, msg_panel);
  1175. X    NextArg(XtNleft, XtChainLeft);    /* chain to left of form */
  1176. X    NextArg(XtNright, XtChainLeft);
  1177. X    SetValues(unitbox_sw);
  1178. X
  1179. X    /* relocate the side button panel */
  1180. X    XtUnmanageChild(mode_panel);
  1181. X    XtUnmanageChild(canvas_sw);
  1182. X    FirstArg(XtNfromHoriz, canvas_sw);    /* panel right of canvas */
  1183. X    NextArg(XtNhorizDistance, -INTERNAL_BW);
  1184. X    NextArg(XtNfromVert, mousefun);
  1185. X    NextArg(XtNleft, XtChainRight);
  1186. X    NextArg(XtNright, XtChainRight);
  1187. X    SetValues(mode_panel);
  1188. X    FirstArg(XtNfromHoriz, sideruler_sw);    /* panel right of canvas */
  1189. X    SetValues(canvas_sw);
  1190. X    XtManageChild(canvas_sw);
  1191. X    XtManageChild(mode_panel);
  1192. X    }
  1193. X
  1194. X    init_gc();
  1195. X    setup_cmd_panel();
  1196. X    setup_msg();
  1197. X    setup_canvas();
  1198. X    setup_rulers();
  1199. X    setup_mode_panel();
  1200. X    setup_mousefun();
  1201. X    setup_fontmenu();        /* setup bitmaps in printer font menu */
  1202. X    setup_ind_panel();
  1203. X    get_directory(cur_dir);
  1204. X
  1205. X    FirstArg(XtNwidth, &w);
  1206. X    NextArg(XtNheight, &h);
  1207. X    GetValues(tool);
  1208. X    TOOL_WD = (int) w;
  1209. X    TOOL_HT = (int) h;
  1210. X    XtAppAddActions(tool_app, form_actions, XtNumber(form_actions));
  1211. X    XtAppAddActions(tool_app, text_panel_actions, XtNumber(text_panel_actions));
  1212. X    XtOverrideTranslations(form, XtParseTranslationTable(form_translations));
  1213. X
  1214. X    XSetErrorHandler(X_error_handler);
  1215. X    XSetIOErrorHandler((XIOErrorHandler) X_error_handler);
  1216. X    (void) signal(SIGHUP, error_handler);
  1217. X    (void) signal(SIGFPE, error_handler);
  1218. X    (void) signal(SIGBUS, error_handler);
  1219. X    (void) signal(SIGSEGV, error_handler);
  1220. X    (void) signal(SIGINT, SIG_IGN);    /* in case user accidentally types
  1221. X                     * ctrl-c */
  1222. X
  1223. X    put_msg("READY, please select a mode or load a file");
  1224. X
  1225. X    /*
  1226. X     * decide on filename for cut buffer: first try users HOME directory to
  1227. X     * allow cutting and pasting between sessions, if this fails create
  1228. X     * unique filename in /tmp dir
  1229. X     */
  1230. X
  1231. X    if (*strcpy(cut_buf_name, getenv("HOME")) != NULL) {
  1232. X    strcat(cut_buf_name, "/.xfig");
  1233. X    } else {
  1234. X    sprintf(cut_buf_name, "%s%06d", "/tmp/xfig", getpid());
  1235. X    }
  1236. X
  1237. X    app_flush();
  1238. X
  1239. X    if (filename == NULL)
  1240. X    strcpy(cur_filename, DEF_NAME);
  1241. X    else
  1242. X    load_file(filename);
  1243. X
  1244. X    XtAppMainLoop(tool_app);
  1245. X}
  1246. X
  1247. Xstatic void
  1248. Xcheck_for_resize(tool, event, params, nparams)
  1249. X    TOOL        tool;
  1250. X    INPUTEVENT       *event;
  1251. X    String       *params;
  1252. X    Cardinal       *nparams;
  1253. X{
  1254. X    XConfigureEvent *xc = (XConfigureEvent *) event;
  1255. X    Dimension        b;
  1256. X    int            dx, dy;
  1257. X
  1258. X    DeclareArgs(3);
  1259. X
  1260. X    if (xc->width == TOOL_WD && xc->height == TOOL_HT)
  1261. X    return;            /* no size change */
  1262. X    dx = xc->width - TOOL_WD;
  1263. X    dy = xc->height - TOOL_HT;
  1264. X    TOOL_WD = xc->width;
  1265. X    TOOL_HT = xc->height;
  1266. X    setup_sizes(CANVAS_WD + dx, CANVAS_HT + dy);
  1267. X
  1268. X    XawFormDoLayout(form, False);
  1269. X    ignore_exp_cnt++;        /* canvas is resized twice - redraw only once */
  1270. X
  1271. X    FirstArg(XtNborderWidth, &b);
  1272. X    /* first redo the top panels */
  1273. X    GetValues(cmd_panel);
  1274. X    XtResizeWidget(cmd_panel, CMDPANEL_WD, CMDPANEL_HT, b);
  1275. X    GetValues(msg_panel);
  1276. X    XtResizeWidget(msg_panel, MSGPANEL_WD, MSGPANEL_HT, b);
  1277. X    GetValues(mousefun);
  1278. X    XtResizeWidget(mousefun, MOUSEFUN_WD, MOUSEFUN_HT, b);
  1279. X    XtUnmanageChild(mousefun);
  1280. X    resize_mousefun();
  1281. X    XtManageChild(mousefun);    /* so that it shifts with msg_panel */
  1282. X
  1283. X    /* now redo the center area */
  1284. X    XtUnmanageChild(mode_panel);
  1285. X    FirstArg(XtNheight, (MODEPANEL_SPACE + 1) / 2);
  1286. X    SetValues(d_label);
  1287. X    FirstArg(XtNheight, (MODEPANEL_SPACE) / 2);
  1288. X    SetValues(e_label);
  1289. X    XtManageChild(mode_panel);    /* so that it adjusts properly */
  1290. X
  1291. X    FirstArg(XtNborderWidth, &b);
  1292. X    GetValues(canvas_sw);
  1293. X    XtResizeWidget(canvas_sw, CANVAS_WD, CANVAS_HT, b);
  1294. X    GetValues(topruler_sw);
  1295. X    XtResizeWidget(topruler_sw, TOPRULER_WD, TOPRULER_HT, b);
  1296. X    resize_topruler();
  1297. X    GetValues(sideruler_sw);
  1298. X    XtResizeWidget(sideruler_sw, SIDERULER_WD, SIDERULER_HT, b);
  1299. X    resize_sideruler();
  1300. X    XtUnmanageChild(sideruler_sw);
  1301. X    XtManageChild(sideruler_sw);/* so that it shifts with canvas */
  1302. X    XtUnmanageChild(unitbox_sw);
  1303. X    XtManageChild(unitbox_sw);    /* so that it shifts with canvas */
  1304. X
  1305. X    XawFormDoLayout(form, True);
  1306. X}
  1307. X
  1308. X
  1309. Xstatic void
  1310. Xcheck_colors()
  1311. X{
  1312. X    int            i, j;
  1313. X
  1314. X    /* if monochrome resource is set, do not even check for colors */
  1315. X    if (appres.monochrome) {
  1316. X    all_colors_available = false;
  1317. X    return;
  1318. X    }
  1319. X    all_colors_available = true;
  1320. X
  1321. X    /* check if the drawing colors have different palette entries */
  1322. X    for (i = 0; i < NUMCOLORS - 1; i++) {
  1323. X    for (j = i + 1; j < NUMCOLORS; j++) {
  1324. X        if (appres.color[i] == appres.color[j]) {
  1325. X        all_colors_available = false;
  1326. X        break;
  1327. X        }
  1328. X    }
  1329. X    if (!all_colors_available)
  1330. X        break;
  1331. X    }
  1332. X}
  1333. X
  1334. X#ifdef NOSTRSTR
  1335. X#include <stdio.h>
  1336. X#include <string.h>
  1337. X
  1338. Xchar *strstr(s1, s2)
  1339. X    char *s1, *s2;
  1340. X{
  1341. X    int len2;
  1342. X    char *stmp;
  1343. X
  1344. X    len2 = strlen(s2);
  1345. X    for (stmp = s1; *stmp != NULL; stmp++)
  1346. X    if (strncmp(stmp, s2, len2)==0)
  1347. X        return stmp;
  1348. X    return NULL;
  1349. X}
  1350. X#endif
  1351. END_OF_FILE
  1352. if test 18818 -ne `wc -c <'main.c'`; then
  1353.     echo shar: \"'main.c'\" unpacked with wrong size!
  1354. fi
  1355. # end of 'main.c'
  1356. fi
  1357. if test -f 'u_markers.c' -a "${1}" != "-c" ; then 
  1358.   echo shar: Will not clobber existing file \"'u_markers.c'\"
  1359. else
  1360. echo shar: Extracting \"'u_markers.c'\" \(13902 characters\)
  1361. sed "s/^X//" >'u_markers.c' <<'END_OF_FILE'
  1362. X/*
  1363. X * FIG : Facility for Interactive Generation of figures
  1364. X * Copyright (c) 1985 by Supoj Sutanthavibul
  1365. X *
  1366. X * "Permission to use, copy, modify, distribute, and sell this software and its
  1367. X * documentation for any purpose is hereby granted without fee, provided that
  1368. X * the above copyright notice appear in all copies and that both that
  1369. X * copyright notice and this permission notice appear in supporting
  1370. X * documentation, and that the name of M.I.T. not be used in advertising or
  1371. X * publicity pertaining to distribution of the software without specific,
  1372. X * written prior permission.  M.I.T. makes no representations about the
  1373. X * suitability of this software for any purpose.  It is provided "as is"
  1374. X * without express or implied warranty."
  1375. X *
  1376. X */
  1377. X
  1378. X#include "fig.h"
  1379. X#include "resources.h"
  1380. X#include "object.h"
  1381. X#include "mode.h"
  1382. X#include "paintop.h"
  1383. X#include "w_zoom.h"
  1384. X
  1385. X#define set_marker(win,x,y,w,h,z1,z2) \
  1386. X    zXDrawRectangle(tool_d,(win),gccache[INV_PAINT],(x),(y),(w),(h))
  1387. X
  1388. X#ifdef notdef
  1389. X/* not used in present implementation */
  1390. Xstatic u_int    marker_pattern[3] = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
  1391. X
  1392. Xmpr_static(pmarker, 5, 5, 1, marker_pattern);
  1393. X#endif
  1394. X
  1395. Xcenter_marker(x, y)
  1396. X    int            x, y;
  1397. X{
  1398. X    pw_vector(canvas_win, x, y - 2, x, y + 2, INV_PAINT, 1,
  1399. X          RUBBER_LINE, 0.0, DEFAULT_COLOR);
  1400. X    pw_vector(canvas_win, x - 2, y, x + 2, y, INV_PAINT, 1,
  1401. X          RUBBER_LINE, 0.0, DEFAULT_COLOR);
  1402. X}
  1403. X
  1404. Xtoggle_csrhighlight(x, y)
  1405. X    int            x, y;
  1406. X{
  1407. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1408. X    set_marker(canvas_win, x - 2, y - 2, 5, 5, 0, 0);
  1409. X    set_marker(canvas_win, x - 1, y - 1, 3, 3, 0, 0);
  1410. X}
  1411. X
  1412. Xellipse_in_mask()
  1413. X{
  1414. X    return (cur_objmask & M_ELLIPSE);
  1415. X}
  1416. X
  1417. Xarc_in_mask()
  1418. X{
  1419. X    return (cur_objmask & M_ARC);
  1420. X}
  1421. X
  1422. Xcompound_in_mask()
  1423. X{
  1424. X    return (cur_objmask & M_COMPOUND);
  1425. X}
  1426. X
  1427. Xanytext_in_mask()
  1428. X{
  1429. X    return ((cur_objmask & M_TEXT_NORMAL) || (cur_objmask & M_TEXT_HIDDEN));
  1430. X}
  1431. X
  1432. Xvalidtext_in_mask(t)
  1433. X    F_text       *t;
  1434. X{
  1435. X    return ((hidden_text(t) && (cur_objmask & M_TEXT_HIDDEN)) ||
  1436. X        ((!hidden_text(t)) && (cur_objmask & M_TEXT_NORMAL)));
  1437. X}
  1438. X
  1439. Xanyline_in_mask()
  1440. X{
  1441. X    return ((cur_objmask & M_POLYLINE_LINE) ||
  1442. X        (cur_objmask & M_POLYLINE_POLYGON) ||
  1443. X        (cur_objmask & M_POLYLINE_BOX));
  1444. X}
  1445. X
  1446. Xvalidline_in_mask(l)
  1447. X    F_line       *l;
  1448. X{
  1449. X    return ((((l->type == T_BOX) ||
  1450. X          (l->type == T_ARC_BOX)) && (cur_objmask & M_POLYLINE_BOX)) ||
  1451. X        ((l->type == T_EPS_BOX) && (cur_objmask & M_POLYLINE_BOX)) ||
  1452. X        ((l->type == T_POLYLINE) && (cur_objmask & M_POLYLINE_LINE)) ||
  1453. X        ((l->type == T_POLYGON) && (cur_objmask & M_POLYLINE_POLYGON)));
  1454. X}
  1455. X
  1456. Xanyspline_in_mask()
  1457. X{
  1458. X    return ((cur_objmask & M_SPLINE_O_NORMAL) ||
  1459. X        (cur_objmask & M_SPLINE_O_INTERP) ||
  1460. X        (cur_objmask & M_SPLINE_C_NORMAL) ||
  1461. X        (cur_objmask & M_SPLINE_C_INTERP));
  1462. X}
  1463. X
  1464. Xvalidspline_in_mask(s)
  1465. X    F_spline       *s;
  1466. X{
  1467. X    return (((s->type == T_OPEN_INTERP) && (cur_objmask & M_SPLINE_O_INTERP)) ||
  1468. X    ((s->type == T_OPEN_NORMAL) && (cur_objmask & M_SPLINE_O_NORMAL)) ||
  1469. X      ((s->type == T_CLOSED_INTERP) && (cur_objmask & M_SPLINE_C_INTERP)) ||
  1470. X       ((s->type == T_CLOSED_NORMAL) && (cur_objmask & M_SPLINE_C_NORMAL)));
  1471. X}
  1472. X
  1473. Xmask_toggle_ellipsemarker(e)
  1474. X    F_ellipse       *e;
  1475. X{
  1476. X    if (ellipse_in_mask())
  1477. X    toggle_ellipsemarker(e);
  1478. X}
  1479. X
  1480. Xmask_toggle_arcmarker(a)
  1481. X    F_arc       *a;
  1482. X{
  1483. X    if (arc_in_mask())
  1484. X    toggle_arcmarker(a);
  1485. X}
  1486. X
  1487. Xmask_toggle_compoundmarker(c)
  1488. X    F_compound       *c;
  1489. X{
  1490. X    if (compound_in_mask())
  1491. X    toggle_compoundmarker(c);
  1492. X}
  1493. X
  1494. Xmask_toggle_textmarker(t)
  1495. X    F_text       *t;
  1496. X{
  1497. X    if (validtext_in_mask(t))
  1498. X    toggle_textmarker(t);
  1499. X}
  1500. X
  1501. Xmask_toggle_linemarker(l)
  1502. X    F_line       *l;
  1503. X{
  1504. X    if (validline_in_mask(l))
  1505. X    toggle_linemarker(l);
  1506. X}
  1507. X
  1508. Xmask_toggle_splinemarker(s)
  1509. X    F_spline       *s;
  1510. X{
  1511. X    if (validspline_in_mask(s))
  1512. X    toggle_splinemarker(s);
  1513. X}
  1514. X
  1515. Xtoggle_markers()
  1516. X{
  1517. X    toggle_markers_in_compound(&objects);
  1518. X}
  1519. X
  1520. Xtoggle_markers_in_compound(cmpnd)
  1521. X    F_compound       *cmpnd;
  1522. X{
  1523. X    F_ellipse       *e;
  1524. X    F_arc       *a;
  1525. X    F_line       *l;
  1526. X    F_spline       *s;
  1527. X    F_text       *t;
  1528. X    F_compound       *c;
  1529. X    register int    mask;
  1530. X
  1531. X    mask = cur_objmask;
  1532. X    if (mask & M_ELLIPSE)
  1533. X    for (e = cmpnd->ellipses; e != NULL; e = e->next)
  1534. X        toggle_ellipsemarker(e);
  1535. X    if ((mask & M_TEXT_NORMAL) || (mask & M_TEXT_HIDDEN))
  1536. X    for (t = cmpnd->texts; t != NULL; t = t->next) {
  1537. X        if ((hidden_text(t) && (mask & M_TEXT_HIDDEN)) ||
  1538. X        ((!hidden_text(t)) && (mask & M_TEXT_NORMAL)))
  1539. X        toggle_textmarker(t);
  1540. X    }
  1541. X    if (mask & M_ARC)
  1542. X    for (a = cmpnd->arcs; a != NULL; a = a->next)
  1543. X        toggle_arcmarker(a);
  1544. X    if ((mask & M_POLYLINE_LINE) ||
  1545. X    (mask & M_POLYLINE_POLYGON) ||
  1546. X    (mask & M_POLYLINE_BOX))
  1547. X    for (l = cmpnd->lines; l != NULL; l = l->next) {
  1548. X        if ((((l->type == T_BOX) ||
  1549. X          (l->type == T_ARC_BOX)) && (mask & M_POLYLINE_BOX)) ||
  1550. X        ((l->type == T_EPS_BOX) && (mask & M_POLYLINE_BOX)) ||
  1551. X        ((l->type == T_POLYLINE) && (mask & M_POLYLINE_LINE)) ||
  1552. X        ((l->type == T_POLYGON) && (mask & M_POLYLINE_POLYGON)))
  1553. X        toggle_linemarker(l);
  1554. X    }
  1555. X    if ((mask & M_SPLINE_O_NORMAL) || (mask & M_SPLINE_O_INTERP) ||
  1556. X    (mask & M_SPLINE_C_NORMAL) || (mask & M_SPLINE_C_INTERP))
  1557. X    for (s = cmpnd->splines; s != NULL; s = s->next) {
  1558. X        if (((s->type == T_OPEN_INTERP) && (mask & M_SPLINE_O_INTERP)) ||
  1559. X        ((s->type == T_OPEN_NORMAL) && (mask & M_SPLINE_O_NORMAL)) ||
  1560. X         ((s->type == T_CLOSED_INTERP) && (mask & M_SPLINE_C_INTERP)) ||
  1561. X        ((s->type == T_CLOSED_NORMAL) && (mask & M_SPLINE_C_NORMAL)))
  1562. X        toggle_splinemarker(s);
  1563. X    }
  1564. X    if (mask & M_COMPOUND)
  1565. X    for (c = cmpnd->compounds; c != NULL; c = c->next)
  1566. X        toggle_compoundmarker(c);
  1567. X}
  1568. X
  1569. Xupdate_markers(mask)
  1570. X    int            mask;
  1571. X{
  1572. X    F_ellipse       *e;
  1573. X    F_arc       *a;
  1574. X    F_line       *l;
  1575. X    F_spline       *s;
  1576. X    F_text       *t;
  1577. X    F_compound       *c;
  1578. X    register int    oldmask, newmask;
  1579. X
  1580. X    oldmask = cur_objmask;
  1581. X    newmask = mask;
  1582. X    if ((oldmask & M_ELLIPSE) != (newmask & M_ELLIPSE))
  1583. X    for (e = objects.ellipses; e != NULL; e = e->next)
  1584. X        toggle_ellipsemarker(e);
  1585. X    if (((oldmask & M_TEXT_NORMAL) != (newmask & M_TEXT_NORMAL)) ||
  1586. X    ((oldmask & M_TEXT_HIDDEN) != (newmask & M_TEXT_HIDDEN)))
  1587. X    for (t = objects.texts; t != NULL; t = t->next) {
  1588. X        if ((hidden_text(t) &&
  1589. X         ((oldmask & M_TEXT_HIDDEN) != (newmask & M_TEXT_HIDDEN))) ||
  1590. X        ((!hidden_text(t)) &&
  1591. X         ((oldmask & M_TEXT_NORMAL) != (newmask & M_TEXT_NORMAL))))
  1592. X        toggle_textmarker(t);
  1593. X    }
  1594. X    if ((oldmask & M_ARC) != (newmask & M_ARC))
  1595. X    for (a = objects.arcs; a != NULL; a = a->next)
  1596. X        toggle_arcmarker(a);
  1597. X    if (((oldmask & M_POLYLINE_LINE) != (newmask & M_POLYLINE_LINE)) ||
  1598. X    ((oldmask & M_POLYLINE_POLYGON) != (newmask & M_POLYLINE_POLYGON)) ||
  1599. X    ((oldmask & M_POLYLINE_BOX) != (newmask & M_POLYLINE_BOX)))
  1600. X    for (l = objects.lines; l != NULL; l = l->next) {
  1601. X        if ((((l->type == T_BOX) ||
  1602. X          (l->type == T_ARC_BOX || l->type == T_EPS_BOX)) &&
  1603. X          ((oldmask & M_POLYLINE_BOX) != (newmask & M_POLYLINE_BOX))) ||
  1604. X        ((l->type == T_POLYLINE) &&
  1605. X        ((oldmask & M_POLYLINE_LINE) != (newmask & M_POLYLINE_LINE))) ||
  1606. X        ((l->type == T_POLYGON) &&
  1607. X         ((oldmask & M_POLYLINE_POLYGON) != (newmask & M_POLYLINE_POLYGON))))
  1608. X        toggle_linemarker(l);
  1609. X    }
  1610. X    if (((oldmask & M_SPLINE_O_NORMAL) != (newmask & M_SPLINE_O_NORMAL)) ||
  1611. X    ((oldmask & M_SPLINE_O_INTERP) != (newmask & M_SPLINE_O_INTERP)) ||
  1612. X    ((oldmask & M_SPLINE_C_NORMAL) != (newmask & M_SPLINE_C_NORMAL)) ||
  1613. X    ((oldmask & M_SPLINE_C_INTERP) != (newmask & M_SPLINE_C_INTERP)))
  1614. X    for (s = objects.splines; s != NULL; s = s->next) {
  1615. X        if (((s->type == T_OPEN_INTERP) &&
  1616. X         ((oldmask & M_SPLINE_O_INTERP) !=
  1617. X          (newmask & M_SPLINE_O_INTERP))) ||
  1618. X        ((s->type == T_OPEN_NORMAL) &&
  1619. X         ((oldmask & M_SPLINE_O_NORMAL) !=
  1620. X          (newmask & M_SPLINE_O_NORMAL))) ||
  1621. X        ((s->type == T_CLOSED_INTERP) &&
  1622. X         ((oldmask & M_SPLINE_C_INTERP) !=
  1623. X          (newmask & M_SPLINE_C_INTERP))) ||
  1624. X        ((s->type == T_CLOSED_NORMAL) &&
  1625. X         ((oldmask & M_SPLINE_C_NORMAL) !=
  1626. X          (newmask & M_SPLINE_C_NORMAL))))
  1627. X        toggle_splinemarker(s);
  1628. X    }
  1629. X    if ((oldmask & M_COMPOUND) != (newmask & M_COMPOUND))
  1630. X    for (c = objects.compounds; c != NULL; c = c->next)
  1631. X        toggle_compoundmarker(c);
  1632. X    cur_objmask = newmask;
  1633. X}
  1634. X
  1635. Xtoggle_ellipsemarker(e)
  1636. X    F_ellipse       *e;
  1637. X{
  1638. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1639. X    set_marker(canvas_win, e->start.x - 2, e->start.y - 2, 5, 5, 0, 0);
  1640. X    set_marker(canvas_win, e->end.x - 2, e->end.y - 2, 5, 5, 0, 0);
  1641. X    if (e->tagged)
  1642. X    toggle_ellipsehighlight(e);
  1643. X}
  1644. X
  1645. Xtoggle_ellipsehighlight(e)
  1646. X    F_ellipse       *e;
  1647. X{
  1648. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1649. X    set_marker(canvas_win, e->start.x, e->start.y, 1, 1, 0, 0);
  1650. X    set_marker(canvas_win, e->start.x - 1, e->start.y - 1, 3, 3, 0, 0);
  1651. X    set_marker(canvas_win, e->end.x, e->end.y, 1, 1, 0, 0);
  1652. X    set_marker(canvas_win, e->end.x - 1, e->end.y - 1, 3, 3, 0, 0);
  1653. X}
  1654. X
  1655. Xtoggle_arcmarker(a)
  1656. X    F_arc       *a;
  1657. X{
  1658. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1659. X    set_marker(canvas_win, a->point[0].x - 2, a->point[0].y - 2, 5, 5, 0, 0);
  1660. X    set_marker(canvas_win, a->point[1].x - 2, a->point[1].y - 2, 5, 5, 0, 0);
  1661. X    set_marker(canvas_win, a->point[2].x - 2, a->point[2].y - 2, 5, 5, 0, 0);
  1662. X    if (a->tagged)
  1663. X    toggle_archighlight(a);
  1664. X}
  1665. X
  1666. Xtoggle_archighlight(a)
  1667. X    F_arc       *a;
  1668. X{
  1669. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1670. X    set_marker(canvas_win, a->point[0].x, a->point[0].y, 1, 1, 0, 0);
  1671. X    set_marker(canvas_win, a->point[0].x - 1, a->point[0].y - 1, 3, 3, 0, 0);
  1672. X    set_marker(canvas_win, a->point[1].x, a->point[1].y, 1, 1, 0, 0);
  1673. X    set_marker(canvas_win, a->point[1].x - 1, a->point[1].y - 1, 3, 3, 0, 0);
  1674. X    set_marker(canvas_win, a->point[2].x, a->point[2].y, 1, 1, 0, 0);
  1675. X    set_marker(canvas_win, a->point[2].x - 1, a->point[2].y - 1, 3, 3, 0, 0);
  1676. X}
  1677. X
  1678. Xtoggle_textmarker(t)
  1679. X    F_text       *t;
  1680. X{
  1681. X    int            dx, dy;
  1682. X
  1683. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1684. X    /* adjust for text angle */
  1685. X    dy = (int) ((double) t->height * cos(t->angle));
  1686. X    dx = (int) ((double) t->height * sin(t->angle));
  1687. X    set_marker(canvas_win, t->base_x - dx - 2, t->base_y - dy - 2, 5, 5, 0, 0);
  1688. X    set_marker(canvas_win, t->base_x - 2, t->base_y - 2, 5, 5, 0, 0);
  1689. X    if (t->tagged)
  1690. X    toggle_texthighlight(t);
  1691. X}
  1692. X
  1693. Xtoggle_texthighlight(t)
  1694. X    F_text       *t;
  1695. X{
  1696. X    int            dx, dy;
  1697. X
  1698. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1699. X    /* adjust for text angle */
  1700. X    dy = (int) ((double) t->height * cos(t->angle));
  1701. X    dx = (int) ((double) t->height * sin(t->angle));
  1702. X    set_marker(canvas_win, t->base_x - dx, t->base_y - dy, 1, 1, 0, 0);
  1703. X    set_marker(canvas_win, t->base_x - dx - 1, t->base_y - dy - 1, 3, 3, 0, 0);
  1704. X    set_marker(canvas_win, t->base_x, t->base_y, 1, 1, 0, 0);
  1705. X    set_marker(canvas_win, t->base_x - 1, t->base_y - 1, 3, 3, 0, 0);
  1706. X}
  1707. X
  1708. Xtoggle_compoundmarker(c)
  1709. X    F_compound       *c;
  1710. X{
  1711. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1712. X    set_marker(canvas_win, c->nwcorner.x - 2, c->nwcorner.y - 2, 5, 5, 0, 0);
  1713. X    set_marker(canvas_win, c->secorner.x - 2, c->secorner.y - 2, 5, 5, 0, 0);
  1714. X    set_marker(canvas_win, c->nwcorner.x - 2, c->secorner.y - 2, 5, 5, 0, 0);
  1715. X    set_marker(canvas_win, c->secorner.x - 2, c->nwcorner.y - 2, 5, 5, 0, 0);
  1716. X    if (c->tagged)
  1717. X    toggle_compoundhighlight(c);
  1718. X}
  1719. X
  1720. Xtoggle_compoundhighlight(c)
  1721. X    F_compound       *c;
  1722. X{
  1723. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1724. X    set_marker(canvas_win, c->nwcorner.x, c->nwcorner.y, 1, 1, 0, 0);
  1725. X    set_marker(canvas_win, c->nwcorner.x - 1, c->nwcorner.y - 1, 3, 3, 0, 0);
  1726. X    set_marker(canvas_win, c->secorner.x, c->secorner.y, 1, 1, 0, 0);
  1727. X    set_marker(canvas_win, c->secorner.x - 1, c->secorner.y - 1, 3, 3, 0, 0);
  1728. X    set_marker(canvas_win, c->nwcorner.x, c->secorner.y, 1, 1, 0, 0);
  1729. X    set_marker(canvas_win, c->nwcorner.x - 1, c->secorner.y - 1, 3, 3, 0, 0);
  1730. X    set_marker(canvas_win, c->secorner.x, c->nwcorner.y, 1, 1, 0, 0);
  1731. X    set_marker(canvas_win, c->secorner.x - 1, c->nwcorner.y - 1, 3, 3, 0, 0);
  1732. X}
  1733. X
  1734. Xtoggle_linemarker(l)
  1735. X    F_line       *l;
  1736. X{
  1737. X    F_point       *p;
  1738. X    int            fx, fy, x, y;
  1739. X
  1740. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1741. X    p = l->points;
  1742. X    fx = p->x;
  1743. X    fy = p->y;
  1744. X    for (p = p->next; p != NULL; p = p->next) {
  1745. X    x = p->x;
  1746. X    y = p->y;
  1747. X    set_marker(canvas_win, x - 2, y - 2, 5, 5, 0, 0);
  1748. X    }
  1749. X    if (x != fx || y != fy || l->points->next == NULL) {
  1750. X    set_marker(canvas_win, fx - 2, fy - 2, 5, 5, 0, 0);
  1751. X    }
  1752. X    if (l->tagged)
  1753. X    toggle_linehighlight(l);
  1754. X}
  1755. X
  1756. Xtoggle_linehighlight(l)
  1757. X    F_line       *l;
  1758. X{
  1759. X    F_point       *p;
  1760. X    int            fx, fy, x, y;
  1761. X
  1762. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1763. X    p = l->points;
  1764. X    fx = p->x;
  1765. X    fy = p->y;
  1766. X    for (p = p->next; p != NULL; p = p->next) {
  1767. X    x = p->x;
  1768. X    y = p->y;
  1769. X    set_marker(canvas_win, x, y, 1, 1, 0, 0);
  1770. X    set_marker(canvas_win, x - 1, y - 1, 3, 3, 0, 0);
  1771. X    }
  1772. X    if (x != fx || y != fy) {
  1773. X    set_marker(canvas_win, fx, fy, 1, 1, 0, 0);
  1774. X    set_marker(canvas_win, fx - 1, fy - 1, 3, 3, 0, 0);
  1775. X    }
  1776. X}
  1777. X
  1778. Xtoggle_splinemarker(s)
  1779. X    F_spline       *s;
  1780. X{
  1781. X    F_point       *p;
  1782. X    int            fx, fy, x, y;
  1783. X
  1784. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1785. X    p = s->points;
  1786. X    fx = p->x;
  1787. X    fy = p->y;
  1788. X    for (p = p->next; p != NULL; p = p->next) {
  1789. X    x = p->x;
  1790. X    y = p->y;
  1791. X    set_marker(canvas_win, x - 2, y - 2, 5, 5, 0, 0);
  1792. X    }
  1793. X    if (x != fx || y != fy) {
  1794. X    set_marker(canvas_win, fx - 2, fy - 2, 5, 5, 0, 0);
  1795. X    }
  1796. X    if (s->tagged)
  1797. X    toggle_splinehighlight(s);
  1798. X}
  1799. X
  1800. Xtoggle_splinehighlight(s)
  1801. X    F_spline       *s;
  1802. X{
  1803. X    F_point       *p;
  1804. X    int            fx, fy, x, y;
  1805. X
  1806. X    set_line_stuff(1, RUBBER_LINE, 0.0, (INV_PAINT), DEFAULT_COLOR);
  1807. X    p = s->points;
  1808. X    fx = p->x;
  1809. X    fy = p->y;
  1810. X    for (p = p->next; p != NULL; p = p->next) {
  1811. X    x = p->x;
  1812. X    y = p->y;
  1813. X    set_marker(canvas_win, x, y, 1, 1, 0, 0);
  1814. X    set_marker(canvas_win, x - 1, y - 1, 3, 3, 0, 0);
  1815. X    }
  1816. X    if (x != fx || y != fy) {
  1817. X    set_marker(canvas_win, fx, fy, 1, 1, 0, 0);
  1818. X    set_marker(canvas_win, fx - 1, fy - 1, 3, 3, 0, 0);
  1819. X    }
  1820. X}
  1821. END_OF_FILE
  1822. if test 13902 -ne `wc -c <'u_markers.c'`; then
  1823.     echo shar: \"'u_markers.c'\" unpacked with wrong size!
  1824. fi
  1825. # end of 'u_markers.c'
  1826. fi
  1827. echo shar: End of archive 10 \(of 25\).
  1828. cp /dev/null ark10isdone
  1829. MISSING=""
  1830. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ; do
  1831.     if test ! -f ark${I}isdone ; then
  1832.     MISSING="${MISSING} ${I}"
  1833.     fi
  1834. done
  1835. if test "${MISSING}" = "" ; then
  1836.     echo You have unpacked all 25 archives.
  1837.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1838. else
  1839.     echo You still need to unpack the following archives:
  1840.     echo "        " ${MISSING}
  1841. fi
  1842. ##  End of shell archive.
  1843. exit 0
  1844. -- 
  1845. Molecular Simulations, Inc.             mail: dcmartin@msi.com
  1846. 796 N. Pastoria Avenue                  uucp: uunet!dcmartin
  1847. Sunnyvale, California 94086             at&t: 408/522-9236
  1848.