comparison src/faces.c @ 173:8eaf7971accc r20-3b13

Import from CVS: tag r20-3b13
author cvs
date Mon, 13 Aug 2007 09:49:09 +0200
parents cca96a509cfe
children bfd6434d15b3
comparison
equal deleted inserted replaced
172:a38aed19690b 173:8eaf7971accc
113 ((markobj) (face->blinking)); 113 ((markobj) (face->blinking));
114 ((markobj) (face->reverse)); 114 ((markobj) (face->reverse));
115 115
116 ((markobj) (face->charsets_warned_about)); 116 ((markobj) (face->charsets_warned_about));
117 117
118 return (face->plist); 118 return face->plist;
119 } 119 }
120 120
121 static void 121 static void
122 print_face (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) 122 print_face (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
123 { 123 {
337 337
338 static int 338 static int
339 face_validate (Lisp_Object data, Error_behavior errb) 339 face_validate (Lisp_Object data, Error_behavior errb)
340 { 340 {
341 int name_seen = 0; 341 int name_seen = 0;
342 Lisp_Object valw; 342 Lisp_Object valw = Qnil;
343 343
344 data = Fcdr (data); /* skip over Qface */ 344 data = Fcdr (data); /* skip over Qface */
345 while (!NILP (data)) 345 while (!NILP (data))
346 { 346 {
347 Lisp_Object keyw = Fcar (data); 347 Lisp_Object keyw = Fcar (data);
526 values = XCDR (XCAR (elt)); 526 values = XCDR (XCAR (elt));
527 527
528 for (; !NILP (values); values = XCDR (values)) 528 for (; !NILP (values); values = XCDR (values))
529 { 529 {
530 Lisp_Object value = XCDR (XCAR (values)); 530 Lisp_Object value = XCDR (XCAR (values));
531 if (VECTORP (value) && XVECTOR (value)->size) 531 if (VECTORP (value) && XVECTOR_LENGTH (value))
532 { 532 {
533 if (EQ (Ffind_face (vector_data (XVECTOR (value))[0]), inh_face)) 533 if (EQ (Ffind_face (XVECTOR_DATA (value)[0]), inh_face))
534 Fset_specifier_dirty_flag 534 Fset_specifier_dirty_flag
535 (FACE_PROPERTY_SPECIFIER (inh_face, property)); 535 (FACE_PROPERTY_SPECIFIER (inh_face, property));
536 } 536 }
537 } 537 }
538 } 538 }
639 DEFUN ("facep", Ffacep, 1, 1, 0, /* 639 DEFUN ("facep", Ffacep, 1, 1, 0, /*
640 Return non-nil if OBJECT is a face. 640 Return non-nil if OBJECT is a face.
641 */ 641 */
642 (object)) 642 (object))
643 { 643 {
644 return (FACEP (object) ? Qt : Qnil); 644 return FACEP (object) ? Qt : Qnil;
645 } 645 }
646 646
647 DEFUN ("find-face", Ffind_face, 1, 1, 0, /* 647 DEFUN ("find-face", Ffind_face, 1, 1, 0, /*
648 Retrieve the face of the given name. 648 Retrieve the face of the given name.
649 If FACE-OR-NAME is a face object, it is simply returned. 649 If FACE-OR-NAME is a face object, it is simply returned.
684 DEFUN ("face-name", Fface_name, 1, 1, 0, /* 684 DEFUN ("face-name", Fface_name, 1, 1, 0, /*
685 Return the name of the given face. 685 Return the name of the given face.
686 */ 686 */
687 (face)) 687 (face))
688 { 688 {
689 return (XFACE (Fget_face (face))->name); 689 return XFACE (Fget_face (face))->name;
690 } 690 }
691 691
692 DEFUN ("built-in-face-specifiers", Fbuilt_in_face_specifiers, 0, 0, 0, /* 692 DEFUN ("built-in-face-specifiers", Fbuilt_in_face_specifiers, 0, 0, 0, /*
693 Return a list of all built-in face specifier properties. 693 Return a list of all built-in face specifier properties.
694 Don't modify this list! 694 Don't modify this list!
1074 new_val = Qunbound; 1074 new_val = Qunbound;
1075 cachel->font_specified[offs] = 0; 1075 cachel->font_specified[offs] = 0;
1076 for (i = 0; i < cachel->nfaces; i++) 1076 for (i = 0; i < cachel->nfaces; i++)
1077 { 1077 {
1078 struct face_cachel *oth; 1078 struct face_cachel *oth;
1079 1079
1080 oth = Dynarr_atp (w->face_cachels, 1080 oth = Dynarr_atp (w->face_cachels,
1081 FACE_CACHEL_FINDEX_UNSAFE (cachel, i)); 1081 FACE_CACHEL_FINDEX_UNSAFE (cachel, i));
1082 /* Tout le monde aime la recursion */ 1082 /* Tout le monde aime la recursion */
1083 ensure_face_cachel_contains_charset (oth, domain, charset); 1083 ensure_face_cachel_contains_charset (oth, domain, charset);
1084 1084
1085 if (oth->font_specified[offs]) 1085 if (oth->font_specified[offs])
1086 { 1086 {
1087 new_val = oth->font[offs]; 1087 new_val = oth->font[offs];
1088 cachel->font_specified[offs] = 1; 1088 cachel->font_specified[offs] = 1;
1089 break; 1089 break;
1133 void 1133 void
1134 ensure_face_cachel_complete (struct face_cachel *cachel, 1134 ensure_face_cachel_complete (struct face_cachel *cachel,
1135 Lisp_Object domain, unsigned char *charsets) 1135 Lisp_Object domain, unsigned char *charsets)
1136 { 1136 {
1137 int i; 1137 int i;
1138 1138
1139 for (i = 0; i < NUM_LEADING_BYTES; i++) 1139 for (i = 0; i < NUM_LEADING_BYTES; i++)
1140 if (charsets[i]) 1140 if (charsets[i])
1141 { 1141 {
1142 Lisp_Object charset; 1142 Lisp_Object charset;
1143 1143
1144 charset = CHARSET_BY_LEADING_BYTE (i + MIN_LEADING_BYTE); 1144 charset = CHARSET_BY_LEADING_BYTE (i + MIN_LEADING_BYTE);
1145 assert (CHARSETP (charset)); 1145 assert (CHARSETP (charset));
1146 ensure_face_cachel_contains_charset (cachel, domain, charset); 1146 ensure_face_cachel_contains_charset (cachel, domain, charset);
1147 } 1147 }
1148 } 1148 }
1151 face_cachel_charset_font_metric_info (struct face_cachel *cachel, 1151 face_cachel_charset_font_metric_info (struct face_cachel *cachel,
1152 unsigned char *charsets, 1152 unsigned char *charsets,
1153 struct font_metric_info *fm) 1153 struct font_metric_info *fm)
1154 { 1154 {
1155 int i; 1155 int i;
1156 1156
1157 fm->width = 1; 1157 fm->width = 1;
1158 fm->height = fm->ascent = 1; 1158 fm->height = fm->ascent = 1;
1159 fm->descent = 0; 1159 fm->descent = 0;
1160 fm->proportional_p = 0; 1160 fm->proportional_p = 0;
1161 1161
1164 if (charsets[i]) 1164 if (charsets[i])
1165 { 1165 {
1166 Lisp_Object charset; 1166 Lisp_Object charset;
1167 Lisp_Object font_instance; 1167 Lisp_Object font_instance;
1168 struct Lisp_Font_Instance *fi; 1168 struct Lisp_Font_Instance *fi;
1169 1169
1170 charset = CHARSET_BY_LEADING_BYTE (i + MIN_LEADING_BYTE); 1170 charset = CHARSET_BY_LEADING_BYTE (i + MIN_LEADING_BYTE);
1171 assert (CHARSETP (charset)); 1171 assert (CHARSETP (charset));
1172 font_instance = FACE_CACHEL_FONT (cachel, charset); 1172 font_instance = FACE_CACHEL_FONT (cachel, charset);
1173 assert (FONT_INSTANCEP (font_instance)); 1173 assert (FONT_INSTANCEP (font_instance));
1174 fi = XFONT_INSTANCE (font_instance); 1174 fi = XFONT_INSTANCE (font_instance);
1214 cachel->field = new_val; \ 1214 cachel->field = new_val; \
1215 cachel->dirty = 1; \ 1215 cachel->dirty = 1; \
1216 } \ 1216 } \
1217 cachel->field##_specified = (bound || default_face); \ 1217 cachel->field##_specified = (bound || default_face); \
1218 } while (0) 1218 } while (0)
1219 1219
1220 FROB (foreground); 1220 FROB (foreground);
1221 FROB (background); 1221 FROB (background);
1222 FROB (display_table); 1222 FROB (display_table);
1223 FROB (background_pixmap); 1223 FROB (background_pixmap);
1224 #undef FROB 1224 #undef FROB
1512 get_extent_fragment_face_cache_index (struct window *w, 1512 get_extent_fragment_face_cache_index (struct window *w,
1513 struct extent_fragment *ef) 1513 struct extent_fragment *ef)
1514 { 1514 {
1515 struct face_cachel cachel; 1515 struct face_cachel cachel;
1516 int len = Dynarr_length (ef->extents); 1516 int len = Dynarr_length (ef->extents);
1517 face_index findex; 1517 face_index findex = 0;
1518 Lisp_Object window = Qnil; 1518 Lisp_Object window = Qnil;
1519 XSETWINDOW (window, w); 1519 XSETWINDOW (window, w);
1520 1520
1521 /* Optimize the default case. */ 1521 /* Optimize the default case. */
1522 if (len == 0) 1522 if (len == 0)
1548 Lisp_Object one_face = XCAR (face); 1548 Lisp_Object one_face = XCAR (face);
1549 if (FACEP (one_face)) 1549 if (FACEP (one_face))
1550 { 1550 {
1551 findex = get_builtin_face_cache_index (w, one_face); 1551 findex = get_builtin_face_cache_index (w, one_face);
1552 merge_face_cachel_data (w, findex, &cachel); 1552 merge_face_cachel_data (w, findex, &cachel);
1553 1553
1554 /* code duplication here but there's no clean 1554 /* code duplication here but there's no clean
1555 way to avoid it. */ 1555 way to avoid it. */
1556 if (cachel.nfaces >= NUM_STATIC_CACHEL_FACES) 1556 if (cachel.nfaces >= NUM_STATIC_CACHEL_FACES)
1557 { 1557 {
1558 if (!cachel.merged_faces) 1558 if (!cachel.merged_faces)
1563 cachel.merged_faces_static[cachel.nfaces] = findex; 1563 cachel.merged_faces_static[cachel.nfaces] = findex;
1564 cachel.nfaces++; 1564 cachel.nfaces++;
1565 } 1565 }
1566 face = XCDR (face); 1566 face = XCDR (face);
1567 } 1567 }
1568 1568
1569 if (has_findex) 1569 if (has_findex)
1570 { 1570 {
1571 if (cachel.nfaces >= NUM_STATIC_CACHEL_FACES) 1571 if (cachel.nfaces >= NUM_STATIC_CACHEL_FACES)
1572 { 1572 {
1573 if (!cachel.merged_faces) 1573 if (!cachel.merged_faces)
1602 #ifdef HAVE_X_WINDOWS 1602 #ifdef HAVE_X_WINDOWS
1603 if (FRAME_X_P (frm)) 1603 if (FRAME_X_P (frm))
1604 { 1604 {
1605 Arg av[10]; 1605 Arg av[10];
1606 int ac = 0; 1606 int ac = 0;
1607 1607
1608 if (EQ (name, Qforeground)) 1608 if (EQ (name, Qforeground))
1609 { 1609 {
1610 Lisp_Object color = FACE_FOREGROUND (Vdefault_face, frame); 1610 Lisp_Object color = FACE_FOREGROUND (Vdefault_face, frame);
1611 XColor fgc; 1611 XColor fgc;
1612 1612
1686 update_EmacsFrame (XCAR (frmcons), name); 1686 update_EmacsFrame (XCAR (frmcons), name);
1687 } 1687 }
1688 else if (EQ (locale, Qglobal) || EQ (locale, Qfallback)) 1688 else if (EQ (locale, Qglobal) || EQ (locale, Qfallback))
1689 { 1689 {
1690 Lisp_Object frmcons, devcons, concons; 1690 Lisp_Object frmcons, devcons, concons;
1691 1691
1692 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons) 1692 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
1693 update_EmacsFrame (XCAR (frmcons), name); 1693 update_EmacsFrame (XCAR (frmcons), name);
1694 } 1694 }
1695 } 1695 }
1696 1696
1732 MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (locale)); 1732 MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (locale));
1733 } 1733 }
1734 else 1734 else
1735 { 1735 {
1736 Lisp_Object devcons, concons; 1736 Lisp_Object devcons, concons;
1737 1737
1738 DEVICE_LOOP_NO_BREAK (devcons, concons) 1738 DEVICE_LOOP_NO_BREAK (devcons, concons)
1739 MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (XCAR (devcons))); 1739 MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (XCAR (devcons)));
1740 } 1740 }
1741 1741
1742 update_faces_inheritance (face, property); 1742 update_faces_inheritance (face, property);
1743 XFACE (face)->dirty = 1; 1743 XFACE (face)->dirty = 1;
1744 } 1744 }
1745 1745
1746 DEFUN ("copy-face", Fcopy_face, 2, 6, 0, /* 1746 DEFUN ("copy-face", Fcopy_face, 2, 6, 0, /*
1973 inst_list = Fcons (Fcons (list1 (Qtty), build_string ("normal")), 1973 inst_list = Fcons (Fcons (list1 (Qtty), build_string ("normal")),
1974 inst_list); 1974 inst_list);
1975 #endif 1975 #endif
1976 set_specifier_fallback (Fget (Vdefault_face, Qfont, Qnil), inst_list); 1976 set_specifier_fallback (Fget (Vdefault_face, Qfont, Qnil), inst_list);
1977 } 1977 }
1978 1978
1979 set_specifier_fallback (Fget (Vdefault_face, Qunderline, Qnil), 1979 set_specifier_fallback (Fget (Vdefault_face, Qunderline, Qnil),
1980 list1 (Fcons (Qnil, Qnil))); 1980 list1 (Fcons (Qnil, Qnil)));
1981 set_specifier_fallback (Fget (Vdefault_face, Qstrikethru, Qnil), 1981 set_specifier_fallback (Fget (Vdefault_face, Qstrikethru, Qnil),
1982 list1 (Fcons (Qnil, Qnil))); 1982 list1 (Fcons (Qnil, Qnil)));
1983 set_specifier_fallback (Fget (Vdefault_face, Qhighlight, Qnil), 1983 set_specifier_fallback (Fget (Vdefault_face, Qhighlight, Qnil),