- /* Don't call `face-set-after-frame-default' when faces haven't been
- initialized yet. This is the case when called from
- Fx_create_frame. In that case, the X widget or window doesn't
- exist either, and we can end up in x_report_frame_params with a
- null widget which gives a segfault. */
- if (FRAME_FACE_CACHE (f))
+ /* We used to call face-set-after-frame-default here, but it leads to
+ recursive calls (since that function can set the `default' face's
+ font which in turns changes the frame's `font' parameter).
+ Also I don't know what this call is meant to do, but it seems the
+ wrong way to do it anyway (it does a lot more work than what seems
+ reasonable in response to a change to `font'). */
+}
+
+
+void
+x_set_font_backend (f, new_value, old_value)
+ struct frame *f;
+ Lisp_Object new_value, old_value;
+{
+ if (! NILP (new_value)
+ && !CONSP (new_value))
+ {
+ char *p0, *p1;
+
+ CHECK_STRING (new_value);
+ p0 = p1 = SDATA (new_value);
+ new_value = Qnil;
+ while (*p0)
+ {
+ while (*p1 && ! isspace (*p1) && *p1 != ',') p1++;
+ if (p0 < p1)
+ new_value = Fcons (Fintern (make_string (p0, p1 - p0), Qnil),
+ new_value);
+ if (*p1)
+ {
+ int c;
+
+ while ((c = *++p1) && isspace (c));
+ }
+ p0 = p1;
+ }
+ new_value = Fnreverse (new_value);
+ }
+
+ if (! NILP (old_value) && ! NILP (Fequal (old_value, new_value)))
+ return;
+
+ if (FRAME_FONT (f))
+ free_all_realized_faces (Qnil);
+
+ new_value = font_update_drivers (f, NILP (new_value) ? Qt : new_value);
+ if (NILP (new_value))
+ {
+ if (NILP (old_value))
+ error ("No font backend available");
+ font_update_drivers (f, old_value);
+ error ("None of specified font backends are available");
+ }
+ store_frame_param (f, Qfont_backend, new_value);
+
+ if (FRAME_FONT (f))