home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / lib / xm / row-column.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-22  |  3.0 KB  |  97 lines

  1. #include "../xt/xt.h"
  2. #include <Xm/Xm.h>
  3. #include <Xm/RowColumn.h>
  4.  
  5. static SYMDESCR Type_Syms[] = {
  6.    { "work-area",        XmWORK_AREA },
  7.    { "menu-bar",         XmMENU_BAR },
  8.    { "menu-pulldown",    XmMENU_PULLDOWN },
  9.    { "menu-popup",       XmMENU_POPUP },
  10.    { "menu-option",      XmMENU_OPTION },
  11.    { 0, 0}
  12. };
  13.  
  14. static void Post_Handler (w, client_data, event, unused) Widget w;
  15.     XtPointer client_data; XEvent *event; Boolean *unused; {
  16.     unsigned int b;
  17.     Arg a;
  18.     XButtonPressedEvent *ep = (XButtonPressedEvent *)event;
  19.     Widget popup = (Widget)client_data;
  20.  
  21.     XtSetArg (a, XmNwhichButton, &b);
  22.     XtGetValues (popup, &a, 1);
  23.     if (ep->button != b)
  24.     return;
  25.     XmMenuPosition (popup, ep);
  26.     XtManageChild (popup);
  27. }
  28.  
  29. static Object Get_Row_Column_CB (p) XmRowColumnCallbackStruct *p; {
  30.     Object ret, s;
  31.     GC_Node2;
  32.  
  33.     ret = s = Make_Widget_Foreign (p->widget);
  34.     GC_Link2 (ret, s);
  35.     ret = Cons (ret, Null);
  36.     s = Get_Any_CB ((XmAnyCallbackStruct *)p);
  37.     ret = Cons (Cdr (s), ret);
  38.     ret = Cons (Car (s), ret);
  39.     GC_Unlink;
  40.     return ret;
  41. }
  42.  
  43. static Object P_Popup_Menu_Attach_To (m, w) Object m, w; {
  44.    XtPointer client_data;
  45.     Arg a;
  46.     Check_Widget_Class (m, xmRowColumnWidgetClass);
  47.     Check_Widget (w);
  48.     XtSetArg (a, XmNuserData, &client_data);
  49.     XtGetValues (WIDGET(w)->widget, &a, 1);
  50.     if (client_data)
  51.     XtRemoveEventHandler (WIDGET(w)->widget, ButtonPressMask, 0,
  52.         Post_Handler, client_data);
  53.     client_data = (XtPointer)WIDGET(m)->widget;
  54.     XtAddEventHandler (WIDGET(w)->widget, ButtonPressMask, 0,
  55.     Post_Handler, client_data);
  56.     client_data = (XtPointer)WIDGET(m)->widget;
  57.     XtSetValues (WIDGET(w)->widget, &a, 1);
  58.     return Void;
  59. }
  60.  
  61. static Object S_Row_Column_EntryCallback (x) XtArgVal x; {
  62.    return Get_Row_Column_CB ((XmRowColumnCallbackStruct *)x);
  63. }
  64.  
  65. static XtArgVal C_Row_Column_RowColumnType (x) Object x; {
  66.    return (XtArgVal)Symbols_To_Bits (x, 0, Type_Syms);
  67. }
  68.  
  69. static XtArgVal C_Row_Column_WhichButton (x) Object x; {
  70.    return (XtArgVal)Get_Integer (x);
  71. }
  72.  
  73. static Object S_Row_Column_WhichButton (x) XtArgVal x; {
  74.    return Make_Integer (x);
  75. }
  76.  
  77. static XtArgVal C_Row_Column_EntryClass (x) Object x; {
  78.    Check_Type (x, T_Class); return (XtArgVal)CLASS(x)->class;
  79. }
  80.  
  81. static Object S_Row_Column_EntryClass (x) XtArgVal x; {
  82.    return Make_Widget_Class ((WidgetClass)x);
  83. }
  84.  
  85. init_rowcolumn () {
  86.     XtResourceList r = 0;
  87.     Define_Class ("row-column", xmRowColumnWidgetClass, r, 0);
  88.     Define_Callback ("row-column", "entryCallback", 1);
  89.     Define_Primitive (P_Popup_Menu_Attach_To, "popup-menu-attach-to!", 2, 2, EVAL);
  90.     Define_Converter_To_Scheme ("row-column-entryClass", S_Row_Column_EntryClass);
  91.     Define_Converter_To_C ("row-column-entryClass", C_Row_Column_EntryClass);
  92.     Define_Converter_To_Scheme ("row-column-whichButton", S_Row_Column_WhichButton);
  93.     Define_Converter_To_C ("row-column-whichButton", C_Row_Column_WhichButton);
  94.     Define_Converter_To_C ("row-column-rowColumnType", C_Row_Column_RowColumnType);
  95.     Define_Converter_To_Scheme ("row-column-entryCallback", S_Row_Column_EntryCallback);
  96. }
  97.