changeset 36936:bda3649d35fd

(x_set_menu_resources_from_menu_face) [USE_X_TOOLKIT]: Removed, together with subroutines. (x_set_menu_face_resources) [USE_X_TOOLKIT]: New function. (realize_basic_faces) [USE_X_TOOLKIT]: Call x_set_menu_face_resources.
author Gerd Moellmann <gerd@gnu.org>
date Thu, 22 Mar 2001 18:33:28 +0000
parents 1ac3e0f3e75a
children af1f50d06d19
files src/xfaces.c
diffstat 1 files changed, 73 insertions(+), 208 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfaces.c	Thu Mar 22 15:16:31 2001 +0000
+++ b/src/xfaces.c	Thu Mar 22 18:33:28 2001 +0000
@@ -4348,209 +4348,80 @@
 
 #ifdef USE_X_TOOLKIT
 
-#include "../lwlib/lwlib-utils.h"
-
-/* Structure used to pass X resources to functions called via
-   XtApplyToWidgets.  */
-
-struct x_resources
-{
-  Arg *av;
-  int ac;
-};
-
-
-#ifdef USE_MOTIF
-
-static void xm_apply_resources P_ ((Widget, XtPointer));
-static void xm_set_menu_resources_from_menu_face P_ ((struct frame *, Widget));
-
-
-/* Set widget W's X resources from P which points to an x_resources
-   structure.  If W is a cascade button, apply resources to W's
-   submenu.  */
-
-static void
-xm_apply_resources (w, p)
-     Widget w;
-     XtPointer p;
-{
-  Widget submenu = 0;
-  struct x_resources *res = (struct x_resources *) p;
-
-  XtSetValues (w, res->av, res->ac);
-  XtVaGetValues (w, XmNsubMenuId, &submenu, NULL);
-  if (submenu)
-    {
-      XtSetValues (submenu, res->av, res->ac);
-      XtApplyToWidgets (submenu, xm_apply_resources, p);
-    }
-}
-
-
-/* Set X resources of menu-widget WIDGET on frame F from face `menu'.
-   This is the LessTif/Motif version.
-
-   As of 2001-03-13, setting the XmNfontList resource with LessTif
-   leads to an infinite loop somewhere in LessTif.  */
-
-static void
-xm_set_menu_resources_from_menu_face (f, widget)
+void
+x_set_menu_face_resources (f)
      struct frame *f;
-     Widget widget;
-{
-  struct face *face;
-  Lisp_Object lface;
-  Arg av[3];
-  int ac = 0;
-  XmFontList fl = 0;
-
-  lface = lface_from_face_name (f, Qmenu, 1);
-  face = FACE_FROM_ID (f, MENU_FACE_ID);
-
-  if (!UNSPECIFIEDP (LFACE_FOREGROUND (lface)))
-    {
-      XtSetArg (av[ac], XmNforeground, face->foreground);
-      ++ac;
-    }
-
-  if (!UNSPECIFIEDP (LFACE_BACKGROUND (lface)))
-    {
-      XtSetArg (av[ac], XmNbackground, face->background);
-      ++ac;
-    }
-
-  /* If any font-related attribute of `menu' is set, set the font.  */
-  if (face->font
-      && (!UNSPECIFIEDP (LFACE_FAMILY (lface))
-	  || !UNSPECIFIEDP (LFACE_SWIDTH (lface))
-	  || !UNSPECIFIEDP (LFACE_AVGWIDTH (lface))
-	  || !UNSPECIFIEDP (LFACE_WEIGHT (lface))
-	  || !UNSPECIFIEDP (LFACE_SLANT (lface))
-	  || !UNSPECIFIEDP (LFACE_HEIGHT (lface))))
-    {
-      XmFontListEntry fe;
-      fe = XmFontListEntryCreate ("menu_font", XmFONT_IS_FONT, face->font);
-      fl = XmFontListAppendEntry (NULL, fe);
-      XtSetArg (av[ac], XmNfontList, fl);
-      ++ac;
-    }
-
-  xassert (ac <= sizeof av / sizeof *av);
-
-  if (ac)
-    {
-      struct x_resources res;
-
-      XtSetValues (widget, av, ac);
-      res.av = av, res.ac = ac;
-      XtApplyToWidgets (widget, xm_apply_resources, &res);
+{
+  struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
+
+  if (dpyinfo)
+    {
+      Display *dpy = FRAME_X_DISPLAY (f);
+      XrmDatabase rdb = XrmGetDatabase (dpy);
+      extern Lisp_Object Vx_resource_name;
+
+      if (rdb)
+	{
+	  char line[512];
+	  Lisp_Object lface = lface_from_face_name (f, Qmenu, 1);
+	  struct face *face = FACE_FROM_ID (f, MENU_FACE_ID);
+	  char *myname = XSTRING (Vx_resource_name)->data;
+	  int changes = 0;
       
-      if (fl)
-	XmFontListFree (fl);
-    }
-}
-
-#endif /* USE_MOTIF */
-
-#ifdef USE_LUCID
-
-static void xl_apply_resources P_ ((Widget, XtPointer));
-static void xl_set_menu_resources_from_menu_face P_ ((struct frame *, Widget));
-
-
-/* Set widget W's resources from P which points to an x_resources
-   structure.  */
-
-static void
-xl_apply_resources (widget, p)
-     Widget widget;
-     XtPointer p;
-{
-  struct x_resources *res = (struct x_resources *) p;
-  XtSetValues (widget, res->av, res->ac);
-}
-
-
-/* On frame F, set X resources of menu-widget WIDGET from face `menu'.
-   This is the Lucid version.  */
-
-static void
-xl_set_menu_resources_from_menu_face (f, widget)
-     struct frame *f;
-     Widget widget;
-{
-  struct face *face;
-  Lisp_Object lface;
-  Arg av[3];
-  int ac = 0;
-
-  lface = lface_from_face_name (f, Qmenu, 1);
-  face = FACE_FROM_ID (f, MENU_FACE_ID);
-
-  if (!UNSPECIFIEDP (LFACE_FOREGROUND (lface)))
-    {
-      XtSetArg (av[ac], XtNforeground, face->foreground);
-      ++ac;
-    }
-
-  if (!UNSPECIFIEDP (LFACE_BACKGROUND (lface)))
-    {
-      XtSetArg (av[ac], XtNbackground, face->background);
-      ++ac;
-    }
-
-  if (face->font
-      && (!UNSPECIFIEDP (LFACE_FAMILY (lface))
-	  || !UNSPECIFIEDP (LFACE_SWIDTH (lface))
-	  || !UNSPECIFIEDP (LFACE_AVGWIDTH (lface))
-	  || !UNSPECIFIEDP (LFACE_WEIGHT (lface))
-	  || !UNSPECIFIEDP (LFACE_SLANT (lface))
-	  || !UNSPECIFIEDP (LFACE_HEIGHT (lface))))
-    {
-      XtSetArg (av[ac], XtNfont, face->font);
-      ++ac;
-    }
-
-  if (ac)
-    {
-      struct x_resources res;
-
-      XtSetValues (widget, av, ac);
-
-      /* We must do children here in case we're handling a pop-up menu
-	 in which case WIDGET is a popup shell.  XtApplyToWidgets
-	 is a function from lwlib.  */
-      res.av = av, res.ac = ac;
-      XtApplyToWidgets (widget, xl_apply_resources, &res);
-    }
-}
-
-#endif /* USE_LUCID */
-
-
-/* On frame F, set X resources of menu-widget WIDGET from face `menu'.  */
-
-void
-x_set_menu_resources_from_menu_face (f, widget)
-     struct frame *f;
-     Widget widget;
-{
-  /* Realized faces may have been removed on frame F, e.g. because of
-     face attribute changes.  Recompute them, if necessary, since we
-     will need the `menu' face.  */
-  if (f->face_cache->used == 0)
-    recompute_basic_faces (f);
-
-  BLOCK_INPUT;
-#ifdef USE_LUCID
-  xl_set_menu_resources_from_menu_face (f, widget);
-#endif
+	  if (STRINGP (LFACE_FOREGROUND (lface)))
+	    {
+	      sprintf (line, "%s.menu*foreground: %s",
+		       myname, XSTRING (LFACE_FOREGROUND (lface))->data);
+	      XrmPutLineResource (&rdb, line);
+	      sprintf (line, "%s.pane.menubar*foreground: %s",
+		       myname, XSTRING (LFACE_FOREGROUND (lface))->data);
+	      XrmPutLineResource (&rdb, line);
+	      ++changes;
+	    }
+
+	  if (STRINGP (LFACE_BACKGROUND (lface)))
+	    {
+	      sprintf (line, "%s*menu*background: %s",
+		       myname, XSTRING (LFACE_BACKGROUND (lface))->data);
+	      XrmPutLineResource (&rdb, line);
+	      sprintf (line, "%s.pane.menubar*background: %s",
+		       myname, XSTRING (LFACE_BACKGROUND (lface))->data);
+	      XrmPutLineResource (&rdb, line);
+	      ++changes;
+	    }
+	  
+	  if (face->font_name
+	      && (!UNSPECIFIEDP (LFACE_FAMILY (lface))
+		  || !UNSPECIFIEDP (LFACE_SWIDTH (lface))
+		  || !UNSPECIFIEDP (LFACE_AVGWIDTH (lface))
+		  || !UNSPECIFIEDP (LFACE_WEIGHT (lface))
+		  || !UNSPECIFIEDP (LFACE_SLANT (lface))
+		  || !UNSPECIFIEDP (LFACE_HEIGHT (lface))))
+	    {
 #ifdef USE_MOTIF
-  xm_set_menu_resources_from_menu_face (f, widget);
-#endif
-  UNBLOCK_INPUT;
-}
+	      char *format1 = "%s.pane.menubar*fontList: %s";
+	      char *format2 = "%s*menu*fontList: %s";
+#else
+	      char *format1 = "%s.pane.menubar*font: %s";
+	      char *format2 = "%s*menu*font: %s";
+#endif	      
+	      sprintf (line, format1, myname, face->font_name);
+	      XrmPutLineResource (&rdb, line);
+	      sprintf (line, format2, myname, face->font_name);
+	      XrmPutLineResource (&rdb, line);
+	      ++changes;
+	    }
+
+	  if (changes && f->output_data.x->menubar_widget)
+	    {
+	      free_frame_menubar (f);
+	      set_frame_menubar (f, 1, 1);
+	      XWINDOW (FRAME_SELECTED_WINDOW (f))->update_mode_line = Qt;
+	    }
+	}
+    }
+}
+
 
 #endif /* USE_X_TOOLKIT */
 
@@ -6100,15 +5971,9 @@
       if (menu_face_change_count)
 	{
 	  menu_face_change_count = 0;
-	  
 #ifdef USE_X_TOOLKIT
-	  if (FRAME_X_P (f))
-	    {
-	      Widget menu = f->output_data.x->menubar_widget;
-	      if (menu)
-		x_set_menu_resources_from_menu_face (f, menu);
-	    }
-#endif /* USE_X_TOOLKIT */
+	  x_set_menu_face_resources (f);
+#endif
 	}
       
       success_p = 1;