]> code.delx.au - gnu-emacs/blobdiff - lwlib/lwlib-Xlw.c
(help-xref-interned): make it also work on variable-only and
[gnu-emacs] / lwlib / lwlib-Xlw.c
index 4b48b231a4dbe066f3618085c81c0d5436d3e180..a927d40bf25fd82ed60fffbf00a772b44d77a8c2 100644 (file)
@@ -15,7 +15,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 #include "lwlib-Xlw.h"
 #include <X11/StringDefs.h>
@@ -77,25 +78,21 @@ xlw_create_menubar (instance)
      widget_instance* instance;
 {
   Widget widget;
+  Arg al[5];
+  int ac = 0;
+
+  XtSetArg (al[ac], XtNmenu, instance->info->val); ac++;
+#ifdef emacs
+  XtSetArg (al[ac], XtNshowGrip, 0); ac++;
+  XtSetArg (al[ac], XtNresizeToPreferred, 1); ac++;
+  XtSetArg (al[ac], XtNallowResize, 1); ac++;
+#endif
 
-  /* Don't use malloc_widget_value, because the freeing will be done by free.
-     (Also it wastes time calling memset).  */
-  widget_value *tem = (widget_value *) malloc (sizeof (widget_value));
-
-  /* _XtCreate is freeing the object we passed,
-     so make a copy that we free later.  */
-  bcopy (instance->info->val, tem, sizeof (widget_value));
-
+  /* This used to use XtVaCreateWidget, but an old Xt version
+     has a bug in XtVaCreateWidget that frees instance->info->name.  */
   widget
-    = XtVaCreateWidget (instance->info->name, xlwMenuWidgetClass,
-                       instance->parent,
-                       XtNmenu, tem,
-                       0);
-
-#if 0 /* XtVaCreateWidget frees this, at least in the X11R4
-        version that is running on mole.gnu.ai.mit.edu.  */
-  free_widget_value (tem);
-#endif
+    = XtCreateWidget (instance->info->name, xlwMenuWidgetClass,
+                     instance->parent, al, ac);
 
   XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance);
   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
@@ -111,25 +108,17 @@ xlw_create_popup_menu (instance)
                          instance->parent, NULL, 0);
   
   Widget widget;
+  Arg al[2];
+  int ac = 0;
 
-  /* Don't use malloc_widget_value, because the freeing will be done by free.
-     (Also it wastes time calling memset).  */
-  widget_value *tem = (widget_value *) malloc (sizeof (widget_value));
-
-  /* _XtCreate is freeing the object we passed,
-     so make a copy that we free later.  */
-  bcopy (instance->info->val, tem, sizeof (widget_value));
+  XtSetArg (al[ac], XtNmenu, instance->info->val); ac++;
+  XtSetArg (al[ac], XtNhorizontal, False); ac++;
 
+  /* This used to use XtVaManagedCreateWidget, but an old Xt version
+     has a bug in XtVaManagedCreateWidget that frees instance->info->name.  */
   widget
-    = XtVaCreateManagedWidget ("popup", xlwMenuWidgetClass,
-                              popup_shell,
-                              XtNmenu, tem,
-                              XtNhorizontal, False,
-                              0);
-
-#if 0
-  free_widget_value (tem);
-#endif
+    = XtCreateManagedWidget ("popup", xlwMenuWidgetClass,
+                            popup_shell, al, ac);
 
   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
 
@@ -166,12 +155,18 @@ xlw_update_one_widget (instance, widget, val, deep_p)
      Boolean deep_p;
 {
   XlwMenuWidget mw;
+  Arg al[1];
 
   if (XtIsShell (widget))
     mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0];
   else
     mw = (XlwMenuWidget)widget;
-  XtVaSetValues (widget, XtNmenu, val, 0);
+
+  /* This used to use XtVaSetValues, but some old Xt versions
+     that have a bug in XtVaCreateWidget might have it here too.  */
+  XtSetArg (al[0], XtNmenu, instance->info->val);
+
+  XtSetValues (widget, al, 1);
 }
 
 void
@@ -191,8 +186,9 @@ xlw_pop_instance (instance, up)
 }
 
 void
-xlw_popup_menu (widget)
+xlw_popup_menu (widget, event)
      Widget widget;
+     XEvent *event;
 {
   XButtonPressedEvent dummy;
   XlwMenuWidget mw;
@@ -202,18 +198,23 @@ xlw_popup_menu (widget)
 
   mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0];
 
-  dummy.type = ButtonPress;
-  dummy.serial = 0;
-  dummy.send_event = 0;
-  dummy.display = XtDisplay (widget);
-  dummy.window = XtWindow (XtParent (widget));
-  dummy.time = CurrentTime;
-  dummy.button = 0;
-  XQueryPointer (dummy.display, dummy.window, &dummy.root,
-                &dummy.subwindow, &dummy.x_root, &dummy.y_root,
-                &dummy.x, &dummy.y, &dummy.state);
-
-  pop_up_menu (mw, &dummy);
+  if (event)
+    pop_up_menu (mw, event);
+  else
+    {
+      dummy.type = ButtonPress;
+      dummy.serial = 0;
+      dummy.send_event = 0;
+      dummy.display = XtDisplay (widget);
+      dummy.window = XtWindow (XtParent (widget));
+      dummy.time = CurrentTime;
+      dummy.button = 0;
+      XQueryPointer (dummy.display, dummy.window, &dummy.root,
+                    &dummy.subwindow, &dummy.x_root, &dummy.y_root,
+                    &dummy.x, &dummy.y, &dummy.state);
+
+      pop_up_menu (mw, &dummy);
+    }
 }
 
 \f/* Destruction of instances */