home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume8 / xfig2.8 / part10 / main.c < prev    next >
C/C++ Source or Header  |  1990-07-03  |  10KB  |  314 lines

  1. /* 
  2.  *    FIG : Facility for Interactive Generation of figures
  3.  *
  4.  *    Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
  5.  *    1st revision : Aug 1985.
  6.  *
  7.  *    %W%    %G%
  8. */
  9. #include "fig.h"
  10. #include "const.h"
  11. #include "version.h"
  12. #include "patchlevel.h"
  13. #include "resources.h"
  14. #include "font.h"
  15.  
  16. extern int        ICON_COLUMN;
  17. extern int        CANVAS_HEIGHT, CANVAS_WIDTH;
  18. extern int        PANEL_WID, PANEL2_WID;
  19. extern int        SIDERULER_WIDTH, SIDERULER_HEIGHT;
  20. extern int        TOPRULER_WIDTH, TOPRULER_HEIGHT;
  21. extern            (*canvas_rightbut_proc)();
  22. extern            set_popupmenu();
  23. extern int        cur_areafill;
  24. extern int        print_landscape;
  25. extern int        size_button;
  26.  
  27. #include "fig.icon.X"
  28. Pixmap        fig_icon;
  29.  
  30. static char    tool_name[100] = " FIG : FACILITY FOR INTERACTIVE GENERATION OF FIGURES ";
  31. static            sigwinched();
  32.  
  33. /************** FIG options ******************/
  34.  
  35. extern    appresStruct    appres;
  36.  
  37. TOOL            tool;
  38. char            file_header[32] = "#FIG ";
  39. static char        *filename = NULL;
  40.  
  41. static Boolean    true = True;
  42. static Boolean    false = False;
  43. static int    zero = 0;
  44.  
  45. static XtResource application_resources[] = {
  46.     {XtNjustify, XtCJustify, XtRBoolean, sizeof(Boolean),
  47.          XtOffset(appresPtr, RHS_PANEL), XtRBoolean, (caddr_t)&false},
  48.     {"landscape", XtCOrientation, XtRBoolean, sizeof(Boolean),
  49.          XtOffset(appresPtr, landscape), XtRBoolean, (caddr_t)&true},
  50.     {"debug", "Debug", XtRBoolean, sizeof(Boolean),
  51.          XtOffset(appresPtr, DEBUG), XtRBoolean, (caddr_t)&false},
  52.     {"pwidth", XtCWidth, XtRFloat, sizeof(float),
  53.          XtOffset(appresPtr, tmp_width), XtRInt, (caddr_t)&zero},
  54.     {"pheight", XtCHeight, XtRFloat, sizeof(float),
  55.          XtOffset(appresPtr, tmp_height), XtRInt, (caddr_t)&zero},
  56.     {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof(Boolean),
  57.          XtOffset(appresPtr, INVERSE), XtRBoolean, (caddr_t)&false},
  58.     {"trackCursor", "Track", XtRBoolean, sizeof(Boolean),
  59.          XtOffset(appresPtr, TRACKING), XtRBoolean, (caddr_t)&true},
  60.      {"inches", "Inches", XtRBoolean, sizeof(Boolean),
  61.           XtOffset(appresPtr, INCHES), XtRBoolean, (caddr_t)&true},
  62.     {"boldFont", "BoldFont", XtRString, sizeof(char *),
  63.         XtOffset(appresPtr, boldFont), XtRString, (caddr_t)NULL},
  64.     {"normalFont", "NormalFont", XtRString, sizeof(char *),
  65.         XtOffset(appresPtr, normalFont), XtRString, (caddr_t)NULL},
  66. };
  67.  
  68. static XrmOptionDescRec options[] =
  69. {
  70.     {"-right", ".justify", XrmoptionNoArg, "True" },
  71.     {"-left", ".justify", XrmoptionNoArg, "False"},
  72.     {"-debug", ".debug", XrmoptionNoArg, "True"},
  73.     {"-landscape", ".landscape", XrmoptionNoArg, "True"},
  74.     {"-Landscape", ".landscape", XrmoptionNoArg, "True"},
  75.     {"-portrait", ".landscape", XrmoptionNoArg, "False"},
  76.     {"-Portrait", ".landscape", XrmoptionNoArg, "False"},
  77.     {"-pwidth", ".pwidth", XrmoptionSepArg, 0},
  78.     {"-pheight", ".pheight", XrmoptionSepArg, 0},
  79.     {"-inverse", ".reverseVideo", XrmoptionNoArg, "True"},
  80.     {"-notrack", ".trackCursor", XrmoptionNoArg, "False"},
  81.     {"-track", ".trackCursor", XrmoptionNoArg, "True"},
  82.      {"-inches", ".inches", XrmoptionNoArg, "True"},
  83.      {"-imperial", ".inches", XrmoptionNoArg, "True"},
  84.      {"-centimeters", ".inches", XrmoptionNoArg, "False"},
  85.      {"-metric", ".inches", XrmoptionNoArg, "False"},
  86.     {"-boldFont", ".boldFont", XrmoptionSepArg, 0},
  87.     {"-normalFont", ".normalFont", XrmoptionSepArg, 0},
  88. };
  89.  
  90. static XtCallbackRec    callbacks[] =
  91. {
  92.     { NULL, NULL },
  93. };
  94.  
  95. static Arg    form_args[] =
  96. {
  97.     { XtNcallback, (XtArgVal)callbacks },
  98.     { XtNinput, (XtArgVal) TRUE },
  99.     { XtNdefaultDistance, (XtArgVal) 1 },
  100. };
  101.  
  102. main(argc,argv)
  103.     int        argc;
  104.     char        *argv[];
  105. {
  106. #define    NCHILDREN    8
  107.     TOOL        form, children[NCHILDREN];
  108.     Arg        tmp_arg[4];
  109.     int        ichild;
  110.     char        tstr[10];
  111.     XWMHints    *wmhints;
  112.     char        i;
  113.  
  114.     strcat(tool_name, " V. ");
  115.     strcat(tool_name, FIG_VERSION);
  116.     strcat(tool_name, " Protocol V. ");
  117.     strcat(tool_name, PROTOCOL_VERSION);
  118.     strcat(tool_name, " Patch Lev. ");
  119.     sprintf(tstr,"%d",PATCHLEVEL);
  120.     strcat(tool_name, tstr);
  121.     strcat(file_header, PROTOCOL_VERSION);
  122.     printf("Initializing FIG v%s Protocol v%s (X11 patchlevel %d) ... \n", 
  123.             FIG_VERSION, PROTOCOL_VERSION, PATCHLEVEL);
  124.     tool = XtInitialize("fig", "Fig", options, XtNumber(options),
  125.         &argc, argv);
  126.  
  127.     fix_converters();
  128.     XtGetApplicationResources(tool, &appres, application_resources, 
  129.             10, NULL, 0 );
  130.     
  131.     i=1;
  132.     while (argc-- > 1)
  133.         {
  134.         if (*argv[i] != '-')    /* search for non - name */
  135.         {
  136.         filename = argv[i];
  137.         break;
  138.         }
  139.         i++;
  140.         }
  141.  
  142.     print_landscape = appres.landscape; /* match print and screen format to start */
  143.  
  144.     tool_d = XtDisplay(tool);
  145.     tool_s = XtScreen(tool);
  146.     tool_sn = DefaultScreen(tool_d);
  147.     
  148.     /* run synchronously for debugging */
  149.  
  150.     if (appres.DEBUG)
  151.         {
  152.         XSynchronize(tool_d, 1);
  153.         fprintf(stderr,"Debug mode, running synchronously\n");
  154.         }
  155.  
  156.     if( CellsOfScreen(tool_s) == 2 && appres.INVERSE )
  157.     {
  158.         XrmValue    value;
  159.         XrmDatabase newdb = (XrmDatabase) 0, old;
  160.  
  161.         value.size = sizeof("White");
  162.         value.addr = "White";
  163.         XrmPutResource(&newdb, "xfig*borderColor", "String",
  164.                    &value);
  165.         value.size = sizeof("White");
  166.         value.addr = "White";
  167.         XrmPutResource(&newdb, "xfig*foreground", "String",
  168.                    &value);
  169.         value.size = sizeof("Black");
  170.         value.addr = "Black";
  171.         XrmPutResource(&newdb, "xfig*background", "String",
  172.                    &value);
  173.         old = XtDatabase(tool_d);
  174.         XrmMergeDatabases(newdb, &old);
  175.  
  176.         /* now set the tool part, since its already created */
  177.         XtSetArg(tmp_arg[0], XtNborderColor,
  178.              WhitePixelOfScreen(tool_s));
  179.         XtSetArg(tmp_arg[1], XtNforeground,
  180.              WhitePixelOfScreen(tool_s));
  181.         XtSetArg(tmp_arg[2], XtNbackground,
  182.              BlackPixelOfScreen(tool_s));
  183.         XtSetValues(tool, tmp_arg, 3);
  184.     }
  185.     
  186.     init_font();
  187.  
  188.     gc = DefaultGC(tool_d, tool_sn);
  189.     bold_gc = DefaultGC(tool_d, tool_sn);
  190.  
  191.     /* set the roman and bold fonts for the message windows */
  192.     XSetFont(tool_d, gc, roman_font->fid);
  193.     XSetFont(tool_d, bold_gc, bold_font->fid);
  194.  
  195.     init_cursor();
  196.     form = XtCreateManagedWidget("form", formWidgetClass, tool,
  197.         form_args, XtNumber(form_args));
  198.     
  199.     if (size_button == 0)
  200.         size_button = DEF_PRINTFONTSIZE;
  201.  
  202.     ICON_COLUMN = ICON_COLUMN_PORT;
  203.     CANVAS_WIDTH = appres.tmp_width * (appres.INCHES ? PIX_PER_INCH : PIX_PER_CM);
  204.     CANVAS_HEIGHT = appres.tmp_height * (appres.INCHES ? PIX_PER_INCH : PIX_PER_CM);
  205.  
  206.     if( CANVAS_WIDTH == 0 )
  207.         CANVAS_WIDTH = appres.landscape ? DEF_CANVAS_WIDTH_L : DEF_CANVAS_WIDTH_P;
  208.     
  209.     if( CANVAS_HEIGHT == 0 )
  210.         CANVAS_HEIGHT = appres.landscape ? DEF_CANVAS_HEIGHT_L : DEF_CANVAS_HEIGHT_P;
  211.     
  212.     
  213.     if( (CANVAS_HEIGHT < DEF_CANVAS_HEIGHT_P) ||
  214.        (HeightOfScreen(tool_s) < DEF_CANVAS_HEIGHT_P) )
  215.         ICON_COLUMN = ICON_COLUMN_LAND;
  216.         
  217.     (void) init_panel(form);
  218.     (void) init_topruler(form) ;
  219.     (void) init_menu(form);            /* command menu */
  220.     (void) init_canvas(form);
  221.     (void) init_fontmenu(form);        /* printer font menu */
  222.     (void) init_sideruler(form);
  223.     (void) init_msg(form);
  224.     (void) init_panel2(form);        /* second panel */
  225.     (void) init_indicator_panel(form);    /* current line size, area fill, etc */
  226.  
  227.     ichild = 0;
  228.     children[ichild++] = panel_sw;
  229.     children[ichild++] = topruler_sw;
  230.     children[ichild++] = psfont;        /* shows current printer font name */
  231.     children[ichild++] = sideruler_sw;    /* side ruler */
  232.     children[ichild++] = canvas_sw;        /* main drawing canvas */
  233.     children[ichild++] = msg_sw;        /* message window */
  234.     children[ichild++] = panel2_sw;        /* lower button panel */
  235.     children[ichild++] = ind_box;        /* fill/line/radius indicators */
  236.  
  237.     /* until the following XtRealizeWidget() is called, there
  238.        are NO windows in existence */
  239.  
  240.     XtManageChildren(children, NCHILDREN);
  241.     XtRealizeWidget(tool);
  242.  
  243.     /* Set the input field to true to allow keyboard input */
  244.     wmhints = XGetWMHints(tool_d, XtWindow(tool));
  245.     wmhints->flags |= InputHint;    /* add in input hint */
  246.     wmhints->input = True;
  247.     XSetWMHints(tool_d, XtWindow(tool),wmhints);
  248.  
  249.     if( appres.RHS_PANEL )        /* side button panel is on right size */
  250.     {
  251.         XtSetArg(tmp_arg[0], XtNfromHoriz, 0);
  252.         XtSetArg(tmp_arg[1], XtNhorizDistance, RULER_WIDTH+2);
  253.         XtSetValues(topruler_sw, tmp_arg, 2);
  254.  
  255.         XtSetArg(tmp_arg[0], XtNfromHoriz, 0);
  256.         XtSetArg(tmp_arg[1], XtNfromVert, topruler_sw);
  257.         XtSetArg(tmp_arg[2], XtNleft, XtChainLeft); /* chain to left of form */
  258.         XtSetArg(tmp_arg[3], XtNright, XtChainLeft);
  259.         XtSetValues(sideruler_sw, tmp_arg, 4);
  260.  
  261.         XtUnmanageChild(msg_sw);
  262.         XtSetArg(tmp_arg[0], XtNfromHoriz, sideruler_sw);
  263.         XtSetArg(tmp_arg[1], XtNfromVert, topruler_sw);
  264.         XtSetValues(canvas_sw, tmp_arg, 2);
  265.         XtManageChild(msg_sw);
  266.  
  267.         /* relocate the side button panel */
  268.         XtUnmanageChild(panel_sw);
  269.         XtSetArg(tmp_arg[0], XtNfromHoriz, canvas_sw); /* panel right of canvas */
  270.         XtSetArg(tmp_arg[1], XtNfromVert, 0);
  271.         XtSetArg(tmp_arg[2], XtNleft, XtChainRight);  /* chain to right of form */
  272.         XtSetArg(tmp_arg[3], XtNright, XtChainRight);
  273.         XtSetValues(panel_sw, tmp_arg, 4);
  274.         XtManageChild(panel_sw);
  275.  
  276.         /* relocate the indicator panel */
  277.         XtUnmanageChild(ind_box);
  278.         XtSetArg(tmp_arg[0], XtNfromHoriz, canvas_sw); /* right of canvas */
  279.         XtSetArg(tmp_arg[1], XtNleft, XtChainRight);  /* chain to right of form */
  280.         XtSetArg(tmp_arg[2], XtNright, XtChainRight);
  281.         XtSetValues(ind_box, tmp_arg, 3);
  282.         XtManageChild(ind_box);
  283.     }
  284.     fig_icon = XCreateBitmapFromData(tool_d, XtWindow(tool),
  285.                      fig_bits, fig_width, fig_height);
  286.     
  287.     XtSetArg(tmp_arg[0], XtNtitle, tool_name);
  288.     XtSetArg(tmp_arg[1], XtNiconPixmap, fig_icon);
  289.     XtSetValues(tool, tmp_arg, 2);
  290.  
  291.     init_gc();
  292.     init_fill_pm();
  293.     init_fill_gc();
  294.     show_fill_color();
  295. #ifndef TFX
  296.     show_radius();
  297. #endif
  298.     setup_panel();
  299.     setup_rulers();
  300.     setup_canvas();
  301.     setup_msg();
  302.     setup_fontmenu();        /* install bitmaps in printer font menu */
  303.     printer_select();
  304.     show_fontsize();
  305.     show_line_thickness();
  306.     put_msg("READY");
  307.     canvas_rightbut_proc = set_popupmenu;
  308.     if (filename != NULL)
  309.         edit_file(filename);
  310.     (void)signal(SIGINT, SIG_IGN);    /* so we don't lose work accidentally */
  311.     
  312.     XtMainLoop();
  313. }
  314.