dtkcvt.c 24 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031
  1. /*
  2. * CDE - Common Desktop Environment
  3. *
  4. * Copyright (c) 1993-2012, The Open Group. All rights reserved.
  5. *
  6. * These libraries and programs are free software; you can
  7. * redistribute them and/or modify them under the terms of the GNU
  8. * Lesser General Public License as published by the Free Software
  9. * Foundation; either version 2 of the License, or (at your option)
  10. * any later version.
  11. *
  12. * These libraries and programs are distributed in the hope that
  13. * they will be useful, but WITHOUT ANY WARRANTY; without even the
  14. * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  15. * PURPOSE. See the GNU Lesser General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with these libraries and programs; if not, write
  20. * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
  21. * Floor, Boston, MA 02110-1301 USA
  22. */
  23. /* $TOG: dtkcvt.c /main/7 1998/04/20 12:54:59 mgreess $ */
  24. /* Copyright (c) 1991, 1992 UNIX System Laboratories, Inc. */
  25. /* All Rights Reserved */
  26. /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
  27. /* UNIX System Laboratories, Inc. */
  28. /* The copyright notice above does not evidence any */
  29. /* actual or intended publication of such source code. */
  30. /* X includes */
  31. #include "shell.h"
  32. #include <signal.h>
  33. #include <fcntl.h>
  34. #include <X11/X.h>
  35. #include <X11/Intrinsic.h>
  36. #include <X11/IntrinsicP.h>
  37. #include <X11/CoreP.h>
  38. #include <X11/StringDefs.h>
  39. #include <Xm/XmStrDefs.h>
  40. #include <setjmp.h>
  41. #include <string.h>
  42. #include <ctype.h>
  43. #include <Xm/Xm.h>
  44. #include <Xm/Protocols.h>
  45. #include <Xm/MwmUtil.h>
  46. #include <Dt/Service.h>
  47. #include <Dt/Wsm.h>
  48. #include <Dt/HourGlass.h>
  49. #include <Dt/Help.h>
  50. #include <Dt/EnvControlP.h>
  51. #include <Dt/Print.h>
  52. #include "hash.h"
  53. #include "stdio.h"
  54. #include "dtksh.h"
  55. #include "xmksh.h"
  56. #include "XtCvtrs.h"
  57. #include "dtkcmds.h"
  58. #include "xmcvt.h"
  59. #include "widget.h"
  60. #include "extra.h"
  61. #include "xmwidgets.h"
  62. #include "msgs.h"
  63. extern Hashtab_t * Wclasses;
  64. static void CvtStringToMWMValue(
  65. MWMTable * table,
  66. Display *dpy,
  67. XrmValuePtr args,
  68. Cardinal *nargs,
  69. XrmValuePtr fval,
  70. XrmValuePtr toval,
  71. XtPointer data ) ;
  72. static void CvtMWMValueToString(
  73. MWMTable * table,
  74. Display *dpy,
  75. XrmValuePtr args,
  76. Cardinal *nargs,
  77. XrmValuePtr fval,
  78. XrmValuePtr toval,
  79. XtPointer data ) ;
  80. /*
  81. * Converters for dtksh
  82. */
  83. void
  84. DtkshCvtWindowToString(
  85. XrmValuePtr args,
  86. Cardinal *nargs,
  87. XrmValuePtr fval,
  88. XrmValuePtr toval )
  89. {
  90. static char result[16];
  91. Window window;
  92. char * errmsg;
  93. if (fval->size != sizeof(Window))
  94. {
  95. errmsg = strdup(GETMESSAGE(
  96. "DtkshCvtWindowToString: The 'from' value is an invalid size"));
  97. XtWarning(errmsg);
  98. free(errmsg);
  99. toval->addr = NULL;
  100. toval->size = 0;
  101. return;
  102. }
  103. window = ((Window *)(fval->addr))[0];
  104. if (window == None)
  105. sprintf(result, "None");
  106. else
  107. sprintf(result, "0x%x", window);
  108. toval->addr = result;
  109. toval->size = strlen(result)+1;
  110. }
  111. void
  112. DtkshCvtScreenToString(
  113. XrmValuePtr args,
  114. Cardinal *nargs,
  115. XrmValuePtr fval,
  116. XrmValuePtr toval )
  117. {
  118. static char result[16];
  119. Screen * screen;
  120. char * errmsg;
  121. if (fval->size != sizeof(Screen *))
  122. {
  123. errmsg = strdup(GETMESSAGE(
  124. "DtkshCvtScreenToString: The 'from' value is an invalid size"));
  125. XtWarning(errmsg);
  126. free(errmsg);
  127. toval->addr = NULL;
  128. toval->size = 0;
  129. return;
  130. }
  131. screen = ((Screen **)(fval->addr))[0];
  132. sprintf(result, "0x%lx", (unsigned long)screen);
  133. toval->addr = result;
  134. toval->size = strlen(result)+1;
  135. }
  136. void
  137. DtkshCvtStringToScreen(
  138. XrmValuePtr args,
  139. Cardinal *nargs,
  140. XrmValuePtr fval,
  141. XrmValuePtr toval )
  142. {
  143. static Screen * screen;
  144. char * errmsg;
  145. char * p;
  146. if (fval->size <= 0 || fval->addr == NULL)
  147. {
  148. toval->addr = NULL;
  149. toval->size = 0;
  150. return;
  151. }
  152. screen = (Screen *)strtoul(fval->addr, &p, 0);
  153. if (p != fval->addr)
  154. {
  155. toval->addr = (XtPointer)&screen;
  156. toval->size = sizeof(Screen *);
  157. }
  158. else
  159. {
  160. toval->addr = NULL;
  161. toval->size = 0;
  162. return;
  163. }
  164. }
  165. void
  166. DtkshCvtStringToTopItemPosition(
  167. XrmValuePtr args,
  168. Cardinal *nargs,
  169. XrmValuePtr fval,
  170. XrmValuePtr toval )
  171. {
  172. static int topItemPosition;
  173. char * p;
  174. if (fval->size <= 0 || fval->addr == NULL)
  175. {
  176. toval->addr = NULL;
  177. toval->size = 0;
  178. return;
  179. }
  180. topItemPosition = (int)strtoul(fval->addr, &p, 0);
  181. if (p != fval->addr)
  182. {
  183. toval->addr = (XtPointer)&topItemPosition;
  184. toval->size = sizeof(int);
  185. }
  186. else
  187. {
  188. toval->addr = NULL;
  189. toval->size = 0;
  190. return;
  191. }
  192. }
  193. void
  194. DtkshCvtHexIntToString(
  195. XrmValuePtr args,
  196. Cardinal *nargs,
  197. XrmValuePtr fval,
  198. XrmValuePtr toval )
  199. {
  200. static char result[16];
  201. char * errmsg;
  202. if (fval->size != sizeof(long) && fval->size != sizeof(int) &&
  203. fval->size != sizeof(short) && fval->size != sizeof(char))
  204. {
  205. errmsg = strdup(GETMESSAGE(
  206. "DtkshCvtHexIntToString: The 'from' value is an invalid size"));
  207. XtWarning(errmsg);
  208. free(errmsg);
  209. toval->addr = NULL;
  210. toval->size = 0;
  211. return;
  212. }
  213. if (fval->size == sizeof(long))
  214. sprintf(result, "0x%lx", ((long *)(fval->addr))[0]);
  215. else if (fval->size == sizeof(int))
  216. sprintf(result, "0x%x", ((int *)(fval->addr))[0]);
  217. else if (fval->size == sizeof(short))
  218. sprintf(result, "0x%x", (int)(((short *)(fval->addr))[0]));
  219. else if (fval->size == sizeof(char))
  220. sprintf(result, "0x%x", (int)(((char *)(fval->addr))[0]));
  221. toval->addr = result;
  222. toval->size = strlen(result)+1;
  223. }
  224. void
  225. DtkshCvtIntToString(
  226. XrmValuePtr args,
  227. Cardinal *nargs,
  228. XrmValuePtr fval,
  229. XrmValuePtr toval )
  230. {
  231. static char result[16];
  232. char * errmsg;
  233. if (fval->size != sizeof(int) && fval->size != sizeof(short))
  234. {
  235. errmsg = strdup(GETMESSAGE(
  236. "DtkshCvtIntToString: The 'from' value is an invalid size"));
  237. XtWarning(errmsg);
  238. free(errmsg);
  239. toval->addr = NULL;
  240. toval->size = 0;
  241. return;
  242. }
  243. if (fval->size == sizeof(int))
  244. sprintf(result, "%d", ((int *)(fval->addr))[0]);
  245. else
  246. sprintf(result, "%d", (int)(((short *)(fval->addr))[0]));
  247. toval->addr = result;
  248. toval->size = strlen(result)+1;
  249. }
  250. void
  251. DtkshCvtBooleanToString(
  252. XrmValuePtr args,
  253. Cardinal *nargs,
  254. XrmValuePtr fval,
  255. XrmValuePtr toval )
  256. {
  257. char * errmsg;
  258. Boolean booleanState = False;
  259. if (fval->size != sizeof(int) && fval->size != sizeof(short) &&
  260. fval->size != sizeof(char))
  261. {
  262. errmsg = strdup(GETMESSAGE(
  263. "DtkshCvtBooleanToString: The 'from' value is an invalid size"));
  264. XtWarning(errmsg);
  265. free(errmsg);
  266. toval->addr = NULL;
  267. toval->size = 0;
  268. return;
  269. }
  270. if (fval->size == sizeof(int))
  271. booleanState = (Boolean) (((int *)(fval->addr))[0]);
  272. else if (fval->size == sizeof(short))
  273. booleanState = (Boolean) (((short *)(fval->addr))[0]);
  274. else if (fval->size == sizeof(char))
  275. booleanState = (Boolean) (((char *)(fval->addr))[0]);
  276. if (booleanState)
  277. toval->addr = (caddr_t)("true");
  278. else
  279. toval->addr = (caddr_t)("false");
  280. toval->size = strlen(toval->addr)+1;
  281. }
  282. void
  283. DtkshCvtStringToPointer(
  284. XrmValuePtr args,
  285. Cardinal *nargs,
  286. XrmValuePtr fval,
  287. XrmValuePtr toval )
  288. {
  289. static XtPointer ret;
  290. if (fval->size <= 0 || fval->addr == NULL)
  291. {
  292. toval->addr = NULL;
  293. toval->size = 0;
  294. return;
  295. }
  296. ret = (XtPointer)strdup(fval->addr);
  297. toval->addr = (XtPointer)&ret;
  298. toval->size = sizeof(XtPointer);
  299. return;
  300. }
  301. void
  302. DtkshCvtStringToWidget(
  303. Display *dpy,
  304. XrmValuePtr args,
  305. Cardinal *nargs,
  306. XrmValuePtr fval,
  307. XrmValuePtr toval,
  308. XtPointer data )
  309. {
  310. char *wname;
  311. static Widget wid;
  312. wtab_t *w;
  313. char * errmsg;
  314. if (fval->size <= 0)
  315. {
  316. errmsg = strdup(GETMESSAGE(
  317. "DtkshCvtStringToWidget: The 'from' value is an invalid size"));
  318. XtWarning(errmsg);
  319. free(errmsg);
  320. toval->addr = NULL;
  321. toval->size = 0;
  322. return;
  323. }
  324. wname = (char *)fval->addr;
  325. if (wname == NULL || wname[0] == '\0' || strcmp(wname, "NULL") == 0)
  326. {
  327. static Widget NullWidget = NULL;
  328. toval->addr = (XtPointer)&NullWidget;
  329. toval->size = sizeof(Widget);
  330. return;
  331. }
  332. if ((w = str_to_wtab("DtkshCvtStringToWidget", wname)) != NULL)
  333. {
  334. wid= w->w;
  335. toval->addr = (XtPointer)&wid;
  336. toval->size = sizeof(Widget);
  337. return;
  338. }
  339. /*
  340. * If we couldn't find it in our table, try looking up the
  341. * name in standard resource format.
  342. */
  343. if ((wid = DtkshNameToWidget(wname)) != NULL)
  344. {
  345. toval->addr = (XtPointer)&wid;
  346. toval->size = sizeof(Widget);
  347. return;
  348. }
  349. /*
  350. * We failed completely
  351. */
  352. {
  353. char errbuf[1024];
  354. errmsg = strdup(GETMESSAGE(
  355. "DtkshCvtStringToWidget: Unable to find a widget named '%s'"));
  356. sprintf(errbuf, errmsg, wname);
  357. XtWarning(errbuf);
  358. free(errmsg);
  359. }
  360. toval->addr = NULL;
  361. toval->size = 0;
  362. }
  363. void
  364. DtkshCvtStringToCallback(
  365. Display *dpy,
  366. XrmValuePtr args,
  367. Cardinal *nargs,
  368. XrmValuePtr fval,
  369. XrmValuePtr toval,
  370. XtPointer data )
  371. {
  372. static XtCallbackList cb;
  373. dtksh_client_data_t *cdata;
  374. classtab_t *c = DTKSHConversionClass;
  375. wtab_t *w = DTKSHConversionWidget;
  376. char * errmsg;
  377. if (fval->size <= 0)
  378. {
  379. errmsg = strdup(GETMESSAGE(
  380. "DtkshCvtStringToCallback: The 'from' value is an invalid size"));
  381. XtWarning(errmsg);
  382. free(errmsg);
  383. toval->addr = NULL;
  384. toval->size = 0;
  385. return;
  386. }
  387. cb = (XtCallbackList)XtMalloc(sizeof(XtCallbackRec)*2);
  388. cb[0].callback = (XtCallbackProc)stdCB;
  389. cdata = GetNewCBData((String)fval->addr, w, DTKSHConversionResource, None);
  390. cb[0].closure = (caddr_t)cdata;
  391. cb[1].callback = NULL;
  392. toval->addr = (XtPointer)&cb;
  393. toval->size = sizeof(XtCallbackList);
  394. }
  395. void
  396. DtkshCvtCallbackToString(
  397. Display *display,
  398. XrmValuePtr args,
  399. Cardinal *nargs,
  400. XrmValuePtr fval,
  401. XrmValuePtr toval,
  402. XtPointer converterData )
  403. {
  404. XtCallbackList cb;
  405. char buf[2048];
  406. char *p;
  407. char * errmsg;
  408. Boolean count = 0;
  409. if (fval->size != sizeof(XtCallbackList))
  410. {
  411. errmsg = strdup(GETMESSAGE(
  412. "DtkshCvtCallbackToString: The 'from' value is an invalid size"));
  413. XtWarning(errmsg);
  414. free(errmsg);
  415. toval->addr = NULL;
  416. toval->size = 0;
  417. return;
  418. }
  419. if (fval->addr == NULL)
  420. {
  421. toval->addr = ": ;";
  422. toval->size = 1;
  423. return;
  424. }
  425. p = &buf[0];
  426. *p = '\0';
  427. for (cb = ((XtCallbackList *)(fval->addr))[0]; cb->callback != NULL; cb++)
  428. {
  429. if (cb->callback == (XtCallbackProc)stdCB)
  430. {
  431. dtksh_client_data_t *cdata = (dtksh_client_data_t *)cb->closure;
  432. if (p + strlen((String)cdata->ksh_cmd) + 1 - buf > sizeof(buf))
  433. {
  434. errmsg = strdup(GetSharedMsg(DT_CONV_BUF_OVFL));
  435. XtWarning(errmsg);
  436. free(errmsg);
  437. break;
  438. }
  439. if (count > 0)
  440. p += sprintf(p, "|%s", (String)cdata->ksh_cmd);
  441. else
  442. p += sprintf(p, "%s", (String)cdata->ksh_cmd);
  443. count++;
  444. }
  445. }
  446. toval->addr = (XtPointer)strdup(buf);
  447. toval->size = strlen(buf) + 1;
  448. }
  449. void
  450. DtkshCvtWidgetToString(
  451. Display *dpy,
  452. XrmValuePtr args,
  453. Cardinal *nargs,
  454. XrmValuePtr fval,
  455. XrmValuePtr toval,
  456. XtPointer data )
  457. {
  458. char *wname;
  459. Widget widget;
  460. wtab_t *w;
  461. char * errmsg;
  462. if (fval->size != sizeof(Widget) || fval->addr == NULL)
  463. {
  464. errmsg = strdup(GETMESSAGE(
  465. "DtkshCvtWidgetToString: The 'from' value is an invalid size"));
  466. XtWarning(errmsg);
  467. free(errmsg);
  468. toval->addr = NULL;
  469. toval->size = 0;
  470. return;
  471. }
  472. widget = ((Widget *)fval->addr)[0];
  473. if (widget == NULL)
  474. {
  475. toval->addr = (XtPointer)("NULL");
  476. toval->size = 5;
  477. return;
  478. }
  479. if ((w = widget_to_wtab(widget)) == NULL)
  480. {
  481. errmsg = strdup(GETMESSAGE(
  482. "DtkshCvtWidgetToString: Unable to find a name for the widget"));
  483. XtWarning(errmsg);
  484. free(errmsg);
  485. toval->addr = NULL;
  486. toval->size = 0;
  487. return;
  488. }
  489. toval->addr = (XtPointer)w->widid;
  490. toval->size = strlen(w->widid) + 1;
  491. }
  492. /***********************************************/
  493. static EventMaskTable eventMasks[] = {
  494. {"XtAllEvents", XtAllEvents},
  495. {"NoEventMask", NoEventMask},
  496. {"KeyPressMask", KeyPressMask},
  497. {"KeyReleaseMask", KeyReleaseMask},
  498. {"ButtonPressMask", ButtonPressMask},
  499. {"ButtonReleaseMask", ButtonReleaseMask},
  500. {"EnterWindowMask", EnterWindowMask},
  501. {"LeaveWindowMask", LeaveWindowMask},
  502. {"PointerMotionMask", PointerMotionMask},
  503. {"PointerMotionHintMask", PointerMotionHintMask},
  504. {"Button1MotionMask", Button1MotionMask},
  505. {"Button2MotionMask", Button2MotionMask},
  506. {"Button3MotionMask", Button3MotionMask},
  507. {"Button4MotionMask", Button4MotionMask},
  508. {"Button5MotionMask", Button5MotionMask},
  509. {"ButtonMotionMask", ButtonMotionMask},
  510. {"KeymapStateMask", KeymapStateMask},
  511. {"ExposureMask", ExposureMask},
  512. {"VisibilityChangeMask", VisibilityChangeMask},
  513. {"StructureNotifyMask", StructureNotifyMask},
  514. {"ResizeRedirectMask", ResizeRedirectMask},
  515. {"SubstructureNotifyMask", SubstructureNotifyMask},
  516. {"SubstructureRedirectMask", SubstructureRedirectMask},
  517. {"FocusChangeMask", FocusChangeMask},
  518. {"PropertyChangeMask", PropertyChangeMask},
  519. {"ColormapChangeMask", ColormapChangeMask},
  520. {"OwnerGrabButtonMask", OwnerGrabButtonMask},
  521. {NULL, NoEventMask},
  522. };
  523. void
  524. DtkshCvtStringToEventMask(
  525. Display *dpy,
  526. XrmValuePtr args,
  527. Cardinal *nargs,
  528. XrmValuePtr fval,
  529. XrmValuePtr toval,
  530. XtPointer data )
  531. {
  532. static EventMask eventMask = 0;
  533. int i;
  534. char * ptr;
  535. char * eventMaskString;
  536. toval->addr = (XtPointer)&eventMask;
  537. toval->size = sizeof(EventMask);
  538. if (fval->size <= 0 || fval->addr == NULL)
  539. return;
  540. ptr = eventMaskString = strdup(fval->addr);
  541. /* Skip any leading whitespace. */
  542. while (isspace(*ptr) && (*ptr != '\0'))
  543. ptr++;
  544. eventMask = 0;
  545. ptr = strtok(ptr, "|");
  546. while (ptr)
  547. {
  548. for (i = 0; eventMasks[i].name; i++)
  549. {
  550. if (DtCompareISOLatin1(ptr, eventMasks[i].name))
  551. {
  552. eventMask |= eventMasks[i].mask;
  553. break;
  554. }
  555. }
  556. ptr = strtok(NULL, "|");
  557. }
  558. XtFree(eventMaskString);
  559. }
  560. void
  561. DtkshCvtStringToListItems(
  562. Display *dpy,
  563. XrmValuePtr args,
  564. Cardinal *nargs,
  565. XrmValuePtr fval,
  566. XrmValuePtr toval,
  567. XtPointer data )
  568. {
  569. XtConvert(Toplevel, XtRString, fval, XmRXmStringTable, toval);
  570. }
  571. void
  572. DtkshCvtWidgetClassToString(
  573. Display *dpy,
  574. XrmValuePtr args,
  575. Cardinal *nargs,
  576. XrmValuePtr fval,
  577. XrmValuePtr toval,
  578. XtPointer data )
  579. {
  580. static char result[16];
  581. char * errmsg;
  582. WidgetClass wc;
  583. int i;
  584. if (fval->size != sizeof(WidgetClass))
  585. {
  586. errmsg = strdup(GETMESSAGE(
  587. "DtkshCvtWidgetClassToString: The 'from' value is an invalid size"));
  588. XtWarning(errmsg);
  589. free(errmsg);
  590. toval->addr = NULL;
  591. toval->size = 0;
  592. return;
  593. }
  594. if ((wc = ((WidgetClass *)(fval->addr))[0]) == NULL)
  595. {
  596. toval->addr = "";
  597. toval->size = 1;
  598. return;
  599. }
  600. for (i = 0; C[i].cname != NULL; i++)
  601. {
  602. if (C[i].class == wc)
  603. {
  604. toval->addr = C[i].cname;
  605. toval->size = strlen(C[i].cname)+1;
  606. return;
  607. }
  608. }
  609. /* No match found */
  610. errmsg = strdup(GETMESSAGE(
  611. "DtkshCvtWidgetClassToString: Unknown widget class"));
  612. XtWarning(errmsg);
  613. free(errmsg);
  614. toval->addr = NULL;
  615. toval->size = 0;
  616. return;
  617. }
  618. void
  619. DtkshCvtStringToWidgetClass(
  620. Display *dpy,
  621. XrmValuePtr args,
  622. Cardinal *nargs,
  623. XrmValuePtr fval,
  624. XrmValuePtr toval,
  625. XtPointer data )
  626. {
  627. static char result[16];
  628. char * errmsg;
  629. static WidgetClass wc;
  630. int i;
  631. char * wcName;
  632. char * hashInfo;
  633. classtab_t * classtab;
  634. if (fval->size <= 0 || fval->addr == NULL)
  635. {
  636. toval->addr = NULL;
  637. toval->size = 0;
  638. return;
  639. }
  640. wcName = (char *)(fval->addr);
  641. if ((hashInfo = hashget(Wclasses, wcName)) != NULL)
  642. {
  643. classtab = (classtab_t *)hashInfo;
  644. wc = classtab->class;
  645. toval->addr = (caddr_t)&wc;
  646. toval->size = sizeof(WidgetClass);
  647. return;
  648. }
  649. /* No match found */
  650. errmsg = strdup(GETMESSAGE(
  651. "DtkshCvtStringToWidgetClass: Unknown widget class name"));
  652. XtWarning(errmsg);
  653. free(errmsg);
  654. toval->addr = NULL;
  655. toval->size = 0;
  656. return;
  657. }
  658. static MWMTable mwmDecorations[] = {
  659. {"MWM_DECOR_ALL", MWM_DECOR_ALL},
  660. {"MWM_DECOR_BORDER", MWM_DECOR_BORDER},
  661. {"MWM_DECOR_RESIZEH", MWM_DECOR_RESIZEH},
  662. {"MWM_DECOR_TITLE", MWM_DECOR_TITLE},
  663. {"MWM_DECOR_MENU", MWM_DECOR_MENU},
  664. {"MWM_DECOR_MINIMIZE", MWM_DECOR_MINIMIZE},
  665. {"MWM_DECOR_MAXIMIZE", MWM_DECOR_MAXIMIZE},
  666. {NULL, 0},
  667. };
  668. static MWMTable mwmFunctions[] = {
  669. {"MWM_FUNC_ALL", MWM_FUNC_ALL},
  670. {"MWM_FUNC_RESIZE", MWM_FUNC_RESIZE},
  671. {"MWM_FUNC_MOVE", MWM_FUNC_MOVE},
  672. {"MWM_FUNC_MINIMIZE", MWM_FUNC_MINIMIZE},
  673. {"MWM_FUNC_MAXIMIZE", MWM_FUNC_MAXIMIZE},
  674. {"MWM_FUNC_CLOSE", MWM_FUNC_CLOSE},
  675. {NULL, 0},
  676. };
  677. static void
  678. CvtStringToMWMValue(
  679. MWMTable * table,
  680. Display *dpy,
  681. XrmValuePtr args,
  682. Cardinal *nargs,
  683. XrmValuePtr fval,
  684. XrmValuePtr toval,
  685. XtPointer data )
  686. {
  687. static long value;
  688. int i;
  689. char * ptr;
  690. char * valueString;
  691. char * p;
  692. int intVal;
  693. value = 0;
  694. toval->addr = (XtPointer)&value;
  695. toval->size = sizeof(int);
  696. if (fval->size <= 0 || fval->addr == NULL)
  697. return;
  698. ptr = valueString = strdup(fval->addr);
  699. /* Skip any leading whitespace. */
  700. while (isspace(*ptr) && (*ptr != '\0'))
  701. ptr++;
  702. /* Integer values, especially -1, are also supported */
  703. intVal = strtol(ptr, &p, 0);
  704. if (p != ptr)
  705. {
  706. value = intVal;
  707. XtFree(valueString);
  708. return;
  709. }
  710. ptr = strtok(ptr, "|");
  711. while (ptr)
  712. {
  713. for (i = 0; table[i].name; i++)
  714. {
  715. if (DtCompareISOLatin1(ptr, table[i].name))
  716. {
  717. value |= table[i].value;
  718. break;
  719. }
  720. }
  721. ptr = strtok(NULL, "|");
  722. }
  723. XtFree(valueString);
  724. }
  725. static void
  726. CvtMWMValueToString(
  727. MWMTable * table,
  728. Display *dpy,
  729. XrmValuePtr args,
  730. Cardinal *nargs,
  731. XrmValuePtr fval,
  732. XrmValuePtr toval,
  733. XtPointer data )
  734. {
  735. static char *string = NULL;
  736. int value;
  737. int i = 0;
  738. Boolean firstOne = True;
  739. value = ((int *)(fval->addr))[0];
  740. if (value == -1)
  741. {
  742. string = XtRealloc(string, 5);
  743. strcpy(string, "-1");
  744. }
  745. else
  746. {
  747. string = XtRealloc(string, 1);
  748. string[0] = '\0';
  749. while (table[i].name)
  750. {
  751. if (value & table[i].value)
  752. {
  753. if (!firstOne)
  754. {
  755. string = XtRealloc(string,
  756. strlen(string) + strlen(table[i].name) + 2);
  757. strcat(string, "|");
  758. strcat(string, table[i].name);
  759. }
  760. else
  761. {
  762. firstOne = False;
  763. string = XtRealloc(string,
  764. strlen(string) + strlen(table[i].name) + 1);
  765. strcat(string, table[i].name);
  766. }
  767. }
  768. i++;
  769. }
  770. }
  771. toval->addr = (caddr_t)string;
  772. toval->size = strlen(string) + 1;
  773. }
  774. void
  775. DtkshCvtStringToMWMDecoration(
  776. Display *dpy,
  777. XrmValuePtr args,
  778. Cardinal *nargs,
  779. XrmValuePtr fval,
  780. XrmValuePtr toval,
  781. XtPointer data )
  782. {
  783. CvtStringToMWMValue(mwmDecorations, dpy, args, nargs, fval, toval, data);
  784. }
  785. void
  786. DtkshCvtMWMDecorationToString(
  787. Display *dpy,
  788. XrmValuePtr args,
  789. Cardinal *nargs,
  790. XrmValuePtr fval,
  791. XrmValuePtr toval,
  792. XtPointer data )
  793. {
  794. CvtMWMValueToString(mwmDecorations, dpy, args, nargs, fval, toval, data);
  795. }
  796. void
  797. DtkshCvtStringToMWMFunctions(
  798. Display *dpy,
  799. XrmValuePtr args,
  800. Cardinal *nargs,
  801. XrmValuePtr fval,
  802. XrmValuePtr toval,
  803. XtPointer data )
  804. {
  805. CvtStringToMWMValue(mwmFunctions, dpy, args, nargs, fval, toval, data);
  806. }
  807. void
  808. DtkshCvtMWMFunctionsToString(
  809. Display *dpy,
  810. XrmValuePtr args,
  811. Cardinal *nargs,
  812. XrmValuePtr fval,
  813. XrmValuePtr toval,
  814. XtPointer data )
  815. {
  816. CvtMWMValueToString(mwmFunctions, dpy, args, nargs, fval, toval, data);
  817. }
  818. void
  819. DtkshCvtStringToPanedWinPosIndex(
  820. Display *dpy,
  821. XrmValuePtr args,
  822. Cardinal *nargs,
  823. XrmValuePtr fval,
  824. XrmValuePtr toval,
  825. XtPointer data )
  826. {
  827. static short value;
  828. char * pos;
  829. char * p;
  830. if (fval->size <= 0 || fval->addr == NULL)
  831. {
  832. toval->addr = NULL;
  833. toval->size = 0;
  834. return;
  835. }
  836. pos = (char *)fval->addr;
  837. if (DtCompareISOLatin1(pos, "LAST_POSITION"))
  838. value = XmLAST_POSITION;
  839. else
  840. value = strtol(pos, &p, 0);
  841. toval->addr = (XtPointer)&value;
  842. toval->size = sizeof(short);
  843. }
  844. void
  845. DtkshCvtPanedWinPosIndexToString(
  846. Display *dpy,
  847. XrmValuePtr args,
  848. Cardinal *nargs,
  849. XrmValuePtr fval,
  850. XrmValuePtr toval,
  851. XtPointer data )
  852. {
  853. static char result[50];
  854. short value;
  855. if (fval->size != sizeof(short))
  856. {
  857. toval->addr = NULL;
  858. toval->size = 0;
  859. return;
  860. }
  861. value = ((short *)(fval->addr))[0];
  862. if (value == XmLAST_POSITION)
  863. sprintf(result, "LAST_POSITION");
  864. else
  865. sprintf(result, "%d", value);
  866. toval->addr = result;
  867. toval->size = strlen(result)+1;
  868. }
  869. void
  870. DtkshCvtStringToPrintSetupProc(
  871. Display *dpy,
  872. XrmValuePtr args,
  873. Cardinal *nargs,
  874. XrmValuePtr fval,
  875. XrmValuePtr toval,
  876. XtPointer data)
  877. {
  878. static void (*proc)();
  879. extern wtab_t *DTKSHConversionWidget;
  880. wtab_t *w = DTKSHConversionWidget;
  881. extern char *DTKSHConversionResource;
  882. ProcInfo_t *pinfo;
  883. if (w != NULL) {
  884. if (w->info == NULL) {
  885. w->info = (XtPointer)XtMalloc(sizeof(ProcInfo_t));
  886. memset(w->info, '\0', sizeof(ProcInfo_t));
  887. }
  888. pinfo = (ProcInfo_t *)w->info;
  889. if (strcmp(DTKSHConversionResource, CONSTCHAR "printerInfoProc") == 0) {
  890. if (pinfo->printerInfoProcCommand != NULL)
  891. XtFree(pinfo->printerInfoProcCommand);
  892. pinfo->printerInfoProcCommand = strdup((String)fval->addr);
  893. proc = stdPrinterInfoProc;
  894. } else if (strcmp(DTKSHConversionResource, CONSTCHAR "selectFileProc") == 0) {
  895. if (pinfo->selectFileProcCommand != NULL)
  896. XtFree(pinfo->selectFileProcCommand);
  897. pinfo->selectFileProcCommand = strdup((String)fval->addr);
  898. proc = stdSelectFileProc;
  899. }
  900. else if (strcmp(DTKSHConversionResource, CONSTCHAR "selectPrinterProc") == 0) {
  901. if (pinfo->selectPrinterProcCommand != NULL)
  902. XtFree(pinfo->selectPrinterProcCommand);
  903. pinfo->selectPrinterProcCommand = strdup((String)fval->addr);
  904. proc = stdSelectPrinterProc;
  905. }
  906. else if (strcmp(DTKSHConversionResource, CONSTCHAR "setupProc") == 0) {
  907. if (pinfo->setupProcCommand != NULL)
  908. XtFree(pinfo->setupProcCommand);
  909. pinfo->setupProcCommand = strdup((String)fval->addr);
  910. proc = stdSetupProc;
  911. }
  912. else if (strcmp(DTKSHConversionResource, CONSTCHAR "verifyPrinterProc") == 0) {
  913. if (pinfo->verifyPrinterProcCommand != NULL)
  914. XtFree(pinfo->verifyPrinterProcCommand);
  915. pinfo->verifyPrinterProcCommand = strdup((String)fval->addr);
  916. proc = stdVerifyPrinterProc;
  917. }
  918. else {
  919. XtWarningMsg(CONSTCHAR "CvtStringToPrintSetupProc", CONSTCHAR "unsupported DtPrintSetupBox resource.", CONSTCHAR "XtToolkitError", "This resource is not currently supported by dtksh.", NULL, 0);
  920. }
  921. } else {
  922. XtWarningMsg(CONSTCHAR "CvtStringToPrintSetupProc", CONSTCHAR "widget must exist.", CONSTCHAR "XtToolkitError", "This resource cannot be set at creation time by dtksh, use XtSetValues after creation instead.", NULL, 0);
  923. toval->size = 0;
  924. toval->addr = NULL;
  925. return;
  926. }
  927. toval->size = sizeof(DtPrintSetupProc);
  928. toval->addr = (XtPointer)&proc;
  929. return;
  930. }