home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / fontutils-0.6-base.tgz / fontutils-0.6-base.tar / fsf / fontutils / include / xt-common.h < prev   
C/C++ Source or Header  |  1992-06-21  |  5KB  |  134 lines

  1. /* xt-common.h: declarations that all programs using Xt need.
  2.  
  3. Copyright (C) 1992 Free Software Foundation, Inc.
  4.  
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. #ifndef XT_COMMON_H
  20. #define XT_COMMON_H
  21.  
  22. #include <X11/Intrinsic.h>
  23. #include <X11/StringDefs.h>
  24.  
  25.  
  26. /* Our own definitions.  */
  27.  
  28. /* It is convenient to have this type for declaring action procedures.  */
  29. typedef void action_proc_type (Widget, XEvent *, String *, Cardinal *);
  30.  
  31. /* We virtually always want an arg array and its length together in
  32.    parameter lists.  */
  33. #define XTARG(arg_array) (arg_array), XtNumber (arg_array)
  34.  
  35. /* Assign a value to an Xt argument.  */
  36. #define XTASSIGN_ARG(arg, val) (arg).value = (XtArgVal) (val)
  37.  
  38. /* We use command buttons the same way in all programs, so here are
  39.    macros to make it easy to use them.  */
  40.  
  41. /* Our buttons only have one procedure associated with them.  This macro
  42.    expands into an XtCallbackRec array.  */
  43. #define SINGLE_CALLBACK(proc, data)                    \
  44.   { { (XtCallbackProc) proc, (XtPointer) (data) },            \
  45.     { NULL, NULL }                            \
  46.   }
  47.  
  48. /* This macro declares a command widget.  The routine that performs the
  49.    action should be named `NAME_command'; it will be passed the
  50.    CLIENT_DATA argument.  The string TITLE appears in the window.  */
  51. #define DECLARE_BUTTON(name, title, client_data)            \
  52.   XtCallbackRec name##_callback_list[]                    \
  53.     = SINGLE_CALLBACK (name##_command, client_data);            \
  54.   Arg name##_args[]                            \
  55.     = { { XtNfromHoriz,    (XtArgVal) NULL }, /* We assign to this below.  */\
  56.         { XtNlabel,    (XtArgVal) title },                \
  57.         { XtNcallback,    (XtArgVal) name##_callback_list },        \
  58.       };                                \
  59.   Widget name##_widget /* The invoker supplies the semicolon.  */
  60.   
  61.  
  62. /* This macro defines a command button NAME, by using the variables
  63.    that DECLARE_BUTTON creates.  It also keeps track of the widget that
  64.    should be to the left of the new one, by assuming a variable
  65.    `widget_to_the_left'.  */
  66.  
  67. #define DEFINE_BUTTON(name, parent)                    \
  68.   name##_args[0].value = (XtArgVal) widget_to_the_left;            \
  69.   name##_widget = XtCreateManagedWidget (#name, commandWidgetClass,    \
  70.                      parent, XTARG (name##_args));    \
  71.   widget_to_the_left = name##_widget
  72.   /* The invoker supplies the semicolon.  */
  73.  
  74.  
  75. /* Parse a character code in STR; if invalid, give a warning.  If valid,
  76.    assign the value to CODE.  Return whether it was valid.  */
  77. #define XTPARSE_CHARCODE(code, str, widget)                \
  78.   ({                                    \
  79.     boolean valid;                            \
  80.     charcode_type test = parse_charcode (str, &valid);            \
  81.                                     \
  82.     if (valid)                                \
  83.       code = test;                            \
  84.     else                                \
  85.       {                                    \
  86.         string s = concat3 ("`", str, "': invalid character code");    \
  87.         x_warning (XtParent (widget), s);                \
  88.         free (s);                            \
  89.       };                                \
  90.     valid;                                \
  91.   })
  92.  
  93.  
  94. /* Find the widget whose name is NAME in the widget tree rooted at
  95.    TOP.  If no such widget can be found, give a fatal error.
  96.    
  97.    We use the extra variable `root' in case `top' is an expression
  98.    involving some other widget named `w'.  */
  99. #define XFIND_WIDGET(top, name)                        \
  100.     ({                                    \
  101.       Widget root = top;                        \
  102.       Widget w = XtNameToWidget (root, name);                \
  103.       if (w == NULL)                            \
  104.         {                                \
  105.           string s = concat3 ("Cannot find widget `", name, "'.");     \
  106.           XtErrorMsg ("noWidget", "FindWidget", "Error", s, NULL, 0);    \
  107.         }                                \
  108.       w;                                \
  109.     })
  110.  
  111.  
  112. /* For consistency, so we can give `Pointer' as a `type' below.  */
  113. typedef XtPointer Pointer;
  114.  
  115. /* We define our widget resources in a predictable way.  We assume an
  116.    `OFFSET' macro has been defined as, e.g.,
  117.    #define OFFSET(field) XtOffset (BitmapWidget, bitmap.field)
  118. */
  119. #define DEFINE_RESOURCE(name, field_name, class_name, type,        \
  120.                         default_type, default)                \
  121.   { XtN##name, XtC##class_name, XtR##type, sizeof (type),        \
  122.     OFFSET (field_name), XtR##default_type, (XtPointer) (default) }
  123.  
  124. #define IMMEDIATE_RESOURCE2(name, field_name, class_name, type, default)\
  125.   DEFINE_RESOURCE (name, field_name, class_name, type, Immediate, default)
  126.  
  127. #define IMMEDIATE_RESOURCE(name, class_name, type, default)        \
  128.   IMMEDIATE_RESOURCE2 (name, name, class_name, type, default)
  129.  
  130. #define STRING_RESOURCE(name, class_name, default)            \
  131.   DEFINE_RESOURCE (name, name, class_name, String, String, default)
  132.  
  133. #endif /* not XT_COMMON_H */
  134.