home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume1 / torch / part03 / misc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-28  |  4.9 KB  |  183 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       : misc.c                    *
  18. *  Author  : Gary Henderson                             *
  19. *  Date       : 23rd Aug 1988                *
  20. *  Purpose : String to pixmap converter so user can     *
  21. *            specify background bitmaps for widgets.     *
  22. *                            *
  23. *********************************************************/
  24.  
  25. /*------Include files-----------------------------------*/
  26.  
  27. #include <stdio.h>
  28. #include <X11/Xlib.h>
  29. #include <X11/IntrinsicP.h>
  30. #include <X11/Convert.h>
  31. #include <X11/StringDefs.h>
  32.  
  33. /*------Forward delarations-----------------------------*/
  34.  
  35. /*------Constants and macros----------------------------*/
  36.  
  37. /*------Exported variables/functions--------------------*/
  38.  
  39. void AddNewConverter ();
  40.  
  41. /*------Imported variables/functions--------------------*/
  42.  
  43. /*------Static variables--------------------------------*/
  44.  
  45. /*
  46.                             *****************
  47.                             *        *
  48.                             *CVTSTRINGTOPIXMAP*
  49.                             *        *
  50.                             *****************
  51. -------------------------------------------------------------------------
  52. | Convert the given string (taken to be the path name of a bitmap file)    |
  53. | into a pixmap.  This is so the user can specify background pixmaps    |
  54. | for widgets from a .Xdefaults file.                                    |
  55. -------------------------------------------------------------------------
  56. */
  57. static void CvtStringToPixmap (args, num_args, fromVal, toVal)
  58. XrmValuePtr args;
  59. Cardinal * num_args;
  60. XrmValuePtr fromVal;
  61. XrmValuePtr toVal;
  62. {
  63.     static Pixmap pixmap;
  64.     static Pixel fore_pixel;
  65.     static XtResource pixmap_resources[] = {
  66.         {XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel),
  67.      (Cardinal) &fore_pixel, XtRString, "Black"},
  68.     };
  69.     
  70.     unsigned int width, height;
  71.     int result;
  72.     Pixmap temp;
  73.     XGCValues gcvalues;
  74.     GC gc;
  75.     Screen * screen;
  76.     Cardinal depth;
  77.     Pixel back_pixel;
  78.     Widget widget;
  79.     
  80.     if (*num_args != 4)
  81.         return;
  82.  
  83.     widget = (Widget) args[0].addr;
  84.     screen = *((Screen **) args[1].addr);
  85.     
  86.     /* So much for doing things properly; if you try to get the widget's
  87.        depth with the following code: 
  88.             depth = *((Cardinal *) args[2].addr);
  89.  
  90.        you always read zero !  So for the time been, assume the widget has
  91.        the same depth as the root window */
  92.  
  93.     depth = PlanesOfScreen (screen);
  94.     back_pixel = *((Pixel *) args[3].addr);
  95.  
  96.     result = XReadBitmapFile (DisplayOfScreen (screen),
  97.                               RootWindowOfScreen (screen),
  98.                   (char *) fromVal->addr,
  99.                           &width, 
  100.                   &height, 
  101.                   &temp, 
  102.                   (int *) 0,
  103.                   (int *) 0);
  104.  
  105.     if (result != BitmapSuccess)
  106.         return;
  107.     else
  108.     {
  109.     pixmap = XCreatePixmap (DisplayOfScreen (screen),
  110.                             RootWindowOfScreen (screen),
  111.                 width,
  112.                 height, 
  113.                 depth);
  114.         
  115.     /* Need two colours when converting a bitmap into a pixmap.  The
  116.        background pixel value is easy, but the foreground requires a bit
  117.        more work to get hold of */
  118.        
  119.     gcvalues.background = back_pixel;
  120.     
  121.     XtGetSubresources (widget, 
  122.                        (caddr_t) 0,
  123.                XtNbackgroundPixmap,
  124.                XtCPixmap,
  125.                            pixmap_resources,
  126.                XtNumber (pixmap_resources),
  127.                (ArgList) 0,
  128.                0);
  129.  
  130.     gcvalues.foreground = fore_pixel;
  131.     
  132.     gc = XCreateGC (DisplayOfScreen (screen),
  133.                     pixmap,
  134.             GCForeground | GCBackground,
  135.             &gcvalues);
  136.  
  137.     XCopyPlane (DisplayOfScreen (screen),
  138.                 temp, 
  139.             pixmap, 
  140.             gc, 
  141.             0, 
  142.             0, 
  143.             width, 
  144.             height, 
  145.                 0, 
  146.             0, 
  147.             1l);
  148.         
  149.     XFreePixmap (DisplayOfScreen (screen), temp);
  150.         XFreeGC (DisplayOfScreen (screen), gc);
  151.     }
  152.  
  153.     toVal->addr = (caddr_t) &pixmap;
  154.     toVal->size = sizeof (Pixmap);
  155. }
  156.  
  157. /*
  158.                             *****************
  159.                             *        *
  160.                             *ADDNEWCONVERTER*
  161.                             *        *
  162.                             *****************
  163. -------------------------------------------------------------------------
  164. | Install the string-to-pixmap converter into the toolkit's current list|
  165. | of converters.                                                        |
  166. -------------------------------------------------------------------------
  167. */
  168. void AddNewConverter ()
  169. {
  170.     static XtConvertArgRec pixmapConvertArgs[] = {
  171.         {XtBaseOffset, (caddr_t) 0, sizeof (Widget)},
  172.     {XtBaseOffset, (caddr_t) XtOffset (Widget, core.screen), 
  173.      sizeof (Screen *)},
  174.         {XtBaseOffset, (caddr_t) XtOffset (Widget, core.depth), 
  175.      sizeof (Cardinal)},
  176.     {XtBaseOffset, (caddr_t) XtOffset (Widget, core.background_pixel),
  177.      sizeof (Pixel)},
  178.     };
  179.  
  180.     XtAddConverter (XtRString, XtRPixmap, CvtStringToPixmap,
  181.                     pixmapConvertArgs, XtNumber (pixmapConvertArgs));
  182. }
  183.