home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / emacs-19.28-src.tgz / tar.out / fsf / emacs / lwlib / lwlib-Xlw.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  6KB  |  217 lines

  1. /* The lwlib interface to "xlwmenu" menus.
  2.    Copyright (C) 1992 Lucid, Inc.
  3.  
  4. This file is part of the Lucid Widget Library.
  5.  
  6. The Lucid Widget Library is free software; you can redistribute it and/or 
  7. modify it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 1, or (at your option)
  9. any later version.
  10.  
  11. The Lucid Widget Library is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU Emacs; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "lwlib-Xlw.h"
  21. #include <X11/StringDefs.h>
  22. #include <X11/IntrinsicP.h>
  23. #include <X11/ObjectP.h>
  24. #include <X11/CompositeP.h>
  25. #include <X11/Shell.h>
  26. #include "xlwmenu.h"
  27.  
  28. /* Menu callbacks */
  29. static void
  30. pre_hook (w, client_data, call_data)
  31.      Widget w;
  32.      XtPointer client_data;
  33.      XtPointer call_data;
  34. {
  35.   widget_instance* instance = (widget_instance*)client_data;
  36.   widget_value* val;
  37.  
  38.   if (w->core.being_destroyed)
  39.     return;
  40.  
  41.   val = lw_get_widget_value_for_widget (instance, w);
  42.   if (instance->info->pre_activate_cb)
  43.     instance->info->pre_activate_cb (w, instance->info->id,
  44.                      val ? val->call_data : NULL);
  45. }
  46.  
  47. static void
  48. pick_hook (w, client_data, call_data)
  49.      Widget w;
  50.      XtPointer client_data;
  51.      XtPointer call_data;
  52. {
  53.   widget_instance* instance = (widget_instance*)client_data;
  54.   widget_value* contents_val = (widget_value*)call_data;
  55.   widget_value* widget_val;
  56.   XtPointer widget_arg;
  57.  
  58.   if (w->core.being_destroyed)
  59.     return;
  60.  
  61.   if (instance->info->selection_cb && contents_val && contents_val->enabled
  62.       && !contents_val->contents)
  63.     instance->info->selection_cb (w, instance->info->id,
  64.                   contents_val->call_data);
  65.  
  66.   widget_val = lw_get_widget_value_for_widget (instance, w);
  67.   widget_arg = widget_val ? widget_val->call_data : NULL;
  68.   if (instance->info->post_activate_cb)
  69.     instance->info->post_activate_cb (w, instance->info->id, widget_arg);
  70.  
  71. }
  72.  
  73. /* creation functions */
  74.  
  75. static Widget
  76. xlw_create_menubar (instance)
  77.      widget_instance* instance;
  78. {
  79.   Widget widget;
  80.   Arg al[1];
  81.   int ac = 0;
  82.  
  83.   XtSetArg (al[ac], XtNmenu, instance->info->val); ac++;
  84.  
  85.   /* This used to use XtVaCreateWidget, but an old Xt version
  86.      has a bug in XtVaCreateWidget that frees instance->info->name.  */
  87.   widget
  88.     = XtCreateWidget (instance->info->name, xlwMenuWidgetClass,
  89.               instance->parent, al, ac);
  90.  
  91.   XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance);
  92.   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
  93.   return widget;
  94. }
  95.  
  96. static Widget
  97. xlw_create_popup_menu (instance)
  98.      widget_instance* instance;
  99. {
  100.   Widget popup_shell
  101.     = XtCreatePopupShell (instance->info->name, overrideShellWidgetClass,
  102.               instance->parent, NULL, 0);
  103.   
  104.   Widget widget;
  105.   Arg al[2];
  106.   int ac = 0;
  107.  
  108.   XtSetArg (al[ac], XtNmenu, instance->info->val); ac++;
  109.   XtSetArg (al[ac], XtNhorizontal, False); ac++;
  110.  
  111.   /* This used to use XtVaManagedCreateWidget, but an old Xt version
  112.      has a bug in XtVaManagedCreateWidget that frees instance->info->name.  */
  113.   widget
  114.     = XtCreateManagedWidget ("popup", xlwMenuWidgetClass,
  115.                  popup_shell, al, ac);
  116.  
  117.   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
  118.  
  119.   return popup_shell;
  120. }
  121.  
  122. widget_creation_entry 
  123. xlw_creation_table [] =
  124. {
  125.   {"menubar", xlw_create_menubar},
  126.   {"popup", xlw_create_popup_menu},
  127.   {NULL, NULL}
  128. };
  129.  
  130. Boolean
  131. lw_lucid_widget_p (widget)
  132.      Widget widget;
  133. {
  134.   WidgetClass the_class = XtClass (widget);
  135.  
  136.   if (the_class == xlwMenuWidgetClass)
  137.     return True;
  138.   if (the_class == overrideShellWidgetClass)
  139.     return (XtClass (((CompositeWidget)widget)->composite.children [0])
  140.         == xlwMenuWidgetClass);
  141.   return False;
  142. }
  143.  
  144. void
  145. xlw_update_one_widget (instance, widget, val, deep_p)
  146.      widget_instance* instance;
  147.      Widget widget;
  148.      widget_value* val;
  149.      Boolean deep_p;
  150. {
  151.   XlwMenuWidget mw;
  152.   Arg al[1];
  153.  
  154.   if (XtIsShell (widget))
  155.     mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0];
  156.   else
  157.     mw = (XlwMenuWidget)widget;
  158.  
  159.   /* This used to use XtVaSetValues, but some old Xt versions
  160.      that have a bug in XtVaCreateWidget might have it here too.  */
  161.   XtSetArg (al[0], XtNmenu, instance->info->val);
  162.  
  163.   XtSetValues (widget, al, 1);
  164. }
  165.  
  166. void
  167. xlw_update_one_value (instance, widget, val)
  168.      widget_instance* instance;
  169.      Widget widget;
  170.      widget_value* val;
  171. {
  172.   return;
  173. }
  174.  
  175. void
  176. xlw_pop_instance (instance, up)
  177.      widget_instance* instance;
  178.      Boolean up;
  179. {
  180. }
  181.  
  182. void
  183. xlw_popup_menu (widget)
  184.      Widget widget;
  185. {
  186.   XButtonPressedEvent dummy;
  187.   XlwMenuWidget mw;
  188.  
  189.   if (!XtIsShell (widget))
  190.     return;
  191.  
  192.   mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0];
  193.  
  194.   dummy.type = ButtonPress;
  195.   dummy.serial = 0;
  196.   dummy.send_event = 0;
  197.   dummy.display = XtDisplay (widget);
  198.   dummy.window = XtWindow (XtParent (widget));
  199.   dummy.time = CurrentTime;
  200.   dummy.button = 0;
  201.   XQueryPointer (dummy.display, dummy.window, &dummy.root,
  202.          &dummy.subwindow, &dummy.x_root, &dummy.y_root,
  203.          &dummy.x, &dummy.y, &dummy.state);
  204.  
  205.   pop_up_menu (mw, &dummy);
  206. }
  207.  
  208. /* Destruction of instances */
  209. void
  210. xlw_destroy_instance (instance)
  211.      widget_instance* instance;
  212. {
  213.   if (instance->widget)
  214.     XtDestroyWidget (instance->widget);
  215. }
  216.  
  217.