]> code.delx.au - gnu-emacs/blobdiff - lwlib/lwlib-Xm.c
(x_print_complete_resource_name) [0]: New function.
[gnu-emacs] / lwlib / lwlib-Xm.c
index 16c8a947a4a9a81fa4088c6ef1147245362679c2..766d3554e24a90e150d9568fa935b2721b1853bc 100644 (file)
@@ -125,7 +125,6 @@ static void xm_generic_callback P_ ((Widget, XtPointer, XtPointer));
 static void xm_nosel_callback P_ ((Widget, XtPointer, XtPointer));
 static void xm_pull_down_callback P_ ((Widget, XtPointer, XtPointer));
 static void xm_pop_down_callback P_ ((Widget, XtPointer, XtPointer));
-static void xm_unmap_callback P_ ((Widget, XtPointer, XtPointer));
 void xm_set_keyboard_focus P_ ((Widget, Widget));
 void xm_set_main_areas P_ ((Widget, Widget, Widget));
 static void xm_internal_update_other_instances P_ ((Widget, XtPointer,
@@ -140,6 +139,32 @@ void xm_manage_resizing P_ ((Widget, Boolean));
 #endif
 
 
+#if 0
+
+/* 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 */
+
+
 static destroyed_instance *all_destroyed_instances = NULL;
 
 static destroyed_instance*
@@ -266,7 +291,7 @@ xm_arm_callback (w, client_data, call_data)
   widget_instance *instance;
 
   /* Get the id of the menu bar or popup menu this widget is in.  */
-  while (w != None)
+  while (w != NULL)
     {
       if (XmIsRowColumn (w))
        {
@@ -280,7 +305,7 @@ xm_arm_callback (w, client_data, call_data)
       w = XtParent (w);
     }
 
-  if (w != None)
+  if (w != NULL)
     {
       instance = lw_get_widget_instance (w);
       if (instance && instance->info->highlight_cb)
@@ -494,7 +519,8 @@ make_menu_in_widget (instance, widget, val, keep_first_children)
   old_children = XtCompositeChildren (widget, &old_num_children);
 
   /* Allocate the children array */
-  for (num_children = 0, cur = val; cur; num_children++, cur = cur->next);
+  for (num_children = 0, cur = val; cur; num_children++, cur = cur->next)
+    ;
   children = (Widget*)XtMalloc (num_children * sizeof (Widget));
 
   /* WIDGET should be a RowColumn.  */
@@ -509,18 +535,11 @@ make_menu_in_widget (instance, widget, val, keep_first_children)
     abort ();
   menubar_p = type == XmMENU_BAR;
 
-#if 0 /* This can't be used in LessTif as of 2000-01-24 because it's
-        impossible to decide from this plus the cascading callback if a
-        popup is still posted or not.  When selecting cascade button A,
-        then B, then clicking on the frame, the sequence of callbacks is
-        `cascading A', cascading B', `popdown for all cascade buttons in
-        the menu bar.  */
   /* Add a callback to popups and pulldowns that is called when
      it is made invisible again.  */
   if (!menubar_p)
     XtAddCallback (XtParent (widget), XmNpopdownCallback,
                   xm_pop_down_callback, (XtPointer)instance);
-#endif
 
   /* Preserve the first KEEP_FIRST_CHILDREN old children.  */
   for (child_index = 0, cur = val; child_index < keep_first_children;
@@ -597,12 +616,6 @@ make_menu_in_widget (instance, widget, val, keep_first_children)
        {
          menu = XmCreatePulldownMenu (widget, cur->name, NULL, 0);
 
-         /* XmNpopdownCallback is working strangely under LessTif.
-            Using XmNunmapCallback is the only way to go there.  */
-         if (menubar_p)
-           XtAddCallback (menu, XmNunmapCallback, xm_unmap_callback,
-                          (XtPointer) instance);
-         
          make_menu_in_widget (instance, menu, cur->contents, 0);
           XtSetArg (al[ac], XmNsubMenuId, menu); ac++;
          button = XmCreateCascadeButton (widget, cur->name, al, ac);
@@ -624,12 +637,6 @@ make_menu_in_widget (instance, widget, val, keep_first_children)
   if (button)
     XtVaSetValues (widget, XmNmenuHelpWidget, button, NULL);
 
-  /* LessTif apparently doesn't recompute centered text when more
-     widgets are added.  So, do it after all widgets have been
-     created.  */
-  if (title)
-    XtVaSetValues (title, XmNalignment, XmALIGNMENT_CENTER, NULL);
-
   if (num_children)
     XtManageChildren (children, num_children);
 
@@ -1490,15 +1497,6 @@ make_menubar (instance)
 
   ac = 0;
   XtSetArg(al[ac], XmNmenuAccelerator, 0); ++ac;
-
-#if 0
-  /* As of 2000-01-17, the LessTif menu bar resizes to height 0 when
-     all its children are removed, causing an annoying flickering
-     behavior.  Prevent that by not allowing resizing.  */
-  XtSetArg(al[ac], XmNresizeHeight, False); ++ac;
-  XtSetArg(al[ac], XmNresizeWidth, False); ++ac;
-#endif
-  
   return XmCreateMenuBar (instance->parent, instance->info->name, al, ac);
 }
 
@@ -1728,19 +1726,29 @@ xm_popup_menu (widget, event)
 
   if (event->type == ButtonPress || event->type == ButtonRelease)
     {
-      /* This is so totally ridiculous: there's NO WAY to tell Motif
-        that *any* button can select a menu item.  Only one button
-        can have that honor.
-       */
-      char *trans = 0;
-      if      (event->xbutton.state & Button5Mask) trans = "<Btn5Down>";
-      else if (event->xbutton.state & Button4Mask) trans = "<Btn4Down>";
-      else if (event->xbutton.state & Button3Mask) trans = "<Btn3Down>";
-      else if (event->xbutton.state & Button2Mask) trans = "<Btn2Down>";
-      else if (event->xbutton.state & Button1Mask) trans = "<Btn1Down>";
-      if (trans) XtVaSetValues (widget, XmNmenuPost, trans, NULL);
+      /* Setting the menuPost resource only required by Motif 1.1 and
+        LessTif 0.84 and earlier.  With later versions of LessTif,
+        setting menuPost is unnecessary and may cause problems, so
+        don't do it.  */
+#if XmVersion < 1002 || (defined LESSTIF_VERSION && LESSTIF_VERSION < 84)
+       {
+         /* This is so totally ridiculous: there's NO WAY to tell Motif
+            that *any* button can select a menu item.  Only one button
+            can have that honor.  */
+      
+         char *trans = 0;
+         if      (event->xbutton.state & Button5Mask) trans = "<Btn5Down>";
+         else if (event->xbutton.state & Button4Mask) trans = "<Btn4Down>";
+         else if (event->xbutton.state & Button3Mask) trans = "<Btn3Down>";
+         else if (event->xbutton.state & Button2Mask) trans = "<Btn2Down>";
+         else if (event->xbutton.state & Button1Mask) trans = "<Btn1Down>";
+         if (trans) XtVaSetValues (widget, XmNmenuPost, trans, NULL);
+       }
+#endif
+      
       XmMenuPosition (widget, (XButtonPressedEvent *) event);
     }
+  
   XtManageChild (widget);
 }
 
@@ -1812,24 +1820,29 @@ do_call (widget, closure, type)
   user_data = NULL;
   XtSetArg (al [ac], XmNuserData, &user_data); ac++;
   XtGetValues (widget, al, ac);
+  
   switch (type)
     {
     case pre_activate:
       if (instance->info->pre_activate_cb)
        instance->info->pre_activate_cb (widget, id, user_data);
       break;
+      
     case selection:
       if (instance->info->selection_cb)
        instance->info->selection_cb (widget, id, user_data);
       break;
+      
     case no_selection:
       if (instance->info->selection_cb)
        instance->info->selection_cb (widget, id, (XtPointer) -1);
       break;
+      
     case post_activate:
       if (instance->info->post_activate_cb)
        instance->info->post_activate_cb (widget, id, user_data);
       break;
+      
     default:
       abort ();
     }
@@ -1871,14 +1884,14 @@ xm_nosel_callback (widget, closure, call_data)
      XtPointer closure;
      XtPointer call_data;
 {
-  /* This callback is only called when a dialog box is dismissed with the wm's
-     destroy button (WM_DELETE_WINDOW.)  We want the dialog box to be destroyed
-     in that case, not just unmapped, so that it releases its keyboard grabs.
-     But there are problems with running our callbacks while the widget is in
-     the process of being destroyed, so we set XmNdeleteResponse to XmUNMAP
-     instead of XmDESTROY and then destroy it ourself after having run the
-     callback.
-   */
+  /* This callback is only called when a dialog box is dismissed with
+     the wm's destroy button (WM_DELETE_WINDOW.)  We want the dialog
+     box to be destroyed in that case, not just unmapped, so that it
+     releases its keyboard grabs.  But there are problems with running
+     our callbacks while the widget is in the process of being
+     destroyed, so we set XmNdeleteResponse to XmUNMAP instead of
+     XmDESTROY and then destroy it ourself after having run the
+     callback.  */
   do_call (widget, closure, no_selection);
   XtDestroyWidget (widget);
 }
@@ -1902,11 +1915,10 @@ xm_pull_down_callback (widget, closure, call_data)
 
 
 /* XmNpopdownCallback for MenuShell widgets.  WIDGET is the MenuShell,
-   CLOSURE is a pointer to the widget_instance of the shell, CALL_DATA
-   is always null under LessTif.
+   CLOSURE is a pointer to the widget_instance of the shell, 
 
-   2000-01-23: This callback is called for each cascade button in 
-   menu, whether or not its submenu is visible.  */
+   Note that this callback is called for each cascade button in a
+   menu, whether or not its submenu is visible.  */
 
 static void
 xm_pop_down_callback (widget, closure, call_data)
@@ -1916,19 +1928,8 @@ xm_pop_down_callback (widget, closure, call_data)
 {
   widget_instance *instance = (widget_instance *) closure;
 
-  if ((!instance->pop_up_p && (XtParent (widget) == instance->widget))
-      || (XtParent (widget) == instance->parent))
-    do_call (widget, closure, post_activate);
-}
-
-static void
-xm_unmap_callback (widget, closure, call_data)
-     Widget widget;
-     XtPointer closure;
-     XtPointer call_data;
-{
-  widget_instance *instance = (widget_instance *) closure;
-  if (!instance->pop_up_p)
+  if ((!instance->pop_up_p && XtParent (widget) == instance->widget)
+      || XtParent (widget) == instance->parent)
     do_call (widget, closure, post_activate);
 }