]> code.delx.au - gnu-emacs/blobdiff - src/xmenu.c
*** empty log message ***
[gnu-emacs] / src / xmenu.c
index de74d6b1645608c953a5dae689b7c70dc3457d3e..d6ee9056a55286bee183460dd79f40877e08140d 100644 (file)
@@ -44,7 +44,6 @@ Boston, MA 02111-1307, USA.  */
 #include "window.h"
 #include "blockinput.h"
 #include "buffer.h"
-#include "widget.h"
 
 #ifdef MSDOS
 #include "msdos.h"
@@ -67,6 +66,7 @@ Boston, MA 02111-1307, USA.  */
 #ifdef HAVE_X_WINDOWS
 #undef HAVE_MULTILINGUAL_MENU
 #ifdef USE_X_TOOLKIT
+#include "widget.h"
 #include <X11/Xlib.h>
 #include <X11/IntrinsicP.h>
 #include <X11/CoreP.h>
@@ -1441,11 +1441,16 @@ single_submenu (item_key, item_name, maps)
          /* Create a new pane.  */
          Lisp_Object pane_name, prefix;
          char *pane_string;
+         
          pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME];
          prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX];
+         
 #ifndef HAVE_MULTILINGUAL_MENU
          if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name))
-           pane_name = string_make_unibyte (pane_name);
+           {
+             pane_name = string_make_unibyte (pane_name);
+             AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name;
+           }
 #endif
          pane_string = (NILP (pane_name)
                         ? "" : (char *) XSTRING (pane_name)->data);
@@ -1483,21 +1488,27 @@ single_submenu (item_key, item_name, maps)
          Lisp_Object item_name, enable, descrip, def, type, selected;
          Lisp_Object help;
          
-         item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME];
-         enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE];
-         descrip
-           = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY];
-         def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION];
-         type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE];
-         selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED];
-         help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP];
+         item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME);
+         enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE);
+         descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY);
+         def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION);
+         type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE);
+         selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED);
+         help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP);
 
 #ifndef HAVE_MULTILINGUAL_MENU
           if (STRING_MULTIBYTE (item_name))
-            item_name = string_make_unibyte (item_name);
+           {
+             item_name = string_make_unibyte (item_name);
+             AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name;
+           }
+         
           if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
-            descrip = string_make_unibyte (descrip);
-#endif
+           {
+             descrip = string_make_unibyte (descrip);
+             AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
+           }
+#endif /* not HAVE_MULTILINGUAL_MENU */
 
          wv = xmalloc_widget_value ();
          if (prev_wv) 
@@ -1583,7 +1594,6 @@ update_frame_menubar (f)
 
   /* Re-manage the text-area widget, and then thrash the sizes.  */
   XtManageChild (x->edit_widget);
-  x_set_menu_resources_from_menu_face (f, x->menubar_widget);
   lw_refigure_widget (x->column_widget, True);
 
   /* Force the pane widget to resize itself with the right values.  */
@@ -1835,8 +1845,7 @@ set_frame_menubar (f, first_time, deep_p)
   }
   
   free_menubar_widget_value_tree (first_wv);
-  if (!update_frame_menubar (f))
-    x_set_menu_resources_from_menu_face (f, menubar_widget);
+  update_frame_menubar (f);
 
   UNBLOCK_INPUT;
 }
@@ -1856,6 +1865,7 @@ initialize_frame_menubar (f)
   set_frame_menubar (f, 1, 1);
 }
 
+
 /* Get rid of the menu bar of frame F, and free its storage.
    This is used when deleting a frame, and when turning off the menu bar.  */
 
@@ -1871,9 +1881,37 @@ free_frame_menubar (f)
   
   if (menubar_widget)
     {
+#ifdef USE_MOTIF
+      /* Removing the menu bar magically changes the shell widget's x
+        and y position of (0, 0) which, when the menu bar is turned
+        on again, leads to pull-down menuss appearing in strange
+        positions near the upper-left corner of the display.  This
+        happens only with some window managers like twm and ctwm,
+        but not with other like Motif's mwm or kwm, because the
+        latter generate ConfigureNotify events when the menu bar
+        is switched off, which fixes the shell position.  */
+      Position x0, y0, x1, y1;
+#endif
+      
       BLOCK_INPUT;
+
+#ifdef USE_MOTIF
+      if (f->output_data.x->widget)
+       XtVaGetValues (f->output_data.x->widget, XtNx, &x0, XtNy, &y0, NULL);
+#endif
+      
       lw_destroy_all_widgets ((LWLIB_ID) f->output_data.x->id);
       f->output_data.x->menubar_widget = NULL;
+
+#ifdef USE_MOTIF
+      if (f->output_data.x->widget)
+       {
+         XtVaGetValues (f->output_data.x->widget, XtNx, &x1, XtNy, &y1, NULL);
+         if (x1 == 0 && y1 == 0)
+           XtVaSetValues (f->output_data.x->widget, XtNx, x0, XtNy, y0, NULL);
+       }
+#endif
+      
       UNBLOCK_INPUT;
     }
 }
@@ -1993,11 +2031,16 @@ xmenu_show (f, x, y, for_click, keymaps, title, error)
          /* Create a new pane.  */
          Lisp_Object pane_name, prefix;
          char *pane_string;
-         pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME];
-         prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX];
+         
+         pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME);
+         prefix = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX);
+         
 #ifndef HAVE_MULTILINGUAL_MENU
-         if (!NILP (pane_name) && STRING_MULTIBYTE (pane_name))
-           pane_name = string_make_unibyte (pane_name);
+         if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name))
+           {
+             pane_name = string_make_unibyte (pane_name);
+             AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name;
+           }
 #endif
          pane_string = (NILP (pane_name)
                         ? "" : (char *) XSTRING (pane_name)->data);
@@ -2037,21 +2080,27 @@ xmenu_show (f, x, y, for_click, keymaps, title, error)
        {
          /* Create a new item within current pane.  */
          Lisp_Object item_name, enable, descrip, def, type, selected, help;
-         item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME];
-         enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE];
-         descrip
-           = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY];
-         def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION];
-         type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE];
-         selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED];
-         help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP];
+         item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME);
+         enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE);
+         descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY);
+         def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION);
+         type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE);
+         selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED);
+         help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP);
 
 #ifndef HAVE_MULTILINGUAL_MENU
           if (STRINGP (item_name) && STRING_MULTIBYTE (item_name))
-            item_name = string_make_unibyte (item_name);
+           {
+             item_name = string_make_unibyte (item_name);
+             AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name;
+           }
+         
           if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
-            item_name = string_make_unibyte (descrip);
-#endif
+           {
+             descrip = string_make_unibyte (descrip);
+             AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
+           }
+#endif /* not HAVE_MULTILINGUAL_MENU */
  
          wv = xmalloc_widget_value ();
          if (prev_wv) 
@@ -2105,6 +2154,7 @@ xmenu_show (f, x, y, for_click, keymaps, title, error)
       if (STRING_MULTIBYTE (title))
        title = string_make_unibyte (title);
 #endif
+      
       wv_title->name = (char *) XSTRING (title)->data;
       wv_title->enabled = True;
       wv_title->button_type = BUTTON_TYPE_NONE;
@@ -2176,9 +2226,6 @@ xmenu_show (f, x, y, for_click, keymaps, title, error)
   /* Free the widget_value objects we used to specify the contents.  */
   free_menubar_widget_value_tree (first_wv);
 
-  /* Override any default settings with ones from the `menu' face.  */
-  x_set_menu_resources_from_menu_face (f, menu);
-
   /* No selection has been chosen yet.  */
   menu_item_selection = 0;
 
@@ -2686,10 +2733,8 @@ xmenu_show (f, x, y, for_click, keymaps, title, error)
 
   /* All set and ready to fly.  */
   XMenuRecompute (FRAME_X_DISPLAY (f), menu);
-  dispwidth = DisplayWidth (FRAME_X_DISPLAY (f),
-                           XScreenNumberOfScreen (FRAME_X_SCREEN (f)));
-  dispheight = DisplayHeight (FRAME_X_DISPLAY (f),
-                             XScreenNumberOfScreen (FRAME_X_SCREEN (f)));
+  dispwidth = DisplayWidth (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f));
+  dispheight = DisplayHeight (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f));
   x = min (x, dispwidth);
   y = min (y, dispheight);
   x = max (x, 1);