home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume1 / torch / part03 / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-28  |  13.1 KB  |  470 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       : main.c                    *
  18. *  Author  : Gary Henderson                *
  19. *  Date       : 26th Sep 1988.                             *
  20. *  Purpose : Decide what we are called (hence what      *
  21. *            progame to act like), initialise the       *
  22. *            toolkit, setup some global variables and    *
  23. *            call the right code.                       *
  24. *                            *
  25. *********************************************************/
  26.  
  27. /*------Include files-----------------------------------*/
  28.  
  29. #include <stdio.h>
  30. #include <X11/Xlib.h>
  31. #include <X11/Xos.h>
  32. #include <X11/Xutil.h>
  33. #include <X11/StringDefs.h>
  34. #include <X11/Intrinsic.h>
  35. #include <X11/TopLevel.h>
  36. #include <X11/Shell.h>
  37. #include <X11/Core.h>
  38. #include <X11/Label.h>
  39. #include <X11/cursorfont.h>
  40.  
  41. #include "classname.h"
  42.  
  43. /*------Forward delarations-----------------------------*/
  44.  
  45. static void InitFontAndResources ();
  46.  
  47. /*------Constants and macros----------------------------*/
  48.  
  49. #define EXTRABIT    50    /* Extra amount added to new long string */
  50.  
  51. /*------Exported variables/functions--------------------*/
  52.  
  53. Display     *display;
  54. Window         root_window;
  55. Screen         *screen;
  56. int         screen_number;
  57. XFontStruct *sysfont;
  58. Widget         a_widget;
  59. Cursor         arrow_cursor;
  60. unsigned int root_width, 
  61.              root_height;
  62. Boolean     zoom = True;              /* Flag to use override redirect
  63.                                        (False, use override ) */
  64. int         cols = 0, 
  65.             lines = 0,
  66.          timeout = 0;
  67. char         *title;
  68. int         is_gs;
  69. char        *alertsym_name,         /* Various names of bitmap files */
  70.             *yornsym_name,          /* if not null, use these in preference */
  71.         *ticksym_name,          /* to the built-in ones. */
  72.             *crosssym_name,
  73.         *oksym_name;
  74.  
  75. char         *progname;
  76.         
  77. void        ReadWidgetColours ();
  78. void         Usage ();
  79.  
  80. /*------Imported variables/functions--------------------*/
  81.  
  82. extern Widget     alertwidget;
  83. extern Widget     gswidget;
  84. extern void     Finished (), AddTimeout (), AddNewConverter ();
  85. extern void     Yorn (), Alert (), InitAlert (), InitGS ();
  86.  
  87. /*------Static variables--------------------------------*/
  88.  
  89. static XrmOptionDescRec gscommand_options[] =
  90. {
  91.     {"-z", "*zoom", XrmoptionNoArg, (caddr_t) "False"},
  92.     {"-r", "*columns", XrmoptionSepArg, (caddr_t) NULL},
  93.     {"-n", "*gstitle", XrmoptionSepArg, (caddr_t) NULL},
  94.     {"-t", "*gstimeout", XrmoptionSepArg, (caddr_t) NULL},
  95. };
  96.  
  97. static XrmOptionDescRec alertcommand_options[] =
  98. {
  99.     {"-z", "*zoom", XrmoptionNoArg, (caddr_t) "False"},
  100. };
  101.  
  102. /*
  103.                             *****************
  104.                             *        *
  105.                             *     MAIN    *
  106.                             *        *
  107.                             *****************
  108. -------------------------------------------------------------------------
  109. | Try to open the connection to the X server.  If OK initialise the     |
  110. | toolkit, otherwise drop into text only mode.  If toolkit initialised, |
  111. | setup some global variables, load up some resources and decide from    |
  112. | our name what utility to act like.                                    |
  113. -------------------------------------------------------------------------
  114. */
  115. int main (argc, argv)
  116. int argc;
  117. char *argv[];
  118. {
  119.     Arg arglist [10];
  120.     unsigned int dummy;
  121.     Window dummy_window;
  122.     char * message;
  123.     char * geometry;
  124.     int i, len, start_arg;
  125.     int alert_comm_size = XtNumber (alertcommand_options);
  126.     int gs_comm_size = XtNumber (gscommand_options);
  127.     char * disp = NULL;
  128.     
  129.     /* Note our base name */
  130.     
  131.     if ((progname = rindex (argv[0], '/')) == 0)
  132.         progname = argv[0];
  133.     else
  134.         progname++;
  135.     
  136.     is_gs = strcmp (progname, "gs") == 0;
  137.  
  138.     /* See if the -display flag has been passed on the command line */
  139.     
  140.     for (i = 1;    i < argc; i++)
  141.         if (strcmp (argv[i], "-display") == 0)
  142.     {
  143.         disp = argv[i + 1];
  144.         break;
  145.     }
  146.  
  147.     /* Make sure server is up and running */
  148.     
  149.     if ((display = XOpenDisplay (disp)) == NULL)
  150.     {
  151.         /* Cannot open display, go into text mode */
  152.         
  153.     TextMode (argc, argv);
  154.     }
  155.  
  156.     XCloseDisplay (display);
  157.     
  158.     AddNewConverter ();
  159.     
  160.     /* Initialise the toolkit */
  161.  
  162.     if ((a_widget = XtInitialize ("temp", CLASSNAME, 
  163.                     is_gs ? gscommand_options : alertcommand_options,
  164.              is_gs ? gs_comm_size : alert_comm_size,
  165.             &argc, argv)) == NULL)
  166.     {
  167.         (void) fprintf (stderr, "%s: Failed to initialise X toolkit\n", progname);
  168.     TextMode (argc, argv);
  169.     }
  170.     
  171.     display = XtDisplay (a_widget);
  172.     root_window = DefaultRootWindow (display);
  173.     screen_number = DefaultScreen (display);
  174.     screen = DefaultScreenOfDisplay (display);
  175.  
  176.     /* Find out size of root window */
  177.     
  178.     if (!XGetGeometry (display, 
  179.                        root_window,
  180.                &dummy_window, 
  181.                &dummy, 
  182.                &dummy, 
  183.                &root_width, 
  184.                &root_height,
  185.                &dummy, 
  186.                &dummy))
  187.     {
  188.         /* If couldn't obtain size of root window, use the macros instead */
  189.     
  190.     root_width = WidthOfScreen (screen);
  191.     root_height = HeightOfScreen (screen);
  192.     }
  193.  
  194.     /* Read what font to use and some other resource values */
  195.  
  196.     InitFontAndResources ();
  197.  
  198.     /* Check the number of command line options are OK */
  199.     
  200.     if ((!is_gs && argc < 3) || 
  201.         (is_gs && ((cols != 0 && argc < 3) || 
  202.     (cols == 0 && argc < 2))))
  203.         Usage ();
  204.  
  205.     /* If the toplevel widget has been given a geometry string pass it on
  206.        to the other toplevel widgets */
  207.        
  208.     XtSetArg (arglist[0], XtNgeometry, &geometry);
  209.     XtGetValues (a_widget, arglist, 1);
  210.  
  211.     /* We are called 'gs', so start acting like it */
  212.     
  213.     if (is_gs)
  214.     {
  215.         /* If the -r flag has been given then the first arg in the argv list
  216.               must be the number of lines */
  217.        
  218.         if (cols == 0)
  219.             start_arg = 0;
  220.         else
  221.         {
  222.             start_arg = 1;
  223.  
  224.         if (sscanf (argv[1], "%d", &lines) != 1)
  225.             Usage ();
  226.         }
  227.     
  228.         /* Message may have been given as lots of seperate arguments.
  229.               Copy them into one long string */
  230.  
  231.         len = strlen (argv[start_arg + 1]) + 1;
  232.         message = XtMalloc (len);
  233.     
  234.         (void) strcpy (message, argv[start_arg + 1]);
  235.  
  236.         for (i = start_arg + 2; i < argc; i++)
  237.         {
  238.             if (strlen (argv[i]) + strlen (message) + 2 > len)
  239.             /* Need more space for the string */
  240.                 message = XtRealloc (message, 
  241.                              len = len + strlen (argv[i]) + 2);
  242.         
  243.         (void) strcat (message, " ");
  244.             (void) strcat (message, argv[i]);
  245.         }
  246.  
  247.     /* Initialise the gs widgets */
  248.     
  249.         InitGS (message, geometry);
  250.     
  251.         XtSetArg (arglist[0], XtNtitle, title);
  252.         XtSetValues (gswidget, arglist, 1);
  253.  
  254.         /* Add an event handler to set a timer going on the first
  255.        MapNotify event if a timeout has been specified for gs */
  256.     
  257.     if (timeout)
  258.             XtAddEventHandler (gswidget, 
  259.                            StructureNotifyMask, 
  260.                    False, 
  261.                    AddTimeout, 
  262.                                (caddr_t) NULL);
  263.                    
  264.         XtPopup (gswidget, XtGrabExclusive);
  265.     XDefineCursor (display, XtWindow (gswidget), arrow_cursor);
  266.     }
  267.     else
  268.     {
  269.         /* Initialise the widgets for the yorn and alert boxes */
  270.     
  271.     InitAlert (geometry);
  272.     
  273.         XtSetArg (arglist[0], XtNtitle, argv[1]);
  274.         XtSetValues (alertwidget, arglist, 1);
  275.  
  276.         /* Message may have been given as lots of seperate arguments.
  277.               Copy them into one long string */
  278.  
  279.         len = strlen (argv[2]) + EXTRABIT + 1;
  280.         message = XtMalloc (len);
  281.     
  282.         (void) strcpy (message, argv[2]);
  283.  
  284.         for (i = 3; i < argc; i++)
  285.         {
  286.             if (strlen (argv[i]) + strlen (message) + 2 > len)
  287.             /* Need more space for the string */
  288.                 message = XtRealloc (message, 
  289.                              len = len + strlen (argv[i]) +
  290.                                        EXTRABIT + 2);
  291.         (void) strcat (message, " ");
  292.             (void) strcat (message, argv[i]);
  293.         }
  294.     
  295.         /* If we are called 'alert' act like alert otherwise act like yorn */
  296.     
  297.     if (strcmp (progname, "alert") == 0)
  298.             Alert (message);
  299.         else
  300.             Yorn (message);
  301.     }
  302.     
  303.     /* Wait for events to arrive and act on them */
  304.     
  305.     XtMainLoop ();
  306. }
  307.  
  308. /*
  309.                             *****************
  310.                             *        *
  311.                             *  ADDTIMEOUT    *
  312.                             *        *
  313.                             *****************
  314. -------------------------------------------------------------------------
  315. | Set a timer going on the first MapNotify event to be received from the|
  316. | server.                                                               |
  317. -------------------------------------------------------------------------
  318. */
  319. /*ARGSUSED*/
  320. void AddTimeout (widget, client_data, event)
  321. Widget widget;
  322. caddr_t client_data;
  323. XMapEvent * event;
  324. {
  325.     static int set = False;
  326.     
  327.     if (!set && event->type == MapNotify)
  328.     {
  329.         set = True;
  330.     
  331.     /* Add a dummy timeout value to stop a core dump with an early
  332.        X11R2 toolkit issue */
  333.        
  334.     XtAddTimeOut ((unsigned long) 0xffffffff, Finished, (caddr_t) NULL);
  335.         XtAddTimeOut ((unsigned long) (timeout * 1000), Finished, 
  336.                                                         (caddr_t) NULL);
  337.     }
  338. }
  339.  
  340. /*
  341.                             *****************
  342.                             *        *
  343.                             *INITFONTANDRESOURCES*
  344.                             *        *
  345.                             *****************
  346. -------------------------------------------------------------------------
  347. | Looks up default font to use from toolkit database, loads it  and     |
  348. | fills in a pointer to the font's structure.                              |
  349. | and look up the icon height                        |
  350. -------------------------------------------------------------------------
  351. */
  352. static void InitFontAndResources ()
  353. {
  354.     static char * sfont;
  355.     static Boolean truezoom = True;
  356.     static int zero = 0;
  357.     static Cursor left_ptr;
  358.     
  359.     static XtResource resources[] = {
  360.         {XtNfont, XtCFont, XtRString, (Cardinal) sizeof (char *),
  361.      (Cardinal) &sfont, XtRString, (caddr_t) NULL},
  362.         
  363.         {XtNcursor, XtCCursor, XtRCursor, sizeof (Cursor),
  364.      (Cardinal) &arrow_cursor, XtRCursor, (caddr_t) &left_ptr},
  365.         
  366.     {"zoom", "Zoom", XtRBoolean, (Cardinal) sizeof (Boolean),
  367.      (Cardinal) &zoom, XtRBoolean, (caddr_t) &truezoom},
  368.     
  369.     {"columns", "Columns", XtRInt, (Cardinal) sizeof (int),
  370.      (Cardinal) &cols, XtRInt, (caddr_t) &zero},
  371.  
  372.     {"gstimeout", "Timeout", XtRInt, (Cardinal) sizeof (int),
  373.      (Cardinal) &timeout, XtRInt, (caddr_t) 0},
  374.  
  375.     {"gstitle", "Title", XtRString, (Cardinal) sizeof (char *),
  376.      (Cardinal) &title, XtRString, (caddr_t) "Get String"},
  377.  
  378.     {"alertsym", "Alertsym", XtRString, (Cardinal) sizeof (char *),
  379.      (Cardinal) &alertsym_name, XtRString, (caddr_t) 0},
  380.  
  381.     {"yornsym", "Yornsym", XtRString, (Cardinal) sizeof (char *),
  382.      (Cardinal) &yornsym_name, XtRString, (caddr_t) 0},
  383.     
  384.     {"ticksym", "Ticksym", XtRString, (Cardinal) sizeof (char *),
  385.      (Cardinal) &ticksym_name, XtRString, (caddr_t) 0},
  386.  
  387.     {"crosssym", "Crosssym", XtRString, (Cardinal) sizeof (char *),
  388.      (Cardinal) &crosssym_name, XtRString, (caddr_t) 0},
  389.  
  390.     {"oksym", "Oksym", XtRString, (Cardinal) sizeof (char *),
  391.      (Cardinal) &oksym_name, XtRString, (caddr_t) 0},
  392.     };
  393.     
  394.     sysfont = (XFontStruct *) NULL;
  395.     left_ptr = XtGetCursor (display, XC_left_ptr);
  396.     
  397.     XtGetApplicationResources (a_widget, (caddr_t) 0, resources, 
  398.                                                 XtNumber (resources), NULL, 0);
  399.  
  400.     /* If no resource (-font or -fn) specified use default font (serif10) */
  401.     
  402.     if (sfont == NULL)
  403.         sysfont = XLoadQueryFont (display, "serif10");
  404.     else
  405.         sysfont = XLoadQueryFont (display, sfont);
  406.     
  407.     /* If one of the fonts don't exist, use fixed.  If that isn't there
  408.        we've had it */
  409.        
  410.     if (sysfont == NULL)
  411.     sysfont = XLoadQueryFont (display, "fixed");
  412.     
  413.     if (sysfont == NULL)
  414.     {
  415.     (void) fprintf (stderr, "%s: Suitable font cannot be found - giving up.",
  416.                         progname);
  417.         exit (2);
  418.     }
  419. }
  420.  
  421. /*
  422.                             *****************
  423.                             *        *
  424.                             *READWIDGETCOLOURS*
  425.                             *        *
  426.                             *****************
  427. -------------------------------------------------------------------------
  428. | Read a widget's background and foreground (if it has one) colours.    |
  429. -------------------------------------------------------------------------
  430. */
  431.  
  432. void ReadWidgetColours (widget, fore, back)
  433. Widget widget;
  434. Pixel *fore, *back;
  435. {
  436.     Arg args[2];
  437.     
  438.     /* Set up some defaults just in case we can't read any values */
  439.     
  440.     *fore = BlackPixel (display, screen_number);
  441.     *back = WhitePixel (display, screen_number);
  442.     
  443.     XtSetArg (args[0], XtNforeground, fore);
  444.     XtSetArg (args[1], XtNbackground, back);
  445.  
  446.     XtGetValues (widget, args, 2);
  447. }
  448.  
  449. /*
  450.                             *****************
  451.                             *        *
  452.                             *     USAGE    *
  453.                             *        *
  454.                             *****************
  455. -------------------------------------------------------------------------
  456. | Too few command line arguments supplied, print out a usage string and |
  457. | exit.                                                                    |
  458. -------------------------------------------------------------------------
  459. */
  460. void Usage ()
  461. {
  462.     if (is_gs)
  463.         (void) fprintf (stderr, "%s: Usage: %s [-z] [-r cols lines] [-n title] [-t seconds] message\n", 
  464.                         progname, progname);
  465.     else
  466.         (void) fprintf (stderr, "%s: Usage: %s [-z] title message\n", progname, progname);
  467.     
  468.     exit (2);
  469. }
  470.