home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume1 / torch / part03 / gs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-28  |  7.4 KB  |  272 lines

  1. /*
  2. Copyright 1988 Torch Computers Ltd.
  3.  
  4. Permission to use, copy, modify, and otherwise generally do what you like
  5. with this software is hereby granted provided that the above copyright notice
  6. appears in all copies.
  7.  
  8. Torch disclaims all warranties implied or expressed with regard to this
  9. software.  In no event shall Torch be liable for any damages arising from
  10. this use of software.
  11. */
  12.  
  13. /********************************************************
  14. *                            *
  15. *  Title   Yorn, Gs and Alert                *
  16. *                            *
  17. *  File       : gs.c                    *
  18. *  Author  : Gary Henderson                *
  19. *  Date       : 29th Sep 1988                *
  20. *  Purpose : The gs box widgets code.                    *
  21. *                            *
  22. *********************************************************/
  23.  
  24. /*------Include files-----------------------------------*/
  25.  
  26. #include <stdio.h>
  27. #include <X11/Xlib.h>
  28. #include <X11/Xos.h>
  29. #include <X11/Xutil.h>
  30. #include <X11/StringDefs.h>
  31. #include <X11/Intrinsic.h>
  32. #include <X11/Form.h>
  33. #include <X11/Core.h>
  34. #include <X11/Shell.h>
  35. #include <X11/Command.h>
  36. #include <X11/AsciiText.h>
  37.  
  38. /*------Forward delarations-----------------------------*/
  39.  
  40. extern long time ();
  41.  
  42. /*------Constants and macros----------------------------*/
  43.  
  44. #define ALONX             ((root_width / 5 + rand () % 48))
  45. #define ALONY             ((root_height / 5 + rand () % 48))
  46. #define MESSAGE_WIDTH    40
  47. #define EXTRA 6
  48.  
  49. /*------Exported variables/functions--------------------*/
  50.  
  51. Widget     gswidget;
  52. void     Finished ();
  53.  
  54. /*------Imported variables/functions--------------------*/
  55.  
  56. extern Widget         a_widget;
  57. extern XFontStruct  *sysfont;
  58. extern unsigned int root_width, root_height;
  59. extern Display         *display;
  60. extern Window         root_window;
  61. extern int          screen_number;
  62. extern Screen         *screen;
  63. extern Boolean         zoom;
  64. extern int          lines, cols;
  65. extern char         *font_name;
  66.  
  67. /*------Static variables--------------------------------*/
  68.  
  69. static Widget     button;
  70. static Widget     textwidget;
  71. static Widget     messagewidget;
  72. static char     *data;
  73. static int      length;
  74.  
  75. /*
  76.                             *****************
  77.                             *        *
  78.                             *    INITGS    *
  79.                             *        *
  80.                             *****************
  81. -------------------------------------------------------------------------
  82. | Initialise the widgets for the gs box.                                |
  83. -------------------------------------------------------------------------
  84. */
  85. void InitGS (string, geometry)
  86. char * string;
  87. char * geometry;
  88. {
  89.     Arg args[20];
  90.     Widget formwidget;
  91.     int message_width, message_height;
  92.     int char_width = (sysfont->max_bounds.width + 
  93.                       sysfont->min_bounds.width) / 2;
  94.     int char_height = (sysfont->ascent + sysfont->descent);
  95.     int mx_offset, tx_offset;
  96.     
  97.     static XtCallbackRec ackbacks[] = {
  98.         {Finished, NULL},
  99.         {NULL, NULL},
  100.     };
  101.  
  102. #ifdef BSD
  103.     (void) srand ((int) time ((long *) 0));
  104. #endif BSD
  105.  
  106. #if defined(UNISOFTV) || defined(SYSV)
  107.     (void) srand ((unsigned int) time ((long *) 0));
  108. #endif /* UNISOFTV || SYSV */
  109.  
  110.     /* Its a popup */
  111.  
  112.     XtSetArg (args[0], XtNx, ALONX);
  113.     XtSetArg (args[1], XtNy, ALONY);
  114.     XtSetArg (args[2], XtNgeometry, geometry);
  115.     
  116.     gswidget = XtCreatePopupShell ("gsbox", 
  117.                                     zoom ? topLevelShellWidgetClass :
  118.                            overrideShellWidgetClass, 
  119.                     a_widget,
  120.                     args,
  121.                     geometry ? 3 : 2);
  122.                     
  123.     formwidget= XtCreateManagedWidget ("contents",
  124.                                       formWidgetClass,
  125.                       gswidget,
  126.                       (ArgList) 0,
  127.                       0);
  128.  
  129.     XtSetArg (args[0], XtNhorizDistance, 4);
  130.     XtSetArg (args[1], XtNvertDistance, 4);
  131.     XtSetArg (args[2], XtNresizable, False);
  132.     XtSetArg (args[3], XtNcallback, ackbacks);
  133.     XtSetArg (args[4], XtNfont, sysfont);
  134.     XtSetArg (args[5], XtNbottom, XtChainTop);
  135.     XtSetArg (args[6], XtNtop, XtChainTop);
  136.     XtSetArg (args[7], XtNleft, XtChainLeft);
  137.     XtSetArg (args[8], XtNright, XtChainLeft);
  138.     
  139.     button = XtCreateManagedWidget("Finished",
  140.                                     commandWidgetClass,
  141.                     formwidget,
  142.                     args,
  143.                     9);
  144.  
  145.     message_height = char_height + EXTRA;
  146.  
  147.     if (strlen (string) < MESSAGE_WIDTH)
  148.         message_width = strlen (string) * char_width + EXTRA;
  149.     else
  150.     {
  151.         message_width = MESSAGE_WIDTH * char_width + EXTRA;
  152.     message_height = char_height * (1 + strlen (string) / 
  153.                                    MESSAGE_WIDTH) + EXTRA;
  154.     }
  155.  
  156.     if (cols * lines != 0)
  157.     {
  158.         if (cols * char_width + EXTRA > message_width)
  159.     {
  160.             mx_offset = ((cols * char_width + EXTRA) - message_width) / 2 + 4;
  161.         tx_offset = 4;
  162.     }
  163.     else
  164.     {
  165.             mx_offset = 4;
  166.             tx_offset = (message_width - (cols * char_width + EXTRA)) / 2 + 4;
  167.     }
  168.     }
  169.     else
  170.         mx_offset = 4;
  171.  
  172.     XtSetArg (args[0], XtNhorizDistance, mx_offset);
  173.     XtSetArg (args[1], XtNvertDistance, 4);
  174.     XtSetArg (args[2], XtNresizable, True);
  175.     XtSetArg (args[3], XtNeditType, XttextRead);
  176.     XtSetArg (args[4], XtNstring, string);
  177.     XtSetArg (args[5], XtNlength, strlen (string));
  178.     XtSetArg (args[6], XtNtextOptions, scrollOnOverflow | wordBreak);
  179.     XtSetArg (args[7], XtNbottom, XtRubber);
  180.     XtSetArg (args[8], XtNtop, XtChainTop);
  181.     XtSetArg (args[9], XtNleft, XtChainLeft);
  182.     XtSetArg (args[10], XtNright, XtChainRight);
  183.     XtSetArg (args[11], XtNfromVert, button);
  184.     XtSetArg (args[12], XtNwidth, message_width);
  185.     XtSetArg (args[13], XtNheight, message_height);
  186.     XtSetArg (args[14], XtNfont, sysfont);
  187.     
  188.     messagewidget = XtCreateManagedWidget ("message", asciiStringWidgetClass, 
  189.                                         formwidget, args, 15);
  190.     if (lines * cols != 0)
  191.     {
  192.         data = XtMalloc ((length = lines * cols) + 2);
  193.  
  194.         *data = '\0';
  195.     
  196.     XtSetArg (args[0], XtNhorizDistance, tx_offset);
  197.         XtSetArg (args[1], XtNvertDistance, 4);
  198.         XtSetArg (args[2], XtNresizable, False);
  199.         XtSetArg (args[3], XtNeditType, XttextEdit);
  200.         XtSetArg (args[4], XtNstring, data);
  201.         XtSetArg (args[5], XtNlength, length);
  202.         XtSetArg (args[6], XtNtextOptions, scrollOnOverflow | wordBreak | editable);
  203.         XtSetArg (args[7], XtNbottom, XtChainBottom);
  204.         XtSetArg (args[8], XtNtop, XtRubber);
  205.         XtSetArg (args[9], XtNleft, XtChainLeft);
  206.         XtSetArg (args[10], XtNright, XtChainRight);
  207.         XtSetArg (args[11], XtNfromVert, messagewidget);
  208.         XtSetArg (args[12], XtNwidth, cols * char_width + EXTRA);
  209.         XtSetArg (args[13], XtNheight, lines * char_height + EXTRA);
  210.         XtSetArg (args[14], XtNfont, sysfont);
  211.     
  212.         textwidget = XtCreateManagedWidget ("reply", asciiStringWidgetClass, 
  213.                                                     formwidget, args, 15);
  214.     }
  215.     else
  216.         length = 0, data = 0;
  217.     
  218.     XtRealizeWidget (gswidget);
  219. }
  220.  
  221. /*
  222.                             *****************
  223.                             *        *
  224.                             *   FINISHED    *
  225.                             *        *
  226.                             *****************
  227. -------------------------------------------------------------------------
  228. | The 'Finished' button has been selected by the user.  Read the text    |
  229. | widget's current text, print it on stdout and then exit.                |
  230. -------------------------------------------------------------------------
  231. */
  232. /*ARGSUSED*/
  233. void Finished (widget, client_data, call_data)
  234. Widget widget;
  235. caddr_t client_data,call_data;
  236. {
  237.     char * p;
  238.     
  239.     XtPopdown (gswidget);
  240.  
  241.     if (length == 0)
  242.         exit (0);
  243.     
  244.     /* Remove trailing spaces and make sure the string is terminated by
  245.        a new line character */
  246.        
  247.     p = data + strlen (data);
  248.  
  249.     if (strlen (data) != 0)
  250.         p--;
  251.     
  252.     if (*p != '\n')
  253.     {
  254.         while (p > data && *p == ' ')
  255.         p--;
  256.  
  257.     if (*p == ' ')
  258.         *p++ = '\n';
  259.         else
  260.         if (*p != '\n')
  261.         {
  262.         *++p = '\n';
  263.         p++;
  264.         }
  265.     
  266.     *p = '\0';
  267.     }
  268.         
  269.     printf ("%s", data);
  270.     exit (0);
  271. }
  272.