home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / m / master12.zip / mastering / arrowbtns.c next >
C/C++ Source or Header  |  1992-08-18  |  10KB  |  379 lines

  1. /*
  2.  * Include File Declarations
  3.  */
  4. #include <Xm/MainW.h>
  5. #include <Xm/ArrowB.h>
  6. #include <Xm/ArrowBG.h>
  7. #include <Xm/PushBG.h>
  8. #include <Xm/CascadeB.h>
  9. #include <Xm/DialogS.h>
  10. #include <Xm/MessageB.h>
  11. #include <Xm/RowColumn.h>
  12. #include <Xm/Label.h>
  13. #include <Xm/Frame.h>
  14. #include <Xm/DrawingA.h>
  15. #include "bitmaps/flagup"
  16. #include "bitmaps/flagdown"
  17.  
  18. #define XBMu_BITS    flagup_bits
  19. #define XBMu_WIDTH    flagup_width
  20. #define XBMu_HEIGHT   flagup_height
  21. #define XBMd_BITS    flagdown_bits
  22. #define XBMd_WIDTH   flagdown_width
  23. #define XBMd_HEIGHT  flagdown_height
  24. #define MAX_ARGS    20
  25. #define BUFFERSZ    1000
  26.  
  27. /*
  28.  * Global Variables
  29.  */
  30.  
  31. static XmStringCharSet charset = (XmStringCharSet) XmFONTLIST_DEFAULT_TAG;
  32.  
  33. Widget appshell, drawarea;
  34. Widget arrowbtn, arrowbtng;
  35. Widget ablabel, abglabel;
  36. Arg args [20];
  37. int n;
  38. Pixmap px_up;
  39. Pixmap px_down;
  40. Pixmap gbr;
  41.  
  42. /*-------------------------------------------------------------
  43. ** Forward Declarations
  44. */
  45.  
  46. void main();
  47. void activateCB1 ();
  48. void activateCB2 ();
  49. Widget Create_Draw_Dialog ();
  50. Widget CreateHelp ();
  51. void HelpCB ();
  52. void QuitCB ();
  53.  
  54. static XtArgVal GetPixel(colorstr)
  55. char *colorstr;
  56. {
  57.   XrmValue from, to;
  58.  
  59.   from.size = strlen(colorstr) +1;
  60.   if (from.size < sizeof(String)) from.size = sizeof(String);
  61.   from.addr = colorstr;
  62.   to.addr = NULL;
  63.   XtConvert(appshell, XmRString, &from, XmRPixel, &to);
  64.  
  65.   return ((XtArgVal) *((XtArgVal *) to.addr));
  66. }
  67.  
  68. /*-------------------------------------------------------------
  69. **  HelpCB      - callback for help button
  70. */
  71. void HelpCB (w, client_data, call_data) 
  72. Widget    w;    /*  widget id    */
  73. XtPointer    client_data;  /*  data from application   */
  74. XtPointer    call_data;  /*  data from widget class  */
  75. {
  76.   Widget    message_box;    /*  message box    */
  77.  
  78.   /*  Create help window. */
  79.   message_box = CreateHelp (w);
  80.  
  81.   /*  Display help window. */
  82.   XtManageChild (message_box);
  83. }
  84.  
  85. /*-------------------------------------------------------------
  86. **  CreateHelp    - create help window
  87. */
  88. Widget CreateHelp (parent) 
  89.   Widget    parent;    /*  parent widget  */
  90. {
  91.   Widget    button;
  92.   Widget    message_box;  /*  Message Dialog   */
  93.   Arg    args[MAX_ARGS];  /*  arg list    */
  94.   register int  n;    /*  arg count    */
  95.  
  96.   static char  message[BUFFERSZ];  /*  help text  */
  97.   XmString  title_string = NULL;
  98.   XmString  message_string = NULL;
  99.   XmString  button_string = NULL;
  100.  
  101.   /*  Generate message to display. */
  102.   sprintf (message, "\
  103. This program uses an arrow button and an arrow button gadget to pop up\n\
  104. an XmDialogShell.  When you press one of the arrow buttons, a dialog box\n\
  105. pops up with a drawing area widget that displays a canned drawing area.\n\
  106. You can display as many of these as you want.  To terminate the program,\n\
  107. press the 'File' button and then the 'Exit' button.\0");
  108.  
  109.   /* Create the compound strings */
  110.   message_string = XmStringCreateLtoR (message, charset);
  111.   button_string = XmStringCreateLtoR ("Close", charset);
  112.   title_string = XmStringCreateLtoR ("arrowbtns help", charset);
  113.  
  114.  
  115.   /*  Create message box dialog. */
  116.   n = 0;
  117.   XtSetArg (args[n], XmNdialogTitle, title_string);  n++;
  118.   XtSetArg (args[n], XmNokLabelString, button_string);  n++;
  119.   XtSetArg (args[n], XmNmessageString, message_string);  n++;
  120.   message_box = XmCreateMessageDialog (parent, "helpbox", args, n);
  121.  
  122.   button = XmMessageBoxGetChild (message_box, XmDIALOG_CANCEL_BUTTON);
  123.   XtUnmanageChild (button);
  124.   button = XmMessageBoxGetChild (message_box, XmDIALOG_HELP_BUTTON);
  125.   XtUnmanageChild (button);
  126.  
  127.  
  128.   /*  Free strings and return message box. */
  129.   if (title_string) XmStringFree (title_string);
  130.   if (message_string) XmStringFree (message_string);
  131.   if (button_string) XmStringFree (button_string);
  132.   return (message_box);
  133. }
  134.  
  135.  
  136. /*-------------------------------------------------------------
  137. **  QuitCB      - callback for quit button
  138. */
  139. void QuitCB (w, client_data, call_data) 
  140. Widget    w;    /*  widget id    */
  141. XtPointer    client_data;  /*  data from application   */
  142. XtPointer    call_data;  /*  data from widget class  */
  143. {
  144.  
  145.  
  146.   /*  Terminate the application. */
  147.   exit (0);
  148. }
  149.  
  150. /***********************************************************************
  151.  ***               Create_Draw_Dialog             ***
  152.  ***********************************************************************/
  153. Widget Create_Draw_Dialog (parent)
  154.  Widget parent;
  155.  {
  156.  Widget dlog_shell;
  157.  
  158. /*
  159.  * Create a dialog shell
  160.  */ 
  161.  dlog_shell = XmCreateDialogShell (parent, "dlog_shell", NULL, 0);
  162.  
  163. /*
  164.  * Create a drawing area
  165.  */ 
  166.  
  167.  n = 0;
  168.  XtSetArg(args[n], XmNwidth, 155); n++;
  169.  XtSetArg(args[n], XmNheight, 155); n++;
  170.  drawarea = XmCreateDrawingArea (dlog_shell, "drawarea", args, n);
  171.  XtManageChild(drawarea);
  172.  
  173.  }
  174.  
  175. /***********************************************************************
  176.  ***               activateCB1             ***
  177.  ***********************************************************************/
  178. void activateCB1(w, client_data, call_data)
  179.  Widget w;
  180.  XtPointer client_data;
  181.  XtPointer call_data;
  182.  {
  183.  Widget draw_area_dialog;
  184.  
  185.  draw_area_dialog = Create_Draw_Dialog (appshell);
  186.   
  187.  n=0;
  188.  XtSetArg(args[n], XmNbackgroundPixmap, px_up); n++;
  189.  XtSetValues (drawarea, args, n);
  190.  printf("DrawingArea background set to flag up.\n");
  191.  }
  192.  
  193. /***********************************************************************
  194.  ***               activateCB2             ***
  195.  ***********************************************************************/
  196. void activateCB2(w, client_data, call_data)
  197.  Widget w;
  198.  XtPointer client_data;
  199.  XtPointer call_data;
  200.  {
  201.  Widget draw_area_dialog;
  202.  
  203.  draw_area_dialog = Create_Draw_Dialog (appshell);
  204.   
  205.  n=0;
  206.  XtSetArg(args[n], XmNbackgroundPixmap, px_down); n++;
  207.  XtSetValues (drawarea, args, n);
  208.  printf("DrawingArea background set to flag down.\n");
  209.  }
  210.  
  211. /***********************************************************************
  212.  ***               MAIN                ***
  213.  ***********************************************************************/
  214. void main(argc, argv)
  215.  unsigned int argc;
  216.  char **argv;
  217. {
  218.   Widget rowcol, frame, main_window, menu_bar, menu_pane, cascade, button;
  219.   char *text1 = "Arrow Button";
  220.   char *text2 = "Arrow Button Gadget";
  221.   XmString label_text1, label_text2;
  222.   XtAppContext app_context;
  223.   Display *display;
  224.    
  225. /*
  226.  * Initialize the appshell shell widget
  227.  */
  228.   appshell = XtAppInitialize(&app_context, "Arrowbtns", NULL, 0,
  229.                              &argc, argv, NULL, args, 0);
  230.  
  231. /*
  232.  * Get the display ID for the bitmap to pixmap conversion
  233.  */
  234.  display = XtDisplay (appshell);
  235.  
  236.  /* Create main window.
  237.  */
  238.  n = 0;
  239.  main_window = XmCreateMainWindow (appshell, "main1", args, n);
  240.  XtManageChild (main_window);
  241.  
  242.  /* Create menu bar in main window. */
  243.  n = 0;
  244.  menu_bar = XmCreateMenuBar (main_window, "menu_bar", args, n); 
  245.  XtManageChild (menu_bar);
  246.  
  247.  /* Create "File" pulldown menu. */
  248.  n = 0;
  249.  menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", args, n);
  250.  
  251.  n = 0;
  252.  button = XmCreatePushButtonGadget (menu_pane, "Exit", args, n);
  253.  XtManageChild (button);
  254.  XtAddCallback (button, XmNactivateCallback, QuitCB, NULL);
  255.  
  256.  n = 0;
  257.  XtSetArg (args[n], XmNsubMenuId, menu_pane); n++;
  258.  cascade = XmCreateCascadeButton (menu_bar, "File", args, n);
  259.  XtManageChild (cascade);
  260.  
  261.  /* Create "Help" button. */
  262.  n = 0;
  263.  cascade = XmCreateCascadeButton (menu_bar, "Help", args, n);
  264.  XtManageChild (cascade);
  265.  XtAddCallback (cascade, XmNactivateCallback, HelpCB, NULL);
  266.  
  267.  n = 0;
  268.  XtSetArg (args[n], XmNmenuHelpWidget, cascade); n++;
  269.  XtSetValues (menu_bar, args, n);
  270.  
  271. /*
  272.  * Create a frame widget
  273.  */
  274.  
  275.  n = 0;
  276.  XtSetArg(args[n], XmNmarginWidth, 15); n++;
  277.  XtSetArg(args[n], XmNmarginHeight, 15); n++;
  278.  frame = XmCreateFrame (main_window, "frame", args, n);
  279.  XtManageChild(frame);
  280.  
  281. /*  Set main window areas  */
  282.  XmMainWindowSetAreas (main_window, menu_bar, NULL, NULL, NULL, frame);
  283.  
  284. /*
  285.  * Get pixmaps from bitmaps
  286.  */
  287.  
  288.   px_up =XCreatePixmapFromBitmapData(display, 
  289.       DefaultRootWindow(display),
  290.       XBMu_BITS, XBMu_WIDTH,XBMu_HEIGHT,
  291.       GetPixel("white"),
  292.       GetPixel("red"),
  293. /*    GetPixel("black"),
  294.       GetPixel("#eee"), */
  295.       DefaultDepth(display,DefaultScreen(display)));
  296.  
  297.   px_down = XCreatePixmapFromBitmapData(display, 
  298.       DefaultRootWindow(display),
  299.       XBMd_BITS, XBMd_WIDTH,XBMd_HEIGHT,
  300.       GetPixel("red"),
  301.       GetPixel("white"),
  302. /*    GetPixel("black"),
  303.       GetPixel("#eee"), */
  304.       DefaultDepth(display,DefaultScreen(display)));
  305.  
  306. /*
  307.  * Create a row column manager
  308. */
  309.   n = 0;
  310.   XtSetArg(args[n], XmNnumColumns, 2); n++;
  311.   XtSetArg(args[n], XmNpacking, XmPACK_COLUMN); n++;
  312.   XtSetArg(args[n], XmNspacing, 5); n++;
  313.   rowcol = XmCreateRowColumn(frame, "rowcol", args, n);
  314.   XtManageChild(rowcol);
  315.   
  316. /*
  317.  * Set up compound strings for the label widgets
  318.  */
  319.   label_text1 = XmStringCreateLtoR(text1, XmFONTLIST_DEFAULT_TAG);
  320.   label_text2 = XmStringCreateLtoR(text2, XmFONTLIST_DEFAULT_TAG);
  321.   
  322. /*
  323.  * Create a label for the arrow button
  324. */
  325.   n = 0;
  326.   XtSetArg(args[n], XmNlabelString, label_text1); n++;
  327.   ablabel = XmCreateLabel(rowcol, "ablabel", args, n);
  328.   XtManageChild(ablabel);
  329.   XmStringFree (label_text1);
  330.   
  331. /*
  332.  * Create an arrow button
  333. */
  334.   n = 0;
  335.   XtSetArg(args[n], XmNwidth, 50); n++;
  336.   XtSetArg(args[n], XmNheight, 50); n++;
  337.   arrowbtn = XmCreateArrowButton(rowcol, "arrowbtn", args, n);
  338.   XtManageChild(arrowbtn);
  339.   
  340. /*
  341.  * Add Callback for this button
  342.  */ 
  343.  XtAddCallback (arrowbtn, XmNactivateCallback, activateCB1, NULL);
  344.  
  345. /*
  346.  * Create a label for the arrow button gadget
  347. */
  348.   n = 0;
  349.   XtSetArg(args[n], XmNlabelString, label_text2); n++;
  350.   abglabel = XmCreateLabel(rowcol, "abglabel", args, n);
  351.   XtManageChild(abglabel);
  352.   XmStringFree (label_text2);
  353.   
  354. /*
  355.  * Create an arrow button gadget
  356. */
  357.   n = 0;
  358.   XtSetArg(args[n], XmNwidth, 50); n++;
  359.   XtSetArg(args[n], XmNheight, 50); n++;
  360.   XtSetArg(args[n], XmNarrowDirection, XmARROW_DOWN); n++;
  361.   arrowbtng = XmCreateArrowButtonGadget (rowcol, "arrowbtng", args, n);
  362.   XtManageChild(arrowbtng);
  363.  
  364. /*
  365.  * Add Callback for this button
  366.  */ 
  367.  XtAddCallback (arrowbtng, XmNactivateCallback, activateCB2, NULL);
  368.  
  369. /*
  370.  * Realize the appshell widget, which displays all children
  371.  */ 
  372.   XtRealizeWidget(appshell);
  373.  
  374. /*
  375.  * Go into a loop and wait for input
  376.  */
  377.   XtAppMainLoop(app_context);
  378. }
  379.