home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume4 / xconf / part03 < prev    next >
Encoding:
Internet Message Format  |  1993-05-04  |  54.8 KB

  1. From: argv@island.uu.net (Dan Heller)
  2. Newsgroups: comp.sources.x
  3. Subject: v04i084: xconf -- X-based conferencing tool, Part03/05
  4. Message-ID: <935@island.uu.net>
  5. Date: 25 Jul 89 08:10:51 GMT
  6. Approved: island!argv@sun.com
  7.  
  8. Submitted-by: Jon Crowcroft <J.Crowcroft@Cs.Ucl.AC.UK>
  9. Posting-number: Volume 4, Issue 84
  10. Archive-name: xconf/part03
  11.  
  12.  
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then feed it
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # If this archive is complete, you will see the following message at the end:
  21. #        "End of archive 3 (of 5)."
  22. # Contents:  xconf/Converters.c xconf/Text.c.ac xconf/ru.h
  23. # Wrapped by argv@sumatra on Tue Jul 25 01:01:06 1989
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'xconf/Converters.c' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'xconf/Converters.c'\"
  27. else
  28. echo shar: Extracting \"'xconf/Converters.c'\" \(25972 characters\)
  29. sed "s/^X//" >'xconf/Converters.c' <<'END_OF_FILE'
  30. X#ifndef lint
  31. Xstatic char Xrcsid[] = "$XConsortium: Converters.c,v 1.36 88/10/18 11:22:55 swick Exp $";
  32. X/* $oHeader: Converters.c,v 1.6 88/09/01 09:26:23 asente Exp $ */
  33. X#endif lint
  34. X/*LINTLIBRARY*/
  35. X
  36. X/***********************************************************
  37. XCopyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
  38. Xand the Massachusetts Institute of Technology, Cambridge, Massachusetts.
  39. X
  40. X                        All Rights Reserved
  41. X
  42. XPermission to use, copy, modify, and distribute this software and its 
  43. Xdocumentation for any purpose and without fee is hereby granted, 
  44. Xprovided that the above copyright notice appear in all copies and that
  45. Xboth that copyright notice and this permission notice appear in 
  46. Xsupporting documentation, and that the names of Digital or MIT not be
  47. Xused in advertising or publicity pertaining to distribution of the
  48. Xsoftware without specific, written prior permission.  
  49. X
  50. XDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  51. XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  52. XDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  53. XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  54. XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  55. XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  56. XSOFTWARE.
  57. X
  58. X******************************************************************/
  59. X
  60. X/* Conversion.c - implementations of resource type conversion procs */
  61. X
  62. X#include    "StringDefs.h"
  63. X#include    <stdio.h>
  64. X#include        <X11/cursorfont.h>
  65. X#include    "IntrinsicI.h"
  66. X#include    "Quarks.h"
  67. X
  68. X#define    done(address, type) \
  69. X    { (*toVal).size = sizeof(type); (*toVal).addr = (caddr_t) address; }
  70. X
  71. Xvoid XtStringConversionWarning(from, toType)
  72. X    String from, toType;
  73. X{
  74. X#ifdef notdef
  75. X    static enum {Check, Report, Ignore} report_it = Check;
  76. X
  77. X    /* %%% aarrgghh.  We really want an app context handle! */
  78. X    if (report_it == Check && _XtDefaultAppContext()->list[0] != NULL) {
  79. X    XrmDatabase rdb = XtDatabase(_XtDefaultAppContext()->list[0]);
  80. X    static void CvtStringToBoolean();
  81. X    XrmName xrm_name[2];
  82. X    XrmClass xrm_class[2];
  83. X    XrmRepresentation rep_type;
  84. X    XrmValue value;
  85. X    xrm_name[0] = StringToName( "stringConversionWarnings" );
  86. X    xrm_name[1] = NULL;
  87. X    xrm_class[0] = StringToClass( "StringConversionWarnings" );
  88. X    xrm_class[1] = NULL;
  89. X    if (XrmQGetResource( rdb, xrm_name, xrm_class,
  90. X                 &rep_type, &value ))
  91. X    {
  92. X        if (rep_type == StringToQuark(XtRBoolean) && value.addr)
  93. X        report_it = Report;
  94. X        else if (rep_type == StringToQuark(XtRString)) {
  95. X        XrmValue toVal;
  96. X        XtDirectConvert(CvtStringToBoolean, NULL, 0, &value, &toVal);
  97. X        if (toVal.addr && *(Boolean*)toVal.addr)
  98. X            report_it = Report;
  99. X        }
  100. X    }
  101. X    }
  102. X
  103. X    if (report_it == Report) {
  104. X#endif /*notdef*/
  105. X    String params[2];
  106. X    Cardinal num_params = 2;
  107. X    params[0] = from;
  108. X    params[1] = toType;
  109. X    XtWarningMsg("conversionError","string","XtToolkitError",
  110. X           "Cannot convert string \"%s\" to type %s",
  111. X            params,&num_params);
  112. X#ifdef notdef
  113. X    }
  114. X#endif /*notdef*/
  115. X}
  116. X
  117. Xstatic void CvtXColorToPixel();
  118. Xstatic void CvtIntToBoolean();
  119. Xstatic void CvtIntToBool();
  120. Xstatic void CvtIntToPixmap();
  121. Xstatic void CvtIntToFont();
  122. Xstatic void CvtIntOrPixelToXColor();
  123. Xstatic void CvtIntToPixel();
  124. X
  125. Xstatic void CvtStringToBoolean();
  126. Xstatic void CvtStringToBool();
  127. Xstatic void CvtStringToCursor();
  128. Xstatic void CvtStringToDisplay();
  129. Xstatic void CvtStringToFile();
  130. Xstatic void CvtStringToFont();
  131. Xstatic void CvtStringToFontStruct();
  132. Xstatic void CvtStringToGeometry();
  133. Xstatic void CvtStringToInt();
  134. Xstatic void CvtStringToShort();
  135. Xstatic void CvtStringToUnsignedChar();
  136. Xstatic void CvtStringToPixel();
  137. X
  138. X/*ARGSUSED*/
  139. Xstatic void CvtIntToBoolean(args, num_args, fromVal, toVal)
  140. X    XrmValuePtr args;
  141. X    Cardinal    *num_args;
  142. X    XrmValuePtr    fromVal;
  143. X    XrmValuePtr    toVal;
  144. X{
  145. X    static Boolean    b;
  146. X
  147. X    if (*num_args != 0)
  148. X    XtWarningMsg("wrongParameters","cvtIntToBoolean","XtToolkitError",
  149. X                  "Integer to Boolean conversion needs no extra arguments",
  150. X                   (String *)NULL, (Cardinal *)NULL);
  151. X    b = (*(int *)fromVal->addr != 0);
  152. X    done(&b, Boolean);
  153. X};
  154. X
  155. X
  156. X/*ARGSUSED*/
  157. Xstatic void CvtIntToShort(args, num_args, fromVal, toVal)
  158. X    XrmValuePtr args;
  159. X    Cardinal    *num_args;
  160. X    XrmValuePtr    fromVal;
  161. X    XrmValuePtr    toVal;
  162. X{
  163. X    static short    s;
  164. X
  165. X    if (*num_args != 0)
  166. X    XtWarningMsg("wrongParameters","cvtIntToShort","XtToolkitError",
  167. X                  "Integer to Short conversion needs no extra arguments",
  168. X                   (String *)NULL, (Cardinal *)NULL);
  169. X    s = (*(int *)fromVal->addr);
  170. X    done(&s, short);
  171. X};
  172. X
  173. X
  174. X/*ARGSUSED*/
  175. Xstatic void CvtStringToBoolean(args, num_args, fromVal, toVal)
  176. X    XrmValuePtr args;
  177. X    Cardinal    *num_args;
  178. X    XrmValuePtr    fromVal;
  179. X    XrmValuePtr    toVal;
  180. X{
  181. X    static Boolean b;
  182. X    XrmQuark    q;
  183. X    char    lowerName[1000];
  184. X
  185. X    if (*num_args != 0)
  186. X    XtWarningMsg("wrongParameters","cvtStringToBoolean","XtToolkitError",
  187. X                  "String to Boolean conversion needs no extra arguments",
  188. X                   (String *)NULL, (Cardinal *)NULL);
  189. X
  190. X    LowerCase((char *) fromVal->addr, lowerName);
  191. X    q = XrmStringToQuark(lowerName);
  192. X
  193. X    if (q == XtQEtrue || q == XtQEon || q == XtQEyes) {
  194. X    b = TRUE;
  195. X    done(&b, Boolean);
  196. X    return;
  197. X    }
  198. X    if (q == XtQEfalse || q ==XtQEoff || q == XtQEno) {
  199. X    b = FALSE;
  200. X    done(&b, Boolean);
  201. X    return;
  202. X    }
  203. X
  204. X    XtStringConversionWarning((char *) fromVal->addr, "Boolean");
  205. X};
  206. X
  207. X
  208. X/*ARGSUSED*/
  209. Xstatic void CvtIntToBool(args, num_args, fromVal, toVal)
  210. X    XrmValuePtr args;
  211. X    Cardinal    *num_args;
  212. X    XrmValuePtr    fromVal;
  213. X    XrmValuePtr    toVal;
  214. X{
  215. X    static Bool    b;
  216. X
  217. X    if (*num_args != 0)
  218. X    XtWarningMsg("wrongParameters","cvtIntToBool","XtToolkitError",
  219. X                  "Integer to Bool conversion needs no extra arguments",
  220. X                   (String *)NULL, (Cardinal *)NULL);
  221. X    b = (*(int *)fromVal->addr != 0);
  222. X    done(&b, Bool);
  223. X};
  224. X
  225. X
  226. X/*ARGSUSED*/
  227. Xstatic void CvtStringToBool(args, num_args, fromVal, toVal)
  228. X    XrmValuePtr args;
  229. X    Cardinal    *num_args;
  230. X    XrmValuePtr    fromVal;
  231. X    XrmValuePtr    toVal;
  232. X{
  233. X    static Bool    b;
  234. X    XrmQuark    q;
  235. X    char    lowerName[1000];
  236. X
  237. X    if (*num_args != 0)
  238. X    XtWarningMsg("wrongParameters","cvtStringToBool",
  239. X        "XtToolkitError",
  240. X                 "String to Bool conversion needs no extra arguments",
  241. X                  (String *)NULL, (Cardinal *)NULL);
  242. X
  243. X    LowerCase((char *) fromVal->addr, lowerName);
  244. X    q = XrmStringToQuark(lowerName);
  245. X
  246. X    if (q == XtQEtrue || q == XtQEon || q == XtQEyes) {
  247. X    b = TRUE;
  248. X    done(&b, Bool);
  249. X    return;
  250. X    }
  251. X    if (q == XtQEfalse || q ==XtQEoff || q == XtQEno) {
  252. X    b = FALSE;
  253. X    done(&b, Bool);
  254. X    return;
  255. X    }
  256. X
  257. X    XtStringConversionWarning((char *) fromVal->addr, "Bool");
  258. X};
  259. X
  260. XXtConvertArgRec colorConvertArgs[] = {
  261. X    {XtBaseOffset, (caddr_t) XtOffset(Widget, core.screen),  sizeof(Screen *)},
  262. X    {XtBaseOffset, (caddr_t) XtOffset(Widget, core.colormap),sizeof(Colormap)}
  263. X};
  264. X
  265. X
  266. Xstatic void CvtIntOrPixelToXColor(args, num_args, fromVal, toVal)
  267. X    XrmValuePtr args;
  268. X    Cardinal    *num_args;
  269. X    XrmValuePtr    fromVal;
  270. X    XrmValuePtr    toVal;
  271. X{    
  272. X    static XColor   c;
  273. X    Screen        *screen;
  274. X    Colormap        colormap;
  275. X
  276. X    if (*num_args != 2)
  277. X      XtErrorMsg("wrongParameters","cvtIntOrPixelToXColor","XtToolkitError",
  278. X         "Pixel to color conversion needs screen and colormap arguments",
  279. X          (String *)NULL, (Cardinal *)NULL);
  280. X    screen = *((Screen **) args[0].addr);
  281. X    colormap = *((Colormap *) args[1].addr);
  282. X    c.pixel = *(int *)fromVal->addr;
  283. X
  284. X    XQueryColor(DisplayOfScreen(screen), colormap, &c);
  285. X    done(&c, XColor);
  286. X};
  287. X
  288. X
  289. X/*ARGSUSED*/
  290. Xstatic void CvtStringToPixel(args, num_args, fromVal, toVal)
  291. X    XrmValuePtr args;
  292. X    Cardinal    *num_args;
  293. X    XrmValuePtr    fromVal;
  294. X    XrmValuePtr    toVal;
  295. X{
  296. X    static XColor   screenColor;
  297. X    XColor        exactColor;
  298. X    Screen        *screen;
  299. X    XtPerDisplay    perDpy;
  300. X    XtAppContext    app;
  301. X    Colormap        colormap;
  302. X    Status        status;
  303. X    char        message[1000];
  304. X    XrmQuark        q;
  305. X    String          params[1];
  306. X    Cardinal       num_params=1;
  307. X
  308. X    if (*num_args != 2)
  309. X     XtErrorMsg("wrongParameters","cvtStringToPixel","XtToolkitError",
  310. X       "String to pixel conversion needs screen and colormap arguments",
  311. X        (String *)NULL, (Cardinal *)NULL);
  312. X
  313. X    screen = *((Screen **) args[0].addr);
  314. X    perDpy = _XtGetPerDisplay(DisplayOfScreen(screen));
  315. X    app = perDpy->appContext;
  316. X    colormap = *((Colormap *) args[1].addr);
  317. X
  318. X    LowerCase((char *) fromVal->addr, message);
  319. X    q = XrmStringToQuark(message);
  320. X
  321. X    if (q == XtQExtdefaultbackground) {
  322. X    if (app->rv) { done(&screen->black_pixel, Pixel); return; }
  323. X    else { done(&screen->white_pixel, Pixel); return; }
  324. X    }
  325. X    if (q == XtQExtdefaultforeground) {
  326. X    if (app->rv) { done(&screen->white_pixel, Pixel); return; }
  327. X        else { done(&screen->black_pixel, Pixel); return; }
  328. X    }
  329. X
  330. X    if ((char) fromVal->addr[0] == '#') {  /* some color rgb definition */
  331. X
  332. X        status = XParseColor(DisplayOfScreen(screen), colormap,
  333. X                 (String) fromVal->addr, &screenColor);
  334. X
  335. X        if (status != 0)
  336. X           status = XAllocColor(DisplayOfScreen(screen), colormap,
  337. X                                &screenColor);
  338. X    } else  /* some color name */
  339. X
  340. X        status = XAllocNamedColor(DisplayOfScreen(screen), colormap,
  341. X                                  (String) fromVal->addr, &screenColor,
  342. X                  &exactColor);
  343. X    if (status == 0) {
  344. X       params[0]=(String)fromVal->addr;
  345. X       XtWarningMsg("noColormap","cvtStringToPixel","XtToolkitError",
  346. X                 "Cannot allocate colormap entry for \"%s\"",
  347. X                  params,&num_params);
  348. X    } else {
  349. X        done(&(screenColor.pixel), Pixel)
  350. X    }
  351. X
  352. X};
  353. X
  354. X
  355. XXtConvertArgRec screenConvertArg[] = {
  356. X    {XtBaseOffset, (caddr_t) XtOffset(Widget, core.screen), sizeof(Screen *)}
  357. X};
  358. X
  359. X/*ARGSUSED*/
  360. Xstatic void CvtStringToCursor(args, num_args, fromVal, toVal)
  361. X    XrmValuePtr args;
  362. X    Cardinal    *num_args;
  363. X    XrmValuePtr    fromVal;
  364. X    XrmValuePtr    toVal;
  365. X
  366. X{
  367. X    static struct _CursorName {
  368. X    char        *name;
  369. X    unsigned int    shape;
  370. X    Cursor        cursor;
  371. X    } cursor_names[] = {
  372. X            {"X_cursor",        XC_X_cursor,        NULL},
  373. X            {"arrow",        XC_arrow,        NULL},
  374. X            {"based_arrow_down",    XC_based_arrow_down,    NULL},
  375. X            {"based_arrow_up",    XC_based_arrow_up,      NULL},
  376. X            {"boat",        XC_boat,        NULL},
  377. X            {"bogosity",        XC_bogosity,        NULL},
  378. X            {"bottom_left_corner",    XC_bottom_left_corner,  NULL},
  379. X            {"bottom_right_corner",    XC_bottom_right_corner, NULL},
  380. X            {"bottom_side",        XC_bottom_side,        NULL},
  381. X            {"bottom_tee",        XC_bottom_tee,        NULL},
  382. X            {"box_spiral",        XC_box_spiral,        NULL},
  383. X            {"center_ptr",        XC_center_ptr,        NULL},
  384. X            {"circle",        XC_circle,        NULL},
  385. X            {"clock",        XC_clock,        NULL},
  386. X            {"coffee_mug",        XC_coffee_mug,        NULL},
  387. X            {"cross",        XC_cross,        NULL},
  388. X            {"cross_reverse",    XC_cross_reverse,       NULL},
  389. X            {"crosshair",        XC_crosshair,        NULL},
  390. X            {"diamond_cross",    XC_diamond_cross,       NULL},
  391. X            {"dot",            XC_dot,            NULL},
  392. X#ifdef XC_dotbox
  393. X            {"dotbox",        XC_dotbox,        NULL},
  394. X#endif
  395. X            {"double_arrow",    XC_double_arrow,    NULL},
  396. X            {"draft_large",        XC_draft_large,        NULL},
  397. X            {"draft_small",        XC_draft_small,        NULL},
  398. X            {"draped_box",        XC_draped_box,        NULL},
  399. X            {"exchange",        XC_exchange,        NULL},
  400. X            {"fleur",        XC_fleur,        NULL},
  401. X            {"gobbler",        XC_gobbler,        NULL},
  402. X            {"gumby",        XC_gumby,        NULL},
  403. X#ifdef XC_hand1
  404. X            {"hand1",        XC_hand1,        NULL},
  405. X#endif
  406. X#ifdef XC_hand2
  407. X            {"hand2",        XC_hand2,        NULL},
  408. X#endif
  409. X            {"heart",        XC_heart,        NULL},
  410. X            {"icon",        XC_icon,        NULL},
  411. X            {"iron_cross",        XC_iron_cross,        NULL},
  412. X            {"left_ptr",        XC_left_ptr,        NULL},
  413. X            {"left_side",        XC_left_side,        NULL},
  414. X            {"left_tee",        XC_left_tee,        NULL},
  415. X            {"leftbutton",        XC_leftbutton,        NULL},
  416. X            {"ll_angle",        XC_ll_angle,        NULL},
  417. X            {"lr_angle",        XC_lr_angle,        NULL},
  418. X            {"man",            XC_man,            NULL},
  419. X            {"middlebutton",    XC_middlebutton,    NULL},
  420. X            {"mouse",        XC_mouse,        NULL},
  421. X            {"pencil",        XC_pencil,        NULL},
  422. X            {"pirate",        XC_pirate,        NULL},
  423. X            {"plus",        XC_plus,        NULL},
  424. X            {"question_arrow",    XC_question_arrow,    NULL},
  425. X            {"right_ptr",        XC_right_ptr,        NULL},
  426. X            {"right_side",        XC_right_side,        NULL},
  427. X            {"right_tee",        XC_right_tee,        NULL},
  428. X            {"rightbutton",        XC_rightbutton,        NULL},
  429. X            {"rtl_logo",        XC_rtl_logo,        NULL},
  430. X            {"sailboat",        XC_sailboat,        NULL},
  431. X            {"sb_down_arrow",    XC_sb_down_arrow,       NULL},
  432. X            {"sb_h_double_arrow",    XC_sb_h_double_arrow,   NULL},
  433. X            {"sb_left_arrow",    XC_sb_left_arrow,       NULL},
  434. X            {"sb_right_arrow",    XC_sb_right_arrow,      NULL},
  435. X            {"sb_up_arrow",        XC_sb_up_arrow,        NULL},
  436. X            {"sb_v_double_arrow",    XC_sb_v_double_arrow,   NULL},
  437. X            {"shuttle",        XC_shuttle,        NULL},
  438. X            {"sizing",        XC_sizing,        NULL},
  439. X            {"spider",        XC_spider,        NULL},
  440. X            {"spraycan",        XC_spraycan,        NULL},
  441. X            {"star",        XC_star,        NULL},
  442. X            {"target",        XC_target,        NULL},
  443. X            {"tcross",        XC_tcross,        NULL},
  444. X            {"top_left_arrow",    XC_top_left_arrow,      NULL},
  445. X            {"top_left_corner",    XC_top_left_corner,    NULL},
  446. X            {"top_right_corner",    XC_top_right_corner,    NULL},
  447. X            {"top_side",        XC_top_side,        NULL},
  448. X            {"top_tee",        XC_top_tee,        NULL},
  449. X            {"trek",        XC_trek,        NULL},
  450. X            {"ul_angle",        XC_ul_angle,        NULL},
  451. X            {"umbrella",        XC_umbrella,        NULL},
  452. X            {"ur_angle",        XC_ur_angle,        NULL},
  453. X            {"watch",        XC_watch,        NULL},
  454. X            {"xterm",        XC_xterm,        NULL},
  455. X    };
  456. X    struct _CursorName *cache;
  457. X    char *name = (char *)fromVal->addr;
  458. X    register int i;
  459. X    Screen        *screen;
  460. X
  461. X    if (*num_args != 1)
  462. X     XtErrorMsg("wrongParameters","cvtStringToCursor","XtToolkitError",
  463. X             "String to cursor conversion needs screen argument",
  464. X              (String *)NULL, (Cardinal *)NULL);
  465. X
  466. X    screen = *((Screen **) args[0].addr);
  467. X    for (i=0, cache=cursor_names; i < XtNumber(cursor_names); i++, cache++ ) {
  468. X    if (strcmp(name, cache->name) == 0) {
  469. X#ifndef JON
  470. X/*
  471. X * Of course yet another static which blows away multiple displays
  472. X * since second (identical) widget on new display with this cursor
  473. X * the cursor aint never been heard of...by the server
  474. X */
  475. X        if (!cache->cursor)
  476. X#endif JON
  477. X        cache->cursor =
  478. X            XCreateFontCursor(DisplayOfScreen(screen), cache->shape );
  479. X        done(&(cache->cursor), Cursor);
  480. X        return;
  481. X    }
  482. X    }
  483. X    XtStringConversionWarning(name, "Cursor");
  484. X};
  485. X
  486. X
  487. X/*ARGSUSED*/
  488. Xstatic void CvtStringToDisplay(args, num_args, fromVal, toVal)
  489. X    XrmValuePtr args;
  490. X    Cardinal    *num_args;
  491. X    XrmValuePtr    fromVal;
  492. X    XrmValuePtr    toVal;
  493. X{
  494. X    static Display    *d;
  495. X
  496. X    if (*num_args != 0)
  497. X    XtWarningMsg("wrongParameters","cvtStringToDisplay","XtToolkitError",
  498. X                  "String to Display conversion needs no extra arguments",
  499. X                   (String *)NULL, (Cardinal *)NULL);
  500. X
  501. X    d = XOpenDisplay((char *)fromVal->addr);
  502. X    if (d != NULL) {
  503. X    done(&d, Display);
  504. X    } else {
  505. X    XtStringConversionWarning((char *) fromVal->addr, "Display");
  506. X    }
  507. X};
  508. X
  509. X
  510. X/*ARGSUSED*/
  511. Xstatic void CvtStringToFile(args, num_args, fromVal, toVal)
  512. X    XrmValuePtr args;
  513. X    Cardinal    *num_args;
  514. X    XrmValuePtr    fromVal;
  515. X    XrmValuePtr    toVal;
  516. X{
  517. X    static FILE    *f;
  518. X
  519. X    if (*num_args != 0)
  520. X    XtWarningMsg("wrongParameters","cvtStringToFile","XtToolkitError",
  521. X                 "String to File conversion needs no extra arguments",
  522. X                 (String *) NULL, (Cardinal *)NULL);
  523. X
  524. X    f = fopen((char *)fromVal->addr, "r");
  525. X    if (f != NULL) {
  526. X    done(&f, FILE);
  527. X    } else {
  528. X    XtStringConversionWarning((char *) fromVal->addr, "File");
  529. X    }
  530. X};
  531. X
  532. X
  533. X/*ARGSUSED*/
  534. Xstatic void CvtStringToFont(args, num_args, fromVal, toVal)
  535. X    XrmValuePtr args;
  536. X    Cardinal    *num_args;
  537. X    XrmValuePtr    fromVal;
  538. X    XrmValuePtr    toVal;
  539. X{
  540. X    static Font    f;
  541. X    Screen        *screen;
  542. X    Display         *display;
  543. X    char        lcfont[1000];
  544. X    XrmQuark        q;
  545. X
  546. X    if (*num_args != 1)
  547. X     XtErrorMsg("wrongParameters","cvtStringToFont","XtToolkitError",
  548. X             "String to font conversion needs screen argument",
  549. X              (String *) NULL, (Cardinal *)NULL);
  550. X
  551. X    screen = *((Screen **) args[0].addr);
  552. X    LowerCase((char *) fromVal->addr, lcfont);
  553. X    q = XrmStringToQuark(lcfont);
  554. X
  555. X    if (q != XtQExtdefaultfont) {
  556. X    f = XLoadFont(DisplayOfScreen(screen), (char *)fromVal->addr);
  557. X    if (f != 0) {
  558. X        done(&f, Font);
  559. X        return;
  560. X    }
  561. X    XtStringConversionWarning((char *) fromVal->addr, "Font");
  562. X    }
  563. X    /* try and get the default font */
  564. X
  565. X    display   = DisplayOfScreen(screen);
  566. X
  567. X    f = XLoadFont(display,"fixed");
  568. X
  569. X/* this crashes the server for some reason.  I think that it is */
  570. X/* supposed to work.  so for now we will use the above line     */
  571. X/*  done(&f, DefaultGCOfScreen(screen)->values.font);        */
  572. X
  573. X    if (f != 0) done(&f, Font);
  574. X}
  575. X
  576. X
  577. X/*ARGSUSED*/
  578. Xstatic void CvtIntToFont(args, num_args, fromVal, toVal)
  579. X    XrmValuePtr args;
  580. X    Cardinal    *num_args;
  581. X    XrmValuePtr    fromVal;
  582. X    XrmValuePtr    toVal;
  583. X{
  584. X    if (*num_args != 0)
  585. X    XtWarningMsg("wrongParameters","cvtIntToFont","XtToolkitError",
  586. X           "Integer to Font conversion needs no extra arguments",
  587. X            (String *) NULL, (Cardinal *)NULL);
  588. X    done(fromVal->addr, int);
  589. X};
  590. X
  591. X
  592. X/*ARGSUSED*/
  593. Xstatic void CvtStringToFontStruct(args, num_args, fromVal, toVal)
  594. X    XrmValuePtr args;
  595. X    Cardinal    *num_args;
  596. X    XrmValuePtr    fromVal;
  597. X    XrmValuePtr    toVal;
  598. X{
  599. X    static XFontStruct    *f;
  600. X    Screen        *screen;
  601. X    char        lcfont[1000];
  602. X    XrmQuark        q;
  603. X
  604. X    if (*num_args != 1)
  605. X     XtErrorMsg("wrongParameters","cvtStringToFontStruct","XtToolkitError",
  606. X             "String to cursor conversion needs screen argument",
  607. X              (String *) NULL, (Cardinal *)NULL);
  608. X
  609. X    screen = *((Screen **) args[0].addr);
  610. X    LowerCase((char *) fromVal->addr, lcfont);
  611. X    q = XrmStringToQuark(lcfont);
  612. X
  613. X    if (q != XtQExtdefaultfont) {
  614. X    f = XLoadQueryFont(DisplayOfScreen(screen), (char *)fromVal->addr);
  615. X    if (f != NULL) {
  616. X        done(&f, XFontStruct *);
  617. X        return;
  618. X    }
  619. X    XtStringConversionWarning((char *) fromVal->addr, "XFontStruct");
  620. X    }
  621. X
  622. X    /* try and get the default font */
  623. X
  624. X    /* This still crashes the server... */
  625. X/*  
  626. X    f = XQueryFont(DisplayOfScreen(screen),
  627. X               DefaultGCOfScreen(screen)->values.font);
  628. X*/
  629. X    /* ...so we do this instead */
  630. X
  631. X    f = XLoadQueryFont(DisplayOfScreen(screen), "fixed");
  632. X
  633. X    if (f != 0) done(&f, XFontStruct *);
  634. X}
  635. X
  636. X/*ARGSUSED*/
  637. Xstatic void CvtStringToInt(args, num_args, fromVal, toVal)
  638. X    XrmValuePtr args;
  639. X    Cardinal    *num_args;
  640. X    XrmValuePtr    fromVal;
  641. X    XrmValuePtr    toVal;
  642. X{
  643. X    static int    i;
  644. X
  645. X    if (*num_args != 0)
  646. X    XtWarningMsg("wrongParameters","cvtStringToInt","XtToolkitError",
  647. X                  "String to Integer conversion needs no extra arguments",
  648. X                  (String *) NULL, (Cardinal *)NULL);
  649. X    if (sscanf((char *)fromVal->addr, "%d", &i) == 1) {
  650. X    done(&i, int);
  651. X    } else {
  652. X    XtStringConversionWarning((char *) fromVal->addr, "Integer");
  653. X    }
  654. X}
  655. X
  656. X/*ARGSUSED*/
  657. Xstatic void CvtStringToShort(args, num_args, fromVal, toVal)
  658. X    XrmValuePtr args;
  659. X    Cardinal    *num_args;
  660. X    XrmValuePtr fromVal;
  661. X    XrmValuePtr toVal;
  662. X{
  663. X    static short i;
  664. X
  665. X    if (*num_args != 0)
  666. X        XtWarningMsg("wrongParameters","cvtStringToShort","XtToolkitError",
  667. X          "String to Integer conversion needs no extra arguments",
  668. X           (String *) NULL, (Cardinal *)NULL);
  669. X    if (sscanf((char *)fromVal->addr, "%hd", &i) == 1) {
  670. X        done(&i, short);
  671. X    } else {
  672. X        XtStringConversionWarning((char *) fromVal->addr, "Short");
  673. X    }
  674. X}
  675. X/*ARGSUSED*/
  676. Xstatic void CvtStringToUnsignedChar(args, num_args, fromVal, toVal)
  677. X    XrmValuePtr args;
  678. X    Cardinal    *num_args;
  679. X    XrmValuePtr fromVal;
  680. X    XrmValuePtr toVal;
  681. X{
  682. X    static int i;
  683. X    static unsigned char uc;
  684. X
  685. X    if (*num_args != 0)
  686. X        XtWarningMsg("wrongParameters","cvtStringToUnsignedChar","XtToolkitError",
  687. X                  "String to Integer conversion needs no extra arguments",
  688. X                   (String *) NULL, (Cardinal *)NULL);
  689. X    if (sscanf((char *)fromVal->addr, "%d", &i) == 1) {
  690. X
  691. X        if ( i < 0 || i > 255 )
  692. X            XtStringConversionWarning((char *) fromVal->addr, "Unsigned Char");
  693. X        uc = (unsigned char)i;
  694. X        done(&uc, unsigned char);
  695. X    } else {
  696. X        XtStringConversionWarning((char *) fromVal->addr, "Unsigned Char");
  697. X    }
  698. X}
  699. X
  700. X
  701. X/*ARGSUSED*/
  702. Xstatic void CvtXColorToPixel(args, num_args, fromVal, toVal)
  703. X    XrmValuePtr args;
  704. X    Cardinal    *num_args;
  705. X    XrmValuePtr    fromVal;
  706. X    XrmValuePtr    toVal;
  707. X{
  708. X    if (*num_args != 0)
  709. X    XtWarningMsg("wrongParameters","cvtXColorToPixel","XtToolkitError",
  710. X                  "Color to Pixel conversion needs no extra arguments",
  711. X                   (String *) NULL, (Cardinal *)NULL);
  712. X    done(&((XColor *)fromVal->addr)->pixel, int);
  713. X};
  714. X
  715. X/*ARGSUSED*/
  716. Xstatic void CvtIntToPixel(args, num_args, fromVal, toVal)
  717. X    XrmValuePtr args;
  718. X    Cardinal    *num_args;
  719. X    XrmValuePtr    fromVal;
  720. X    XrmValuePtr    toVal;
  721. X{
  722. X    if (*num_args != 0)
  723. X    XtWarningMsg("wrongParameters","cvtIntToPixel","XtToolkitError",
  724. X                  "Integer to Pixel conversion needs no extra arguments",
  725. X                   (String *) NULL, (Cardinal *)NULL);
  726. X    done(fromVal->addr, int);
  727. X};
  728. X
  729. X/*ARGSUSED*/
  730. Xstatic void CvtIntToPixmap(args, num_args, fromVal, toVal)
  731. X    XrmValuePtr args;
  732. X    Cardinal    *num_args;
  733. X    XrmValuePtr fromVal;
  734. X    XrmValuePtr toVal;
  735. X{
  736. X    if (*num_args != 0)
  737. X        XtWarningMsg("wrongParameters","cvtIntToPixmap","XtToolkitError",
  738. X                  "Integer to Pixmap conversion needs no extra arguments",
  739. X                   (String *) NULL, (Cardinal *)NULL);
  740. X    done(fromVal->addr, int);
  741. X};
  742. X
  743. X
  744. Xvoid LowerCase(source, dest)
  745. X    register char  *source, *dest;
  746. X{
  747. X    register char ch;
  748. X
  749. X    for (; (ch = *source) != 0; source++, dest++) {
  750. X        if ('A' <= ch && ch <= 'Z')
  751. X        *dest = ch - 'A' + 'a';
  752. X    else
  753. X        *dest = ch;
  754. X    }
  755. X    *dest = 0;
  756. X}
  757. X
  758. XXrmQuark  XtQBoolean;
  759. XXrmQuark  XtQBool;
  760. XXrmQuark  XtQColor;
  761. XXrmQuark  XtQCursor;
  762. XXrmQuark  XtQDisplay;
  763. XXrmQuark  XtQDimension;
  764. XXrmQuark  XtQFile;
  765. XXrmQuark  XtQFont;
  766. XXrmQuark  XtQFontStruct;
  767. XXrmQuark  XtQInt;
  768. XXrmQuark  XtQPixel;
  769. XXrmQuark  XtQPixmap;
  770. XXrmQuark  XtQPointer;
  771. XXrmQuark  XtQPosition;
  772. XXrmQuark  XtQShort;
  773. XXrmQuark  XtQString;
  774. XXrmQuark  XtQUnsignedChar;
  775. XXrmQuark  XtQWindow;
  776. X
  777. XXrmQuark  XtQEoff;
  778. XXrmQuark  XtQEfalse;
  779. XXrmQuark  XtQEno;
  780. XXrmQuark  XtQEon;
  781. XXrmQuark  XtQEtrue;
  782. XXrmQuark  XtQEyes;
  783. XXrmQuark  XtQEnotUseful;
  784. XXrmQuark  XtQEwhenMapped;
  785. XXrmQuark  XtQEalways;
  786. XXrmQuark  XtQEdefault;
  787. X
  788. XXrmQuark  XtQExtdefaultbackground;
  789. XXrmQuark  XtQExtdefaultforeground;
  790. XXrmQuark  XtQExtdefaultfont;
  791. X
  792. Xstatic Boolean initialized = FALSE;
  793. X
  794. Xvoid _XtConvertInitialize()
  795. X{
  796. X    if (initialized) return;
  797. X    initialized = TRUE;
  798. X
  799. X/* Representation types */
  800. X
  801. X    XtQBoolean        = XrmStringToQuark(XtRBoolean);
  802. X    XtQColor        = XrmStringToQuark(XtRColor);
  803. X    XtQCursor        = XrmStringToQuark(XtRCursor);
  804. X    XtQDimension    = XrmStringToQuark(XtRDimension);
  805. X    XtQDisplay        = XrmStringToQuark(XtRDisplay);
  806. X    XtQFile        = XrmStringToQuark(XtRFile);
  807. X    XtQFont        = XrmStringToQuark(XtRFont);
  808. X    XtQFontStruct    = XrmStringToQuark(XtRFontStruct);
  809. X    XtQInt        = XrmStringToQuark(XtRInt);
  810. X    XtQBool        = XrmStringToQuark(XtRBool);
  811. X    XtQPixel        = XrmStringToQuark(XtRPixel);
  812. X    XtQPixmap        = XrmStringToQuark(XtRPixmap);
  813. X    XtQPointer        = XrmStringToQuark(XtRPointer);
  814. X    XtQPosition        = XrmStringToQuark(XtRPosition);
  815. X    XtQShort            = XrmStringToQuark(XtRShort);
  816. X    XtQString        = XrmStringToQuark(XtRString);
  817. X    XtQUnsignedChar     = XrmStringToQuark(XtRUnsignedChar);
  818. X    XtQWindow        = XrmStringToQuark(XtRWindow);
  819. X
  820. X/* Boolean enumeration constants */
  821. X
  822. X    XtQEfalse        = XrmStringToQuark(XtEfalse);
  823. X    XtQEno        = XrmStringToQuark(XtEno);
  824. X    XtQEoff        = XrmStringToQuark(XtEoff);
  825. X    XtQEon        = XrmStringToQuark(XtEon);
  826. X    XtQEtrue        = XrmStringToQuark(XtEtrue);
  827. X    XtQEyes        = XrmStringToQuark(XtEyes);
  828. X
  829. X/* Default color and font  enumeration constants */
  830. X
  831. X    XtQExtdefaultbackground = XrmStringToQuark(XtExtdefaultbackground);
  832. X    XtQExtdefaultforeground = XrmStringToQuark(XtExtdefaultforeground);
  833. X    XtQExtdefaultfont        = XrmStringToQuark(XtExtdefaultfont);
  834. X}
  835. X
  836. X_XtAddDefaultConverters(table)
  837. X    ConverterTable table;
  838. X{
  839. X#define Add(from, to, proc, convert_args, num_args) \
  840. X    _XtTableAddConverter(table, from, to, (XtConverter) proc, \
  841. X        (XtConvertArgList) convert_args, num_args)
  842. X
  843. X    Add(XtQColor,   XtQPixel,       CvtXColorToPixel,        NULL, 0);
  844. X    Add(XtQInt,     XtQBoolean,     CvtIntToBoolean,        NULL, 0);
  845. X    Add(XtQInt,     XtQBool,        CvtIntToBool,        NULL, 0);
  846. X    Add(XtQInt,        XtQDimension,   CvtIntToShort,        NULL, 0);
  847. X    Add(XtQInt,     XtQPixel,       CvtIntToPixel,          NULL, 0);
  848. X    Add(XtQInt,     XtQPosition,    CvtIntToShort,          NULL, 0);
  849. X    Add(XtQInt,     XtQPixmap,      CvtIntToPixmap,        NULL, 0);
  850. X    Add(XtQInt,     XtQFont,        CvtIntToFont,        NULL, 0);
  851. X    Add(XtQInt,     XtQColor,       CvtIntOrPixelToXColor,  
  852. X    colorConvertArgs, XtNumber(colorConvertArgs));
  853. X
  854. X    Add(XtQString,  XtQBoolean,     CvtStringToBoolean,     NULL, 0);
  855. X    Add(XtQString,  XtQBool,        CvtStringToBool,        NULL, 0);
  856. X    Add(XtQString,  XtQCursor,      CvtStringToCursor,      
  857. X    screenConvertArg, XtNumber(screenConvertArg));
  858. X    Add(XtQString,  XtQDimension,   CvtStringToShort,       NULL, 0);
  859. X    Add(XtQString,  XtQDisplay,     CvtStringToDisplay,     NULL, 0);
  860. X    Add(XtQString,  XtQFile,        CvtStringToFile,        NULL, 0);
  861. X    Add(XtQString,  XtQFont,        CvtStringToFont,        
  862. X    screenConvertArg, XtNumber(screenConvertArg));
  863. X    Add(XtQString,  XtQFontStruct,  CvtStringToFontStruct,  
  864. X    screenConvertArg, XtNumber(screenConvertArg));
  865. X    Add(XtQString,  XtQInt,         CvtStringToInt,        NULL, 0);
  866. X    Add(XtQString,  XtQPosition,    CvtStringToShort,       NULL, 0);
  867. X    Add(XtQString,  XtQPixel,       CvtStringToPixel,       
  868. X    colorConvertArgs, XtNumber(colorConvertArgs));
  869. X    Add(XtQString,  XtQShort,       CvtStringToShort,       NULL, 0);
  870. X    Add(XtQString,  XtQUnsignedChar,CvtStringToUnsignedChar,NULL, 0);
  871. X
  872. X    Add(XtQPixel,   XtQColor,       CvtIntOrPixelToXColor,  
  873. X    colorConvertArgs, XtNumber(colorConvertArgs));
  874. X
  875. X   _XtAddTMConverters(table);
  876. X}
  877. END_OF_FILE
  878. if test 25972 -ne `wc -c <'xconf/Converters.c'`; then
  879.     echo shar: \"'xconf/Converters.c'\" unpacked with wrong size!
  880. fi
  881. # end of 'xconf/Converters.c'
  882. fi
  883. if test -f 'xconf/Text.c.ac' -a "${1}" != "-c" ; then 
  884.   echo shar: Will not clobber existing file \"'xconf/Text.c.ac'\"
  885. else
  886. echo shar: Extracting \"'xconf/Text.c.ac'\" \(25203 characters\)
  887. sed "s/^X//" >'xconf/Text.c.ac' <<'END_OF_FILE'
  888. X/* The following used to be a separate file, TextActs.c, but
  889. X   is included here because textActionsTable can't be external
  890. X   to the file declaring textClassRec */
  891. X
  892. X/* Misc. routines */
  893. Xvoid TextAcceptFocus(w)
  894. X    Widget          w;
  895. X{
  896. X    TextWidget ctx = (TextWidget) w;
  897. X    if (!ctx->text.hasfocus)
  898. X    XSetInputFocus(XtDisplay(ctx), XtWindow(ctx), 
  899. X      RevertToPointerRoot,  CurrentTime);
  900. X}
  901. X
  902. Xstatic StartAction(ctx, event)
  903. X   TextWidget ctx;
  904. X   XEvent *event;
  905. X{
  906. X    _XtTextPrepareToUpdate(ctx);
  907. X    if (event != NULL) {
  908. X    switch (event->type) {
  909. X      case ButtonPress:
  910. X      case ButtonRelease:
  911. X                    ctx->text.time = event->xbutton.time;
  912. X                    ctx->text.ev_x = event->xbutton.x;
  913. X                    ctx->text.ev_y = event->xbutton.y;
  914. X                    break;
  915. X      case KeyPress:
  916. X      case KeyRelease:
  917. X                    ctx->text.time = event->xkey.time;
  918. X                    ctx->text.ev_x = event->xkey.x;
  919. X                    ctx->text.ev_y = event->xkey.y;
  920. X                    break;
  921. X      case MotionNotify:
  922. X                    ctx->text.time = event->xmotion.time;
  923. X                    ctx->text.ev_x = event->xmotion.x;
  924. X                    ctx->text.ev_y = event->xmotion.y;
  925. X                    break;
  926. X      case EnterNotify:
  927. X      case LeaveNotify:
  928. X                    ctx->text.time = event->xcrossing.time;
  929. X                    ctx->text.ev_x = event->xcrossing.x;
  930. X                    ctx->text.ev_y = event->xcrossing.y;
  931. X    }
  932. X#ifdef JON
  933. X        XtCallCallbacks(ctx, XtNcallback, (caddr_t)event); 
  934. X#endif JON
  935. X    }
  936. X}
  937. X
  938. Xstatic EndAction(ctx)
  939. X   TextWidget ctx;
  940. X{
  941. X    CheckResizeOrOverflow(ctx);
  942. X    _XtTextExecuteUpdate(ctx);
  943. X}
  944. X
  945. X#ifdef notdef
  946. Xstatic DoFeep(ctx)
  947. X    TextWidget ctx;
  948. X{
  949. X    XBell(XtDisplay(ctx), 50);
  950. X}
  951. X#endif
  952. X
  953. Xstatic DeleteOrKill(ctx, from, to, kill)
  954. X    TextWidget       ctx;
  955. X    XtTextPosition from, to;
  956. X    Boolean       kill;
  957. X{
  958. X    XtTextBlock text;
  959. X    char *ptr;
  960. X
  961. X    if (kill && from < to) {
  962. X    ptr = _XtTextGetText(ctx, from, to);
  963. X    XStoreBuffer(XtDisplay(ctx), ptr, strlen(ptr), 1);
  964. X    XtFree(ptr);
  965. X    }
  966. X    text.length = 0;
  967. X    text.firstPos = 0;
  968. X    if (ReplaceText(ctx, from, to, &text)) {
  969. X    XBell(XtDisplay(ctx), 50);
  970. X    return;
  971. X    }
  972. X    ctx->text.insertPos = from;
  973. X    XtTextUnsetSelection((Widget)ctx);
  974. X    ctx->text.showposition = TRUE;
  975. X}
  976. X
  977. X
  978. XStuffFromBuffer(ctx, buffer)
  979. X  TextWidget ctx;
  980. X  int buffer;
  981. X{
  982. X    extern char *XFetchBuffer();
  983. X    XtTextBlock text;
  984. X    text.ptr = XFetchBuffer(XtDisplay(ctx), &(text.length), buffer);
  985. X    text.firstPos = 0;
  986. X    if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
  987. X    XBell(XtDisplay(ctx), 50);
  988. X    return;
  989. X    }
  990. X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
  991. X        ctx->text.insertPos, XtstPositions, XtsdRight, text.length, TRUE);
  992. X    XtTextUnsetSelection((Widget)ctx);
  993. X    XtFree(text.ptr);
  994. X}
  995. X
  996. X
  997. Xstatic void UnKill(ctx, event)
  998. X  TextWidget ctx;
  999. X   XEvent *event;
  1000. X{
  1001. X   StartAction(ctx, event);
  1002. X    StuffFromBuffer(ctx, 1);
  1003. X   EndAction(ctx);
  1004. X}
  1005. X
  1006. X
  1007. Xstatic void Stuff(ctx, event)
  1008. X  TextWidget ctx;
  1009. X   XEvent *event;
  1010. X{
  1011. X   StartAction(ctx, event);
  1012. X    StuffFromBuffer(ctx, 0);
  1013. X   EndAction(ctx);
  1014. X}
  1015. X
  1016. X
  1017. Xstruct _SelectionList {
  1018. X    String *params;
  1019. X    Cardinal count;
  1020. X    Time time;
  1021. X};
  1022. X
  1023. Xstatic void _GetSelection(w, time, params, num_params)
  1024. XWidget w;
  1025. XTime time;
  1026. XString *params;            /* selections in precedence order */
  1027. XCardinal num_params;
  1028. X{
  1029. X    void _SelectionReceived();
  1030. X    Atom selection;
  1031. X    int buffer;
  1032. X
  1033. X    XmuInternStrings(XtDisplay(w), params, (Cardinal)1, &selection);
  1034. X    switch (selection) {
  1035. X      case XA_CUT_BUFFER0: buffer = 0; break;
  1036. X      case XA_CUT_BUFFER1: buffer = 1; break;
  1037. X      case XA_CUT_BUFFER2: buffer = 2; break;
  1038. X      case XA_CUT_BUFFER3: buffer = 3; break;
  1039. X      case XA_CUT_BUFFER4: buffer = 4; break;
  1040. X      case XA_CUT_BUFFER5: buffer = 5; break;
  1041. X      case XA_CUT_BUFFER6: buffer = 6; break;
  1042. X      case XA_CUT_BUFFER7: buffer = 7; break;
  1043. X      default:           buffer = -1;
  1044. X    }
  1045. X    if (buffer >= 0) {
  1046. X    unsigned long nbytes;
  1047. X    int fmt8 = 8;
  1048. X    Atom type = XA_STRING;
  1049. X    char *line = XFetchBuffer(XtDisplay(w), &nbytes, buffer);
  1050. X    if (nbytes > 0)
  1051. X        _SelectionReceived(w, NULL, &selection, &type, (caddr_t)line,
  1052. X                   &nbytes, &fmt8);
  1053. X    else if (num_params > 1)
  1054. X        _GetSelection(w, time, params+1, num_params-1);
  1055. X    } else {
  1056. X    struct _SelectionList* list;
  1057. X    if (--num_params) {
  1058. X        list = XtNew(struct _SelectionList);
  1059. X        list->params = params + 1;
  1060. X        list->count = num_params;
  1061. X        list->time = time;
  1062. X    } else list = NULL;
  1063. X    XtGetSelectionValue(w, selection, XA_STRING, _SelectionReceived,
  1064. X                (caddr_t)list, time);
  1065. X    }
  1066. X}
  1067. X
  1068. X
  1069. X/* ARGSUSED */
  1070. Xstatic void _SelectionReceived(w, client_data, selection, type,
  1071. X                   value, length, format)
  1072. XWidget w;
  1073. Xcaddr_t client_data;
  1074. XAtom *selection, *type;
  1075. Xcaddr_t value;
  1076. Xunsigned long *length;
  1077. Xint *format;
  1078. X{
  1079. X    TextWidget ctx = (TextWidget)w;
  1080. X    XtTextBlock text;
  1081. X                  
  1082. X    if (*type == 0 /*XT_CONVERT_FAIL*/ || *length == 0) {
  1083. X    struct _SelectionList* list = (struct _SelectionList*)client_data;
  1084. X    if (list != NULL) {
  1085. X        _GetSelection(w, list->time, list->params, list->count);
  1086. X        XtFree(client_data);
  1087. X    }
  1088. X    return;
  1089. X    }
  1090. X
  1091. X    StartAction(ctx, NULL);
  1092. X
  1093. X    text.ptr = (char*)value;
  1094. X    text.firstPos = 0;
  1095. X    text.length = *length;
  1096. X    text.format = FMT8BIT;
  1097. X    if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
  1098. X    XBell(XtDisplay(ctx), 50);
  1099. X    return;
  1100. X    }
  1101. X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
  1102. X        ctx->text.insertPos, XtstPositions, XtsdRight, text.length, TRUE);
  1103. X    XtTextUnsetSelection((Widget)ctx);
  1104. X
  1105. X    EndAction(ctx);
  1106. X
  1107. X    XtFree(client_data);
  1108. X    XtFree(value);
  1109. X}
  1110. X
  1111. X
  1112. Xstatic void InsertSelection(w, event, params, num_params)
  1113. X   Widget w;
  1114. X   XEvent *event;
  1115. X   String *params;        /* precedence list of selections to try */
  1116. X   Cardinal *num_params;
  1117. X{
  1118. X   static String default_params[] = {"PRIMARY", "CUT_BUFFER0"};
  1119. X   int count;
  1120. X   StartAction((TextWidget)w, event);
  1121. X    if ((count = *num_params) == 0) {
  1122. X    params = default_params;
  1123. X    count = XtNumber(default_params);
  1124. X    }
  1125. X    _GetSelection(w, ((TextWidget)w)->text.time, params, count);
  1126. X   EndAction((TextWidget)w);
  1127. X}
  1128. X
  1129. X
  1130. Xstatic XtTextPosition NextPosition(ctx, position, kind, direction)
  1131. X    TextWidget ctx;
  1132. X    XtTextPosition position;
  1133. X    XtTextScanType kind;
  1134. X    XtTextScanDirection direction;
  1135. X{
  1136. X    XtTextPosition pos;
  1137. X
  1138. X     pos = (*ctx->text.source->Scan)(
  1139. X        ctx->text.source, position, kind, direction, 1, FALSE);
  1140. X     if (pos == ctx->text.insertPos) 
  1141. X         pos = (*ctx->text.source->Scan)(
  1142. X            ctx->text.source, position, kind, direction, 2, FALSE);
  1143. X     return pos;
  1144. X}
  1145. X
  1146. X/* routines for moving around */
  1147. X
  1148. Xstatic void MoveForwardChar(ctx, event)
  1149. X   TextWidget ctx;
  1150. X   XEvent *event;
  1151. X{
  1152. X   StartAction(ctx, event);
  1153. X   ctx->text.insertPos = (*ctx->text.source->Scan)(
  1154. X        ctx->text.source, ctx->text.insertPos, XtstPositions, XtsdRight, 1, 
  1155. X    TRUE);
  1156. X   EndAction(ctx);
  1157. X}
  1158. X
  1159. Xstatic void MoveBackwardChar(ctx, event)
  1160. X    TextWidget ctx;
  1161. X   XEvent *event;
  1162. X{
  1163. X   StartAction(ctx, event);
  1164. X    ctx->text.insertPos = (*ctx->text.source->Scan)(
  1165. X            ctx->text.source, ctx->text.insertPos, XtstPositions, XtsdLeft,
  1166. X        1, TRUE);
  1167. X   EndAction(ctx);
  1168. X}
  1169. X
  1170. Xstatic void MoveForwardWord(ctx, event)
  1171. X    TextWidget ctx;
  1172. X   XEvent *event;
  1173. X{
  1174. X   StartAction(ctx, event);
  1175. X    ctx->text.insertPos = NextPosition(ctx, ctx->text.insertPos, 
  1176. X      XtstWhiteSpace, XtsdRight);
  1177. X   EndAction(ctx);
  1178. X}
  1179. X
  1180. Xstatic void MoveBackwardWord(ctx, event)
  1181. X    TextWidget ctx;
  1182. X   XEvent *event;
  1183. X{
  1184. X   StartAction(ctx, event);
  1185. X    ctx->text.insertPos = NextPosition(ctx, ctx->text.insertPos, 
  1186. X      XtstWhiteSpace, XtsdLeft);
  1187. X   EndAction(ctx);
  1188. X}
  1189. X
  1190. Xstatic void MoveBackwardParagraph(ctx, event)
  1191. X    TextWidget ctx;
  1192. X   XEvent *event;
  1193. X{
  1194. X   StartAction(ctx, event);
  1195. X    ctx->text.insertPos = NextPosition(ctx, ctx->text.insertPos, 
  1196. X      XtstEOL, XtsdLeft);
  1197. X   EndAction(ctx);
  1198. X}
  1199. X
  1200. Xstatic void MoveForwardParagraph(ctx, event)
  1201. X    TextWidget ctx;
  1202. X   XEvent *event;
  1203. X{
  1204. X   StartAction(ctx, event);
  1205. X    ctx->text.insertPos = NextPosition(ctx, ctx->text.insertPos, 
  1206. X      XtstEOL, XtsdRight);
  1207. X   EndAction(ctx);
  1208. X}
  1209. X
  1210. X
  1211. Xstatic void MoveToLineStart(ctx, event)
  1212. X  TextWidget ctx;
  1213. X   XEvent *event;
  1214. X{
  1215. X    int line;
  1216. X   StartAction(ctx, event);
  1217. X    _XtTextShowPosition(ctx);
  1218. X    line = LineForPosition(ctx, ctx->text.insertPos);
  1219. X    ctx->text.insertPos = ctx->text.lt.info[line].position;
  1220. X   EndAction(ctx);
  1221. X}
  1222. X
  1223. Xstatic void MoveToLineEnd(ctx, event)
  1224. X  TextWidget ctx;
  1225. X   XEvent *event;
  1226. X{
  1227. X    int line;
  1228. X    XtTextPosition next;
  1229. X   StartAction(ctx, event);
  1230. X    _XtTextShowPosition(ctx);
  1231. X    line = LineForPosition(ctx, ctx->text.insertPos);
  1232. X    next = ctx->text.lt.info[line+1].position;
  1233. X    if (next > ctx->text.lastPos)
  1234. X    next = ctx->text.lastPos;
  1235. X    else
  1236. X    next = (*ctx->text.source->Scan)(ctx->text.source, next, XtstPositions, 
  1237. X      XtsdLeft, 1, TRUE);
  1238. X    ctx->text.insertPos = next;
  1239. X   EndAction(ctx);
  1240. X}
  1241. X
  1242. X
  1243. Xstatic void MoveNextLine(ctx, event)
  1244. X  TextWidget ctx;
  1245. X   XEvent *event;
  1246. X{
  1247. X    int     width, width2, height, line;
  1248. X    XtTextPosition position, maxp;
  1249. X   StartAction(ctx, event);
  1250. X    _XtTextShowPosition(ctx);
  1251. X    line = LineForPosition(ctx, ctx->text.insertPos);
  1252. X    if (line == ctx->text.lt.lines - 1 &&
  1253. X    ctx->text.lt.info[ctx->text.lt.lines].position <= ctx->text.lastPos) {
  1254. X    _XtTextScroll(ctx, 1);
  1255. X    line = LineForPosition(ctx, ctx->text.insertPos);
  1256. X    }
  1257. X    (*ctx->text.sink->FindDistance)(ctx,
  1258. X        ctx->text.lt.info[line].position, ctx->text.lt.info[line].x,
  1259. X        ctx->text.insertPos, &width, &position, &height);
  1260. X    line++;
  1261. X    if (ctx->text.lt.info[line].position > ctx->text.lastPos) {
  1262. X    ctx->text.insertPos = ctx->text.lastPos;
  1263. X    EndAction(ctx);
  1264. X    return;
  1265. X    }
  1266. X    (*ctx->text.sink->FindPosition)(ctx,
  1267. X        ctx->text.lt.info[line].position, ctx->text.lt.info[line].x,
  1268. X        width, FALSE, &position, &width2, &height);
  1269. X    maxp = (*ctx->text.source->Scan)(ctx->text.source,
  1270. X            ctx->text.lt.info[line+1].position,
  1271. X        XtstPositions, XtsdLeft, 1, TRUE);
  1272. X    if (position > maxp)
  1273. X    position = maxp;
  1274. X    ctx->text.insertPos = position;
  1275. X   EndAction(ctx);
  1276. X}
  1277. X
  1278. Xstatic void MovePreviousLine(ctx, event)
  1279. X  TextWidget ctx;
  1280. X   XEvent *event;
  1281. X{
  1282. X    int     width, width2, height, line;
  1283. X    XtTextPosition position, maxp;
  1284. X   StartAction(ctx, event);
  1285. X    _XtTextShowPosition(ctx);
  1286. X    line = LineForPosition(ctx, ctx->text.insertPos);
  1287. X    if (line == 0) {
  1288. X    _XtTextScroll(ctx, -1);
  1289. X    line = LineForPosition(ctx, ctx->text.insertPos);
  1290. X    }
  1291. X    if (line > 0) {
  1292. X    (*ctx->text.sink->FindDistance)(ctx,
  1293. X            ctx->text.lt.info[line].position, 
  1294. X            ctx->text.lt.info[line].x,
  1295. X            ctx->text.insertPos, &width, &position, &height);
  1296. X    line--;
  1297. X    (*ctx->text.sink->FindPosition)(ctx,
  1298. X        ctx->text.lt.info[line].position, ctx->text.lt.info[line].x,
  1299. X        width, FALSE, &position, &width2, &height);
  1300. X    maxp = (*ctx->text.source->Scan)(ctx->text.source, 
  1301. X        ctx->text.lt.info[line+1].position,
  1302. X        XtstPositions, XtsdLeft, 1, TRUE);
  1303. X    if (position > maxp)
  1304. X        position = maxp;
  1305. X    ctx->text.insertPos = position;
  1306. X    }
  1307. X   EndAction(ctx);
  1308. X}
  1309. X
  1310. X
  1311. X
  1312. Xstatic void MoveBeginningOfFile(ctx, event)
  1313. X  TextWidget ctx;
  1314. X   XEvent *event;
  1315. X{
  1316. X   StartAction(ctx, event);
  1317. X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
  1318. X        ctx->text.insertPos, XtstAll, XtsdLeft, 1, TRUE);
  1319. X   EndAction(ctx);
  1320. X}
  1321. X
  1322. X
  1323. Xstatic void MoveEndOfFile(ctx, event)
  1324. X  TextWidget ctx;
  1325. X   XEvent *event;
  1326. X{
  1327. X   StartAction(ctx, event);
  1328. X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
  1329. X        ctx->text.insertPos, XtstAll,  XtsdRight, 1, TRUE);
  1330. X   EndAction(ctx);
  1331. X}
  1332. X
  1333. Xstatic void ScrollOneLineUp(ctx, event)
  1334. X  TextWidget ctx;
  1335. X   XEvent *event;
  1336. X{
  1337. X   StartAction(ctx, event);
  1338. X    _XtTextScroll(ctx, 1);
  1339. X   EndAction(ctx);
  1340. X}
  1341. X
  1342. Xstatic void ScrollOneLineDown(ctx, event)
  1343. X  TextWidget ctx;
  1344. X   XEvent *event;
  1345. X{
  1346. X   StartAction(ctx, event);
  1347. X    _XtTextScroll(ctx, -1);
  1348. X   EndAction(ctx);
  1349. X}
  1350. X
  1351. Xstatic void MoveNextPage(ctx, event)
  1352. X  TextWidget ctx;
  1353. X   XEvent *event;
  1354. X{
  1355. X   StartAction(ctx, event);
  1356. X    _XtTextScroll(ctx, max(1, ctx->text.lt.lines - 2));
  1357. X    ctx->text.insertPos = ctx->text.lt.top;
  1358. X   EndAction(ctx);
  1359. X}
  1360. X
  1361. Xstatic void MovePreviousPage(ctx, event)
  1362. X  TextWidget ctx;
  1363. X   XEvent *event;
  1364. X{
  1365. X   StartAction(ctx, event);
  1366. X    _XtTextScroll(ctx, -max(1, ctx->text.lt.lines - 2));
  1367. X    ctx->text.insertPos = ctx->text.lt.top;
  1368. X   EndAction(ctx);
  1369. X}
  1370. X
  1371. X
  1372. X
  1373. X
  1374. X/* delete routines */
  1375. X
  1376. Xstatic void DeleteForwardChar(ctx, event)
  1377. X    TextWidget ctx;
  1378. X   XEvent *event;
  1379. X{
  1380. X    XtTextPosition next;
  1381. X
  1382. X   StartAction(ctx, event);
  1383. X    next = (*ctx->text.source->Scan)(
  1384. X            ctx->text.source, ctx->text.insertPos, XtstPositions, 
  1385. X        XtsdRight, 1, TRUE);
  1386. X    DeleteOrKill(ctx, ctx->text.insertPos, next, FALSE);
  1387. X   EndAction(ctx);
  1388. X}
  1389. X
  1390. Xstatic void DeleteBackwardChar(ctx, event)
  1391. X    TextWidget ctx;
  1392. X   XEvent *event;
  1393. X{
  1394. X    XtTextPosition next;
  1395. X
  1396. X   StartAction(ctx, event);
  1397. X    next = (*ctx->text.source->Scan)(
  1398. X            ctx->text.source, ctx->text.insertPos, XtstPositions, 
  1399. X        XtsdLeft, 1, TRUE);
  1400. X    DeleteOrKill(ctx, next, ctx->text.insertPos, FALSE);
  1401. X   EndAction(ctx);
  1402. X}
  1403. X
  1404. Xstatic void DeleteForwardWord(ctx, event)
  1405. X    TextWidget ctx;
  1406. X   XEvent *event;
  1407. X{
  1408. X    XtTextPosition next;
  1409. X
  1410. X   StartAction(ctx, event);
  1411. X    next = NextPosition(ctx, ctx->text.insertPos, XtstWhiteSpace, XtsdRight);
  1412. X    DeleteOrKill(ctx, ctx->text.insertPos, next, FALSE);
  1413. X   EndAction(ctx);
  1414. X}
  1415. X
  1416. Xstatic void DeleteBackwardWord(ctx, event)
  1417. X    TextWidget ctx;
  1418. X   XEvent *event;
  1419. X{
  1420. X    XtTextPosition next;
  1421. X
  1422. X   StartAction(ctx, event);
  1423. X    next = NextPosition(ctx, ctx->text.insertPos, XtstWhiteSpace, XtsdLeft);
  1424. X    DeleteOrKill(ctx, next, ctx->text.insertPos, FALSE);
  1425. X   EndAction(ctx);
  1426. X}
  1427. X
  1428. Xstatic void KillForwardWord(ctx, event)
  1429. X    TextWidget ctx;
  1430. X   XEvent *event;
  1431. X{
  1432. X    XtTextPosition next;
  1433. X
  1434. X   StartAction(ctx, event);
  1435. X    next = NextPosition(ctx, ctx->text.insertPos, XtstWhiteSpace, XtsdRight);
  1436. X    DeleteOrKill(ctx, ctx->text.insertPos, next, TRUE);
  1437. X   EndAction(ctx);
  1438. X}
  1439. X
  1440. Xstatic void KillBackwardWord(ctx, event)
  1441. X    TextWidget ctx;
  1442. X   XEvent *event;
  1443. X{
  1444. X    XtTextPosition next;
  1445. X
  1446. X   StartAction(ctx, event);
  1447. X    next = NextPosition(ctx, ctx->text.insertPos, XtstWhiteSpace, XtsdLeft);
  1448. X    DeleteOrKill(ctx, next, ctx->text.insertPos, TRUE);
  1449. X   EndAction(ctx);
  1450. X}
  1451. X
  1452. Xstatic void KillCurrentSelection(ctx, event)
  1453. X    TextWidget ctx;
  1454. X   XEvent *event;
  1455. X{
  1456. X   StartAction(ctx, event);
  1457. X    DeleteOrKill(ctx, ctx->text.s.left, ctx->text.s.right, TRUE);
  1458. X   EndAction(ctx);
  1459. X}
  1460. X
  1461. Xstatic void DeleteCurrentSelection(ctx, event)
  1462. X    TextWidget ctx;
  1463. X   XEvent *event;
  1464. X{
  1465. X   StartAction(ctx, event);
  1466. X    DeleteOrKill(ctx, ctx->text.s.left, ctx->text.s.right, FALSE);
  1467. X   EndAction(ctx);
  1468. X}
  1469. X
  1470. Xstatic void KillToEndOfLine(ctx, event)
  1471. X    TextWidget ctx;
  1472. X   XEvent *event;
  1473. X{
  1474. X    int     line;
  1475. X    XtTextPosition last, next;
  1476. X   StartAction(ctx, event);
  1477. X    _XtTextShowPosition(ctx);
  1478. X    line = LineForPosition(ctx, ctx->text.insertPos);
  1479. X    last = ctx->text.lt.info[line + 1].position;
  1480. X    next = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos,
  1481. X       XtstEOL, XtsdRight, 1, FALSE);
  1482. X    if (last > ctx->text.lastPos)
  1483. X    last = ctx->text.lastPos;
  1484. X    if (last > next && ctx->text.insertPos < next)
  1485. X    last = next;
  1486. X    DeleteOrKill(ctx, ctx->text.insertPos, last, TRUE);
  1487. X   EndAction(ctx);
  1488. X}
  1489. X
  1490. Xstatic void KillToEndOfParagraph(ctx, event)
  1491. X    TextWidget ctx;
  1492. X   XEvent *event;
  1493. X{
  1494. X    XtTextPosition next;
  1495. X
  1496. X   StartAction(ctx, event);
  1497. X    next = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos,
  1498. X                       XtstEOL, XtsdRight, 1, FALSE);
  1499. X    if (next == ctx->text.insertPos)
  1500. X    next = (*ctx->text.source->Scan)(ctx->text.source, next, XtstEOL,
  1501. X                       XtsdRight, 1, TRUE);
  1502. X    DeleteOrKill(ctx, ctx->text.insertPos, next, TRUE);
  1503. X   EndAction(ctx);
  1504. X}
  1505. X
  1506. Xstatic void InsertNewLineAndBackup(ctx, event)
  1507. X  TextWidget ctx;
  1508. X   XEvent *event;
  1509. X{
  1510. X   StartAction(ctx, event);
  1511. X   InsertNewLineAndBackupInternal(ctx);
  1512. X   EndAction(ctx);
  1513. X}
  1514. X
  1515. Xstatic int InsertNewLineAndBackupInternal(ctx)
  1516. X  TextWidget ctx;
  1517. X{
  1518. X    XtTextBlock text;
  1519. X    text.length = 1;
  1520. X    text.ptr = "\n";
  1521. X    text.firstPos = 0;
  1522. X    if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
  1523. X    XBell( XtDisplay(ctx), 50);
  1524. X    return(EditError);
  1525. X    }
  1526. X    XtTextUnsetSelection((Widget)ctx);
  1527. X    ctx->text.showposition = TRUE;
  1528. X    return(EditDone);
  1529. X}
  1530. X
  1531. X
  1532. X
  1533. Xstatic int InsertNewLine(ctx, event)
  1534. X    TextWidget ctx;
  1535. X   XEvent *event;
  1536. X{
  1537. X    XtTextPosition next;
  1538. X
  1539. X   StartAction(ctx, event);
  1540. X    if (InsertNewLineAndBackupInternal(ctx))
  1541. X    return(EditError);
  1542. X    next = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos,
  1543. X        XtstPositions, XtsdRight, 1, TRUE);
  1544. X    ctx->text.insertPos = next;
  1545. X   EndAction(ctx);
  1546. X    return(EditDone);
  1547. X}
  1548. X
  1549. X
  1550. Xstatic void InsertNewLineAndIndent(ctx, event)
  1551. X  TextWidget ctx;
  1552. X   XEvent *event;
  1553. X{
  1554. X    XtTextBlock text;
  1555. X    XtTextPosition pos1, pos2;
  1556. X
  1557. X   StartAction(ctx, event);
  1558. X    pos1 = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos, 
  1559. X        XtstEOL, XtsdLeft, 1, FALSE);
  1560. X    pos2 = (*ctx->text.source->Scan)(ctx->text.source, pos1, XtstEOL, 
  1561. X        XtsdLeft, 1, TRUE);
  1562. X    pos2 = (*ctx->text.source->Scan)(ctx->text.source, pos2, XtstWhiteSpace, 
  1563. X        XtsdRight, 1, TRUE);
  1564. X    text.ptr = _XtTextGetText(ctx, pos1, pos2);
  1565. X    text.length = strlen(text.ptr);
  1566. X    if (InsertNewLine(ctx, event)) return;
  1567. X    text.firstPos = 0;
  1568. X    if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
  1569. X    XBell(XtDisplay(ctx), 50);
  1570. X    EndAction(ctx);
  1571. X    return;
  1572. X    }
  1573. X    ctx->text.insertPos = (*ctx->text.source->Scan)(ctx->text.source, 
  1574. X        ctx->text.insertPos, XtstPositions, XtsdRight, text.length, TRUE);
  1575. X    XtFree(text.ptr);
  1576. X   EndAction(ctx);
  1577. X}
  1578. X
  1579. Xstatic void SelectWord(ctx, event, params, num_params)
  1580. X  TextWidget ctx;
  1581. X   XEvent *event;
  1582. X   String *params;
  1583. X   Cardinal *num_params;
  1584. X{
  1585. X    XtTextPosition l, r;
  1586. X   StartAction(ctx, event);
  1587. X    l = (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos, 
  1588. X        XtstWhiteSpace, XtsdLeft, 1, FALSE);
  1589. X    r = (*ctx->text.source->Scan)(ctx->text.source, l, XtstWhiteSpace, 
  1590. X        XtsdRight, 1, FALSE);
  1591. X    _XtTextSetNewSelection(ctx, l, r,
  1592. X               _SelectionList(ctx, params, *num_params),
  1593. X               *num_params);
  1594. X   EndAction(ctx);
  1595. X}
  1596. X
  1597. X
  1598. Xstatic void SelectAll(ctx, event, params, num_params)
  1599. X  TextWidget ctx;
  1600. X   XEvent *event;
  1601. X   String *params;
  1602. X   Cardinal *num_params;
  1603. X{
  1604. X   StartAction(ctx, event);
  1605. X   _XtTextSetNewSelection(ctx, (XtTextPosition)0, ctx->text.lastPos,
  1606. X              _SelectionList(ctx, params, *num_params),
  1607. X              *num_params);
  1608. X   EndAction(ctx);
  1609. X}
  1610. X
  1611. Xstatic void SelectStart(ctx, event, params, num_params)
  1612. X  TextWidget ctx;
  1613. X   XEvent *event;
  1614. X   String *params;        /* unused */
  1615. X   Cardinal *num_params;    /* unused */
  1616. X{
  1617. X   StartAction(ctx, event);
  1618. X    AlterSelection(ctx, XtsmTextSelect, XtactionStart, NULL, ZERO);
  1619. X   EndAction(ctx);
  1620. X}
  1621. X
  1622. Xstatic void SelectAdjust(ctx, event, params, num_params)
  1623. X  TextWidget ctx;
  1624. X   XEvent *event;
  1625. X   String *params;        /* unused */
  1626. X   Cardinal *num_params;    /* unused */
  1627. X{
  1628. X   StartAction(ctx, event);
  1629. X    AlterSelection(ctx, XtsmTextSelect, XtactionAdjust, NULL, ZERO);
  1630. X   EndAction(ctx);
  1631. X}
  1632. X
  1633. Xstatic void SelectEnd(ctx, event, params, num_params)
  1634. X  TextWidget ctx;
  1635. X   XEvent *event;
  1636. X   String *params;
  1637. X   Cardinal *num_params;
  1638. X{
  1639. X   StartAction(ctx, event);
  1640. X    AlterSelection(ctx, XtsmTextSelect, XtactionEnd, params, num_params);
  1641. X   EndAction(ctx);
  1642. X}
  1643. X
  1644. Xstatic void ExtendStart(ctx, event, params, num_params)
  1645. X  TextWidget ctx;
  1646. X   XEvent *event;
  1647. X   String *params;        /* unused */
  1648. X   Cardinal *num_params;    /* unused */
  1649. X{
  1650. X   StartAction(ctx, event);
  1651. X    AlterSelection(ctx, XtsmTextExtend, XtactionStart, NULL, ZERO);
  1652. X   EndAction(ctx);
  1653. X}
  1654. X
  1655. Xstatic void ExtendAdjust(ctx, event, params, num_params)
  1656. X  TextWidget ctx;
  1657. X   XEvent *event;
  1658. X   String *params;        /* unused */
  1659. X   Cardinal *num_params;    /* unused */
  1660. X{
  1661. X   StartAction(ctx, event);
  1662. X    AlterSelection(ctx, XtsmTextExtend, XtactionAdjust, NULL, ZERO);
  1663. X   EndAction(ctx);
  1664. X}
  1665. X
  1666. Xstatic void ExtendEnd(ctx, event, params, num_params)
  1667. X  TextWidget ctx;
  1668. X   XEvent *event;
  1669. X   String *params;
  1670. X   Cardinal *num_params;
  1671. X{
  1672. X   StartAction(ctx, event);
  1673. X    AlterSelection(ctx, XtsmTextExtend, XtactionEnd, params, num_params);
  1674. X   EndAction(ctx);
  1675. X}
  1676. X
  1677. X
  1678. Xstatic void RedrawDisplay(ctx, event)
  1679. X  TextWidget ctx;
  1680. X   XEvent *event;
  1681. X{
  1682. X   StartAction(ctx, event);
  1683. X    ForceBuildLineTable(ctx);
  1684. X    DisplayTextWindow((Widget)ctx);
  1685. X   EndAction(ctx);
  1686. X}
  1687. X
  1688. X
  1689. X/* ARGSUSED */
  1690. Xvoid _XtTextAbortDialog(w, closure, call_data)
  1691. X     Widget w;            /* unused */
  1692. X     caddr_t closure;        /* dialog */
  1693. X     caddr_t call_data;        /* unused */
  1694. X{
  1695. X   struct _dialog *dialog = (struct _dialog*)closure;
  1696. X   Widget popup = dialog->widget->core.parent;
  1697. X   TextWidget ctx = dialog->text; 
  1698. X
  1699. X   StartAction(ctx, (XEvent*)NULL);
  1700. X     XtPopdown(popup);
  1701. X     dialog->mapped = False;
  1702. X     if (dialog->message)
  1703. X     XtUnmanageChild( dialog->message );
  1704. X   EndAction(ctx);
  1705. X}
  1706. X
  1707. X
  1708. X/* Insert a file of the given name into the text.  Returns 0 if file found, 
  1709. X   -1 if not. */
  1710. X
  1711. Xstatic int InsertFileNamed(ctx, str)
  1712. X  TextWidget ctx;
  1713. X  char *str;
  1714. X{
  1715. X    int fid;
  1716. X    XtTextBlock text;
  1717. X    char    buf[1000];
  1718. X    XtTextPosition position;
  1719. X
  1720. X    if (str == NULL || strlen(str) == 0) return -1;
  1721. X    fid = open(str, O_RDONLY);
  1722. X    if (fid <= 0) return -1;
  1723. X    _XtTextPrepareToUpdate(ctx);
  1724. X    position = ctx->text.insertPos;
  1725. X    text.firstPos = 0;
  1726. X    while ((text.length = read(fid, buf, 512)) > 0) {
  1727. X    text.ptr = buf;
  1728. X    (void) ReplaceText(ctx, position, position, &text);
  1729. X    position = (*ctx->text.source->Scan)(ctx->text.source, position, 
  1730. X        XtstPositions, XtsdRight, text.length, TRUE);
  1731. X    }
  1732. X    (void) close(fid);
  1733. X    ctx->text.insertPos = position;
  1734. X    _XtTextExecuteUpdate(ctx);
  1735. X    return 0;
  1736. X}
  1737. X
  1738. X/* ARGSUSED */
  1739. Xstatic void DoInsert(w, closure, call_data)
  1740. X     Widget w;            /* unused */
  1741. X     caddr_t closure;        /* text widget */
  1742. X     caddr_t call_data;        /* unused */
  1743. X{
  1744. X    struct _dialog *dialog = (struct _dialog*)closure;
  1745. X
  1746. X    if (InsertFileNamed( dialog->text,
  1747. X             XtDialogGetValueString(dialog->widget) )) {
  1748. X    char msg[128];
  1749. X    static Arg args[] = {
  1750. X        {XtNlabel, NULL},
  1751. X        {XtNfromVert, NULL},
  1752. X        {XtNleft, (XtArgVal)XtChainLeft},
  1753. X        {XtNright, (XtArgVal)XtChainRight},
  1754. X        {XtNborderWidth, 0},
  1755. X    };
  1756. X    sprintf( msg, "*** Error: %s ***",
  1757. X         (errno > 0 && errno < sys_nerr) ?
  1758. X            sys_errlist[errno] : "Can't open file" );
  1759. X    args[0].value = (XtArgVal)msg;
  1760. X    if (dialog->message) {
  1761. X        XtSetValues( dialog->message, args, ONE );
  1762. X        XtManageChild( dialog->message );
  1763. X    }
  1764. X    else {
  1765. X        args[1].value = (XtArgVal)dialog->doit;
  1766. X        dialog->message =
  1767. X        XtCreateManagedWidget( "message", labelWidgetClass,
  1768. X                       dialog->widget, args, XtNumber(args) );
  1769. X    }
  1770. X/*    XBell(XtDisplay(w), 50); */
  1771. X    }
  1772. X    else {
  1773. X    _XtTextAbortDialog(w, closure, NULL);
  1774. X    }
  1775. X}
  1776. X
  1777. X/*ARGSUSED*/
  1778. Xstatic void TextFocusIn (ctx, event)
  1779. X  TextWidget ctx;
  1780. X   XEvent *event;
  1781. X{ ctx->text.hasfocus = TRUE; }
  1782. X
  1783. X/*ARGSUSED*/
  1784. Xstatic void TextFocusOut(ctx, event)
  1785. X  TextWidget ctx;
  1786. X   XEvent *event;
  1787. X{ ctx->text.hasfocus = FALSE; }
  1788. X
  1789. X#ifdef JON
  1790. X
  1791. X/*
  1792. XXXX Here is where to update any other windows...
  1793. X */
  1794. X#endif
  1795. X
  1796. X#define STRBUFSIZE 100
  1797. X
  1798. Xstatic XComposeStatus compose_status = {NULL, 0};
  1799. Xstatic void InsertChar(ctx, event)
  1800. X  TextWidget ctx;
  1801. X   XEvent *event;
  1802. X{
  1803. X   char strbuf[STRBUFSIZE];
  1804. X   int     keycode;
  1805. X   XtTextBlock text;
  1806. X   text.length = XLookupString (event, strbuf, STRBUFSIZE,
  1807. X                &keycode, &compose_status);
  1808. X   if (text.length==0) return;
  1809. X   StartAction(ctx, event);
  1810. X   text.ptr = &strbuf[0];
  1811. X   text.firstPos = 0;
  1812. X   if (ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text)) {
  1813. X    XBell(XtDisplay(ctx), 50);
  1814. X    EndAction(ctx);
  1815. X    return;
  1816. X    }
  1817. X    ctx->text.insertPos =
  1818. X    (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos,
  1819. X                XtstPositions, XtsdRight, text.length, TRUE);
  1820. X   XtTextUnsetSelection((Widget)ctx);
  1821. X
  1822. X   EndAction(ctx);
  1823. X}
  1824. X
  1825. Xstatic void InsertFile(w, event)
  1826. X    Widget w;
  1827. X    XEvent *event;
  1828. X{
  1829. X    TextWidget ctx = (TextWidget)w;
  1830. X    register struct _dialog *dialog, *prev;
  1831. X    char *ptr;
  1832. X    static char *dialog_label = "Insert File:";
  1833. X#ifdef notdef
  1834. X    XtTextBlock text;
  1835. X#endif
  1836. X    register Widget popup;
  1837. X    static Arg popup_args[] = {
  1838. X    {XtNx, NULL},
  1839. X    {XtNy, NULL},
  1840. X    {XtNiconName, NULL},
  1841. X    {XtNgeometry, NULL},
  1842. X    {XtNallowShellResize, True},
  1843. X    {XtNsaveUnder, True},
  1844. X    };
  1845. X    Arg args[2];
  1846. X    int x, y;
  1847. X    Window j;
  1848. X
  1849. X   StartAction(ctx, event);
  1850. X    if (ctx->text.source->edit_mode != XttextEdit) {
  1851. X    XBell(XtDisplay(w), 50);
  1852. X    EndAction(ctx);
  1853. X    return;
  1854. X    }
  1855. X    if (ctx->text.s.left < ctx->text.s.right) {
  1856. X    ptr = _XtTextGetText(ctx, ctx->text.s.left, ctx->text.s.right);
  1857. X    DeleteCurrentSelection(ctx, (XEvent*)NULL);
  1858. X#ifdef notdef
  1859. X    if (InsertFileNamed(ctx, ptr)) {
  1860. X        XBell( XtDisplay(w), 50);
  1861. X        text.ptr = ptr;
  1862. X        text.length = strlen(ptr);
  1863. X        text.firstPos = 0;
  1864. X        (void) ReplaceText(ctx, ctx->text.insertPos, ctx->text.insertPos, &text);
  1865. X        ctx->text.s.left = ctx->text.insertPos;
  1866. X        ctx->text.s.right = ctx->text.insertPos = 
  1867. X          (*ctx->text.source->Scan)(ctx->text.source, ctx->text.insertPos, 
  1868. X          XtstPositions, XtsdRight, text.length, TRUE);
  1869. X    }
  1870. X    XtFree(ptr);
  1871. X    EndAction(ctx);
  1872. X    return;
  1873. X#endif
  1874. X    }
  1875. X    else {
  1876. X    ptr = "";
  1877. X    }
  1878. X    XTranslateCoordinates( XtDisplay(w), XtWindow(w),
  1879. X               RootWindowOfScreen(XtScreen(w)), 0, 0, &x, &y, &j );
  1880. X    x += ctx->text.dialog_horiz_offset;
  1881. X    y += ctx->text.dialog_vert_offset;
  1882. X    if (ctx->text.sbar)
  1883. X    x += ctx->text.sbar->core.width + ctx->text.sbar->core.border_width;
  1884. X    prev = NULL;
  1885. X    for (dialog = ctx->text.dialog; dialog; dialog = dialog->next) {
  1886. X    if (!dialog->mapped)
  1887. X        break;
  1888. END_OF_FILE
  1889. if test 25203 -ne `wc -c <'xconf/Text.c.ac'`; then
  1890.     echo shar: \"'xconf/Text.c.ac'\" unpacked with wrong size!
  1891. fi
  1892. # end of 'xconf/Text.c.ac'
  1893. fi
  1894. if test -f 'xconf/ru.h' -a "${1}" != "-c" ; then 
  1895.   echo shar: Will not clobber existing file \"'xconf/ru.h'\"
  1896. else
  1897. echo shar: Extracting \"'xconf/ru.h'\" \(576 characters\)
  1898. sed "s/^X//" >'xconf/ru.h' <<'END_OF_FILE'
  1899. X/*
  1900. X * Not def'd anywhere useful
  1901. X */
  1902. X#define CPUSTATES 4
  1903. X
  1904. X#ifdef sun
  1905. X#define DK_NDRIVE 4
  1906. X#endif
  1907. X
  1908. X#include <pwd.h>
  1909. X#ifdef hp
  1910. X#include <time.h>
  1911. X#endif
  1912. X#include <sys/types.h>
  1913. X#include <sys/socket.h>
  1914. X#include <sys/ioctl.h>
  1915. X#include <rpcsvc/rstat.h>
  1916. X#include <utmp.h>
  1917. X#include <rpcsvc/rusers.h>
  1918. X#include <netinet/in.h>
  1919. X#include <netdb.h>
  1920. X#include <stdio.h>
  1921. X#include <sgtty.h>
  1922. X#include <signal.h>
  1923. X#include <errno.h>
  1924. X
  1925. X
  1926. X/*
  1927. X * Also not cleanly available without includeing almost all of sys
  1928. X */
  1929. X#define FSCALE (1<<8)
  1930. X
  1931. X#ifdef pyr
  1932. Xextern int errno;
  1933. X#endif
  1934. X
  1935. X#define XHosts "/etc/X0.hosts"
  1936. END_OF_FILE
  1937. if test 576 -ne `wc -c <'xconf/ru.h'`; then
  1938.     echo shar: \"'xconf/ru.h'\" unpacked with wrong size!
  1939. fi
  1940. # end of 'xconf/ru.h'
  1941. fi
  1942. echo shar: End of archive 3 \(of 5\).
  1943. cp /dev/null ark3isdone
  1944. MISSING=""
  1945. for I in 1 2 3 4 5 ; do
  1946.     if test ! -f ark${I}isdone ; then
  1947.     MISSING="${MISSING} ${I}"
  1948.     fi
  1949. done
  1950. if test "${MISSING}" = "" ; then
  1951.     echo You have unpacked all 5 archives.
  1952.     rm -f ark[1-9]isdone
  1953. else
  1954.     echo You still need to unpack the following archives:
  1955.     echo "        " ${MISSING}
  1956. fi
  1957. ##  End of shell archive.
  1958. exit 0
  1959.