]> code.delx.au - gnu-emacs/blobdiff - lwlib/lwlib-Xlw.c
More preparation for removing dired.
[gnu-emacs] / lwlib / lwlib-Xlw.c
index b7268bc12d09a8c66d489bd526269c33911a9e4f..f2cf68d80a382b85f0f7ba38663ceb478291a667 100644 (file)
@@ -1,21 +1,30 @@
 /* The lwlib interface to "xlwmenu" menus.
    Copyright (C) 1992 Lucid, Inc.
 /* The lwlib interface to "xlwmenu" menus.
    Copyright (C) 1992 Lucid, Inc.
+   Copyright (C) 1994, 2000, 2001, 2002, 2003, 2004,
+                 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 This file is part of the Lucid Widget Library.
 
 
 This file is part of the Lucid Widget Library.
 
-The Lucid Widget Library is free software; you can redistribute it and/or 
+The Lucid Widget Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 1, or (at your option)
 any later version.
 
 The Lucid Widget Library is distributed in the hope that it will be useful,
 modify it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 1, or (at your option)
 any later version.
 
 The Lucid Widget Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of 
+but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 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
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 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., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "lisp.h"
 
 #include "lwlib-Xlw.h"
 #include <X11/StringDefs.h>
 
 #include "lwlib-Xlw.h"
 #include <X11/StringDefs.h>
@@ -25,7 +34,74 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <X11/Shell.h>
 #include "xlwmenu.h"
 
 #include <X11/Shell.h>
 #include "xlwmenu.h"
 
+#if 0
+
+#include <stdio.h>
+
+/* Print the complete X resource name of widget WIDGET to stderr.
+   This is sometimes handy to have available.  */
+
+void
+x_print_complete_resource_name (widget)
+     Widget widget;
+{
+  int i;
+  String names[100];
+
+  for (i = 0; i < 100 && widget != NULL; ++i)
+    {
+      names[i] = XtName (widget);
+      widget = XtParent (widget);
+    }
+
+  for (--i; i >= 1; --i)
+    fprintf (stderr, "%s.", names[i]);
+  fprintf (stderr, "%s\n", names[0]);
+}
+
+#endif /* 0 */
+
+
 \f/* Menu callbacks */
 \f/* Menu callbacks */
+
+/* Callback XtNhighlightCallback for Lucid menus.  W is the menu
+   widget, CLIENT_DATA contains a pointer to the widget_instance
+   for the menu, CALL_DATA contains a pointer to the widget_value
+   structure for the highlighted menu item.  The latter may be null
+   if there isn't any highlighted menu item.  */
+
+static void
+highlight_hook (w, client_data, call_data)
+     Widget w;
+     XtPointer client_data;
+     XtPointer call_data;
+{
+  widget_instance *instance = (widget_instance *) client_data;
+
+  if (instance->info->highlight_cb
+      && !w->core.being_destroyed)
+    instance->info->highlight_cb (w, instance->info->id, call_data);
+}
+
+static void
+enter_hook (w, client_data, call_data)
+     Widget w;
+     XtPointer client_data;
+     XtPointer call_data;
+{
+  highlight_hook (w, client_data, call_data);
+}
+
+static void
+leave_hook (w, client_data, call_data)
+     Widget w;
+     XtPointer client_data;
+     XtPointer call_data;
+{
+  highlight_hook (w, client_data, NULL);
+}
+
+
 static void
 pre_hook (w, client_data, call_data)
      Widget w;
 static void
 pre_hook (w, client_data, call_data)
      Widget w;
@@ -71,28 +147,32 @@ pick_hook (w, client_data, call_data)
 }
 
 \f/* creation functions */
 }
 
 \f/* creation functions */
+
 static Widget
 xlw_create_menubar (instance)
      widget_instance* instance;
 {
   Widget widget;
 static Widget
 xlw_create_menubar (instance)
      widget_instance* instance;
 {
   Widget widget;
-
-  widget_value *tem = (widget_value *) XtMalloc (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));
-
-  widget =
-    XtVaCreateWidget (instance->info->name, xlwMenuWidgetClass,
-                     instance->parent,
-                     XtNmenu, instance->info->val,
-                     0);
-
-  XtFree (tem);
+  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
+
+  /* This used to use XtVaCreateWidget, but an old Xt version
+     has a bug in XtVaCreateWidget that frees instance->info->name.  */
+  widget
+    = XtCreateWidget (instance->info->name, xlwMenuWidgetClass,
+                     instance->parent, al, ac);
 
   XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance);
   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
 
   XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance);
   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
+  XtAddCallback (widget, XtNleaveCallback, leave_hook, (XtPointer)instance);
+  XtAddCallback (widget, XtNenterCallback, enter_hook, (XtPointer)instance);
   return widget;
 }
 
   return widget;
 }
 
@@ -100,33 +180,31 @@ static Widget
 xlw_create_popup_menu (instance)
      widget_instance* instance;
 {
 xlw_create_popup_menu (instance)
      widget_instance* instance;
 {
-  Widget popup_shell =
-    XtCreatePopupShell (instance->info->name, overrideShellWidgetClass,
-                       instance->parent, NULL, 0);
-  
-  Widget widget;
-
-  widget_value *tem = (widget_value *) XtMalloc (sizeof (widget_value));
+  Widget popup_shell
+    = XtCreatePopupShell (instance->info->name, overrideShellWidgetClass,
+                         instance->parent, NULL, 0);
 
 
-  /* _XtCreate is freeing the object we passed,
-     so make a copy that we free later.  */
-  bcopy (instance->info->val, tem, sizeof (widget_value));
+  Widget widget;
+  Arg al[2];
+  int ac = 0;
 
 
-  widget = 
-    XtVaCreateManagedWidget ("popup", xlwMenuWidgetClass,
-                            popup_shell,
-                            XtNmenu, instance->info->val,
-                            XtNhorizontal, False,
-                            0);
+  XtSetArg (al[ac], XtNmenu, instance->info->val); ac++;
+  XtSetArg (al[ac], XtNhorizontal, False); ac++;
 
 
-  XtFree (tem);
+  /* This used to use XtVaManagedCreateWidget, but an old Xt version
+     has a bug in XtVaManagedCreateWidget that frees instance->info->name.  */
+  widget
+    = XtCreateManagedWidget ("popup", xlwMenuWidgetClass,
+                            popup_shell, al, ac);
 
   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
 
   XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
+  XtAddCallback (widget, XtNleaveCallback, leave_hook, (XtPointer)instance);
+  XtAddCallback (widget, XtNenterCallback, enter_hook, (XtPointer)instance);
 
   return popup_shell;
 }
 
 
   return popup_shell;
 }
 
-widget_creation_entry 
+widget_creation_entry
 xlw_creation_table [] =
 {
   {"menubar", xlw_create_menubar},
 xlw_creation_table [] =
 {
   {"menubar", xlw_create_menubar},
@@ -139,29 +217,34 @@ lw_lucid_widget_p (widget)
      Widget widget;
 {
   WidgetClass the_class = XtClass (widget);
      Widget widget;
 {
   WidgetClass the_class = XtClass (widget);
+
   if (the_class == xlwMenuWidgetClass)
     return True;
   if (the_class == overrideShellWidgetClass)
   if (the_class == xlwMenuWidgetClass)
     return True;
   if (the_class == overrideShellWidgetClass)
-    return
-      XtClass (((CompositeWidget)widget)->composite.children [0])
-       == xlwMenuWidgetClass;
+    return (XtClass (((CompositeWidget)widget)->composite.children [0])
+           == xlwMenuWidgetClass);
   return False;
 }
 
 void
   return False;
 }
 
 void
+#ifdef PROTOTYPES
+xlw_update_one_widget (widget_instance* instance, Widget widget,
+                      widget_value* val, Boolean deep_p)
+#else
 xlw_update_one_widget (instance, widget, val, deep_p)
      widget_instance* instance;
      Widget widget;
      widget_value* val;
      Boolean deep_p;
 xlw_update_one_widget (instance, widget, val, deep_p)
      widget_instance* instance;
      Widget widget;
      widget_value* val;
      Boolean deep_p;
+#endif
 {
 {
-  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
 }
 
 void
@@ -174,17 +257,21 @@ xlw_update_one_value (instance, widget, val)
 }
 
 void
 }
 
 void
+#ifdef PROTOTYPES
+xlw_pop_instance (widget_instance* instance, Boolean up)
+#else
 xlw_pop_instance (instance, up)
      widget_instance* instance;
      Boolean up;
 xlw_pop_instance (instance, up)
      widget_instance* instance;
      Boolean up;
+#endif
 {
 }
 
 void
 {
 }
 
 void
-xlw_popup_menu (widget)
+xlw_popup_menu (widget, event)
      Widget widget;
      Widget widget;
+     XEvent *event;
 {
 {
-  XButtonPressedEvent dummy;
   XlwMenuWidget mw;
 
   if (!XtIsShell (widget))
   XlwMenuWidget mw;
 
   if (!XtIsShell (widget))
@@ -192,18 +279,26 @@ xlw_popup_menu (widget)
 
   mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0];
 
 
   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)
+    XtCallActionProc ((Widget) mw, "start", event, NULL, 0);
+  else
+    {
+      XEvent dummy;
+      XButtonPressedEvent *bd = &dummy.xbutton;
+
+      bd->type = ButtonPress;
+      bd->serial = 0;
+      bd->send_event = 0;
+      bd->display = XtDisplay (widget);
+      bd->window = XtWindow (XtParent (widget));
+      bd->time = CurrentTime;
+      bd->button = 0;
+      XQueryPointer (bd->display, bd->window, &bd->root,
+                    &bd->subwindow, &bd->x_root, &bd->y_root,
+                    &bd->x, &bd->y, &bd->state);
+
+      XtCallActionProc ((Widget) mw, "start", &dummy, NULL, 0);
+    }
 }
 
 \f/* Destruction of instances */
 }
 
 \f/* Destruction of instances */
@@ -215,3 +310,5 @@ xlw_destroy_instance (instance)
     XtDestroyWidget (instance->widget);
 }
 
     XtDestroyWidget (instance->widget);
 }
 
+/* arch-tag: 541e3912-477d-406e-9bf2-dbf2b7ff8c3b
+   (do not change this comment) */